1 // Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
3 // Use of this source code is governed by an MIT-style
4 // license that can be found in the LICENSE file.
16 func TestSimpleError(t *testing.T) {
18 if e != "SQL logic error or missing database" {
19 t.Error("wrong error code:" + e)
23 func TestCorruptDbErrors(t *testing.T) {
24 dirName, err := ioutil.TempDir("", "sqlite3")
28 defer os.RemoveAll(dirName)
30 dbFileName := path.Join(dirName, "test.db")
31 f, err := os.Create(dbFileName)
35 f.Write([]byte{1, 2, 3, 4, 5})
38 db, err := sql.Open("sqlite3", dbFileName)
40 _, err = db.Exec("drop table foo")
43 sqliteErr := err.(Error)
44 if sqliteErr.Code != ErrNotADB {
45 t.Error("wrong error code for corrupted DB")
47 if err.Error() == "" {
48 t.Error("wrong error string for corrupted DB")
53 func TestSqlLogicErrors(t *testing.T) {
54 dirName, err := ioutil.TempDir("", "sqlite3")
58 defer os.RemoveAll(dirName)
60 dbFileName := path.Join(dirName, "test.db")
61 db, err := sql.Open("sqlite3", dbFileName)
67 _, err = db.Exec("CREATE TABLE Foo (id INTEGER PRIMARY KEY)")
72 const expectedErr = "table Foo already exists"
73 _, err = db.Exec("CREATE TABLE Foo (id INTEGER PRIMARY KEY)")
74 if err.Error() != expectedErr {
75 t.Errorf("Unexpected error: %s, expected %s", err.Error(), expectedErr)
80 func TestExtendedErrorCodes_ForeignKey(t *testing.T) {
81 dirName, err := ioutil.TempDir("", "sqlite3-err")
85 defer os.RemoveAll(dirName)
87 dbFileName := path.Join(dirName, "test.db")
88 db, err := sql.Open("sqlite3", dbFileName)
94 _, err = db.Exec("PRAGMA foreign_keys=ON;")
96 t.Errorf("PRAGMA foreign_keys=ON: %v", err)
99 _, err = db.Exec(`CREATE TABLE Foo (
100 id INTEGER PRIMARY KEY AUTOINCREMENT,
101 value INTEGER NOT NULL,
102 ref INTEGER NULL REFERENCES Foo (id),
109 _, err = db.Exec("INSERT INTO Foo (ref, value) VALUES (100, 100);")
113 sqliteErr := err.(Error)
114 if sqliteErr.Code != ErrConstraint {
115 t.Errorf("Wrong basic error code: %d != %d",
116 sqliteErr.Code, ErrConstraint)
118 if sqliteErr.ExtendedCode != ErrConstraintForeignKey {
119 t.Errorf("Wrong extended error code: %d != %d",
120 sqliteErr.ExtendedCode, ErrConstraintForeignKey)
126 func TestExtendedErrorCodes_NotNull(t *testing.T) {
127 dirName, err := ioutil.TempDir("", "sqlite3-err")
131 defer os.RemoveAll(dirName)
133 dbFileName := path.Join(dirName, "test.db")
134 db, err := sql.Open("sqlite3", dbFileName)
140 _, err = db.Exec("PRAGMA foreign_keys=ON;")
142 t.Errorf("PRAGMA foreign_keys=ON: %v", err)
145 _, err = db.Exec(`CREATE TABLE Foo (
146 id INTEGER PRIMARY KEY AUTOINCREMENT,
147 value INTEGER NOT NULL,
148 ref INTEGER NULL REFERENCES Foo (id),
155 res, err := db.Exec("INSERT INTO Foo (value) VALUES (100);")
157 t.Fatalf("Creating first row: %v", err)
160 id, err := res.LastInsertId()
162 t.Fatalf("Retrieving last insert id: %v", err)
165 _, err = db.Exec("INSERT INTO Foo (ref) VALUES (?);", id)
169 sqliteErr := err.(Error)
170 if sqliteErr.Code != ErrConstraint {
171 t.Errorf("Wrong basic error code: %d != %d",
172 sqliteErr.Code, ErrConstraint)
174 if sqliteErr.ExtendedCode != ErrConstraintNotNull {
175 t.Errorf("Wrong extended error code: %d != %d",
176 sqliteErr.ExtendedCode, ErrConstraintNotNull)
182 func TestExtendedErrorCodes_Unique(t *testing.T) {
183 dirName, err := ioutil.TempDir("", "sqlite3-err")
187 defer os.RemoveAll(dirName)
189 dbFileName := path.Join(dirName, "test.db")
190 db, err := sql.Open("sqlite3", dbFileName)
196 _, err = db.Exec("PRAGMA foreign_keys=ON;")
198 t.Errorf("PRAGMA foreign_keys=ON: %v", err)
201 _, err = db.Exec(`CREATE TABLE Foo (
202 id INTEGER PRIMARY KEY AUTOINCREMENT,
203 value INTEGER NOT NULL,
204 ref INTEGER NULL REFERENCES Foo (id),
211 res, err := db.Exec("INSERT INTO Foo (value) VALUES (100);")
213 t.Fatalf("Creating first row: %v", err)
216 id, err := res.LastInsertId()
218 t.Fatalf("Retrieving last insert id: %v", err)
221 _, err = db.Exec("INSERT INTO Foo (ref, value) VALUES (?, 100);", id)
225 sqliteErr := err.(Error)
226 if sqliteErr.Code != ErrConstraint {
227 t.Errorf("Wrong basic error code: %d != %d",
228 sqliteErr.Code, ErrConstraint)
230 if sqliteErr.ExtendedCode != ErrConstraintUnique {
231 t.Errorf("Wrong extended error code: %d != %d",
232 sqliteErr.ExtendedCode, ErrConstraintUnique)
234 extended := sqliteErr.Code.Extend(3).Error()
235 expected := "constraint failed"
236 if extended != expected {
237 t.Errorf("Wrong basic error code: %q != %q",