xref: /sqlite-3.40.0/test/errmsg.test (revision a690ff36)
1029ead64Sdan# 2001 September 15
2029ead64Sdan#
3029ead64Sdan# The author disclaims copyright to this source code.  In place of
4029ead64Sdan# a legal notice, here is a blessing:
5029ead64Sdan#
6029ead64Sdan#    May you do good and not evil.
7029ead64Sdan#    May you find forgiveness for yourself and forgive others.
8029ead64Sdan#    May you share freely, never taking more than you give.
9029ead64Sdan#
10029ead64Sdan#***********************************************************************
11029ead64Sdan# Test that if sqlite3_prepare_v2() is used to prepare a query, the
12029ead64Sdan# error-message associated with an sqlite3_step() error is available
13029ead64Sdan# immediately. Whereas if sqlite3_prepare() is used, it is not available
14029ead64Sdan# until sqlite3_finalize() or sqlite3_reset() has been called.
15029ead64Sdan#
16029ead64Sdan
17029ead64Sdanset testdir [file dirname $argv0]
18029ead64Sdansource $testdir/tester.tcl
19029ead64Sdan
20029ead64Sdanset testprefix errmsg
21029ead64Sdan
22029ead64Sdan# Test organization:
23029ead64Sdan#
24029ead64Sdan#   errmsg-1.*         User-defined SQL function errors
25029ead64Sdan#   errmsg-2.*         Errors generated by the VDBE (constraint failures etc.)
26029ead64Sdan#   errmsg-3.*         SQLITE_SCHEMA and statement recompilation errors.
27029ead64Sdan#
28029ead64Sdan
29029ead64Sdanproc error_messages_worker {prepare sql schema} {
30029ead64Sdan  set ret [list]
31029ead64Sdan
32029ead64Sdan  set stmt [$prepare db $sql -1 dummy]
33029ead64Sdan  execsql $schema
34029ead64Sdan  lappend ret [sqlite3_step $stmt]
35029ead64Sdan  lappend ret [sqlite3_errmsg db]
36029ead64Sdan  lappend ret [sqlite3_finalize $stmt]
37029ead64Sdan  lappend ret [sqlite3_errmsg db]
38029ead64Sdan
39029ead64Sdan  set ret
40029ead64Sdan}
41029ead64Sdan
42029ead64Sdanproc error_messages_v2 {sql {schema {}}} {
43029ead64Sdan  error_messages_worker sqlite3_prepare_v2 $sql $schema
44029ead64Sdan}
45029ead64Sdan
46029ead64Sdanproc error_messages {sql {schema {}}} {
47029ead64Sdan  error_messages_worker sqlite3_prepare $sql $schema
48029ead64Sdan}
49029ead64Sdan
50029ead64Sdanproc sql_error {msg} { error $msg }
51029ead64Sdandb func sql_error sql_error
52029ead64Sdan
53029ead64Sdan#-------------------------------------------------------------------------
54029ead64Sdan# Test error messages returned by user-defined SQL functions.
55029ead64Sdan#
56029ead64Sdando_test 1.1 {
57029ead64Sdan  error_messages "SELECT sql_error('custom message')"
58029ead64Sdan} [list {*}{
59*a690ff36Sdrh    SQLITE_ERROR {SQL logic error}
60029ead64Sdan    SQLITE_ERROR {custom message}
61029ead64Sdan}]
62029ead64Sdando_test 1.2 {
63029ead64Sdan  error_messages_v2 "SELECT sql_error('custom message')"
64029ead64Sdan} [list {*}{
65029ead64Sdan    SQLITE_ERROR {custom message}
66029ead64Sdan    SQLITE_ERROR {custom message}
67029ead64Sdan}]
68029ead64Sdan
69029ead64Sdan#-------------------------------------------------------------------------
70029ead64Sdan# Test error messages generated directly by VDBE code (e.g. constraint
71029ead64Sdan# failures).
72029ead64Sdan#
73029ead64Sdando_execsql_test 2.1 {
74029ead64Sdan  CREATE TABLE t1(a PRIMARY KEY, b UNIQUE);
75029ead64Sdan  INSERT INTO t1 VALUES('abc', 'def');
76029ead64Sdan}
77029ead64Sdando_test 2.2 {
78029ead64Sdan  error_messages "INSERT INTO t1 VALUES('ghi', 'def')"
79029ead64Sdan} [list {*}{
80*a690ff36Sdrh    SQLITE_ERROR      {SQL logic error}
81f9c8ce3cSdrh    SQLITE_CONSTRAINT {UNIQUE constraint failed: t1.b}
82029ead64Sdan}]
83433dccfbSdrhverify_ex_errcode 2.2b SQLITE_CONSTRAINT_UNIQUE
84029ead64Sdando_test 2.3 {
85029ead64Sdan  error_messages_v2 "INSERT INTO t1 VALUES('ghi', 'def')"
86029ead64Sdan} [list {*}{
87f9c8ce3cSdrh    SQLITE_CONSTRAINT {UNIQUE constraint failed: t1.b}
88f9c8ce3cSdrh    SQLITE_CONSTRAINT {UNIQUE constraint failed: t1.b}
89029ead64Sdan}]
90433dccfbSdrhverify_ex_errcode 2.3b SQLITE_CONSTRAINT_UNIQUE
91029ead64Sdan
92029ead64Sdan#-------------------------------------------------------------------------
93029ead64Sdan# Test SQLITE_SCHEMA errors. And, for _v2(), test that if the schema
94029ead64Sdan# change invalidates the SQL statement itself the error message is returned
95029ead64Sdan# correctly.
96029ead64Sdan#
97029ead64Sdando_execsql_test 3.1.1 {
98029ead64Sdan  CREATE TABLE t2(a PRIMARY KEY, b UNIQUE);
99029ead64Sdan  INSERT INTO t2 VALUES('abc', 'def');
100029ead64Sdan}
101029ead64Sdando_test 3.1.2 {
102029ead64Sdan  error_messages "SELECT a FROM t2" "DROP TABLE t2"
103029ead64Sdan} [list {*}{
104*a690ff36Sdrh    SQLITE_ERROR {SQL logic error}
105029ead64Sdan    SQLITE_SCHEMA {database schema has changed}
106029ead64Sdan}]
107029ead64Sdando_execsql_test 3.2.1 {
108029ead64Sdan  CREATE TABLE t2(a PRIMARY KEY, b UNIQUE);
109029ead64Sdan  INSERT INTO t2 VALUES('abc', 'def');
110029ead64Sdan}
111029ead64Sdando_test 3.2.2 {
112029ead64Sdan  error_messages_v2 "SELECT a FROM t2" "DROP TABLE t2"
113029ead64Sdan} [list {*}{
114029ead64Sdan    SQLITE_ERROR {no such table: t2}
115029ead64Sdan    SQLITE_ERROR {no such table: t2}
116029ead64Sdan}]
117029ead64Sdan
118029ead64Sdanfinish_test
119