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