blob: 00f294b50d9f3efc7d40bc3ad0ab2be683bce7b4 [file] [log] [blame]
drhb19a2bc2001-09-16 00:13:26 +00001# 2001 September 15
drh960e8c62001-04-03 16:53:21 +00002#
drhb19a2bc2001-09-16 00:13:26 +00003# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
drh960e8c62001-04-03 16:53:21 +00005#
drhb19a2bc2001-09-16 00:13:26 +00006# 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.
drh960e8c62001-04-03 16:53:21 +00009#
10#***********************************************************************
11# This file implements regression tests for TCL interface to the
12# SQLite library.
13#
14# Actually, all tests are based on the TCL interface, so the main
15# interface is pretty well tested. This file contains some addition
16# tests for fringe issues that the main test suite does not cover.
17#
drh0f14e2e2004-06-29 12:39:08 +000018# $Id: tclsqlite.test,v 1.26 2004/06/29 12:39:08 drh Exp $
drh960e8c62001-04-03 16:53:21 +000019
20set testdir [file dirname $argv0]
21source $testdir/tester.tcl
22
23# Check the error messages generated by tclsqlite
24#
drhef4ac8f2004-06-19 00:16:31 +000025if {[sqlite3 -has-codec]} {
drh9eb9e262004-02-11 02:18:05 +000026 set r "sqlite_orig HANDLE FILENAME ?-key CODEC-KEY?"
drh22fbcb82004-02-01 01:22:50 +000027} else {
drhef4ac8f2004-06-19 00:16:31 +000028 set r "sqlite3 HANDLE FILENAME ?MODE?"
drh22fbcb82004-02-01 01:22:50 +000029}
drh960e8c62001-04-03 16:53:21 +000030do_test tcl-1.1 {
drhef4ac8f2004-06-19 00:16:31 +000031 set v [catch {sqlite3 bogus} msg]
drh960e8c62001-04-03 16:53:21 +000032 lappend v $msg
drh22fbcb82004-02-01 01:22:50 +000033} [list 1 "wrong # args: should be \"$r\""]
drh960e8c62001-04-03 16:53:21 +000034do_test tcl-1.2 {
35 set v [catch {db bogus} msg]
36 lappend v $msg
drh0f14e2e2004-06-29 12:39:08 +000037} {1 {bad option "bogus": must be authorizer, busy, changes, close, collate, collation_needed, commit_hook, complete, errorcode, eval, function, last_insert_rowid, onecolumn, progress, rekey, timeout, total_changes, or trace}}
drh960e8c62001-04-03 16:53:21 +000038do_test tcl-1.3 {
39 execsql {CREATE TABLE t1(a int, b int)}
40 execsql {INSERT INTO t1 VALUES(10,20)}
41 set v [catch {
42 db eval {SELECT * FROM t1} data {
43 error "The error message"
44 }
45 } msg]
46 lappend v $msg
47} {1 {The error message}}
48do_test tcl-1.4 {
49 set v [catch {
50 db eval {SELECT * FROM t2} data {
51 error "The error message"
52 }
53 } msg]
54 lappend v $msg
55} {1 {no such table: t2}}
56do_test tcl-1.5 {
57 set v [catch {
58 db eval {SELECT * FROM t1} data {
59 break
60 }
61 } msg]
62 lappend v $msg
63} {0 {}}
64do_test tcl-1.6 {
65 set v [catch {
66 db eval {SELECT * FROM t1} data {
67 expr x*
68 }
69 } msg]
drha297b5c2002-01-15 18:39:43 +000070 regsub {:.*$} $msg {} msg
drh960e8c62001-04-03 16:53:21 +000071 lappend v $msg
72} {1 {syntax error in expression "x*"}}
drh0f14e2e2004-06-29 12:39:08 +000073do_test tcl-1.7 {
74 set v [catch {db} msg]
75 lappend v $msg
76} {1 {wrong # args: should be "db SUBCOMMAND ..."}}
77do_test tcl-1.8 {
78 set v [catch {db authorizer 1 2 3} msg]
79 lappend v $msg
80} {1 {wrong # args: should be "db authorizer ?CALLBACK?"}}
81do_test tcl-1.9 {
82 set v [catch {db busy 1 2 3} msg]
83 lappend v $msg
84} {1 {wrong # args: should be "db busy CALLBACK"}}
85do_test tcl-1.10 {
86 set v [catch {db progress 1} msg]
87 lappend v $msg
88} {1 {wrong # args: should be "db progress N CALLBACK"}}
89do_test tcl-1.11 {
90 set v [catch {db changes xyz} msg]
91 lappend v $msg
92} {1 {wrong # args: should be "db changes "}}
93do_test tcl-1.12 {
94 set v [catch {db commit_hook a b c} msg]
95 lappend v $msg
96} {1 {wrong # args: should be "db commit_hook ?CALLBACK?"}}
97do_test tcl-1.13 {
98 set v [catch {db complete} msg]
99 lappend v $msg
100} {1 {wrong # args: should be "db complete SQL"}}
101do_test tcl-1.14 {
102 set v [catch {db eval} msg]
103 lappend v $msg
104} {1 {wrong # args: should be "db eval SQL ?ARRAY-NAME CODE?"}}
105do_test tcl-1.15 {
106 set v [catch {db function} msg]
107 lappend v $msg
108} {1 {wrong # args: should be "db function NAME SCRIPT"}}
109do_test tcl-1.14 {
110 set v [catch {db last_insert_rowid xyz} msg]
111 lappend v $msg
112} {1 {wrong # args: should be "db last_insert_rowid "}}
113do_test tcl-1.15 {
114 set v [catch {db rekey} msg]
115 lappend v $msg
116} {1 {wrong # args: should be "db rekey KEY"}}
117do_test tcl-1.16 {
118 set v [catch {db timeout} msg]
119 lappend v $msg
120} {1 {wrong # args: should be "db timeout MILLISECONDS"}}
121do_test tcl-1.17 {
122 set v [catch {db collate} msg]
123 lappend v $msg
124} {1 {wrong # args: should be "db collate NAME SCRIPT"}}
125do_test tcl-1.18 {
126 set v [catch {db collation_needed} msg]
127 lappend v $msg
128} {1 {wrong # args: should be "db collation_needed SCRIPT"}}
129do_test tcl-1.19 {
130 set v [catch {db total_changes xyz} msg]
131 lappend v $msg
132} {1 {wrong # args: should be "db total_changes "}}
133
drh960e8c62001-04-03 16:53:21 +0000134
drhef4ac8f2004-06-19 00:16:31 +0000135if {[sqlite3 -tcl-uses-utf]} {
drh6d4abfb2001-10-22 02:58:08 +0000136 do_test tcl-2.1 {
137 execsql "CREATE TABLE t\u0123x(a int, b\u1235 float)"
138 execsql "PRAGMA table_info(t\u0123x)"
drh78100cc2003-08-23 22:40:53 +0000139 } "0 a int 0 {} 0 1 b\u1235 float 0 {} 0"
drh6d4abfb2001-10-22 02:58:08 +0000140 do_test tcl-2.2 {
141 execsql "INSERT INTO t\u0123x VALUES(1,2.3)"
142 db eval "SELECT * FROM t\u0123x" result break
143 set result(*)
144 } "a b\u1235"
145}
146
drh6d4abfb2001-10-22 02:58:08 +0000147
drh5d9d7572003-08-19 14:31:01 +0000148# Test the onecolumn method
149#
150do_test tcl-3.1 {
151 execsql {
152 INSERT INTO t1 SELECT a*2, b*2 FROM t1;
153 INSERT INTO t1 SELECT a*2+1, b*2+1 FROM t1;
154 INSERT INTO t1 SELECT a*2+3, b*2+3 FROM t1;
155 }
drh22fbcb82004-02-01 01:22:50 +0000156 set rc [catch {db onecolumn {SELECT * FROM t1 ORDER BY a}} msg]
157 lappend rc $msg
158} {0 10}
drh5d9d7572003-08-19 14:31:01 +0000159do_test tcl-3.2 {
160 db onecolumn {SELECT * FROM t1 WHERE a<0}
161} {}
162do_test tcl-3.3 {
163 set rc [catch {db onecolumn} errmsg]
164 lappend rc $errmsg
165} {1 {wrong # args: should be "db onecolumn SQL"}}
drh0f14e2e2004-06-29 12:39:08 +0000166do_test tcl-3.4 {
167 set rc [catch {db onecolumn {SELECT bogus}} errmsg]
168 lappend rc $errmsg
169} {1 {no such column: bogus}}
drh5d9d7572003-08-19 14:31:01 +0000170
drh0f14e2e2004-06-29 12:39:08 +0000171# Turn the busy handler on and off
172#
173do_test tcl-4.1 {
174 proc busy_callback {cnt} {
175 break
176 }
177 db busy busy_callback
178 db busy
179} {busy_callback}
180do_test tcl-4.2 {
181 db busy {}
182 db busy
183} {}
drh6d4abfb2001-10-22 02:58:08 +0000184
drh960e8c62001-04-03 16:53:21 +0000185finish_test