Race condition in GROUP BY
There seems to be a concurrent read/write on a map when using the GROUP BY statement. This sample code reproduces the issue:
package ql_test
import (
"database/sql"
"fmt"
"github.com/stretchr/testify/assert"
"log"
_ "modernc.org/ql/driver"
"testing"
)
func TestGroupByRaceCondition(t *testing.T) {
sess, err := sql.Open("ql2", "memory://database.ql")
assert.NoError(t, err)
tx, err := sess.Begin()
_, err = tx.Exec(`CREATE TABLE artists (name string)`)
assert.NoError(t, err)
err = tx.Commit()
assert.NoError(t, err)
for i := 0; i < 100; i++ {
tx, err := sess.Begin()
assert.NoError(t, err)
_, err = tx.Exec(`INSERT INTO artists (name) VALUES($1)`, fmt.Sprintf("artist-%d", i%5))
assert.NoError(t, err)
err = tx.Commit()
assert.NoError(t, err)
}
rows, err := sess.Query(`SELECT name, count(1) from artists GROUP BY name`)
assert.NoError(t, err)
for rows.Next() {
var name string
var count int
err := rows.Scan(&name, &count)
assert.NoError(t, err)
log.Printf("NAME: %v, COUNT: %v", name, count)
}
}
The issue is visible when running the race condition detector:
go test -race -v -run TestGroupByRaceCondition *.go
=== RUN TestGroupByRaceCondition
2020/12/20 18:38:45 NAME: artist-0, COUNT: 20
==================
WARNING: DATA RACE
Write at 0x00c00035fdc0 by goroutine 44:
modernc.org/ql.(*selectFieldsGroupPlan).do.func1()
/home/rev/go/src/modernc.org/ql/plan.go:2049 +0x10ad
modernc.org/ql.(*groupByDefaultPlan).do()
/home/rev/go/src/modernc.org/ql/plan.go:1684 +0xb6b
modernc.org/ql.(*selectFieldsGroupPlan).do()
/home/rev/go/src/modernc.org/ql/plan.go:2022 +0x1cc
modernc.org/ql.(*DB).do()
/home/rev/go/src/modernc.org/ql/ql.go:1479 +0x1fb
modernc.org/ql.recordset.Do()
/home/rev/go/src/modernc.org/ql/ql.go:75 +0x95
modernc.org/ql.(*recordset).Do()
<autogenerated>:1 +0xa4
modernc.org/ql.newdriverRows.func1()
/home/rev/go/src/modernc.org/ql/driver.go:449 +0x101