| Index: third_party/sqlite/src/test/fts3matchinfo.test | 
| diff --git a/third_party/sqlite/src/test/fts3matchinfo.test b/third_party/sqlite/src/test/fts3matchinfo.test | 
| index 8f194e72cb38f078472393041643557474b4dca5..36c91211180e6f6b25078d0883fae0c2bc0fdb38 100644 | 
| --- a/third_party/sqlite/src/test/fts3matchinfo.test | 
| +++ b/third_party/sqlite/src/test/fts3matchinfo.test | 
| @@ -19,6 +19,7 @@ source $testdir/tester.tcl | 
| ifcapable !fts3 { finish_test ; return } | 
|  | 
| set testprefix fts3matchinfo | 
| +set sqlite_fts3_enable_parentheses 0 | 
|  | 
| proc mit {blob} { | 
| set scan(littleEndian) i* | 
| @@ -57,6 +58,9 @@ do_catchsql_test 2.0 { | 
| do_catchsql_test 2.1 { | 
| CREATE VIRTUAL TABLE x2 USING fts4(mtchinfo=fts3); | 
| } {1 {unrecognized parameter: mtchinfo=fts3}} | 
| +do_catchsql_test 2.2 { | 
| +  CREATE VIRTUAL TABLE x2 USING fts4(matchinfo=fts5); | 
| +} {1 {unrecognized matchinfo: fts5}} | 
|  | 
| # Check that with fts3, the "=" character is permitted in column definitions. | 
| # | 
| @@ -68,7 +72,11 @@ do_execsql_test 3.1 { | 
|  | 
| do_execsql_test 3.2 { | 
| CREATE VIRTUAL TABLE xx USING FTS4; | 
| +} | 
| +do_execsql_test 3.3 { | 
| SELECT * FROM xx WHERE xx MATCH 'abc'; | 
| +} | 
| +do_execsql_test 3.4 { | 
| SELECT * FROM xx WHERE xx MATCH 'a b c'; | 
| } | 
|  | 
| @@ -220,6 +228,18 @@ do_matchinfo_test 4.1.3 t4 {t4 MATCH 'a b'}     { s {{2 0} {0 2}} } | 
| do_matchinfo_test 4.1.4 t4 {t4 MATCH '"a b" c'} { s {{2 0} {0 2}} } | 
| do_matchinfo_test 4.1.5 t4 {t4 MATCH 'a "b c"'} { s {{2 0} {0 2}} } | 
| do_matchinfo_test 4.1.6 t4 {t4 MATCH 'd d'}     { s {{1 0} {0 1}} } | 
| +do_matchinfo_test 4.1.7 t4 {t4 MATCH 'f OR abcd'} { | 
| +  x { | 
| +    {0 1 1  1 1 1  0 0 0  0 0 0} | 
| +    {1 1 1  0 1 1  0 0 0  0 0 0} | 
| +  } | 
| +} | 
| +do_matchinfo_test 4.1.8 t4 {t4 MATCH 'f -abcd'} { | 
| +  x { | 
| +    {0 1 1  1 1 1} | 
| +    {1 1 1  0 1 1} | 
| +  } | 
| +} | 
|  | 
| do_execsql_test 4.2.0 { | 
| CREATE VIRTUAL TABLE t5 USING fts4; | 
| @@ -240,9 +260,13 @@ do_matchinfo_test 4.2.6 t5 {t5 MATCH 'a OR b'}      { s {1 2 1} } | 
|  | 
| do_execsql_test 4.3.0 "INSERT INTO t5 VALUES('x y [string repeat {b } 50000]')"; | 
|  | 
| -do_matchinfo_test 4.3.1 t5 {t5 MATCH 'a a'} { | 
| -  x {{5 8 2   5 5 5} {3 8 2   3 5 5}} | 
| -  s {2 1} | 
| +# It used to be that the second 'a' token would be deferred. That doesn't | 
| +# work any longer. | 
| +if 0 { | 
| +  do_matchinfo_test 4.3.1 t5 {t5 MATCH 'a a'} { | 
| +    x {{5 8 2   5 5 5} {3 8 2   3 5 5}} | 
| +    s {2 1} | 
| +  } | 
| } | 
|  | 
| do_matchinfo_test 4.3.2 t5 {t5 MATCH 'a b'}         { s {2} } | 
| @@ -251,11 +275,14 @@ do_matchinfo_test 4.3.4 t5 {t5 MATCH 'a a a'}       { s {3 1} } | 
| do_matchinfo_test 4.3.5 t5 {t5 MATCH '"a b" "a b"'} { s {2} } | 
| do_matchinfo_test 4.3.6 t5 {t5 MATCH 'a OR b'}      { s {1 2 1 1} } | 
|  | 
| -do_execsql_test 4.4.0 { | 
| -  INSERT INTO t5(t5) VALUES('optimize'); | 
| -  UPDATE t5_segments | 
| -  SET block = zeroblob(length(block)) | 
| -  WHERE length(block)>10000; | 
| +do_execsql_test 4.4.0.1 { INSERT INTO t5(t5) VALUES('optimize') } | 
| + | 
| +ifcapable fts4_deferred { | 
| +  do_execsql_test 4.4.0.2 { | 
| +    UPDATE t5_segments | 
| +    SET block = zeroblob(length(block)) | 
| +    WHERE length(block)>10000; | 
| +  } | 
| } | 
|  | 
| do_matchinfo_test 4.4.2 t5 {t5 MATCH 'a b'}         { s {2} } | 
| @@ -380,5 +407,47 @@ do_catchsql_test 8.5.3.2 { | 
| SELECT mit(matchinfo(t11, 'nxa')) FROM t11 WHERE t11 MATCH 'a*' | 
| } {1 {database disk image is malformed}} | 
|  | 
| -finish_test | 
| +#------------------------------------------------------------------------- | 
| +do_execsql_test 8.1 { | 
| +  CREATE VIRTUAL TABLE t12 USING fts4; | 
| +  INSERT INTO t12 VALUES('a b c d'); | 
| +  SELECT mit(matchinfo(t12, 'x')) FROM t12 WHERE t12 MATCH 'a NEAR/1 d OR a'; | 
| +} {{0 0 0 0 0 0 1 1 1}} | 
| +do_execsql_test 8.2 { | 
| +  INSERT INTO t12 VALUES('a d c d'); | 
| +  SELECT mit(matchinfo(t12, 'x')) FROM t12 WHERE t12 MATCH 'a NEAR/1 d OR a'; | 
| +} { | 
| +  {0 1 1 0 1 1 1 2 2} {1 1 1 1 1 1 1 2 2} | 
| +} | 
| +do_execsql_test 8.3 { | 
| +  INSERT INTO t12 VALUES('a d d a'); | 
| +  SELECT mit(matchinfo(t12, 'x')) FROM t12 WHERE t12 MATCH 'a NEAR/1 d OR a'; | 
| +} { | 
| +  {0 3 2 0 3 2 1 4 3} {1 3 2 1 3 2 1 4 3} {2 3 2 2 3 2 2 4 3} | 
| +} | 
| + | 
| +do_execsql_test 9.1 { | 
| +  CREATE VIRTUAL TABLE ft2 USING fts4; | 
| +  INSERT INTO ft2 VALUES('a b c d e'); | 
| +  INSERT INTO ft2 VALUES('f a b c d'); | 
| +  SELECT snippet(ft2, '[', ']', '', -1, 1) FROM ft2 WHERE ft2 MATCH 'c'; | 
| +} {{[c]} {[c]}} | 
|  | 
| +#--------------------------------------------------------------------------- | 
| +# Test for a memory leak | 
| +# | 
| +do_execsql_test 10.1 { | 
| +  DROP TABLE t10; | 
| +  CREATE VIRTUAL TABLE t10 USING fts4(idx, value); | 
| +  INSERT INTO t10 values (1, 'one'),(2, 'two'),(3, 'three'); | 
| +  SELECT docId, t10.* | 
| +    FROM t10 | 
| +    JOIN (SELECT 1 AS idx UNION SELECT 2 UNION SELECT 3) AS x | 
| +   WHERE t10 MATCH x.idx | 
| +     AND matchinfo(t10) not null | 
| +   GROUP BY docId | 
| +   ORDER BY 1; | 
| +} {1 1 one 2 2 two 3 3 three} | 
| + | 
| + | 
| +finish_test | 
|  |