| 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 | 
|  |