OLD | NEW |
1 # 2009 August 06 | 1 # 2009 August 06 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
11 # | 11 # |
12 # This file implements regression tests for SQLite library. This file | 12 # This file implements regression tests for SQLite library. This file |
13 # implements tests for range and LIKE constraints that use bound variables | 13 # implements tests for range and LIKE constraints that use bound variables |
14 # instead of literal constant arguments. | 14 # instead of literal constant arguments. |
15 # | 15 # |
16 | 16 |
17 set testdir [file dirname $argv0] | 17 set testdir [file dirname $argv0] |
18 source $testdir/tester.tcl | 18 source $testdir/tester.tcl |
| 19 set testprefix analyze3 |
19 | 20 |
20 ifcapable !stat4&&!stat3 { | 21 ifcapable !stat4&&!stat3 { |
21 finish_test | 22 finish_test |
22 return | 23 return |
23 } | 24 } |
24 | 25 |
25 #---------------------------------------------------------------------- | 26 #---------------------------------------------------------------------- |
26 # Test Organization: | 27 # Test Organization: |
27 # | 28 # |
28 # analyze3-1.*: Test that the values of bound parameters are considered | 29 # analyze3-1.*: Test that the values of bound parameters are considered |
(...skipping 10 matching lines...) Expand all Loading... |
39 # | 40 # |
40 # analyze3-4.*: Test that SQL or authorization callback errors occuring | 41 # analyze3-4.*: Test that SQL or authorization callback errors occuring |
41 # within sqlite3Reprepare() are handled correctly. | 42 # within sqlite3Reprepare() are handled correctly. |
42 # | 43 # |
43 # analyze3-5.*: Check that the query plans of applicable statements are | 44 # analyze3-5.*: Check that the query plans of applicable statements are |
44 # invalidated if the values of SQL parameter are modified | 45 # invalidated if the values of SQL parameter are modified |
45 # using the clear_bindings() or transfer_bindings() APIs. | 46 # using the clear_bindings() or transfer_bindings() APIs. |
46 # | 47 # |
47 # analyze3-6.*: Test that the problem fixed by commit [127a5b776d] is fixed. | 48 # analyze3-6.*: Test that the problem fixed by commit [127a5b776d] is fixed. |
48 # | 49 # |
| 50 # analyze3-7.*: Test that some memory leaks discovered by fuzz testing |
| 51 # have been fixed. |
| 52 # |
49 | 53 |
50 proc getvar {varname} { uplevel #0 set $varname } | 54 proc getvar {varname} { uplevel #0 set $varname } |
51 db function var getvar | 55 db function var getvar |
52 | 56 |
53 proc eqp {sql {db db}} { | 57 proc eqp {sql {db db}} { |
54 uplevel execsql [list "EXPLAIN QUERY PLAN $sql"] $db | 58 uplevel execsql [list "EXPLAIN QUERY PLAN $sql"] $db |
55 } | 59 } |
56 | 60 |
57 proc sf_execsql {sql {db db}} { | 61 proc sf_execsql {sql {db db}} { |
58 set ::sqlite_search_count 0 | 62 set ::sqlite_search_count 0 |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 } | 276 } |
273 execsql COMMIT | 277 execsql COMMIT |
274 } {} | 278 } {} |
275 do_eqp_test analyze3-2.2 { | 279 do_eqp_test analyze3-2.2 { |
276 SELECT count(a) FROM t1 WHERE b LIKE 'a%' | 280 SELECT count(a) FROM t1 WHERE b LIKE 'a%' |
277 } {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (b>? AND b<?)}} | 281 } {0 0 0 {SEARCH TABLE t1 USING INDEX i1 (b>? AND b<?)}} |
278 do_eqp_test analyze3-2.3 { | 282 do_eqp_test analyze3-2.3 { |
279 SELECT count(a) FROM t1 WHERE b LIKE '%a' | 283 SELECT count(a) FROM t1 WHERE b LIKE '%a' |
280 } {0 0 0 {SCAN TABLE t1}} | 284 } {0 0 0 {SCAN TABLE t1}} |
281 | 285 |
| 286 # Return the first argument if like_match_blobs is true (the default) |
| 287 # or the second argument if not |
| 288 # |
| 289 proc ilmb {a b} { |
| 290 ifcapable like_match_blobs {return $a} |
| 291 return $b |
| 292 } |
| 293 |
282 do_test analyze3-2.4 { | 294 do_test analyze3-2.4 { |
283 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE 'a%' } | 295 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE 'a%' } |
284 } {101 0 100} | 296 } [list [ilmb 102 101] 0 100] |
285 do_test analyze3-2.5 { | 297 do_test analyze3-2.5 { |
286 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE '%a' } | 298 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE '%a' } |
287 } {999 999 100} | 299 } {999 999 100} |
288 | 300 |
289 do_test analyze3-2.4 { | 301 do_test analyze3-2.6 { |
290 set like "a%" | 302 set like "a%" |
291 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } | 303 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } |
292 } {101 0 100} | 304 } [list [ilmb 102 101] 0 100] |
293 do_test analyze3-2.5 { | 305 do_test analyze3-2.7 { |
294 set like "%a" | 306 set like "%a" |
295 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } | 307 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } |
296 } {999 999 100} | 308 } {999 999 100} |
297 do_test analyze3-2.6 { | 309 do_test analyze3-2.8 { |
298 set like "a" | 310 set like "a" |
299 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } | 311 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } |
300 } {101 0 0} | 312 } [list [ilmb 102 101] 0 0] |
301 do_test analyze3-2.7 { | 313 do_test analyze3-2.9 { |
302 set like "ab" | 314 set like "ab" |
303 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } | 315 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } |
304 } {11 0 0} | 316 } [list [ilmb 12 11] 0 0] |
305 do_test analyze3-2.8 { | 317 do_test analyze3-2.10 { |
306 set like "abc" | 318 set like "abc" |
307 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } | 319 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } |
308 } {2 0 1} | 320 } [list [ilmb 3 2] 0 1] |
309 do_test analyze3-2.9 { | 321 do_test analyze3-2.11 { |
310 set like "a_c" | 322 set like "a_c" |
311 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } | 323 sf_execsql { SELECT count(*) FROM t1 WHERE b LIKE $like } |
312 } {101 0 10} | 324 } [list [ilmb 102 101] 0 10] |
313 | 325 |
314 | 326 |
315 #------------------------------------------------------------------------- | 327 #------------------------------------------------------------------------- |
316 # This block of tests checks that statements are correctly marked as | 328 # This block of tests checks that statements are correctly marked as |
317 # expired when the values bound to any parameters that may affect the | 329 # expired when the values bound to any parameters that may affect the |
318 # query plan are modified. | 330 # query plan are modified. |
319 # | 331 # |
320 drop_all_tables | 332 drop_all_tables |
321 db auth auth | 333 db auth auth |
322 proc auth {args} { | 334 proc auth {args} { |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 } {} | 667 } {} |
656 | 668 |
657 do_eqp_test analyze3-6-3 { | 669 do_eqp_test analyze3-6-3 { |
658 SELECT * FROM t1 WHERE a = 5 AND c = 13; | 670 SELECT * FROM t1 WHERE a = 5 AND c = 13; |
659 } {0 0 0 {SEARCH TABLE t1 USING INDEX i2 (c=?)}} | 671 } {0 0 0 {SEARCH TABLE t1 USING INDEX i2 (c=?)}} |
660 | 672 |
661 do_eqp_test analyze3-6-2 { | 673 do_eqp_test analyze3-6-2 { |
662 SELECT * FROM t1 WHERE a = 5 AND b > 'w' AND c = 13; | 674 SELECT * FROM t1 WHERE a = 5 AND b > 'w' AND c = 13; |
663 } {0 0 0 {SEARCH TABLE t1 USING INDEX i2 (c=?)}} | 675 } {0 0 0 {SEARCH TABLE t1 USING INDEX i2 (c=?)}} |
664 | 676 |
| 677 #----------------------------------------------------------------------------- |
| 678 # 2015-04-20. |
| 679 # Memory leak in sqlite3Stat4ProbeFree(). (Discovered while fuzzing.) |
| 680 # |
| 681 do_execsql_test analyze-7.1 { |
| 682 DROP TABLE IF EXISTS t1; |
| 683 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); |
| 684 INSERT INTO t1 VALUES(1,1,'0000'); |
| 685 CREATE INDEX t0b ON t1(b); |
| 686 ANALYZE; |
| 687 SELECT c FROM t1 WHERE b=3 AND a BETWEEN 30 AND hex(1); |
| 688 } {} |
| 689 |
| 690 # At one point duplicate stat1 entries were causing a memory leak. |
| 691 # |
| 692 reset_db |
| 693 do_execsql_test 7.2 { |
| 694 CREATE TABLE t1(a,b,c); |
| 695 CREATE INDEX t1a ON t1(a); |
| 696 ANALYZE; |
| 697 SELECT * FROM sqlite_stat1; |
| 698 INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES('t1','t1a','12000'); |
| 699 INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES('t1','t1a','12000'); |
| 700 ANALYZE sqlite_master; |
| 701 } |
| 702 |
665 finish_test | 703 finish_test |
OLD | NEW |