Annotation of embedaddon/sqlite3/test/trace.test, revision 1.1.1.1

1.1       misho       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.8 2009/04/07 14:14:23 danielk1977 Exp $
                     16: 
                     17: set testdir [file dirname $argv0]
                     18: source $testdir/tester.tcl
                     19: 
                     20: ifcapable !trace {
                     21:   finish_test
                     22:   return
                     23: }
                     24: 
                     25: set ::stmtlist {}
                     26: do_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?"}}
                     30: proc trace_proc cmd {
                     31:   lappend ::stmtlist [string trim $cmd]
                     32: }
                     33: do_test trace-1.2 {
                     34:   db trace trace_proc
                     35:   db trace
                     36: } {trace_proc}
                     37: do_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}
                     44: do_test trace-1.4 {
                     45:   set ::stmtlist
                     46: } {{CREATE TABLE t1(a,b);} {INSERT INTO t1 VALUES(1,2);} {SELECT * FROM t1;}}
                     47: do_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: #
                     55: db close
                     56: sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
                     57: do_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:     lappend TRACE_OUT [string trim $sql]
                     63:   }
                     64:   set TRACE_OUT {}
                     65:   sqlite3_step $STMT
                     66:   set TRACE_OUT
                     67: } {{INSERT INTO t1 VALUES(2,3)}}
                     68: do_test trace-2.2 {
                     69:   set TRACE_OUT {}
                     70:   sqlite3_reset $STMT
                     71:   set TRACE_OUT 
                     72: } {}
                     73: do_test trace-2.3 {
                     74:   sqlite3_step $STMT
                     75:   set TRACE_OUT
                     76: } {{INSERT INTO t1 VALUES(2,3)}}
                     77: do_test trace-2.4 {
                     78:   set TRACE_OUT {}
                     79:   execsql {SELECT * FROM t1}
                     80: } {1 2 2 3 2 3}
                     81: do_test trace-2.5 {
                     82:   set TRACE_OUT
                     83: } {{SELECT * FROM t1}}
                     84: catch {sqlite3_finalize $STMT}
                     85: 
                     86: do_test trace-2.6 {
                     87:   set TRACE_OUT {}
                     88:   db eval VACUUM
                     89:   set TRACE_OUT
                     90: } {VACUUM}
                     91: 
                     92: # Similar tests, but this time for profiling.
                     93: # 
                     94: do_test trace-3.1 {
                     95:   set rc [catch {db profile 1 2 3} msg]
                     96:   lappend rc $msg
                     97: } {1 {wrong # args: should be "db profile ?CALLBACK?"}}
                     98: set ::stmtlist {}
                     99: proc profile_proc {cmd tm} {
                    100:   lappend ::stmtlist [string trim $cmd]
                    101: }
                    102: do_test trace-3.2 {
                    103:   db trace {}
                    104:   db profile profile_proc
                    105:   db profile
                    106: } {profile_proc}
                    107: do_test trace-3.3 {
                    108:   execsql {
                    109:     CREATE TABLE t2(a,b);
                    110:     INSERT INTO t2 VALUES(1,2);
                    111:     SELECT * FROM t2;
                    112:   }
                    113: } {1 2}
                    114: do_test trace-3.4 {
                    115:   set ::stmtlist
                    116: } {{CREATE TABLE t2(a,b);} {INSERT INTO t2 VALUES(1,2);} {SELECT * FROM t2;}}
                    117: do_test trace-3.5 {
                    118:   db profile {}
                    119:   db profile
                    120: } {}
                    121: 
                    122: # If we prepare a statement and execute it multiple times, the profile
                    123: # happens on each execution.
                    124: #
                    125: db close
                    126: sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
                    127: do_test trace-4.1 {
                    128:   set STMT [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL]
                    129:   db trace trace_proc
                    130:   proc profile_proc {sql tm} {
                    131:     global TRACE_OUT
                    132:     lappend TRACE_OUT [string trim $sql]
                    133:   }
                    134:   set TRACE_OUT {}
                    135:   sqlite3_step $STMT
                    136:   set TRACE_OUT
                    137: } {{INSERT INTO t2 VALUES(2,3)}}
                    138: do_test trace-4.2 {
                    139:   set TRACE_OUT {}
                    140:   sqlite3_reset $STMT
                    141:   set TRACE_OUT 
                    142: } {}
                    143: do_test trace-4.3 {
                    144:   sqlite3_step $STMT
                    145:   set TRACE_OUT
                    146: } {{INSERT INTO t2 VALUES(2,3)}}
                    147: do_test trace-4.4 {
                    148:   set TRACE_OUT {}
                    149:   execsql {SELECT * FROM t1}
                    150: } {1 2 2 3 2 3}
                    151: do_test trace-4.5 {
                    152:   set TRACE_OUT
                    153: } {{SELECT * FROM t1}}
                    154: catch {sqlite3_finalize $STMT}
                    155: 
                    156: # Trigger tracing.
                    157: #
                    158: ifcapable trigger {
                    159:   do_test trace-5.1 {
                    160:     db eval {
                    161:       CREATE TRIGGER r1t1 AFTER UPDATE ON t1 BEGIN
                    162:         UPDATE t2 SET a=new.a WHERE rowid=new.rowid;
                    163:       END;
                    164:       CREATE TRIGGER r1t2 AFTER UPDATE ON t2 BEGIN
                    165:         SELECT 'hello';
                    166:       END;
                    167:     }
                    168:     set TRACE_OUT {}
                    169:     proc trace_proc cmd {
                    170:       lappend ::TRACE_OUT [string trim $cmd]
                    171:     }
                    172:     db eval {
                    173:       UPDATE t1 SET a=a+1;
                    174:     }
                    175:     set TRACE_OUT
                    176:   } {{UPDATE t1 SET a=a+1;} {-- TRIGGER r1t1} {-- TRIGGER r1t2} {-- TRIGGER r1t1} {-- TRIGGER r1t2} {-- TRIGGER r1t1} {-- TRIGGER r1t2}}
                    177: }
                    178: 
                    179: # With 3.6.21, we add the ability to expand host parameters in the trace
                    180: # output.  Test this feature.
                    181: #
                    182: do_test trace-6.1 {
                    183:   set ::t6int [expr {3+3}]
                    184:   set ::t6real [expr {1.5*4.0}]
                    185:   set ::t6str {test-six y'all}
                    186:   db eval {SELECT x'3031323334' AS x} {set ::t6blob $x}
                    187:   unset -nocomplain t6null
                    188:   set TRACE_OUT {}
                    189:   execsql {SELECT $::t6int, $::t6real, $t6str, $t6blob, $t6null}
                    190: } {6 6.0 {test-six y'all} 01234 {}}
                    191: do_test trace-6.2 {
                    192:   set TRACE_OUT
                    193: } {{SELECT 6, 6.0, 'test-six y''all', x'3031323334', NULL}}
                    194: do_test trace-6.3 {
                    195:   set TRACE_OUT {}
                    196:   execsql {SELECT $::t6int, ?1, $::t6int}
                    197: } {6 6 6}
                    198: do_test trace-6.4 {
                    199:   set TRACE_OUT
                    200: } {{SELECT 6, 6, 6}}
                    201: do_test trace-6.5 {
                    202:   execsql {CREATE TABLE t6([$::t6int],"?1"); INSERT INTO t6 VALUES(1,2)}
                    203:   set TRACE_OUT {}
                    204:   execsql {SELECT '$::t6int', [$::t6int], $::t6int, ?1, "?1", $::t6int FROM t6}
                    205: } {{$::t6int} 1 6 6 2 6}
                    206: do_test trace-6.6 {
                    207:   set TRACE_OUT
                    208: } {{SELECT '$::t6int', [$::t6int], 6, 6, "?1", 6 FROM t6}}
                    209: 
                    210: # Do these same tests with a UTF16 database.
                    211: #
                    212: do_test trace-6.100 {
                    213:   db close
                    214:   sqlite3 db :memory:
                    215:   db eval {
                    216:      PRAGMA encoding=UTF16be;
                    217:      CREATE TABLE t6([$::t6str],"?1");
                    218:      INSERT INTO t6 VALUES(1,2);
                    219:   }
                    220:   db trace trace_proc
                    221:   set TRACE_OUT {}
                    222:   execsql {SELECT '$::t6str', [$::t6str], $::t6str, ?1, "?1", $::t6str FROM t6}
                    223: } {{$::t6str} 1 {test-six y'all} {test-six y'all} 2 {test-six y'all}}
                    224: do_test trace-6.101 {
                    225:   set TRACE_OUT
                    226: } {{SELECT '$::t6str', [$::t6str], 'test-six y''all', 'test-six y''all', "?1", 'test-six y''all' FROM t6}}
                    227: 
                    228: do_test trace-6.200 {
                    229:   db close
                    230:   sqlite3 db :memory:
                    231:   db eval {
                    232:      PRAGMA encoding=UTF16le;
                    233:      CREATE TABLE t6([$::t6str],"?1");
                    234:      INSERT INTO t6 VALUES(1,2);
                    235:   }
                    236:   db trace trace_proc
                    237:   set TRACE_OUT {}
                    238:   execsql {SELECT '$::t6str', [$::t6str], $::t6str, ?1, "?1", $::t6str FROM t6}
                    239: } {{$::t6str} 1 {test-six y'all} {test-six y'all} 2 {test-six y'all}}
                    240: do_test trace-6.201 {
                    241:   set TRACE_OUT
                    242: } {{SELECT '$::t6str', [$::t6str], 'test-six y''all', 'test-six y''all', "?1", 'test-six y''all' FROM t6}}
                    243: 
                    244: 
                    245: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>