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