1# 2004 Jun 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. 12# 13# This file implements tests for the "sqlite3_trace()" API. 14# 15# $Id: trace.test,v 1.6 2006/01/03 00:33:50 drh Exp $ 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20ifcapable !trace { 21 finish_test 22 return 23} 24 25set ::stmtlist {} 26do_test trace-1.1 { 27 set rc [catch {db trace 1 2 3} msg] 28 lappend rc $msg 29} {1 {wrong # args: should be "db trace ?CALLBACK?"}} 30proc trace_proc cmd { 31 lappend ::stmtlist [string trim $cmd] 32} 33do_test trace-1.2 { 34 db trace trace_proc 35 db trace 36} {trace_proc} 37do_test trace-1.3 { 38 execsql { 39 CREATE TABLE t1(a,b); 40 INSERT INTO t1 VALUES(1,2); 41 SELECT * FROM t1; 42 } 43} {1 2} 44do_test trace-1.4 { 45 set ::stmtlist 46} {{CREATE TABLE t1(a,b);} {INSERT INTO t1 VALUES(1,2);} {SELECT * FROM t1;}} 47do_test trace-1.5 { 48 db trace {} 49 db trace 50} {} 51 52# If we prepare a statement and execute it multiple times, the trace 53# happens on each execution. 54# 55db close 56sqlite3 db test.db; set DB [sqlite3_connection_pointer db] 57do_test trace-2.1 { 58 set STMT [sqlite3_prepare $DB {INSERT INTO t1 VALUES(2,3)} -1 TAIL] 59 db trace trace_proc 60 proc trace_proc sql { 61 global TRACE_OUT 62 set TRACE_OUT $sql 63 } 64 set TRACE_OUT {} 65 sqlite3_step $STMT 66 set TRACE_OUT 67} {INSERT INTO t1 VALUES(2,3)} 68do_test trace-2.2 { 69 set TRACE_OUT {} 70 sqlite3_reset $STMT 71 set TRACE_OUT 72} {} 73do_test trace-2.3 { 74 sqlite3_step $STMT 75 set TRACE_OUT 76} {INSERT INTO t1 VALUES(2,3)} 77do_test trace-2.4 { 78 execsql {SELECT * FROM t1} 79} {1 2 2 3 2 3} 80do_test trace-2.5 { 81 set TRACE_OUT 82} {SELECT * FROM t1} 83catch {sqlite3_finalize $STMT} 84 85# Similar tests, but this time for profiling. 86# 87do_test trace-3.1 { 88 set rc [catch {db profile 1 2 3} msg] 89 lappend rc $msg 90} {1 {wrong # args: should be "db profile ?CALLBACK?"}} 91set ::stmtlist {} 92proc profile_proc {cmd tm} { 93 lappend ::stmtlist [string trim $cmd] 94} 95do_test trace-3.2 { 96 db trace {} 97 db profile profile_proc 98 db profile 99} {profile_proc} 100do_test trace-3.3 { 101 execsql { 102 CREATE TABLE t2(a,b); 103 INSERT INTO t2 VALUES(1,2); 104 SELECT * FROM t2; 105 } 106} {1 2} 107do_test trace-3.4 { 108 set ::stmtlist 109} {{CREATE TABLE t2(a,b);} {INSERT INTO t2 VALUES(1,2);} {SELECT * FROM t2;}} 110do_test trace-3.5 { 111 db profile {} 112 db profile 113} {} 114 115# If we prepare a statement and execute it multiple times, the profile 116# happens on each execution. 117# 118db close 119sqlite3 db test.db; set DB [sqlite3_connection_pointer db] 120do_test trace-4.1 { 121 set STMT [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL] 122 db trace trace_proc 123 proc profile_proc {sql tm} { 124 global TRACE_OUT 125 set TRACE_OUT $sql 126 } 127 set TRACE_OUT {} 128 sqlite3_step $STMT 129 set TRACE_OUT 130} {INSERT INTO t2 VALUES(2,3)} 131do_test trace-4.2 { 132 set TRACE_OUT {} 133 sqlite3_reset $STMT 134 set TRACE_OUT 135} {} 136do_test trace-4.3 { 137 sqlite3_step $STMT 138 set TRACE_OUT 139} {INSERT INTO t2 VALUES(2,3)} 140do_test trace-4.4 { 141 execsql {SELECT * FROM t1} 142} {1 2 2 3 2 3} 143do_test trace-4.5 { 144 set TRACE_OUT 145} {SELECT * FROM t1} 146catch {sqlite3_finalize $STMT} 147 148finish_test 149