Index: third_party/sqlite/src/ext/fts5/fts5parse.y |
diff --git a/third_party/sqlite/src/ext/fts5/fts5parse.y b/third_party/sqlite/src/ext/fts5/fts5parse.y |
index 0e81771b4f1bf2184e459c6e7b9503107eee5fee..1cc4b88e18de6b8e564a097d789d8ca52bf63129 100644 |
--- a/third_party/sqlite/src/ext/fts5/fts5parse.y |
+++ b/third_party/sqlite/src/ext/fts5/fts5parse.y |
@@ -28,12 +28,13 @@ |
// This code runs whenever there is a syntax error |
// |
%syntax_error { |
+ UNUSED_PARAM(yymajor); /* Silence a compiler warning */ |
sqlite3Fts5ParseError( |
pParse, "fts5: syntax error near \"%.*s\"",TOKEN.n,TOKEN.p |
); |
} |
%stack_overflow { |
- assert( 0 ); |
+ sqlite3Fts5ParseError(pParse, "fts5: parser stack overflow"); |
} |
// The name of the generated procedure that implements the parser |
@@ -103,7 +104,7 @@ expr(A) ::= exprlist(X). {A = X;} |
exprlist(A) ::= cnearset(X). {A = X;} |
exprlist(A) ::= exprlist(X) cnearset(Y). { |
- A = sqlite3Fts5ParseNode(pParse, FTS5_AND, X, Y, 0); |
+ A = sqlite3Fts5ParseImplicitAnd(pParse, X, Y); |
} |
cnearset(A) ::= nearset(X). { |
@@ -119,10 +120,17 @@ cnearset(A) ::= colset(X) COLON nearset(Y). { |
%type colsetlist {Fts5Colset*} |
%destructor colsetlist { sqlite3_free($$); } |
+colset(A) ::= MINUS LCP colsetlist(X) RCP. { |
+ A = sqlite3Fts5ParseColsetInvert(pParse, X); |
+} |
colset(A) ::= LCP colsetlist(X) RCP. { A = X; } |
colset(A) ::= STRING(X). { |
A = sqlite3Fts5ParseColset(pParse, 0, &X); |
} |
+colset(A) ::= MINUS STRING(X). { |
+ A = sqlite3Fts5ParseColset(pParse, 0, &X); |
+ A = sqlite3Fts5ParseColsetInvert(pParse, A); |
+} |
colsetlist(A) ::= colsetlist(Y) STRING(X). { |
A = sqlite3Fts5ParseColset(pParse, Y, &X); } |
@@ -130,7 +138,6 @@ colsetlist(A) ::= STRING(X). { |
A = sqlite3Fts5ParseColset(pParse, 0, &X); |
} |
- |
%type nearset {Fts5ExprNearset*} |
%type nearphrases {Fts5ExprNearset*} |
%destructor nearset { sqlite3Fts5ParseNearsetFree($$); } |