ramsql icon indicating copy to clipboard operation
ramsql copied to clipboard

Deadlock with multi-statement exec

Open ggilley opened this issue 6 years ago • 1 comments

If you do an exec call with multiple statements, it creates a deadlock. Any help debugging this would be appreciated.

(You can add this function to driver_test.go to see the failure)

` func TestBigBatch(t *testing.T) { log.UseTestLogger(t)

batch :=
	`CREATE TABLE address (id BIGSERIAL PRIMARY KEY, street TEXT, street_number INT);
	CREATE TABLE user_addresses (address_id INT, user_id INT);
	INSERT INTO address (street, street_number) VALUES ('rue victor hugo', 32);
	INSERT INTO address (street, street_number) VALUES ('boulevard de la république', 23);
	INSERT INTO address (street, street_number) VALUES ('rue charles martel', 5);
	INSERT INTO address (street, street_number) VALUES ('rue victoire', 323);
	INSERT INTO address (street, street_number) VALUES ('boulevard de la liberté', 2);
	INSERT INTO address (street, street_number) VALUES ('avenue des champs', 12);
	INSERT INTO user_addresses (address_id, user_id) VALUES (2, 1);
	INSERT INTO user_addresses (address_id, user_id) VALUES (4, 1);
	INSERT INTO user_addresses (address_id, user_id) VALUES (2, 2);
	INSERT INTO user_addresses (address_id, user_id) VALUES (2, 3);
	INSERT INTO user_addresses (address_id, user_id) VALUES (4, 4);
	INSERT INTO user_addresses (address_id, user_id) VALUES (4, 5);`

db, err := sql.Open("ramsql", "TestBigBatch")
if err != nil {
	t.Fatalf("sql.Open : Error : %s\n", err)
}
defer db.Close()

_, err = db.Exec(batch)
if err != nil {
	t.Fatalf("sql.Exec: Error: %s\n", err)
}

addresses, err := LoadUserAddresses(db, 1)
if err != nil {
	t.Fatalf("Too bad! unexpected error: %s", err)
}

if len(addresses) != 2 {
	t.Fatalf("Expected 2 addresses, got %d", len(addresses))
}

} `

ggilley avatar Sep 01 '19 05:09 ggilley

Hi,

Thanks for the failing unit test, I'll look into that

proullon avatar Sep 01 '19 18:09 proullon