xref: /sqlite-3.40.0/test/capi2.test (revision c2df4d6a)
1326dce74Sdrh# 2003 January 29
2326dce74Sdrh#
3326dce74Sdrh# The author disclaims copyright to this source code.  In place of
4326dce74Sdrh# a legal notice, here is a blessing:
5326dce74Sdrh#
6326dce74Sdrh#    May you do good and not evil.
7326dce74Sdrh#    May you find forgiveness for yourself and forgive others.
8326dce74Sdrh#    May you share freely, never taking more than you give.
9326dce74Sdrh#
10326dce74Sdrh#***********************************************************************
11326dce74Sdrh# This file implements regression tests for SQLite library.  The
12326dce74Sdrh# focus of this script testing the callback-free C/C++ API.
13326dce74Sdrh#
1404bbcd5cSdrh# $Id: capi2.test,v 1.37 2008/12/30 17:55:00 drh Exp $
15326dce74Sdrh#
16326dce74Sdrh
17326dce74Sdrhset testdir [file dirname $argv0]
18326dce74Sdrhsource $testdir/tester.tcl
19326dce74Sdrh
20fbcd585fSdanielk1977# Return the text values from the current row pointed at by STMT as a list.
21fbcd585fSdanielk1977proc get_row_values {STMT} {
22fbcd585fSdanielk1977  set VALUES [list]
23fbcd585fSdanielk1977  for {set i 0} {$i < [sqlite3_data_count $STMT]} {incr i} {
24fbcd585fSdanielk1977    lappend VALUES [sqlite3_column_text $STMT $i]
25fbcd585fSdanielk1977  }
26fbcd585fSdanielk1977  return $VALUES
27fbcd585fSdanielk1977}
28fbcd585fSdanielk1977
29fbcd585fSdanielk1977# Return the column names followed by declaration types for the result set
30fbcd585fSdanielk1977# of the SQL statement STMT.
31fbcd585fSdanielk1977#
32fbcd585fSdanielk1977# i.e. for:
33fbcd585fSdanielk1977# CREATE TABLE abc(a text, b integer);
34fbcd585fSdanielk1977# SELECT * FROM abc;
35fbcd585fSdanielk1977#
36fbcd585fSdanielk1977# The result is {a b text integer}
37fbcd585fSdanielk1977proc get_column_names {STMT} {
38fbcd585fSdanielk1977  set VALUES [list]
39fbcd585fSdanielk1977  for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} {
40fbcd585fSdanielk1977    lappend VALUES [sqlite3_column_name $STMT $i]
41fbcd585fSdanielk1977  }
42fbcd585fSdanielk1977  for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} {
43fbcd585fSdanielk1977    lappend VALUES [sqlite3_column_decltype $STMT $i]
44fbcd585fSdanielk1977  }
45fbcd585fSdanielk1977  return $VALUES
46fbcd585fSdanielk1977}
47fbcd585fSdanielk1977
48326dce74Sdrh# Check basic functionality
49326dce74Sdrh#
50326dce74Sdrhdo_test capi2-1.1 {
51dddca286Sdrh  set DB [sqlite3_connection_pointer db]
52326dce74Sdrh  execsql {CREATE TABLE t1(a,b,c)}
534ad1713cSdanielk1977  set VM [sqlite3_prepare $DB {SELECT name, rowid FROM sqlite_master} -1 TAIL]
54483750baSdrh  set TAIL
55326dce74Sdrh} {}
56326dce74Sdrhdo_test capi2-1.2 {
57fbcd585fSdanielk1977  sqlite3_step $VM
58326dce74Sdrh} {SQLITE_ROW}
59326dce74Sdrhdo_test capi2-1.3 {
60fbcd585fSdanielk1977  sqlite3_data_count $VM
61326dce74Sdrh} {2}
62326dce74Sdrhdo_test capi2-1.4 {
63fbcd585fSdanielk1977  get_row_values $VM
64326dce74Sdrh} {t1 1}
65326dce74Sdrhdo_test capi2-1.5 {
66fbcd585fSdanielk1977  get_column_names $VM
67*c2df4d6aSdrh} {name rowid TEXT INTEGER}
68326dce74Sdrhdo_test capi2-1.6 {
69fbcd585fSdanielk1977  sqlite3_step $VM
70326dce74Sdrh} {SQLITE_DONE}
71326dce74Sdrhdo_test capi2-1.7 {
72fbcd585fSdanielk1977  list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM]
73*c2df4d6aSdrh} {2 {} {name rowid TEXT INTEGER}}
743674bfd1Sdrh
753674bfd1Sdrh# This used to be SQLITE_MISUSE.  But now we automatically reset prepared
763674bfd1Sdrh# statements.
77602acb48Sdrhifcapable autoreset {
783674bfd1Sdrh  do_test capi2-1.8 {
79fbcd585fSdanielk1977    sqlite3_step $VM
803674bfd1Sdrh  } {SQLITE_ROW}
81602acb48Sdrh} else {
82602acb48Sdrh  do_test capi2-1.8 {
83602acb48Sdrh    sqlite3_step $VM
84602acb48Sdrh  } {SQLITE_MISUSE}
85602acb48Sdrh}
86fbcd585fSdanielk1977
87fbcd585fSdanielk1977# Update: In v2, once SQLITE_MISUSE is returned the statement handle cannot
88fbcd585fSdanielk1977# be interrogated for more information. However in v3, since the column
89fbcd585fSdanielk1977# count, names and types are determined at compile time, these are still
90fbcd585fSdanielk1977# accessible after an SQLITE_MISUSE error.
91326dce74Sdrhdo_test capi2-1.9 {
923674bfd1Sdrh  sqlite3_reset $VM
93fbcd585fSdanielk1977  list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM]
94*c2df4d6aSdrh} {2 {} {name rowid TEXT INTEGER}}
95326dce74Sdrhdo_test capi2-1.10 {
96fbcd585fSdanielk1977  sqlite3_data_count $VM
97fbcd585fSdanielk1977} {0}
98fbcd585fSdanielk1977
99fbcd585fSdanielk1977do_test capi2-1.11 {
100106bb236Sdanielk1977  sqlite3_finalize $VM
101fbcd585fSdanielk1977} {SQLITE_OK}
102326dce74Sdrh
103326dce74Sdrh# Check to make sure that the "tail" of a multi-statement SQL script
1044ad1713cSdanielk1977# is returned by sqlite3_prepare.
105326dce74Sdrh#
106326dce74Sdrhdo_test capi2-2.1 {
107483750baSdrh  set SQL {
108326dce74Sdrh    SELECT name, rowid FROM sqlite_master;
10953c0f748Sdanielk1977    SELECT name, rowid FROM sqlite_master WHERE 0;
110326dce74Sdrh    -- A comment at the end
111326dce74Sdrh  }
1124ad1713cSdanielk1977  set VM [sqlite3_prepare $DB $SQL -1 SQL]
113483750baSdrh  set SQL
114326dce74Sdrh} {
11553c0f748Sdanielk1977    SELECT name, rowid FROM sqlite_master WHERE 0;
116326dce74Sdrh    -- A comment at the end
117326dce74Sdrh  }
118326dce74Sdrhdo_test capi2-2.2 {
119fbcd585fSdanielk1977  set r [sqlite3_step $VM]
120fbcd585fSdanielk1977  lappend r [sqlite3_column_count $VM] \
121fbcd585fSdanielk1977            [get_row_values $VM] \
122fbcd585fSdanielk1977            [get_column_names $VM]
123*c2df4d6aSdrh} {SQLITE_ROW 2 {t1 1} {name rowid TEXT INTEGER}}
124326dce74Sdrhdo_test capi2-2.3 {
125fbcd585fSdanielk1977  set r [sqlite3_step $VM]
126fbcd585fSdanielk1977  lappend r [sqlite3_column_count $VM] \
127fbcd585fSdanielk1977            [get_row_values $VM] \
128fbcd585fSdanielk1977            [get_column_names $VM]
129*c2df4d6aSdrh} {SQLITE_DONE 2 {} {name rowid TEXT INTEGER}}
130326dce74Sdrhdo_test capi2-2.4 {
131106bb236Sdanielk1977  sqlite3_finalize $VM
132fbcd585fSdanielk1977} {SQLITE_OK}
133326dce74Sdrhdo_test capi2-2.5 {
1344ad1713cSdanielk1977  set VM [sqlite3_prepare $DB $SQL -1 SQL]
135483750baSdrh  set SQL
136326dce74Sdrh} {
137326dce74Sdrh    -- A comment at the end
138326dce74Sdrh  }
139326dce74Sdrhdo_test capi2-2.6 {
140fbcd585fSdanielk1977  set r [sqlite3_step $VM]
141fbcd585fSdanielk1977  lappend r [sqlite3_column_count $VM] \
142fbcd585fSdanielk1977            [get_row_values $VM] \
143fbcd585fSdanielk1977            [get_column_names $VM]
144*c2df4d6aSdrh} {SQLITE_DONE 2 {} {name rowid TEXT INTEGER}}
145326dce74Sdrhdo_test capi2-2.7 {
146106bb236Sdanielk1977  sqlite3_finalize $VM
147fbcd585fSdanielk1977} {SQLITE_OK}
148326dce74Sdrhdo_test capi2-2.8 {
1494ad1713cSdanielk1977  set VM [sqlite3_prepare $DB $SQL -1 SQL]
150483750baSdrh  list $SQL $VM
151326dce74Sdrh} {{} {}}
152326dce74Sdrh
153483750baSdrh# Check the error handling.
154483750baSdrh#
155483750baSdrhdo_test capi2-3.1 {
156483750baSdrh  set rc [catch {
1574ad1713cSdanielk1977      sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL
158483750baSdrh  } msg]
159483750baSdrh  lappend rc $msg $TAIL
160483750baSdrh} {1 {(1) no such column: bogus} {}}
161483750baSdrhdo_test capi2-3.2 {
162483750baSdrh  set rc [catch {
1634ad1713cSdanielk1977      sqlite3_prepare $DB {select bogus from } -1 TAIL
164483750baSdrh  } msg]
165483750baSdrh  lappend rc $msg $TAIL
1666116ee4eSdrh} {1 {(1) incomplete input} {}}
167483750baSdrhdo_test capi2-3.3 {
168483750baSdrh  set rc [catch {
1694ad1713cSdanielk1977      sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL
170483750baSdrh  } msg]
171483750baSdrh  lappend rc $msg $TAIL
172483750baSdrh} {1 {(1) no such column: bogus} {}}
173483750baSdrhdo_test capi2-3.4 {
174483750baSdrh  set rc [catch {
1754ad1713cSdanielk1977      sqlite3_prepare $DB {select bogus from sqlite_master;x;} -1 TAIL
176483750baSdrh  } msg]
177483750baSdrh  lappend rc $msg $TAIL
178483750baSdrh} {1 {(1) no such column: bogus} {x;}}
179483750baSdrhdo_test capi2-3.5 {
180483750baSdrh  set rc [catch {
1814ad1713cSdanielk1977      sqlite3_prepare $DB {select bogus from sqlite_master;;;x;} -1 TAIL
182483750baSdrh  } msg]
183483750baSdrh  lappend rc $msg $TAIL
184483750baSdrh} {1 {(1) no such column: bogus} {;;x;}}
185483750baSdrhdo_test capi2-3.6 {
186483750baSdrh  set rc [catch {
1879b2e0435Sdrh      sqlite3_prepare $DB {select 5/0;} -1 TAIL
188483750baSdrh  } VM]
189483750baSdrh  lappend rc $TAIL
190483750baSdrh} {0 {}}
191483750baSdrhdo_test capi2-3.7 {
192fbcd585fSdanielk1977  list [sqlite3_step $VM] \
193fbcd585fSdanielk1977       [sqlite3_column_count $VM] \
194fbcd585fSdanielk1977       [get_row_values $VM] \
195fbcd585fSdanielk1977       [get_column_names $VM]
19600e279d9Sdanielk1977} {SQLITE_ROW 1 {{}} {5/0 {}}}
197483750baSdrhdo_test capi2-3.8 {
198106bb236Sdanielk1977  sqlite3_finalize $VM
199fbcd585fSdanielk1977} {SQLITE_OK}
200483750baSdrhdo_test capi2-3.9 {
201483750baSdrh  execsql {CREATE UNIQUE INDEX i1 ON t1(a)}
2024ad1713cSdanielk1977  set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,2,3)} -1 TAIL]
203483750baSdrh  set TAIL
204483750baSdrh} {}
2052299706cSdrhdo_test capi2-3.9b {db changes} {0}
206483750baSdrhdo_test capi2-3.10 {
207fbcd585fSdanielk1977  list [sqlite3_step $VM] \
208fbcd585fSdanielk1977       [sqlite3_column_count $VM] \
209fbcd585fSdanielk1977       [get_row_values $VM] \
210fbcd585fSdanielk1977       [get_column_names $VM]
211483750baSdrh} {SQLITE_DONE 0 {} {}}
212fbcd585fSdanielk1977
213fbcd585fSdanielk1977# Update for v3 - the change has not actually happened until the query is
214fbcd585fSdanielk1977# finalized. Is this going to cause trouble for anyone? Lee Nelson maybe?
21592f02c31Sdrh# (Later:) The change now happens just before SQLITE_DONE is returned.
21692f02c31Sdrhdo_test capi2-3.10b {db changes} {1}
217483750baSdrhdo_test capi2-3.11 {
218106bb236Sdanielk1977  sqlite3_finalize $VM
219fbcd585fSdanielk1977} {SQLITE_OK}
220b28af71aSdanielk1977do_test capi2-3.11b {db changes} {1}
22186f8c197Sdrh#do_test capi2-3.12-misuse {
22286f8c197Sdrh#  sqlite3_finalize $VM
22386f8c197Sdrh#} {SQLITE_MISUSE}
224483750baSdrhdo_test capi2-3.13 {
2254ad1713cSdanielk1977  set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,3,4)} -1 TAIL]
226fbcd585fSdanielk1977  list [sqlite3_step $VM] \
227fbcd585fSdanielk1977       [sqlite3_column_count $VM] \
228fbcd585fSdanielk1977       [get_row_values $VM] \
229fbcd585fSdanielk1977       [get_column_names $VM]
230483750baSdrh} {SQLITE_ERROR 0 {} {}}
231b28af71aSdanielk1977
232b28af71aSdanielk1977# Update for v3: Preparing a statement does not affect the change counter.
23392f02c31Sdrh# (Test result changes from 0 to 1).  (Later:) change counter updates occur
23492f02c31Sdrh# when sqlite3_step returns, not at finalize time.
23592f02c31Sdrhdo_test capi2-3.13b {db changes} {0}
236b28af71aSdanielk1977
237483750baSdrhdo_test capi2-3.14 {
238433dccfbSdrh  list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] \
239433dccfbSdrh       [sqlite3_extended_errcode $DB]
240f9c8ce3cSdrh} {SQLITE_CONSTRAINT {UNIQUE constraint failed: t1.a} SQLITE_CONSTRAINT_UNIQUE}
2413a84069dSdrhdo_test capi2-3.15 {
2424ad1713cSdanielk1977  set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL]
2433a84069dSdrh  set TAIL
2443a84069dSdrh} {}
2453a84069dSdrhdo_test capi2-3.16 {
246fbcd585fSdanielk1977  list [sqlite3_step $VM] \
247fbcd585fSdanielk1977       [sqlite3_column_count $VM] \
248fbcd585fSdanielk1977       [get_row_values $VM] \
249fbcd585fSdanielk1977       [get_column_names $VM]
2503a84069dSdrh} {SQLITE_DONE 0 {} {}}
2513a84069dSdrhdo_test capi2-3.17 {
252fbcd585fSdanielk1977  list [sqlite3_finalize $VM] [sqlite3_errmsg $DB]
253fbcd585fSdanielk1977} {SQLITE_OK {not an error}}
2543a84069dSdrhdo_test capi2-3.18 {
2554ad1713cSdanielk1977  set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL]
256fbcd585fSdanielk1977  list [sqlite3_step $VM] \
257fbcd585fSdanielk1977       [sqlite3_column_count $VM] \
258fbcd585fSdanielk1977       [get_row_values $VM] \
259fbcd585fSdanielk1977       [get_column_names $VM]
2603a84069dSdrh} {SQLITE_ERROR 0 {} {}}
2613a84069dSdrhdo_test capi2-3.19 {
262433dccfbSdrh  list [sqlite3_finalize $VM] [sqlite3_errmsg $DB] \
263433dccfbSdrh       [sqlite3_extended_errcode $DB]
264f9c8ce3cSdrh} {SQLITE_CONSTRAINT {NOT NULL constraint failed: t2.a} SQLITE_CONSTRAINT_NOTNULL}
265483750baSdrh
2666a67fe8eSdanielk1977do_test capi2-3.20 {
2676a67fe8eSdanielk1977  execsql {
2686a67fe8eSdanielk1977    CREATE TABLE a1(message_id, name , UNIQUE(message_id, name) );
2696a67fe8eSdanielk1977    INSERT INTO a1 VALUES(1, 1);
2706a67fe8eSdanielk1977  }
2716a67fe8eSdanielk1977} {}
2726a67fe8eSdanielk1977do_test capi2-3.21 {
2736a67fe8eSdanielk1977  set VM [sqlite3_prepare $DB {INSERT INTO a1 VALUES(1, 1)} -1 TAIL]
2746a67fe8eSdanielk1977  sqlite3_step $VM
2756a67fe8eSdanielk1977} {SQLITE_ERROR}
2766a67fe8eSdanielk1977do_test capi2-3.22 {
2776a67fe8eSdanielk1977  sqlite3_errcode $DB
2786a67fe8eSdanielk1977} {SQLITE_ERROR}
2796a67fe8eSdanielk1977do_test capi2-3.23 {
2806a67fe8eSdanielk1977  sqlite3_finalize $VM
2816a67fe8eSdanielk1977} {SQLITE_CONSTRAINT}
2826a67fe8eSdanielk1977do_test capi2-3.24 {
283433dccfbSdrh  list [sqlite3_errcode $DB] [sqlite3_extended_errcode $DB]
284433dccfbSdrh} {SQLITE_CONSTRAINT SQLITE_CONSTRAINT_UNIQUE}
2856a67fe8eSdanielk1977
2863a84069dSdrh# Two or more virtual machines exists at the same time.
2873a84069dSdrh#
2883a84069dSdrhdo_test capi2-4.1 {
2894ad1713cSdanielk1977  set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL]
2903a84069dSdrh  set TAIL
2913a84069dSdrh} {}
2923a84069dSdrhdo_test capi2-4.2 {
2934ad1713cSdanielk1977  set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL]
2943a84069dSdrh  set TAIL
2953a84069dSdrh} {}
2963a84069dSdrhdo_test capi2-4.3 {
2974ad1713cSdanielk1977  set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL]
2983a84069dSdrh  set TAIL
2993a84069dSdrh} {}
3003a84069dSdrhdo_test capi2-4.4 {
301fbcd585fSdanielk1977  list [sqlite3_step $VM2] \
302fbcd585fSdanielk1977       [sqlite3_column_count $VM2] \
303fbcd585fSdanielk1977       [get_row_values $VM2] \
304fbcd585fSdanielk1977       [get_column_names $VM2]
3053a84069dSdrh} {SQLITE_DONE 0 {} {}}
3063a84069dSdrhdo_test capi2-4.5 {
3073a84069dSdrh  execsql {SELECT * FROM t2 ORDER BY a}
3083a84069dSdrh} {2 3}
3093a84069dSdrhdo_test capi2-4.6 {
310fbcd585fSdanielk1977  sqlite3_finalize $VM2
311fbcd585fSdanielk1977} {SQLITE_OK}
3123a84069dSdrhdo_test capi2-4.7 {
313fbcd585fSdanielk1977  list [sqlite3_step $VM3] \
314fbcd585fSdanielk1977       [sqlite3_column_count $VM3] \
315fbcd585fSdanielk1977       [get_row_values $VM3] \
316fbcd585fSdanielk1977       [get_column_names $VM3]
3173a84069dSdrh} {SQLITE_DONE 0 {} {}}
3183a84069dSdrhdo_test capi2-4.8 {
3193a84069dSdrh  execsql {SELECT * FROM t2 ORDER BY a}
3203a84069dSdrh} {2 3 3 4}
3213a84069dSdrhdo_test capi2-4.9 {
322fbcd585fSdanielk1977  sqlite3_finalize $VM3
323fbcd585fSdanielk1977} {SQLITE_OK}
3243a84069dSdrhdo_test capi2-4.10 {
325fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
326fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
327fbcd585fSdanielk1977       [get_row_values $VM1] \
328fbcd585fSdanielk1977       [get_column_names $VM1]
3293a84069dSdrh} {SQLITE_DONE 0 {} {}}
3303a84069dSdrhdo_test capi2-4.11 {
3313a84069dSdrh  execsql {SELECT * FROM t2 ORDER BY a}
3323a84069dSdrh} {1 2 2 3 3 4}
3333a84069dSdrhdo_test capi2-4.12 {
334fbcd585fSdanielk1977  sqlite3_finalize $VM1
335fbcd585fSdanielk1977} {SQLITE_OK}
3363a84069dSdrh
3373a84069dSdrh# Interleaved SELECTs
3383a84069dSdrh#
3393a84069dSdrhdo_test capi2-5.1 {
3404ad1713cSdanielk1977  set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
3414ad1713cSdanielk1977  set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
3424ad1713cSdanielk1977  set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
343fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
344fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
345fbcd585fSdanielk1977       [get_row_values $VM1] \
346fbcd585fSdanielk1977       [get_column_names $VM1]
3473a84069dSdrh} {SQLITE_ROW 2 {2 3} {a b {} {}}}
3483a84069dSdrhdo_test capi2-5.2 {
349fbcd585fSdanielk1977  list [sqlite3_step $VM2] \
350fbcd585fSdanielk1977       [sqlite3_column_count $VM2] \
351fbcd585fSdanielk1977       [get_row_values $VM2] \
352fbcd585fSdanielk1977       [get_column_names $VM2]
3533a84069dSdrh} {SQLITE_ROW 2 {2 3} {a b {} {}}}
3543a84069dSdrhdo_test capi2-5.3 {
355fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
356fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
357fbcd585fSdanielk1977       [get_row_values $VM1] \
358fbcd585fSdanielk1977       [get_column_names $VM1]
3593a84069dSdrh} {SQLITE_ROW 2 {3 4} {a b {} {}}}
3603a84069dSdrhdo_test capi2-5.4 {
361fbcd585fSdanielk1977  list [sqlite3_step $VM3] \
362fbcd585fSdanielk1977       [sqlite3_column_count $VM3] \
363fbcd585fSdanielk1977       [get_row_values $VM3] \
364fbcd585fSdanielk1977       [get_column_names $VM3]
3653a84069dSdrh} {SQLITE_ROW 2 {2 3} {a b {} {}}}
3663a84069dSdrhdo_test capi2-5.5 {
367fbcd585fSdanielk1977  list [sqlite3_step $VM3] \
368fbcd585fSdanielk1977       [sqlite3_column_count $VM3] \
369fbcd585fSdanielk1977       [get_row_values $VM3] \
370fbcd585fSdanielk1977       [get_column_names $VM3]
3713a84069dSdrh} {SQLITE_ROW 2 {3 4} {a b {} {}}}
3723a84069dSdrhdo_test capi2-5.6 {
373fbcd585fSdanielk1977  list [sqlite3_step $VM3] \
374fbcd585fSdanielk1977       [sqlite3_column_count $VM3] \
375fbcd585fSdanielk1977       [get_row_values $VM3] \
376fbcd585fSdanielk1977       [get_column_names $VM3]
3773a84069dSdrh} {SQLITE_ROW 2 {1 2} {a b {} {}}}
3783a84069dSdrhdo_test capi2-5.7 {
379fbcd585fSdanielk1977  list [sqlite3_step $VM3] \
380fbcd585fSdanielk1977       [sqlite3_column_count $VM3] \
381fbcd585fSdanielk1977       [get_row_values $VM3] \
382fbcd585fSdanielk1977       [get_column_names $VM3]
3833a84069dSdrh} {SQLITE_DONE 2 {} {a b {} {}}}
3843a84069dSdrhdo_test capi2-5.8 {
385fbcd585fSdanielk1977  sqlite3_finalize $VM3
386fbcd585fSdanielk1977} {SQLITE_OK}
3873a84069dSdrhdo_test capi2-5.9 {
388fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
389fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
390fbcd585fSdanielk1977       [get_row_values $VM1] \
391fbcd585fSdanielk1977       [get_column_names $VM1]
3923a84069dSdrh} {SQLITE_ROW 2 {1 2} {a b {} {}}}
3933a84069dSdrhdo_test capi2-5.10 {
394fbcd585fSdanielk1977  sqlite3_finalize $VM1
395fbcd585fSdanielk1977} {SQLITE_OK}
3963a84069dSdrhdo_test capi2-5.11 {
397fbcd585fSdanielk1977  list [sqlite3_step $VM2] \
398fbcd585fSdanielk1977       [sqlite3_column_count $VM2] \
399fbcd585fSdanielk1977       [get_row_values $VM2] \
400fbcd585fSdanielk1977       [get_column_names $VM2]
4013a84069dSdrh} {SQLITE_ROW 2 {3 4} {a b {} {}}}
4023a84069dSdrhdo_test capi2-5.12 {
403fbcd585fSdanielk1977  list [sqlite3_step $VM2] \
404fbcd585fSdanielk1977       [sqlite3_column_count $VM2] \
405fbcd585fSdanielk1977       [get_row_values $VM2] \
406fbcd585fSdanielk1977       [get_column_names $VM2]
4073a84069dSdrh} {SQLITE_ROW 2 {1 2} {a b {} {}}}
4083a84069dSdrhdo_test capi2-5.11 {
409fbcd585fSdanielk1977  sqlite3_finalize $VM2
410fbcd585fSdanielk1977} {SQLITE_OK}
4113a84069dSdrh
4123a84069dSdrh# Check for proper SQLITE_BUSY returns.
4133a84069dSdrh#
4143a84069dSdrhdo_test capi2-6.1 {
4153a84069dSdrh  execsql {
4163a84069dSdrh    BEGIN;
4173a84069dSdrh    CREATE TABLE t3(x counter);
4183a84069dSdrh    INSERT INTO t3 VALUES(1);
4193a84069dSdrh    INSERT INTO t3 VALUES(2);
4203a84069dSdrh    INSERT INTO t3 SELECT x+2 FROM t3;
4213a84069dSdrh    INSERT INTO t3 SELECT x+4 FROM t3;
4223a84069dSdrh    INSERT INTO t3 SELECT x+8 FROM t3;
4233a84069dSdrh    COMMIT;
4243a84069dSdrh  }
4254ad1713cSdanielk1977  set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL]
426ef4ac8f9Sdrh  sqlite3 db2 test.db
4273a84069dSdrh  execsql {BEGIN} db2
4283a84069dSdrh} {}
429fbcd585fSdanielk1977# Update for v3: BEGIN doesn't write-lock the database. It is quite
430fbcd585fSdanielk1977# difficult to get v3 to write-lock the database, which causes a few
431fbcd585fSdanielk1977# problems for test scripts.
432fbcd585fSdanielk1977#
433fbcd585fSdanielk1977# do_test capi2-6.2 {
434fbcd585fSdanielk1977#   list [sqlite3_step $VM1] \
435fbcd585fSdanielk1977#        [sqlite3_column_count $VM1] \
436fbcd585fSdanielk1977#        [get_row_values $VM1] \
437fbcd585fSdanielk1977#        [get_column_names $VM1]
438fbcd585fSdanielk1977# } {SQLITE_BUSY 0 {} {}}
4393a84069dSdrhdo_test capi2-6.3 {
4403a84069dSdrh  execsql {COMMIT} db2
4413a84069dSdrh} {}
4423a84069dSdrhdo_test capi2-6.4 {
443fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
444fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
445fbcd585fSdanielk1977       [get_row_values $VM1] \
446fbcd585fSdanielk1977       [get_column_names $VM1]
4473a84069dSdrh} {SQLITE_ROW 1 1 {x counter}}
4483a84069dSdrhdo_test capi2-6.5 {
449fbcd585fSdanielk1977  catchsql {INSERT INTO t3 VALUES(10);} db2
4503a84069dSdrh} {1 {database is locked}}
4513a84069dSdrhdo_test capi2-6.6 {
452fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
453fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
454fbcd585fSdanielk1977       [get_row_values $VM1] \
455fbcd585fSdanielk1977       [get_column_names $VM1]
4563a84069dSdrh} {SQLITE_ROW 1 2 {x counter}}
4573a84069dSdrhdo_test capi2-6.7 {
4583a84069dSdrh  execsql {SELECT * FROM t2} db2
4593a84069dSdrh} {2 3 3 4 1 2}
4603a84069dSdrhdo_test capi2-6.8 {
461fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
462fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
463fbcd585fSdanielk1977       [get_row_values $VM1] \
464fbcd585fSdanielk1977       [get_column_names $VM1]
4653a84069dSdrh} {SQLITE_ROW 1 3 {x counter}}
4663a84069dSdrhdo_test capi2-6.9 {
4673a84069dSdrh  execsql {SELECT * FROM t2}
4683a84069dSdrh} {2 3 3 4 1 2}
4693a84069dSdrhdo_test capi2-6.10 {
470fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
471fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
472fbcd585fSdanielk1977       [get_row_values $VM1] \
473fbcd585fSdanielk1977       [get_column_names $VM1]
4743a84069dSdrh} {SQLITE_ROW 1 4 {x counter}}
4753a84069dSdrhdo_test capi2-6.11 {
4763a84069dSdrh  execsql {BEGIN}
4773a84069dSdrh} {}
4783a84069dSdrhdo_test capi2-6.12 {
479fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
480fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
481fbcd585fSdanielk1977       [get_row_values $VM1] \
482fbcd585fSdanielk1977       [get_column_names $VM1]
4833a84069dSdrh} {SQLITE_ROW 1 5 {x counter}}
484ed326d70Sdanielk1977
485980b1a74Sdrh# A read no longer blocks a write in the same connection.
486980b1a74Sdrh#do_test capi2-6.13 {
487980b1a74Sdrh#  catchsql {UPDATE t3 SET x=x+1}
488980b1a74Sdrh#} {1 {database table is locked}}
489980b1a74Sdrh
4903a84069dSdrhdo_test capi2-6.14 {
491fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
492fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
493fbcd585fSdanielk1977       [get_row_values $VM1] \
494fbcd585fSdanielk1977       [get_column_names $VM1]
49512b13002Sdanielk1977} {SQLITE_ROW 1 6 {x counter}}
4963a84069dSdrhdo_test capi2-6.15 {
4973a84069dSdrh  execsql {SELECT * FROM t1}
4983a84069dSdrh} {1 2 3}
4993a84069dSdrhdo_test capi2-6.16 {
500fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
501fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
502fbcd585fSdanielk1977       [get_row_values $VM1] \
503fbcd585fSdanielk1977       [get_column_names $VM1]
50412b13002Sdanielk1977} {SQLITE_ROW 1 7 {x counter}}
5053a84069dSdrhdo_test capi2-6.17 {
5063a84069dSdrh  catchsql {UPDATE t1 SET b=b+1}
5073a84069dSdrh} {0 {}}
5083a84069dSdrhdo_test capi2-6.18 {
509fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
510fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
511fbcd585fSdanielk1977       [get_row_values $VM1] \
512fbcd585fSdanielk1977       [get_column_names $VM1]
51312b13002Sdanielk1977} {SQLITE_ROW 1 8 {x counter}}
5143a84069dSdrhdo_test capi2-6.19 {
5153a84069dSdrh  execsql {SELECT * FROM t1}
5163a84069dSdrh} {1 3 3}
5173a84069dSdrhdo_test capi2-6.20 {
518fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
519fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
520fbcd585fSdanielk1977       [get_row_values $VM1] \
521fbcd585fSdanielk1977       [get_column_names $VM1]
52212b13002Sdanielk1977} {SQLITE_ROW 1 9 {x counter}}
52346c43eddSdanielk1977#do_test capi2-6.21 {
52446c43eddSdanielk1977#  execsql {ROLLBACK; SELECT * FROM t1}
52546c43eddSdanielk1977#} {1 2 3}
5263a84069dSdrhdo_test capi2-6.22 {
527fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
528fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
529fbcd585fSdanielk1977       [get_row_values $VM1] \
530fbcd585fSdanielk1977       [get_column_names $VM1]
53112b13002Sdanielk1977} {SQLITE_ROW 1 10 {x counter}}
53246c43eddSdanielk1977#do_test capi2-6.23 {
53346c43eddSdanielk1977#  execsql {BEGIN TRANSACTION;}
53446c43eddSdanielk1977#} {}
5353a84069dSdrhdo_test capi2-6.24 {
536fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
537fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
538fbcd585fSdanielk1977       [get_row_values $VM1] \
539fbcd585fSdanielk1977       [get_column_names $VM1]
54012b13002Sdanielk1977} {SQLITE_ROW 1 11 {x counter}}
5413a84069dSdrhdo_test capi2-6.25 {
5423a84069dSdrh  execsql {
5433a84069dSdrh    INSERT INTO t1 VALUES(2,3,4);
5443a84069dSdrh    SELECT * FROM t1;
5453a84069dSdrh  }
54646c43eddSdanielk1977} {1 3 3 2 3 4}
5473a84069dSdrhdo_test capi2-6.26 {
548fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
549fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
550fbcd585fSdanielk1977       [get_row_values $VM1] \
551fbcd585fSdanielk1977       [get_column_names $VM1]
55212b13002Sdanielk1977} {SQLITE_ROW 1 12 {x counter}}
5533a84069dSdrhdo_test capi2-6.27 {
5543a84069dSdrh  catchsql {
5553a84069dSdrh    INSERT INTO t1 VALUES(2,4,5);
5563a84069dSdrh    SELECT * FROM t1;
5573a84069dSdrh  }
558f9c8ce3cSdrh} {1 {UNIQUE constraint failed: t1.a}}
5593a84069dSdrhdo_test capi2-6.28 {
560fbcd585fSdanielk1977  list [sqlite3_step $VM1] \
561fbcd585fSdanielk1977       [sqlite3_column_count $VM1] \
562fbcd585fSdanielk1977       [get_row_values $VM1] \
563fbcd585fSdanielk1977       [get_column_names $VM1]
56412b13002Sdanielk1977} {SQLITE_ROW 1 13 {x counter}}
5653a84069dSdrhdo_test capi2-6.99 {
566fbcd585fSdanielk1977  sqlite3_finalize $VM1
567fbcd585fSdanielk1977} {SQLITE_OK}
568a996e477Sdrhcatchsql {ROLLBACK}
569dde85d9eSdrh
570dde85d9eSdrhdo_test capi2-7.1 {
571dde85d9eSdrh  stepsql $DB {
572dde85d9eSdrh    SELECT * FROM t1
573dde85d9eSdrh  }
574dde85d9eSdrh} {0 1 2 3}
575dde85d9eSdrhdo_test capi2-7.2 {
576dde85d9eSdrh  stepsql $DB {
577dde85d9eSdrh    PRAGMA count_changes=on
578dde85d9eSdrh  }
579dde85d9eSdrh} {0}
580dde85d9eSdrhdo_test capi2-7.3 {
581dde85d9eSdrh  stepsql $DB {
582dde85d9eSdrh    UPDATE t1 SET a=a+10;
583dde85d9eSdrh  }
584dde85d9eSdrh} {0 1}
585dde85d9eSdrhdo_test capi2-7.4 {
586dde85d9eSdrh  stepsql $DB {
587dde85d9eSdrh    INSERT INTO t1 SELECT a+1,b+1,c+1 FROM t1;
588dde85d9eSdrh  }
589dde85d9eSdrh} {0 1}
590fbcd585fSdanielk1977do_test capi2-7.4b {sqlite3_changes $DB} {1}
591dde85d9eSdrhdo_test capi2-7.5 {
592dde85d9eSdrh  stepsql $DB {
593dde85d9eSdrh    UPDATE t1 SET a=a+10;
594dde85d9eSdrh  }
595dde85d9eSdrh} {0 2}
596fbcd585fSdanielk1977do_test capi2-7.5b {sqlite3_changes $DB} {2}
597dde85d9eSdrhdo_test capi2-7.6 {
598dde85d9eSdrh  stepsql $DB {
599dde85d9eSdrh    SELECT * FROM t1;
600dde85d9eSdrh  }
601dde85d9eSdrh} {0 21 2 3 22 3 4}
602dde85d9eSdrhdo_test capi2-7.7 {
603dde85d9eSdrh  stepsql $DB {
604dde85d9eSdrh    INSERT INTO t1 SELECT a+2,b+2,c+2 FROM t1;
605dde85d9eSdrh  }
606dde85d9eSdrh} {0 2}
607dde85d9eSdrhdo_test capi2-7.8 {
608fbcd585fSdanielk1977  sqlite3_changes $DB
6092299706cSdrh} {2}
6102299706cSdrhdo_test capi2-7.9 {
611dde85d9eSdrh  stepsql $DB {
612dde85d9eSdrh    SELECT * FROM t1;
613dde85d9eSdrh  }
614dde85d9eSdrh} {0 21 2 3 22 3 4 23 4 5 24 5 6}
6152299706cSdrhdo_test capi2-7.10 {
616dde85d9eSdrh  stepsql $DB {
617dde85d9eSdrh    UPDATE t1 SET a=a-20;
618dde85d9eSdrh    SELECT * FROM t1;
619dde85d9eSdrh  }
620dde85d9eSdrh} {0 4 1 2 3 2 3 4 3 4 5 4 5 6}
621b28af71aSdanielk1977
622b28af71aSdanielk1977# Update for version 3: A SELECT statement no longer resets the change
623b28af71aSdanielk1977# counter (Test result changes from 0 to 4).
6242299706cSdrhdo_test capi2-7.11 {
625fbcd585fSdanielk1977  sqlite3_changes $DB
626b28af71aSdanielk1977} {4}
627b28af71aSdanielk1977do_test capi2-7.11a {
628b28af71aSdanielk1977  execsql {SELECT count(*) FROM t1}
629b28af71aSdanielk1977} {4}
630b28af71aSdanielk1977
6316bf89570Sdrhifcapable {explain} {
6322299706cSdrh  do_test capi2-7.12 {
633dde85d9eSdrh    set x [stepsql $DB {EXPLAIN SELECT * FROM t1}]
634dde85d9eSdrh    lindex $x 0
635dde85d9eSdrh  } {0}
6366bf89570Sdrh}
637dde85d9eSdrh
638937dd84dSdrh# Ticket #261 - make sure we can finalize before the end of a query.
639937dd84dSdrh#
640937dd84dSdrhdo_test capi2-8.1 {
6414ad1713cSdanielk1977  set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
642106bb236Sdanielk1977  sqlite3_finalize $VM1
643fbcd585fSdanielk1977} {SQLITE_OK}
644dde85d9eSdrh
6454ad1713cSdanielk1977# Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare
646073e5a77Sdrh# and all of the return pointers in sqlite_step can be null.
647073e5a77Sdrh#
648073e5a77Sdrhdo_test capi2-9.1 {
6494ad1713cSdanielk1977  set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY]
650fbcd585fSdanielk1977  sqlite3_step $VM1
651106bb236Sdanielk1977  sqlite3_finalize $VM1
652fbcd585fSdanielk1977} {SQLITE_OK}
653326dce74Sdrh
654955de52cSdanielk1977# Test that passing a NULL pointer to sqlite3_finalize() or sqlite3_reset
655955de52cSdanielk1977# does not cause an error.
6564397de57Sdanielk1977do_test capi2-10.1 {
6574397de57Sdanielk1977  sqlite3_finalize 0
6584397de57Sdanielk1977} {SQLITE_OK}
6594397de57Sdanielk1977do_test capi2-10.2 {
6604397de57Sdanielk1977  sqlite3_reset 0
6614397de57Sdanielk1977} {SQLITE_OK}
6624397de57Sdanielk1977
663955de52cSdanielk1977#---------------------------------------------------------------------------
664955de52cSdanielk1977# The following tests - capi2-11.* - test the "column origin" APIs.
665955de52cSdanielk1977#
666955de52cSdanielk1977#   sqlite3_column_origin_name()
667955de52cSdanielk1977#   sqlite3_column_database_name()
668955de52cSdanielk1977#   sqlite3_column_table_name()
669955de52cSdanielk1977#
670955de52cSdanielk1977
6714b1ae99dSdanielk1977ifcapable columnmetadata {
6724b1ae99dSdanielk1977
673955de52cSdanielk1977# This proc uses the database handle $::DB to compile the SQL statement passed
674955de52cSdanielk1977# as a parameter. The return value of this procedure is a list with one
675955de52cSdanielk1977# element for each column returned by the compiled statement. Each element of
676955de52cSdanielk1977# this list is itself a list of length three, consisting of the origin
677955de52cSdanielk1977# database, table and column for the corresponding returned column.
678955de52cSdanielk1977proc check_origins {sql} {
679955de52cSdanielk1977  set ret [list]
680955de52cSdanielk1977  set ::STMT [sqlite3_prepare $::DB $sql -1 dummy]
681955de52cSdanielk1977  for {set i 0} {$i < [sqlite3_column_count $::STMT]} {incr i} {
682955de52cSdanielk1977    lappend ret [list                           \
683955de52cSdanielk1977      [sqlite3_column_database_name $::STMT $i] \
684955de52cSdanielk1977      [sqlite3_column_table_name $::STMT $i]    \
685955de52cSdanielk1977      [sqlite3_column_origin_name $::STMT $i]   \
686955de52cSdanielk1977    ]
687955de52cSdanielk1977  }
688955de52cSdanielk1977  sqlite3_finalize $::STMT
689955de52cSdanielk1977  return $ret
690955de52cSdanielk1977}
691955de52cSdanielk1977do_test capi2-11.1 {
692955de52cSdanielk1977  execsql {
693955de52cSdanielk1977    CREATE TABLE tab1(col1, col2);
694955de52cSdanielk1977  }
695955de52cSdanielk1977} {}
696955de52cSdanielk1977do_test capi2-11.2 {
697955de52cSdanielk1977  check_origins {SELECT col2, col1 FROM tab1}
698955de52cSdanielk1977} [list {main tab1 col2} {main tab1 col1}]
699955de52cSdanielk1977do_test capi2-11.3 {
700955de52cSdanielk1977  check_origins {SELECT col2 AS hello, col1 AS world FROM tab1}
701955de52cSdanielk1977} [list {main tab1 col2} {main tab1 col1}]
70212f5e201Sdanielk1977
70312f5e201Sdanielk1977ifcapable subquery {
704955de52cSdanielk1977  do_test capi2-11.4 {
705955de52cSdanielk1977    check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM tab1)}
706955de52cSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
707955de52cSdanielk1977  do_test capi2-11.5 {
708955de52cSdanielk1977    check_origins {SELECT (SELECT col2 FROM tab1), (SELECT col1 FROM tab1)}
709955de52cSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
710955de52cSdanielk1977  do_test capi2-11.6 {
711955de52cSdanielk1977    check_origins {SELECT (SELECT col2), (SELECT col1) FROM tab1}
712955de52cSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
713955de52cSdanielk1977  do_test capi2-11.7 {
714955de52cSdanielk1977    check_origins {SELECT * FROM tab1}
715955de52cSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
716955de52cSdanielk1977  do_test capi2-11.8 {
717955de52cSdanielk1977    check_origins {SELECT * FROM (SELECT * FROM tab1)}
718955de52cSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
71912f5e201Sdanielk1977}
720955de52cSdanielk1977
72112f5e201Sdanielk1977ifcapable view&&subquery {
722955de52cSdanielk1977  do_test capi2-12.1 {
723955de52cSdanielk1977    execsql {
724955de52cSdanielk1977      CREATE VIEW view1 AS SELECT * FROM  tab1;
725955de52cSdanielk1977    }
726955de52cSdanielk1977  } {}
727955de52cSdanielk1977  do_test capi2-12.2 {
728955de52cSdanielk1977    check_origins {SELECT col2, col1 FROM view1}
729955de52cSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
730955de52cSdanielk1977  do_test capi2-12.3 {
731955de52cSdanielk1977    check_origins {SELECT col2 AS hello, col1 AS world FROM view1}
732955de52cSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
733955de52cSdanielk1977  do_test capi2-12.4 {
734955de52cSdanielk1977    check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view1)}
735955de52cSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
736955de52cSdanielk1977  do_test capi2-12.5 {
737955de52cSdanielk1977    check_origins {SELECT (SELECT col2 FROM view1), (SELECT col1 FROM view1)}
738955de52cSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
739955de52cSdanielk1977  do_test capi2-12.6 {
740955de52cSdanielk1977    check_origins {SELECT (SELECT col2), (SELECT col1) FROM view1}
741955de52cSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
7421787ccabSdanielk1977  do_test capi2-12.7 {
7431787ccabSdanielk1977    check_origins {SELECT * FROM view1}
7441787ccabSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
7451787ccabSdanielk1977  do_test capi2-12.8 {
7461787ccabSdanielk1977    check_origins {select * from (select * from view1)}
7471787ccabSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
7481787ccabSdanielk1977  do_test capi2-12.9 {
7491787ccabSdanielk1977    check_origins {select * from (select * from (select * from view1))}
7501787ccabSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
7511787ccabSdanielk1977  do_test capi2-12.10 {
7521787ccabSdanielk1977    db close
7531787ccabSdanielk1977    sqlite3 db test.db
7541787ccabSdanielk1977    set ::DB [sqlite3_connection_pointer db]
7551787ccabSdanielk1977    check_origins {select * from (select * from (select * from view1))}
7561787ccabSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
7571787ccabSdanielk1977
7581787ccabSdanielk1977  # This view will thwart the flattening optimization.
7591787ccabSdanielk1977  do_test capi2-13.1 {
7601787ccabSdanielk1977    execsql {
7611787ccabSdanielk1977      CREATE VIEW view2 AS SELECT * FROM tab1 limit 10 offset 10;
7621787ccabSdanielk1977    }
7631787ccabSdanielk1977  } {}
7641787ccabSdanielk1977  do_test capi2-13.2 {
7651787ccabSdanielk1977    check_origins {SELECT col2, col1 FROM view2}
7661787ccabSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
7671787ccabSdanielk1977  do_test capi2-13.3 {
7681787ccabSdanielk1977    check_origins {SELECT col2 AS hello, col1 AS world FROM view2}
7691787ccabSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
7701787ccabSdanielk1977  do_test capi2-13.4 {
7711787ccabSdanielk1977    check_origins {SELECT b, a FROM (SELECT col1 AS a, col2 AS b FROM view2)}
7721787ccabSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
7731787ccabSdanielk1977  do_test capi2-13.5 {
7741787ccabSdanielk1977    check_origins {SELECT (SELECT col2 FROM view2), (SELECT col1 FROM view2)}
7751787ccabSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
7761787ccabSdanielk1977  do_test capi2-13.6 {
7771787ccabSdanielk1977    check_origins {SELECT (SELECT col2), (SELECT col1) FROM view2}
7781787ccabSdanielk1977  } [list {main tab1 col2} {main tab1 col1}]
7791787ccabSdanielk1977  do_test capi2-13.7 {
7801787ccabSdanielk1977    check_origins {SELECT * FROM view2}
7811787ccabSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
7821787ccabSdanielk1977  do_test capi2-13.8 {
7831787ccabSdanielk1977    check_origins {select * from (select * from view2)}
7841787ccabSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
7851787ccabSdanielk1977  do_test capi2-13.9 {
7861787ccabSdanielk1977    check_origins {select * from (select * from (select * from view2))}
7871787ccabSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
7881787ccabSdanielk1977  do_test capi2-13.10 {
7891787ccabSdanielk1977    db close
7901787ccabSdanielk1977    sqlite3 db test.db
7911787ccabSdanielk1977    set ::DB [sqlite3_connection_pointer db]
7921787ccabSdanielk1977    check_origins {select * from (select * from (select * from view2))}
7931787ccabSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
7941787ccabSdanielk1977  do_test capi2-13.11 {
7951787ccabSdanielk1977    check_origins {select * from (select * from tab1 limit 10 offset 10)}
7961787ccabSdanielk1977  } [list {main tab1 col1} {main tab1 col2}]
79712f5e201Sdanielk1977}
7981787ccabSdanielk1977
79994e92032Sdrh
8004b1ae99dSdanielk1977} ;# ifcapable columnmetadata
8014b1ae99dSdanielk1977
8021787ccabSdanielk1977db2 close
803326dce74Sdrhfinish_test
804