| OLD | NEW |
| 1 /* | 1 /* |
| 2 ** 2009 Nov 12 | 2 ** 2009 Nov 12 |
| 3 ** | 3 ** |
| 4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
| 5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
| 6 ** | 6 ** |
| 7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
| 8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
| 9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
| 10 ** | 10 ** |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 ** amalgamation. | 127 ** amalgamation. |
| 128 */ | 128 */ |
| 129 #ifndef SQLITE_AMALGAMATION | 129 #ifndef SQLITE_AMALGAMATION |
| 130 /* | 130 /* |
| 131 ** Macros indicating that conditional expressions are always true or | 131 ** Macros indicating that conditional expressions are always true or |
| 132 ** false. | 132 ** false. |
| 133 */ | 133 */ |
| 134 #ifdef SQLITE_COVERAGE_TEST | 134 #ifdef SQLITE_COVERAGE_TEST |
| 135 # define ALWAYS(x) (1) | 135 # define ALWAYS(x) (1) |
| 136 # define NEVER(X) (0) | 136 # define NEVER(X) (0) |
| 137 #elif defined(SQLITE_DEBUG) |
| 138 # define ALWAYS(x) sqlite3Fts3Always((x)!=0) |
| 139 # define NEVER(x) sqlite3Fts3Never((x)!=0) |
| 140 int sqlite3Fts3Always(int b); |
| 141 int sqlite3Fts3Never(int b); |
| 137 #else | 142 #else |
| 138 # define ALWAYS(x) (x) | 143 # define ALWAYS(x) (x) |
| 139 # define NEVER(x) (x) | 144 # define NEVER(x) (x) |
| 140 #endif | 145 #endif |
| 141 | 146 |
| 142 /* | 147 /* |
| 143 ** Internal types used by SQLite. | 148 ** Internal types used by SQLite. |
| 144 */ | 149 */ |
| 145 typedef unsigned char u8; /* 1-byte (or larger) unsigned integer */ | 150 typedef unsigned char u8; /* 1-byte (or larger) unsigned integer */ |
| 146 typedef short int i16; /* 2-byte (or larger) signed integer */ | 151 typedef short int i16; /* 2-byte (or larger) signed integer */ |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 typedef struct Fts3Expr Fts3Expr; | 190 typedef struct Fts3Expr Fts3Expr; |
| 186 typedef struct Fts3Phrase Fts3Phrase; | 191 typedef struct Fts3Phrase Fts3Phrase; |
| 187 typedef struct Fts3PhraseToken Fts3PhraseToken; | 192 typedef struct Fts3PhraseToken Fts3PhraseToken; |
| 188 | 193 |
| 189 typedef struct Fts3Doclist Fts3Doclist; | 194 typedef struct Fts3Doclist Fts3Doclist; |
| 190 typedef struct Fts3SegFilter Fts3SegFilter; | 195 typedef struct Fts3SegFilter Fts3SegFilter; |
| 191 typedef struct Fts3DeferredToken Fts3DeferredToken; | 196 typedef struct Fts3DeferredToken Fts3DeferredToken; |
| 192 typedef struct Fts3SegReader Fts3SegReader; | 197 typedef struct Fts3SegReader Fts3SegReader; |
| 193 typedef struct Fts3MultiSegReader Fts3MultiSegReader; | 198 typedef struct Fts3MultiSegReader Fts3MultiSegReader; |
| 194 | 199 |
| 200 typedef struct MatchinfoBuffer MatchinfoBuffer; |
| 201 |
| 195 /* | 202 /* |
| 196 ** A connection to a fulltext index is an instance of the following | 203 ** A connection to a fulltext index is an instance of the following |
| 197 ** structure. The xCreate and xConnect methods create an instance | 204 ** structure. The xCreate and xConnect methods create an instance |
| 198 ** of this structure and xDestroy and xDisconnect free that instance. | 205 ** of this structure and xDestroy and xDisconnect free that instance. |
| 199 ** All other methods receive a pointer to the structure as one of their | 206 ** All other methods receive a pointer to the structure as one of their |
| 200 ** arguments. | 207 ** arguments. |
| 201 */ | 208 */ |
| 202 struct Fts3Table { | 209 struct Fts3Table { |
| 203 sqlite3_vtab base; /* Base class used by SQLite core */ | 210 sqlite3_vtab base; /* Base class used by SQLite core */ |
| 204 sqlite3 *db; /* The database connection */ | 211 sqlite3 *db; /* The database connection */ |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 */ | 257 */ |
| 251 int nIndex; /* Size of aIndex[] */ | 258 int nIndex; /* Size of aIndex[] */ |
| 252 struct Fts3Index { | 259 struct Fts3Index { |
| 253 int nPrefix; /* Prefix length (0 for main terms index) */ | 260 int nPrefix; /* Prefix length (0 for main terms index) */ |
| 254 Fts3Hash hPending; /* Pending terms table for this index */ | 261 Fts3Hash hPending; /* Pending terms table for this index */ |
| 255 } *aIndex; | 262 } *aIndex; |
| 256 int nMaxPendingData; /* Max pending data before flush to disk */ | 263 int nMaxPendingData; /* Max pending data before flush to disk */ |
| 257 int nPendingData; /* Current bytes of pending data */ | 264 int nPendingData; /* Current bytes of pending data */ |
| 258 sqlite_int64 iPrevDocid; /* Docid of most recently inserted document */ | 265 sqlite_int64 iPrevDocid; /* Docid of most recently inserted document */ |
| 259 int iPrevLangid; /* Langid of recently inserted document */ | 266 int iPrevLangid; /* Langid of recently inserted document */ |
| 267 int bPrevDelete; /* True if last operation was a delete */ |
| 260 | 268 |
| 261 #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) | 269 #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) |
| 262 /* State variables used for validating that the transaction control | 270 /* State variables used for validating that the transaction control |
| 263 ** methods of the virtual table are called at appropriate times. These | 271 ** methods of the virtual table are called at appropriate times. These |
| 264 ** values do not contribute to FTS functionality; they are used for | 272 ** values do not contribute to FTS functionality; they are used for |
| 265 ** verifying the operation of the SQLite core. | 273 ** verifying the operation of the SQLite core. |
| 266 */ | 274 */ |
| 267 int inTransaction; /* True after xBegin but before xCommit/xRollback */ | 275 int inTransaction; /* True after xBegin but before xCommit/xRollback */ |
| 268 int mxSavepoint; /* Largest valid xSavepoint integer */ | 276 int mxSavepoint; /* Largest valid xSavepoint integer */ |
| 269 #endif | 277 #endif |
| (...skipping 24 matching lines...) Expand all Loading... |
| 294 char *pNextId; /* Pointer into the body of aDoclist */ | 302 char *pNextId; /* Pointer into the body of aDoclist */ |
| 295 char *aDoclist; /* List of docids for full-text queries */ | 303 char *aDoclist; /* List of docids for full-text queries */ |
| 296 int nDoclist; /* Size of buffer at aDoclist */ | 304 int nDoclist; /* Size of buffer at aDoclist */ |
| 297 u8 bDesc; /* True to sort in descending order */ | 305 u8 bDesc; /* True to sort in descending order */ |
| 298 int eEvalmode; /* An FTS3_EVAL_XX constant */ | 306 int eEvalmode; /* An FTS3_EVAL_XX constant */ |
| 299 int nRowAvg; /* Average size of database rows, in pages */ | 307 int nRowAvg; /* Average size of database rows, in pages */ |
| 300 sqlite3_int64 nDoc; /* Documents in table */ | 308 sqlite3_int64 nDoc; /* Documents in table */ |
| 301 i64 iMinDocid; /* Minimum docid to return */ | 309 i64 iMinDocid; /* Minimum docid to return */ |
| 302 i64 iMaxDocid; /* Maximum docid to return */ | 310 i64 iMaxDocid; /* Maximum docid to return */ |
| 303 int isMatchinfoNeeded; /* True when aMatchinfo[] needs filling in */ | 311 int isMatchinfoNeeded; /* True when aMatchinfo[] needs filling in */ |
| 304 u32 *aMatchinfo; /* Information about most recent match */ | 312 MatchinfoBuffer *pMIBuffer; /* Buffer for matchinfo data */ |
| 305 int nMatchinfo; /* Number of elements in aMatchinfo[] */ | |
| 306 char *zMatchinfo; /* Matchinfo specification */ | |
| 307 }; | 313 }; |
| 308 | 314 |
| 309 #define FTS3_EVAL_FILTER 0 | 315 #define FTS3_EVAL_FILTER 0 |
| 310 #define FTS3_EVAL_NEXT 1 | 316 #define FTS3_EVAL_NEXT 1 |
| 311 #define FTS3_EVAL_MATCHINFO 2 | 317 #define FTS3_EVAL_MATCHINFO 2 |
| 312 | 318 |
| 313 /* | 319 /* |
| 314 ** The Fts3Cursor.eSearch member is always set to one of the following. | 320 ** The Fts3Cursor.eSearch member is always set to one of the following. |
| 315 ** Actualy, Fts3Cursor.eSearch can be greater than or equal to | 321 ** Actualy, Fts3Cursor.eSearch can be greater than or equal to |
| 316 ** FTS3_FULLTEXT_SEARCH. If so, then Fts3Cursor.eSearch - 2 is the index | 322 ** FTS3_FULLTEXT_SEARCH. If so, then Fts3Cursor.eSearch - 2 is the index |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 Fts3DeferredToken *pDeferred; /* Deferred token object for this token */ | 374 Fts3DeferredToken *pDeferred; /* Deferred token object for this token */ |
| 369 Fts3MultiSegReader *pSegcsr; /* Segment-reader for this token */ | 375 Fts3MultiSegReader *pSegcsr; /* Segment-reader for this token */ |
| 370 }; | 376 }; |
| 371 | 377 |
| 372 struct Fts3Phrase { | 378 struct Fts3Phrase { |
| 373 /* Cache of doclist for this phrase. */ | 379 /* Cache of doclist for this phrase. */ |
| 374 Fts3Doclist doclist; | 380 Fts3Doclist doclist; |
| 375 int bIncr; /* True if doclist is loaded incrementally */ | 381 int bIncr; /* True if doclist is loaded incrementally */ |
| 376 int iDoclistToken; | 382 int iDoclistToken; |
| 377 | 383 |
| 384 /* Used by sqlite3Fts3EvalPhrasePoslist() if this is a descendent of an |
| 385 ** OR condition. */ |
| 386 char *pOrPoslist; |
| 387 i64 iOrDocid; |
| 388 |
| 378 /* Variables below this point are populated by fts3_expr.c when parsing | 389 /* Variables below this point are populated by fts3_expr.c when parsing |
| 379 ** a MATCH expression. Everything above is part of the evaluation phase. | 390 ** a MATCH expression. Everything above is part of the evaluation phase. |
| 380 */ | 391 */ |
| 381 int nToken; /* Number of tokens in the phrase */ | 392 int nToken; /* Number of tokens in the phrase */ |
| 382 int iColumn; /* Index of column this phrase must match */ | 393 int iColumn; /* Index of column this phrase must match */ |
| 383 Fts3PhraseToken aToken[1]; /* One entry for each token in the phrase */ | 394 Fts3PhraseToken aToken[1]; /* One entry for each token in the phrase */ |
| 384 }; | 395 }; |
| 385 | 396 |
| 386 /* | 397 /* |
| 387 ** A tree of these objects forms the RHS of a MATCH operator. | 398 ** A tree of these objects forms the RHS of a MATCH operator. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 411 Fts3Expr *pLeft; /* Left operand */ | 422 Fts3Expr *pLeft; /* Left operand */ |
| 412 Fts3Expr *pRight; /* Right operand */ | 423 Fts3Expr *pRight; /* Right operand */ |
| 413 Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */ | 424 Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */ |
| 414 | 425 |
| 415 /* The following are used by the fts3_eval.c module. */ | 426 /* The following are used by the fts3_eval.c module. */ |
| 416 sqlite3_int64 iDocid; /* Current docid */ | 427 sqlite3_int64 iDocid; /* Current docid */ |
| 417 u8 bEof; /* True this expression is at EOF already */ | 428 u8 bEof; /* True this expression is at EOF already */ |
| 418 u8 bStart; /* True if iDocid is valid */ | 429 u8 bStart; /* True if iDocid is valid */ |
| 419 u8 bDeferred; /* True if this expression is entirely deferred */ | 430 u8 bDeferred; /* True if this expression is entirely deferred */ |
| 420 | 431 |
| 421 u32 *aMI; | 432 /* The following are used by the fts3_snippet.c module. */ |
| 433 int iPhrase; /* Index of this phrase in matchinfo() results */ |
| 434 u32 *aMI; /* See above */ |
| 422 }; | 435 }; |
| 423 | 436 |
| 424 /* | 437 /* |
| 425 ** Candidate values for Fts3Query.eType. Note that the order of the first | 438 ** Candidate values for Fts3Query.eType. Note that the order of the first |
| 426 ** four values is in order of precedence when parsing expressions. For | 439 ** four values is in order of precedence when parsing expressions. For |
| 427 ** example, the following: | 440 ** example, the following: |
| 428 ** | 441 ** |
| 429 ** "a OR b AND c NOT d NEAR e" | 442 ** "a OR b AND c NOT d NEAR e" |
| 430 ** | 443 ** |
| 431 ** is equivalent to: | 444 ** is equivalent to: |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 int nDoclist; /* Size of aDoclist[] in bytes */ | 535 int nDoclist; /* Size of aDoclist[] in bytes */ |
| 523 }; | 536 }; |
| 524 | 537 |
| 525 int sqlite3Fts3Incrmerge(Fts3Table*,int,int); | 538 int sqlite3Fts3Incrmerge(Fts3Table*,int,int); |
| 526 | 539 |
| 527 #define fts3GetVarint32(p, piVal) ( \ | 540 #define fts3GetVarint32(p, piVal) ( \ |
| 528 (*(u8*)(p)&0x80) ? sqlite3Fts3GetVarint32(p, piVal) : (*piVal=*(u8*)(p), 1) \ | 541 (*(u8*)(p)&0x80) ? sqlite3Fts3GetVarint32(p, piVal) : (*piVal=*(u8*)(p), 1) \ |
| 529 ) | 542 ) |
| 530 | 543 |
| 531 /* fts3.c */ | 544 /* fts3.c */ |
| 545 void sqlite3Fts3ErrMsg(char**,const char*,...); |
| 532 int sqlite3Fts3PutVarint(char *, sqlite3_int64); | 546 int sqlite3Fts3PutVarint(char *, sqlite3_int64); |
| 533 int sqlite3Fts3GetVarint(const char *, sqlite_int64 *); | 547 int sqlite3Fts3GetVarint(const char *, sqlite_int64 *); |
| 534 int sqlite3Fts3GetVarint32(const char *, int *); | 548 int sqlite3Fts3GetVarint32(const char *, int *); |
| 535 int sqlite3Fts3VarintLen(sqlite3_uint64); | 549 int sqlite3Fts3VarintLen(sqlite3_uint64); |
| 536 void sqlite3Fts3Dequote(char *); | 550 void sqlite3Fts3Dequote(char *); |
| 537 void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*); | 551 void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*); |
| 538 int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *); | 552 int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *); |
| 539 int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *); | 553 int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *); |
| 540 void sqlite3Fts3CreateStatTable(int*, Fts3Table*); | 554 void sqlite3Fts3CreateStatTable(int*, Fts3Table*); |
| 555 int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc); |
| 541 | 556 |
| 542 /* fts3_tokenizer.c */ | 557 /* fts3_tokenizer.c */ |
| 543 const char *sqlite3Fts3NextToken(const char *, int *); | 558 const char *sqlite3Fts3NextToken(const char *, int *); |
| 544 int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *); | 559 int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *); |
| 545 int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *, | 560 int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *, |
| 546 sqlite3_tokenizer **, char ** | 561 sqlite3_tokenizer **, char ** |
| 547 ); | 562 ); |
| 548 int sqlite3Fts3IsIdChar(char); | 563 int sqlite3Fts3IsIdChar(char); |
| 549 | 564 |
| 550 /* fts3_snippet.c */ | 565 /* fts3_snippet.c */ |
| 551 void sqlite3Fts3Offsets(sqlite3_context*, Fts3Cursor*); | 566 void sqlite3Fts3Offsets(sqlite3_context*, Fts3Cursor*); |
| 552 void sqlite3Fts3Snippet(sqlite3_context *, Fts3Cursor *, const char *, | 567 void sqlite3Fts3Snippet(sqlite3_context *, Fts3Cursor *, const char *, |
| 553 const char *, const char *, int, int | 568 const char *, const char *, int, int |
| 554 ); | 569 ); |
| 555 void sqlite3Fts3Matchinfo(sqlite3_context *, Fts3Cursor *, const char *); | 570 void sqlite3Fts3Matchinfo(sqlite3_context *, Fts3Cursor *, const char *); |
| 571 void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p); |
| 556 | 572 |
| 557 /* fts3_expr.c */ | 573 /* fts3_expr.c */ |
| 558 int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int, | 574 int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int, |
| 559 char **, int, int, int, const char *, int, Fts3Expr **, char ** | 575 char **, int, int, int, const char *, int, Fts3Expr **, char ** |
| 560 ); | 576 ); |
| 561 void sqlite3Fts3ExprFree(Fts3Expr *); | 577 void sqlite3Fts3ExprFree(Fts3Expr *); |
| 562 #ifdef SQLITE_TEST | 578 #ifdef SQLITE_TEST |
| 563 int sqlite3Fts3ExprInitTestInterface(sqlite3 *db); | 579 int sqlite3Fts3ExprInitTestInterface(sqlite3 *db); |
| 564 int sqlite3Fts3InitTerm(sqlite3 *db); | 580 int sqlite3Fts3InitTerm(sqlite3 *db); |
| 565 #endif | 581 #endif |
| (...skipping 20 matching lines...) Expand all Loading... |
| 586 | 602 |
| 587 /* fts3_unicode2.c (functions generated by parsing unicode text files) */ | 603 /* fts3_unicode2.c (functions generated by parsing unicode text files) */ |
| 588 #ifndef SQLITE_DISABLE_FTS3_UNICODE | 604 #ifndef SQLITE_DISABLE_FTS3_UNICODE |
| 589 int sqlite3FtsUnicodeFold(int, int); | 605 int sqlite3FtsUnicodeFold(int, int); |
| 590 int sqlite3FtsUnicodeIsalnum(int); | 606 int sqlite3FtsUnicodeIsalnum(int); |
| 591 int sqlite3FtsUnicodeIsdiacritic(int); | 607 int sqlite3FtsUnicodeIsdiacritic(int); |
| 592 #endif | 608 #endif |
| 593 | 609 |
| 594 #endif /* !SQLITE_CORE || SQLITE_ENABLE_FTS3 */ | 610 #endif /* !SQLITE_CORE || SQLITE_ENABLE_FTS3 */ |
| 595 #endif /* _FTSINT_H */ | 611 #endif /* _FTSINT_H */ |
| OLD | NEW |