Index: third_party/sqlite/src/test/like.test |
diff --git a/third_party/sqlite/src/test/like.test b/third_party/sqlite/src/test/like.test |
index bd9a6c39c1abb02d4ad0050c0bfd56db095a806f..923272cfb2be24e1bc95baacac5c8cd8e0c6b1f3 100644 |
--- a/third_party/sqlite/src/test/like.test |
+++ b/third_party/sqlite/src/test/like.test |
@@ -70,12 +70,15 @@ do_test like-1.4 { |
} |
} {ABC abc} |
do_test like-1.5.1 { |
+ # Use sqlite3_exec() to verify fix for ticket [25ee81271091] 2011-06-26 |
+ sqlite3_exec db {PRAGMA case_sensitive_like=on} |
+} {0 {}} |
+do_test like-1.5.2 { |
execsql { |
- PRAGMA case_sensitive_like=on; |
SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1; |
} |
} {abc} |
-do_test like-1.5.2 { |
+do_test like-1.5.3 { |
execsql { |
PRAGMA case_sensitive_like; -- no argument; does not change setting |
SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1; |
@@ -153,14 +156,27 @@ ifcapable !like_opt { |
# This procedure executes the SQL. Then it appends to the result the |
# "sort" or "nosort" keyword (as in the cksort procedure above) then |
-# it appends the ::sqlite_query_plan variable. |
+# it appends the names of the table and index used. |
# |
proc queryplan {sql} { |
set ::sqlite_sort_count 0 |
set data [execsql $sql] |
if {$::sqlite_sort_count} {set x sort} {set x nosort} |
lappend data $x |
- return [concat $data $::sqlite_query_plan] |
+ set eqp [execsql "EXPLAIN QUERY PLAN $sql"] |
+ # puts eqp=$eqp |
+ foreach {a b c x} $eqp { |
+ if {[regexp { TABLE (\w+ AS )?(\w+) USING COVERING INDEX (\w+)\y} \ |
+ $x all as tab idx]} { |
+ lappend data {} $idx |
+ } elseif {[regexp { TABLE (\w+ AS )?(\w+) USING.* INDEX (\w+)\y} \ |
+ $x all as tab idx]} { |
+ lappend data $tab $idx |
+ } elseif {[regexp { TABLE (\w+ AS )?(\w+)\y} $x all as tab]} { |
+ lappend data $tab * |
+ } |
+ } |
+ return $data |
} |
# Perform tests on the like optimization. |
@@ -173,7 +189,7 @@ do_test like-3.1 { |
queryplan { |
SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1; |
} |
-} {ABC {ABC abc xyz} abc abcd sort t1 {}} |
+} {ABC {ABC abc xyz} abc abcd sort t1 *} |
do_test like-3.2 { |
set sqlite_like_count |
} {12} |
@@ -266,8 +282,8 @@ do_test like-3.12 { |
# |
do_test like-3.13 { |
set sqlite_like_count 0 |
+ db eval {PRAGMA case_sensitive_like=off;} |
queryplan { |
- PRAGMA case_sensitive_like=off; |
SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1; |
} |
} {ABC {ABC abc xyz} abc abcd nosort {} i1} |
@@ -279,12 +295,14 @@ do_test like-3.14 { |
# |
do_test like-3.15 { |
set sqlite_like_count 0 |
- queryplan { |
+ db eval { |
PRAGMA case_sensitive_like=on; |
DROP INDEX i1; |
+ } |
+ queryplan { |
SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1; |
} |
-} {abc abcd sort t1 {}} |
+} {abc abcd sort t1 *} |
do_test like-3.16 { |
set sqlite_like_count |
} 12 |
@@ -296,7 +314,7 @@ do_test like-3.17 { |
queryplan { |
SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1; |
} |
-} {abc abcd sort t1 {}} |
+} {abc abcd sort t1 *} |
do_test like-3.18 { |
set sqlite_like_count |
} 12 |
@@ -305,8 +323,8 @@ do_test like-3.18 { |
# |
do_test like-3.19 { |
set sqlite_like_count 0 |
+ db eval {CREATE INDEX i1 ON t1(x);} |
queryplan { |
- CREATE INDEX i1 ON t1(x); |
SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1; |
} |
} {abc abcd nosort {} i1} |
@@ -315,8 +333,8 @@ do_test like-3.20 { |
} 0 |
do_test like-3.21 { |
set sqlite_like_count 0 |
+ db eval {PRAGMA case_sensitive_like=on;} |
queryplan { |
- PRAGMA case_sensitive_like=on; |
SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1; |
} |
} {abc abcd nosort {} i1} |
@@ -325,8 +343,8 @@ do_test like-3.22 { |
} 0 |
do_test like-3.23 { |
set sqlite_like_count 0 |
+ db eval {PRAGMA case_sensitive_like=off;} |
queryplan { |
- PRAGMA case_sensitive_like=off; |
SELECT x FROM t1 WHERE x GLOB 'a[bc]d' ORDER BY 1; |
} |
} {abd acd nosort {} i1} |
@@ -403,7 +421,7 @@ do_test like-5.2 { |
do_test like-5.3 { |
execsql { |
CREATE TABLE t2(x TEXT COLLATE NOCASE); |
- INSERT INTO t2 SELECT * FROM t1; |
+ INSERT INTO t2 SELECT * FROM t1 ORDER BY rowid; |
CREATE INDEX i2 ON t2(x COLLATE NOCASE); |
} |
set sqlite_like_count 0 |
@@ -519,7 +537,7 @@ do_test like-5.24 { |
} |
} {zz-lower-lower zZ-lower-upper Zz-upper-lower ZZ-upper-upper nosort {} i2} |
do_test like-5.25 { |
- queryplan { |
+ db eval { |
PRAGMA case_sensitive_like=on; |
CREATE TABLE t3(x TEXT); |
CREATE INDEX i3 ON t3(x); |
@@ -527,6 +545,8 @@ do_test like-5.25 { |
INSERT INTO t3 VALUES('zZ-lower-upper'); |
INSERT INTO t3 VALUES('Zz-upper-lower'); |
INSERT INTO t3 VALUES('zz-lower-lower'); |
+ } |
+ queryplan { |
SELECT x FROM t3 WHERE x LIKE 'zz%'; |
} |
} {zz-lower-lower nosort {} i3} |
@@ -657,8 +677,8 @@ ifcapable like_opt&&!icu { |
set res [sqlite3_exec_hex db { |
EXPLAIN QUERY PLAN SELECT x FROM t2 WHERE x LIKE '%ff%25' |
}] |
- regexp {INDEX i2} $res |
- } {0} |
+ regexp {SCAN TABLE t2} $res |
+ } {1} |
} |
do_test like-9.5.1 { |
set res [sqlite3_exec_hex db { |
@@ -804,60 +824,66 @@ do_test like-11.0 { |
} |
} {12} |
do_test like-11.1 { |
+ db eval {PRAGMA case_sensitive_like=OFF;} |
queryplan { |
- PRAGMA case_sensitive_like=OFF; |
SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY a; |
} |
} {abc abcd ABC ABCD nosort t11 *} |
do_test like-11.2 { |
+ db eval {PRAGMA case_sensitive_like=ON;} |
queryplan { |
- PRAGMA case_sensitive_like=ON; |
SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY a; |
} |
} {abc abcd nosort t11 *} |
do_test like-11.3 { |
- queryplan { |
+ db eval { |
PRAGMA case_sensitive_like=OFF; |
CREATE INDEX t11b ON t11(b); |
+ } |
+ queryplan { |
SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a; |
} |
} {abc abcd ABC ABCD sort {} t11b} |
do_test like-11.4 { |
+ db eval {PRAGMA case_sensitive_like=ON;} |
queryplan { |
- PRAGMA case_sensitive_like=ON; |
SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY a; |
} |
} {abc abcd nosort t11 *} |
do_test like-11.5 { |
- queryplan { |
+ db eval { |
PRAGMA case_sensitive_like=OFF; |
DROP INDEX t11b; |
CREATE INDEX t11bnc ON t11(b COLLATE nocase); |
+ } |
+ queryplan { |
SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a; |
} |
} {abc abcd ABC ABCD sort {} t11bnc} |
do_test like-11.6 { |
+ db eval {CREATE INDEX t11bb ON t11(b COLLATE binary);} |
queryplan { |
- CREATE INDEX t11bb ON t11(b COLLATE binary); |
SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a; |
} |
} {abc abcd ABC ABCD sort {} t11bnc} |
do_test like-11.7 { |
+ db eval {PRAGMA case_sensitive_like=ON;} |
queryplan { |
- PRAGMA case_sensitive_like=ON; |
SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a; |
} |
} {abc abcd sort {} t11bb} |
do_test like-11.8 { |
+ db eval {PRAGMA case_sensitive_like=OFF;} |
queryplan { |
- PRAGMA case_sensitive_like=OFF; |
SELECT b FROM t11 WHERE b GLOB 'abc*' ORDER BY +a; |
} |
} {abc abcd sort {} t11bb} |
do_test like-11.9 { |
- queryplan { |
+ db eval { |
CREATE INDEX t11cnc ON t11(c COLLATE nocase); |
CREATE INDEX t11cb ON t11(c COLLATE binary); |
+ } |
+ queryplan { |
SELECT c FROM t11 WHERE c LIKE 'abc%' ORDER BY +a; |
} |
} {abc abcd ABC ABCD sort {} t11cnc} |
@@ -867,5 +893,60 @@ do_test like-11.10 { |
} |
} {abc abcd sort {} t11cb} |
+# A COLLATE clause on the pattern does not change the result of a |
+# LIKE operator. |
+# |
+do_execsql_test like-12.1 { |
+ CREATE TABLE t12nc(id INTEGER, x TEXT UNIQUE COLLATE nocase); |
+ INSERT INTO t12nc VALUES(1,'abcde'),(2,'uvwxy'),(3,'ABCDEF'); |
+ CREATE TABLE t12b(id INTEGER, x TEXT UNIQUE COLLATE binary); |
+ INSERT INTO t12b VALUES(1,'abcde'),(2,'uvwxy'),(3,'ABCDEF'); |
+ SELECT id FROM t12nc WHERE x LIKE 'abc%' ORDER BY +id; |
+} {1 3} |
+do_execsql_test like-12.2 { |
+ SELECT id FROM t12b WHERE x LIKE 'abc%' ORDER BY +id; |
+} {1 3} |
+do_execsql_test like-12.3 { |
+ SELECT id FROM t12nc WHERE x LIKE 'abc%' COLLATE binary ORDER BY +id; |
+} {1 3} |
+do_execsql_test like-12.4 { |
+ SELECT id FROM t12b WHERE x LIKE 'abc%' COLLATE binary ORDER BY +id; |
+} {1 3} |
+do_execsql_test like-12.5 { |
+ SELECT id FROM t12nc WHERE x LIKE 'abc%' COLLATE nocase ORDER BY +id; |
+} {1 3} |
+do_execsql_test like-12.6 { |
+ SELECT id FROM t12b WHERE x LIKE 'abc%' COLLATE nocase ORDER BY +id; |
+} {1 3} |
+ |
+# Adding a COLLATE clause to the pattern of a LIKE operator does nothing |
+# to change the suitability of using an index to satisfy that LIKE |
+# operator. |
+# |
+do_execsql_test like-12.11 { |
+ EXPLAIN QUERY PLAN |
+ SELECT id FROM t12nc WHERE x LIKE 'abc%' ORDER BY +id; |
+} {/SEARCH/} |
+do_execsql_test like-12.12 { |
+ EXPLAIN QUERY PLAN |
+ SELECT id FROM t12b WHERE x LIKE 'abc%' ORDER BY +id; |
+} {/SCAN/} |
+do_execsql_test like-12.13 { |
+ EXPLAIN QUERY PLAN |
+ SELECT id FROM t12nc WHERE x LIKE 'abc%' COLLATE nocase ORDER BY +id; |
+} {/SEARCH/} |
+do_execsql_test like-12.14 { |
+ EXPLAIN QUERY PLAN |
+ SELECT id FROM t12b WHERE x LIKE 'abc%' COLLATE nocase ORDER BY +id; |
+} {/SCAN/} |
+do_execsql_test like-12.15 { |
+ EXPLAIN QUERY PLAN |
+ SELECT id FROM t12nc WHERE x LIKE 'abc%' COLLATE binary ORDER BY +id; |
+} {/SEARCH/} |
+do_execsql_test like-12.16 { |
+ EXPLAIN QUERY PLAN |
+ SELECT id FROM t12b WHERE x LIKE 'abc%' COLLATE binary ORDER BY +id; |
+} {/SCAN/} |
+ |
finish_test |