driver: return error strings for constraint errors

In conn.step, use conn.errstr which gets the error from sqlite instead
of looking up the result code in the ErrorCodeString map.

This changes the code 5 (SQLITE_BUSY) message slightly, including
"database is locked" as returned my errstr. "SQLITE_BUSY" is still
added to the message.

Fixes #73
This commit is contained in:
Dan Peterson
2021-10-20 19:40:06 -03:00
parent 15de7b4046
commit a530c91309
2 changed files with 63 additions and 5 deletions

View File

@@ -1880,7 +1880,7 @@ func TestIssue66(t *testing.T) {
// think that's correct (jnml).
t.Logf("insert 2: %v", err)
if !strings.Contains(err.Error(), "SQLITE_BUSY") {
if !strings.Contains(err.Error(), "database is locked (5) (SQLITE_BUSY)") {
t.Fatalf("insert 2: %v", err)
}
}
@@ -2010,3 +2010,58 @@ func testIssue65(t *testing.T, db *sql.DB, canFail bool) {
}
}
}
// https://gitlab.com/cznic/sqlite/-/issues/73
func TestConstraintPrimaryKeyError(t *testing.T) {
db, err := sql.Open(driverName, "file::memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
_, err = db.Exec(`CREATE TABLE IF NOT EXISTS hash (hashval TEXT PRIMARY KEY NOT NULL)`)
if err != nil {
t.Fatal(err)
}
_, err = db.Exec("INSERT INTO hash (hashval) VALUES (?)", "somehashval")
if err != nil {
t.Fatal(err)
}
_, err = db.Exec("INSERT INTO hash (hashval) VALUES (?)", "somehashval")
if err == nil {
t.Fatal("wanted error")
}
if errs, want := err.Error(), "constraint failed: UNIQUE constraint failed: hash.hashval (1555)"; errs != want {
t.Fatalf("got error string %q, want %q", errs, want)
}
}
func TestConstraintUniqueError(t *testing.T) {
db, err := sql.Open(driverName, "file::memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
_, err = db.Exec(`CREATE TABLE IF NOT EXISTS hash (hashval TEXT UNIQUE)`)
if err != nil {
t.Fatal(err)
}
_, err = db.Exec("INSERT INTO hash (hashval) VALUES (?)", "somehashval")
if err != nil {
t.Fatal(err)
}
_, err = db.Exec("INSERT INTO hash (hashval) VALUES (?)", "somehashval")
if err == nil {
t.Fatal("wanted error")
}
if errs, want := err.Error(), "constraint failed: UNIQUE constraint failed: hash.hashval (2067)"; errs != want {
t.Fatalf("got error string %q, want %q", errs, want)
}
}