OLD | NEW |
| (Empty) |
1 # 2011 Jan 21 | |
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. | |
12 # | |
13 # This file implements tests for the "sqlite3_trace()" API. Specifically, | |
14 # it tests the special handling of nested SQL statements (those executed | |
15 # by virtual table or user function callbacks). These statements are treated | |
16 # differently in two respects: | |
17 # | |
18 # 1. Each line of the statement is prefixed with "-- " to turn it into | |
19 # an SQL comment. | |
20 # | |
21 # 2. Parameter expansion is not performed. | |
22 # | |
23 | |
24 set testdir [file dirname $argv0] | |
25 source $testdir/tester.tcl | |
26 ifcapable !trace { finish_test ; return } | |
27 set ::testprefix trace2 | |
28 | |
29 proc sql {zSql} { db one $zSql } | |
30 proc trace {zSql} { lappend ::trace $zSql } | |
31 | |
32 db func sql sql | |
33 db trace trace | |
34 | |
35 proc do_trace_test {tn sql expected} { | |
36 # Test that the list of string passed to the trace callback when $sql | |
37 # is executed is equivalent to the list of strings in $expected. | |
38 # | |
39 set ::trace [list] | |
40 execsql $sql | |
41 uplevel do_test $tn [list {set ::trace}] [list [list {*}$expected]] | |
42 } | |
43 | |
44 proc do_trace_select_test {tn sql expected} { | |
45 | |
46 uplevel [list do_trace_test ${tn}.a $sql $expected] | |
47 | |
48 # Now execute each SQL statement passed to the trace callback in the | |
49 # block above. Check that this causes the same set of strings to be | |
50 # passed to the trace callback again. i.e. that executing the output | |
51 # of the trace callback is equivalent to the SQL script in $sql. | |
52 # | |
53 set sqllist $::trace | |
54 set ::trace [list] | |
55 foreach item $sqllist { execsql $item } | |
56 uplevel do_test $tn.b [list {set ::trace}] [list $sqllist] | |
57 } | |
58 | |
59 do_trace_select_test 1.1 { | |
60 SELECT 1, 2, 3; | |
61 } { | |
62 "SELECT 1, 2, 3;" | |
63 } | |
64 | |
65 do_trace_select_test 1.2 { | |
66 SELECT sql('SELECT 1, 2, 3'); | |
67 } { | |
68 "SELECT sql('SELECT 1, 2, 3');" | |
69 "-- SELECT 1, 2, 3" | |
70 } | |
71 | |
72 do_trace_select_test 1.3 { | |
73 SELECT sql('SELECT 1, | |
74 2, | |
75 3' | |
76 ); | |
77 } { | |
78 "SELECT sql('SELECT 1, | |
79 2, | |
80 3' | |
81 );" | |
82 "-- SELECT 1, | |
83 -- 2, | |
84 -- 3" | |
85 } | |
86 | |
87 do_trace_select_test 1.4 { | |
88 SELECT sql('SELECT 1, | |
89 | |
90 | |
91 3' | |
92 ); | |
93 } { | |
94 "SELECT sql('SELECT 1, | |
95 | |
96 | |
97 3' | |
98 );" | |
99 "-- SELECT 1, | |
100 -- | |
101 -- | |
102 -- 3" | |
103 } | |
104 | |
105 do_trace_select_test 1.5 { | |
106 SELECT $var, sql('SELECT 1, | |
107 $var, | |
108 3' | |
109 ); | |
110 } { | |
111 "SELECT NULL, sql('SELECT 1, | |
112 $var, | |
113 3' | |
114 );" | |
115 "-- SELECT 1, | |
116 -- $var, | |
117 -- 3" | |
118 } | |
119 | |
120 ifcapable fts3 { | |
121 do_execsql_test 2.1 { | |
122 CREATE VIRTUAL TABLE x1 USING fts4; | |
123 INSERT INTO x1 VALUES('Cloudy, with a high near 16'); | |
124 INSERT INTO x1 VALUES('Wind chill values as low as -13'); | |
125 } | |
126 | |
127 do_trace_test 2.2 { | |
128 INSERT INTO x1 VALUES('North northwest wind between 8 and 14 mph'); | |
129 } { | |
130 "INSERT INTO x1 VALUES('North northwest wind between 8 and 14 mph');" | |
131 "-- DELETE FROM 'main'.'x1_segdir' WHERE level = ?" | |
132 "-- INSERT INTO 'main'.'x1_content' VALUES(?,(?))" | |
133 "-- REPLACE INTO 'main'.'x1_docsize' VALUES(?,?)" | |
134 "-- SELECT value FROM 'main'.'x1_stat' WHERE id=?" | |
135 "-- REPLACE INTO 'main'.'x1_stat' VALUES(?,?)" | |
136 "-- SELECT (SELECT max(idx) FROM 'main'.'x1_segdir' WHERE level = ?) + 1" | |
137 "-- SELECT coalesce((SELECT max(blockid) FROM 'main'.'x1_segments') + 1, 1)" | |
138 "-- REPLACE INTO 'main'.'x1_segdir' VALUES(?,?,?,?,?,?)" | |
139 "-- SELECT level, idx, end_block FROM 'main'.'x1_segdir' WHERE level BETWEEN
? AND ? ORDER BY level DESC, idx ASC" | |
140 } | |
141 | |
142 do_trace_test 2.3 { | |
143 INSERT INTO x1(x1) VALUES('optimize'); | |
144 } { | |
145 "INSERT INTO x1(x1) VALUES('optimize');" | |
146 "-- SELECT DISTINCT level / (1024 * ?) FROM 'main'.'x1_segdir'" | |
147 "-- SELECT idx, start_block, leaves_end_block, end_block, root FROM 'main'.'
x1_segdir' WHERE level BETWEEN ? AND ?ORDER BY level DESC, idx ASC" | |
148 "-- SELECT max(level) FROM 'main'.'x1_segdir' WHERE level BETWEEN ? AND ?" | |
149 "-- SELECT coalesce((SELECT max(blockid) FROM 'main'.'x1_segments') + 1, 1)" | |
150 "-- DELETE FROM 'main'.'x1_segdir' WHERE level BETWEEN ? AND ?" | |
151 "-- REPLACE INTO 'main'.'x1_segdir' VALUES(?,?,?,?,?,?)" | |
152 } | |
153 } | |
154 | |
155 finish_test | |
OLD | NEW |