sl@0: # 2004 Jun 29 sl@0: # sl@0: # The author disclaims copyright to this source code. In place of sl@0: # a legal notice, here is a blessing: sl@0: # sl@0: # May you do good and not evil. sl@0: # May you find forgiveness for yourself and forgive others. sl@0: # May you share freely, never taking more than you give. sl@0: # sl@0: #*********************************************************************** sl@0: # This file implements regression tests for SQLite library. sl@0: # sl@0: # This file implements tests for the "sqlite3_trace()" API. sl@0: # sl@0: # $Id: trace.test,v 1.7 2008/01/12 21:35:57 drh Exp $ sl@0: sl@0: set testdir [file dirname $argv0] sl@0: source $testdir/tester.tcl sl@0: sl@0: ifcapable !trace { sl@0: finish_test sl@0: return sl@0: } sl@0: sl@0: set ::stmtlist {} sl@0: do_test trace-1.1 { sl@0: set rc [catch {db trace 1 2 3} msg] sl@0: lappend rc $msg sl@0: } {1 {wrong # args: should be "db trace ?CALLBACK?"}} sl@0: proc trace_proc cmd { sl@0: lappend ::stmtlist [string trim $cmd] sl@0: } sl@0: do_test trace-1.2 { sl@0: db trace trace_proc sl@0: db trace sl@0: } {trace_proc} sl@0: do_test trace-1.3 { sl@0: execsql { sl@0: CREATE TABLE t1(a,b); sl@0: INSERT INTO t1 VALUES(1,2); sl@0: SELECT * FROM t1; sl@0: } sl@0: } {1 2} sl@0: do_test trace-1.4 { sl@0: set ::stmtlist sl@0: } {{CREATE TABLE t1(a,b);} {INSERT INTO t1 VALUES(1,2);} {SELECT * FROM t1;}} sl@0: do_test trace-1.5 { sl@0: db trace {} sl@0: db trace sl@0: } {} sl@0: sl@0: # If we prepare a statement and execute it multiple times, the trace sl@0: # happens on each execution. sl@0: # sl@0: db close sl@0: sqlite3 db test.db; set DB [sqlite3_connection_pointer db] sl@0: do_test trace-2.1 { sl@0: set STMT [sqlite3_prepare $DB {INSERT INTO t1 VALUES(2,3)} -1 TAIL] sl@0: db trace trace_proc sl@0: proc trace_proc sql { sl@0: global TRACE_OUT sl@0: set TRACE_OUT $sql sl@0: } sl@0: set TRACE_OUT {} sl@0: sqlite3_step $STMT sl@0: set TRACE_OUT sl@0: } {INSERT INTO t1 VALUES(2,3)} sl@0: do_test trace-2.2 { sl@0: set TRACE_OUT {} sl@0: sqlite3_reset $STMT sl@0: set TRACE_OUT sl@0: } {} sl@0: do_test trace-2.3 { sl@0: sqlite3_step $STMT sl@0: set TRACE_OUT sl@0: } {INSERT INTO t1 VALUES(2,3)} sl@0: do_test trace-2.4 { sl@0: execsql {SELECT * FROM t1} sl@0: } {1 2 2 3 2 3} sl@0: do_test trace-2.5 { sl@0: set TRACE_OUT sl@0: } {SELECT * FROM t1} sl@0: catch {sqlite3_finalize $STMT} sl@0: sl@0: # Similar tests, but this time for profiling. sl@0: # sl@0: do_test trace-3.1 { sl@0: set rc [catch {db profile 1 2 3} msg] sl@0: lappend rc $msg sl@0: } {1 {wrong # args: should be "db profile ?CALLBACK?"}} sl@0: set ::stmtlist {} sl@0: proc profile_proc {cmd tm} { sl@0: lappend ::stmtlist [string trim $cmd] sl@0: } sl@0: do_test trace-3.2 { sl@0: db trace {} sl@0: db profile profile_proc sl@0: db profile sl@0: } {profile_proc} sl@0: do_test trace-3.3 { sl@0: execsql { sl@0: CREATE TABLE t2(a,b); sl@0: INSERT INTO t2 VALUES(1,2); sl@0: SELECT * FROM t2; sl@0: } sl@0: } {1 2} sl@0: do_test trace-3.4 { sl@0: set ::stmtlist sl@0: } {{CREATE TABLE t2(a,b);} {INSERT INTO t2 VALUES(1,2);} {SELECT * FROM t2;}} sl@0: do_test trace-3.5 { sl@0: db profile {} sl@0: db profile sl@0: } {} sl@0: sl@0: # If we prepare a statement and execute it multiple times, the profile sl@0: # happens on each execution. sl@0: # sl@0: db close sl@0: sqlite3 db test.db; set DB [sqlite3_connection_pointer db] sl@0: do_test trace-4.1 { sl@0: set STMT [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL] sl@0: db trace trace_proc sl@0: proc profile_proc {sql tm} { sl@0: global TRACE_OUT sl@0: set TRACE_OUT $sql sl@0: } sl@0: set TRACE_OUT {} sl@0: sqlite3_step $STMT sl@0: set TRACE_OUT sl@0: } {INSERT INTO t2 VALUES(2,3)} sl@0: do_test trace-4.2 { sl@0: set TRACE_OUT {} sl@0: sqlite3_reset $STMT sl@0: set TRACE_OUT sl@0: } {} sl@0: do_test trace-4.3 { sl@0: sqlite3_step $STMT sl@0: set TRACE_OUT sl@0: } {INSERT INTO t2 VALUES(2,3)} sl@0: do_test trace-4.4 { sl@0: execsql {SELECT * FROM t1} sl@0: } {1 2 2 3 2 3} sl@0: do_test trace-4.5 { sl@0: set TRACE_OUT sl@0: } {SELECT * FROM t1} sl@0: catch {sqlite3_finalize $STMT} sl@0: sl@0: # Trigger tracing. sl@0: # sl@0: do_test trace-5.1 { sl@0: db eval { sl@0: CREATE TRIGGER r1t1 AFTER UPDATE ON t1 BEGIN sl@0: UPDATE t2 SET a=new.a WHERE rowid=new.rowid; sl@0: END; sl@0: CREATE TRIGGER r1t2 AFTER UPDATE ON t2 BEGIN sl@0: SELECT 'hello'; sl@0: END; sl@0: } sl@0: set TRACE_OUT {} sl@0: proc trace_proc cmd { sl@0: lappend ::TRACE_OUT [string trim $cmd] sl@0: } sl@0: db eval { sl@0: UPDATE t1 SET a=a+1; sl@0: } sl@0: set TRACE_OUT sl@0: } {{UPDATE t1 SET a=a+1;} {-- TRIGGER r1t1} {-- TRIGGER r1t2} {-- TRIGGER r1t1} {-- TRIGGER r1t2} {-- TRIGGER r1t1} {-- TRIGGER r1t2}} sl@0: sl@0: finish_test