mistachkin | b52dcd8 | 2016-07-14 23:17:03 +0000 | [diff] [blame] | 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 | #*********************************************************************** |
mistachkin | e2f84b4 | 2016-07-15 00:07:47 +0000 | [diff] [blame] | 11 | # This file implements regression tests for SQLite library. The focus of |
| 12 | # this test file is the "sqlite3_trace_v2()" and "sqlite3_expanded_sql()" |
| 13 | # APIs. |
mistachkin | b52dcd8 | 2016-07-14 23:17:03 +0000 | [diff] [blame] | 14 | # |
| 15 | |
| 16 | set testdir [file dirname $argv0] |
| 17 | source $testdir/tester.tcl |
| 18 | ifcapable !trace { finish_test ; return } |
| 19 | set ::testprefix trace3 |
| 20 | |
| 21 | proc trace_v2_error { args } { |
| 22 | lappend ::stmtlist(error) [string trim $args] |
| 23 | error "trace error"; # this will be ignored. |
| 24 | } |
| 25 | proc trace_v2_record { args } { |
| 26 | lappend ::stmtlist(record) [string trim $args] |
| 27 | } |
| 28 | proc trace_v2_nop { args } {}; # do nothing. |
| 29 | |
| 30 | do_test trace3-1.0 { |
| 31 | execsql { |
| 32 | CREATE TABLE t1(a,b); |
| 33 | INSERT INTO t1 VALUES(1,NULL); |
| 34 | INSERT INTO t1 VALUES(2,-1); |
| 35 | INSERT INTO t1 VALUES(3,0); |
| 36 | INSERT INTO t1 VALUES(4,1); |
| 37 | INSERT INTO t1 VALUES(5,-2147483648); |
| 38 | INSERT INTO t1 VALUES(6,2147483647); |
| 39 | INSERT INTO t1 VALUES(7,-9223372036854775808); |
| 40 | INSERT INTO t1 VALUES(8,9223372036854775807); |
| 41 | INSERT INTO t1 VALUES(9,-1.0); |
| 42 | INSERT INTO t1 VALUES(10,0.0); |
| 43 | INSERT INTO t1 VALUES(11,1.0); |
| 44 | INSERT INTO t1 VALUES(12,''); |
| 45 | INSERT INTO t1 VALUES(13,'1'); |
| 46 | INSERT INTO t1 VALUES(14,'one'); |
| 47 | INSERT INTO t1 VALUES(15,x'abcd0123'); |
| 48 | INSERT INTO t1 VALUES(16,x'4567cdef'); |
| 49 | } |
| 50 | } {} |
| 51 | |
| 52 | do_test trace3-1.1 { |
| 53 | set rc [catch {db trace_v2 1 2 3} msg] |
| 54 | lappend rc $msg |
| 55 | } {1 {wrong # args: should be "db trace_v2 ?CALLBACK? ?MASK?"}} |
| 56 | do_test trace3-1.2 { |
| 57 | set rc [catch {db trace_v2 1 bad} msg] |
| 58 | lappend rc $msg |
| 59 | } {1 {bad trace type "bad": must be statement, profile, row, or close}} |
| 60 | |
| 61 | do_test trace3-2.1 { |
| 62 | db trace_v2 trace_v2_nop |
| 63 | db trace_v2 |
| 64 | } {trace_v2_nop} |
| 65 | |
| 66 | do_test trace3-3.1 { |
| 67 | unset -nocomplain ::stmtlist |
| 68 | db trace_v2 trace_v2_nop |
| 69 | execsql { |
| 70 | SELECT a, b FROM t1 ORDER BY a; |
| 71 | } |
| 72 | array get ::stmtlist |
| 73 | } {} |
| 74 | do_test trace3-3.2 { |
| 75 | set ::stmtlist(error) {} |
| 76 | db trace_v2 trace_v2_error |
| 77 | execsql { |
| 78 | SELECT a, b FROM t1 ORDER BY a; |
| 79 | } |
| 80 | set ::stmtlist(error) |
| 81 | } {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} |
| 82 | do_test trace3-3.3 { |
| 83 | set ::stmtlist(record) {} |
| 84 | db trace_v2 trace_v2_record |
| 85 | execsql { |
| 86 | SELECT a, b FROM t1 ORDER BY a; |
| 87 | } |
| 88 | set ::stmtlist(record) |
| 89 | } {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} |
mistachkin | 170e998 | 2016-07-15 00:23:01 +0000 | [diff] [blame] | 90 | do_test trace3-3.4 { |
| 91 | set ::stmtlist(record) {} |
| 92 | db trace_v2 trace_v2_record statement |
| 93 | execsql { |
| 94 | SELECT a, b FROM t1 ORDER BY a; |
| 95 | } |
| 96 | set ::stmtlist(record) |
| 97 | } {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} |
| 98 | do_test trace3-3.5 { |
| 99 | set ::stmtlist(record) {} |
| 100 | db trace_v2 trace_v2_record 1 |
| 101 | execsql { |
| 102 | SELECT a, b FROM t1 ORDER BY a; |
| 103 | } |
| 104 | set ::stmtlist(record) |
| 105 | } {/^\{-?\d+ \{SELECT a, b FROM t1 ORDER BY a;\}\}$/} |
mistachkin | b52dcd8 | 2016-07-14 23:17:03 +0000 | [diff] [blame] | 106 | |
| 107 | do_test trace3-4.1 { |
| 108 | set ::stmtlist(record) {} |
| 109 | db trace_v2 trace_v2_record profile |
| 110 | execsql { |
| 111 | SELECT a, b FROM t1 ORDER BY a; |
| 112 | } |
| 113 | set ::stmtlist(record) |
| 114 | } {/^\{-?\d+ -?\d+\}$/} |
mistachkin | 170e998 | 2016-07-15 00:23:01 +0000 | [diff] [blame] | 115 | do_test trace3-4.2 { |
| 116 | set ::stmtlist(record) {} |
| 117 | db trace_v2 trace_v2_record 2 |
| 118 | execsql { |
| 119 | SELECT a, b FROM t1 ORDER BY a; |
| 120 | } |
| 121 | set ::stmtlist(record) |
| 122 | } {/^\{-?\d+ -?\d+\}$/} |
mistachkin | b52dcd8 | 2016-07-14 23:17:03 +0000 | [diff] [blame] | 123 | |
mistachkin | 840c300 | 2018-03-10 20:45:44 +0000 | [diff] [blame] | 124 | do_test trace3-4.3 { |
| 125 | set ::stmtlist(record) {} |
| 126 | db trace_v2 trace_v2_record profile |
| 127 | execsql { |
| 128 | SELECT a, b FROM t1 ORDER BY a; |
| 129 | } |
| 130 | set stmt [lindex [lindex $::stmtlist(record) 0] 0] |
| 131 | set ns [lindex [lindex $::stmtlist(record) 0] 1] |
mistachkin | 3c6de32 | 2018-03-16 23:54:12 +0000 | [diff] [blame] | 132 | list $stmt [expr {$ns >= 0 && $ns <= 9999999}]; # less than 0.010 seconds |
mistachkin | 840c300 | 2018-03-10 20:45:44 +0000 | [diff] [blame] | 133 | } {/^-?\d+ 1$/} |
| 134 | do_test trace3-4.4 { |
| 135 | set ::stmtlist(record) {} |
| 136 | db trace_v2 trace_v2_record 2 |
| 137 | execsql { |
| 138 | SELECT a, b FROM t1 ORDER BY a; |
| 139 | } |
| 140 | set stmt [lindex [lindex $::stmtlist(record) 0] 0] |
| 141 | set ns [lindex [lindex $::stmtlist(record) 0] 1] |
mistachkin | 3c6de32 | 2018-03-16 23:54:12 +0000 | [diff] [blame] | 142 | list $stmt [expr {$ns >= 0 && $ns <= 9999999}]; # less than 0.010 seconds |
mistachkin | 840c300 | 2018-03-10 20:45:44 +0000 | [diff] [blame] | 143 | } {/^-?\d+ 1$/} |
| 144 | |
mistachkin | b52dcd8 | 2016-07-14 23:17:03 +0000 | [diff] [blame] | 145 | do_test trace3-5.1 { |
| 146 | set ::stmtlist(record) {} |
| 147 | db trace_v2 trace_v2_record row |
| 148 | execsql { |
| 149 | SELECT a, b FROM t1 ORDER BY a; |
| 150 | } |
| 151 | set ::stmtlist(record) |
dan | e5ec01c | 2016-10-08 16:10:29 +0000 | [diff] [blame] | 152 | } "/^[string trim [string repeat {-?\d+ } 16]]\$/" |
mistachkin | 170e998 | 2016-07-15 00:23:01 +0000 | [diff] [blame] | 153 | do_test trace3-5.2 { |
| 154 | set ::stmtlist(record) {} |
| 155 | db trace_v2 trace_v2_record 4 |
| 156 | execsql { |
| 157 | SELECT a, b FROM t1 ORDER BY a; |
| 158 | } |
| 159 | set ::stmtlist(record) |
dan | e5ec01c | 2016-10-08 16:10:29 +0000 | [diff] [blame] | 160 | } "/^[string trim [string repeat {-?\d+ } 16]]\$/" |
mistachkin | b52dcd8 | 2016-07-14 23:17:03 +0000 | [diff] [blame] | 161 | |
| 162 | do_test trace3-6.1 { |
| 163 | set ::stmtlist(record) {} |
| 164 | db trace_v2 trace_v2_record {profile row} |
| 165 | execsql { |
| 166 | SELECT a, b FROM t1 ORDER BY a; |
| 167 | } |
| 168 | set ::stmtlist(record) |
| 169 | } "/^[string trim [string repeat {-?\d+ } 16]] \\\{-?\\d+ -?\\d+\\\}\$/" |
mistachkin | e2f84b4 | 2016-07-15 00:07:47 +0000 | [diff] [blame] | 170 | do_test trace3-6.2 { |
| 171 | set ::stmtlist(record) {} |
| 172 | db trace_v2 trace_v2_record {statement profile row} |
| 173 | execsql { |
| 174 | SELECT a, b FROM t1 ORDER BY a; |
| 175 | } |
| 176 | set ::stmtlist(record) |
| 177 | } "/^\\\{-?\\d+ \\\{SELECT a, b FROM t1 ORDER BY a;\\\}\\\} [string trim \ |
| 178 | [string repeat {-?\d+ } 16]] \\\{-?\\d+ -?\\d+\\\}\$/" |
mistachkin | b52dcd8 | 2016-07-14 23:17:03 +0000 | [diff] [blame] | 179 | |
| 180 | do_test trace3-7.1 { |
mistachkin | e2f84b4 | 2016-07-15 00:07:47 +0000 | [diff] [blame] | 181 | set DB [sqlite3_connection_pointer db] |
| 182 | |
| 183 | set STMT [sqlite3_prepare_v2 $DB \ |
| 184 | "SELECT a, b FROM t1 WHERE b = ? ORDER BY a;" -1 TAIL] |
mistachkin | a8f286a | 2016-07-15 00:09:53 +0000 | [diff] [blame] | 185 | } {/^[0-9A-Fa-f]+$/} |
mistachkin | e2f84b4 | 2016-07-15 00:07:47 +0000 | [diff] [blame] | 186 | |
| 187 | do_test trace3-8.1 { |
| 188 | list [sqlite3_bind_null $STMT 1] [sqlite3_expanded_sql $STMT] |
| 189 | } {{} {SELECT a, b FROM t1 WHERE b = NULL ORDER BY a;}} |
| 190 | do_test trace3-8.2 { |
| 191 | list [sqlite3_bind_int $STMT 1 123] [sqlite3_expanded_sql $STMT] |
| 192 | } {{} {SELECT a, b FROM t1 WHERE b = 123 ORDER BY a;}} |
| 193 | do_test trace3-8.3 { |
| 194 | list [sqlite3_bind_int64 $STMT 1 123] [sqlite3_expanded_sql $STMT] |
| 195 | } {{} {SELECT a, b FROM t1 WHERE b = 123 ORDER BY a;}} |
| 196 | do_test trace3-8.4 { |
| 197 | list [sqlite3_bind_text $STMT 1 "some string" 11] \ |
| 198 | [sqlite3_expanded_sql $STMT] |
| 199 | } {{} {SELECT a, b FROM t1 WHERE b = 'some string' ORDER BY a;}} |
| 200 | do_test trace3-8.5 { |
| 201 | list [sqlite3_bind_text $STMT 1 "some 'bad' string" 17] \ |
| 202 | [sqlite3_expanded_sql $STMT] |
| 203 | } {{} {SELECT a, b FROM t1 WHERE b = 'some ''bad'' string' ORDER BY a;}} |
| 204 | do_test trace3-8.6 { |
| 205 | list [sqlite3_bind_double $STMT 1 123] [sqlite3_expanded_sql $STMT] |
| 206 | } {{} {SELECT a, b FROM t1 WHERE b = 123.0 ORDER BY a;}} |
| 207 | do_test trace3-8.7 { |
| 208 | list [sqlite3_bind_text16 $STMT 1 \ |
| 209 | [encoding convertto unicode hi\000yall\000] 16] \ |
| 210 | [sqlite3_expanded_sql $STMT] |
| 211 | } {{} {SELECT a, b FROM t1 WHERE b = 'hi' ORDER BY a;}} |
| 212 | do_test trace3-8.8 { |
| 213 | list [sqlite3_bind_blob $STMT 1 "\x12\x34\x56" 3] \ |
| 214 | [sqlite3_expanded_sql $STMT] |
| 215 | } {{} {SELECT a, b FROM t1 WHERE b = x'123456' ORDER BY a;}} |
mistachkin | de6fde6 | 2016-07-15 01:49:25 +0000 | [diff] [blame] | 216 | do_test trace3-8.9 { |
| 217 | list [sqlite3_bind_blob $STMT 1 "\xAB\xCD\xEF" 3] \ |
| 218 | [sqlite3_expanded_sql $STMT] |
| 219 | } {{} {SELECT a, b FROM t1 WHERE b = x'abcdef' ORDER BY a;}} |
mistachkin | e2f84b4 | 2016-07-15 00:07:47 +0000 | [diff] [blame] | 220 | |
| 221 | do_test trace3-9.1 { |
mistachkin | 170e998 | 2016-07-15 00:23:01 +0000 | [diff] [blame] | 222 | sqlite3_finalize $STMT |
| 223 | } {SQLITE_OK} |
| 224 | |
| 225 | do_test trace3-10.1 { |
mistachkin | e2f84b4 | 2016-07-15 00:07:47 +0000 | [diff] [blame] | 226 | db trace_v2 "" |
| 227 | db trace_v2 |
| 228 | } {} |
mistachkin | 170e998 | 2016-07-15 00:23:01 +0000 | [diff] [blame] | 229 | do_test trace3-10.2 { |
mistachkin | e2f84b4 | 2016-07-15 00:07:47 +0000 | [diff] [blame] | 230 | unset -nocomplain ::stmtlist |
| 231 | db trace_v2 "" {statement profile row} |
| 232 | execsql { |
| 233 | SELECT a, b FROM t1 ORDER BY a; |
| 234 | } |
| 235 | array get ::stmtlist |
| 236 | } {} |
| 237 | |
mistachkin | 170e998 | 2016-07-15 00:23:01 +0000 | [diff] [blame] | 238 | do_test trace3-11.1 { |
mistachkin | b52dcd8 | 2016-07-14 23:17:03 +0000 | [diff] [blame] | 239 | set ::stmtlist(record) {} |
| 240 | db trace_v2 trace_v2_record close |
| 241 | db close |
| 242 | set ::stmtlist(record) |
| 243 | } {/^-?\d+$/} |
| 244 | |
mistachkin | 170e998 | 2016-07-15 00:23:01 +0000 | [diff] [blame] | 245 | reset_db |
| 246 | |
| 247 | do_test trace3-11.2 { |
| 248 | set ::stmtlist(record) {} |
| 249 | db trace_v2 trace_v2_record 8 |
| 250 | db close |
| 251 | set ::stmtlist(record) |
| 252 | } {/^-?\d+$/} |
| 253 | |
dan | 13dd022 | 2020-12-17 11:24:26 +0000 | [diff] [blame] | 254 | #------------------------------------------------------------------------- |
| 255 | reset_db |
| 256 | do_test 12.1.0 { |
| 257 | set ::STMT [sqlite3_prepare_v2 $DB \ |
| 258 | "SELECT ?1 || ?1 || ?1 || ?2 || ?3 || ?4 || ? || ?1 || ?" -1 TAIL |
| 259 | ] |
| 260 | sqlite3_bind_parameter_count $::STMT |
| 261 | } {6} |
| 262 | |
| 263 | do_test 12.1.1 { |
| 264 | sqlite3_bind_text $STMT 1 "A" 1 |
| 265 | sqlite3_bind_text $STMT 2 "B" 1 |
| 266 | sqlite3_bind_text $STMT 3 "C" 1 |
| 267 | sqlite3_bind_text $STMT 4 "D" 1 |
| 268 | sqlite3_bind_text $STMT 5 "E" 1 |
| 269 | sqlite3_bind_text $STMT 6 "F" 1 |
| 270 | sqlite3_expanded_sql $STMT |
| 271 | } {SELECT 'A' || 'A' || 'A' || 'B' || 'C' || 'D' || 'E' || 'A' || 'F'} |
| 272 | |
| 273 | do_test 12.1.2 { |
| 274 | sqlite3_step $STMT |
| 275 | sqlite3_column_text $STMT 0 |
| 276 | } {AAABCDEAF} |
| 277 | |
| 278 | do_test 12.1.3 { |
| 279 | sqlite3_finalize $STMT |
| 280 | } {SQLITE_OK} |
| 281 | |
| 282 | do_test 12.2.0 { |
| 283 | execsql { |
| 284 | CREATE TABLE nameFtsFuzzySearchTable( |
| 285 | word, distance, langid, score, top, scope |
| 286 | ); |
| 287 | } |
| 288 | set ::STMT [sqlite3_prepare_v2 $DB { |
| 289 | SELECT |
| 290 | substr(word,1,length(?1)-1) AS term, |
| 291 | distance, |
| 292 | langid, |
| 293 | score |
| 294 | FROM |
| 295 | nameFtsFuzzySearchTable |
| 296 | WHERE |
| 297 | word MATCH (?1) AND abs(?1) = abs(term) |
| 298 | AND top = ?2 AND distance > ?3 AND scope = ?4 AND langid = ? |
| 299 | GROUP BY term, langid |
| 300 | HAVING (1.0 - ((distance / 100.0) / CAST( length(?1) - 1 AS REAL ))) >= ? |
| 301 | } -1 TAIL] |
| 302 | sqlite3_bind_parameter_count $::STMT |
| 303 | } {6} |
| 304 | |
| 305 | do_test 12.1.1 { |
| 306 | sqlite3_bind_text $STMT 1 "A" 1 |
| 307 | sqlite3_bind_text $STMT 2 "B" 1 |
| 308 | sqlite3_bind_text $STMT 3 "C" 1 |
| 309 | sqlite3_bind_text $STMT 4 "D" 1 |
| 310 | sqlite3_bind_text $STMT 5 "E" 1 |
| 311 | sqlite3_bind_text $STMT 6 "F" 1 |
| 312 | sqlite3_expanded_sql $STMT |
| 313 | } { |
| 314 | SELECT |
| 315 | substr(word,1,length('A')-1) AS term, |
| 316 | distance, |
| 317 | langid, |
| 318 | score |
| 319 | FROM |
| 320 | nameFtsFuzzySearchTable |
| 321 | WHERE |
| 322 | word MATCH ('A') AND abs('A') = abs(term) |
| 323 | AND top = 'B' AND distance > 'C' AND scope = 'D' AND langid = 'E' |
| 324 | GROUP BY term, langid |
| 325 | HAVING (1.0 - ((distance / 100.0) / CAST( length('A') - 1 AS REAL ))) >= 'F' |
| 326 | } |
| 327 | |
| 328 | do_test 12.1.2 { |
| 329 | sqlite3_finalize $STMT |
| 330 | } {SQLITE_OK} |
| 331 | |
| 332 | |
mistachkin | b52dcd8 | 2016-07-14 23:17:03 +0000 | [diff] [blame] | 333 | finish_test |