xref: /sqlite-3.40.0/test/trace3.test (revision b52dcd89)
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