1: # 2001 September 15
2: #
3: # The author disclaims copyright to this source code. In place of
4: # a legal notice, here is a blessing:
5: #
6: # May you do good and not evil.
7: # May you find forgiveness for yourself and forgive others.
8: # May you share freely, never taking more than you give.
9: #
10: #***********************************************************************
11: # Test that if sqlite3_prepare_v2() is used to prepare a query, the
12: # error-message associated with an sqlite3_step() error is available
13: # immediately. Whereas if sqlite3_prepare() is used, it is not available
14: # until sqlite3_finalize() or sqlite3_reset() has been called.
15: #
16:
17: set testdir [file dirname $argv0]
18: source $testdir/tester.tcl
19:
20: set testprefix errmsg
21:
22: # Test organization:
23: #
24: # errmsg-1.* User-defined SQL function errors
25: # errmsg-2.* Errors generated by the VDBE (constraint failures etc.)
26: # errmsg-3.* SQLITE_SCHEMA and statement recompilation errors.
27: #
28:
29: proc error_messages_worker {prepare sql schema} {
30: set ret [list]
31:
32: set stmt [$prepare db $sql -1 dummy]
33: execsql $schema
34: lappend ret [sqlite3_step $stmt]
35: lappend ret [sqlite3_errmsg db]
36: lappend ret [sqlite3_finalize $stmt]
37: lappend ret [sqlite3_errmsg db]
38:
39: set ret
40: }
41:
42: proc error_messages_v2 {sql {schema {}}} {
43: error_messages_worker sqlite3_prepare_v2 $sql $schema
44: }
45:
46: proc error_messages {sql {schema {}}} {
47: error_messages_worker sqlite3_prepare $sql $schema
48: }
49:
50: proc sql_error {msg} { error $msg }
51: db func sql_error sql_error
52:
53: #-------------------------------------------------------------------------
54: # Test error messages returned by user-defined SQL functions.
55: #
56: do_test 1.1 {
57: error_messages "SELECT sql_error('custom message')"
58: } [list {*}{
59: SQLITE_ERROR {SQL logic error or missing database}
60: SQLITE_ERROR {custom message}
61: }]
62: do_test 1.2 {
63: error_messages_v2 "SELECT sql_error('custom message')"
64: } [list {*}{
65: SQLITE_ERROR {custom message}
66: SQLITE_ERROR {custom message}
67: }]
68:
69: #-------------------------------------------------------------------------
70: # Test error messages generated directly by VDBE code (e.g. constraint
71: # failures).
72: #
73: do_execsql_test 2.1 {
74: CREATE TABLE t1(a PRIMARY KEY, b UNIQUE);
75: INSERT INTO t1 VALUES('abc', 'def');
76: }
77: do_test 2.2 {
78: error_messages "INSERT INTO t1 VALUES('ghi', 'def')"
79: } [list {*}{
80: SQLITE_ERROR {SQL logic error or missing database}
81: SQLITE_CONSTRAINT {column b is not unique}
82: }]
83: do_test 2.3 {
84: error_messages_v2 "INSERT INTO t1 VALUES('ghi', 'def')"
85: } [list {*}{
86: SQLITE_CONSTRAINT {column b is not unique}
87: SQLITE_CONSTRAINT {column b is not unique}
88: }]
89:
90: #-------------------------------------------------------------------------
91: # Test SQLITE_SCHEMA errors. And, for _v2(), test that if the schema
92: # change invalidates the SQL statement itself the error message is returned
93: # correctly.
94: #
95: do_execsql_test 3.1.1 {
96: CREATE TABLE t2(a PRIMARY KEY, b UNIQUE);
97: INSERT INTO t2 VALUES('abc', 'def');
98: }
99: do_test 3.1.2 {
100: error_messages "SELECT a FROM t2" "DROP TABLE t2"
101: } [list {*}{
102: SQLITE_ERROR {SQL logic error or missing database}
103: SQLITE_SCHEMA {database schema has changed}
104: }]
105: do_execsql_test 3.2.1 {
106: CREATE TABLE t2(a PRIMARY KEY, b UNIQUE);
107: INSERT INTO t2 VALUES('abc', 'def');
108: }
109: do_test 3.2.2 {
110: error_messages_v2 "SELECT a FROM t2" "DROP TABLE t2"
111: } [list {*}{
112: SQLITE_ERROR {no such table: t2}
113: SQLITE_ERROR {no such table: t2}
114: }]
115:
116: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>