xref: /sqlite-3.40.0/test/trace.test (revision f259df5f)
1b97759edSdrh# 2004 Jun 29
2b97759edSdrh#
3b97759edSdrh# The author disclaims copyright to this source code.  In place of
4b97759edSdrh# a legal notice, here is a blessing:
5b97759edSdrh#
6b97759edSdrh#    May you do good and not evil.
7b97759edSdrh#    May you find forgiveness for yourself and forgive others.
8b97759edSdrh#    May you share freely, never taking more than you give.
9b97759edSdrh#
10b97759edSdrh#***********************************************************************
11b97759edSdrh# This file implements regression tests for SQLite library.
12b97759edSdrh#
13b97759edSdrh# This file implements tests for the "sqlite3_trace()" API.
14b97759edSdrh#
152943c372Sdanielk1977# $Id: trace.test,v 1.8 2009/04/07 14:14:23 danielk1977 Exp $
16b97759edSdrh
17b97759edSdrhset testdir [file dirname $argv0]
18b97759edSdrhsource $testdir/tester.tcl
19b97759edSdrh
2019e2d37fSdrhifcapable !trace {
2119e2d37fSdrh  finish_test
2219e2d37fSdrh  return
2319e2d37fSdrh}
2419e2d37fSdrh
2593cd0395Sdanielk1977set ::stmtlist {}
26b97759edSdrhdo_test trace-1.1 {
27b97759edSdrh  set rc [catch {db trace 1 2 3} msg]
28b97759edSdrh  lappend rc $msg
29b97759edSdrh} {1 {wrong # args: should be "db trace ?CALLBACK?"}}
30b97759edSdrhproc trace_proc cmd {
31b97759edSdrh  lappend ::stmtlist [string trim $cmd]
32b97759edSdrh}
33b97759edSdrhdo_test trace-1.2 {
34b97759edSdrh  db trace trace_proc
35b97759edSdrh  db trace
36b97759edSdrh} {trace_proc}
37b97759edSdrhdo_test trace-1.3 {
38b97759edSdrh  execsql {
39b97759edSdrh    CREATE TABLE t1(a,b);
40b97759edSdrh    INSERT INTO t1 VALUES(1,2);
41b97759edSdrh    SELECT * FROM t1;
42b97759edSdrh  }
43b97759edSdrh} {1 2}
44b97759edSdrhdo_test trace-1.4 {
45b97759edSdrh  set ::stmtlist
46c16a03b5Sdrh} {{CREATE TABLE t1(a,b);} {INSERT INTO t1 VALUES(1,2);} {SELECT * FROM t1;}}
47b97759edSdrhdo_test trace-1.5 {
48b97759edSdrh  db trace {}
49b97759edSdrh  db trace
50b97759edSdrh} {}
512c7946a4Sdrhdo_test trace-1.6 {
522c7946a4Sdrh  db eval {
532c7946a4Sdrh     CREATE TABLE t1b(x TEXT PRIMARY KEY, y);
542c7946a4Sdrh     INSERT INTO t1b VALUES('abc','def'),('ghi','jkl'),('mno','pqr');
552c7946a4Sdrh  }
562c7946a4Sdrh  set ::stmtlist {}
572c7946a4Sdrh  set xyzzy a*
582c7946a4Sdrh  db trace trace_proc
592c7946a4Sdrh  db eval {
602c7946a4Sdrh     SELECT y FROM t1b WHERE x GLOB $xyzzy
612c7946a4Sdrh  }
622c7946a4Sdrh} {def}
632c7946a4Sdrhdo_test trace-1.7 {
642c7946a4Sdrh  set ::stmtlist
652c7946a4Sdrh} {{SELECT y FROM t1b WHERE x GLOB 'a*'}}
662c7946a4Sdrhdb trace {}
67b97759edSdrh
68c16a03b5Sdrh# If we prepare a statement and execute it multiple times, the trace
69c16a03b5Sdrh# happens on each execution.
70c16a03b5Sdrh#
71c16a03b5Sdrhdb close
72dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db]
73c16a03b5Sdrhdo_test trace-2.1 {
74c16a03b5Sdrh  set STMT [sqlite3_prepare $DB {INSERT INTO t1 VALUES(2,3)} -1 TAIL]
75c16a03b5Sdrh  db trace trace_proc
76c16a03b5Sdrh  proc trace_proc sql {
77c16a03b5Sdrh    global TRACE_OUT
784e7b32f3Sshaneh    lappend TRACE_OUT [string trim $sql]
79c16a03b5Sdrh  }
80c16a03b5Sdrh  set TRACE_OUT {}
81c16a03b5Sdrh  sqlite3_step $STMT
82c16a03b5Sdrh  set TRACE_OUT
834e7b32f3Sshaneh} {{INSERT INTO t1 VALUES(2,3)}}
84c16a03b5Sdrhdo_test trace-2.2 {
85c16a03b5Sdrh  set TRACE_OUT {}
86c16a03b5Sdrh  sqlite3_reset $STMT
87c16a03b5Sdrh  set TRACE_OUT
88c16a03b5Sdrh} {}
89c16a03b5Sdrhdo_test trace-2.3 {
90c16a03b5Sdrh  sqlite3_step $STMT
91c16a03b5Sdrh  set TRACE_OUT
924e7b32f3Sshaneh} {{INSERT INTO t1 VALUES(2,3)}}
93c16a03b5Sdrhdo_test trace-2.4 {
944e7b32f3Sshaneh  set TRACE_OUT {}
95c16a03b5Sdrh  execsql {SELECT * FROM t1}
96c16a03b5Sdrh} {1 2 2 3 2 3}
97c16a03b5Sdrhdo_test trace-2.5 {
98c16a03b5Sdrh  set TRACE_OUT
994e7b32f3Sshaneh} {{SELECT * FROM t1}}
10031f33e13Sdrhcatch {sqlite3_finalize $STMT}
101c16a03b5Sdrh
102702b919aSdrhdo_test trace-2.6 {
103702b919aSdrh  set TRACE_OUT {}
104702b919aSdrh  db eval VACUUM
105702b919aSdrh  set TRACE_OUT
106702b919aSdrh} {VACUUM}
107702b919aSdrh
10819e2d37fSdrh# Similar tests, but this time for profiling.
10919e2d37fSdrh#
11019e2d37fSdrhdo_test trace-3.1 {
11119e2d37fSdrh  set rc [catch {db profile 1 2 3} msg]
11219e2d37fSdrh  lappend rc $msg
11319e2d37fSdrh} {1 {wrong # args: should be "db profile ?CALLBACK?"}}
11419e2d37fSdrhset ::stmtlist {}
11519e2d37fSdrhproc profile_proc {cmd tm} {
11619e2d37fSdrh  lappend ::stmtlist [string trim $cmd]
11719e2d37fSdrh}
11819e2d37fSdrhdo_test trace-3.2 {
11919e2d37fSdrh  db trace {}
12019e2d37fSdrh  db profile profile_proc
12119e2d37fSdrh  db profile
12219e2d37fSdrh} {profile_proc}
12319e2d37fSdrhdo_test trace-3.3 {
12419e2d37fSdrh  execsql {
12519e2d37fSdrh    CREATE TABLE t2(a,b);
12619e2d37fSdrh    INSERT INTO t2 VALUES(1,2);
12719e2d37fSdrh    SELECT * FROM t2;
12819e2d37fSdrh  }
12919e2d37fSdrh} {1 2}
13019e2d37fSdrhdo_test trace-3.4 {
13119e2d37fSdrh  set ::stmtlist
13219e2d37fSdrh} {{CREATE TABLE t2(a,b);} {INSERT INTO t2 VALUES(1,2);} {SELECT * FROM t2;}}
13319e2d37fSdrhdo_test trace-3.5 {
13419e2d37fSdrh  db profile {}
13519e2d37fSdrh  db profile
13619e2d37fSdrh} {}
13719e2d37fSdrh
13819e2d37fSdrh# If we prepare a statement and execute it multiple times, the profile
13919e2d37fSdrh# happens on each execution.
14019e2d37fSdrh#
14119e2d37fSdrhdb close
142dddca286Sdrhsqlite3 db test.db; set DB [sqlite3_connection_pointer db]
14319e2d37fSdrhdo_test trace-4.1 {
14419e2d37fSdrh  set STMT [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL]
14519e2d37fSdrh  db trace trace_proc
14619e2d37fSdrh  proc profile_proc {sql tm} {
14719e2d37fSdrh    global TRACE_OUT
1484e7b32f3Sshaneh    lappend TRACE_OUT [string trim $sql]
14919e2d37fSdrh  }
15019e2d37fSdrh  set TRACE_OUT {}
15119e2d37fSdrh  sqlite3_step $STMT
15219e2d37fSdrh  set TRACE_OUT
1534e7b32f3Sshaneh} {{INSERT INTO t2 VALUES(2,3)}}
15419e2d37fSdrhdo_test trace-4.2 {
15519e2d37fSdrh  set TRACE_OUT {}
15619e2d37fSdrh  sqlite3_reset $STMT
15719e2d37fSdrh  set TRACE_OUT
15819e2d37fSdrh} {}
15919e2d37fSdrhdo_test trace-4.3 {
16019e2d37fSdrh  sqlite3_step $STMT
16119e2d37fSdrh  set TRACE_OUT
1624e7b32f3Sshaneh} {{INSERT INTO t2 VALUES(2,3)}}
16319e2d37fSdrhdo_test trace-4.4 {
1644e7b32f3Sshaneh  set TRACE_OUT {}
16519e2d37fSdrh  execsql {SELECT * FROM t1}
16619e2d37fSdrh} {1 2 2 3 2 3}
16719e2d37fSdrhdo_test trace-4.5 {
16819e2d37fSdrh  set TRACE_OUT
1694e7b32f3Sshaneh} {{SELECT * FROM t1}}
17019e2d37fSdrhcatch {sqlite3_finalize $STMT}
171c16a03b5Sdrh
172201e0c68Sdrh# 3.8.11: Profile output even if the statement is not run to completion.
173201e0c68Sdrhdo_test trace-4.6 {
174201e0c68Sdrh  set TRACE_OUT {}
175201e0c68Sdrh  db eval {SELECT * FROM t1} {} {if {$a>=1} break}
176201e0c68Sdrh  set TRACE_OUT
177201e0c68Sdrh} {{SELECT * FROM t1}}
178201e0c68Sdrh
179201e0c68Sdrh
180949f9cd5Sdrh# Trigger tracing.
181949f9cd5Sdrh#
1822943c372Sdanielk1977ifcapable trigger {
183949f9cd5Sdrh  do_test trace-5.1 {
184949f9cd5Sdrh    db eval {
185949f9cd5Sdrh      CREATE TRIGGER r1t1 AFTER UPDATE ON t1 BEGIN
186949f9cd5Sdrh        UPDATE t2 SET a=new.a WHERE rowid=new.rowid;
187949f9cd5Sdrh      END;
188949f9cd5Sdrh      CREATE TRIGGER r1t2 AFTER UPDATE ON t2 BEGIN
189949f9cd5Sdrh        SELECT 'hello';
190949f9cd5Sdrh      END;
191949f9cd5Sdrh    }
192949f9cd5Sdrh    set TRACE_OUT {}
193949f9cd5Sdrh    proc trace_proc cmd {
194949f9cd5Sdrh      lappend ::TRACE_OUT [string trim $cmd]
195949f9cd5Sdrh    }
196949f9cd5Sdrh    db eval {
197949f9cd5Sdrh      UPDATE t1 SET a=a+1;
198949f9cd5Sdrh    }
199949f9cd5Sdrh    set TRACE_OUT
200*f259df5fSdrh  } {{UPDATE t1 SET a=a+1;} {-- TRIGGER r1t1} {-- UPDATE t2 SET a=new.a WHERE rowid=new.rowid} {-- TRIGGER r1t2} {-- SELECT 'hello'} {-- TRIGGER r1t1} {-- UPDATE t2 SET a=new.a WHERE rowid=new.rowid} {-- TRIGGER r1t2} {-- SELECT 'hello'} {-- TRIGGER r1t1} {-- UPDATE t2 SET a=new.a WHERE rowid=new.rowid} {-- TRIGGER r1t2} {-- SELECT 'hello'}}
2012943c372Sdanielk1977}
202949f9cd5Sdrh
203c7bc4fdeSdrh# With 3.6.21, we add the ability to expand host parameters in the trace
204c7bc4fdeSdrh# output.  Test this feature.
205c7bc4fdeSdrh#
206c7bc4fdeSdrhdo_test trace-6.1 {
207c7bc4fdeSdrh  set ::t6int [expr {3+3}]
208c7bc4fdeSdrh  set ::t6real [expr {1.5*4.0}]
209c7bc4fdeSdrh  set ::t6str {test-six y'all}
210c7bc4fdeSdrh  db eval {SELECT x'3031323334' AS x} {set ::t6blob $x}
211c7bc4fdeSdrh  unset -nocomplain t6null
212c7bc4fdeSdrh  set TRACE_OUT {}
213c7bc4fdeSdrh  execsql {SELECT $::t6int, $::t6real, $t6str, $t6blob, $t6null}
214c7bc4fdeSdrh} {6 6.0 {test-six y'all} 01234 {}}
215c7bc4fdeSdrhdo_test trace-6.2 {
216c7bc4fdeSdrh  set TRACE_OUT
217c7bc4fdeSdrh} {{SELECT 6, 6.0, 'test-six y''all', x'3031323334', NULL}}
218c1bd1b33Sdrhdo_test trace-6.3 {
219c1bd1b33Sdrh  set TRACE_OUT {}
220c1bd1b33Sdrh  execsql {SELECT $::t6int, ?1, $::t6int}
221c1bd1b33Sdrh} {6 6 6}
222c1bd1b33Sdrhdo_test trace-6.4 {
223c1bd1b33Sdrh  set TRACE_OUT
224c1bd1b33Sdrh} {{SELECT 6, 6, 6}}
225c1bd1b33Sdrhdo_test trace-6.5 {
226c1bd1b33Sdrh  execsql {CREATE TABLE t6([$::t6int],"?1"); INSERT INTO t6 VALUES(1,2)}
227c1bd1b33Sdrh  set TRACE_OUT {}
228c1bd1b33Sdrh  execsql {SELECT '$::t6int', [$::t6int], $::t6int, ?1, "?1", $::t6int FROM t6}
229c1bd1b33Sdrh} {{$::t6int} 1 6 6 2 6}
230c1bd1b33Sdrhdo_test trace-6.6 {
231c1bd1b33Sdrh  set TRACE_OUT
232c1bd1b33Sdrh} {{SELECT '$::t6int', [$::t6int], 6, 6, "?1", 6 FROM t6}}
233c1bd1b33Sdrh
234c1bd1b33Sdrh# Do these same tests with a UTF16 database.
235c1bd1b33Sdrh#
236c1bd1b33Sdrhdo_test trace-6.100 {
237c1bd1b33Sdrh  db close
238c1bd1b33Sdrh  sqlite3 db :memory:
239c1bd1b33Sdrh  db eval {
240c1bd1b33Sdrh     PRAGMA encoding=UTF16be;
241c1bd1b33Sdrh     CREATE TABLE t6([$::t6str],"?1");
242c1bd1b33Sdrh     INSERT INTO t6 VALUES(1,2);
243c1bd1b33Sdrh  }
244c1bd1b33Sdrh  db trace trace_proc
245c1bd1b33Sdrh  set TRACE_OUT {}
246c1bd1b33Sdrh  execsql {SELECT '$::t6str', [$::t6str], $::t6str, ?1, "?1", $::t6str FROM t6}
247c1bd1b33Sdrh} {{$::t6str} 1 {test-six y'all} {test-six y'all} 2 {test-six y'all}}
248c1bd1b33Sdrhdo_test trace-6.101 {
249c1bd1b33Sdrh  set TRACE_OUT
250c1bd1b33Sdrh} {{SELECT '$::t6str', [$::t6str], 'test-six y''all', 'test-six y''all', "?1", 'test-six y''all' FROM t6}}
251c1bd1b33Sdrh
252c1bd1b33Sdrhdo_test trace-6.200 {
253c1bd1b33Sdrh  db close
254c1bd1b33Sdrh  sqlite3 db :memory:
255c1bd1b33Sdrh  db eval {
256c1bd1b33Sdrh     PRAGMA encoding=UTF16le;
257c1bd1b33Sdrh     CREATE TABLE t6([$::t6str],"?1");
258c1bd1b33Sdrh     INSERT INTO t6 VALUES(1,2);
259c1bd1b33Sdrh  }
260c1bd1b33Sdrh  db trace trace_proc
261c1bd1b33Sdrh  set TRACE_OUT {}
262c1bd1b33Sdrh  execsql {SELECT '$::t6str', [$::t6str], $::t6str, ?1, "?1", $::t6str FROM t6}
263c1bd1b33Sdrh} {{$::t6str} 1 {test-six y'all} {test-six y'all} 2 {test-six y'all}}
2644e7b32f3Sshanehdo_test trace-6.201 {
265c1bd1b33Sdrh  set TRACE_OUT
266c1bd1b33Sdrh} {{SELECT '$::t6str', [$::t6str], 'test-six y''all', 'test-six y''all', "?1", 'test-six y''all' FROM t6}}
267c1bd1b33Sdrh
268c7bc4fdeSdrh
269b97759edSdrhfinish_test
270