xref: /illumos-gate/usr/src/lib/libsqlite/test/capi2.test (revision 8b80e8cb6855118d46f605e91b5ed4ce83417395)
1
2#pragma ident	"%Z%%M%	%I%	%E% SMI"
3
4# 2003 January 29
5#
6# The author disclaims copyright to this source code.  In place of
7# a legal notice, here is a blessing:
8#
9#    May you do good and not evil.
10#    May you find forgiveness for yourself and forgive others.
11#    May you share freely, never taking more than you give.
12#
13#***********************************************************************
14# This file implements regression tests for SQLite library.  The
15# focus of this script testing the callback-free C/C++ API.
16#
17# $Id: capi2.test,v 1.10 2003/08/05 13:13:38 drh Exp $
18#
19
20set testdir [file dirname $argv0]
21source $testdir/tester.tcl
22
23# Check basic functionality
24#
25do_test capi2-1.1 {
26  db close
27  set DB [sqlite db test.db]
28  execsql {CREATE TABLE t1(a,b,c)}
29  set VM [sqlite_compile $DB {SELECT name, rowid FROM sqlite_master} TAIL]
30  set TAIL
31} {}
32do_test capi2-1.2 {
33  sqlite_step $VM N VALUES COLNAMES
34} {SQLITE_ROW}
35do_test capi2-1.3 {
36  set N
37} {2}
38do_test capi2-1.4 {
39  set VALUES
40} {t1 1}
41do_test capi2-1.5 {
42  set COLNAMES
43} {name rowid text INTEGER}
44do_test capi2-1.6 {
45  set N x
46  set VALUES y
47  set COLNAMES z
48  sqlite_step $VM N VALUES COLNAMES
49} {SQLITE_DONE}
50do_test capi2-1.7 {
51  list $N $VALUES $COLNAMES
52} {2 {} {name rowid text INTEGER}}
53do_test capi2-1.8 {
54  set N x
55  set VALUES y
56  set COLNAMES z
57  sqlite_step $VM N VALUES COLNAMES
58} {SQLITE_MISUSE}
59do_test capi2-1.9 {
60  list $N $VALUES $COLNAMES
61} {0 {} {}}
62do_test capi2-1.10 {
63  sqlite_finalize $VM
64} {}
65
66# Check to make sure that the "tail" of a multi-statement SQL script
67# is returned by sqlite_compile.
68#
69do_test capi2-2.1 {
70  set SQL {
71    SELECT name, rowid FROM sqlite_master;
72    SELECT name, rowid FROM sqlite_temp_master;
73    -- A comment at the end
74  }
75  set VM [sqlite_compile $DB $SQL SQL]
76  set SQL
77} {
78    SELECT name, rowid FROM sqlite_temp_master;
79    -- A comment at the end
80  }
81do_test capi2-2.2 {
82  set r [sqlite_step $VM n val colname]
83  lappend r $n $val $colname
84} {SQLITE_ROW 2 {t1 1} {name rowid text INTEGER}}
85do_test capi2-2.3 {
86  set r [sqlite_step $VM n val colname]
87  lappend r $n $val $colname
88} {SQLITE_DONE 2 {} {name rowid text INTEGER}}
89do_test capi2-2.4 {
90  sqlite_finalize $VM
91} {}
92do_test capi2-2.5 {
93  set VM [sqlite_compile $DB $SQL SQL]
94  set SQL
95} {
96    -- A comment at the end
97  }
98do_test capi2-2.6 {
99  set r [sqlite_step $VM n val colname]
100  lappend r $n $val $colname
101} {SQLITE_DONE 2 {} {name rowid text INTEGER}}
102do_test capi2-2.7 {
103  sqlite_finalize $VM
104} {}
105do_test capi2-2.8 {
106  set VM [sqlite_compile $DB $SQL SQL]
107  list $SQL $VM
108} {{} {}}
109
110# Check the error handling.
111#
112do_test capi2-3.1 {
113  set rc [catch {
114      sqlite_compile $DB {select bogus from sqlite_master} TAIL
115  } msg]
116  lappend rc $msg $TAIL
117} {1 {(1) no such column: bogus} {}}
118do_test capi2-3.2 {
119  set rc [catch {
120      sqlite_compile $DB {select bogus from } TAIL
121  } msg]
122  lappend rc $msg $TAIL
123} {1 {(1) near " ": syntax error} {}}
124do_test capi2-3.3 {
125  set rc [catch {
126      sqlite_compile $DB {;;;;select bogus from sqlite_master} TAIL
127  } msg]
128  lappend rc $msg $TAIL
129} {1 {(1) no such column: bogus} {}}
130do_test capi2-3.4 {
131  set rc [catch {
132      sqlite_compile $DB {select bogus from sqlite_master;x;} TAIL
133  } msg]
134  lappend rc $msg $TAIL
135} {1 {(1) no such column: bogus} {x;}}
136do_test capi2-3.5 {
137  set rc [catch {
138      sqlite_compile $DB {select bogus from sqlite_master;;;x;} TAIL
139  } msg]
140  lappend rc $msg $TAIL
141} {1 {(1) no such column: bogus} {;;x;}}
142do_test capi2-3.6 {
143  set rc [catch {
144      sqlite_compile $DB {select 5/0} TAIL
145  } VM]
146  lappend rc $TAIL
147} {0 {}}
148do_test capi2-3.7 {
149  set N {}
150  set VALUE {}
151  set COLNAME {}
152  list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
153} {SQLITE_ROW 1 {{}} {5/0 NUMERIC}}
154do_test capi2-3.8 {
155  sqlite_finalize $VM
156} {}
157do_test capi2-3.9 {
158  execsql {CREATE UNIQUE INDEX i1 ON t1(a)}
159  set VM [sqlite_compile $DB {INSERT INTO t1 VALUES(1,2,3)} TAIL]
160  set TAIL
161} {}
162do_test capi2-3.9b {db changes} {0}
163do_test capi2-3.10 {
164  set N {}
165  set VALUE {}
166  set COLNAME {}
167  list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
168} {SQLITE_DONE 0 {} {}}
169do_test capi2-3.10b {db changes} {1}
170do_test capi2-3.11 {
171  sqlite_finalize $VM
172} {}
173do_test capi2-3.11b {db changes} {1}
174do_test capi2-3.12 {
175  list [catch {sqlite_finalize $VM} msg] [set msg]
176} {1 {(21) library routine called out of sequence}}
177do_test capi2-3.13 {
178  set VM [sqlite_compile $DB {INSERT INTO t1 VALUES(1,3,4)} TAIL]
179  list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
180} {SQLITE_ERROR 0 {} {}}
181do_test capi2-3.13b {db changes} {0}
182do_test capi2-3.14 {
183  list [catch {sqlite_finalize $VM} msg] [set msg]
184} {1 {(19) column a is not unique}}
185do_test capi2-3.15 {
186  set VM [sqlite_compile $DB {CREATE TABLE t2(a NOT NULL, b)} TAIL]
187  set TAIL
188} {}
189do_test capi2-3.16 {
190  list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
191} {SQLITE_DONE 0 {} {}}
192do_test capi2-3.17 {
193  list [catch {sqlite_finalize $VM} msg] [set msg]
194} {0 {}}
195do_test capi2-3.18 {
196  set VM [sqlite_compile $DB {INSERT INTO t2 VALUES(NULL,2)} TAIL]
197  list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
198} {SQLITE_ERROR 0 {} {}}
199do_test capi2-3.19 {
200  list [catch {sqlite_finalize $VM} msg] [set msg]
201} {1 {(19) t2.a may not be NULL}}
202
203# Two or more virtual machines exists at the same time.
204#
205do_test capi2-4.1 {
206  set VM1 [sqlite_compile $DB {INSERT INTO t2 VALUES(1,2)} TAIL]
207  set TAIL
208} {}
209do_test capi2-4.2 {
210  set VM2 [sqlite_compile $DB {INSERT INTO t2 VALUES(2,3)} TAIL]
211  set TAIL
212} {}
213do_test capi2-4.3 {
214  set VM3 [sqlite_compile $DB {INSERT INTO t2 VALUES(3,4)} TAIL]
215  set TAIL
216} {}
217do_test capi2-4.4 {
218  list [sqlite_step $VM2 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
219} {SQLITE_DONE 0 {} {}}
220do_test capi2-4.5 {
221  execsql {SELECT * FROM t2 ORDER BY a}
222} {2 3}
223do_test capi2-4.6 {
224  list [catch {sqlite_finalize $VM2} msg] [set msg]
225} {0 {}}
226do_test capi2-4.7 {
227  list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
228} {SQLITE_DONE 0 {} {}}
229do_test capi2-4.8 {
230  execsql {SELECT * FROM t2 ORDER BY a}
231} {2 3 3 4}
232do_test capi2-4.9 {
233  list [catch {sqlite_finalize $VM3} msg] [set msg]
234} {0 {}}
235do_test capi2-4.10 {
236  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
237} {SQLITE_DONE 0 {} {}}
238do_test capi2-4.11 {
239  execsql {SELECT * FROM t2 ORDER BY a}
240} {1 2 2 3 3 4}
241do_test capi2-4.12 {
242  list [catch {sqlite_finalize $VM1} msg] [set msg]
243} {0 {}}
244
245# Interleaved SELECTs
246#
247do_test capi2-5.1 {
248  set VM1 [sqlite_compile $DB {SELECT * FROM t2} TAIL]
249  set VM2 [sqlite_compile $DB {SELECT * FROM t2} TAIL]
250  set VM3 [sqlite_compile $DB {SELECT * FROM t2} TAIL]
251  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
252} {SQLITE_ROW 2 {2 3} {a b {} {}}}
253do_test capi2-5.2 {
254  list [sqlite_step $VM2 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
255} {SQLITE_ROW 2 {2 3} {a b {} {}}}
256do_test capi2-5.3 {
257  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
258} {SQLITE_ROW 2 {3 4} {a b {} {}}}
259do_test capi2-5.4 {
260  list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
261} {SQLITE_ROW 2 {2 3} {a b {} {}}}
262do_test capi2-5.5 {
263  list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
264} {SQLITE_ROW 2 {3 4} {a b {} {}}}
265do_test capi2-5.6 {
266  list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
267} {SQLITE_ROW 2 {1 2} {a b {} {}}}
268do_test capi2-5.7 {
269  list [sqlite_step $VM3 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
270} {SQLITE_DONE 2 {} {a b {} {}}}
271do_test capi2-5.8 {
272  list [catch {sqlite_finalize $VM3} msg] [set msg]
273} {0 {}}
274do_test capi2-5.9 {
275  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
276} {SQLITE_ROW 2 {1 2} {a b {} {}}}
277do_test capi2-5.10 {
278  list [catch {sqlite_finalize $VM1} msg] [set msg]
279} {0 {}}
280do_test capi2-5.11 {
281  list [sqlite_step $VM2 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
282} {SQLITE_ROW 2 {3 4} {a b {} {}}}
283do_test capi2-5.12 {
284  list [sqlite_step $VM2 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
285} {SQLITE_ROW 2 {1 2} {a b {} {}}}
286do_test capi2-5.11 {
287  list [catch {sqlite_finalize $VM2} msg] [set msg]
288} {0 {}}
289
290# Check for proper SQLITE_BUSY returns.
291#
292do_test capi2-6.1 {
293  execsql {
294    BEGIN;
295    CREATE TABLE t3(x counter);
296    INSERT INTO t3 VALUES(1);
297    INSERT INTO t3 VALUES(2);
298    INSERT INTO t3 SELECT x+2 FROM t3;
299    INSERT INTO t3 SELECT x+4 FROM t3;
300    INSERT INTO t3 SELECT x+8 FROM t3;
301    COMMIT;
302  }
303  set VM1 [sqlite_compile $DB {SELECT * FROM t3} TAIL]
304  sqlite db2 test.db
305  execsql {BEGIN} db2
306} {}
307do_test capi2-6.2 {
308  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
309} {SQLITE_BUSY 0 {} {}}
310do_test capi2-6.3 {
311  execsql {COMMIT} db2
312} {}
313do_test capi2-6.4 {
314  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
315} {SQLITE_ROW 1 1 {x counter}}
316do_test capi2-6.5 {
317  catchsql {BEGIN} db2
318} {1 {database is locked}}
319do_test capi2-6.6 {
320  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
321} {SQLITE_ROW 1 2 {x counter}}
322do_test capi2-6.7 {
323  execsql {SELECT * FROM t2} db2
324} {2 3 3 4 1 2}
325do_test capi2-6.8 {
326  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
327} {SQLITE_ROW 1 3 {x counter}}
328do_test capi2-6.9 {
329  execsql {SELECT * FROM t2}
330} {2 3 3 4 1 2}
331do_test capi2-6.10 {
332  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
333} {SQLITE_ROW 1 4 {x counter}}
334do_test capi2-6.11 {
335  execsql {BEGIN}
336} {}
337do_test capi2-6.12 {
338  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
339} {SQLITE_ROW 1 5 {x counter}}
340# execsql {pragma vdbe_trace=on}
341do_test capi2-6.13 {
342  catchsql {UPDATE t3 SET x=x+1}
343} {1 {database table is locked}}
344do_test capi2-6.14 {
345  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
346} {SQLITE_ROW 1 6 {x counter}}
347# puts [list [catch {sqlite_finalize $VM1} msg] [set msg]]; exit
348do_test capi2-6.15 {
349  execsql {SELECT * FROM t1}
350} {1 2 3}
351do_test capi2-6.16 {
352  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
353} {SQLITE_ROW 1 7 {x counter}}
354do_test capi2-6.17 {
355  catchsql {UPDATE t1 SET b=b+1}
356} {0 {}}
357do_test capi2-6.18 {
358  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
359} {SQLITE_ROW 1 8 {x counter}}
360do_test capi2-6.19 {
361  execsql {SELECT * FROM t1}
362} {1 3 3}
363do_test capi2-6.20 {
364  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
365} {SQLITE_ROW 1 9 {x counter}}
366do_test capi2-6.21 {
367  execsql {ROLLBACK; SELECT * FROM t1}
368} {1 2 3}
369do_test capi2-6.22 {
370  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
371} {SQLITE_ROW 1 10 {x counter}}
372do_test capi2-6.23 {
373  execsql {BEGIN TRANSACTION ON CONFLICT ROLLBACK;}
374} {}
375do_test capi2-6.24 {
376  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
377} {SQLITE_ROW 1 11 {x counter}}
378do_test capi2-6.25 {
379  execsql {
380    INSERT INTO t1 VALUES(2,3,4);
381    SELECT * FROM t1;
382  }
383} {1 2 3 2 3 4}
384do_test capi2-6.26 {
385  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
386} {SQLITE_ROW 1 12 {x counter}}
387do_test capi2-6.27 {
388  catchsql {
389    INSERT INTO t1 VALUES(2,4,5);
390    SELECT * FROM t1;
391  }
392} {1 {column a is not unique}}
393do_test capi2-6.28 {
394  list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
395} {SQLITE_ROW 1 13 {x counter}}
396do_test capi2-6.99 {
397  list [catch {sqlite_finalize $VM1} msg] [set msg]
398} {0 {}}
399catchsql {ROLLBACK}
400
401do_test capi2-7.1 {
402  stepsql $DB {
403    SELECT * FROM t1
404  }
405} {0 1 2 3}
406do_test capi2-7.2 {
407  stepsql $DB {
408    PRAGMA count_changes=on
409  }
410} {0}
411do_test capi2-7.3 {
412  stepsql $DB {
413    UPDATE t1 SET a=a+10;
414  }
415} {0 1}
416do_test capi2-7.4 {
417  stepsql $DB {
418    INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1;
419  }
420} {0 1}
421do_test capi2-7.4b {db changes} {1}
422do_test capi2-7.5 {
423  stepsql $DB {
424    UPDATE t1 SET a=a+10;
425  }
426} {0 2}
427do_test capi2-7.5b {db changes} {2}
428do_test capi2-7.6 {
429  stepsql $DB {
430    SELECT * FROM t1;
431  }
432} {0 21 2 3 22 3 4}
433do_test capi2-7.7 {
434  stepsql $DB {
435    INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1;
436  }
437} {0 2}
438do_test capi2-7.8 {
439  db changes
440} {2}
441do_test capi2-7.9 {
442  stepsql $DB {
443    SELECT * FROM t1;
444  }
445} {0 21 2 3 22 3 4 23 4 5 24 5 6}
446do_test capi2-7.10 {
447  stepsql $DB {
448    UPDATE t1 SET a=a-20;
449    SELECT * FROM t1;
450  }
451} {0 4 1 2 3 2 3 4 3 4 5 4 5 6}
452do_test capi2-7.11 {
453  db changes
454} {0}
455do_test capi2-7.12 {
456  set x [stepsql $DB {EXPLAIN SELECT * FROM t1}]
457  lindex $x 0
458} {0}
459
460# Ticket #261 - make sure we can finalize before the end of a query.
461#
462do_test capi2-8.1 {
463  set VM1 [sqlite_compile $DB {SELECT * FROM t2} TAIL]
464  sqlite_finalize $VM1
465} {}
466
467# Tickets #384 and #385 - make sure the TAIL argument to sqlite_compile
468# and all of the return pointers in sqlite_step can be null.
469#
470do_test capi2-9.1 {
471  set VM1 [sqlite_compile $DB {SELECT * FROM t2}]
472  sqlite_step $VM1
473  sqlite_finalize $VM1
474} {}
475
476db2 close
477
478finish_test
479