1b52dcd89Smistachkin# 2016 July 14 2b52dcd89Smistachkin# 3b52dcd89Smistachkin# The author disclaims copyright to this source code. In place of 4b52dcd89Smistachkin# a legal notice, here is a blessing: 5b52dcd89Smistachkin# 6b52dcd89Smistachkin# May you do good and not evil. 7b52dcd89Smistachkin# May you find forgiveness for yourself and forgive others. 8b52dcd89Smistachkin# May you share freely, never taking more than you give. 9b52dcd89Smistachkin# 10b52dcd89Smistachkin#*********************************************************************** 11e2f84b40Smistachkin# This file implements regression tests for SQLite library. The focus of 12e2f84b40Smistachkin# this test file is the "sqlite3_trace_v2()" and "sqlite3_expanded_sql()" 13e2f84b40Smistachkin# APIs. 14b52dcd89Smistachkin# 15b52dcd89Smistachkin 16b52dcd89Smistachkinset testdir [file dirname $argv0] 17b52dcd89Smistachkinsource $testdir/tester.tcl 18b52dcd89Smistachkinifcapable !trace { finish_test ; return } 19b52dcd89Smistachkinset ::testprefix trace3 20b52dcd89Smistachkin 21b52dcd89Smistachkinproc trace_v2_error { args } { 22b52dcd89Smistachkin lappend ::stmtlist(error) [string trim $args] 23b52dcd89Smistachkin error "trace error"; # this will be ignored. 24b52dcd89Smistachkin} 25b52dcd89Smistachkinproc trace_v2_record { args } { 26b52dcd89Smistachkin lappend ::stmtlist(record) [string trim $args] 27b52dcd89Smistachkin} 28b52dcd89Smistachkinproc trace_v2_nop { args } {}; # do nothing. 29b52dcd89Smistachkin 30b52dcd89Smistachkindo_test trace3-1.0 { 31b52dcd89Smistachkin execsql { 32b52dcd89Smistachkin CREATE TABLE t1(a,b); 33b52dcd89Smistachkin INSERT INTO t1 VALUES(1,NULL); 34b52dcd89Smistachkin INSERT INTO t1 VALUES(2,-1); 35b52dcd89Smistachkin INSERT INTO t1 VALUES(3,0); 36b52dcd89Smistachkin INSERT INTO t1 VALUES(4,1); 37b52dcd89Smistachkin INSERT INTO t1 VALUES(5,-2147483648); 38b52dcd89Smistachkin INSERT INTO t1 VALUES(6,2147483647); 39b52dcd89Smistachkin INSERT INTO t1 VALUES(7,-9223372036854775808); 40b52dcd89Smistachkin INSERT INTO t1 VALUES(8,9223372036854775807); 41b52dcd89Smistachkin INSERT INTO t1 VALUES(9,-1.0); 42b52dcd89Smistachkin INSERT INTO t1 VALUES(10,0.0); 43b52dcd89Smistachkin INSERT INTO t1 VALUES(11,1.0); 44b52dcd89Smistachkin INSERT INTO t1 VALUES(12,''); 45b52dcd89Smistachkin INSERT INTO t1 VALUES(13,'1'); 46b52dcd89Smistachkin INSERT INTO t1 VALUES(14,'one'); 47b52dcd89Smistachkin INSERT INTO t1 VALUES(15,x'abcd0123'); 48b52dcd89Smistachkin INSERT INTO t1 VALUES(16,x'4567cdef'); 49b52dcd89Smistachkin } 50b52dcd89Smistachkin} {} 51b52dcd89Smistachkin 52b52dcd89Smistachkindo_test trace3-1.1 { 53b52dcd89Smistachkin set rc [catch {db trace_v2 1 2 3} msg] 54b52dcd89Smistachkin lappend rc $msg 55b52dcd89Smistachkin} {1 {wrong # args: should be "db trace_v2 ?CALLBACK? ?MASK?"}} 56b52dcd89Smistachkindo_test trace3-1.2 { 57b52dcd89Smistachkin set rc [catch {db trace_v2 1 bad} msg] 58b52dcd89Smistachkin lappend rc $msg 59b52dcd89Smistachkin} {1 {bad trace type "bad": must be statement, profile, row, or close}} 60b52dcd89Smistachkin 61b52dcd89Smistachkindo_test trace3-2.1 { 62b52dcd89Smistachkin db trace_v2 trace_v2_nop 63b52dcd89Smistachkin db trace_v2 64b52dcd89Smistachkin} {trace_v2_nop} 65b52dcd89Smistachkin 66b52dcd89Smistachkindo_test trace3-3.1 { 67b52dcd89Smistachkin unset -nocomplain ::stmtlist 68b52dcd89Smistachkin db trace_v2 trace_v2_nop 69b52dcd89Smistachkin execsql { 70b52dcd89Smistachkin SELECT a, b FROM t1 ORDER BY a; 71b52dcd89Smistachkin } 72b52dcd89Smistachkin array get ::stmtlist 73b52dcd89Smistachkin} {} 74b52dcd89Smistachkindo_test trace3-3.2 { 75b52dcd89Smistachkin set ::stmtlist(error) {} 76b52dcd89Smistachkin db trace_v2 trace_v2_error 77b52dcd89Smistachkin execsql { 78b52dcd89Smistachkin SELECT a, b FROM t1 ORDER BY a; 79b52dcd89Smistachkin } 80b52dcd89Smistachkin set ::stmtlist(error) 81b52dcd89Smistachkin} {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} 82b52dcd89Smistachkindo_test trace3-3.3 { 83b52dcd89Smistachkin set ::stmtlist(record) {} 84b52dcd89Smistachkin db trace_v2 trace_v2_record 85b52dcd89Smistachkin execsql { 86b52dcd89Smistachkin SELECT a, b FROM t1 ORDER BY a; 87b52dcd89Smistachkin } 88b52dcd89Smistachkin set ::stmtlist(record) 89b52dcd89Smistachkin} {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} 90170e9982Smistachkindo_test trace3-3.4 { 91170e9982Smistachkin set ::stmtlist(record) {} 92170e9982Smistachkin db trace_v2 trace_v2_record statement 93170e9982Smistachkin execsql { 94170e9982Smistachkin SELECT a, b FROM t1 ORDER BY a; 95170e9982Smistachkin } 96170e9982Smistachkin set ::stmtlist(record) 97170e9982Smistachkin} {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} 98170e9982Smistachkindo_test trace3-3.5 { 99170e9982Smistachkin set ::stmtlist(record) {} 100170e9982Smistachkin db trace_v2 trace_v2_record 1 101170e9982Smistachkin execsql { 102170e9982Smistachkin SELECT a, b FROM t1 ORDER BY a; 103170e9982Smistachkin } 104170e9982Smistachkin set ::stmtlist(record) 105170e9982Smistachkin} {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} 106b52dcd89Smistachkin 107b52dcd89Smistachkindo_test trace3-4.1 { 108b52dcd89Smistachkin set ::stmtlist(record) {} 109b52dcd89Smistachkin db trace_v2 trace_v2_record profile 110b52dcd89Smistachkin execsql { 111b52dcd89Smistachkin SELECT a, b FROM t1 ORDER BY a; 112b52dcd89Smistachkin } 113b52dcd89Smistachkin set ::stmtlist(record) 114b52dcd89Smistachkin} {/^\{-?\d+ -?\d+\}$/} 115170e9982Smistachkindo_test trace3-4.2 { 116170e9982Smistachkin set ::stmtlist(record) {} 117170e9982Smistachkin db trace_v2 trace_v2_record 2 118170e9982Smistachkin execsql { 119170e9982Smistachkin SELECT a, b FROM t1 ORDER BY a; 120170e9982Smistachkin } 121170e9982Smistachkin set ::stmtlist(record) 122170e9982Smistachkin} {/^\{-?\d+ -?\d+\}$/} 123b52dcd89Smistachkin 124840c300fSmistachkindo_test trace3-4.3 { 125840c300fSmistachkin set ::stmtlist(record) {} 126840c300fSmistachkin db trace_v2 trace_v2_record profile 127840c300fSmistachkin execsql { 128840c300fSmistachkin SELECT a, b FROM t1 ORDER BY a; 129840c300fSmistachkin } 130840c300fSmistachkin set stmt [lindex [lindex $::stmtlist(record) 0] 0] 131840c300fSmistachkin set ns [lindex [lindex $::stmtlist(record) 0] 1] 1323c6de326Smistachkin list $stmt [expr {$ns >= 0 && $ns <= 9999999}]; # less than 0.010 seconds 133840c300fSmistachkin} {/^-?\d+ 1$/} 134840c300fSmistachkindo_test trace3-4.4 { 135840c300fSmistachkin set ::stmtlist(record) {} 136840c300fSmistachkin db trace_v2 trace_v2_record 2 137840c300fSmistachkin execsql { 138840c300fSmistachkin SELECT a, b FROM t1 ORDER BY a; 139840c300fSmistachkin } 140840c300fSmistachkin set stmt [lindex [lindex $::stmtlist(record) 0] 0] 141840c300fSmistachkin set ns [lindex [lindex $::stmtlist(record) 0] 1] 1423c6de326Smistachkin list $stmt [expr {$ns >= 0 && $ns <= 9999999}]; # less than 0.010 seconds 143840c300fSmistachkin} {/^-?\d+ 1$/} 144840c300fSmistachkin 145b52dcd89Smistachkindo_test trace3-5.1 { 146b52dcd89Smistachkin set ::stmtlist(record) {} 147b52dcd89Smistachkin db trace_v2 trace_v2_record row 148b52dcd89Smistachkin execsql { 149b52dcd89Smistachkin SELECT a, b FROM t1 ORDER BY a; 150b52dcd89Smistachkin } 151b52dcd89Smistachkin set ::stmtlist(record) 152e5ec01c4Sdan} "/^[string trim [string repeat {-?\d+ } 16]]\$/" 153170e9982Smistachkindo_test trace3-5.2 { 154170e9982Smistachkin set ::stmtlist(record) {} 155170e9982Smistachkin db trace_v2 trace_v2_record 4 156170e9982Smistachkin execsql { 157170e9982Smistachkin SELECT a, b FROM t1 ORDER BY a; 158170e9982Smistachkin } 159170e9982Smistachkin set ::stmtlist(record) 160e5ec01c4Sdan} "/^[string trim [string repeat {-?\d+ } 16]]\$/" 161b52dcd89Smistachkin 162b52dcd89Smistachkindo_test trace3-6.1 { 163b52dcd89Smistachkin set ::stmtlist(record) {} 164b52dcd89Smistachkin db trace_v2 trace_v2_record {profile row} 165b52dcd89Smistachkin execsql { 166b52dcd89Smistachkin SELECT a, b FROM t1 ORDER BY a; 167b52dcd89Smistachkin } 168b52dcd89Smistachkin set ::stmtlist(record) 169b52dcd89Smistachkin} "/^[string trim [string repeat {-?\d+ } 16]] \\\{-?\\d+ -?\\d+\\\}\$/" 170e2f84b40Smistachkindo_test trace3-6.2 { 171e2f84b40Smistachkin set ::stmtlist(record) {} 172e2f84b40Smistachkin db trace_v2 trace_v2_record {statement profile row} 173e2f84b40Smistachkin execsql { 174e2f84b40Smistachkin SELECT a, b FROM t1 ORDER BY a; 175e2f84b40Smistachkin } 176e2f84b40Smistachkin set ::stmtlist(record) 177e2f84b40Smistachkin} "/^\\\{-?\\d+ \\\{SELECT a, b FROM t1 ORDER BY a;\\\}\\\} [string trim \ 178e2f84b40Smistachkin[string repeat {-?\d+ } 16]] \\\{-?\\d+ -?\\d+\\\}\$/" 179b52dcd89Smistachkin 180b52dcd89Smistachkindo_test trace3-7.1 { 181e2f84b40Smistachkin set DB [sqlite3_connection_pointer db] 182e2f84b40Smistachkin 183e2f84b40Smistachkin set STMT [sqlite3_prepare_v2 $DB \ 184e2f84b40Smistachkin "SELECT a, b FROM t1 WHERE b = ? ORDER BY a;" -1 TAIL] 185a8f286a3Smistachkin} {/^[0-9A-Fa-f]+$/} 186e2f84b40Smistachkin 187e2f84b40Smistachkindo_test trace3-8.1 { 188e2f84b40Smistachkin list [sqlite3_bind_null $STMT 1] [sqlite3_expanded_sql $STMT] 189e2f84b40Smistachkin} {{} {SELECT a, b FROM t1 WHERE b = NULL ORDER BY a;}} 190e2f84b40Smistachkindo_test trace3-8.2 { 191e2f84b40Smistachkin list [sqlite3_bind_int $STMT 1 123] [sqlite3_expanded_sql $STMT] 192e2f84b40Smistachkin} {{} {SELECT a, b FROM t1 WHERE b = 123 ORDER BY a;}} 193e2f84b40Smistachkindo_test trace3-8.3 { 194e2f84b40Smistachkin list [sqlite3_bind_int64 $STMT 1 123] [sqlite3_expanded_sql $STMT] 195e2f84b40Smistachkin} {{} {SELECT a, b FROM t1 WHERE b = 123 ORDER BY a;}} 196e2f84b40Smistachkindo_test trace3-8.4 { 197e2f84b40Smistachkin list [sqlite3_bind_text $STMT 1 "some string" 11] \ 198e2f84b40Smistachkin [sqlite3_expanded_sql $STMT] 199e2f84b40Smistachkin} {{} {SELECT a, b FROM t1 WHERE b = 'some string' ORDER BY a;}} 200e2f84b40Smistachkindo_test trace3-8.5 { 201e2f84b40Smistachkin list [sqlite3_bind_text $STMT 1 "some 'bad' string" 17] \ 202e2f84b40Smistachkin [sqlite3_expanded_sql $STMT] 203e2f84b40Smistachkin} {{} {SELECT a, b FROM t1 WHERE b = 'some ''bad'' string' ORDER BY a;}} 204e2f84b40Smistachkindo_test trace3-8.6 { 205e2f84b40Smistachkin list [sqlite3_bind_double $STMT 1 123] [sqlite3_expanded_sql $STMT] 206e2f84b40Smistachkin} {{} {SELECT a, b FROM t1 WHERE b = 123.0 ORDER BY a;}} 207e2f84b40Smistachkindo_test trace3-8.7 { 208e2f84b40Smistachkin list [sqlite3_bind_text16 $STMT 1 \ 209e2f84b40Smistachkin [encoding convertto unicode hi\000yall\000] 16] \ 210e2f84b40Smistachkin [sqlite3_expanded_sql $STMT] 211e2f84b40Smistachkin} {{} {SELECT a, b FROM t1 WHERE b = 'hi' ORDER BY a;}} 212e2f84b40Smistachkindo_test trace3-8.8 { 213e2f84b40Smistachkin list [sqlite3_bind_blob $STMT 1 "\x12\x34\x56" 3] \ 214e2f84b40Smistachkin [sqlite3_expanded_sql $STMT] 215e2f84b40Smistachkin} {{} {SELECT a, b FROM t1 WHERE b = x'123456' ORDER BY a;}} 216de6fde6aSmistachkindo_test trace3-8.9 { 217de6fde6aSmistachkin list [sqlite3_bind_blob $STMT 1 "\xAB\xCD\xEF" 3] \ 218de6fde6aSmistachkin [sqlite3_expanded_sql $STMT] 219de6fde6aSmistachkin} {{} {SELECT a, b FROM t1 WHERE b = x'abcdef' ORDER BY a;}} 220e2f84b40Smistachkin 221e2f84b40Smistachkindo_test trace3-9.1 { 222170e9982Smistachkin sqlite3_finalize $STMT 223170e9982Smistachkin} {SQLITE_OK} 224170e9982Smistachkin 225170e9982Smistachkindo_test trace3-10.1 { 226e2f84b40Smistachkin db trace_v2 "" 227e2f84b40Smistachkin db trace_v2 228e2f84b40Smistachkin} {} 229170e9982Smistachkindo_test trace3-10.2 { 230e2f84b40Smistachkin unset -nocomplain ::stmtlist 231e2f84b40Smistachkin db trace_v2 "" {statement profile row} 232e2f84b40Smistachkin execsql { 233e2f84b40Smistachkin SELECT a, b FROM t1 ORDER BY a; 234e2f84b40Smistachkin } 235e2f84b40Smistachkin array get ::stmtlist 236e2f84b40Smistachkin} {} 237e2f84b40Smistachkin 238170e9982Smistachkindo_test trace3-11.1 { 239b52dcd89Smistachkin set ::stmtlist(record) {} 240b52dcd89Smistachkin db trace_v2 trace_v2_record close 241b52dcd89Smistachkin db close 242b52dcd89Smistachkin set ::stmtlist(record) 243b52dcd89Smistachkin} {/^-?\d+$/} 244b52dcd89Smistachkin 245170e9982Smistachkinreset_db 246170e9982Smistachkin 247170e9982Smistachkindo_test trace3-11.2 { 248170e9982Smistachkin set ::stmtlist(record) {} 249170e9982Smistachkin db trace_v2 trace_v2_record 8 250170e9982Smistachkin db close 251170e9982Smistachkin set ::stmtlist(record) 252170e9982Smistachkin} {/^-?\d+$/} 253170e9982Smistachkin 254*13dd0228Sdan#------------------------------------------------------------------------- 255*13dd0228Sdanreset_db 256*13dd0228Sdando_test 12.1.0 { 257*13dd0228Sdan set ::STMT [sqlite3_prepare_v2 $DB \ 258*13dd0228Sdan "SELECT ?1 || ?1 || ?1 || ?2 || ?3 || ?4 || ? || ?1 || ?" -1 TAIL 259*13dd0228Sdan ] 260*13dd0228Sdan sqlite3_bind_parameter_count $::STMT 261*13dd0228Sdan} {6} 262*13dd0228Sdan 263*13dd0228Sdando_test 12.1.1 { 264*13dd0228Sdan sqlite3_bind_text $STMT 1 "A" 1 265*13dd0228Sdan sqlite3_bind_text $STMT 2 "B" 1 266*13dd0228Sdan sqlite3_bind_text $STMT 3 "C" 1 267*13dd0228Sdan sqlite3_bind_text $STMT 4 "D" 1 268*13dd0228Sdan sqlite3_bind_text $STMT 5 "E" 1 269*13dd0228Sdan sqlite3_bind_text $STMT 6 "F" 1 270*13dd0228Sdan sqlite3_expanded_sql $STMT 271*13dd0228Sdan} {SELECT 'A' || 'A' || 'A' || 'B' || 'C' || 'D' || 'E' || 'A' || 'F'} 272*13dd0228Sdan 273*13dd0228Sdando_test 12.1.2 { 274*13dd0228Sdan sqlite3_step $STMT 275*13dd0228Sdan sqlite3_column_text $STMT 0 276*13dd0228Sdan} {AAABCDEAF} 277*13dd0228Sdan 278*13dd0228Sdando_test 12.1.3 { 279*13dd0228Sdan sqlite3_finalize $STMT 280*13dd0228Sdan} {SQLITE_OK} 281*13dd0228Sdan 282*13dd0228Sdando_test 12.2.0 { 283*13dd0228Sdan execsql { 284*13dd0228Sdan CREATE TABLE nameFtsFuzzySearchTable( 285*13dd0228Sdan word, distance, langid, score, top, scope 286*13dd0228Sdan ); 287*13dd0228Sdan } 288*13dd0228Sdan set ::STMT [sqlite3_prepare_v2 $DB { 289*13dd0228Sdan SELECT 290*13dd0228Sdan substr(word,1,length(?1)-1) AS term, 291*13dd0228Sdan distance, 292*13dd0228Sdan langid, 293*13dd0228Sdan score 294*13dd0228Sdan FROM 295*13dd0228Sdan nameFtsFuzzySearchTable 296*13dd0228Sdan WHERE 297*13dd0228Sdan word MATCH (?1) AND abs(?1) = abs(term) 298*13dd0228Sdan AND top = ?2 AND distance > ?3 AND scope = ?4 AND langid = ? 299*13dd0228Sdan GROUP BY term, langid 300*13dd0228Sdan HAVING (1.0 - ((distance / 100.0) / CAST( length(?1) - 1 AS REAL ))) >= ? 301*13dd0228Sdan } -1 TAIL] 302*13dd0228Sdan sqlite3_bind_parameter_count $::STMT 303*13dd0228Sdan} {6} 304*13dd0228Sdan 305*13dd0228Sdando_test 12.1.1 { 306*13dd0228Sdan sqlite3_bind_text $STMT 1 "A" 1 307*13dd0228Sdan sqlite3_bind_text $STMT 2 "B" 1 308*13dd0228Sdan sqlite3_bind_text $STMT 3 "C" 1 309*13dd0228Sdan sqlite3_bind_text $STMT 4 "D" 1 310*13dd0228Sdan sqlite3_bind_text $STMT 5 "E" 1 311*13dd0228Sdan sqlite3_bind_text $STMT 6 "F" 1 312*13dd0228Sdan sqlite3_expanded_sql $STMT 313*13dd0228Sdan} { 314*13dd0228Sdan SELECT 315*13dd0228Sdan substr(word,1,length('A')-1) AS term, 316*13dd0228Sdan distance, 317*13dd0228Sdan langid, 318*13dd0228Sdan score 319*13dd0228Sdan FROM 320*13dd0228Sdan nameFtsFuzzySearchTable 321*13dd0228Sdan WHERE 322*13dd0228Sdan word MATCH ('A') AND abs('A') = abs(term) 323*13dd0228Sdan AND top = 'B' AND distance > 'C' AND scope = 'D' AND langid = 'E' 324*13dd0228Sdan GROUP BY term, langid 325*13dd0228Sdan HAVING (1.0 - ((distance / 100.0) / CAST( length('A') - 1 AS REAL ))) >= 'F' 326*13dd0228Sdan } 327*13dd0228Sdan 328*13dd0228Sdando_test 12.1.2 { 329*13dd0228Sdan sqlite3_finalize $STMT 330*13dd0228Sdan} {SQLITE_OK} 331*13dd0228Sdan 332*13dd0228Sdan 333b52dcd89Smistachkinfinish_test 334