| Index: third_party/sqlite/src/test/vtab1.test | 
| diff --git a/third_party/sqlite/src/test/vtab1.test b/third_party/sqlite/src/test/vtab1.test | 
| index a9aca503c445e6597425d1bb34b713cf088f3532..0542ee6fdda3f0241bd2bccae7b02b407cc9c4ab 100644 | 
| --- a/third_party/sqlite/src/test/vtab1.test | 
| +++ b/third_party/sqlite/src/test/vtab1.test | 
| @@ -15,6 +15,7 @@ | 
|  | 
| set testdir [file dirname $argv0] | 
| source $testdir/tester.tcl | 
| +set testprefix vtab1 | 
|  | 
| ifcapable !vtab||!schema_pragmas { | 
| finish_test | 
| @@ -43,6 +44,9 @@ ifcapable !vtab||!schema_pragmas { | 
| # | 
| # vtab1-14.*: Test 'IN' constraints - i.e. "SELECT * FROM t1 WHERE id IN(...)" | 
| # | 
| +# vtab1-18.*: Check that the LIKE optimization is not applied when the lhs | 
| +#             is a virtual table column. | 
| +# | 
|  | 
|  | 
| #---------------------------------------------------------------------- | 
| @@ -51,7 +55,7 @@ ifcapable !vtab||!schema_pragmas { | 
|  | 
| # We cannot create a virtual table if the module has not been registered. | 
| # | 
| -do_test vtab1-1.1 { | 
| +do_test vtab1-1.1.1 { | 
| explain { | 
| CREATE VIRTUAL TABLE t1 USING echo; | 
| } | 
| @@ -59,6 +63,11 @@ do_test vtab1-1.1 { | 
| CREATE VIRTUAL TABLE t1 USING echo; | 
| } | 
| } {1 {no such module: echo}} | 
| +do_test vtab1-1.1.2 { | 
| +  catchsql { | 
| +    CREATE VIRTUAL TABLE IF NOT EXISTS t1 USING echo; | 
| +  } | 
| +} {1 {no such module: echo}} | 
| do_test vtab1-1.2 { | 
| execsql { | 
| SELECT name FROM sqlite_master ORDER BY 1 | 
| @@ -75,11 +84,16 @@ register_echo_module [sqlite3_connection_pointer db] | 
| # The "echo" module does not invoke sqlite3_declare_vtab() if it is | 
| # passed zero arguments. | 
| # | 
| -do_test vtab1-1.3 { | 
| +do_test vtab1-1.3.1 { | 
| catchsql { | 
| CREATE VIRTUAL TABLE t1 USING echo; | 
| } | 
| } {1 {vtable constructor did not declare schema: t1}} | 
| +do_test vtab1-1.3.2 { | 
| +  catchsql { | 
| +    CREATE VIRTUAL TABLE IF NOT EXISTS t1 USING echo; | 
| +  } | 
| +} {1 {vtable constructor did not declare schema: t1}} | 
| do_test vtab1-1.4 { | 
| execsql { | 
| SELECT name FROM sqlite_master ORDER BY 1 | 
| @@ -90,11 +104,16 @@ do_test vtab1-1.4 { | 
| # the virtual table if it is passed an argument that does not correspond | 
| # to an existing real table in the same database. | 
| # | 
| -do_test vtab1-1.5 { | 
| +do_test vtab1-1.5.1 { | 
| catchsql { | 
| CREATE VIRTUAL TABLE t1 USING echo(no_such_table); | 
| } | 
| } {1 {vtable constructor failed: t1}} | 
| +do_test vtab1-1.5.2 { | 
| +  catchsql { | 
| +    CREATE VIRTUAL TABLE IF NOT EXISTS t1 USING echo(no_such_table); | 
| +  } | 
| +} {1 {vtable constructor failed: t1}} | 
| do_test vtab1-1.6 { | 
| execsql { | 
| SELECT name FROM sqlite_master ORDER BY 1 | 
| @@ -128,17 +147,27 @@ do_test vtab-1.2152.4 { | 
| # select an illegal table-name (i.e a reserved name or the name of a | 
| # table that already exists). | 
| # | 
| -do_test vtab1-1.7 { | 
| +do_test vtab1-1.7.1 { | 
| catchsql { | 
| CREATE VIRTUAL TABLE sqlite_master USING echo; | 
| } | 
| } {1 {object name reserved for internal use: sqlite_master}} | 
| -do_test vtab1-1.8 { | 
| +do_test vtab1-1.7.2 { | 
| +  catchsql { | 
| +    CREATE VIRTUAL TABLE IF NOT EXISTS sqlite_master USING echo; | 
| +  } | 
| +} {1 {object name reserved for internal use: sqlite_master}} | 
| +do_test vtab1-1.8.1 { | 
| catchsql { | 
| CREATE TABLE treal(a, b, c); | 
| CREATE VIRTUAL TABLE treal USING echo(treal); | 
| } | 
| } {1 {table treal already exists}} | 
| +do_test vtab1-1.8.2 { | 
| +  catchsql { | 
| +    CREATE VIRTUAL TABLE IF NOT EXISTS treal USING echo(treal); | 
| +  } | 
| +} {0 {}} | 
| do_test vtab1-1.9 { | 
| execsql { | 
| DROP TABLE treal; | 
| @@ -589,8 +618,9 @@ do_test vtab1-5-6 { | 
| do_test vtab1-5-7 { | 
| filter $::echo_module | 
| } [list \ | 
| -  xFilter {SELECT rowid, * FROM 't2' WHERE d = ?} \ | 
| xFilter {SELECT rowid, * FROM 't1'}             \ | 
| +  xFilter {SELECT rowid, * FROM 't2' WHERE d = ?} \ | 
| +  xFilter {SELECT rowid, * FROM 't2' WHERE d = ?} \ | 
| ] | 
|  | 
| execsql { | 
| @@ -724,8 +754,8 @@ do_test vtab1-6-8.4 { | 
| } {} | 
| execsql {PRAGMA count_changes=OFF} | 
|  | 
| -file delete -force test2.db | 
| -file delete -force test2.db-journal | 
| +forcedelete test2.db | 
| +forcedelete test2.db-journal | 
| sqlite3 db2 test2.db | 
| execsql { | 
| CREATE TABLE techo(a PRIMARY KEY, b, c); | 
| @@ -1010,10 +1040,10 @@ do_test vtab1.12-1 { | 
| # First test outside of a transaction. | 
| do_test vtab1.12-2 { | 
| catchsql { INSERT INTO echo_c SELECT * FROM b; } | 
| -} {1 {echo-vtab-error: column a is not unique}} | 
| +} {1 {echo-vtab-error: UNIQUE constraint failed: c.a}} | 
| do_test vtab1.12-2.1 { | 
| sqlite3_errmsg db | 
| -} {echo-vtab-error: column a is not unique} | 
| +} {echo-vtab-error: UNIQUE constraint failed: c.a} | 
| do_test vtab1.12-3 { | 
| execsql { SELECT * FROM c } | 
| } {3 G H} | 
| @@ -1022,7 +1052,7 @@ do_test vtab1.12-3 { | 
| do_test vtab1.12-4 { | 
| execsql  {BEGIN} | 
| catchsql { INSERT INTO echo_c SELECT * FROM b; } | 
| -} {1 {echo-vtab-error: column a is not unique}} | 
| +} {1 {echo-vtab-error: UNIQUE constraint failed: c.a}} | 
| do_test vtab1.12-5 { | 
| execsql { SELECT * FROM c } | 
| } {3 G H} | 
| @@ -1062,12 +1092,54 @@ do_test vtab1.13-3 { | 
| } {15 {} 16} | 
|  | 
|  | 
| -do_test vtab1-14.1 { | 
| -  execsql { DELETE FROM c } | 
| -  set echo_module "" | 
| -  execsql { SELECT * FROM echo_c WHERE rowid IN (1, 2, 3) } | 
| -  set echo_module | 
| -} [list xBestIndex {SELECT rowid, * FROM 'c'} xFilter {SELECT rowid, * FROM 'c'}] | 
| +do_test vtab1-14.001 { | 
| +  execsql {SELECT rowid, * FROM echo_c WHERE +rowid IN (1,2,3)} | 
| +} {1 3 G H 2 {} 15 16 3 15 {} 16} | 
| +do_test vtab1-14.002 { | 
| +  execsql {SELECT rowid, * FROM echo_c WHERE rowid IN (1,2,3)} | 
| +} {1 3 G H 2 {} 15 16 3 15 {} 16} | 
| +do_test vtab1-14.003 { | 
| +  execsql {SELECT rowid, * FROM echo_c WHERE +rowid IN (0,1,5,2,'a',3,NULL)} | 
| +} {1 3 G H 2 {} 15 16 3 15 {} 16} | 
| +do_test vtab1-14.004 { | 
| +  execsql {SELECT rowid, * FROM echo_c WHERE rowid IN (0,1,5,'a',2,3,NULL)} | 
| +} {1 3 G H 2 {} 15 16 3 15 {} 16} | 
| +do_test vtab1-14.005 { | 
| +  execsql {SELECT rowid, * FROM echo_c WHERE rowid NOT IN (0,1,5,'a',2,3)} | 
| +} {} | 
| +do_test vtab1-14.006 { | 
| +  execsql {SELECT rowid, * FROM echo_c WHERE rowid NOT IN (0,5,'a',2,3)} | 
| +} {1 3 G H} | 
| +do_test vtab1-14.007 { | 
| +  execsql {SELECT rowid, * FROM echo_c WHERE +rowid NOT IN (0,5,'a',2,3,NULL)} | 
| +} {} | 
| +do_test vtab1-14.008 { | 
| +  execsql {SELECT rowid, * FROM echo_c WHERE rowid NOT IN (0,5,'a',2,3,NULL)} | 
| +} {} | 
| +do_test vtab1-14.011 { | 
| +  execsql {SELECT * FROM echo_c WHERE +a IN (1,3,8,'x',NULL,15,24)} | 
| +} {3 G H 15 {} 16} | 
| +do_test vtab1-14.012 { | 
| +  execsql {SELECT * FROM echo_c WHERE a IN (1,3,8,'x',NULL,15,24)} | 
| +} {3 G H 15 {} 16} | 
| +do_test vtab1-14.013 { | 
| +  execsql {SELECT * FROM echo_c WHERE a NOT IN (1,8,'x',15,24)} | 
| +} {3 G H} | 
| +do_test vtab1-14.014 { | 
| +  execsql {SELECT * FROM echo_c WHERE a NOT IN (1,8,'x',NULL,15,24)} | 
| +} {} | 
| +do_test vtab1-14.015 { | 
| +  execsql {SELECT * FROM echo_c WHERE +a NOT IN (1,8,'x',NULL,15,24)} | 
| +} {} | 
| + | 
| + | 
| + | 
| +#do_test vtab1-14.1 { | 
| +#  execsql { DELETE FROM c } | 
| +#  set echo_module "" | 
| +#  execsql { SELECT * FROM echo_c WHERE rowid IN (1, 2, 3) } | 
| +#  set echo_module | 
| +#} {/.*xBestIndex {SELECT rowid, . FROM 'c' WHERE rowid = .} xFilter {SELECT rowid, . FROM 'c'} 1/} | 
|  | 
| do_test vtab1-14.2 { | 
| set echo_module "" | 
| @@ -1081,11 +1153,11 @@ do_test vtab1-14.3 { | 
| set echo_module | 
| } [list xBestIndex {SELECT rowid, * FROM 'c' WHERE a = ?} xFilter {SELECT rowid, * FROM 'c' WHERE a = ?} 1] | 
|  | 
| -do_test vtab1-14.4 { | 
| -  set echo_module "" | 
| -  execsql { SELECT * FROM echo_c WHERE a IN (1, 2) } | 
| -  set echo_module | 
| -} [list xBestIndex {SELECT rowid, * FROM 'c'} xFilter {SELECT rowid, * FROM 'c'}] | 
| +#do_test vtab1-14.4 { | 
| +#  set echo_module "" | 
| +#  execsql { SELECT * FROM echo_c WHERE a IN (1, 2) } | 
| +#  set echo_module | 
| +#} {/xBestIndex {SELECT rowid, . FROM 'c' WHERE a = .} xFilter {SELECT rowid, . FROM 'c' WHERE a = .} 1/} | 
|  | 
| do_test vtab1-15.1 { | 
| execsql { | 
| @@ -1178,5 +1250,149 @@ do_test vtab1-17.1 { | 
| catchsql { CREATE VIRTUAL TABLE t4 USING echo(t3); } | 
| } {1 {vtable constructor failed: t4}} | 
|  | 
| +# This test verifies that ticket 48f29963 is fixed. | 
| +# | 
| +do_test vtab1-17.1 { | 
| +  execsql { | 
| +    CREATE TABLE t5(a, b); | 
| +    CREATE VIRTUAL TABLE e5 USING echo_v2(t5); | 
| +    BEGIN; | 
| +      INSERT INTO e5 VALUES(1, 2); | 
| +      DROP TABLE e5; | 
| +      SAVEPOINT one; | 
| +      ROLLBACK TO one; | 
| +    COMMIT; | 
| +  } | 
| +} {} | 
| + | 
| +do_test vtab1-17.2 { | 
| +  execsql { DELETE FROM sqlite_master WHERE sql LIKE 'insert%' } | 
| +} {} | 
| + | 
| +#------------------------------------------------------------------------- | 
| +# The following tests - vtab1-18.* - test that the optimization of LIKE | 
| +# constraints in where.c plays well with virtual tables. | 
| +# | 
| +#   18.1.*: Case-insensitive LIKE. | 
| +#   18.2.*: Case-sensitive LIKE. | 
| +# | 
| unset -nocomplain echo_module_begin_fail | 
| + | 
| +do_execsql_test 18.1.0 { | 
| +  CREATE TABLE t6(a, b TEXT); | 
| +  CREATE INDEX i6 ON t6(b, a); | 
| +  INSERT INTO t6 VALUES(1, 'Peter'); | 
| +  INSERT INTO t6 VALUES(2, 'Andrew'); | 
| +  INSERT INTO t6 VALUES(3, 'James'); | 
| +  INSERT INTO t6 VALUES(4, 'John'); | 
| +  INSERT INTO t6 VALUES(5, 'Phillip'); | 
| +  INSERT INTO t6 VALUES(6, 'Bartholomew'); | 
| +  CREATE VIRTUAL TABLE e6 USING echo(t6); | 
| +} | 
| + | 
| +foreach {tn sql res filter} { | 
| +  1.1 "SELECT a FROM e6 WHERE b>'James'" {4 1 5} | 
| +    {xFilter {SELECT rowid, * FROM 't6' WHERE b > ?} James} | 
| + | 
| +  1.2 "SELECT a FROM e6 WHERE b>='J' AND b<'K'" {3 4} | 
| +    {xFilter {SELECT rowid, * FROM 't6' WHERE b >= ? AND b < ?} J K} | 
| + | 
| +  1.3 "SELECT a FROM e6 WHERE b LIKE 'J%'" {3 4} | 
| +    {xFilter {SELECT rowid, * FROM 't6'}} | 
| + | 
| +  1.4 "SELECT a FROM e6 WHERE b LIKE 'j%'" {3 4} | 
| +    {xFilter {SELECT rowid, * FROM 't6'}} | 
| +} { | 
| +  set echo_module {} | 
| +  do_execsql_test 18.$tn.1 $sql $res | 
| +  do_test         18.$tn.2 { lrange $::echo_module 2 end } $filter | 
| +} | 
| + | 
| +do_execsql_test 18.2.0 {  PRAGMA case_sensitive_like = ON } | 
| +foreach {tn sql res filter} { | 
| +  2.1 "SELECT a FROM e6 WHERE b LIKE 'J%'" {3 4} | 
| +    {xFilter {SELECT rowid, * FROM 't6'}} | 
| + | 
| +  2.2 "SELECT a FROM e6 WHERE b LIKE 'j%'" {} | 
| +    {xFilter {SELECT rowid, * FROM 't6'}} | 
| +} { | 
| +  set echo_module {} | 
| +  do_execsql_test 18.$tn.1 $sql $res | 
| +  do_test         18.$tn.2 { lrange $::echo_module 2 end } $filter | 
| +} | 
| +do_execsql_test 18.2.x {  PRAGMA case_sensitive_like = OFF } | 
| + | 
| +#------------------------------------------------------------------------- | 
| +# Test that an existing module may not be overridden. | 
| +# | 
| +do_test 19.1 { | 
| +  sqlite3 db2 test.db | 
| +  register_echo_module [sqlite3_connection_pointer db2] | 
| +} SQLITE_OK | 
| +do_test 19.2 { | 
| +  register_echo_module [sqlite3_connection_pointer db2] | 
| +} SQLITE_MISUSE | 
| +do_test 19.3 { | 
| +  db2 close | 
| +} {} | 
| + | 
| +#------------------------------------------------------------------------- | 
| +# Test that the bug fixed by [b0c1ba655d69] really is fixed. | 
| +# | 
| +do_execsql_test 20.1 { | 
| +  CREATE TABLE t7 (a, b); | 
| +  CREATE TABLE t8 (c, d); | 
| +  CREATE INDEX i2 ON t7(a); | 
| +  CREATE INDEX i3 ON t7(b); | 
| +  CREATE INDEX i4 ON t8(c); | 
| +  CREATE INDEX i5 ON t8(d); | 
| + | 
| +  CREATE VIRTUAL TABLE t7v USING echo(t7); | 
| +  CREATE VIRTUAL TABLE t8v USING echo(t8); | 
| +} | 
| + | 
| +do_test 20.2 { | 
| +  for {set i 0} {$i < 1000} {incr i} { | 
| +    db eval {INSERT INTO t7 VALUES($i, $i)} | 
| +    db eval {INSERT INTO t8 VALUES($i, $i)} | 
| +  } | 
| +} {} | 
| + | 
| +do_execsql_test 20.3 { | 
| +  SELECT a, b FROM ( | 
| +      SELECT a, b FROM t7 WHERE a=11 OR b=12 | 
| +      UNION ALL | 
| +      SELECT c, d FROM t8 WHERE c=5 OR d=6 | 
| +  ) | 
| +  ORDER BY 1, 2; | 
| +} {5 5 6 6 11 11 12 12} | 
| + | 
| +do_execsql_test 20.4 { | 
| +  SELECT a, b FROM ( | 
| +      SELECT a, b FROM t7v WHERE a=11 OR b=12 | 
| +      UNION ALL | 
| +      SELECT c, d FROM t8v WHERE c=5 OR d=6 | 
| +  ) | 
| +  ORDER BY 1, 2; | 
| +} {5 5 6 6 11 11 12 12} | 
| + | 
| +#------------------------------------------------------------------------- | 
| +# | 
| +do_execsql_test 21.1 { | 
| +  CREATE TABLE t9(a,b,c); | 
| +  CREATE VIRTUAL TABLE t9v USING echo(t9); | 
| + | 
| +  INSERT INTO t9 VALUES(1,2,3); | 
| +  INSERT INTO t9 VALUES(3,2,1); | 
| +  INSERT INTO t9 VALUES(2,2,2); | 
| +} | 
| + | 
| +do_execsql_test 21.2 { | 
| +  SELECT * FROM t9v WHERE a<b; | 
| +} {1 2 3} | 
| + | 
| +do_execsql_test 21.3 { | 
| +  SELECT * FROM t9v WHERE a=b; | 
| +} {2 2 2} | 
| + | 
| finish_test | 
|  |