xref: /sqlite-3.40.0/test/capi2.test (revision 4397de57)
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.23 2005/01/12 12:44:04 danielk1977 Exp $
15#
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
20# Return the text values from the current row pointed at by STMT as a list.
21proc get_row_values {STMT} {
22  set VALUES [list]
23  for {set i 0} {$i < [sqlite3_data_count $STMT]} {incr i} {
24    lappend VALUES [sqlite3_column_text $STMT $i]
25  }
26  return $VALUES
27}
28
29# Return the column names followed by declaration types for the result set
30# of the SQL statement STMT.
31#
32# i.e. for:
33# CREATE TABLE abc(a text, b integer);
34# SELECT * FROM abc;
35#
36# The result is {a b text integer}
37proc get_column_names {STMT} {
38  set VALUES [list]
39  for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} {
40    lappend VALUES [sqlite3_column_name $STMT $i]
41  }
42  for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} {
43    lappend VALUES [sqlite3_column_decltype $STMT $i]
44  }
45  return $VALUES
46}
47
48# Check basic functionality
49#
50do_test capi2-1.1 {
51  db close
52  set DB [sqlite3 db test.db]
53  execsql {CREATE TABLE t1(a,b,c)}
54  set VM [sqlite3_prepare $DB {SELECT name, rowid FROM sqlite_master} -1 TAIL]
55  set TAIL
56} {}
57do_test capi2-1.2 {
58  sqlite3_step $VM
59} {SQLITE_ROW}
60do_test capi2-1.3 {
61  sqlite3_data_count $VM
62} {2}
63do_test capi2-1.4 {
64  get_row_values $VM
65} {t1 1}
66do_test capi2-1.5 {
67  get_column_names $VM
68} {name rowid text INTEGER}
69do_test capi2-1.6 {
70  sqlite3_step $VM
71} {SQLITE_DONE}
72do_test capi2-1.7 {
73  list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM]
74} {2 {} {name rowid text INTEGER}}
75do_test capi2-1.8 {
76  sqlite3_step $VM
77} {SQLITE_MISUSE}
78
79# Update: In v2, once SQLITE_MISUSE is returned the statement handle cannot
80# be interrogated for more information. However in v3, since the column
81# count, names and types are determined at compile time, these are still
82# accessible after an SQLITE_MISUSE error.
83do_test capi2-1.9 {
84  list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM]
85} {2 {} {name rowid text INTEGER}}
86do_test capi2-1.10 {
87  sqlite3_data_count $VM
88} {0}
89
90do_test capi2-1.11 {
91  sqlite3_finalize $VM
92} {SQLITE_OK}
93
94# Check to make sure that the "tail" of a multi-statement SQL script
95# is returned by sqlite3_prepare.
96#
97do_test capi2-2.1 {
98  set SQL {
99    SELECT name, rowid FROM sqlite_master;
100    SELECT name, rowid FROM sqlite_temp_master;
101    -- A comment at the end
102  }
103  set VM [sqlite3_prepare $DB $SQL -1 SQL]
104  set SQL
105} {
106    SELECT name, rowid FROM sqlite_temp_master;
107    -- A comment at the end
108  }
109do_test capi2-2.2 {
110  set r [sqlite3_step $VM]
111  lappend r [sqlite3_column_count $VM] \
112            [get_row_values $VM] \
113            [get_column_names $VM]
114} {SQLITE_ROW 2 {t1 1} {name rowid text INTEGER}}
115do_test capi2-2.3 {
116  set r [sqlite3_step $VM]
117  lappend r [sqlite3_column_count $VM] \
118            [get_row_values $VM] \
119            [get_column_names $VM]
120} {SQLITE_DONE 2 {} {name rowid text INTEGER}}
121do_test capi2-2.4 {
122  sqlite3_finalize $VM
123} {SQLITE_OK}
124do_test capi2-2.5 {
125  set VM [sqlite3_prepare $DB $SQL -1 SQL]
126  set SQL
127} {
128    -- A comment at the end
129  }
130do_test capi2-2.6 {
131  set r [sqlite3_step $VM]
132  lappend r [sqlite3_column_count $VM] \
133            [get_row_values $VM] \
134            [get_column_names $VM]
135} {SQLITE_DONE 2 {} {name rowid text INTEGER}}
136do_test capi2-2.7 {
137  sqlite3_finalize $VM
138} {SQLITE_OK}
139do_test capi2-2.8 {
140  set VM [sqlite3_prepare $DB $SQL -1 SQL]
141  list $SQL $VM
142} {{} {}}
143
144# Check the error handling.
145#
146do_test capi2-3.1 {
147  set rc [catch {
148      sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL
149  } msg]
150  lappend rc $msg $TAIL
151} {1 {(1) no such column: bogus} {}}
152do_test capi2-3.2 {
153  set rc [catch {
154      sqlite3_prepare $DB {select bogus from } -1 TAIL
155  } msg]
156  lappend rc $msg $TAIL
157} {1 {(1) near " ": syntax error} {}}
158do_test capi2-3.3 {
159  set rc [catch {
160      sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL
161  } msg]
162  lappend rc $msg $TAIL
163} {1 {(1) no such column: bogus} {}}
164do_test capi2-3.4 {
165  set rc [catch {
166      sqlite3_prepare $DB {select bogus from sqlite_master;x;} -1 TAIL
167  } msg]
168  lappend rc $msg $TAIL
169} {1 {(1) no such column: bogus} {x;}}
170do_test capi2-3.5 {
171  set rc [catch {
172      sqlite3_prepare $DB {select bogus from sqlite_master;;;x;} -1 TAIL
173  } msg]
174  lappend rc $msg $TAIL
175} {1 {(1) no such column: bogus} {;;x;}}
176do_test capi2-3.6 {
177  set rc [catch {
178      sqlite3_prepare $DB {select 5/0} -1 TAIL
179  } VM]
180  lappend rc $TAIL
181} {0 {}}
182do_test capi2-3.7 {
183  list [sqlite3_step $VM] \
184       [sqlite3_column_count $VM] \
185       [get_row_values $VM] \
186       [get_column_names $VM]
187} {SQLITE_ROW 1 {{}} {5/0 {}}}
188do_test capi2-3.8 {
189  sqlite3_finalize $VM
190} {SQLITE_OK}
191do_test capi2-3.9 {
192  execsql {CREATE UNIQUE INDEX i1 ON t1(a)}
193  set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,2,3)} -1 TAIL]
194  set TAIL
195} {}
196do_test capi2-3.9b {db changes} {0}
197do_test capi2-3.10 {
198  list [sqlite3_step $VM] \
199       [sqlite3_column_count $VM] \
200       [get_row_values $VM] \
201       [get_column_names $VM]
202} {SQLITE_DONE 0 {} {}}
203
204# Update for v3 - the change has not actually happened until the query is
205# finalized. Is this going to cause trouble for anyone? Lee Nelson maybe?
206# (Later:) The change now happens just before SQLITE_DONE is returned.
207do_test capi2-3.10b {db changes} {1}
208do_test capi2-3.11 {
209  sqlite3_finalize $VM
210} {SQLITE_OK}
211do_test capi2-3.11b {db changes} {1}
212do_test capi2-3.12 {
213  sqlite3_finalize $VM
214} {SQLITE_MISUSE}
215do_test capi2-3.13 {
216  set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,3,4)} -1 TAIL]
217  list [sqlite3_step $VM] \
218       [sqlite3_column_count $VM] \
219       [get_row_values $VM] \
220       [get_column_names $VM]
221} {SQLITE_ERROR 0 {} {}}
222
223# Update for v3: Preparing a statement does not affect the change counter.
224# (Test result changes from 0 to 1).  (Later:) change counter updates occur
225# when sqlite3_step returns, not at finalize time.
226do_test capi2-3.13b {db changes} {0}
227
228do_test capi2-3.14 {
229  list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
230} {SQLITE_CONSTRAINT {column a is not unique}}
231do_test capi2-3.15 {
232  set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL]
233  set TAIL
234} {}
235do_test capi2-3.16 {
236  list [sqlite3_step $VM] \
237       [sqlite3_column_count $VM] \
238       [get_row_values $VM] \
239       [get_column_names $VM]
240} {SQLITE_DONE 0 {} {}}
241do_test capi2-3.17 {
242  list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
243} {SQLITE_OK {not an error}}
244do_test capi2-3.18 {
245  set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL]
246  list [sqlite3_step $VM] \
247       [sqlite3_column_count $VM] \
248       [get_row_values $VM] \
249       [get_column_names $VM]
250} {SQLITE_ERROR 0 {} {}}
251do_test capi2-3.19 {
252  list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
253} {SQLITE_CONSTRAINT {t2.a may not be NULL}}
254
255# Two or more virtual machines exists at the same time.
256#
257do_test capi2-4.1 {
258  set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL]
259  set TAIL
260} {}
261do_test capi2-4.2 {
262  set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL]
263  set TAIL
264} {}
265do_test capi2-4.3 {
266  set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL]
267  set TAIL
268} {}
269do_test capi2-4.4 {
270  list [sqlite3_step $VM2] \
271       [sqlite3_column_count $VM2] \
272       [get_row_values $VM2] \
273       [get_column_names $VM2]
274} {SQLITE_DONE 0 {} {}}
275do_test capi2-4.5 {
276  execsql {SELECT * FROM t2 ORDER BY a}
277} {2 3}
278do_test capi2-4.6 {
279  sqlite3_finalize $VM2
280} {SQLITE_OK}
281do_test capi2-4.7 {
282  list [sqlite3_step $VM3] \
283       [sqlite3_column_count $VM3] \
284       [get_row_values $VM3] \
285       [get_column_names $VM3]
286} {SQLITE_DONE 0 {} {}}
287do_test capi2-4.8 {
288  execsql {SELECT * FROM t2 ORDER BY a}
289} {2 3 3 4}
290do_test capi2-4.9 {
291  sqlite3_finalize $VM3
292} {SQLITE_OK}
293do_test capi2-4.10 {
294  list [sqlite3_step $VM1] \
295       [sqlite3_column_count $VM1] \
296       [get_row_values $VM1] \
297       [get_column_names $VM1]
298} {SQLITE_DONE 0 {} {}}
299do_test capi2-4.11 {
300  execsql {SELECT * FROM t2 ORDER BY a}
301} {1 2 2 3 3 4}
302do_test capi2-4.12 {
303  sqlite3_finalize $VM1
304} {SQLITE_OK}
305
306# Interleaved SELECTs
307#
308do_test capi2-5.1 {
309  set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
310  set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
311  set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
312  list [sqlite3_step $VM1] \
313       [sqlite3_column_count $VM1] \
314       [get_row_values $VM1] \
315       [get_column_names $VM1]
316} {SQLITE_ROW 2 {2 3} {a b {} {}}}
317do_test capi2-5.2 {
318  list [sqlite3_step $VM2] \
319       [sqlite3_column_count $VM2] \
320       [get_row_values $VM2] \
321       [get_column_names $VM2]
322} {SQLITE_ROW 2 {2 3} {a b {} {}}}
323do_test capi2-5.3 {
324  list [sqlite3_step $VM1] \
325       [sqlite3_column_count $VM1] \
326       [get_row_values $VM1] \
327       [get_column_names $VM1]
328} {SQLITE_ROW 2 {3 4} {a b {} {}}}
329do_test capi2-5.4 {
330  list [sqlite3_step $VM3] \
331       [sqlite3_column_count $VM3] \
332       [get_row_values $VM3] \
333       [get_column_names $VM3]
334} {SQLITE_ROW 2 {2 3} {a b {} {}}}
335do_test capi2-5.5 {
336  list [sqlite3_step $VM3] \
337       [sqlite3_column_count $VM3] \
338       [get_row_values $VM3] \
339       [get_column_names $VM3]
340} {SQLITE_ROW 2 {3 4} {a b {} {}}}
341do_test capi2-5.6 {
342  list [sqlite3_step $VM3] \
343       [sqlite3_column_count $VM3] \
344       [get_row_values $VM3] \
345       [get_column_names $VM3]
346} {SQLITE_ROW 2 {1 2} {a b {} {}}}
347do_test capi2-5.7 {
348  list [sqlite3_step $VM3] \
349       [sqlite3_column_count $VM3] \
350       [get_row_values $VM3] \
351       [get_column_names $VM3]
352} {SQLITE_DONE 2 {} {a b {} {}}}
353do_test capi2-5.8 {
354  sqlite3_finalize $VM3
355} {SQLITE_OK}
356do_test capi2-5.9 {
357  list [sqlite3_step $VM1] \
358       [sqlite3_column_count $VM1] \
359       [get_row_values $VM1] \
360       [get_column_names $VM1]
361} {SQLITE_ROW 2 {1 2} {a b {} {}}}
362do_test capi2-5.10 {
363  sqlite3_finalize $VM1
364} {SQLITE_OK}
365do_test capi2-5.11 {
366  list [sqlite3_step $VM2] \
367       [sqlite3_column_count $VM2] \
368       [get_row_values $VM2] \
369       [get_column_names $VM2]
370} {SQLITE_ROW 2 {3 4} {a b {} {}}}
371do_test capi2-5.12 {
372  list [sqlite3_step $VM2] \
373       [sqlite3_column_count $VM2] \
374       [get_row_values $VM2] \
375       [get_column_names $VM2]
376} {SQLITE_ROW 2 {1 2} {a b {} {}}}
377do_test capi2-5.11 {
378  sqlite3_finalize $VM2
379} {SQLITE_OK}
380
381# Check for proper SQLITE_BUSY returns.
382#
383do_test capi2-6.1 {
384  execsql {
385    BEGIN;
386    CREATE TABLE t3(x counter);
387    INSERT INTO t3 VALUES(1);
388    INSERT INTO t3 VALUES(2);
389    INSERT INTO t3 SELECT x+2 FROM t3;
390    INSERT INTO t3 SELECT x+4 FROM t3;
391    INSERT INTO t3 SELECT x+8 FROM t3;
392    COMMIT;
393  }
394  set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL]
395  sqlite3 db2 test.db
396  execsql {BEGIN} db2
397} {}
398# Update for v3: BEGIN doesn't write-lock the database. It is quite
399# difficult to get v3 to write-lock the database, which causes a few
400# problems for test scripts.
401#
402# do_test capi2-6.2 {
403#   list [sqlite3_step $VM1] \
404#        [sqlite3_column_count $VM1] \
405#        [get_row_values $VM1] \
406#        [get_column_names $VM1]
407# } {SQLITE_BUSY 0 {} {}}
408do_test capi2-6.3 {
409  execsql {COMMIT} db2
410} {}
411do_test capi2-6.4 {
412  list [sqlite3_step $VM1] \
413       [sqlite3_column_count $VM1] \
414       [get_row_values $VM1] \
415       [get_column_names $VM1]
416} {SQLITE_ROW 1 1 {x counter}}
417do_test capi2-6.5 {
418  catchsql {INSERT INTO t3 VALUES(10);} db2
419} {1 {database is locked}}
420do_test capi2-6.6 {
421  list [sqlite3_step $VM1] \
422       [sqlite3_column_count $VM1] \
423       [get_row_values $VM1] \
424       [get_column_names $VM1]
425} {SQLITE_ROW 1 2 {x counter}}
426do_test capi2-6.7 {
427  execsql {SELECT * FROM t2} db2
428} {2 3 3 4 1 2}
429do_test capi2-6.8 {
430  list [sqlite3_step $VM1] \
431       [sqlite3_column_count $VM1] \
432       [get_row_values $VM1] \
433       [get_column_names $VM1]
434} {SQLITE_ROW 1 3 {x counter}}
435do_test capi2-6.9 {
436  execsql {SELECT * FROM t2}
437} {2 3 3 4 1 2}
438do_test capi2-6.10 {
439  list [sqlite3_step $VM1] \
440       [sqlite3_column_count $VM1] \
441       [get_row_values $VM1] \
442       [get_column_names $VM1]
443} {SQLITE_ROW 1 4 {x counter}}
444do_test capi2-6.11 {
445  execsql {BEGIN}
446} {}
447do_test capi2-6.12 {
448  list [sqlite3_step $VM1] \
449       [sqlite3_column_count $VM1] \
450       [get_row_values $VM1] \
451       [get_column_names $VM1]
452} {SQLITE_ROW 1 5 {x counter}}
453
454do_test capi2-6.13 {
455  catchsql {UPDATE t3 SET x=x+1}
456} {1 {database table is locked}}
457do_test capi2-6.14 {
458  list [sqlite3_step $VM1] \
459       [sqlite3_column_count $VM1] \
460       [get_row_values $VM1] \
461       [get_column_names $VM1]
462} {SQLITE_ROW 1 6 {x counter}}
463do_test capi2-6.15 {
464  execsql {SELECT * FROM t1}
465} {1 2 3}
466do_test capi2-6.16 {
467  list [sqlite3_step $VM1] \
468       [sqlite3_column_count $VM1] \
469       [get_row_values $VM1] \
470       [get_column_names $VM1]
471} {SQLITE_ROW 1 7 {x counter}}
472do_test capi2-6.17 {
473  catchsql {UPDATE t1 SET b=b+1}
474} {0 {}}
475do_test capi2-6.18 {
476  list [sqlite3_step $VM1] \
477       [sqlite3_column_count $VM1] \
478       [get_row_values $VM1] \
479       [get_column_names $VM1]
480} {SQLITE_ROW 1 8 {x counter}}
481do_test capi2-6.19 {
482  execsql {SELECT * FROM t1}
483} {1 3 3}
484do_test capi2-6.20 {
485  list [sqlite3_step $VM1] \
486       [sqlite3_column_count $VM1] \
487       [get_row_values $VM1] \
488       [get_column_names $VM1]
489} {SQLITE_ROW 1 9 {x counter}}
490#do_test capi2-6.21 {
491#  execsql {ROLLBACK; SELECT * FROM t1}
492#} {1 2 3}
493do_test capi2-6.22 {
494  list [sqlite3_step $VM1] \
495       [sqlite3_column_count $VM1] \
496       [get_row_values $VM1] \
497       [get_column_names $VM1]
498} {SQLITE_ROW 1 10 {x counter}}
499#do_test capi2-6.23 {
500#  execsql {BEGIN TRANSACTION;}
501#} {}
502do_test capi2-6.24 {
503  list [sqlite3_step $VM1] \
504       [sqlite3_column_count $VM1] \
505       [get_row_values $VM1] \
506       [get_column_names $VM1]
507} {SQLITE_ROW 1 11 {x counter}}
508do_test capi2-6.25 {
509  execsql {
510    INSERT INTO t1 VALUES(2,3,4);
511    SELECT * FROM t1;
512  }
513} {1 3 3 2 3 4}
514do_test capi2-6.26 {
515  list [sqlite3_step $VM1] \
516       [sqlite3_column_count $VM1] \
517       [get_row_values $VM1] \
518       [get_column_names $VM1]
519} {SQLITE_ROW 1 12 {x counter}}
520do_test capi2-6.27 {
521  catchsql {
522    INSERT INTO t1 VALUES(2,4,5);
523    SELECT * FROM t1;
524  }
525} {1 {column a is not unique}}
526do_test capi2-6.28 {
527  list [sqlite3_step $VM1] \
528       [sqlite3_column_count $VM1] \
529       [get_row_values $VM1] \
530       [get_column_names $VM1]
531} {SQLITE_ROW 1 13 {x counter}}
532do_test capi2-6.99 {
533  sqlite3_finalize $VM1
534} {SQLITE_OK}
535catchsql {ROLLBACK}
536
537do_test capi2-7.1 {
538  stepsql $DB {
539    SELECT * FROM t1
540  }
541} {0 1 2 3}
542do_test capi2-7.2 {
543  stepsql $DB {
544    PRAGMA count_changes=on
545  }
546} {0}
547do_test capi2-7.3 {
548  stepsql $DB {
549    UPDATE t1 SET a=a+10;
550  }
551} {0 1}
552do_test capi2-7.4 {
553  stepsql $DB {
554    INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1;
555  }
556} {0 1}
557do_test capi2-7.4b {sqlite3_changes $DB} {1}
558do_test capi2-7.5 {
559  stepsql $DB {
560    UPDATE t1 SET a=a+10;
561  }
562} {0 2}
563do_test capi2-7.5b {sqlite3_changes $DB} {2}
564do_test capi2-7.6 {
565  stepsql $DB {
566    SELECT * FROM t1;
567  }
568} {0 21 2 3 22 3 4}
569do_test capi2-7.7 {
570  stepsql $DB {
571    INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1;
572  }
573} {0 2}
574do_test capi2-7.8 {
575  sqlite3_changes $DB
576} {2}
577do_test capi2-7.9 {
578  stepsql $DB {
579    SELECT * FROM t1;
580  }
581} {0 21 2 3 22 3 4 23 4 5 24 5 6}
582do_test capi2-7.10 {
583  stepsql $DB {
584    UPDATE t1 SET a=a-20;
585    SELECT * FROM t1;
586  }
587} {0 4 1 2 3 2 3 4 3 4 5 4 5 6}
588
589# Update for version 3: A SELECT statement no longer resets the change
590# counter (Test result changes from 0 to 4).
591do_test capi2-7.11 {
592  sqlite3_changes $DB
593} {4}
594do_test capi2-7.11a {
595  execsql {SELECT count(*) FROM t1}
596} {4}
597
598ifcapable {explain} {
599  do_test capi2-7.12 {
600    set x [stepsql $DB {EXPLAIN SELECT * FROM t1}]
601    lindex $x 0
602  } {0}
603}
604
605# Ticket #261 - make sure we can finalize before the end of a query.
606#
607do_test capi2-8.1 {
608  set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
609  sqlite3_finalize $VM1
610} {SQLITE_OK}
611
612# Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare
613# and all of the return pointers in sqlite_step can be null.
614#
615do_test capi2-9.1 {
616  set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY]
617  sqlite3_step $VM1
618  sqlite3_finalize $VM1
619} {SQLITE_OK}
620
621do_test capi2-10.1 {
622  sqlite3_finalize 0
623} {SQLITE_OK}
624do_test capi2-10.2 {
625  sqlite3_reset 0
626} {SQLITE_OK}
627
628db2 close
629
630finish_test
631