| 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 a2de6866b5cc09ace6c21ea0ab4b7f357b9a6066..bd9a6c39c1abb02d4ad0050c0bfd56db095a806f 100644
|
| --- a/third_party/sqlite/src/test/like.test
|
| +++ b/third_party/sqlite/src/test/like.test
|
| @@ -115,7 +115,7 @@ do_test like-2.1 {
|
| proc test_regexp {a b} {
|
| return [regexp $a $b]
|
| }
|
| - db function regexp test_regexp
|
| + db function regexp -argcount 2 test_regexp
|
| execsql {
|
| SELECT x FROM t1 WHERE x REGEXP 'abc' ORDER BY 1;
|
| }
|
| @@ -194,6 +194,31 @@ do_test like-3.4 {
|
| set sqlite_like_count
|
| } 0
|
|
|
| +# The LIKE optimization still works when the RHS is a string with no
|
| +# wildcard. Ticket [e090183531fc2747]
|
| +#
|
| +do_test like-3.4.2 {
|
| + queryplan {
|
| + SELECT x FROM t1 WHERE x LIKE 'a' ORDER BY 1;
|
| + }
|
| +} {a nosort {} i1}
|
| +do_test like-3.4.3 {
|
| + queryplan {
|
| + SELECT x FROM t1 WHERE x LIKE 'ab' ORDER BY 1;
|
| + }
|
| +} {ab nosort {} i1}
|
| +do_test like-3.4.4 {
|
| + queryplan {
|
| + SELECT x FROM t1 WHERE x LIKE 'abcd' ORDER BY 1;
|
| + }
|
| +} {abcd nosort {} i1}
|
| +do_test like-3.4.5 {
|
| + queryplan {
|
| + SELECT x FROM t1 WHERE x LIKE 'abcde' ORDER BY 1;
|
| + }
|
| +} {nosort {} i1}
|
| +
|
| +
|
| # Partial optimization when the pattern does not end in '%'
|
| #
|
| do_test like-3.5 {
|
| @@ -309,6 +334,26 @@ do_test like-3.24 {
|
| set sqlite_like_count
|
| } 6
|
|
|
| +# GLOB optimization when there is no wildcard. Ticket [e090183531fc2747]
|
| +#
|
| +do_test like-3.25 {
|
| + queryplan {
|
| + SELECT x FROM t1 WHERE x GLOB 'a' ORDER BY 1;
|
| + }
|
| +} {a nosort {} i1}
|
| +do_test like-3.26 {
|
| + queryplan {
|
| + SELECT x FROM t1 WHERE x GLOB 'abcd' ORDER BY 1;
|
| + }
|
| +} {abcd nosort {} i1}
|
| +do_test like-3.27 {
|
| + queryplan {
|
| + SELECT x FROM t1 WHERE x GLOB 'abcde' ORDER BY 1;
|
| + }
|
| +} {nosort {} i1}
|
| +
|
| +
|
| +
|
| # No optimization if the LHS of the LIKE is not a column name or
|
| # if the RHS is not a string.
|
| #
|
| @@ -563,7 +608,7 @@ do_test like-8.4 {
|
| } {1 abcdef 1 ghijkl 1 mnopqr 2 abcdef 2 ghijkl 2 mnopqr}
|
|
|
|
|
| -ifcapable like_opt {
|
| +ifcapable like_opt&&!icu {
|
| # Evaluate SQL. Return the result set followed by the
|
| # and the number of full-scan steps.
|
| #
|
| @@ -628,110 +673,199 @@ ifcapable like_opt {
|
| regexp {INDEX i2} $res
|
| } {1}
|
| }
|
| -}
|
|
|
| -# Do an SQL statement. Append the search count to the end of the result.
|
| -#
|
| -proc count sql {
|
| - set ::sqlite_search_count 0
|
| - set ::sqlite_like_count 0
|
| - return [concat [execsql $sql] scan $::sqlite_search_count \
|
| - like $::sqlite_like_count]
|
| + # Do an SQL statement. Append the search count to the end of the result.
|
| + #
|
| + proc count sql {
|
| + set ::sqlite_search_count 0
|
| + set ::sqlite_like_count 0
|
| + return [concat [execsql $sql] scan $::sqlite_search_count \
|
| + like $::sqlite_like_count]
|
| + }
|
| +
|
| + # The LIKE and GLOB optimizations do not work on columns with
|
| + # affinity other than TEXT.
|
| + # Ticket #3901
|
| + #
|
| + do_test like-10.1 {
|
| + db close
|
| + sqlite3 db test.db
|
| + execsql {
|
| + CREATE TABLE t10(
|
| + a INTEGER PRIMARY KEY,
|
| + b INTEGER COLLATE nocase UNIQUE,
|
| + c NUMBER COLLATE nocase UNIQUE,
|
| + d BLOB COLLATE nocase UNIQUE,
|
| + e COLLATE nocase UNIQUE,
|
| + f TEXT COLLATE nocase UNIQUE
|
| + );
|
| + INSERT INTO t10 VALUES(1,1,1,1,1,1);
|
| + INSERT INTO t10 VALUES(12,12,12,12,12,12);
|
| + INSERT INTO t10 VALUES(123,123,123,123,123,123);
|
| + INSERT INTO t10 VALUES(234,234,234,234,234,234);
|
| + INSERT INTO t10 VALUES(345,345,345,345,345,345);
|
| + INSERT INTO t10 VALUES(45,45,45,45,45,45);
|
| + }
|
| + count {
|
| + SELECT a FROM t10 WHERE b LIKE '12%' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| + do_test like-10.2 {
|
| + count {
|
| + SELECT a FROM t10 WHERE c LIKE '12%' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| + do_test like-10.3 {
|
| + count {
|
| + SELECT a FROM t10 WHERE d LIKE '12%' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| + do_test like-10.4 {
|
| + count {
|
| + SELECT a FROM t10 WHERE e LIKE '12%' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| + do_test like-10.5 {
|
| + count {
|
| + SELECT a FROM t10 WHERE f LIKE '12%' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 3 like 0}
|
| + do_test like-10.6 {
|
| + count {
|
| + SELECT a FROM t10 WHERE a LIKE '12%' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| + do_test like-10.10 {
|
| + execsql {
|
| + CREATE TABLE t10b(
|
| + a INTEGER PRIMARY KEY,
|
| + b INTEGER UNIQUE,
|
| + c NUMBER UNIQUE,
|
| + d BLOB UNIQUE,
|
| + e UNIQUE,
|
| + f TEXT UNIQUE
|
| + );
|
| + INSERT INTO t10b SELECT * FROM t10;
|
| + }
|
| + count {
|
| + SELECT a FROM t10b WHERE b GLOB '12*' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| + do_test like-10.11 {
|
| + count {
|
| + SELECT a FROM t10b WHERE c GLOB '12*' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| + do_test like-10.12 {
|
| + count {
|
| + SELECT a FROM t10b WHERE d GLOB '12*' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| + do_test like-10.13 {
|
| + count {
|
| + SELECT a FROM t10b WHERE e GLOB '12*' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| + do_test like-10.14 {
|
| + count {
|
| + SELECT a FROM t10b WHERE f GLOB '12*' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 3 like 0}
|
| + do_test like-10.15 {
|
| + count {
|
| + SELECT a FROM t10b WHERE a GLOB '12*' ORDER BY +a;
|
| + }
|
| + } {12 123 scan 5 like 6}
|
| }
|
|
|
| -# The LIKE and GLOB optimizations do not work on columns with
|
| -# affinity other than TEXT.
|
| -# Ticket #3901
|
| +# LIKE and GLOB where the default collating sequence is not appropriate
|
| +# but an index with the appropriate collating sequence exists.
|
| #
|
| -do_test like-10.1 {
|
| - db close
|
| - sqlite3 db test.db
|
| - execsql {
|
| - CREATE TABLE t10(
|
| - a INTEGER PRIMARY KEY,
|
| - b INTEGER COLLATE nocase UNIQUE,
|
| - c NUMBER COLLATE nocase UNIQUE,
|
| - d BLOB COLLATE nocase UNIQUE,
|
| - e COLLATE nocase UNIQUE,
|
| - f TEXT COLLATE nocase UNIQUE
|
| - );
|
| - INSERT INTO t10 VALUES(1,1,1,1,1,1);
|
| - INSERT INTO t10 VALUES(12,12,12,12,12,12);
|
| - INSERT INTO t10 VALUES(123,123,123,123,123,123);
|
| - INSERT INTO t10 VALUES(234,234,234,234,234,234);
|
| - INSERT INTO t10 VALUES(345,345,345,345,345,345);
|
| - INSERT INTO t10 VALUES(45,45,45,45,45,45);
|
| - }
|
| - count {
|
| - SELECT a FROM t10 WHERE b LIKE '12%' ORDER BY a;
|
| - }
|
| -} {12 123 scan 5 like 6}
|
| -do_test like-10.2 {
|
| - count {
|
| - SELECT a FROM t10 WHERE c LIKE '12%' ORDER BY a;
|
| - }
|
| -} {12 123 scan 5 like 6}
|
| -do_test like-10.3 {
|
| - count {
|
| - SELECT a FROM t10 WHERE d LIKE '12%' ORDER BY a;
|
| - }
|
| -} {12 123 scan 5 like 6}
|
| -do_test like-10.4 {
|
| - count {
|
| - SELECT a FROM t10 WHERE e LIKE '12%' ORDER BY a;
|
| - }
|
| -} {12 123 scan 5 like 6}
|
| -do_test like-10.5 {
|
| - count {
|
| - SELECT a FROM t10 WHERE f LIKE '12%' ORDER BY a;
|
| - }
|
| -} {12 123 scan 3 like 0}
|
| -do_test like-10.6 {
|
| - count {
|
| - SELECT a FROM t10 WHERE a LIKE '12%' ORDER BY a;
|
| - }
|
| -} {12 123 scan 5 like 6}
|
| -do_test like-10.10 {
|
| +do_test like-11.0 {
|
| execsql {
|
| - CREATE TABLE t10b(
|
| + CREATE TABLE t11(
|
| a INTEGER PRIMARY KEY,
|
| - b INTEGER UNIQUE,
|
| - c NUMBER UNIQUE,
|
| - d BLOB UNIQUE,
|
| - e UNIQUE,
|
| - f TEXT UNIQUE
|
| + b TEXT COLLATE nocase,
|
| + c TEXT COLLATE binary
|
| );
|
| - INSERT INTO t10b SELECT * FROM t10;
|
| + INSERT INTO t11 VALUES(1, 'a','a');
|
| + INSERT INTO t11 VALUES(2, 'ab','ab');
|
| + INSERT INTO t11 VALUES(3, 'abc','abc');
|
| + INSERT INTO t11 VALUES(4, 'abcd','abcd');
|
| + INSERT INTO t11 VALUES(5, 'A','A');
|
| + INSERT INTO t11 VALUES(6, 'AB','AB');
|
| + INSERT INTO t11 VALUES(7, 'ABC','ABC');
|
| + INSERT INTO t11 VALUES(8, 'ABCD','ABCD');
|
| + INSERT INTO t11 VALUES(9, 'x','x');
|
| + INSERT INTO t11 VALUES(10, 'yz','yz');
|
| + INSERT INTO t11 VALUES(11, 'X','X');
|
| + INSERT INTO t11 VALUES(12, 'YZ','YZ');
|
| + SELECT count(*) FROM t11;
|
| }
|
| - count {
|
| - SELECT a FROM t10b WHERE b GLOB '12*' ORDER BY a;
|
| +} {12}
|
| +do_test like-11.1 {
|
| + 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 {
|
| + queryplan {
|
| + PRAGMA case_sensitive_like=ON;
|
| + SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY a;
|
| }
|
| -} {12 123 scan 5 like 6}
|
| -do_test like-10.11 {
|
| - count {
|
| - SELECT a FROM t10b WHERE c GLOB '12*' ORDER BY a;
|
| +} {abc abcd nosort t11 *}
|
| +do_test like-11.3 {
|
| + queryplan {
|
| + PRAGMA case_sensitive_like=OFF;
|
| + CREATE INDEX t11b ON t11(b);
|
| + SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a;
|
| }
|
| -} {12 123 scan 5 like 6}
|
| -do_test like-10.12 {
|
| - count {
|
| - SELECT a FROM t10b WHERE d GLOB '12*' ORDER BY a;
|
| +} {abc abcd ABC ABCD sort {} t11b}
|
| +do_test like-11.4 {
|
| + queryplan {
|
| + PRAGMA case_sensitive_like=ON;
|
| + SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY a;
|
| }
|
| -} {12 123 scan 5 like 6}
|
| -do_test like-10.13 {
|
| - count {
|
| - SELECT a FROM t10b WHERE e GLOB '12*' ORDER BY a;
|
| +} {abc abcd nosort t11 *}
|
| +do_test like-11.5 {
|
| + queryplan {
|
| + PRAGMA case_sensitive_like=OFF;
|
| + DROP INDEX t11b;
|
| + CREATE INDEX t11bnc ON t11(b COLLATE nocase);
|
| + SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a;
|
| }
|
| -} {12 123 scan 5 like 6}
|
| -do_test like-10.14 {
|
| - count {
|
| - SELECT a FROM t10b WHERE f GLOB '12*' ORDER BY a;
|
| +} {abc abcd ABC ABCD sort {} t11bnc}
|
| +do_test like-11.6 {
|
| + queryplan {
|
| + CREATE INDEX t11bb ON t11(b COLLATE binary);
|
| + SELECT b FROM t11 WHERE b LIKE 'abc%' ORDER BY +a;
|
| }
|
| -} {12 123 scan 3 like 0}
|
| -do_test like-10.15 {
|
| - count {
|
| - SELECT a FROM t10b WHERE a GLOB '12*' ORDER BY a;
|
| +} {abc abcd ABC ABCD sort {} t11bnc}
|
| +do_test like-11.7 {
|
| + 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 {
|
| + 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 {
|
| + CREATE INDEX t11cnc ON t11(c COLLATE nocase);
|
| + CREATE INDEX t11cb ON t11(c COLLATE binary);
|
| + SELECT c FROM t11 WHERE c LIKE 'abc%' ORDER BY +a;
|
| + }
|
| +} {abc abcd ABC ABCD sort {} t11cnc}
|
| +do_test like-11.10 {
|
| + queryplan {
|
| + SELECT c FROM t11 WHERE c GLOB 'abc*' ORDER BY +a;
|
| }
|
| -} {12 123 scan 5 like 6}
|
| +} {abc abcd sort {} t11cb}
|
|
|
|
|
| finish_test
|
|
|