xref: /sqlite-3.40.0/test/capi2.test (revision f2fcd075)
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.37 2008/12/30 17:55:00 drh 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  set DB [sqlite3_connection_pointer db]
52  execsql {CREATE TABLE t1(a,b,c)}
53  set VM [sqlite3_prepare $DB {SELECT name, rowid FROM sqlite_master} -1 TAIL]
54  set TAIL
55} {}
56do_test capi2-1.2 {
57  sqlite3_step $VM
58} {SQLITE_ROW}
59do_test capi2-1.3 {
60  sqlite3_data_count $VM
61} {2}
62do_test capi2-1.4 {
63  get_row_values $VM
64} {t1 1}
65do_test capi2-1.5 {
66  get_column_names $VM
67} {name rowid text INTEGER}
68do_test capi2-1.6 {
69  sqlite3_step $VM
70} {SQLITE_DONE}
71do_test capi2-1.7 {
72  list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM]
73} {2 {} {name rowid text INTEGER}}
74
75# This used to be SQLITE_MISUSE.  But now we automatically reset prepared
76# statements.
77do_test capi2-1.8 {
78  sqlite3_step $VM
79} {SQLITE_ROW}
80
81# Update: In v2, once SQLITE_MISUSE is returned the statement handle cannot
82# be interrogated for more information. However in v3, since the column
83# count, names and types are determined at compile time, these are still
84# accessible after an SQLITE_MISUSE error.
85do_test capi2-1.9 {
86  sqlite3_reset $VM
87  list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM]
88} {2 {} {name rowid text INTEGER}}
89do_test capi2-1.10 {
90  sqlite3_data_count $VM
91} {0}
92
93do_test capi2-1.11 {
94  sqlite3_finalize $VM
95} {SQLITE_OK}
96
97# Check to make sure that the "tail" of a multi-statement SQL script
98# is returned by sqlite3_prepare.
99#
100do_test capi2-2.1 {
101  set SQL {
102    SELECT name, rowid FROM sqlite_master;
103    SELECT name, rowid FROM sqlite_master WHERE 0;
104    -- A comment at the end
105  }
106  set VM [sqlite3_prepare $DB $SQL -1 SQL]
107  set SQL
108} {
109    SELECT name, rowid FROM sqlite_master WHERE 0;
110    -- A comment at the end
111  }
112do_test capi2-2.2 {
113  set r [sqlite3_step $VM]
114  lappend r [sqlite3_column_count $VM] \
115            [get_row_values $VM] \
116            [get_column_names $VM]
117} {SQLITE_ROW 2 {t1 1} {name rowid text INTEGER}}
118do_test capi2-2.3 {
119  set r [sqlite3_step $VM]
120  lappend r [sqlite3_column_count $VM] \
121            [get_row_values $VM] \
122            [get_column_names $VM]
123} {SQLITE_DONE 2 {} {name rowid text INTEGER}}
124do_test capi2-2.4 {
125  sqlite3_finalize $VM
126} {SQLITE_OK}
127do_test capi2-2.5 {
128  set VM [sqlite3_prepare $DB $SQL -1 SQL]
129  set SQL
130} {
131    -- A comment at the end
132  }
133do_test capi2-2.6 {
134  set r [sqlite3_step $VM]
135  lappend r [sqlite3_column_count $VM] \
136            [get_row_values $VM] \
137            [get_column_names $VM]
138} {SQLITE_DONE 2 {} {name rowid text INTEGER}}
139do_test capi2-2.7 {
140  sqlite3_finalize $VM
141} {SQLITE_OK}
142do_test capi2-2.8 {
143  set VM [sqlite3_prepare $DB $SQL -1 SQL]
144  list $SQL $VM
145} {{} {}}
146
147# Check the error handling.
148#
149do_test capi2-3.1 {
150  set rc [catch {
151      sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL
152  } msg]
153  lappend rc $msg $TAIL
154} {1 {(1) no such column: bogus} {}}
155do_test capi2-3.2 {
156  set rc [catch {
157      sqlite3_prepare $DB {select bogus from } -1 TAIL
158  } msg]
159  lappend rc $msg $TAIL
160} {1 {(1) near " ": syntax error} {}}
161do_test capi2-3.3 {
162  set rc [catch {
163      sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL
164  } msg]
165  lappend rc $msg $TAIL
166} {1 {(1) no such column: bogus} {}}
167do_test capi2-3.4 {
168  set rc [catch {
169      sqlite3_prepare $DB {select bogus from sqlite_master;x;} -1 TAIL
170  } msg]
171  lappend rc $msg $TAIL
172} {1 {(1) no such column: bogus} {x;}}
173do_test capi2-3.5 {
174  set rc [catch {
175      sqlite3_prepare $DB {select bogus from sqlite_master;;;x;} -1 TAIL
176  } msg]
177  lappend rc $msg $TAIL
178} {1 {(1) no such column: bogus} {;;x;}}
179do_test capi2-3.6 {
180  set rc [catch {
181      sqlite3_prepare $DB {select 5/0} -1 TAIL
182  } VM]
183  lappend rc $TAIL
184} {0 {}}
185do_test capi2-3.7 {
186  list [sqlite3_step $VM] \
187       [sqlite3_column_count $VM] \
188       [get_row_values $VM] \
189       [get_column_names $VM]
190} {SQLITE_ROW 1 {{}} {5/0 {}}}
191do_test capi2-3.8 {
192  sqlite3_finalize $VM
193} {SQLITE_OK}
194do_test capi2-3.9 {
195  execsql {CREATE UNIQUE INDEX i1 ON t1(a)}
196  set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,2,3)} -1 TAIL]
197  set TAIL
198} {}
199do_test capi2-3.9b {db changes} {0}
200do_test capi2-3.10 {
201  list [sqlite3_step $VM] \
202       [sqlite3_column_count $VM] \
203       [get_row_values $VM] \
204       [get_column_names $VM]
205} {SQLITE_DONE 0 {} {}}
206
207# Update for v3 - the change has not actually happened until the query is
208# finalized. Is this going to cause trouble for anyone? Lee Nelson maybe?
209# (Later:) The change now happens just before SQLITE_DONE is returned.
210do_test capi2-3.10b {db changes} {1}
211do_test capi2-3.11 {
212  sqlite3_finalize $VM
213} {SQLITE_OK}
214do_test capi2-3.11b {db changes} {1}
215#do_test capi2-3.12-misuse {
216#  sqlite3_finalize $VM
217#} {SQLITE_MISUSE}
218do_test capi2-3.13 {
219  set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,3,4)} -1 TAIL]
220  list [sqlite3_step $VM] \
221       [sqlite3_column_count $VM] \
222       [get_row_values $VM] \
223       [get_column_names $VM]
224} {SQLITE_ERROR 0 {} {}}
225
226# Update for v3: Preparing a statement does not affect the change counter.
227# (Test result changes from 0 to 1).  (Later:) change counter updates occur
228# when sqlite3_step returns, not at finalize time.
229do_test capi2-3.13b {db changes} {0}
230
231do_test capi2-3.14 {
232  list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
233} {SQLITE_CONSTRAINT {column a is not unique}}
234do_test capi2-3.15 {
235  set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL]
236  set TAIL
237} {}
238do_test capi2-3.16 {
239  list [sqlite3_step $VM] \
240       [sqlite3_column_count $VM] \
241       [get_row_values $VM] \
242       [get_column_names $VM]
243} {SQLITE_DONE 0 {} {}}
244do_test capi2-3.17 {
245  list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
246} {SQLITE_OK {not an error}}
247do_test capi2-3.18 {
248  set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL]
249  list [sqlite3_step $VM] \
250       [sqlite3_column_count $VM] \
251       [get_row_values $VM] \
252       [get_column_names $VM]
253} {SQLITE_ERROR 0 {} {}}
254do_test capi2-3.19 {
255  list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
256} {SQLITE_CONSTRAINT {t2.a may not be NULL}}
257
258do_test capi2-3.20 {
259  execsql {
260    CREATE TABLE a1(message_id, name , UNIQUE(message_id, name) );
261    INSERT INTO a1 VALUES(1, 1);
262  }
263} {}
264do_test capi2-3.21 {
265  set VM [sqlite3_prepare $DB {INSERT INTO a1 VALUES(1, 1)} -1 TAIL]
266  sqlite3_step $VM
267} {SQLITE_ERROR}
268do_test capi2-3.22 {
269  sqlite3_errcode $DB
270} {SQLITE_ERROR}
271do_test capi2-3.23 {
272  sqlite3_finalize $VM
273} {SQLITE_CONSTRAINT}
274do_test capi2-3.24 {
275  sqlite3_errcode $DB
276} {SQLITE_CONSTRAINT}
277
278# Two or more virtual machines exists at the same time.
279#
280do_test capi2-4.1 {
281  set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL]
282  set TAIL
283} {}
284do_test capi2-4.2 {
285  set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL]
286  set TAIL
287} {}
288do_test capi2-4.3 {
289  set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL]
290  set TAIL
291} {}
292do_test capi2-4.4 {
293  list [sqlite3_step $VM2] \
294       [sqlite3_column_count $VM2] \
295       [get_row_values $VM2] \
296       [get_column_names $VM2]
297} {SQLITE_DONE 0 {} {}}
298do_test capi2-4.5 {
299  execsql {SELECT * FROM t2 ORDER BY a}
300} {2 3}
301do_test capi2-4.6 {
302  sqlite3_finalize $VM2
303} {SQLITE_OK}
304do_test capi2-4.7 {
305  list [sqlite3_step $VM3] \
306       [sqlite3_column_count $VM3] \
307       [get_row_values $VM3] \
308       [get_column_names $VM3]
309} {SQLITE_DONE 0 {} {}}
310do_test capi2-4.8 {
311  execsql {SELECT * FROM t2 ORDER BY a}
312} {2 3 3 4}
313do_test capi2-4.9 {
314  sqlite3_finalize $VM3
315} {SQLITE_OK}
316do_test capi2-4.10 {
317  list [sqlite3_step $VM1] \
318       [sqlite3_column_count $VM1] \
319       [get_row_values $VM1] \
320       [get_column_names $VM1]
321} {SQLITE_DONE 0 {} {}}
322do_test capi2-4.11 {
323  execsql {SELECT * FROM t2 ORDER BY a}
324} {1 2 2 3 3 4}
325do_test capi2-4.12 {
326  sqlite3_finalize $VM1
327} {SQLITE_OK}
328
329# Interleaved SELECTs
330#
331do_test capi2-5.1 {
332  set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
333  set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
334  set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
335  list [sqlite3_step $VM1] \
336       [sqlite3_column_count $VM1] \
337       [get_row_values $VM1] \
338       [get_column_names $VM1]
339} {SQLITE_ROW 2 {2 3} {a b {} {}}}
340do_test capi2-5.2 {
341  list [sqlite3_step $VM2] \
342       [sqlite3_column_count $VM2] \
343       [get_row_values $VM2] \
344       [get_column_names $VM2]
345} {SQLITE_ROW 2 {2 3} {a b {} {}}}
346do_test capi2-5.3 {
347  list [sqlite3_step $VM1] \
348       [sqlite3_column_count $VM1] \
349       [get_row_values $VM1] \
350       [get_column_names $VM1]
351} {SQLITE_ROW 2 {3 4} {a b {} {}}}
352do_test capi2-5.4 {
353  list [sqlite3_step $VM3] \
354       [sqlite3_column_count $VM3] \
355       [get_row_values $VM3] \
356       [get_column_names $VM3]
357} {SQLITE_ROW 2 {2 3} {a b {} {}}}
358do_test capi2-5.5 {
359  list [sqlite3_step $VM3] \
360       [sqlite3_column_count $VM3] \
361       [get_row_values $VM3] \
362       [get_column_names $VM3]
363} {SQLITE_ROW 2 {3 4} {a b {} {}}}
364do_test capi2-5.6 {
365  list [sqlite3_step $VM3] \
366       [sqlite3_column_count $VM3] \
367       [get_row_values $VM3] \
368       [get_column_names $VM3]
369} {SQLITE_ROW 2 {1 2} {a b {} {}}}
370do_test capi2-5.7 {
371  list [sqlite3_step $VM3] \
372       [sqlite3_column_count $VM3] \
373       [get_row_values $VM3] \
374       [get_column_names $VM3]
375} {SQLITE_DONE 2 {} {a b {} {}}}
376do_test capi2-5.8 {
377  sqlite3_finalize $VM3
378} {SQLITE_OK}
379do_test capi2-5.9 {
380  list [sqlite3_step $VM1] \
381       [sqlite3_column_count $VM1] \
382       [get_row_values $VM1] \
383       [get_column_names $VM1]
384} {SQLITE_ROW 2 {1 2} {a b {} {}}}
385do_test capi2-5.10 {
386  sqlite3_finalize $VM1
387} {SQLITE_OK}
388do_test capi2-5.11 {
389  list [sqlite3_step $VM2] \
390       [sqlite3_column_count $VM2] \
391       [get_row_values $VM2] \
392       [get_column_names $VM2]
393} {SQLITE_ROW 2 {3 4} {a b {} {}}}
394do_test capi2-5.12 {
395  list [sqlite3_step $VM2] \
396       [sqlite3_column_count $VM2] \
397       [get_row_values $VM2] \
398       [get_column_names $VM2]
399} {SQLITE_ROW 2 {1 2} {a b {} {}}}
400do_test capi2-5.11 {
401  sqlite3_finalize $VM2
402} {SQLITE_OK}
403
404# Check for proper SQLITE_BUSY returns.
405#
406do_test capi2-6.1 {
407  execsql {
408    BEGIN;
409    CREATE TABLE t3(x counter);
410    INSERT INTO t3 VALUES(1);
411    INSERT INTO t3 VALUES(2);
412    INSERT INTO t3 SELECT x+2 FROM t3;
413    INSERT INTO t3 SELECT x+4 FROM t3;
414    INSERT INTO t3 SELECT x+8 FROM t3;
415    COMMIT;
416  }
417  set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL]
418  sqlite3 db2 test.db
419  execsql {BEGIN} db2
420} {}
421# Update for v3: BEGIN doesn't write-lock the database. It is quite
422# difficult to get v3 to write-lock the database, which causes a few
423# problems for test scripts.
424#
425# do_test capi2-6.2 {
426#   list [sqlite3_step $VM1] \
427#        [sqlite3_column_count $VM1] \
428#        [get_row_values $VM1] \
429#        [get_column_names $VM1]
430# } {SQLITE_BUSY 0 {} {}}
431do_test capi2-6.3 {
432  execsql {COMMIT} db2
433} {}
434do_test capi2-6.4 {
435  list [sqlite3_step $VM1] \
436       [sqlite3_column_count $VM1] \
437       [get_row_values $VM1] \
438       [get_column_names $VM1]
439} {SQLITE_ROW 1 1 {x counter}}
440do_test capi2-6.5 {
441  catchsql {INSERT INTO t3 VALUES(10);} db2
442} {1 {database is locked}}
443do_test capi2-6.6 {
444  list [sqlite3_step $VM1] \
445       [sqlite3_column_count $VM1] \
446       [get_row_values $VM1] \
447       [get_column_names $VM1]
448} {SQLITE_ROW 1 2 {x counter}}
449do_test capi2-6.7 {
450  execsql {SELECT * FROM t2} db2
451} {2 3 3 4 1 2}
452do_test capi2-6.8 {
453  list [sqlite3_step $VM1] \
454       [sqlite3_column_count $VM1] \
455       [get_row_values $VM1] \
456       [get_column_names $VM1]
457} {SQLITE_ROW 1 3 {x counter}}
458do_test capi2-6.9 {
459  execsql {SELECT * FROM t2}
460} {2 3 3 4 1 2}
461do_test capi2-6.10 {
462  list [sqlite3_step $VM1] \
463       [sqlite3_column_count $VM1] \
464       [get_row_values $VM1] \
465       [get_column_names $VM1]
466} {SQLITE_ROW 1 4 {x counter}}
467do_test capi2-6.11 {
468  execsql {BEGIN}
469} {}
470do_test capi2-6.12 {
471  list [sqlite3_step $VM1] \
472       [sqlite3_column_count $VM1] \
473       [get_row_values $VM1] \
474       [get_column_names $VM1]
475} {SQLITE_ROW 1 5 {x counter}}
476
477# A read no longer blocks a write in the same connection.
478#do_test capi2-6.13 {
479#  catchsql {UPDATE t3 SET x=x+1}
480#} {1 {database table is locked}}
481
482do_test capi2-6.14 {
483  list [sqlite3_step $VM1] \
484       [sqlite3_column_count $VM1] \
485       [get_row_values $VM1] \
486       [get_column_names $VM1]
487} {SQLITE_ROW 1 6 {x counter}}
488do_test capi2-6.15 {
489  execsql {SELECT * FROM t1}
490} {1 2 3}
491do_test capi2-6.16 {
492  list [sqlite3_step $VM1] \
493       [sqlite3_column_count $VM1] \
494       [get_row_values $VM1] \
495       [get_column_names $VM1]
496} {SQLITE_ROW 1 7 {x counter}}
497do_test capi2-6.17 {
498  catchsql {UPDATE t1 SET b=b+1}
499} {0 {}}
500do_test capi2-6.18 {
501  list [sqlite3_step $VM1] \
502       [sqlite3_column_count $VM1] \
503       [get_row_values $VM1] \
504       [get_column_names $VM1]
505} {SQLITE_ROW 1 8 {x counter}}
506do_test capi2-6.19 {
507  execsql {SELECT * FROM t1}
508} {1 3 3}
509do_test capi2-6.20 {
510  list [sqlite3_step $VM1] \
511       [sqlite3_column_count $VM1] \
512       [get_row_values $VM1] \
513       [get_column_names $VM1]
514} {SQLITE_ROW 1 9 {x counter}}
515#do_test capi2-6.21 {
516#  execsql {ROLLBACK; SELECT * FROM t1}
517#} {1 2 3}
518do_test capi2-6.22 {
519  list [sqlite3_step $VM1] \
520       [sqlite3_column_count $VM1] \
521       [get_row_values $VM1] \
522       [get_column_names $VM1]
523} {SQLITE_ROW 1 10 {x counter}}
524#do_test capi2-6.23 {
525#  execsql {BEGIN TRANSACTION;}
526#} {}
527do_test capi2-6.24 {
528  list [sqlite3_step $VM1] \
529       [sqlite3_column_count $VM1] \
530       [get_row_values $VM1] \
531       [get_column_names $VM1]
532} {SQLITE_ROW 1 11 {x counter}}
533do_test capi2-6.25 {
534  execsql {
535    INSERT INTO t1 VALUES(2,3,4);
536    SELECT * FROM t1;
537  }
538} {1 3 3 2 3 4}
539do_test capi2-6.26 {
540  list [sqlite3_step $VM1] \
541       [sqlite3_column_count $VM1] \
542       [get_row_values $VM1] \
543       [get_column_names $VM1]
544} {SQLITE_ROW 1 12 {x counter}}
545do_test capi2-6.27 {
546  catchsql {
547    INSERT INTO t1 VALUES(2,4,5);
548    SELECT * FROM t1;
549  }
550} {1 {column a is not unique}}
551do_test capi2-6.28 {
552  list [sqlite3_step $VM1] \
553       [sqlite3_column_count $VM1] \
554       [get_row_values $VM1] \
555       [get_column_names $VM1]
556} {SQLITE_ROW 1 13 {x counter}}
557do_test capi2-6.99 {
558  sqlite3_finalize $VM1
559} {SQLITE_OK}
560catchsql {ROLLBACK}
561
562do_test capi2-7.1 {
563  stepsql $DB {
564    SELECT * FROM t1
565  }
566} {0 1 2 3}
567do_test capi2-7.2 {
568  stepsql $DB {
569    PRAGMA count_changes=on
570  }
571} {0}
572do_test capi2-7.3 {
573  stepsql $DB {
574    UPDATE t1 SET a=a+10;
575  }
576} {0 1}
577do_test capi2-7.4 {
578  stepsql $DB {
579    INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1;
580  }
581} {0 1}
582do_test capi2-7.4b {sqlite3_changes $DB} {1}
583do_test capi2-7.5 {
584  stepsql $DB {
585    UPDATE t1 SET a=a+10;
586  }
587} {0 2}
588do_test capi2-7.5b {sqlite3_changes $DB} {2}
589do_test capi2-7.6 {
590  stepsql $DB {
591    SELECT * FROM t1;
592  }
593} {0 21 2 3 22 3 4}
594do_test capi2-7.7 {
595  stepsql $DB {
596    INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1;
597  }
598} {0 2}
599do_test capi2-7.8 {
600  sqlite3_changes $DB
601} {2}
602do_test capi2-7.9 {
603  stepsql $DB {
604    SELECT * FROM t1;
605  }
606} {0 21 2 3 22 3 4 23 4 5 24 5 6}
607do_test capi2-7.10 {
608  stepsql $DB {
609    UPDATE t1 SET a=a-20;
610    SELECT * FROM t1;
611  }
612} {0 4 1 2 3 2 3 4 3 4 5 4 5 6}
613
614# Update for version 3: A SELECT statement no longer resets the change
615# counter (Test result changes from 0 to 4).
616do_test capi2-7.11 {
617  sqlite3_changes $DB
618} {4}
619do_test capi2-7.11a {
620  execsql {SELECT count(*) FROM t1}
621} {4}
622
623ifcapable {explain} {
624  do_test capi2-7.12 {
625    set x [stepsql $DB {EXPLAIN SELECT * FROM t1}]
626    lindex $x 0
627  } {0}
628}
629
630# Ticket #261 - make sure we can finalize before the end of a query.
631#
632do_test capi2-8.1 {
633  set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
634  sqlite3_finalize $VM1
635} {SQLITE_OK}
636
637# Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare
638# and all of the return pointers in sqlite_step can be null.
639#
640do_test capi2-9.1 {
641  set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY]
642  sqlite3_step $VM1
643  sqlite3_finalize $VM1
644} {SQLITE_OK}
645
646# Test that passing a NULL pointer to sqlite3_finalize() or sqlite3_reset
647# does not cause an error.
648do_test capi2-10.1 {
649  sqlite3_finalize 0
650} {SQLITE_OK}
651do_test capi2-10.2 {
652  sqlite3_reset 0
653} {SQLITE_OK}
654
655#---------------------------------------------------------------------------
656# The following tests - capi2-11.* - test the "column origin" APIs.
657#
658#   sqlite3_column_origin_name()
659#   sqlite3_column_database_name()
660#   sqlite3_column_table_name()
661#
662
663ifcapable columnmetadata {
664
665# This proc uses the database handle $::DB to compile the SQL statement passed
666# as a parameter. The return value of this procedure is a list with one
667# element for each column returned by the compiled statement. Each element of
668# this list is itself a list of length three, consisting of the origin
669# database, table and column for the corresponding returned column.
670proc check_origins {sql} {
671  set ret [list]
672  set ::STMT [sqlite3_prepare $::DB $sql -1 dummy]
673  for {set i 0} {$i < [sqlite3_column_count $::STMT]} {incr i} {
674    lappend ret [list                           \
675      [sqlite3_column_database_name $::STMT $i] \
676      [sqlite3_column_table_name $::STMT $i]    \
677      [sqlite3_column_origin_name $::STMT $i]   \
678    ]
679  }
680  sqlite3_finalize $::STMT
681  return $ret
682}
683do_test capi2-11.1 {
684  execsql {
685    CREATE TABLE tab1(col1, col2);
686  }
687} {}
688do_test capi2-11.2 {
689  check_origins {SELECT col2, col1 FROM tab1}
690} [list {main tab1 col2} {main tab1 col1}]
691do_test capi2-11.3 {
692  check_origins {SELECT col2 AS hello, col1 AS world FROM tab1}
693} [list {main tab1 col2} {main tab1 col1}]
694
695ifcapable subquery {
696  do_test capi2-11.4 {
697    check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM tab1)}
698  } [list {main tab1 col2} {main tab1 col1}]
699  do_test capi2-11.5 {
700    check_origins {SELECT (SELECT col2 FROM tab1), (SELECT col1 FROM tab1)}
701  } [list {main tab1 col2} {main tab1 col1}]
702  do_test capi2-11.6 {
703    check_origins {SELECT (SELECT col2), (SELECT col1) FROM tab1}
704  } [list {main tab1 col2} {main tab1 col1}]
705  do_test capi2-11.7 {
706    check_origins {SELECT * FROM tab1}
707  } [list {main tab1 col1} {main tab1 col2}]
708  do_test capi2-11.8 {
709    check_origins {SELECT * FROM (SELECT * FROM tab1)}
710  } [list {main tab1 col1} {main tab1 col2}]
711}
712
713ifcapable view&&subquery {
714  do_test capi2-12.1 {
715    execsql {
716      CREATE VIEW view1 AS SELECT * FROM  tab1;
717    }
718  } {}
719  do_test capi2-12.2 {
720    check_origins {SELECT col2, col1 FROM view1}
721  } [list {main tab1 col2} {main tab1 col1}]
722  do_test capi2-12.3 {
723    check_origins {SELECT col2 AS hello, col1 AS world FROM view1}
724  } [list {main tab1 col2} {main tab1 col1}]
725  do_test capi2-12.4 {
726    check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view1)}
727  } [list {main tab1 col2} {main tab1 col1}]
728  do_test capi2-12.5 {
729    check_origins {SELECT (SELECT col2 FROM view1), (SELECT col1 FROM view1)}
730  } [list {main tab1 col2} {main tab1 col1}]
731  do_test capi2-12.6 {
732    check_origins {SELECT (SELECT col2), (SELECT col1) FROM view1}
733  } [list {main tab1 col2} {main tab1 col1}]
734  do_test capi2-12.7 {
735    check_origins {SELECT * FROM view1}
736  } [list {main tab1 col1} {main tab1 col2}]
737  do_test capi2-12.8 {
738    check_origins {select * from (select * from view1)}
739  } [list {main tab1 col1} {main tab1 col2}]
740  do_test capi2-12.9 {
741    check_origins {select * from (select * from (select * from view1))}
742  } [list {main tab1 col1} {main tab1 col2}]
743  do_test capi2-12.10 {
744    db close
745    sqlite3 db test.db
746    set ::DB [sqlite3_connection_pointer db]
747    check_origins {select * from (select * from (select * from view1))}
748  } [list {main tab1 col1} {main tab1 col2}]
749
750  # This view will thwart the flattening optimization.
751  do_test capi2-13.1 {
752    execsql {
753      CREATE VIEW view2 AS SELECT * FROM tab1 limit 10 offset 10;
754    }
755  } {}
756  do_test capi2-13.2 {
757    check_origins {SELECT col2, col1 FROM view2}
758  } [list {main tab1 col2} {main tab1 col1}]
759  do_test capi2-13.3 {
760    check_origins {SELECT col2 AS hello, col1 AS world FROM view2}
761  } [list {main tab1 col2} {main tab1 col1}]
762  do_test capi2-13.4 {
763    check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view2)}
764  } [list {main tab1 col2} {main tab1 col1}]
765  do_test capi2-13.5 {
766    check_origins {SELECT (SELECT col2 FROM view2), (SELECT col1 FROM view2)}
767  } [list {main tab1 col2} {main tab1 col1}]
768  do_test capi2-13.6 {
769    check_origins {SELECT (SELECT col2), (SELECT col1) FROM view2}
770  } [list {main tab1 col2} {main tab1 col1}]
771  do_test capi2-13.7 {
772    check_origins {SELECT * FROM view2}
773  } [list {main tab1 col1} {main tab1 col2}]
774  do_test capi2-13.8 {
775    check_origins {select * from (select * from view2)}
776  } [list {main tab1 col1} {main tab1 col2}]
777  do_test capi2-13.9 {
778    check_origins {select * from (select * from (select * from view2))}
779  } [list {main tab1 col1} {main tab1 col2}]
780  do_test capi2-13.10 {
781    db close
782    sqlite3 db test.db
783    set ::DB [sqlite3_connection_pointer db]
784    check_origins {select * from (select * from (select * from view2))}
785  } [list {main tab1 col1} {main tab1 col2}]
786  do_test capi2-13.11 {
787    check_origins {select * from (select * from tab1 limit 10 offset 10)}
788  } [list {main tab1 col1} {main tab1 col2}]
789}
790
791
792} ;# ifcapable columnmetadata
793
794db2 close
795finish_test
796