| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ** 2008 Nov 28 | |
| 3 ** | |
| 4 ** The author disclaims copyright to this source code. In place of | |
| 5 ** a legal notice, here is a blessing: | |
| 6 ** | |
| 7 ** May you do good and not evil. | |
| 8 ** May you find forgiveness for yourself and forgive others. | |
| 9 ** May you share freely, never taking more than you give. | |
| 10 ** | |
| 11 ****************************************************************************** | |
| 12 ** | |
| 13 */ | |
| 14 | |
| 15 #include "fts3_tokenizer.h" | |
| 16 #include "sqlite3.h" | |
| 17 | |
| 18 /* | |
| 19 ** The following describes the syntax supported by the fts3 MATCH | |
| 20 ** operator in a similar format to that used by the lemon parser | |
| 21 ** generator. This module does not use actually lemon, it uses a | |
| 22 ** custom parser. | |
| 23 ** | |
| 24 ** query ::= andexpr (OR andexpr)*. | |
| 25 ** | |
| 26 ** andexpr ::= notexpr (AND? notexpr)*. | |
| 27 ** | |
| 28 ** notexpr ::= nearexpr (NOT nearexpr|-TOKEN)*. | |
| 29 ** notexpr ::= LP query RP. | |
| 30 ** | |
| 31 ** nearexpr ::= phrase (NEAR distance_opt nearexpr)*. | |
| 32 ** | |
| 33 ** distance_opt ::= . | |
| 34 ** distance_opt ::= / INTEGER. | |
| 35 ** | |
| 36 ** phrase ::= TOKEN. | |
| 37 ** phrase ::= COLUMN:TOKEN. | |
| 38 ** phrase ::= "TOKEN TOKEN TOKEN...". | |
| 39 */ | |
| 40 | |
| 41 typedef struct Fts3Expr Fts3Expr; | |
| 42 typedef struct Fts3Phrase Fts3Phrase; | |
| 43 | |
| 44 /* | |
| 45 ** A "phrase" is a sequence of one or more tokens that must match in | |
| 46 ** sequence. A single token is the base case and the most common case. | |
| 47 ** For a sequence of tokens contained in "...", nToken will be the number | |
| 48 ** of tokens in the string. | |
| 49 */ | |
| 50 struct Fts3Phrase { | |
| 51 int nToken; /* Number of tokens in the phrase */ | |
| 52 int iColumn; /* Index of column this phrase must match */ | |
| 53 int isNot; /* Phrase prefixed by unary not (-) operator */ | |
| 54 struct PhraseToken { | |
| 55 char *z; /* Text of the token */ | |
| 56 int n; /* Number of bytes in buffer pointed to by z */ | |
| 57 int isPrefix; /* True if token ends in with a "*" character */ | |
| 58 } aToken[1]; /* One entry for each token in the phrase */ | |
| 59 }; | |
| 60 | |
| 61 /* | |
| 62 ** A tree of these objects forms the RHS of a MATCH operator. | |
| 63 */ | |
| 64 struct Fts3Expr { | |
| 65 int eType; /* One of the FTSQUERY_XXX values defined below */ | |
| 66 int nNear; /* Valid if eType==FTSQUERY_NEAR */ | |
| 67 Fts3Expr *pParent; /* pParent->pLeft==this or pParent->pRight==this */ | |
| 68 Fts3Expr *pLeft; /* Left operand */ | |
| 69 Fts3Expr *pRight; /* Right operand */ | |
| 70 Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */ | |
| 71 }; | |
| 72 | |
| 73 int sqlite3Fts3ExprParse(sqlite3_tokenizer *, char **, int, int, | |
| 74 const char *, int, Fts3Expr **); | |
| 75 void sqlite3Fts3ExprFree(Fts3Expr *); | |
| 76 | |
| 77 /* | |
| 78 ** Candidate values for Fts3Query.eType. Note that the order of the first | |
| 79 ** four values is in order of precedence when parsing expressions. For | |
| 80 ** example, the following: | |
| 81 ** | |
| 82 ** "a OR b AND c NOT d NEAR e" | |
| 83 ** | |
| 84 ** is equivalent to: | |
| 85 ** | |
| 86 ** "a OR (b AND (c NOT (d NEAR e)))" | |
| 87 */ | |
| 88 #define FTSQUERY_NEAR 1 | |
| 89 #define FTSQUERY_NOT 2 | |
| 90 #define FTSQUERY_AND 3 | |
| 91 #define FTSQUERY_OR 4 | |
| 92 #define FTSQUERY_PHRASE 5 | |
| 93 | |
| 94 #ifdef SQLITE_TEST | |
| 95 void sqlite3Fts3ExprInitTestInterface(sqlite3 *db); | |
| 96 #endif | |
| OLD | NEW |