| OLD | NEW |
| 1 # 2013-11-04 | 1 # 2013-11-04 |
| 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 # Test cases for partial indices in WITHOUT ROWID tables | 12 # Test cases for partial indices in WITHOUT ROWID tables |
| 13 # | 13 # |
| 14 | 14 |
| 15 | 15 |
| 16 set testdir [file dirname $argv0] | 16 set testdir [file dirname $argv0] |
| 17 source $testdir/tester.tcl | 17 source $testdir/tester.tcl |
| 18 | 18 |
| 19 ifcapable !vtab { | 19 ifcapable !vtab { |
| 20 finish_test | 20 finish_test |
| 21 return | 21 return |
| 22 } | 22 } |
| 23 | 23 |
| 24 # Capture the output of a pragma in a TEMP table. |
| 25 # |
| 26 proc capture_pragma {db tabname sql} { |
| 27 $db eval "DROP TABLE IF EXISTS temp.$tabname" |
| 28 set once 1 |
| 29 $db eval $sql x { |
| 30 if {$once} { |
| 31 set once 0 |
| 32 set ins "INSERT INTO $tabname VALUES" |
| 33 set crtab "CREATE TEMP TABLE $tabname " |
| 34 set sep "(" |
| 35 foreach col $x(*) { |
| 36 append ins ${sep}\$x($col) |
| 37 append crtab ${sep}\"$col\" |
| 38 set sep , |
| 39 } |
| 40 append ins ) |
| 41 append crtab ) |
| 42 $db eval $crtab |
| 43 } |
| 44 $db eval $ins |
| 45 } |
| 46 } |
| 47 |
| 48 |
| 24 load_static_extension db wholenumber; | 49 load_static_extension db wholenumber; |
| 25 do_test index7-1.1 { | 50 do_test index7-1.1 { |
| 26 # Able to parse and manage partial indices | 51 # Able to parse and manage partial indices |
| 27 execsql { | 52 execsql { |
| 28 CREATE TABLE t1(a,b,c PRIMARY KEY) WITHOUT rowid; | 53 CREATE TABLE t1(a,b,c PRIMARY KEY) WITHOUT rowid; |
| 29 CREATE INDEX t1a ON t1(a) WHERE a IS NOT NULL; | 54 CREATE INDEX t1a ON t1(a) WHERE a IS NOT NULL; |
| 30 CREATE INDEX t1b ON t1(b) WHERE b>10; | 55 CREATE INDEX t1b ON t1(b) WHERE b>10; |
| 31 CREATE VIRTUAL TABLE nums USING wholenumber; | 56 CREATE VIRTUAL TABLE nums USING wholenumber; |
| 32 INSERT INTO t1(a,b,c) | 57 INSERT INTO t1(a,b,c) |
| 33 SELECT CASE WHEN value%3!=0 THEN value END, value, value | 58 SELECT CASE WHEN value%3!=0 THEN value END, value, value |
| 34 FROM nums WHERE value<=20; | 59 FROM nums WHERE value<=20; |
| 35 SELECT count(a), count(b) FROM t1; | 60 SELECT count(a), count(b) FROM t1; |
| 36 PRAGMA integrity_check; | 61 PRAGMA integrity_check; |
| 37 } | 62 } |
| 38 } {14 20 ok} | 63 } {14 20 ok} |
| 39 | 64 |
| 65 # (The "partial" column of the PRAGMA index_list output is...) |
| 66 # EVIDENCE-OF: R-34457-09668 "1" if the index is a partial index and "0" |
| 67 # if not. |
| 68 # |
| 69 do_test index7-1.1a { |
| 70 capture_pragma db out {PRAGMA index_list(t1)} |
| 71 db eval {SELECT "name", "partial", '|' FROM out ORDER BY "name"} |
| 72 } {sqlite_autoindex_t1_1 0 | t1a 1 | t1b 1 |} |
| 73 |
| 40 # Make sure the count(*) optimization works correctly with | 74 # Make sure the count(*) optimization works correctly with |
| 41 # partial indices. Ticket [a5c8ed66cae16243be6] 2013-10-03. | 75 # partial indices. Ticket [a5c8ed66cae16243be6] 2013-10-03. |
| 42 # | 76 # |
| 43 do_execsql_test index7-1.1.1 { | 77 do_execsql_test index7-1.1.1 { |
| 44 SELECT count(*) FROM t1; | 78 SELECT count(*) FROM t1; |
| 45 } {20} | 79 } {20} |
| 46 | 80 |
| 47 # Error conditions during parsing... | 81 # Error conditions during parsing... |
| 48 # | 82 # |
| 49 do_test index7-1.2 { | 83 do_test index7-1.2 { |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 INSERT INTO t4 VALUES('def', 'xyz'); | 304 INSERT INTO t4 VALUES('def', 'xyz'); |
| 271 SELECT * FROM v4 WHERE d='xyz' AND c='def' | 305 SELECT * FROM v4 WHERE d='xyz' AND c='def' |
| 272 } { | 306 } { |
| 273 def xyz | 307 def xyz |
| 274 } | 308 } |
| 275 do_eqp_test index7-6.4 { | 309 do_eqp_test index7-6.4 { |
| 276 SELECT * FROM v4 WHERE d='xyz' AND c='def' | 310 SELECT * FROM v4 WHERE d='xyz' AND c='def' |
| 277 } { | 311 } { |
| 278 0 0 0 {SEARCH TABLE t4 USING INDEX i4 (c=?)} | 312 0 0 0 {SEARCH TABLE t4 USING INDEX i4 (c=?)} |
| 279 } | 313 } |
| 314 do_catchsql_test index7-6.5 { |
| 315 CREATE INDEX t5a ON t5(a) WHERE a=#1; |
| 316 } {1 {near "#1": syntax error}} |
| 317 |
| 280 | 318 |
| 281 finish_test | 319 finish_test |
| OLD | NEW |