// that correct results are returned in every goroutine. It's not 100% that this
// test would bring out a bug, but it's almost 100%.
//
// See https://github.com/mattn/go-sqlite3/issues/959#issuecomment-890283264
funcTest_ParallelOperationsInMemory(t*testing.T){
varerrerror
db:=mustCreateInMemoryDatabase()
deferdb.Close()
_,err=db.ExecuteStringStmt("CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT)")
iferr!=nil{
t.Fatalf("failed to create table: %s",err.Error())
}
_,err=db.ExecuteStringStmt("CREATE TABLE bar (id INTEGER NOT NULL PRIMARY KEY, name TEXT)")
iferr!=nil{
t.Fatalf("failed to create table: %s",err.Error())
}
_,err=db.ExecuteStringStmt("CREATE TABLE qux (id INTEGER NOT NULL PRIMARY KEY, name TEXT)")
iferr!=nil{
t.Fatalf("failed to create table: %s",err.Error())
}
varrows[]*Rows
rows,err=db.QueryStringStmt(`SELECT sql FROM sqlite_master`)
iferr!=nil{
t.Fatalf("failed to query for schema after creation: %s",err.Error())
}
ifexp,got:=`[{"columns":["sql"],"types":["text"],"values":[["CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT)"],["CREATE TABLE bar (id INTEGER NOT NULL PRIMARY KEY, name TEXT)"],["CREATE TABLE qux (id INTEGER NOT NULL PRIMARY KEY, name TEXT)"]]}]`,asJSON(rows);exp!=got{
t.Fatalf("schema not as expected during after creation, exp %s, got %s",exp,got)
}
varwgsync.WaitGroup
wg.Add(3)
foo:=make(chantime.Time)
bar:=make(chantime.Time)
qux:=make(chantime.Time)
done:=make(chanbool)
ticker:=time.NewTicker(1*time.Millisecond)
gofunc(){
for{
select{
caset:=<-ticker.C:
foo<-t
bar<-t
qux<-t
case<-done:
close(foo)
close(bar)
close(qux)
return
}
}
}()
gofunc(){
deferwg.Done()
forrangefoo{
_,err=db.ExecuteStringStmt(`INSERT INTO foo(id, name) VALUES(1, "fiona")`)
iferr!=nil{
t.Fatalf("failed to create table: %s",err.Error())
}
}
}()
gofunc(){
deferwg.Done()
forrangebar{
_,err=db.ExecuteStringStmt(`INSERT INTO bar(id, name) VALUES(1, "fiona")`)
iferr!=nil{
t.Fatalf("failed to create table: %s",err.Error())
}
}
}()
gofunc(){
deferwg.Done()
forrangequx{
_,err=db.ExecuteStringStmt(`INSERT INTO qux(id, name) VALUES(1, "fiona")`)
iferr!=nil{
t.Fatalf("failed to create table: %s",err.Error())
}
}
}()
varnint
for{
rows,err=db.QueryStringStmt(`SELECT sql FROM sqlite_master`)
iferr!=nil{
t.Fatalf("failed to query for schema during goroutine execution: %s",err.Error())
}
n++
ifexp,got:=`[{"columns":["sql"],"types":["text"],"values":[["CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT)"],["CREATE TABLE bar (id INTEGER NOT NULL PRIMARY KEY, name TEXT)"],["CREATE TABLE qux (id INTEGER NOT NULL PRIMARY KEY, name TEXT)"]]}]`,asJSON(rows);exp!=got{
t.Fatalf("schema not as expected during goroutine execution, exp %s, got %s, after %d queries",exp,got,n)