1# 2016 July 14 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. The focus 12# of this test file is the "sqlite3_trace_v2()" API. 13# 14 15set testdir [file dirname $argv0] 16source $testdir/tester.tcl 17ifcapable !trace { finish_test ; return } 18set ::testprefix trace3 19 20proc trace_v2_error { args } { 21 lappend ::stmtlist(error) [string trim $args] 22 error "trace error"; # this will be ignored. 23} 24proc trace_v2_record { args } { 25 lappend ::stmtlist(record) [string trim $args] 26} 27proc trace_v2_nop { args } {}; # do nothing. 28 29do_test trace3-1.0 { 30 execsql { 31 CREATE TABLE t1(a,b); 32 INSERT INTO t1 VALUES(1,NULL); 33 INSERT INTO t1 VALUES(2,-1); 34 INSERT INTO t1 VALUES(3,0); 35 INSERT INTO t1 VALUES(4,1); 36 INSERT INTO t1 VALUES(5,-2147483648); 37 INSERT INTO t1 VALUES(6,2147483647); 38 INSERT INTO t1 VALUES(7,-9223372036854775808); 39 INSERT INTO t1 VALUES(8,9223372036854775807); 40 INSERT INTO t1 VALUES(9,-1.0); 41 INSERT INTO t1 VALUES(10,0.0); 42 INSERT INTO t1 VALUES(11,1.0); 43 INSERT INTO t1 VALUES(12,''); 44 INSERT INTO t1 VALUES(13,'1'); 45 INSERT INTO t1 VALUES(14,'one'); 46 INSERT INTO t1 VALUES(15,x'abcd0123'); 47 INSERT INTO t1 VALUES(16,x'4567cdef'); 48 } 49} {} 50 51do_test trace3-1.1 { 52 set rc [catch {db trace_v2 1 2 3} msg] 53 lappend rc $msg 54} {1 {wrong # args: should be "db trace_v2 ?CALLBACK? ?MASK?"}} 55do_test trace3-1.2 { 56 set rc [catch {db trace_v2 1 bad} msg] 57 lappend rc $msg 58} {1 {bad trace type "bad": must be statement, profile, row, or close}} 59 60do_test trace3-2.1 { 61 db trace_v2 trace_v2_nop 62 db trace_v2 63} {trace_v2_nop} 64 65do_test trace3-3.1 { 66 unset -nocomplain ::stmtlist 67 db trace_v2 trace_v2_nop 68 execsql { 69 SELECT a, b FROM t1 ORDER BY a; 70 } 71 array get ::stmtlist 72} {} 73do_test trace3-3.2 { 74 set ::stmtlist(error) {} 75 db trace_v2 trace_v2_error 76 execsql { 77 SELECT a, b FROM t1 ORDER BY a; 78 } 79 set ::stmtlist(error) 80} {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} 81do_test trace3-3.3 { 82 set ::stmtlist(record) {} 83 db trace_v2 trace_v2_record 84 execsql { 85 SELECT a, b FROM t1 ORDER BY a; 86 } 87 set ::stmtlist(record) 88} {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} 89 90do_test trace3-4.1 { 91 set ::stmtlist(record) {} 92 db trace_v2 trace_v2_record profile 93 execsql { 94 SELECT a, b FROM t1 ORDER BY a; 95 } 96 set ::stmtlist(record) 97} {/^\{-?\d+ -?\d+\}$/} 98 99do_test trace3-5.1 { 100 set ::stmtlist(record) {} 101 db trace_v2 trace_v2_record row 102 execsql { 103 SELECT a, b FROM t1 ORDER BY a; 104 } 105 set ::stmtlist(record) 106} "/^[string trim [string repeat {\d+ } 16]]\$/" 107 108do_test trace3-6.1 { 109 set ::stmtlist(record) {} 110 db trace_v2 trace_v2_record {profile row} 111 execsql { 112 SELECT a, b FROM t1 ORDER BY a; 113 } 114 set ::stmtlist(record) 115} "/^[string trim [string repeat {-?\d+ } 16]] \\\{-?\\d+ -?\\d+\\\}\$/" 116 117do_test trace3-7.1 { 118 set ::stmtlist(record) {} 119 db trace_v2 trace_v2_record close 120 db close 121 set ::stmtlist(record) 122} {/^-?\d+$/} 123 124finish_test 125