/ Hex Artifact Content
Login

Artifact e12421946774482f4d49e334c974571177adbc70:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2f 0a 0a 0a 0a 23  *****.**.*/....#
0180: 69 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74  include "fts5Int
0190: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 66 74  .h".#include "ft
01a0: 73 35 70 61 72 73 65 2e 68 22 0a 0a 2f 2a 0a 2a  s5parse.h"../*.*
01b0: 2a 20 41 6c 6c 20 74 6f 6b 65 6e 20 74 79 70 65  * All token type
01c0: 73 20 69 6e 20 74 68 65 20 67 65 6e 65 72 61 74  s in the generat
01d0: 65 64 20 66 74 73 35 70 61 72 73 65 2e 68 20 66  ed fts5parse.h f
01e0: 69 6c 65 20 61 72 65 20 67 72 65 61 74 65 72 20  ile are greater 
01f0: 74 68 61 6e 20 30 2e 0a 2a 2f 0a 23 64 65 66 69  than 0..*/.#defi
0200: 6e 65 20 46 54 53 35 5f 45 4f 46 20 30 0a 0a 23  ne FTS5_EOF 0..#
0210: 64 65 66 69 6e 65 20 46 54 53 35 5f 4c 41 52 47  define FTS5_LARG
0220: 45 53 54 5f 49 4e 54 36 34 20 20 28 30 78 66 66  EST_INT64  (0xff
0230: 66 66 66 66 66 66 7c 28 28 28 69 36 34 29 30 78  ffffff|(((i64)0x
0240: 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a  7fffffff)<<32)).
0250: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0260: 46 74 73 35 45 78 70 72 54 65 72 6d 20 46 74 73  Fts5ExprTerm Fts
0270: 35 45 78 70 72 54 65 72 6d 3b 0a 0a 2f 2a 0a 2a  5ExprTerm;../*.*
0280: 2a 20 46 75 6e 63 74 69 6f 6e 73 20 67 65 6e 65  * Functions gene
0290: 72 61 74 65 64 20 62 79 20 6c 65 6d 6f 6e 20 66  rated by lemon f
02a0: 72 6f 6d 20 66 74 73 35 70 61 72 73 65 2e 79 2e  rom fts5parse.y.
02b0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
02c0: 33 46 74 73 35 50 61 72 73 65 72 41 6c 6c 6f 63  3Fts5ParserAlloc
02d0: 28 76 6f 69 64 20 2a 28 2a 6d 61 6c 6c 6f 63 50  (void *(*mallocP
02e0: 72 6f 63 29 28 75 36 34 29 29 3b 0a 76 6f 69 64  roc)(u64));.void
02f0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
0300: 65 72 46 72 65 65 28 76 6f 69 64 2a 2c 20 76 6f  erFree(void*, vo
0310: 69 64 20 28 2a 66 72 65 65 50 72 6f 63 29 28 76  id (*freeProc)(v
0320: 6f 69 64 2a 29 29 3b 0a 76 6f 69 64 20 73 71 6c  oid*));.void sql
0330: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 28 76  ite3Fts5Parser(v
0340: 6f 69 64 2a 2c 20 69 6e 74 2c 20 46 74 73 35 54  oid*, int, Fts5T
0350: 6f 6b 65 6e 2c 20 46 74 73 35 50 61 72 73 65 2a  oken, Fts5Parse*
0360: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
0370: 47 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  G.#include <stdi
0380: 6f 2e 68 3e 0a 76 6f 69 64 20 73 71 6c 69 74 65  o.h>.void sqlite
0390: 33 46 74 73 35 50 61 72 73 65 72 54 72 61 63 65  3Fts5ParserTrace
03a0: 28 46 49 4c 45 2a 2c 20 63 68 61 72 2a 29 3b 0a  (FILE*, char*);.
03b0: 23 65 6e 64 69 66 0a 0a 0a 73 74 72 75 63 74 20  #endif...struct 
03c0: 46 74 73 35 45 78 70 72 20 7b 0a 20 20 46 74 73  Fts5Expr {.  Fts
03d0: 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a  5Index *pIndex;.
03e0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
03f0: 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 45 78 70  onfig;.  Fts5Exp
0400: 72 4e 6f 64 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  rNode *pRoot;.  
0410: 69 6e 74 20 62 44 65 73 63 3b 20 20 20 20 20 20  int bDesc;      
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 2f 2a 20 49 74 65 72 61 74 65 20 69 6e 20 64 65  /* Iterate in de
0440: 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f  scending rowid o
0450: 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rder */.  int nP
0460: 68 72 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  hrase;          
0470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0480: 62 65 72 20 6f 66 20 70 68 72 61 73 65 73 20 69  ber of phrases i
0490: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  n expression */.
04a0: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
04b0: 20 2a 2a 61 70 45 78 70 72 50 68 72 61 73 65 3b   **apExprPhrase;
04c0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
04d0: 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 73 20   phrase objects 
04e0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 65 54 79  */.};../*.** eTy
04f0: 70 65 3a 0a 2a 2a 20 20 20 45 78 70 72 65 73 73  pe:.**   Express
0500: 69 6f 6e 20 6e 6f 64 65 20 74 79 70 65 2e 20 41  ion node type. A
0510: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
0520: 0a 2a 2a 20 20 20 20 20 20 20 46 54 53 35 5f 41  .**       FTS5_A
0530: 4e 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ND              
0540: 20 20 20 28 6e 43 68 69 6c 64 2c 20 61 70 43 68     (nChild, apCh
0550: 69 6c 64 20 76 61 6c 69 64 29 0a 2a 2a 20 20 20  ild valid).**   
0560: 20 20 20 20 46 54 53 35 5f 4f 52 20 20 20 20 20      FTS5_OR     
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 43               (nC
0580: 68 69 6c 64 2c 20 61 70 43 68 69 6c 64 20 76 61  hild, apChild va
0590: 6c 69 64 29 0a 2a 2a 20 20 20 20 20 20 20 46 54  lid).**       FT
05a0: 53 35 5f 4e 4f 54 20 20 20 20 20 20 20 20 20 20  S5_NOT          
05b0: 20 20 20 20 20 20 20 28 6e 43 68 69 6c 64 2c 20         (nChild, 
05c0: 61 70 43 68 69 6c 64 20 76 61 6c 69 64 29 0a 2a  apChild valid).*
05d0: 2a 20 20 20 20 20 20 20 46 54 53 35 5f 53 54 52  *       FTS5_STR
05e0: 49 4e 47 20 20 20 20 20 20 20 20 20 20 20 20 20  ING             
05f0: 20 28 70 4e 65 61 72 20 76 61 6c 69 64 29 0a 2a   (pNear valid).*
0600: 2a 20 20 20 20 20 20 20 46 54 53 35 5f 54 45 52  *       FTS5_TER
0610: 4d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M               
0620: 20 28 70 4e 65 61 72 20 76 61 6c 69 64 29 0a 2a   (pNear valid).*
0630: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 45 78 70  /.struct Fts5Exp
0640: 72 4e 6f 64 65 20 7b 0a 20 20 69 6e 74 20 65 54  rNode {.  int eT
0650: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
0660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64            /* Nod
0670: 65 20 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20  e type */.  int 
0680: 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20  bEof;           
0690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
06a0: 72 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20  rue at EOF */.  
06b0: 69 6e 74 20 62 4e 6f 6d 61 74 63 68 3b 20 20 20  int bNomatch;   
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 2f 2a 20 54 72 75 65 20 69 66 20 65 6e 74 72 79  /* True if entry
06e0: 20 69 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 20   is not a match 
06f0: 2a 2f 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 6d 65  */..  /* Next me
0700: 74 68 6f 64 20 66 6f 72 20 74 68 69 73 20 6e 6f  thod for this no
0710: 64 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  de. */.  int (*x
0720: 4e 65 78 74 29 28 46 74 73 35 45 78 70 72 2a 2c  Next)(Fts5Expr*,
0730: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 2c 20   Fts5ExprNode*, 
0740: 69 6e 74 2c 20 69 36 34 29 3b 0a 0a 20 20 69 36  int, i64);..  i6
0750: 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20  4 iRowid;       
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0770: 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a   Current rowid *
0780: 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72  /.  Fts5ExprNear
0790: 73 65 74 20 2a 70 4e 65 61 72 3b 20 20 20 20 20  set *pNear;     
07a0: 20 20 20 20 2f 2a 20 46 6f 72 20 46 54 53 35 5f      /* For FTS5_
07b0: 53 54 52 49 4e 47 20 2d 20 63 6c 75 73 74 65 72  STRING - cluster
07c0: 20 6f 66 20 70 68 72 61 73 65 73 20 2a 2f 0a 0a   of phrases */..
07d0: 20 20 2f 2a 20 43 68 69 6c 64 20 6e 6f 64 65 73    /* Child nodes
07e0: 2e 20 46 6f 72 20 61 20 4e 4f 54 20 6e 6f 64 65  . For a NOT node
07f0: 2c 20 74 68 69 73 20 61 72 72 61 79 20 61 6c 77  , this array alw
0800: 61 79 73 20 63 6f 6e 74 61 69 6e 73 20 32 20 65  ays contains 2 e
0810: 6e 74 72 69 65 73 2e 20 46 6f 72 20 0a 20 20 2a  ntries. For .  *
0820: 2a 20 41 4e 44 20 6f 72 20 4f 52 20 6e 6f 64 65  * AND or OR node
0830: 73 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 32  s, it contains 2
0840: 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73   or more entries
0850: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 69  .  */.  int nChi
0860: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
0870: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0880: 72 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64 65 73  r of child nodes
0890: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f   */.  Fts5ExprNo
08a0: 64 65 20 2a 61 70 43 68 69 6c 64 5b 31 5d 3b 20  de *apChild[1]; 
08b0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
08c0: 66 20 63 68 69 6c 64 20 6e 6f 64 65 73 20 2a 2f  f child nodes */
08d0: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 46 74 73  .};..#define Fts
08e0: 35 4e 6f 64 65 49 73 53 74 72 69 6e 67 28 70 29  5NodeIsString(p)
08f0: 20 28 28 70 29 2d 3e 65 54 79 70 65 3d 3d 46 54   ((p)->eType==FT
0900: 53 35 5f 54 45 52 4d 20 7c 7c 20 28 70 29 2d 3e  S5_TERM || (p)->
0910: 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49  eType==FTS5_STRI
0920: 4e 47 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  NG)../*.** Invok
0930: 65 20 74 68 65 20 78 4e 65 78 74 20 6d 65 74 68  e the xNext meth
0940: 6f 64 20 6f 66 20 61 6e 20 46 74 73 35 45 78 70  od of an Fts5Exp
0950: 72 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 54 68  rNode object. Th
0960: 69 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  is macro should 
0970: 62 65 0a 2a 2a 20 75 73 65 64 20 61 73 20 69 66  be.** used as if
0980: 20 69 74 20 68 61 73 20 74 68 65 20 73 61 6d 65   it has the same
0990: 20 73 69 67 6e 61 74 75 72 65 20 61 73 20 74 68   signature as th
09a0: 65 20 78 4e 65 78 74 28 29 20 6d 65 74 68 6f 64  e xNext() method
09b0: 73 20 74 68 65 6d 73 65 6c 76 65 73 2e 0a 2a 2f  s themselves..*/
09c0: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 45 78 70  .#define fts5Exp
09d0: 72 4e 6f 64 65 4e 65 78 74 28 61 2c 62 2c 63 2c  rNodeNext(a,b,c,
09e0: 64 29 20 28 62 29 2d 3e 78 4e 65 78 74 28 28 61  d) (b)->xNext((a
09f0: 29 2c 20 28 62 29 2c 20 28 63 29 2c 20 28 64 29  ), (b), (c), (d)
0a00: 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  )../*.** An inst
0a10: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0a20: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
0a30: 72 65 70 72 65 73 65 6e 74 73 20 61 20 73 69 6e  represents a sin
0a40: 67 6c 65 20 73 65 61 72 63 68 20 74 65 72 6d 0a  gle search term.
0a50: 2a 2a 20 6f 72 20 74 65 72 6d 20 70 72 65 66 69  ** or term prefi
0a60: 78 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  x..*/.struct Fts
0a70: 35 45 78 70 72 54 65 72 6d 20 7b 0a 20 20 69 6e  5ExprTerm {.  in
0a80: 74 20 62 50 72 65 66 69 78 3b 20 20 20 20 20 20  t bPrefix;      
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0aa0: 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65 66   True for a pref
0ab0: 69 78 20 74 65 72 6d 20 2a 2f 0a 20 20 63 68 61  ix term */.  cha
0ac0: 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20  r *zTerm;       
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0ae0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 74  nul-terminated t
0af0: 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  erm */.  Fts5Ind
0b00: 65 78 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20  exIter *pIter;  
0b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
0b20: 61 74 6f 72 20 66 6f 72 20 74 68 69 73 20 74 65  ator for this te
0b30: 72 6d 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  rm */.  Fts5Expr
0b40: 54 65 72 6d 20 2a 70 53 79 6e 6f 6e 79 6d 3b 20  Term *pSynonym; 
0b50: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
0b60: 65 72 20 74 6f 20 66 69 72 73 74 20 69 6e 20 6c  er to first in l
0b70: 69 73 74 20 6f 66 20 73 79 6e 6f 6e 79 6d 73 20  ist of synonyms 
0b80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70  */.};../*.** A p
0b90: 68 72 61 73 65 2e 20 4f 6e 65 20 6f 72 20 6d 6f  hrase. One or mo
0ba0: 72 65 20 74 65 72 6d 73 20 74 68 61 74 20 6d 75  re terms that mu
0bb0: 73 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 63  st appear in a c
0bc0: 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e  ontiguous sequen
0bd0: 63 65 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20 64  ce.** within a d
0be0: 6f 63 75 6d 65 6e 74 20 66 6f 72 20 69 74 20 74  ocument for it t
0bf0: 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 72 75  o match..*/.stru
0c00: 63 74 20 46 74 73 35 45 78 70 72 50 68 72 61 73  ct Fts5ExprPhras
0c10: 65 20 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  e {.  Fts5ExprNo
0c20: 64 65 20 2a 70 4e 6f 64 65 3b 20 20 20 20 20 20  de *pNode;      
0c30: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 53 54        /* FTS5_ST
0c40: 52 49 4e 47 20 6e 6f 64 65 20 74 68 69 73 20 70  RING node this p
0c50: 68 72 61 73 65 20 69 73 20 70 61 72 74 20 6f 66  hrase is part of
0c60: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
0c70: 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20   poslist;       
0c80: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
0c90: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
0ca0: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20  /.  int nTerm;  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0cd0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 65 72   entries in aTer
0ce0: 6d 5b 5d 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  m[] */.  Fts5Exp
0cf0: 72 54 65 72 6d 20 61 54 65 72 6d 5b 31 5d 3b 20  rTerm aTerm[1]; 
0d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
0d10: 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
0d20: 68 69 73 20 70 68 72 61 73 65 20 2a 2f 0a 7d 3b  his phrase */.};
0d30: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 6d  ../*.** One or m
0d40: 6f 72 65 20 70 68 72 61 73 65 73 20 74 68 61 74  ore phrases that
0d50: 20 6d 75 73 74 20 61 70 70 65 61 72 20 77 69 74   must appear wit
0d60: 68 69 6e 20 61 20 63 65 72 74 61 69 6e 20 74 6f  hin a certain to
0d70: 6b 65 6e 20 64 69 73 74 61 6e 63 65 20 6f 66 0a  ken distance of.
0d80: 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 20 77 69  ** each other wi
0d90: 74 68 69 6e 20 65 61 63 68 20 6d 61 74 63 68 69  thin each matchi
0da0: 6e 67 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a  ng document..*/.
0db0: 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72 4e  struct Fts5ExprN
0dc0: 65 61 72 73 65 74 20 7b 0a 20 20 69 6e 74 20 6e  earset {.  int n
0dd0: 4e 65 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  Near;           
0de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 45             /* NE
0df0: 41 52 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  AR parameter */.
0e00: 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
0e10: 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
0e20: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 6f 20    /* Columns to 
0e30: 73 65 61 72 63 68 20 28 4e 55 4c 4c 20 2d 3e 20  search (NULL -> 
0e40: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a  all columns) */.
0e50: 20 20 69 6e 74 20 6e 50 68 72 61 73 65 3b 20 20    int nPhrase;  
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
0e80: 6e 74 72 69 65 73 20 69 6e 20 61 50 68 72 61 73  ntries in aPhras
0e90: 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46  e[] array */.  F
0ea0: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 61  ts5ExprPhrase *a
0eb0: 70 50 68 72 61 73 65 5b 31 5d 3b 20 20 20 20 2f  pPhrase[1];    /
0ec0: 2a 20 41 72 72 61 79 20 6f 66 20 70 68 72 61 73  * Array of phras
0ed0: 65 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 7d 3b  e pointers */.};
0ee0: 0a 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 63  .../*.** Parse c
0ef0: 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63  ontext..*/.struc
0f00: 74 20 46 74 73 35 50 61 72 73 65 20 7b 0a 20 20  t Fts5Parse {.  
0f10: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
0f20: 66 69 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  fig;.  char *zEr
0f30: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  r;.  int rc;.  i
0f40: 6e 74 20 6e 50 68 72 61 73 65 3b 20 20 20 20 20  nt nPhrase;     
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0f60: 2a 20 53 69 7a 65 20 6f 66 20 61 70 50 68 72 61  * Size of apPhra
0f70: 73 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  se array */.  Ft
0f80: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 2a 61  s5ExprPhrase **a
0f90: 70 50 68 72 61 73 65 3b 20 20 20 20 20 20 2f 2a  pPhrase;      /*
0fa0: 20 41 72 72 61 79 20 6f 66 20 61 6c 6c 20 70 68   Array of all ph
0fb0: 72 61 73 65 73 20 2a 2f 0a 20 20 46 74 73 35 45  rases */.  Fts5E
0fc0: 78 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 3b 20  xprNode *pExpr; 
0fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
0fe0: 73 75 6c 74 20 6f 66 20 61 20 73 75 63 63 65 73  sult of a succes
0ff0: 73 66 75 6c 20 70 61 72 73 65 20 2a 2f 0a 7d 3b  sful parse */.};
1000: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
1010: 73 35 50 61 72 73 65 45 72 72 6f 72 28 46 74 73  s5ParseError(Fts
1020: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
1030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
1040: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1050: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
1060: 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 69 66  (ap, zFmt);.  if
1070: 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ( pParse->rc==SQ
1080: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1090: 50 61 72 73 65 2d 3e 7a 45 72 72 20 3d 20 73 71  Parse->zErr = sq
10a0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
10b0: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 70 50  Fmt, ap);.    pP
10c0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
10d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 76  E_ERROR;.  }.  v
10e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 73 74  a_end(ap);.}..st
10f0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
1100: 72 49 73 73 70 61 63 65 28 63 68 61 72 20 74 29  rIsspace(char t)
1110: 7b 0a 20 20 72 65 74 75 72 6e 20 74 3d 3d 27 20  {.  return t==' 
1120: 27 20 7c 7c 20 74 3d 3d 27 5c 74 27 20 7c 7c 20  ' || t=='\t' || 
1130: 74 3d 3d 27 5c 6e 27 20 7c 7c 20 74 3d 3d 27 5c  t=='\n' || t=='\
1140: 72 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  r';.}../*.** Rea
1150: 64 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b 65  d the first toke
1160: 6e 20 66 72 6f 6d 20 74 68 65 20 6e 75 6c 2d 74  n from the nul-t
1170: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
1180: 20 61 74 20 2a 70 7a 2e 0a 2a 2f 0a 73 74 61 74   at *pz..*/.stat
1190: 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 47  ic int fts5ExprG
11a0: 65 74 54 6f 6b 65 6e 28 0a 20 20 46 74 73 35 50  etToken(.  Fts5P
11b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
11c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
11d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11e0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e   /* IN/OUT: Poin
11f0: 74 65 72 20 69 6e 74 6f 20 62 75 66 66 65 72 20  ter into buffer 
1200: 2a 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a  */.  Fts5Token *
1210: 70 54 6f 6b 65 6e 0a 29 7b 0a 20 20 63 6f 6e 73  pToken.){.  cons
1220: 74 20 63 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b  t char *z = *pz;
1230: 0a 20 20 69 6e 74 20 74 6f 6b 3b 0a 0a 20 20 2f  .  int tok;..  /
1240: 2a 20 53 6b 69 70 20 70 61 73 74 20 61 6e 79 20  * Skip past any 
1250: 77 68 69 74 65 73 70 61 63 65 20 2a 2f 0a 20 20  whitespace */.  
1260: 77 68 69 6c 65 28 20 66 74 73 35 45 78 70 72 49  while( fts5ExprI
1270: 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b  sspace(*z) ) z++
1280: 3b 0a 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70 20 3d  ;..  pToken->p =
1290: 20 7a 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e 20   z;.  pToken->n 
12a0: 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20 2a  = 1;.  switch( *
12b0: 7a 20 29 7b 0a 20 20 20 20 63 61 73 65 20 27 28  z ){.    case '(
12c0: 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4c  ':  tok = FTS5_L
12d0: 50 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  P;    break;.   
12e0: 20 63 61 73 65 20 27 29 27 3a 20 20 74 6f 6b 20   case ')':  tok 
12f0: 3d 20 46 54 53 35 5f 52 50 3b 20 20 20 20 62 72  = FTS5_RP;    br
1300: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 7b  eak;.    case '{
1310: 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4c  ':  tok = FTS5_L
1320: 43 50 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  CP;   break;.   
1330: 20 63 61 73 65 20 27 7d 27 3a 20 20 74 6f 6b 20   case '}':  tok 
1340: 3d 20 46 54 53 35 5f 52 43 50 3b 20 20 20 62 72  = FTS5_RCP;   br
1350: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 3a  eak;.    case ':
1360: 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 43  ':  tok = FTS5_C
1370: 4f 4c 4f 4e 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OLON; break;.   
1380: 20 63 61 73 65 20 27 2c 27 3a 20 20 74 6f 6b 20   case ',':  tok 
1390: 3d 20 46 54 53 35 5f 43 4f 4d 4d 41 3b 20 62 72  = FTS5_COMMA; br
13a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 2b  eak;.    case '+
13b0: 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 50  ':  tok = FTS5_P
13c0: 4c 55 53 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  LUS;  break;.   
13d0: 20 63 61 73 65 20 27 2a 27 3a 20 20 74 6f 6b 20   case '*':  tok 
13e0: 3d 20 46 54 53 35 5f 53 54 41 52 3b 20 20 62 72  = FTS5_STAR;  br
13f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 2d  eak;.    case '-
1400: 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4d  ':  tok = FTS5_M
1410: 49 4e 55 53 3b 20 62 72 65 61 6b 3b 0a 20 20 20  INUS; break;.   
1420: 20 63 61 73 65 20 27 5c 30 27 3a 20 74 6f 6b 20   case '\0': tok 
1430: 3d 20 46 54 53 35 5f 45 4f 46 3b 20 20 20 62 72  = FTS5_EOF;   br
1440: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 27  eak;..    case '
1450: 22 27 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  "': {.      cons
1460: 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
1470: 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 53 54 52    tok = FTS5_STR
1480: 49 4e 47 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  ING;..      for(
1490: 7a 32 3d 26 7a 5b 31 5d 3b 20 31 3b 20 7a 32 2b  z2=&z[1]; 1; z2+
14a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
14b0: 7a 32 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  z2[0]=='"' ){.  
14c0: 20 20 20 20 20 20 20 20 7a 32 2b 2b 3b 0a 20 20          z2++;.  
14d0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 32 5b 30          if( z2[0
14e0: 5d 21 3d 27 22 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='"' ) break;.
14f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1500: 20 20 69 66 28 20 7a 32 5b 30 5d 3d 3d 27 5c 30    if( z2[0]=='\0
1510: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
1520: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 45  qlite3Fts5ParseE
1530: 72 72 6f 72 28 70 50 61 72 73 65 2c 20 22 75 6e  rror(pParse, "un
1540: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
1550: 67 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  g");.          r
1560: 65 74 75 72 6e 20 46 54 53 35 5f 45 4f 46 3b 0a  eturn FTS5_EOF;.
1570: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1580: 7d 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e  }.      pToken->
1590: 6e 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20  n = (z2 - z);.  
15a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15b0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
15c0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
15d0: 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 69 66 28  r *z2;.      if(
15e0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 73 42 61   sqlite3Fts5IsBa
15f0: 72 65 77 6f 72 64 28 7a 5b 30 5d 29 3d 3d 30 20  reword(z[0])==0 
1600: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1610: 65 33 46 74 73 35 50 61 72 73 65 45 72 72 6f 72  e3Fts5ParseError
1620: 28 70 50 61 72 73 65 2c 20 22 66 74 73 35 3a 20  (pParse, "fts5: 
1630: 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6e 65 61  syntax error nea
1640: 72 20 5c 22 25 2e 31 73 5c 22 22 2c 20 7a 29 3b  r \"%.1s\"", z);
1650: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1660: 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20 20  FTS5_EOF;.      
1670: 7d 0a 20 20 20 20 20 20 74 6f 6b 20 3d 20 46 54  }.      tok = FT
1680: 53 35 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 20  S5_STRING;.     
1690: 20 66 6f 72 28 7a 32 3d 26 7a 5b 31 5d 3b 20 73   for(z2=&z[1]; s
16a0: 71 6c 69 74 65 33 46 74 73 35 49 73 42 61 72 65  qlite3Fts5IsBare
16b0: 77 6f 72 64 28 2a 7a 32 29 3b 20 7a 32 2b 2b 29  word(*z2); z2++)
16c0: 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e  ;.      pToken->
16d0: 6e 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20  n = (z2 - z);.  
16e0: 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
16f0: 6e 3d 3d 32 20 26 26 20 6d 65 6d 63 6d 70 28 70  n==2 && memcmp(p
1700: 54 6f 6b 65 6e 2d 3e 70 2c 20 22 4f 52 22 2c 20  Token->p, "OR", 
1710: 32 29 3d 3d 30 20 29 20 20 74 6f 6b 20 3d 20 46  2)==0 )  tok = F
1720: 54 53 35 5f 4f 52 3b 0a 20 20 20 20 20 20 69 66  TS5_OR;.      if
1730: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 33 20 26  ( pToken->n==3 &
1740: 26 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2d  & memcmp(pToken-
1750: 3e 70 2c 20 22 4e 4f 54 22 2c 20 33 29 3d 3d 30  >p, "NOT", 3)==0
1760: 20 29 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4e 4f   ) tok = FTS5_NO
1770: 54 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  T;.      if( pTo
1780: 6b 65 6e 2d 3e 6e 3d 3d 33 20 26 26 20 6d 65 6d  ken->n==3 && mem
1790: 63 6d 70 28 70 54 6f 6b 65 6e 2d 3e 70 2c 20 22  cmp(pToken->p, "
17a0: 41 4e 44 22 2c 20 33 29 3d 3d 30 20 29 20 74 6f  AND", 3)==0 ) to
17b0: 6b 20 3d 20 46 54 53 35 5f 41 4e 44 3b 0a 20 20  k = FTS5_AND;.  
17c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17d0: 0a 20 20 7d 0a 0a 20 20 2a 70 7a 20 3d 20 26 70  .  }..  *pz = &p
17e0: 54 6f 6b 65 6e 2d 3e 70 5b 70 54 6f 6b 65 6e 2d  Token->p[pToken-
17f0: 3e 6e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  >n];.  return to
1800: 6b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  k;.}..static voi
1810: 64 20 2a 66 74 73 35 50 61 72 73 65 41 6c 6c 6f  d *fts5ParseAllo
1820: 63 28 75 36 34 20 74 29 7b 20 72 65 74 75 72 6e  c(u64 t){ return
1830: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1840: 28 69 6e 74 29 74 29 3b 20 7d 0a 73 74 61 74 69  (int)t); }.stati
1850: 63 20 76 6f 69 64 20 66 74 73 35 50 61 72 73 65  c void fts5Parse
1860: 46 72 65 65 28 76 6f 69 64 20 2a 70 29 7b 20 73  Free(void *p){ s
1870: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 20  qlite3_free(p); 
1880: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
1890: 73 35 45 78 70 72 4e 65 77 28 0a 20 20 46 74 73  s5ExprNew(.  Fts
18a0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
18b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18c0: 46 54 53 35 20 43 6f 6e 66 69 67 75 72 61 74 69  FTS5 Configurati
18d0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
18e0: 61 72 20 2a 7a 45 78 70 72 2c 20 20 20 20 20 20  ar *zExpr,      
18f0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
1900: 73 73 69 6f 6e 20 74 65 78 74 20 2a 2f 0a 20 20  ssion text */.  
1910: 46 74 73 35 45 78 70 72 20 2a 2a 70 70 4e 65 77  Fts5Expr **ppNew
1920: 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  , .  char **pzEr
1930: 72 0a 29 7b 0a 20 20 46 74 73 35 50 61 72 73 65  r.){.  Fts5Parse
1940: 20 73 50 61 72 73 65 3b 0a 20 20 46 74 73 35 54   sParse;.  Fts5T
1950: 6f 6b 65 6e 20 74 6f 6b 65 6e 3b 0a 20 20 63 6f  oken token;.  co
1960: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 45  nst char *z = zE
1970: 78 70 72 3b 0a 20 20 69 6e 74 20 74 3b 20 20 20  xpr;.  int t;   
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74         /* Next t
19a0: 6f 6b 65 6e 20 74 79 70 65 20 2a 2f 0a 20 20 76  oken type */.  v
19b0: 6f 69 64 20 2a 70 45 6e 67 69 6e 65 3b 0a 20 20  oid *pEngine;.  
19c0: 46 74 73 35 45 78 70 72 20 2a 70 4e 65 77 3b 0a  Fts5Expr *pNew;.
19d0: 0a 20 20 2a 70 70 4e 65 77 20 3d 20 30 3b 0a 20  .  *ppNew = 0;. 
19e0: 20 2a 70 7a 45 72 72 20 3d 20 30 3b 0a 20 20 6d   *pzErr = 0;.  m
19f0: 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20 30  emset(&sParse, 0
1a00: 2c 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65 29  , sizeof(sParse)
1a10: 29 3b 0a 20 20 70 45 6e 67 69 6e 65 20 3d 20 73  );.  pEngine = s
1a20: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
1a30: 41 6c 6c 6f 63 28 66 74 73 35 50 61 72 73 65 41  Alloc(fts5ParseA
1a40: 6c 6c 6f 63 29 3b 0a 20 20 69 66 28 20 70 45 6e  lloc);.  if( pEn
1a50: 67 69 6e 65 3d 3d 30 20 29 7b 20 72 65 74 75 72  gine==0 ){ retur
1a60: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20  n SQLITE_NOMEM; 
1a70: 7d 0a 20 20 73 50 61 72 73 65 2e 70 43 6f 6e 66  }.  sParse.pConf
1a80: 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 0a 20  ig = pConfig;.. 
1a90: 20 64 6f 20 7b 0a 20 20 20 20 74 20 3d 20 66 74   do {.    t = ft
1aa0: 73 35 45 78 70 72 47 65 74 54 6f 6b 65 6e 28 26  s5ExprGetToken(&
1ab0: 73 50 61 72 73 65 2c 20 26 7a 2c 20 26 74 6f 6b  sParse, &z, &tok
1ac0: 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  en);.    sqlite3
1ad0: 46 74 73 35 50 61 72 73 65 72 28 70 45 6e 67 69  Fts5Parser(pEngi
1ae0: 6e 65 2c 20 74 2c 20 74 6f 6b 65 6e 2c 20 26 73  ne, t, token, &s
1af0: 50 61 72 73 65 29 3b 0a 20 20 7d 77 68 69 6c 65  Parse);.  }while
1b00: 28 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51 4c  ( sParse.rc==SQL
1b10: 49 54 45 5f 4f 4b 20 26 26 20 74 21 3d 46 54 53  ITE_OK && t!=FTS
1b20: 35 5f 45 4f 46 20 29 3b 0a 20 20 73 71 6c 69 74  5_EOF );.  sqlit
1b30: 65 33 46 74 73 35 50 61 72 73 65 72 46 72 65 65  e3Fts5ParserFree
1b40: 28 70 45 6e 67 69 6e 65 2c 20 66 74 73 35 50 61  (pEngine, fts5Pa
1b50: 72 73 65 46 72 65 65 29 3b 0a 0a 20 20 61 73 73  rseFree);..  ass
1b60: 65 72 74 28 20 73 50 61 72 73 65 2e 72 63 21 3d  ert( sParse.rc!=
1b70: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 50 61  SQLITE_OK || sPa
1b80: 72 73 65 2e 7a 45 72 72 3d 3d 30 20 29 3b 0a 20  rse.zErr==0 );. 
1b90: 20 69 66 28 20 73 50 61 72 73 65 2e 72 63 3d 3d   if( sParse.rc==
1ba0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bb0: 20 2a 70 70 4e 65 77 20 3d 20 70 4e 65 77 20 3d   *ppNew = pNew =
1bc0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1bd0: 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 29  sizeof(Fts5Expr)
1be0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1bf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 50 61 72  =0 ){.      sPar
1c00: 73 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  se.rc = SQLITE_N
1c10: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 73 71 6c 69  OMEM;.      sqli
1c20: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
1c30: 46 72 65 65 28 73 50 61 72 73 65 2e 70 45 78 70  Free(sParse.pExp
1c40: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
1c50: 20 20 20 20 20 69 66 28 20 21 73 50 61 72 73 65       if( !sParse
1c60: 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  .pExpr ){.      
1c70: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79 74    const int nByt
1c80: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45  e = sizeof(Fts5E
1c90: 78 70 72 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  xprNode);.      
1ca0: 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20 3d 20    pNew->pRoot = 
1cb0: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 73  (Fts5ExprNode*)s
1cc0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
1cd0: 5a 65 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c  Zero(&sParse.rc,
1ce0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
1cf0: 20 69 66 28 20 70 4e 65 77 2d 3e 70 52 6f 6f 74   if( pNew->pRoot
1d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
1d10: 65 77 2d 3e 70 52 6f 6f 74 2d 3e 62 45 6f 66 20  ew->pRoot->bEof 
1d20: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
1d30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d40: 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20      pNew->pRoot 
1d50: 3d 20 73 50 61 72 73 65 2e 70 45 78 70 72 3b 0a  = sParse.pExpr;.
1d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
1d70: 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ew->pIndex = 0;.
1d80: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6e        pNew->pCon
1d90: 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20  fig = pConfig;. 
1da0: 20 20 20 20 20 70 4e 65 77 2d 3e 61 70 45 78 70       pNew->apExp
1db0: 72 50 68 72 61 73 65 20 3d 20 73 50 61 72 73 65  rPhrase = sParse
1dc0: 2e 61 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20  .apPhrase;.     
1dd0: 20 70 4e 65 77 2d 3e 6e 50 68 72 61 73 65 20 3d   pNew->nPhrase =
1de0: 20 73 50 61 72 73 65 2e 6e 50 68 72 61 73 65 3b   sParse.nPhrase;
1df0: 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e 61 70  .      sParse.ap
1e00: 50 68 72 61 73 65 20 3d 20 30 3b 0a 20 20 20 20  Phrase = 0;.    
1e10: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
1e20: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
1e30: 6f 64 65 46 72 65 65 28 73 50 61 72 73 65 2e 70  odeFree(sParse.p
1e40: 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  Expr);.  }..  sq
1e50: 6c 69 74 65 33 5f 66 72 65 65 28 73 50 61 72 73  lite3_free(sPars
1e60: 65 2e 61 70 50 68 72 61 73 65 29 3b 0a 20 20 2a  e.apPhrase);.  *
1e70: 70 7a 45 72 72 20 3d 20 73 50 61 72 73 65 2e 7a  pzErr = sParse.z
1e80: 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 50  Err;.  return sP
1e90: 61 72 73 65 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  arse.rc;.}../*.*
1ea0: 2a 20 46 72 65 65 20 74 68 65 20 65 78 70 72 65  * Free the expre
1eb0: 73 73 69 6f 6e 20 6e 6f 64 65 20 6f 62 6a 65 63  ssion node objec
1ec0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1ed0: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
1ee0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
1ef0: 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
1f00: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 29  Fts5ExprNode *p)
1f10: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
1f20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1f30: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64  i=0; i<p->nChild
1f40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1f50: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
1f60: 64 65 46 72 65 65 28 70 2d 3e 61 70 43 68 69 6c  deFree(p->apChil
1f70: 64 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  d[i]);.    }.   
1f80: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
1f90: 65 4e 65 61 72 73 65 74 46 72 65 65 28 70 2d 3e  eNearsetFree(p->
1fa0: 70 4e 65 61 72 29 3b 0a 20 20 20 20 73 71 6c 69  pNear);.    sqli
1fb0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
1fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
1fd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62  he expression ob
1fe0: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
1ff0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
2000: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2010: 33 46 74 73 35 45 78 70 72 46 72 65 65 28 46 74  3Fts5ExprFree(Ft
2020: 73 35 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  s5Expr *p){.  if
2030: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
2040: 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46  e3Fts5ParseNodeF
2050: 72 65 65 28 70 2d 3e 70 52 6f 6f 74 29 3b 0a 20  ree(p->pRoot);. 
2060: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2070: 70 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 29  p->apExprPhrase)
2080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2090: 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
20a0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 54 65  .** Argument pTe
20b0: 72 6d 20 6d 75 73 74 20 62 65 20 61 20 73 79 6e  rm must be a syn
20c0: 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e 20 52  onym iterator. R
20d0: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
20e0: 74 20 72 6f 77 69 64 0a 2a 2a 20 74 68 61 74 20  t rowid.** that 
20f0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  it points to..*/
2100: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
2110: 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64  ExprSynonymRowid
2120: 28 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70  (Fts5ExprTerm *p
2130: 54 65 72 6d 2c 20 69 6e 74 20 62 44 65 73 63 2c  Term, int bDesc,
2140: 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20 20   int *pbEof){.  
2150: 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a 20 20  i64 iRet = 0;.  
2160: 69 6e 74 20 62 52 65 74 56 61 6c 69 64 20 3d 20  int bRetValid = 
2170: 30 3b 0a 20 20 46 74 73 35 45 78 70 72 54 65 72  0;.  Fts5ExprTer
2180: 6d 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *p;..  assert(
2190: 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d   pTerm->pSynonym
21a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 44   );.  assert( bD
21b0: 65 73 63 3d 3d 30 20 7c 7c 20 62 44 65 73 63 3d  esc==0 || bDesc=
21c0: 3d 31 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54  =1 );.  for(p=pT
21d0: 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
21e0: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 69 66 28 20  nonym){.    if( 
21f0: 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74  0==sqlite3Fts5It
2200: 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 20  erEof(p->pIter) 
2210: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
2220: 77 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e  wid = p->pIter->
2230: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 66  iRowid;.      if
2240: 28 20 62 52 65 74 56 61 6c 69 64 3d 3d 30 20 7c  ( bRetValid==0 |
2250: 7c 20 28 62 44 65 73 63 21 3d 28 69 52 6f 77 69  | (bDesc!=(iRowi
2260: 64 3c 69 52 65 74 29 29 20 29 7b 0a 20 20 20 20  d<iRet)) ){.    
2270: 20 20 20 20 69 52 65 74 20 3d 20 69 52 6f 77 69      iRet = iRowi
2280: 64 3b 0a 20 20 20 20 20 20 20 20 62 52 65 74 56  d;.        bRetV
2290: 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
22a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
22b0: 66 28 20 70 62 45 6f 66 20 26 26 20 62 52 65 74  f( pbEof && bRet
22c0: 56 61 6c 69 64 3d 3d 30 20 29 20 2a 70 62 45 6f  Valid==0 ) *pbEo
22d0: 66 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  f = 1;.  return 
22e0: 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  iRet;.}../*.** A
22f0: 72 67 75 6d 65 6e 74 20 70 54 65 72 6d 20 6d 75  rgument pTerm mu
2300: 73 74 20 62 65 20 61 20 73 79 6e 6f 6e 79 6d 20  st be a synonym 
2310: 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  iterator..*/.sta
2320: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
2330: 53 79 6e 6f 6e 79 6d 4c 69 73 74 28 0a 20 20 46  SynonymList(.  F
2340: 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
2350: 72 6d 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  rm, .  i64 iRowi
2360: 64 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  d,.  Fts5Buffer 
2370: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
2380: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73       /* Use this
2390: 20 62 75 66 66 65 72 20 66 6f 72 20 73 70 61 63   buffer for spac
23a0: 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
23b0: 0a 20 20 75 38 20 2a 2a 70 61 2c 20 69 6e 74 20  .  u8 **pa, int 
23c0: 2a 70 6e 0a 29 7b 0a 20 20 46 74 73 35 50 6f 73  *pn.){.  Fts5Pos
23d0: 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61 74  listReader aStat
23e0: 69 63 5b 34 5d 3b 0a 20 20 46 74 73 35 50 6f 73  ic[4];.  Fts5Pos
23f0: 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49 74 65  listReader *aIte
2400: 72 20 3d 20 61 53 74 61 74 69 63 3b 0a 20 20 69  r = aStatic;.  i
2410: 6e 74 20 6e 49 74 65 72 20 3d 20 30 3b 0a 20 20  nt nIter = 0;.  
2420: 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 34 3b 0a  int nAlloc = 4;.
2430: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2440: 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 45 78 70 72  E_OK;.  Fts5Expr
2450: 54 65 72 6d 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Term *p;..  asse
2460: 72 74 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  rt( pTerm->pSyno
2470: 6e 79 6d 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  nym );.  for(p=p
2480: 54 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53  Term; p; p=p->pS
2490: 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 46 74 73  ynonym){.    Fts
24a0: 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
24b0: 72 20 3d 20 70 2d 3e 70 49 74 65 72 3b 0a 20 20  r = p->pIter;.  
24c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73    if( sqlite3Fts
24d0: 35 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 3d  5IterEof(pIter)=
24e0: 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
24f0: 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 7b 0a 20  wid==iRowid ){. 
2500: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
2510: 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69  nData==0 ) conti
2520: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  nue;.      if( n
2530: 49 74 65 72 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a  Iter==nAlloc ){.
2540: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
2550: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 50  e = sizeof(Fts5P
2560: 6f 73 6c 69 73 74 52 65 61 64 65 72 29 20 2a 20  oslistReader) * 
2570: 6e 41 6c 6c 6f 63 20 2a 20 32 3b 0a 20 20 20 20  nAlloc * 2;.    
2580: 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52      Fts5PoslistR
2590: 65 61 64 65 72 20 2a 61 4e 65 77 20 3d 20 28 46  eader *aNew = (F
25a0: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
25b0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
25c0: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20  (nByte);.       
25d0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
25e0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2600: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 6f         goto syno
2610: 6e 79 6d 5f 70 6f 73 6c 69 73 74 5f 6f 75 74 3b  nym_poslist_out;
2620: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2630: 20 20 20 6d 65 6d 63 70 79 28 61 4e 65 77 2c 20     memcpy(aNew, 
2640: 61 49 74 65 72 2c 20 73 69 7a 65 6f 66 28 46 74  aIter, sizeof(Ft
2650: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 29  s5PoslistReader)
2660: 20 2a 20 6e 49 74 65 72 29 3b 0a 20 20 20 20 20   * nIter);.     
2670: 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c     nAlloc = nAll
2680: 6f 63 2a 32 3b 0a 20 20 20 20 20 20 20 20 69 66  oc*2;.        if
2690: 28 20 61 49 74 65 72 21 3d 61 53 74 61 74 69 63  ( aIter!=aStatic
26a0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
26b0: 61 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aIter);.        
26c0: 61 49 74 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20  aIter = aNew;.  
26d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
26e0: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
26f0: 61 64 65 72 49 6e 69 74 28 70 49 74 65 72 2d 3e  aderInit(pIter->
2700: 70 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 6e 44  pData, pIter->nD
2710: 61 74 61 2c 20 26 61 49 74 65 72 5b 6e 49 74 65  ata, &aIter[nIte
2720: 72 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r]);.      asser
2730: 74 28 20 61 49 74 65 72 5b 6e 49 74 65 72 5d 2e  t( aIter[nIter].
2740: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  bEof==0 );.     
2750: 20 6e 49 74 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a   nIter++;.    }.
2760: 20 20 7d 0a 0a 20 20 69 66 28 20 6e 49 74 65 72    }..  if( nIter
2770: 3d 3d 31 20 29 7b 0a 20 20 20 20 2a 70 61 20 3d  ==1 ){.    *pa =
2780: 20 28 75 38 2a 29 61 49 74 65 72 5b 30 5d 2e 61   (u8*)aIter[0].a
2790: 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 61 49 74 65  ;.    *pn = aIte
27a0: 72 5b 30 5d 2e 6e 3b 0a 20 20 7d 65 6c 73 65 7b  r[0].n;.  }else{
27b0: 0a 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74  .    Fts5Poslist
27c0: 57 72 69 74 65 72 20 77 72 69 74 65 72 20 3d 20  Writer writer = 
27d0: 7b 30 7d 3b 0a 20 20 20 20 69 36 34 20 69 50 72  {0};.    i64 iPr
27e0: 65 76 20 3d 20 2d 31 3b 0a 20 20 20 20 66 74 73  ev = -1;.    fts
27f0: 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66  5BufferZero(pBuf
2800: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  );.    while( 1 
2810: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
2820: 20 20 20 20 20 20 69 36 34 20 69 4d 69 6e 20 3d        i64 iMin =
2830: 20 46 54 53 35 5f 4c 41 52 47 45 53 54 5f 49 4e   FTS5_LARGEST_IN
2840: 54 36 34 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  T64;.      for(i
2850: 3d 30 3b 20 69 3c 6e 49 74 65 72 3b 20 69 2b 2b  =0; i<nIter; i++
2860: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
2870: 49 74 65 72 5b 69 5d 2e 62 45 6f 66 3d 3d 30 20  Iter[i].bEof==0 
2880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2890: 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73 3d 3d   aIter[i].iPos==
28a0: 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
28b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28c0: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
28d0: 72 4e 65 78 74 28 26 61 49 74 65 72 5b 69 5d 29  rNext(&aIter[i])
28e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2900: 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d 2e     if( aIter[i].
2910: 69 50 6f 73 3c 69 4d 69 6e 20 29 7b 0a 20 20 20  iPos<iMin ){.   
2920: 20 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20           iMin = 
2930: 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73 3b 0a 20  aIter[i].iPos;. 
2940: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2950: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2960: 20 20 20 69 66 28 20 69 4d 69 6e 3d 3d 46 54 53     if( iMin==FTS
2970: 35 5f 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  5_LARGEST_INT64 
2980: 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
2990: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
29a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
29b0: 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
29c0: 65 6e 64 28 70 42 75 66 2c 20 26 77 72 69 74 65  end(pBuf, &write
29d0: 72 2c 20 69 4d 69 6e 29 3b 0a 20 20 20 20 20 20  r, iMin);.      
29e0: 69 50 72 65 76 20 3d 20 69 4d 69 6e 3b 0a 20 20  iPrev = iMin;.  
29f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2a00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a10: 20 20 20 2a 70 61 20 3d 20 70 42 75 66 2d 3e 70     *pa = pBuf->p
2a20: 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 70 42  ;.      *pn = pB
2a30: 75 66 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  uf->n;.    }.  }
2a40: 0a 0a 20 73 79 6e 6f 6e 79 6d 5f 70 6f 73 6c 69  .. synonym_posli
2a50: 73 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 61 49  st_out:.  if( aI
2a60: 74 65 72 21 3d 61 53 74 61 74 69 63 20 29 20 73  ter!=aStatic ) s
2a70: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49 74 65  qlite3_free(aIte
2a80: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
2a90: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 69  .}.../*.** All i
2aa0: 6e 64 69 76 69 64 75 61 6c 20 74 65 72 6d 20 69  ndividual term i
2ab0: 74 65 72 61 74 6f 72 73 20 69 6e 20 70 50 68 72  terators in pPhr
2ac0: 61 73 65 20 61 72 65 20 67 75 61 72 61 6e 74 65  ase are guarante
2ad0: 65 64 20 74 6f 20 62 65 20 76 61 6c 69 64 20 61  ed to be valid a
2ae0: 6e 64 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  nd.** pointing t
2af0: 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69 64  o the same rowid
2b00: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2b10: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  ion is called. T
2b20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
2b30: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 63   checks if the c
2b40: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 72 65 61  urrent rowid rea
2b50: 6c 6c 79 20 69 73 20 61 20 6d 61 74 63 68 2c 20  lly is a match, 
2b60: 61 6e 64 20 69 66 20 73 6f 20 70 6f 70 75 6c 61  and if so popula
2b70: 74 65 73 0a 2a 2a 20 74 68 65 20 70 50 68 72 61  tes.** the pPhra
2b80: 73 65 2d 3e 70 6f 73 6c 69 73 74 20 62 75 66 66  se->poslist buff
2b90: 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  er accordingly. 
2ba0: 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  Output parameter
2bb0: 20 2a 70 62 4d 61 74 63 68 0a 2a 2a 20 69 73 20   *pbMatch.** is 
2bc0: 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74  set to true if t
2bd0: 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61 20  his is really a 
2be0: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
2bf0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2c00: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2c10: 74 75 72 6e 65 64 20 69 66 20 61 6e 20 65 72 72  turned if an err
2c20: 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 61 6e  or occurs, or an
2c30: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2c40: 64 65 20 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  de .** otherwise
2c50: 2e 20 49 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73  . It is not cons
2c60: 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
2c70: 63 6f 64 65 20 69 66 20 74 68 65 20 63 75 72 72  code if the curr
2c80: 65 6e 74 20 72 6f 77 69 64 20 69 73 20 0a 2a 2a  ent rowid is .**
2c90: 20 6e 6f 74 20 61 20 6d 61 74 63 68 2e 0a 2a 2f   not a match..*/
2ca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2cb0: 45 78 70 72 50 68 72 61 73 65 49 73 4d 61 74 63  ExprPhraseIsMatc
2cc0: 68 28 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  h(.  Fts5ExprNod
2cd0: 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20  e *pNode,       
2ce0: 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 70 50 68       /* Node pPh
2cf0: 72 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rase belongs to 
2d00: 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 50 68 72  */.  Fts5ExprPhr
2d10: 61 73 65 20 2a 70 50 68 72 61 73 65 2c 20 20 20  ase *pPhrase,   
2d20: 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20 6f       /* Phrase o
2d30: 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c  bject to initial
2d40: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  ize */.  int *pb
2d50: 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20  Match           
2d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2d70: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
2d80: 72 65 61 6c 6c 79 20 61 20 6d 61 74 63 68 20 2a  really a match *
2d90: 2f 0a 29 7b 0a 20 20 46 74 73 35 50 6f 73 6c 69  /.){.  Fts5Posli
2da0: 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72 20  stWriter writer 
2db0: 3d 20 7b 30 7d 3b 0a 20 20 46 74 73 35 50 6f 73  = {0};.  Fts5Pos
2dc0: 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61 74  listReader aStat
2dd0: 69 63 5b 34 5d 3b 0a 20 20 46 74 73 35 50 6f 73  ic[4];.  Fts5Pos
2de0: 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49 74 65  listReader *aIte
2df0: 72 20 3d 20 61 53 74 61 74 69 63 3b 0a 20 20 69  r = aStatic;.  i
2e00: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
2e10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20   SQLITE_OK;.  . 
2e20: 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
2e30: 26 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73  &pPhrase->poslis
2e40: 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  t);..  /* If the
2e50: 20 61 53 74 61 74 69 63 5b 5d 20 61 72 72 61 79   aStatic[] array
2e60: 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65 6e   is not large en
2e70: 6f 75 67 68 2c 20 61 6c 6c 6f 63 61 74 65 20 61  ough, allocate a
2e80: 20 6c 61 72 67 65 20 61 72 72 61 79 0a 20 20 2a   large array.  *
2e90: 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  * using sqlite3_
2ea0: 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73 20 61  malloc(). This a
2eb0: 70 70 72 6f 61 63 68 20 63 6f 75 6c 64 20 62 65  pproach could be
2ec0: 20 69 6d 70 72 6f 76 65 64 20 75 70 6f 6e 2e 20   improved upon. 
2ed0: 2a 2f 0a 20 20 69 66 28 20 70 50 68 72 61 73 65  */.  if( pPhrase
2ee0: 2d 3e 6e 54 65 72 6d 3e 41 72 72 61 79 53 69 7a  ->nTerm>ArraySiz
2ef0: 65 28 61 53 74 61 74 69 63 29 20 29 7b 0a 20 20  e(aStatic) ){.  
2f00: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
2f10: 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74  zeof(Fts5Poslist
2f20: 52 65 61 64 65 72 29 20 2a 20 70 50 68 72 61 73  Reader) * pPhras
2f30: 65 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 61 49  e->nTerm;.    aI
2f40: 74 65 72 20 3d 20 28 46 74 73 35 50 6f 73 6c 69  ter = (Fts5Posli
2f50: 73 74 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65  stReader*)sqlite
2f60: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
2f70: 0a 20 20 20 20 69 66 28 20 21 61 49 74 65 72 20  .    if( !aIter 
2f80: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2f90: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
2fa0: 73 65 74 28 61 49 74 65 72 2c 20 30 2c 20 73 69  set(aIter, 0, si
2fb0: 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74  zeof(Fts5Poslist
2fc0: 52 65 61 64 65 72 29 20 2a 20 70 50 68 72 61 73  Reader) * pPhras
2fd0: 65 2d 3e 6e 54 65 72 6d 29 3b 0a 0a 20 20 2f 2a  e->nTerm);..  /*
2fe0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 74 65   Initialize a te
2ff0: 72 6d 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20  rm iterator for 
3000: 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
3010: 20 70 68 72 61 73 65 20 2a 2f 0a 20 20 66 6f 72   phrase */.  for
3020: 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d  (i=0; i<pPhrase-
3030: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
3040: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
3050: 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
3060: 2d 3e 61 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20  ->aTerm[i];.    
3070: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 69  int n = 0;.    i
3080: 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20  nt bFlag = 0;.  
3090: 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 20    u8 *a = 0;.   
30a0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e   if( pTerm->pSyn
30b0: 6f 6e 79 6d 20 29 7b 0a 20 20 20 20 20 20 46 74  onym ){.      Ft
30c0: 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b  s5Buffer buf = {
30d0: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20  0, 0, 0};.      
30e0: 72 63 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e  rc = fts5ExprSyn
30f0: 6f 6e 79 6d 4c 69 73 74 28 70 54 65 72 6d 2c 20  onymList(pTerm, 
3100: 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 2c 20 26  pNode->iRowid, &
3110: 62 75 66 2c 20 26 61 2c 20 26 6e 29 3b 0a 20 20  buf, &a, &n);.  
3120: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
3130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
3140: 65 65 28 61 29 3b 0a 20 20 20 20 20 20 20 20 67  ee(a);.        g
3150: 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b  oto ismatch_out;
3160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3170: 66 28 20 61 3d 3d 62 75 66 2e 70 20 29 20 62 46  f( a==buf.p ) bF
3180: 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  lag = 1;.    }el
3190: 73 65 7b 0a 20 20 20 20 20 20 61 20 3d 20 28 75  se{.      a = (u
31a0: 38 2a 29 70 54 65 72 6d 2d 3e 70 49 74 65 72 2d  8*)pTerm->pIter-
31b0: 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 6e 20  >pData;.      n 
31c0: 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 2d 3e  = pTerm->pIter->
31d0: 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  nData;.    }.   
31e0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
31f0: 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 61 2c  istReaderInit(a,
3200: 20 6e 2c 20 26 61 49 74 65 72 5b 69 5d 29 3b 0a   n, &aIter[i]);.
3210: 20 20 20 20 61 49 74 65 72 5b 69 5d 2e 62 46 6c      aIter[i].bFl
3220: 61 67 20 3d 20 28 75 38 29 62 46 6c 61 67 3b 0a  ag = (u8)bFlag;.
3230: 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d      if( aIter[i]
3240: 2e 62 45 6f 66 20 29 20 67 6f 74 6f 20 69 73 6d  .bEof ) goto ism
3250: 61 74 63 68 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  atch_out;.  }.. 
3260: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
3270: 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 20 20 20   int bMatch;.   
3280: 20 69 36 34 20 69 50 6f 73 20 3d 20 61 49 74 65   i64 iPos = aIte
3290: 72 5b 30 5d 2e 69 50 6f 73 3b 0a 20 20 20 20 64  r[0].iPos;.    d
32a0: 6f 20 7b 0a 20 20 20 20 20 20 62 4d 61 74 63 68  o {.      bMatch
32b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
32c0: 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e  i=0; i<pPhrase->
32d0: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
32e0: 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
32f0: 52 65 61 64 65 72 20 2a 70 50 6f 73 20 3d 20 26  Reader *pPos = &
3300: 61 49 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  aIter[i];.      
3310: 20 20 69 36 34 20 69 41 64 6a 20 3d 20 69 50 6f    i64 iAdj = iPo
3320: 73 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69  s + i;.        i
3330: 66 28 20 70 50 6f 73 2d 3e 69 50 6f 73 21 3d 69  f( pPos->iPos!=i
3340: 41 64 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Adj ){.         
3350: 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20   bMatch = 0;.   
3360: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50         while( pP
3370: 6f 73 2d 3e 69 50 6f 73 3c 69 41 64 6a 20 29 7b  os->iPos<iAdj ){
3380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3390: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
33a0: 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 70 50  istReaderNext(pP
33b0: 6f 73 29 20 29 20 67 6f 74 6f 20 69 73 6d 61 74  os) ) goto ismat
33c0: 63 68 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ch_out;.        
33d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
33e0: 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69 41 64  ( pPos->iPos>iAd
33f0: 6a 20 29 20 69 50 6f 73 20 3d 20 70 50 6f 73 2d  j ) iPos = pPos-
3400: 3e 69 50 6f 73 2d 69 3b 0a 20 20 20 20 20 20 20  >iPos-i;.       
3410: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3420: 77 68 69 6c 65 28 20 62 4d 61 74 63 68 3d 3d 30  while( bMatch==0
3430: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65   );..    /* Appe
3440: 6e 64 20 70 6f 73 69 74 69 6f 6e 20 69 50 6f 73  nd position iPos
3450: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a   to the output *
3460: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
3470: 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69  e3Fts5PoslistWri
3480: 74 65 72 41 70 70 65 6e 64 28 26 70 50 68 72 61  terAppend(&pPhra
3490: 73 65 2d 3e 70 6f 73 6c 69 73 74 2c 20 26 77 72  se->poslist, &wr
34a0: 69 74 65 72 2c 20 69 50 6f 73 29 3b 0a 20 20 20  iter, iPos);.   
34b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34c0: 4f 4b 20 29 20 67 6f 74 6f 20 69 73 6d 61 74 63  OK ) goto ismatc
34d0: 68 5f 6f 75 74 3b 0a 0a 20 20 20 20 66 6f 72 28  h_out;..    for(
34e0: 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e  i=0; i<pPhrase->
34f0: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
3500: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74     if( sqlite3Ft
3510: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e  s5PoslistReaderN
3520: 65 78 74 28 26 61 49 74 65 72 5b 69 5d 29 20 29  ext(&aIter[i]) )
3530: 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75   goto ismatch_ou
3540: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 69  t;.    }.  }.. i
3550: 73 6d 61 74 63 68 5f 6f 75 74 3a 0a 20 20 2a 70  smatch_out:.  *p
3560: 62 4d 61 74 63 68 20 3d 20 28 70 50 68 72 61 73  bMatch = (pPhras
3570: 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3e 30 29 3b  e->poslist.n>0);
3580: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
3590: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b  hrase->nTerm; i+
35a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 49 74 65  +){.    if( aIte
35b0: 72 5b 69 5d 2e 62 46 6c 61 67 20 29 20 73 71 6c  r[i].bFlag ) sql
35c0: 69 74 65 33 5f 66 72 65 65 28 28 75 38 2a 29 61  ite3_free((u8*)a
35d0: 49 74 65 72 5b 69 5d 2e 61 29 3b 0a 20 20 7d 0a  Iter[i].a);.  }.
35e0: 20 20 69 66 28 20 61 49 74 65 72 21 3d 61 53 74    if( aIter!=aSt
35f0: 61 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66  atic ) sqlite3_f
3600: 72 65 65 28 61 49 74 65 72 29 3b 0a 20 20 72 65  ree(aIter);.  re
3610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65  turn rc;.}..type
3620: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 4c  def struct Fts5L
3630: 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20 46  ookaheadReader F
3640: 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64  ts5LookaheadRead
3650: 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35 4c  er;.struct Fts5L
3660: 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20 7b  ookaheadReader {
3670: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20  .  const u8 *a; 
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
36a0: 74 61 69 6e 69 6e 67 20 70 6f 73 69 74 69 6f 6e  taining position
36b0: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e   list */.  int n
36c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
36e0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 5b 5d  ze of buffer a[]
36f0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
3700: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3720: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
3730: 20 69 6e 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73   in position lis
3740: 74 20 2a 2f 0a 20 20 69 36 34 20 69 50 6f 73 3b  t */.  i64 iPos;
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
3770: 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20 20  t position */.  
3780: 69 36 34 20 69 4c 6f 6f 6b 61 68 65 61 64 3b 20  i64 iLookahead; 
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 2f 2a 20 4e 65 78 74 20 70 6f 73 69 74 69 6f 6e  /* Next position
37b0: 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
37c0: 46 54 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45  FTS5_LOOKAHEAD_E
37d0: 4f 46 20 28 28 28 69 36 34 29 31 29 20 3c 3c 20  OF (((i64)1) << 
37e0: 36 32 29 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  62)..static int 
37f0: 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61  fts5LookaheadRea
3800: 64 65 72 4e 65 78 74 28 46 74 73 35 4c 6f 6f 6b  derNext(Fts5Look
3810: 61 68 65 61 64 52 65 61 64 65 72 20 2a 70 29 7b  aheadReader *p){
3820: 0a 20 20 70 2d 3e 69 50 6f 73 20 3d 20 70 2d 3e  .  p->iPos = p->
3830: 69 4c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 69 66  iLookahead;.  if
3840: 28 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  ( sqlite3Fts5Pos
3850: 6c 69 73 74 4e 65 78 74 36 34 28 70 2d 3e 61 2c  listNext64(p->a,
3860: 20 70 2d 3e 6e 2c 20 26 70 2d 3e 69 2c 20 26 70   p->n, &p->i, &p
3870: 2d 3e 69 4c 6f 6f 6b 61 68 65 61 64 29 20 29 7b  ->iLookahead) ){
3880: 0a 20 20 20 20 70 2d 3e 69 4c 6f 6f 6b 61 68 65  .    p->iLookahe
3890: 61 64 20 3d 20 46 54 53 35 5f 4c 4f 4f 4b 41 48  ad = FTS5_LOOKAH
38a0: 45 41 44 5f 45 4f 46 3b 0a 20 20 7d 0a 20 20 72  EAD_EOF;.  }.  r
38b0: 65 74 75 72 6e 20 28 70 2d 3e 69 50 6f 73 3d 3d  eturn (p->iPos==
38c0: 46 54 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45  FTS5_LOOKAHEAD_E
38d0: 4f 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OF);.}..static i
38e0: 6e 74 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64  nt fts5Lookahead
38f0: 52 65 61 64 65 72 49 6e 69 74 28 0a 20 20 63 6f  ReaderInit(.  co
3900: 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
3910: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3920: 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20   Buffer to read 
3930: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 72  position list fr
3940: 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 4c 6f 6f 6b  om */.  Fts5Look
3950: 61 68 65 61 64 52 65 61 64 65 72 20 2a 70 20 20  aheadReader *p  
3960: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
3970: 74 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 69 6e  tor object to in
3980: 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 29 7b 0a 20  itialize */.){. 
3990: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
39a0: 7a 65 6f 66 28 46 74 73 35 4c 6f 6f 6b 61 68 65  zeof(Fts5Lookahe
39b0: 61 64 52 65 61 64 65 72 29 29 3b 0a 20 20 70 2d  adReader));.  p-
39c0: 3e 61 20 3d 20 61 3b 0a 20 20 70 2d 3e 6e 20 3d  >a = a;.  p->n =
39d0: 20 6e 3b 0a 20 20 66 74 73 35 4c 6f 6f 6b 61 68   n;.  fts5Lookah
39e0: 65 61 64 52 65 61 64 65 72 4e 65 78 74 28 70 29  eadReaderNext(p)
39f0: 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 4c  ;.  return fts5L
3a00: 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65  ookaheadReaderNe
3a10: 78 74 28 70 29 3b 0a 7d 0a 0a 74 79 70 65 64 65  xt(p);.}..typede
3a20: 66 20 73 74 72 75 63 74 20 46 74 73 35 4e 65 61  f struct Fts5Nea
3a30: 72 54 72 69 6d 6d 65 72 20 46 74 73 35 4e 65 61  rTrimmer Fts5Nea
3a40: 72 54 72 69 6d 6d 65 72 3b 0a 73 74 72 75 63 74  rTrimmer;.struct
3a50: 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65 72   Fts5NearTrimmer
3a60: 20 7b 0a 20 20 46 74 73 35 4c 6f 6f 6b 61 68 65   {.  Fts5Lookahe
3a70: 61 64 52 65 61 64 65 72 20 72 65 61 64 65 72 3b  adReader reader;
3a80: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 69 74       /* Input it
3a90: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35  erator */.  Fts5
3aa0: 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
3ab0: 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57  iter;       /* W
3ac0: 72 69 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  riter context */
3ad0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
3ae0: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
3af0: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 70 6f 73     /* Output pos
3b00: 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  list */.};../*.*
3b10: 2a 20 54 68 65 20 6e 65 61 72 2d 73 65 74 20 6f  * The near-set o
3b20: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
3b30: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3b40: 6e 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  nt contains more
3b50: 20 74 68 61 6e 0a 2a 2a 20 6f 6e 65 20 70 68 72   than.** one phr
3b60: 61 73 65 2e 20 41 6c 6c 20 70 68 72 61 73 65 73  ase. All phrases
3b70: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
3b80: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77   to the same row
3b90: 2e 20 54 68 65 0a 2a 2a 20 46 74 73 35 45 78 70  . The.** Fts5Exp
3ba0: 72 50 68 72 61 73 65 2e 70 6f 73 6c 69 73 74 20  rPhrase.poslist 
3bb0: 62 75 66 66 65 72 73 20 61 72 65 20 70 6f 70 75  buffers are popu
3bc0: 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
3bd0: 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
3be0: 0a 2a 2a 20 74 65 73 74 73 20 69 66 20 74 68 65  .** tests if the
3bf0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 6f 6e   current row con
3c00: 74 61 69 6e 73 20 69 6e 73 74 61 6e 63 65 73 20  tains instances 
3c10: 6f 66 20 65 61 63 68 20 70 68 72 61 73 65 20 73  of each phrase s
3c20: 75 66 66 69 63 69 65 6e 74 6c 79 0a 2a 2a 20 63  ufficiently.** c
3c30: 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 20 74 6f  lose together to
3c40: 20 6d 65 65 74 20 74 68 65 20 4e 45 41 52 20 63   meet the NEAR c
3c50: 6f 6e 73 74 72 61 69 6e 74 2e 20 4e 6f 6e 2d 7a  onstraint. Non-z
3c60: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
3c70: 69 66 20 69 74 0a 2a 2a 20 64 6f 65 73 2c 20 6f  if it.** does, o
3c80: 72 20 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65  r zero otherwise
3c90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 2f 6f 75  ..**.** If in/ou
3ca0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 52  t parameter (*pR
3cb0: 63 29 20 69 73 20 73 65 74 20 74 6f 20 6f 74 68  c) is set to oth
3cc0: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
3cd0: 4b 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  K when this.** f
3ce0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
3cf0: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
3d00: 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
3d10: 72 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 4e  r (e.g. SQLITE_N
3d20: 4f 4d 45 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 20  OMEM).** occurs 
3d30: 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
3d40: 74 69 6f 6e 20 28 2a 70 52 63 29 20 69 73 20 73  tion (*pRc) is s
3d50: 65 74 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 62  et accordingly b
3d60: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
3d70: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
3d80: 61 6c 75 65 20 69 73 20 75 6e 64 65 66 69 6e 65  alue is undefine
3d90: 64 20 69 6e 20 62 6f 74 68 20 74 68 65 73 65 20  d in both these 
3da0: 63 61 73 65 73 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  cases..** .** If
3db0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
3dc0: 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 28 61   and non-zero (a
3dd0: 20 6d 61 74 63 68 29 20 69 73 20 72 65 74 75 72   match) is retur
3de0: 6e 65 64 2c 20 74 68 65 20 70 6f 73 69 74 69 6f  ned, the positio
3df0: 6e 2d 6c 69 73 74 0a 2a 2a 20 6f 66 20 65 61 63  n-list.** of eac
3e00: 68 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20  h phrase object 
3e10: 69 73 20 65 64 69 74 65 64 20 74 6f 20 63 6f 6e  is edited to con
3e20: 74 61 69 6e 20 6f 6e 6c 79 20 74 68 6f 73 65 20  tain only those 
3e30: 65 6e 74 72 69 65 73 20 74 68 61 74 0a 2a 2a 20  entries that.** 
3e40: 6d 65 65 74 20 74 68 65 20 63 6f 6e 73 74 72 61  meet the constra
3e50: 69 6e 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  int before retur
3e60: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
3e70: 69 6e 74 20 66 74 73 35 45 78 70 72 4e 65 61 72  int fts5ExprNear
3e80: 49 73 4d 61 74 63 68 28 69 6e 74 20 2a 70 52 63  IsMatch(int *pRc
3e90: 2c 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  , Fts5ExprNearse
3ea0: 74 20 2a 70 4e 65 61 72 29 7b 0a 20 20 46 74 73  t *pNear){.  Fts
3eb0: 35 4e 65 61 72 54 72 69 6d 6d 65 72 20 61 53 74  5NearTrimmer aSt
3ec0: 61 74 69 63 5b 34 5d 3b 0a 20 20 46 74 73 35 4e  atic[4];.  Fts5N
3ed0: 65 61 72 54 72 69 6d 6d 65 72 20 2a 61 20 3d 20  earTrimmer *a = 
3ee0: 61 53 74 61 74 69 63 3b 0a 20 20 46 74 73 35 45  aStatic;.  Fts5E
3ef0: 78 70 72 50 68 72 61 73 65 20 2a 2a 61 70 50 68  xprPhrase **apPh
3f00: 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70  rase = pNear->ap
3f10: 50 68 72 61 73 65 3b 0a 0a 20 20 69 6e 74 20 69  Phrase;..  int i
3f20: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52  ;.  int rc = *pR
3f30: 63 3b 0a 20 20 69 6e 74 20 62 4d 61 74 63 68 3b  c;.  int bMatch;
3f40: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 61  ..  assert( pNea
3f50: 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20 29 3b 0a  r->nPhrase>1 );.
3f60: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 53 74  .  /* If the aSt
3f70: 61 74 69 63 5b 5d 20 61 72 72 61 79 20 69 73 20  atic[] array is 
3f80: 6e 6f 74 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  not large enough
3f90: 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6c 61 72  , allocate a lar
3fa0: 67 65 20 61 72 72 61 79 0a 20 20 2a 2a 20 75 73  ge array.  ** us
3fb0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ing sqlite3_mall
3fc0: 6f 63 28 29 2e 20 54 68 69 73 20 61 70 70 72 6f  oc(). This appro
3fd0: 61 63 68 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  ach could be imp
3fe0: 72 6f 76 65 64 20 75 70 6f 6e 2e 20 2a 2f 0a 20  roved upon. */. 
3ff0: 20 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72   if( pNear->nPhr
4000: 61 73 65 3e 41 72 72 61 79 53 69 7a 65 28 61 53  ase>ArraySize(aS
4010: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 69 6e  tatic) ){.    in
4020: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
4030: 28 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65 72  (Fts5NearTrimmer
4040: 29 20 2a 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61  ) * pNear->nPhra
4050: 73 65 3b 0a 20 20 20 20 61 20 3d 20 28 46 74 73  se;.    a = (Fts
4060: 35 4e 65 61 72 54 72 69 6d 6d 65 72 2a 29 73 71  5NearTrimmer*)sq
4070: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
4080: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
4090: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
40a0: 6d 73 65 74 28 61 53 74 61 74 69 63 2c 20 30 2c  mset(aStatic, 0,
40b0: 20 73 69 7a 65 6f 66 28 61 53 74 61 74 69 63 29   sizeof(aStatic)
40c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
40d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
40e0: 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
40f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
4100: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
4110: 61 20 6c 6f 6f 6b 61 68 65 61 64 20 69 74 65 72  a lookahead iter
4120: 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 70 68  ator for each ph
4130: 72 61 73 65 2e 20 41 66 74 65 72 20 70 61 73 73  rase. After pass
4140: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 62 75 66  ing the.  ** buf
4150: 66 65 72 20 61 6e 64 20 62 75 66 66 65 72 20 73  fer and buffer s
4160: 69 7a 65 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61  ize to the looka
4170: 73 69 64 65 2d 72 65 61 64 65 72 20 69 6e 69 74  side-reader init
4180: 20 66 75 6e 63 74 69 6f 6e 2c 20 7a 65 72 6f 0a   function, zero.
4190: 20 20 2a 2a 20 74 68 65 20 70 68 72 61 73 65 20    ** the phrase 
41a0: 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 2e 20  poslist buffer. 
41b0: 54 68 65 20 6e 65 77 20 70 6f 73 6c 69 73 74 20  The new poslist 
41c0: 66 6f 72 20 74 68 65 20 70 68 72 61 73 65 20 28  for the phrase (
41d0: 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 2a 2a 20  containing.  ** 
41e0: 74 68 65 20 73 61 6d 65 20 65 6e 74 72 69 65 73  the same entries
41f0: 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
4200: 20 77 69 74 68 20 73 6f 6d 65 20 65 6e 74 72 69   with some entri
4210: 65 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 61 63  es removed on ac
4220: 63 6f 75 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 74  count .  ** of t
4230: 68 65 20 4e 45 41 52 20 63 6f 6e 73 74 72 61 69  he NEAR constrai
4240: 6e 74 29 20 69 73 20 77 72 69 74 74 65 6e 20 6f  nt) is written o
4250: 76 65 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ver the original
4260: 20 65 76 65 6e 20 61 73 20 69 74 20 69 73 0a 20   even as it is. 
4270: 20 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 2e 20   ** being read. 
4280: 54 68 69 73 20 69 73 20 73 61 66 65 20 61 73 20  This is safe as 
4290: 74 68 65 20 65 6e 74 72 69 65 73 20 66 6f 72 20  the entries for 
42a0: 74 68 65 20 6e 65 77 20 70 6f 73 6c 69 73 74 20  the new poslist 
42b0: 61 72 65 20 61 0a 20 20 2a 2a 20 73 75 62 73 65  are a.  ** subse
42c0: 74 20 6f 66 20 74 68 65 20 6f 6c 64 2c 20 73 6f  t of the old, so
42d0: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
42e0: 62 6c 65 20 66 6f 72 20 64 61 74 61 20 79 65 74  ble for data yet
42f0: 20 74 6f 20 62 65 20 72 65 61 64 20 74 6f 0a 20   to be read to. 
4300: 20 2a 2a 20 62 65 20 6f 76 65 72 77 72 69 74 74   ** be overwritt
4310: 65 6e 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  en.  */.  for(i=
4320: 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72  0; i<pNear->nPhr
4330: 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ase; i++){.    F
4340: 74 73 35 42 75 66 66 65 72 20 2a 70 50 6f 73 6c  ts5Buffer *pPosl
4350: 69 73 74 20 3d 20 26 61 70 50 68 72 61 73 65 5b  ist = &apPhrase[
4360: 69 5d 2d 3e 70 6f 73 6c 69 73 74 3b 0a 20 20 20  i]->poslist;.   
4370: 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
4380: 61 64 65 72 49 6e 69 74 28 70 50 6f 73 6c 69 73  aderInit(pPoslis
4390: 74 2d 3e 70 2c 20 70 50 6f 73 6c 69 73 74 2d 3e  t->p, pPoslist->
43a0: 6e 2c 20 26 61 5b 69 5d 2e 72 65 61 64 65 72 29  n, &a[i].reader)
43b0: 3b 0a 20 20 20 20 70 50 6f 73 6c 69 73 74 2d 3e  ;.    pPoslist->
43c0: 6e 20 3d 20 30 3b 0a 20 20 20 20 61 5b 69 5d 2e  n = 0;.    a[i].
43d0: 70 4f 75 74 20 3d 20 70 50 6f 73 6c 69 73 74 3b  pOut = pPoslist;
43e0: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
43f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 41 64 76   ){.    int iAdv
4400: 3b 0a 20 20 20 20 69 36 34 20 69 4d 69 6e 3b 0a  ;.    i64 iMin;.
4410: 20 20 20 20 69 36 34 20 69 4d 61 78 3b 0a 0a 20      i64 iMax;.. 
4420: 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
4430: 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 70 68   advances the ph
4440: 72 61 73 65 20 69 74 65 72 61 74 6f 72 73 20 75  rase iterators u
4450: 6e 74 69 6c 20 74 68 65 79 20 70 6f 69 6e 74 20  ntil they point 
4460: 74 6f 20 61 20 73 65 74 20 6f 66 0a 20 20 20 20  to a set of.    
4470: 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ** entries that 
4480: 74 6f 67 65 74 68 65 72 20 63 6f 6d 70 72 69 73  together compris
4490: 65 20 61 20 6d 61 74 63 68 2e 20 20 2a 2f 0a 20  e a match.  */. 
44a0: 20 20 20 69 4d 61 78 20 3d 20 61 5b 30 5d 2e 72     iMax = a[0].r
44b0: 65 61 64 65 72 2e 69 50 6f 73 3b 0a 20 20 20 20  eader.iPos;.    
44c0: 64 6f 20 7b 0a 20 20 20 20 20 20 62 4d 61 74 63  do {.      bMatc
44d0: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  h = 1;.      for
44e0: 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e  (i=0; i<pNear->n
44f0: 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20  Phrase; i++){.  
4500: 20 20 20 20 20 20 46 74 73 35 4c 6f 6f 6b 61 68        Fts5Lookah
4510: 65 61 64 52 65 61 64 65 72 20 2a 70 50 6f 73 20  eadReader *pPos 
4520: 3d 20 26 61 5b 69 5d 2e 72 65 61 64 65 72 3b 0a  = &a[i].reader;.
4530: 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69          iMin = i
4540: 4d 61 78 20 2d 20 70 4e 65 61 72 2d 3e 61 70 50  Max - pNear->apP
4550: 68 72 61 73 65 5b 69 5d 2d 3e 6e 54 65 72 6d 20  hrase[i]->nTerm 
4560: 2d 20 70 4e 65 61 72 2d 3e 6e 4e 65 61 72 3b 0a  - pNear->nNear;.
4570: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6f 73          if( pPos
4580: 2d 3e 69 50 6f 73 3c 69 4d 69 6e 20 7c 7c 20 70  ->iPos<iMin || p
4590: 50 6f 73 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29  Pos->iPos>iMax )
45a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74  {.          bMat
45b0: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
45c0: 20 20 77 68 69 6c 65 28 20 70 50 6f 73 2d 3e 69    while( pPos->i
45d0: 50 6f 73 3c 69 4d 69 6e 20 29 7b 0a 20 20 20 20  Pos<iMin ){.    
45e0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
45f0: 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 4e  LookaheadReaderN
4600: 65 78 74 28 70 50 6f 73 29 20 29 20 67 6f 74 6f  ext(pPos) ) goto
4610: 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20   ismatch_out;.  
4620: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4630: 20 20 20 20 69 66 28 20 70 50 6f 73 2d 3e 69 50      if( pPos->iP
4640: 6f 73 3e 69 4d 61 78 20 29 20 69 4d 61 78 20 3d  os>iMax ) iMax =
4650: 20 70 50 6f 73 2d 3e 69 50 6f 73 3b 0a 20 20 20   pPos->iPos;.   
4660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4670: 20 20 20 7d 77 68 69 6c 65 28 20 62 4d 61 74 63     }while( bMatc
4680: 68 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  h==0 );..    /* 
4690: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
46a0: 65 61 63 68 20 6f 75 74 70 75 74 20 70 6f 73 69  each output posi
46b0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20  tion list */.   
46c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61   for(i=0; i<pNea
46d0: 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29  r->nPhrase; i++)
46e0: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50 6f 73  {.      i64 iPos
46f0: 20 3d 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69   = a[i].reader.i
4700: 50 6f 73 3b 0a 20 20 20 20 20 20 46 74 73 35 50  Pos;.      Fts5P
4710: 6f 73 6c 69 73 74 57 72 69 74 65 72 20 2a 70 57  oslistWriter *pW
4720: 72 69 74 65 72 20 3d 20 26 61 5b 69 5d 2e 77 72  riter = &a[i].wr
4730: 69 74 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  iter;.      if( 
4740: 61 5b 69 5d 2e 70 4f 75 74 2d 3e 6e 3d 3d 30 20  a[i].pOut->n==0 
4750: 7c 7c 20 69 50 6f 73 21 3d 70 57 72 69 74 65 72  || iPos!=pWriter
4760: 2d 3e 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->iPrev ){.     
4770: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
4780: 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e  slistWriterAppen
4790: 64 28 61 5b 69 5d 2e 70 4f 75 74 2c 20 70 57 72  d(a[i].pOut, pWr
47a0: 69 74 65 72 2c 20 69 50 6f 73 29 3b 0a 20 20 20  iter, iPos);.   
47b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
47c0: 69 41 64 76 20 3d 20 30 3b 0a 20 20 20 20 69 4d  iAdv = 0;.    iM
47d0: 69 6e 20 3d 20 61 5b 30 5d 2e 72 65 61 64 65 72  in = a[0].reader
47e0: 2e 69 4c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  .iLookahead;.   
47f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61   for(i=0; i<pNea
4800: 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29  r->nPhrase; i++)
4810: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d  {.      if( a[i]
4820: 2e 72 65 61 64 65 72 2e 69 4c 6f 6f 6b 61 68 65  .reader.iLookahe
4830: 61 64 20 3c 20 69 4d 69 6e 20 29 7b 0a 20 20 20  ad < iMin ){.   
4840: 20 20 20 20 20 69 4d 69 6e 20 3d 20 61 5b 69 5d       iMin = a[i]
4850: 2e 72 65 61 64 65 72 2e 69 4c 6f 6f 6b 61 68 65  .reader.iLookahe
4860: 61 64 3b 0a 20 20 20 20 20 20 20 20 69 41 64 76  ad;.        iAdv
4870: 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = i;.      }.  
4880: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 74 73 35    }.    if( fts5
4890: 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 4e  LookaheadReaderN
48a0: 65 78 74 28 26 61 5b 69 41 64 76 5d 2e 72 65 61  ext(&a[iAdv].rea
48b0: 64 65 72 29 20 29 20 67 6f 74 6f 20 69 73 6d 61  der) ) goto isma
48c0: 74 63 68 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  tch_out;.  }..  
48d0: 69 73 6d 61 74 63 68 5f 6f 75 74 3a 20 7b 0a 20  ismatch_out: {. 
48e0: 20 20 20 69 6e 74 20 62 52 65 74 20 3d 20 61 5b     int bRet = a[
48f0: 30 5d 2e 70 4f 75 74 2d 3e 6e 3e 30 3b 0a 20 20  0].pOut->n>0;.  
4900: 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
4910: 20 69 66 28 20 61 21 3d 61 53 74 61 74 69 63 20   if( a!=aStatic 
4920: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61  ) sqlite3_free(a
4930: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 52  );.    return bR
4940: 65 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  et;.  }.}../*.**
4950: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
4960: 72 20 70 49 74 65 72 20 75 6e 74 69 6c 20 69 74  r pIter until it
4970: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
4980: 75 65 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 6c  ue equal to or l
4990: 61 73 74 65 72 0a 2a 2a 20 74 68 61 6e 20 74 68  aster.** than th
49a0: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
49b0: 6f 66 20 2a 70 69 4c 61 73 74 2e 20 49 66 20 74  of *piLast. If t
49c0: 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 69 74  his means the it
49d0: 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a 2a 2a  erator points.**
49e0: 20 74 6f 20 61 20 76 61 6c 75 65 20 6c 61 73 74   to a value last
49f0: 65 72 20 74 68 61 6e 20 2a 70 69 4c 61 73 74 2c  er than *piLast,
4a00: 20 75 70 64 61 74 65 20 2a 70 69 4c 61 73 74 20   update *piLast 
4a10: 74 6f 20 74 68 65 20 6e 65 77 20 6c 61 73 74 65  to the new laste
4a20: 73 74 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  st value..**.** 
4a30: 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
4a40: 72 65 61 63 68 65 73 20 45 4f 46 2c 20 73 65 74  reaches EOF, set
4a50: 20 2a 70 62 45 6f 66 20 74 6f 20 74 72 75 65 20   *pbEof to true 
4a60: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
4a70: 2e 20 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  . If.** an error
4a80: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 52   occurs, set *pR
4a90: 63 20 74 6f 20 61 6e 20 65 72 72 6f 72 20 63 6f  c to an error co
4aa0: 64 65 2e 20 49 66 20 65 69 74 68 65 72 20 2a 70  de. If either *p
4ab0: 62 45 6f 66 20 6f 72 20 2a 70 52 63 0a 2a 2a 20  bEof or *pRc.** 
4ac0: 61 72 65 20 73 65 74 2c 20 72 65 74 75 72 6e 20  are set, return 
4ad0: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
4ae0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
4af0: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
4b00: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
4b10: 41 64 76 61 6e 63 65 74 6f 28 0a 20 20 46 74 73  Advanceto(.  Fts
4b20: 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
4b30: 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
4b40: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
4b50: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  nce */.  int bDe
4b60: 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
4b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4b80: 20 69 66 20 69 74 65 72 61 74 6f 72 20 69 73 20   if iterator is 
4b90: 22 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a  "rowid DESC" */.
4ba0: 20 20 69 36 34 20 2a 70 69 4c 61 73 74 2c 20 20    i64 *piLast,  
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 61 73    /* IN/OUT: Las
4bd0: 74 65 73 74 20 72 6f 77 69 64 20 73 65 65 6e 20  test rowid seen 
4be0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20  so far */.  int 
4bf0: 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4c10: 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
4c20: 2f 0a 20 20 69 6e 74 20 2a 70 62 45 6f 66 20 20  /.  int *pbEof  
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
4c50: 74 6f 20 74 72 75 65 20 69 66 20 45 4f 46 20 2a  to true if EOF *
4c60: 2f 0a 29 7b 0a 20 20 69 36 34 20 69 4c 61 73 74  /.){.  i64 iLast
4c70: 20 3d 20 2a 70 69 4c 61 73 74 3b 0a 20 20 69 36   = *piLast;.  i6
4c80: 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 69 52 6f  4 iRowid;..  iRo
4c90: 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52 6f  wid = pIter->iRo
4ca0: 77 69 64 3b 0a 20 20 69 66 28 20 28 62 44 65 73  wid;.  if( (bDes
4cb0: 63 3d 3d 30 20 26 26 20 69 4c 61 73 74 3e 69 52  c==0 && iLast>iR
4cc0: 6f 77 69 64 29 20 7c 7c 20 28 62 44 65 73 63 20  owid) || (bDesc 
4cd0: 26 26 20 69 4c 61 73 74 3c 69 52 6f 77 69 64 29  && iLast<iRowid)
4ce0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
4cf0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
4d00: 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2c 20  NextFrom(pIter, 
4d10: 69 4c 61 73 74 29 3b 0a 20 20 20 20 69 66 28 20  iLast);.    if( 
4d20: 72 63 20 7c 7c 20 73 71 6c 69 74 65 33 46 74 73  rc || sqlite3Fts
4d30: 35 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 20  5IterEof(pIter) 
4d40: 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
4d50: 72 63 3b 0a 20 20 20 20 20 20 2a 70 62 45 6f 66  rc;.      *pbEof
4d60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
4d70: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
4d80: 69 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e  iRowid = pIter->
4d90: 69 52 6f 77 69 64 3b 0a 20 20 20 20 61 73 73 65  iRowid;.    asse
4da0: 72 74 28 20 28 62 44 65 73 63 3d 3d 30 20 26 26  rt( (bDesc==0 &&
4db0: 20 69 52 6f 77 69 64 3e 3d 69 4c 61 73 74 29 20   iRowid>=iLast) 
4dc0: 7c 7c 20 28 62 44 65 73 63 3d 3d 31 20 26 26 20  || (bDesc==1 && 
4dd0: 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 29 20 29  iRowid<=iLast) )
4de0: 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74 20  ;.  }.  *piLast 
4df0: 3d 20 69 52 6f 77 69 64 3b 0a 0a 20 20 72 65 74  = iRowid;..  ret
4e00: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
4e10: 20 69 6e 74 20 66 74 73 35 45 78 70 72 53 79 6e   int fts5ExprSyn
4e20: 6f 6e 79 6d 41 64 76 61 6e 63 65 74 6f 28 0a 20  onymAdvanceto(. 
4e30: 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
4e40: 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
4e50: 20 2f 2a 20 54 65 72 6d 20 69 74 65 72 61 74 6f   /* Term iterato
4e60: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
4e70: 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20    int bDesc,    
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 65    /* True if ite
4ea0: 72 61 74 6f 72 20 69 73 20 22 72 6f 77 69 64 20  rator is "rowid 
4eb0: 44 45 53 43 22 20 2a 2f 0a 20 20 69 36 34 20 2a  DESC" */.  i64 *
4ec0: 70 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20  piLast,         
4ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
4ee0: 2f 4f 55 54 3a 20 4c 61 73 74 65 73 74 20 72 6f  /OUT: Lastest ro
4ef0: 77 69 64 20 73 65 65 6e 20 73 6f 20 66 61 72 20  wid seen so far 
4f00: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20  */.  int *pRc   
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
4f30: 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  or code */.){.  
4f40: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4f50: 4f 4b 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20  OK;.  i64 iLast 
4f60: 3d 20 2a 70 69 4c 61 73 74 3b 0a 20 20 46 74 73  = *piLast;.  Fts
4f70: 35 45 78 70 72 54 65 72 6d 20 2a 70 3b 0a 20 20  5ExprTerm *p;.  
4f80: 69 6e 74 20 62 45 6f 66 20 3d 20 30 3b 0a 0a 20  int bEof = 0;.. 
4f90: 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 72 63   for(p=pTerm; rc
4fa0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4fb0: 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29  ; p=p->pSynonym)
4fc0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
4fd0: 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 2d 3e  3Fts5IterEof(p->
4fe0: 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pIter)==0 ){.   
4ff0: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
5000: 70 2d 3e 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  p->pIter->iRowid
5010: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 62 44 65  ;.      if( (bDe
5020: 73 63 3d 3d 30 20 26 26 20 69 4c 61 73 74 3e 69  sc==0 && iLast>i
5030: 52 6f 77 69 64 29 20 7c 7c 20 28 62 44 65 73 63  Rowid) || (bDesc
5040: 20 26 26 20 69 4c 61 73 74 3c 69 52 6f 77 69 64   && iLast<iRowid
5050: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
5060: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
5070: 72 4e 65 78 74 46 72 6f 6d 28 70 2d 3e 70 49 74  rNextFrom(p->pIt
5080: 65 72 2c 20 69 4c 61 73 74 29 3b 0a 20 20 20 20  er, iLast);.    
5090: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
50a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
50b0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
50c0: 20 72 63 3b 0a 20 20 20 20 62 45 6f 66 20 3d 20   rc;.    bEof = 
50d0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
50e0: 2a 70 69 4c 61 73 74 20 3d 20 66 74 73 35 45 78  *piLast = fts5Ex
50f0: 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70  prSynonymRowid(p
5100: 54 65 72 6d 2c 20 62 44 65 73 63 2c 20 26 62 45  Term, bDesc, &bE
5110: 6f 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  of);.  }.  retur
5120: 6e 20 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74  n bEof;.}...stat
5130: 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e  ic int fts5ExprN
5140: 65 61 72 54 65 73 74 28 0a 20 20 69 6e 74 20 2a  earTest(.  int *
5150: 70 52 63 2c 0a 20 20 46 74 73 35 45 78 70 72 20  pRc,.  Fts5Expr 
5160: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
5170: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
5180: 73 69 6f 6e 20 74 68 61 74 20 70 4e 65 61 72 20  sion that pNear 
5190: 69 73 20 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a  is a part of */.
51a0: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
51b0: 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  pNode           
51c0: 20 20 2f 2a 20 54 68 65 20 22 4e 45 41 52 22 20    /* The "NEAR" 
51d0: 6e 6f 64 65 20 28 46 54 53 35 5f 53 54 52 49 4e  node (FTS5_STRIN
51e0: 47 29 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 45  G) */.){.  Fts5E
51f0: 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61  xprNearset *pNea
5200: 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72  r = pNode->pNear
5210: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52  ;.  int rc = *pR
5220: 63 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d  c;..  if( pExpr-
5230: 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
5240: 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46  l!=FTS5_DETAIL_F
5250: 55 4c 4c 20 29 7b 0a 20 20 20 20 46 74 73 35 45  ULL ){.    Fts5E
5260: 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  xprTerm *pTerm;.
5270: 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
5280: 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e  se *pPhrase = pN
5290: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
52a0: 3b 0a 20 20 20 20 70 50 68 72 61 73 65 2d 3e 70  ;.    pPhrase->p
52b0: 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20  oslist.n = 0;.  
52c0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 26 70 50 68    for(pTerm=&pPh
52d0: 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 3b 20  rase->aTerm[0]; 
52e0: 70 54 65 72 6d 3b 20 70 54 65 72 6d 3d 70 54 65  pTerm; pTerm=pTe
52f0: 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20  rm->pSynonym){. 
5300: 20 20 20 20 20 46 74 73 35 49 6e 64 65 78 49 74       Fts5IndexIt
5310: 65 72 20 2a 70 49 74 65 72 20 3d 20 70 54 65 72  er *pIter = pTer
5320: 6d 2d 3e 70 49 74 65 72 3b 0a 20 20 20 20 20 20  m->pIter;.      
5330: 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 49  if( sqlite3Fts5I
5340: 74 65 72 45 6f 66 28 70 49 74 65 72 29 3d 3d 30  terEof(pIter)==0
5350: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5360: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3d 3d 70  pIter->iRowid==p
5370: 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 26 26 20  Node->iRowid && 
5380: 70 49 74 65 72 2d 3e 6e 44 61 74 61 3e 30 20 29  pIter->nData>0 )
5390: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 68 72  {.          pPhr
53a0: 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d  ase->poslist.n =
53b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
53c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
53d0: 72 65 74 75 72 6e 20 70 50 68 72 61 73 65 2d 3e  return pPhrase->
53e0: 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 65 6c  poslist.n;.  }el
53f0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a  se{.    int i;..
5400: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
5410: 74 20 65 61 63 68 20 70 68 72 61 73 65 20 69 6e  t each phrase in
5420: 20 74 68 65 20 6e 65 61 72 73 65 74 20 6d 61 74   the nearset mat
5430: 63 68 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ches the current
5440: 20 72 6f 77 2e 0a 20 20 20 20 2a 2a 20 50 6f 70   row..    ** Pop
5450: 75 6c 61 74 65 20 74 68 65 20 70 50 68 72 61 73  ulate the pPhras
5460: 65 2d 3e 70 6f 73 6c 69 73 74 20 62 75 66 66 65  e->poslist buffe
5470: 72 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  rs at the same t
5480: 69 6d 65 2e 20 49 66 20 61 6e 79 0a 20 20 20 20  ime. If any.    
5490: 2a 2a 20 70 68 72 61 73 65 20 69 73 20 6e 6f 74  ** phrase is not
54a0: 20 61 20 6d 61 74 63 68 2c 20 62 72 65 61 6b 20   a match, break 
54b0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
54c0: 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 66  early.  */.    f
54d0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
54e0: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4e 65 61 72  TE_OK && i<pNear
54f0: 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b  ->nPhrase; i++){
5500: 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50  .      Fts5ExprP
5510: 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d  hrase *pPhrase =
5520: 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65   pNear->apPhrase
5530: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
5540: 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 31 20  Phrase->nTerm>1 
5550: 7c 7c 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72  || pPhrase->aTer
5560: 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 20 7c 7c  m[0].pSynonym ||
5570: 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20   pNear->pColset 
5580: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ){.        int b
5590: 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
55a0: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
55b0: 50 68 72 61 73 65 49 73 4d 61 74 63 68 28 70 4e  PhraseIsMatch(pN
55c0: 6f 64 65 2c 20 70 50 68 72 61 73 65 2c 20 26 62  ode, pPhrase, &b
55d0: 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 20 20  Match);.        
55e0: 69 66 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 20  if( bMatch==0 ) 
55f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
5600: 73 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  se{.        Fts5
5610: 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
5620: 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72   = pPhrase->aTer
5630: 6d 5b 30 5d 2e 70 49 74 65 72 3b 0a 20 20 20 20  m[0].pIter;.    
5640: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
5650: 74 28 26 72 63 2c 20 26 70 50 68 72 61 73 65 2d  t(&rc, &pPhrase-
5660: 3e 70 6f 73 6c 69 73 74 2c 20 70 49 74 65 72 2d  >poslist, pIter-
5670: 3e 6e 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 70  >nData, pIter->p
5680: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
5690: 20 20 20 7d 0a 0a 20 20 20 20 2a 70 52 63 20 3d     }..    *pRc =
56a0: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d   rc;.    if( i==
56b0: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20 26  pNear->nPhrase &
56c0: 26 20 28 69 3d 3d 31 20 7c 7c 20 66 74 73 35 45  & (i==1 || fts5E
56d0: 78 70 72 4e 65 61 72 49 73 4d 61 74 63 68 28 70  xprNearIsMatch(p
56e0: 52 63 2c 20 70 4e 65 61 72 29 29 20 29 7b 0a 20  Rc, pNear)) ){. 
56f0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5700: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
5710: 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  0;.  }.}.../*.**
5720: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   Initialize all 
5730: 74 65 72 6d 20 69 74 65 72 61 74 6f 72 73 20 69  term iterators i
5740: 6e 20 74 68 65 20 70 4e 65 61 72 20 6f 62 6a 65  n the pNear obje
5750: 63 74 2e 20 49 66 20 61 6e 79 20 74 65 72 6d 20  ct. If any term 
5760: 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 74 6f 20 6d  is found.** to m
5770: 61 74 63 68 20 6e 6f 20 64 6f 63 75 6d 65 6e 74  atch no document
5780: 73 20 61 74 20 61 6c 6c 2c 20 72 65 74 75 72 6e  s at all, return
5790: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
57a0: 68 6f 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e  hout initializin
57b0: 67 20 61 6e 79 0a 2a 2a 20 66 75 72 74 68 65 72  g any.** further
57c0: 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73   iterators..*/.s
57d0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
57e0: 70 72 4e 65 61 72 49 6e 69 74 41 6c 6c 28 0a 20  prNearInitAll(. 
57f0: 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
5800: 2c 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ,.  Fts5ExprNode
5810: 20 2a 70 4e 6f 64 65 0a 29 7b 0a 20 20 46 74 73   *pNode.){.  Fts
5820: 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e  5ExprNearset *pN
5830: 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65  ear = pNode->pNe
5840: 61 72 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ar;.  int i, j;.
5850: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
5860: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 45 6f 66  E_OK;.  int bEof
5870: 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
5880: 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68   pNode->bNomatch
5890: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ==0 );.  for(i=0
58a0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
58b0: 26 26 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72  && i<pNear->nPhr
58c0: 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ase; i++){.    F
58d0: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
58e0: 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e  Phrase = pNear->
58f0: 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20  apPhrase[i];.   
5900: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 68 72   for(j=0; j<pPhr
5910: 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 29  ase->nTerm; j++)
5920: 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72  {.      Fts5Expr
5930: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
5940: 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 6a 5d  Phrase->aTerm[j]
5950: 3b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72  ;.      Fts5Expr
5960: 54 65 72 6d 20 2a 70 3b 0a 0a 20 20 20 20 20 20  Term *p;..      
5970: 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70 20 26  for(p=pTerm; p &
5980: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
5990: 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b   p=p->pSynonym){
59a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
59b0: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  pIter ){.       
59c0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74     sqlite3Fts5It
59d0: 65 72 43 6c 6f 73 65 28 70 2d 3e 70 49 74 65 72  erClose(p->pIter
59e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
59f0: 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  pIter = 0;.     
5a00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
5a10: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
5a20: 65 78 51 75 65 72 79 28 0a 20 20 20 20 20 20 20  exQuery(.       
5a30: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 49 6e 64       pExpr->pInd
5a40: 65 78 2c 20 70 2d 3e 7a 54 65 72 6d 2c 20 28 69  ex, p->zTerm, (i
5a50: 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 54 65  nt)strlen(p->zTe
5a60: 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rm),.           
5a70: 20 28 70 54 65 72 6d 2d 3e 62 50 72 65 66 69 78   (pTerm->bPrefix
5a80: 20 3f 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   ? FTS5INDEX_QUE
5a90: 52 59 5f 50 52 45 46 49 58 20 3a 20 30 29 20 7c  RY_PREFIX : 0) |
5aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 45  .            (pE
5ab0: 78 70 72 2d 3e 62 44 65 73 63 20 3f 20 46 54 53  xpr->bDesc ? FTS
5ac0: 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
5ad0: 43 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20  C : 0),.        
5ae0: 20 20 20 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73      pNear->pCols
5af0: 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
5b00: 26 70 2d 3e 70 49 74 65 72 0a 20 20 20 20 20 20  &p->pIter.      
5b10: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73    );.        ass
5b20: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
5b30: 4f 4b 20 7c 7c 20 70 2d 3e 70 49 74 65 72 3d 3d  OK || p->pIter==
5b40: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
5b50: 20 70 2d 3e 70 49 74 65 72 20 26 26 20 30 3d 3d   p->pIter && 0==
5b60: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
5b70: 6f 66 28 70 2d 3e 70 49 74 65 72 29 20 29 7b 0a  of(p->pIter) ){.
5b80: 20 20 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d            bEof =
5b90: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
5ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
5bb0: 20 62 45 6f 66 20 29 20 62 72 65 61 6b 3b 0a 20   bEof ) break;. 
5bc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 45 6f     }.    if( bEo
5bd0: 66 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  f ) break;.  }..
5be0: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
5bf0: 62 45 6f 66 3b 0a 20 20 72 65 74 75 72 6e 20 72  bEof;.  return r
5c00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  c;.}../*.** If p
5c10: 45 78 70 72 20 69 73 20 61 6e 20 41 53 43 20 69  Expr is an ASC i
5c20: 74 65 72 61 74 6f 72 2c 20 74 68 69 73 20 66 75  terator, this fu
5c30: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
5c40: 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65 0a   value with the.
5c50: 2a 2a 20 73 61 6d 65 20 73 69 67 6e 20 61 73 3a  ** same sign as:
5c60: 0a 2a 2a 0a 2a 2a 20 20 20 28 69 4c 68 73 20 2d  .**.**   (iLhs -
5c70: 20 69 52 68 73 29 0a 2a 2a 0a 2a 2a 20 4f 74 68   iRhs).**.** Oth
5c80: 65 72 77 69 73 65 2c 20 69 66 20 74 68 69 73 20  erwise, if this 
5c90: 69 73 20 61 20 44 45 53 43 20 69 74 65 72 61 74  is a DESC iterat
5ca0: 6f 72 2c 20 74 68 65 20 6f 70 70 6f 73 69 74 65  or, the opposite
5cb0: 20 69 73 20 72 65 74 75 72 6e 65 64 3a 0a 2a 2a   is returned:.**
5cc0: 0a 2a 2a 20 20 20 28 69 52 68 73 20 2d 20 69 4c  .**   (iRhs - iL
5cd0: 68 73 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  hs).*/.static in
5ce0: 74 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28 0a  t fts5RowidCmp(.
5cf0: 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70    Fts5Expr *pExp
5d00: 72 2c 0a 20 20 69 36 34 20 69 4c 68 73 2c 0a 20  r,.  i64 iLhs,. 
5d10: 20 69 36 34 20 69 52 68 73 0a 29 7b 0a 20 20 61   i64 iRhs.){.  a
5d20: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 62 44  ssert( pExpr->bD
5d30: 65 73 63 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  esc==0 || pExpr-
5d40: 3e 62 44 65 73 63 3d 3d 31 20 29 3b 0a 20 20 69  >bDesc==1 );.  i
5d50: 66 28 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d  f( pExpr->bDesc=
5d60: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  =0 ){.    if( iL
5d70: 68 73 3c 69 52 68 73 20 29 20 72 65 74 75 72 6e  hs<iRhs ) return
5d80: 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
5d90: 28 69 4c 68 73 20 3e 20 69 52 68 73 29 3b 0a 20  (iLhs > iRhs);. 
5da0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
5db0: 69 4c 68 73 3e 69 52 68 73 20 29 20 72 65 74 75  iLhs>iRhs ) retu
5dc0: 72 6e 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72  rn -1;.    retur
5dd0: 6e 20 28 69 4c 68 73 20 3c 20 69 52 68 73 29 3b  n (iLhs < iRhs);
5de0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
5df0: 6f 69 64 20 66 74 73 35 45 78 70 72 53 65 74 45  oid fts5ExprSetE
5e00: 6f 66 28 46 74 73 35 45 78 70 72 4e 6f 64 65 20  of(Fts5ExprNode 
5e10: 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69  *pNode){.  int i
5e20: 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20  ;.  pNode->bEof 
5e30: 3d 20 31 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e  = 1;.  pNode->bN
5e40: 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 66 6f  omatch = 0;.  fo
5e50: 72 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e  r(i=0; i<pNode->
5e60: 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nChild; i++){.  
5e70: 20 20 66 74 73 35 45 78 70 72 53 65 74 45 6f 66    fts5ExprSetEof
5e80: 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b  (pNode->apChild[
5e90: 69 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  i]);.  }.}..stat
5ea0: 69 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72  ic void fts5Expr
5eb0: 4e 6f 64 65 5a 65 72 6f 50 6f 73 6c 69 73 74 28  NodeZeroPoslist(
5ec0: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
5ed0: 6f 64 65 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64  ode){.  if( pNod
5ee0: 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53  e->eType==FTS5_S
5ef0: 54 52 49 4e 47 20 7c 7c 20 70 4e 6f 64 65 2d 3e  TRING || pNode->
5f00: 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d  eType==FTS5_TERM
5f10: 20 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72   ){.    Fts5Expr
5f20: 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d  Nearset *pNear =
5f30: 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0a 20   pNode->pNear;. 
5f40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
5f50: 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e  r(i=0; i<pNear->
5f60: 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20  nPhrase; i++){. 
5f70: 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72       Fts5ExprPhr
5f80: 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
5f90: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69  Near->apPhrase[i
5fa0: 5d 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65  ];.      pPhrase
5fb0: 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b  ->poslist.n = 0;
5fc0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
5fd0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
5fe0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d  or(i=0; i<pNode-
5ff0: 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nChild; i++){. 
6000: 20 20 20 20 20 66 74 73 35 45 78 70 72 4e 6f 64       fts5ExprNod
6010: 65 5a 65 72 6f 50 6f 73 6c 69 73 74 28 70 4e 6f  eZeroPoslist(pNo
6020: 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b  de->apChild[i]);
6030: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a  .    }.  }.}....
6040: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
6050: 65 20 76 61 6c 75 65 73 20 63 75 72 72 65 6e 74  e values current
6060: 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ly indicated by 
6070: 74 68 65 20 74 77 6f 20 6e 6f 64 65 73 20 61 73  the two nodes as
6080: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
6090: 20 20 20 72 65 73 20 3d 20 28 2a 70 31 29 20 2d     res = (*p1) -
60a0: 20 28 2a 70 32 29 0a 2a 2a 0a 2a 2a 20 4e 6f 64   (*p2).**.** Nod
60b0: 65 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  es that point to
60c0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 63 6f 6d   values that com
60d0: 65 20 6c 61 74 65 72 20 69 6e 20 74 68 65 20 69  e later in the i
60e0: 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72 20 61  teration order a
60f0: 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  re.** considered
6100: 20 74 6f 20 62 65 20 6c 61 72 67 65 72 2e 20 4e   to be larger. N
6110: 6f 64 65 73 20 61 74 20 45 4f 46 20 61 72 65 20  odes at EOF are 
6120: 74 68 65 20 6c 61 72 67 65 73 74 20 6f 66 20 61  the largest of a
6130: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ll..**.** This m
6140: 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
6150: 20 69 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72   iteration order
6160: 20 69 73 20 41 53 43 2c 20 74 68 65 6e 20 6e 75   is ASC, then nu
6170: 6d 65 72 69 63 61 6c 6c 79 20 6c 61 72 67 65 72  merically larger
6180: 0a 2a 2a 20 72 6f 77 69 64 73 20 61 72 65 20 63  .** rowids are c
6190: 6f 6e 73 69 64 65 72 65 64 20 6c 61 72 67 65 72  onsidered larger
61a0: 2e 20 4f 72 20 69 66 20 69 74 20 69 73 20 74 68  . Or if it is th
61b0: 65 20 64 65 66 61 75 6c 74 20 44 45 53 43 2c 20  e default DESC, 
61c0: 6e 75 6d 65 72 69 63 61 6c 6c 79 0a 2a 2a 20 73  numerically.** s
61d0: 6d 61 6c 6c 65 72 20 72 6f 77 69 64 73 20 61 72  maller rowids ar
61e0: 65 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61  e larger..*/.sta
61f0: 74 69 63 20 69 6e 74 20 66 74 73 35 4e 6f 64 65  tic int fts5Node
6200: 43 6f 6d 70 61 72 65 28 0a 20 20 46 74 73 35 45  Compare(.  Fts5E
6210: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 46 74  xpr *pExpr,.  Ft
6220: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 31 2c 20  s5ExprNode *p1, 
6230: 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
6240: 2a 70 32 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d  *p2.){.  if( p2-
6250: 3e 62 45 6f 66 20 29 20 72 65 74 75 72 6e 20 2d  >bEof ) return -
6260: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 62 45 6f  1;.  if( p1->bEo
6270: 66 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  f ) return +1;. 
6280: 20 72 65 74 75 72 6e 20 66 74 73 35 52 6f 77 69   return fts5Rowi
6290: 64 43 6d 70 28 70 45 78 70 72 2c 20 70 31 2d 3e  dCmp(pExpr, p1->
62a0: 69 52 6f 77 69 64 2c 20 70 32 2d 3e 69 52 6f 77  iRowid, p2->iRow
62b0: 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  id);.}../*.** Al
62c0: 6c 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 72  l individual ter
62d0: 6d 20 69 74 65 72 61 74 6f 72 73 20 69 6e 20 70  m iterators in p
62e0: 4e 65 61 72 20 61 72 65 20 67 75 61 72 61 6e 74  Near are guarant
62f0: 65 65 64 20 74 6f 20 62 65 20 76 61 6c 69 64 20  eed to be valid 
6300: 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  when.** this fun
6310: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
6320: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
6330: 68 65 63 6b 73 20 69 66 20 61 6c 6c 20 74 65 72  hecks if all ter
6340: 6d 20 69 74 65 72 61 74 6f 72 73 0a 2a 2a 20 70  m iterators.** p
6350: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
6360: 20 72 6f 77 69 64 2c 20 61 6e 64 20 69 66 20 6e   rowid, and if n
6370: 6f 74 2c 20 61 64 76 61 6e 63 65 73 20 74 68 65  ot, advances the
6380: 6d 20 75 6e 74 69 6c 20 74 68 65 79 20 64 6f 2e  m until they do.
6390: 0a 2a 2a 20 49 66 20 61 6e 20 45 4f 46 20 69 73  .** If an EOF is
63a0: 20 72 65 61 63 68 65 64 20 62 65 66 6f 72 65 20   reached before 
63b0: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 2a 70  this happens, *p
63c0: 62 45 6f 66 20 69 73 20 73 65 74 20 74 6f 20 74  bEof is set to t
63d0: 72 75 65 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  rue before.** re
63e0: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53  turning..**.** S
63f0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6400: 72 6e 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72  rned if an error
6410: 20 6f 63 63 75 72 73 2c 20 6f 72 20 61 6e 20 53   occurs, or an S
6420: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
6430: 20 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20   .** otherwise. 
6440: 49 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  It is not consid
6450: 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 63 6f  ered an error co
6460: 64 65 20 69 66 20 61 6e 20 69 74 65 72 61 74 6f  de if an iterato
6470: 72 20 72 65 61 63 68 65 73 0a 2a 2a 20 45 4f 46  r reaches.** EOF
6480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6490: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
64a0: 5f 53 54 52 49 4e 47 28 0a 20 20 46 74 73 35 45  _STRING(.  Fts5E
64b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
64c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
64d0: 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65  pression pPhrase
64e0: 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20   belongs to */. 
64f0: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
6500: 4e 6f 64 65 0a 29 7b 0a 20 20 46 74 73 35 45 78  Node.){.  Fts5Ex
6510: 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
6520: 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b   = pNode->pNear;
6530: 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73  .  Fts5ExprPhras
6540: 65 20 2a 70 4c 65 66 74 20 3d 20 70 4e 65 61 72  e *pLeft = pNear
6550: 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 3b 0a 20  ->apPhrase[0];. 
6560: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6570: 5f 4f 4b 3b 0a 20 20 69 36 34 20 69 4c 61 73 74  _OK;.  i64 iLast
6580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6590: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 65 73         /* Lastes
65a0: 74 20 72 6f 77 69 64 20 61 6e 79 20 69 74 65 72  t rowid any iter
65b0: 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 2a  ator points to *
65c0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20 61 6e      /* Phrase an
65f0: 64 20 74 6f 6b 65 6e 20 69 6e 64 65 78 2c 20 72  d token index, r
6600: 65 73 70 65 63 74 69 76 65 6c 79 20 2a 2f 0a 20  espectively */. 
6610: 20 69 6e 74 20 62 4d 61 74 63 68 3b 20 20 20 20   int bMatch;    
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20   /* True if all 
6640: 74 65 72 6d 73 20 61 72 65 20 61 74 20 74 68 65  terms are at the
6650: 20 73 61 6d 65 20 72 6f 77 69 64 20 2a 2f 0a 20   same rowid */. 
6660: 20 63 6f 6e 73 74 20 69 6e 74 20 62 44 65 73 63   const int bDesc
6670: 20 3d 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3b   = pExpr->bDesc;
6680: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
6690: 74 20 74 68 69 73 20 6e 6f 64 65 20 73 68 6f 75  t this node shou
66a0: 6c 64 20 6e 6f 74 20 62 65 20 46 54 53 35 5f 54  ld not be FTS5_T
66b0: 45 52 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ERM */.  assert(
66c0: 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e   pNear->nPhrase>
66d0: 31 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  1 .       || pNe
66e0: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
66f0: 3e 6e 54 65 72 6d 3e 31 20 0a 20 20 20 20 20 20  >nTerm>1 .      
6700: 20 7c 7c 20 70 4e 65 61 72 2d 3e 61 70 50 68 72   || pNear->apPhr
6710: 61 73 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d  ase[0]->aTerm[0]
6720: 2e 70 53 79 6e 6f 6e 79 6d 0a 20 20 29 3b 0a 0a  .pSynonym.  );..
6730: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
6740: 69 4c 61 73 74 2c 20 74 68 65 20 22 6c 61 73 74  iLast, the "last
6750: 65 73 74 22 20 72 6f 77 69 64 20 61 6e 79 20 69  est" rowid any i
6760: 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
6770: 6f 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 69  o. If the.  ** i
6780: 74 65 72 61 74 6f 72 20 73 6b 69 70 73 20 74 68  terator skips th
6790: 72 6f 75 67 68 20 72 6f 77 69 64 73 20 69 6e 20  rough rowids in 
67a0: 74 68 65 20 64 65 66 61 75 6c 74 20 61 73 63 65  the default asce
67b0: 6e 64 69 6e 67 20 6f 72 64 65 72 2c 20 74 68 69  nding order, thi
67c0: 73 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 65  s means.  ** the
67d0: 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 2e 20   maximum rowid. 
67e0: 4f 72 2c 20 69 66 20 74 68 65 20 69 74 65 72 61  Or, if the itera
67f0: 74 6f 72 20 69 73 20 22 4f 52 44 45 52 20 42 59  tor is "ORDER BY
6800: 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 74 68   rowid DESC", th
6810: 65 6e 20 69 74 0a 20 20 2a 2a 20 6d 65 61 6e 73  en it.  ** means
6820: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 72 6f 77   the minimum row
6830: 69 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  id.  */.  if( pL
6840: 65 66 74 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53  eft->aTerm[0].pS
6850: 79 6e 6f 6e 79 6d 20 29 7b 0a 20 20 20 20 69 4c  ynonym ){.    iL
6860: 61 73 74 20 3d 20 66 74 73 35 45 78 70 72 53 79  ast = fts5ExprSy
6870: 6e 6f 6e 79 6d 52 6f 77 69 64 28 26 70 4c 65 66  nonymRowid(&pLef
6880: 74 2d 3e 61 54 65 72 6d 5b 30 5d 2c 20 62 44 65  t->aTerm[0], bDe
6890: 73 63 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  sc, 0);.  }else{
68a0: 0a 20 20 20 20 69 4c 61 73 74 20 3d 20 70 4c 65  .    iLast = pLe
68b0: 66 74 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74  ft->aTerm[0].pIt
68c0: 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  er->iRowid;.  }.
68d0: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 62 4d 61 74  .  do {.    bMat
68e0: 63 68 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  ch = 1;.    for(
68f0: 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
6900: 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  hrase; i++){.   
6910: 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
6920: 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65  e *pPhrase = pNe
6930: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b  ar->apPhrase[i];
6940: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
6950: 6a 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  j<pPhrase->nTerm
6960: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
6970: 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
6980: 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e  erm = &pPhrase->
6990: 61 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20  aTerm[j];.      
69a0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79    if( pTerm->pSy
69b0: 6e 6f 6e 79 6d 20 29 7b 0a 20 20 20 20 20 20 20  nonym ){.       
69c0: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
69d0: 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52  fts5ExprSynonymR
69e0: 6f 77 69 64 28 70 54 65 72 6d 2c 20 62 44 65 73  owid(pTerm, bDes
69f0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
6a00: 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 69 4c 61   if( iRowid==iLa
6a10: 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
6a20: 20 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20           bMatch 
6a30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
6a40: 66 28 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e  f( fts5ExprSynon
6a50: 79 6d 41 64 76 61 6e 63 65 74 6f 28 70 54 65 72  ymAdvanceto(pTer
6a60: 6d 2c 20 62 44 65 73 63 2c 20 26 69 4c 61 73 74  m, bDesc, &iLast
6a70: 2c 20 26 72 63 29 20 29 7b 0a 20 20 20 20 20 20  , &rc) ){.      
6a80: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f        pNode->bNo
6a90: 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  match = 0;.     
6aa0: 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45         pNode->bE
6ab0: 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  of = 1;.        
6ac0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6ad0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6ae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6af0: 20 20 20 20 46 74 73 35 49 6e 64 65 78 49 74 65      Fts5IndexIte
6b00: 72 20 2a 70 49 74 65 72 20 3d 20 70 50 68 72 61  r *pIter = pPhra
6b10: 73 65 2d 3e 61 54 65 72 6d 5b 6a 5d 2e 70 49 74  se->aTerm[j].pIt
6b20: 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  er;.          if
6b30: 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3d  ( pIter->iRowid=
6b40: 3d 69 4c 61 73 74 20 7c 7c 20 70 49 74 65 72 2d  =iLast || pIter-
6b50: 3e 62 45 6f 66 20 29 20 63 6f 6e 74 69 6e 75 65  >bEof ) continue
6b60: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74  ;.          bMat
6b70: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
6b80: 20 20 69 66 28 20 66 74 73 35 45 78 70 72 41 64    if( fts5ExprAd
6b90: 76 61 6e 63 65 74 6f 28 70 49 74 65 72 2c 20 62  vanceto(pIter, b
6ba0: 44 65 73 63 2c 20 26 69 4c 61 73 74 2c 20 26 72  Desc, &iLast, &r
6bb0: 63 2c 20 26 70 4e 6f 64 65 2d 3e 62 45 6f 66 29  c, &pNode->bEof)
6bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6bd0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
6be0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6c00: 20 7d 77 68 69 6c 65 28 20 62 4d 61 74 63 68 3d   }while( bMatch=
6c10: 3d 30 20 29 3b 0a 0a 20 20 70 4e 6f 64 65 2d 3e  =0 );..  pNode->
6c20: 69 52 6f 77 69 64 20 3d 20 69 4c 61 73 74 3b 0a  iRowid = iLast;.
6c30: 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63    pNode->bNomatc
6c40: 68 20 3d 20 28 28 30 3d 3d 66 74 73 35 45 78 70  h = ((0==fts5Exp
6c50: 72 4e 65 61 72 54 65 73 74 28 26 72 63 2c 20 70  rNearTest(&rc, p
6c60: 45 78 70 72 2c 20 70 4e 6f 64 65 29 29 20 26 26  Expr, pNode)) &&
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b   rc==SQLITE_OK);
6c80: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  .  assert( pNode
6c90: 2d 3e 62 45 6f 66 3d 3d 30 20 7c 7c 20 70 4e 6f  ->bEof==0 || pNo
6ca0: 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 3d 3d 30 20  de->bNomatch==0 
6cb0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
6cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
6cd0: 65 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  e the first term
6ce0: 20 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65   iterator in the
6cf0: 20 66 69 72 73 74 20 70 68 72 61 73 65 20 6f 66   first phrase of
6d00: 20 70 4e 65 61 72 2e 20 53 65 74 20 6f 75 74 70   pNear. Set outp
6d10: 75 74 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 2a  ut.** variable *
6d20: 70 62 45 6f 66 20 74 6f 20 74 72 75 65 20 69 66  pbEof to true if
6d30: 20 69 74 20 72 65 61 63 68 65 73 20 45 4f 46 20   it reaches EOF 
6d40: 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
6d50: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ccurs..**.** Ret
6d60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
6d70: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
6d80: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
6d90: 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
6da0: 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  .** occurs..*/.s
6db0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
6dc0: 70 72 4e 6f 64 65 4e 65 78 74 5f 53 54 52 49 4e  prNodeNext_STRIN
6dd0: 47 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  G(.  Fts5Expr *p
6de0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
6df0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6e00: 6f 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f 6e  on pPhrase belon
6e10: 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 45  gs to */.  Fts5E
6e20: 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  xprNode *pNode, 
6e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
6e40: 53 35 5f 53 54 52 49 4e 47 20 6f 72 20 46 54 53  S5_STRING or FTS
6e50: 35 5f 54 45 52 4d 20 6e 6f 64 65 20 2a 2f 0a 20  5_TERM node */. 
6e60: 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c   int bFromValid,
6e70: 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 0a 29 7b  .  i64 iFrom .){
6e80: 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20  .  Fts5ExprTerm 
6e90: 2a 70 54 65 72 6d 20 3d 20 26 70 4e 6f 64 65 2d  *pTerm = &pNode-
6ea0: 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65  >pNear->apPhrase
6eb0: 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20  [0]->aTerm[0];. 
6ec0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6ed0: 5f 4f 4b 3b 0a 0a 20 20 70 4e 6f 64 65 2d 3e 62  _OK;..  pNode->b
6ee0: 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 69  Nomatch = 0;.  i
6ef0: 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  f( pTerm->pSynon
6f00: 79 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 45  ym ){.    int bE
6f10: 6f 66 20 3d 20 31 3b 0a 20 20 20 20 46 74 73 35  of = 1;.    Fts5
6f20: 45 78 70 72 54 65 72 6d 20 2a 70 3b 0a 0a 20 20  ExprTerm *p;..  
6f30: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69    /* Find the fi
6f40: 72 73 74 65 73 74 20 72 6f 77 69 64 20 61 6e 79  rstest rowid any
6f50: 20 73 79 6e 6f 6e 79 6d 20 70 6f 69 6e 74 73 20   synonym points 
6f60: 74 6f 2e 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  to. */.    i64 i
6f70: 52 6f 77 69 64 20 3d 20 66 74 73 35 45 78 70 72  Rowid = fts5Expr
6f80: 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70 54 65  SynonymRowid(pTe
6f90: 72 6d 2c 20 70 45 78 70 72 2d 3e 62 44 65 73 63  rm, pExpr->bDesc
6fa0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  , 0);..    /* Ad
6fb0: 76 61 6e 63 65 20 65 61 63 68 20 69 74 65 72 61  vance each itera
6fc0: 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74  tor that current
6fd0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 69 52 6f  ly points to iRo
6fe0: 77 69 64 2e 20 4f 72 2c 20 69 66 20 69 46 72 6f  wid. Or, if iFro
6ff0: 6d 0a 20 20 20 20 2a 2a 20 69 73 20 76 61 6c 69  m.    ** is vali
7000: 64 20 2d 20 65 61 63 68 20 69 74 65 72 61 74 6f  d - each iterato
7010: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
7020: 20 61 20 72 6f 77 69 64 20 62 65 66 6f 72 65 20   a rowid before 
7030: 69 46 72 6f 6d 2e 20 20 2a 2f 0a 20 20 20 20 66  iFrom.  */.    f
7040: 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20 70  or(p=pTerm; p; p
7050: 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20  =p->pSynonym){. 
7060: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7070: 46 74 73 35 49 74 65 72 45 6f 66 28 70 2d 3e 70  Fts5IterEof(p->p
7080: 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Iter)==0 ){.    
7090: 20 20 20 20 69 36 34 20 69 69 20 3d 20 70 2d 3e      i64 ii = p->
70a0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  pIter->iRowid;. 
70b0: 20 20 20 20 20 20 20 69 66 28 20 69 69 3d 3d 69         if( ii==i
70c0: 52 6f 77 69 64 20 0a 20 20 20 20 20 20 20 20 20  Rowid .         
70d0: 7c 7c 20 28 62 46 72 6f 6d 56 61 6c 69 64 20 26  || (bFromValid &
70e0: 26 20 69 69 21 3d 69 46 72 6f 6d 20 26 26 20 28  & ii!=iFrom && (
70f0: 69 69 3e 69 46 72 6f 6d 29 3d 3d 70 45 78 70 72  ii>iFrom)==pExpr
7100: 2d 3e 62 44 65 73 63 29 20 0a 20 20 20 20 20 20  ->bDesc) .      
7110: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
7120: 66 28 20 62 46 72 6f 6d 56 61 6c 69 64 20 29 7b  f( bFromValid ){
7130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
7140: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
7150: 72 4e 65 78 74 46 72 6f 6d 28 70 2d 3e 70 49 74  rNextFrom(p->pIt
7160: 65 72 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20  er, iFrom);.    
7170: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7180: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
7190: 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
71a0: 74 28 70 2d 3e 70 49 74 65 72 29 3b 0a 20 20 20  t(p->pIter);.   
71b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
71c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
71d0: 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
71e0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
71f0: 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
7200: 2d 3e 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20  ->pIter)==0 ){. 
7210: 20 20 20 20 20 20 20 20 20 20 20 62 45 6f 66 20             bEof 
7220: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
7230: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7240: 20 20 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d            bEof =
7250: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
7260: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
7270: 20 2f 2a 20 53 65 74 20 74 68 65 20 45 4f 46 20   /* Set the EOF 
7280: 66 6c 61 67 20 69 66 20 65 69 74 68 65 72 20 61  flag if either a
7290: 6c 6c 20 73 79 6e 6f 6e 79 6d 20 69 74 65 72 61  ll synonym itera
72a0: 74 6f 72 73 20 61 72 65 20 61 74 20 45 4f 46 20  tors are at EOF 
72b0: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 65 72 72  or an.    ** err
72c0: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
72d0: 20 20 2a 2f 0a 20 20 20 20 70 4e 6f 64 65 2d 3e    */.    pNode->
72e0: 62 45 6f 66 20 3d 20 28 72 63 20 7c 7c 20 62 45  bEof = (rc || bE
72f0: 6f 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  of);.  }else{.  
7300: 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
7310: 2a 70 49 74 65 72 20 3d 20 70 54 65 72 6d 2d 3e  *pIter = pTerm->
7320: 70 49 74 65 72 3b 0a 0a 20 20 20 20 61 73 73 65  pIter;..    asse
7330: 72 74 28 20 46 74 73 35 4e 6f 64 65 49 73 53 74  rt( Fts5NodeIsSt
7340: 72 69 6e 67 28 70 4e 6f 64 65 29 20 29 3b 0a 20  ring(pNode) );. 
7350: 20 20 20 69 66 28 20 62 46 72 6f 6d 56 61 6c 69     if( bFromVali
7360: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
7370: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
7380: 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2c 20 69  extFrom(pIter, i
7390: 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  From);.    }else
73a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
73b0: 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
73c0: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  (pIter);.    }..
73d0: 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20      pNode->bEof 
73e0: 3d 20 28 72 63 20 7c 7c 20 73 71 6c 69 74 65 33  = (rc || sqlite3
73f0: 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65  Fts5IterEof(pIte
7400: 72 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  r));.  }..  if( 
7410: 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20 29  pNode->bEof==0 )
7420: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
7430: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
7440: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
7450: 4e 6f 64 65 54 65 73 74 5f 53 54 52 49 4e 47 28  NodeTest_STRING(
7460: 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20  pExpr, pNode);. 
7470: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
7480: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .}...static int 
7490: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
74a0: 5f 54 45 52 4d 28 0a 20 20 46 74 73 35 45 78 70  _TERM(.  Fts5Exp
74b0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
74c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
74d0: 65 73 73 69 6f 6e 20 74 68 61 74 20 70 4e 65 61  ession that pNea
74e0: 72 20 69 73 20 61 20 70 61 72 74 20 6f 66 20 2a  r is a part of *
74f0: 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  /.  Fts5ExprNode
7500: 20 2a 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20   *pNode         
7510: 20 20 20 20 2f 2a 20 54 68 65 20 22 4e 45 41 52      /* The "NEAR
7520: 22 20 6e 6f 64 65 20 28 46 54 53 35 5f 54 45 52  " node (FTS5_TER
7530: 4d 29 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 41 73  M) */.){.  /* As
7540: 20 74 68 69 73 20 22 4e 45 41 52 22 20 6f 62 6a   this "NEAR" obj
7550: 65 63 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ect is actually 
7560: 61 20 73 69 6e 67 6c 65 20 70 68 72 61 73 65 20  a single phrase 
7570: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 0a 20  that consists . 
7580: 20 2a 2a 20 6f 66 20 61 20 73 69 6e 67 6c 65 20   ** of a single 
7590: 74 65 72 6d 20 6f 6e 6c 79 2c 20 67 72 61 62 20  term only, grab 
75a0: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
75b0: 65 20 70 6f 73 6c 69 73 74 20 6d 61 6e 61 67 65  e poslist manage
75c0: 64 20 62 79 20 74 68 65 0a 20 20 2a 2a 20 66 74  d by the.  ** ft
75d0: 73 35 5f 69 6e 64 65 78 2e 63 20 69 74 65 72 61  s5_index.c itera
75e0: 74 6f 72 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  tor object. This
75f0: 20 69 73 20 6d 75 63 68 20 66 61 73 74 65 72 20   is much faster 
7600: 74 68 61 6e 20 73 79 6e 74 68 65 73 69 7a 69 6e  than synthesizin
7610: 67 20 0a 20 20 2a 2a 20 61 20 6e 65 77 20 70 6f  g .  ** a new po
7620: 73 6c 69 73 74 20 74 68 65 20 77 61 79 20 77 65  slist the way we
7630: 20 68 61 76 65 20 74 6f 20 66 6f 72 20 6d 6f 72   have to for mor
7640: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 70 68  e complicated ph
7650: 72 61 73 65 20 6f 72 20 4e 45 41 52 0a 20 20 2a  rase or NEAR.  *
7660: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  * expressions.  
7670: 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 50 68 72  */.  Fts5ExprPhr
7680: 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
7690: 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e 61 70 50  Node->pNear->apP
76a0: 68 72 61 73 65 5b 30 5d 3b 0a 20 20 46 74 73 35  hrase[0];.  Fts5
76b0: 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
76c0: 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72   = pPhrase->aTer
76d0: 6d 5b 30 5d 2e 70 49 74 65 72 3b 0a 0a 20 20 61  m[0].pIter;..  a
76e0: 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54  ssert( pNode->eT
76f0: 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29  ype==FTS5_TERM )
7700: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64  ;.  assert( pNod
7710: 65 2d 3e 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73  e->pNear->nPhras
7720: 65 3d 3d 31 20 26 26 20 70 50 68 72 61 73 65 2d  e==1 && pPhrase-
7730: 3e 6e 54 65 72 6d 3d 3d 31 20 29 3b 0a 20 20 61  >nTerm==1 );.  a
7740: 73 73 65 72 74 28 20 70 50 68 72 61 73 65 2d 3e  ssert( pPhrase->
7750: 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79  aTerm[0].pSynony
7760: 6d 3d 3d 30 20 29 3b 0a 0a 20 20 70 50 68 72 61  m==0 );..  pPhra
7770: 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20  se->poslist.n = 
7780: 70 49 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 20 20  pIter->nData;.  
7790: 69 66 28 20 70 45 78 70 72 2d 3e 70 43 6f 6e 66  if( pExpr->pConf
77a0: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
77b0: 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b  5_DETAIL_FULL ){
77c0: 0a 20 20 20 20 70 50 68 72 61 73 65 2d 3e 70 6f  .    pPhrase->po
77d0: 73 6c 69 73 74 2e 70 20 3d 20 28 75 38 2a 29 70  slist.p = (u8*)p
77e0: 49 74 65 72 2d 3e 70 44 61 74 61 3b 0a 20 20 7d  Iter->pData;.  }
77f0: 0a 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64  .  pNode->iRowid
7800: 20 3d 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64   = pIter->iRowid
7810: 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61  ;.  pNode->bNoma
7820: 74 63 68 20 3d 20 28 70 50 68 72 61 73 65 2d 3e  tch = (pPhrase->
7830: 70 6f 73 6c 69 73 74 2e 6e 3d 3d 30 29 3b 0a 20  poslist.n==0);. 
7840: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7850: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 4e 65 78  K;.}../*.** xNex
7860: 74 28 29 20 6d 65 74 68 6f 64 20 66 6f 72 20 61  t() method for a
7870: 20 6e 6f 64 65 20 6f 66 20 74 79 70 65 20 46 54   node of type FT
7880: 53 35 5f 54 45 52 4d 2e 0a 2a 2f 0a 73 74 61 74  S5_TERM..*/.stat
7890: 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e  ic int fts5ExprN
78a0: 6f 64 65 4e 65 78 74 5f 54 45 52 4d 28 0a 20 20  odeNext_TERM(.  
78b0: 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts5Expr *pExpr,
78c0: 20 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65   .  Fts5ExprNode
78d0: 20 2a 70 4e 6f 64 65 2c 0a 20 20 69 6e 74 20 62   *pNode,.  int b
78e0: 46 72 6f 6d 56 61 6c 69 64 2c 0a 20 20 69 36 34  FromValid,.  i64
78f0: 20 69 46 72 6f 6d 0a 29 7b 0a 20 20 69 6e 74 20   iFrom.){.  int 
7900: 72 63 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49  rc;.  Fts5IndexI
7910: 74 65 72 20 2a 70 49 74 65 72 20 3d 20 70 4e 6f  ter *pIter = pNo
7920: 64 65 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72  de->pNear->apPhr
7930: 61 73 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d  ase[0]->aTerm[0]
7940: 2e 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  .pIter;..  asser
7950: 74 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d  t( pNode->bEof==
7960: 30 20 29 3b 0a 20 20 69 66 28 20 62 46 72 6f 6d  0 );.  if( bFrom
7970: 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 72 63 20  Valid ){.    rc 
7980: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
7990: 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2c  rNextFrom(pIter,
79a0: 20 69 46 72 6f 6d 29 3b 0a 20 20 7d 65 6c 73 65   iFrom);.  }else
79b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
79c0: 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70  e3Fts5IterNext(p
79d0: 49 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Iter);.  }.  if(
79e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
79f0: 26 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  & sqlite3Fts5Ite
7a00: 72 45 6f 66 28 70 49 74 65 72 29 3d 3d 30 20 29  rEof(pIter)==0 )
7a10: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45  {.    rc = fts5E
7a20: 78 70 72 4e 6f 64 65 54 65 73 74 5f 54 45 52 4d  xprNodeTest_TERM
7a30: 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a  (pExpr, pNode);.
7a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 6f    }else{.    pNo
7a50: 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  de->bEof = 1;.  
7a60: 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63    pNode->bNomatc
7a70: 68 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  h = 0;.  }.  ret
7a80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
7a90: 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 4e  c void fts5ExprN
7aa0: 6f 64 65 54 65 73 74 5f 4f 52 28 0a 20 20 46 74  odeTest_OR(.  Ft
7ab0: 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s5Expr *pExpr,  
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ad0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 77   Expression of w
7ae0: 68 69 63 68 20 70 4e 6f 64 65 20 69 73 20 61 20  hich pNode is a 
7af0: 70 61 72 74 20 2a 2f 0a 20 20 46 74 73 35 45 78  part */.  Fts5Ex
7b00: 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20  prNode *pNode   
7b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
7b20: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
7b30: 74 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  test */.){.  Fts
7b40: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 65 78 74  5ExprNode *pNext
7b50: 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c   = pNode->apChil
7b60: 64 5b 30 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  d[0];.  int i;..
7b70: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 4e 6f    for(i=1; i<pNo
7b80: 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29  de->nChild; i++)
7b90: 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f  {.    Fts5ExprNo
7ba0: 64 65 20 2a 70 43 68 69 6c 64 20 3d 20 70 4e 6f  de *pChild = pNo
7bb0: 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 3b 0a  de->apChild[i];.
7bc0: 20 20 20 20 69 6e 74 20 63 6d 70 20 3d 20 66 74      int cmp = ft
7bd0: 73 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45  s5NodeCompare(pE
7be0: 78 70 72 2c 20 70 4e 65 78 74 2c 20 70 43 68 69  xpr, pNext, pChi
7bf0: 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 63 6d 70  ld);.    if( cmp
7c00: 3e 30 20 7c 7c 20 28 63 6d 70 3d 3d 30 20 26 26  >0 || (cmp==0 &&
7c10: 20 70 43 68 69 6c 64 2d 3e 62 4e 6f 6d 61 74 63   pChild->bNomatc
7c20: 68 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70  h==0) ){.      p
7c30: 4e 65 78 74 20 3d 20 70 43 68 69 6c 64 3b 0a 20  Next = pChild;. 
7c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 6f 64 65     }.  }.  pNode
7c50: 2d 3e 69 52 6f 77 69 64 20 3d 20 70 4e 65 78 74  ->iRowid = pNext
7c60: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 4e 6f 64  ->iRowid;.  pNod
7c70: 65 2d 3e 62 45 6f 66 20 3d 20 70 4e 65 78 74 2d  e->bEof = pNext-
7c80: 3e 62 45 6f 66 3b 0a 20 20 70 4e 6f 64 65 2d 3e  >bEof;.  pNode->
7c90: 62 4e 6f 6d 61 74 63 68 20 3d 20 70 4e 65 78 74  bNomatch = pNext
7ca0: 2d 3e 62 4e 6f 6d 61 74 63 68 3b 0a 7d 0a 0a 73  ->bNomatch;.}..s
7cb0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
7cc0: 70 72 4e 6f 64 65 4e 65 78 74 5f 4f 52 28 0a 20  prNodeNext_OR(. 
7cd0: 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
7ce0: 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  , .  Fts5ExprNod
7cf0: 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 69 6e 74 20  e *pNode,.  int 
7d00: 62 46 72 6f 6d 56 61 6c 69 64 2c 0a 20 20 69 36  bFromValid,.  i6
7d10: 34 20 69 46 72 6f 6d 0a 29 7b 0a 20 20 69 6e 74  4 iFrom.){.  int
7d20: 20 69 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20   i;.  i64 iLast 
7d30: 3d 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 3b  = pNode->iRowid;
7d40: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
7d50: 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b  Node->nChild; i+
7d60: 2b 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72  +){.    Fts5Expr
7d70: 4e 6f 64 65 20 2a 70 31 20 3d 20 70 4e 6f 64 65  Node *p1 = pNode
7d80: 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 3b 0a 20 20  ->apChild[i];.  
7d90: 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 62 45    assert( p1->bE
7da0: 6f 66 20 7c 7c 20 66 74 73 35 52 6f 77 69 64 43  of || fts5RowidC
7db0: 6d 70 28 70 45 78 70 72 2c 20 70 31 2d 3e 69 52  mp(pExpr, p1->iR
7dc0: 6f 77 69 64 2c 20 69 4c 61 73 74 29 3e 3d 30 20  owid, iLast)>=0 
7dd0: 29 3b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 62  );.    if( p1->b
7de0: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
7df0: 69 66 28 20 28 70 31 2d 3e 69 52 6f 77 69 64 3d  if( (p1->iRowid=
7e00: 3d 69 4c 61 73 74 29 20 0a 20 20 20 20 20 20 20  =iLast) .       
7e10: 7c 7c 20 28 62 46 72 6f 6d 56 61 6c 69 64 20 26  || (bFromValid &
7e20: 26 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70  & fts5RowidCmp(p
7e30: 45 78 70 72 2c 20 70 31 2d 3e 69 52 6f 77 69 64  Expr, p1->iRowid
7e40: 2c 20 69 46 72 6f 6d 29 3c 30 29 0a 20 20 20 20  , iFrom)<0).    
7e50: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
7e60: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
7e70: 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70 31  deNext(pExpr, p1
7e80: 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20 69 46  , bFromValid, iF
7e90: 72 6f 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rom);.        if
7ea0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7eb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
7ec0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7ed0: 20 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65    fts5ExprNodeTe
7ee0: 73 74 5f 4f 52 28 70 45 78 70 72 2c 20 70 4e 6f  st_OR(pExpr, pNo
7ef0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  de);.  return SQ
7f00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7f10: 2a 20 41 72 67 75 6d 65 6e 74 20 70 4e 6f 64 65  * Argument pNode
7f20: 20 69 73 20 61 6e 20 46 54 53 35 5f 41 4e 44 20   is an FTS5_AND 
7f30: 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  node..*/.static 
7f40: 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65  int fts5ExprNode
7f50: 54 65 73 74 5f 41 4e 44 28 0a 20 20 46 74 73 35  Test_AND(.  Fts5
7f60: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7f80: 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73  xpression pPhras
7f90: 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
7fa0: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
7fb0: 70 41 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  pAnd            
7fc0: 20 20 2f 2a 20 46 54 53 35 5f 41 4e 44 20 6e 6f    /* FTS5_AND no
7fd0: 64 65 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  de to advance */
7fe0: 0a 29 7b 0a 20 20 69 6e 74 20 69 43 68 69 6c 64  .){.  int iChild
7ff0: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
8000: 70 41 6e 64 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pAnd->iRowid;.  
8010: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8020: 4f 4b 3b 0a 20 20 69 6e 74 20 62 4d 61 74 63 68  OK;.  int bMatch
8030: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 41 6e  ;..  assert( pAn
8040: 64 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  d->bEof==0 );.  
8050: 64 6f 20 7b 0a 20 20 20 20 70 41 6e 64 2d 3e 62  do {.    pAnd->b
8060: 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  Nomatch = 0;.   
8070: 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20   bMatch = 1;.   
8080: 20 66 6f 72 28 69 43 68 69 6c 64 3d 30 3b 20 69   for(iChild=0; i
8090: 43 68 69 6c 64 3c 70 41 6e 64 2d 3e 6e 43 68 69  Child<pAnd->nChi
80a0: 6c 64 3b 20 69 43 68 69 6c 64 2b 2b 29 7b 0a 20  ld; iChild++){. 
80b0: 20 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64       Fts5ExprNod
80c0: 65 20 2a 70 43 68 69 6c 64 20 3d 20 70 41 6e 64  e *pChild = pAnd
80d0: 2d 3e 61 70 43 68 69 6c 64 5b 69 43 68 69 6c 64  ->apChild[iChild
80e0: 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6d 70  ];.      int cmp
80f0: 20 3d 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28   = fts5RowidCmp(
8100: 70 45 78 70 72 2c 20 69 4c 61 73 74 2c 20 70 43  pExpr, iLast, pC
8110: 68 69 6c 64 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  hild->iRowid);. 
8120: 20 20 20 20 20 69 66 28 20 63 6d 70 3e 30 20 29       if( cmp>0 )
8130: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76  {.        /* Adv
8140: 61 6e 63 65 20 70 43 68 69 6c 64 20 75 6e 74 69  ance pChild unti
8150: 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  l it points to i
8160: 4c 61 73 74 20 6f 72 20 6c 61 73 74 65 72 20 2a  Last or laster *
8170: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
8180: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28  ts5ExprNodeNext(
8190: 70 45 78 70 72 2c 20 70 43 68 69 6c 64 2c 20 31  pExpr, pChild, 1
81a0: 2c 20 69 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  , iLast);.      
81b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
81c0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
81d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
81e0: 2f 2a 20 49 66 20 74 68 65 20 63 68 69 6c 64 20  /* If the child 
81f0: 6e 6f 64 65 20 69 73 20 6e 6f 77 20 61 74 20 45  node is now at E
8200: 4f 46 2c 20 73 6f 20 69 73 20 74 68 65 20 70 61  OF, so is the pa
8210: 72 65 6e 74 20 41 4e 44 20 6e 6f 64 65 2e 20 4f  rent AND node. O
8220: 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
8230: 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64  ** the child nod
8240: 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
8250: 74 6f 20 68 61 76 65 20 61 64 76 61 6e 63 65 64  to have advanced
8260: 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72   at least as far
8270: 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77   as.      ** row
8280: 69 64 20 69 4c 61 73 74 2e 20 53 6f 20 69 66 20  id iLast. So if 
8290: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 65 78 61  it is not at exa
82a0: 63 74 6c 79 20 69 4c 61 73 74 2c 20 70 43 68 69  ctly iLast, pChi
82b0: 6c 64 2d 3e 69 52 6f 77 69 64 20 69 73 20 74 68  ld->iRowid is th
82c0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 6c  e.      ** new l
82d0: 61 73 74 65 73 74 20 72 6f 77 69 64 20 73 65 65  astest rowid see
82e0: 6e 20 73 6f 20 66 61 72 2e 20 20 2a 2f 0a 20 20  n so far.  */.  
82f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69      assert( pChi
8300: 6c 64 2d 3e 62 45 6f 66 20 7c 7c 20 66 74 73 35  ld->bEof || fts5
8310: 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20  RowidCmp(pExpr, 
8320: 69 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d 3e 69  iLast, pChild->i
8330: 52 6f 77 69 64 29 3c 3d 30 20 29 3b 0a 20 20 20  Rowid)<=0 );.   
8340: 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 62     if( pChild->b
8350: 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Eof ){.        f
8360: 74 73 35 45 78 70 72 53 65 74 45 6f 66 28 70 41  ts5ExprSetEof(pA
8370: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 62 4d 61  nd);.        bMa
8380: 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
8390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
83a0: 6c 73 65 20 69 66 28 20 69 4c 61 73 74 21 3d 70  lse if( iLast!=p
83b0: 43 68 69 6c 64 2d 3e 69 52 6f 77 69 64 20 29 7b  Child->iRowid ){
83c0: 0a 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20  .        bMatch 
83d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 4c 61  = 0;.        iLa
83e0: 73 74 20 3d 20 70 43 68 69 6c 64 2d 3e 69 52 6f  st = pChild->iRo
83f0: 77 69 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  wid;.      }..  
8400: 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
8410: 62 4e 6f 6d 61 74 63 68 20 29 7b 0a 20 20 20 20  bNomatch ){.    
8420: 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74      pAnd->bNomat
8430: 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ch = 1;.      }.
8440: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
8450: 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20  bMatch==0 );..  
8460: 69 66 28 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74  if( pAnd->bNomat
8470: 63 68 20 26 26 20 70 41 6e 64 21 3d 70 45 78 70  ch && pAnd!=pExp
8480: 72 2d 3e 70 52 6f 6f 74 20 29 7b 0a 20 20 20 20  r->pRoot ){.    
8490: 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f  fts5ExprNodeZero
84a0: 50 6f 73 6c 69 73 74 28 70 41 6e 64 29 3b 0a 20  Poslist(pAnd);. 
84b0: 20 7d 0a 20 20 70 41 6e 64 2d 3e 69 52 6f 77 69   }.  pAnd->iRowi
84c0: 64 20 3d 20 69 4c 61 73 74 3b 0a 20 20 72 65 74  d = iLast;.  ret
84d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
84e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
84f0: 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 41 4e  5ExprNodeNext_AN
8500: 44 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  D(.  Fts5Expr *p
8510: 45 78 70 72 2c 20 0a 20 20 46 74 73 35 45 78 70  Expr, .  Fts5Exp
8520: 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20  rNode *pNode,.  
8530: 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a  int bFromValid,.
8540: 20 20 69 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20    i64 iFrom.){. 
8550: 20 69 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78   int rc = fts5Ex
8560: 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72  prNodeNext(pExpr
8570: 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  , pNode->apChild
8580: 5b 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c  [0], bFromValid,
8590: 20 69 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72   iFrom);.  if( r
85a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
85b0: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
85c0: 72 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28 70 45  rNodeTest_AND(pE
85d0: 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d  xpr, pNode);.  }
85e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
85f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8600: 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4e 4f 54  ExprNodeTest_NOT
8610: 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  (.  Fts5Expr *pE
8620: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
8630: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
8640: 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f 6e 67  n pPhrase belong
8650: 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 45 78  s to */.  Fts5Ex
8660: 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20  prNode *pNode   
8670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
8680: 35 5f 4e 4f 54 20 6e 6f 64 65 20 74 6f 20 61 64  5_NOT node to ad
8690: 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  vance */.){.  in
86a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
86b0: 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ;.  Fts5ExprNode
86c0: 20 2a 70 31 20 3d 20 70 4e 6f 64 65 2d 3e 61 70   *p1 = pNode->ap
86d0: 43 68 69 6c 64 5b 30 5d 3b 0a 20 20 46 74 73 35  Child[0];.  Fts5
86e0: 45 78 70 72 4e 6f 64 65 20 2a 70 32 20 3d 20 70  ExprNode *p2 = p
86f0: 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 31 5d  Node->apChild[1]
8700: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64  ;.  assert( pNod
8710: 65 2d 3e 6e 43 68 69 6c 64 3d 3d 32 20 29 3b 0a  e->nChild==2 );.
8720: 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
8730: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 2d 3e 62  LITE_OK && p1->b
8740: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Eof==0 ){.    in
8750: 74 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f 64 65  t cmp = fts5Node
8760: 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 20 70  Compare(pExpr, p
8770: 31 2c 20 70 32 29 3b 0a 20 20 20 20 69 66 28 20  1, p2);.    if( 
8780: 63 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  cmp>0 ){.      r
8790: 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
87a0: 4e 65 78 74 28 70 45 78 70 72 2c 20 70 32 2c 20  Next(pExpr, p2, 
87b0: 31 2c 20 70 31 2d 3e 69 52 6f 77 69 64 29 3b 0a  1, p1->iRowid);.
87c0: 20 20 20 20 20 20 63 6d 70 20 3d 20 66 74 73 35        cmp = fts5
87d0: 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45 78 70  NodeCompare(pExp
87e0: 72 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 20 20  r, p1, p2);.    
87f0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
8800: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
8810: 6d 70 3c 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  mp<=0 );.    if(
8820: 20 63 6d 70 20 7c 7c 20 70 32 2d 3e 62 4e 6f 6d   cmp || p2->bNom
8830: 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
8840: 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
8850: 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70  odeNext(pExpr, p
8860: 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  1, 0, 0);.  }.  
8870: 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 70 31  pNode->bEof = p1
8880: 2d 3e 62 45 6f 66 3b 0a 20 20 70 4e 6f 64 65 2d  ->bEof;.  pNode-
8890: 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 70 31 2d 3e  >bNomatch = p1->
88a0: 62 4e 6f 6d 61 74 63 68 3b 0a 20 20 70 4e 6f 64  bNomatch;.  pNod
88b0: 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 31 2d 3e  e->iRowid = p1->
88c0: 69 52 6f 77 69 64 3b 0a 20 20 69 66 28 20 70 31  iRowid;.  if( p1
88d0: 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20 66 74  ->bEof ){.    ft
88e0: 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50 6f  s5ExprNodeZeroPo
88f0: 73 6c 69 73 74 28 70 32 29 3b 0a 20 20 7d 0a 20  slist(p2);.  }. 
8900: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
8910: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
8920: 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54 28 0a  prNodeNext_NOT(.
8930: 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70    Fts5Expr *pExp
8940: 72 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  r, .  Fts5ExprNo
8950: 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 69 6e 74  de *pNode,.  int
8960: 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a 20 20 69   bFromValid,.  i
8970: 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20 20 69 6e  64 iFrom.){.  in
8980: 74 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e  t rc = fts5ExprN
8990: 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70  odeNext(pExpr, p
89a0: 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d  Node->apChild[0]
89b0: 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20 69 46  , bFromValid, iF
89c0: 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  rom);.  if( rc==
89d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
89e0: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
89f0: 64 65 54 65 73 74 5f 4e 4f 54 28 70 45 78 70 72  deTest_NOT(pExpr
8a00: 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 20 20  , pNode);.  }.  
8a10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8a20: 0a 2a 2a 20 49 66 20 70 4e 6f 64 65 20 63 75 72  .** If pNode cur
8a30: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
8a40: 20 61 20 6d 61 74 63 68 2c 20 74 68 69 73 20 66   a match, this f
8a50: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8a60: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 77 69 74  SQLITE_OK.** wit
8a70: 68 6f 75 74 20 6d 6f 64 69 66 79 69 6e 67 20 69  hout modifying i
8a80: 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 4e  t. Otherwise, pN
8a90: 6f 64 65 20 69 73 20 61 64 76 61 6e 63 65 64 20  ode is advanced 
8aa0: 75 6e 74 69 6c 20 69 74 20 64 6f 65 73 20 70 6f  until it does po
8ab0: 69 6e 74 0a 2a 2a 20 74 6f 20 61 20 6d 61 74 63  int.** to a matc
8ac0: 68 20 6f 72 20 45 4f 46 20 69 73 20 72 65 61 63  h or EOF is reac
8ad0: 68 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hed..*/.static i
8ae0: 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54  nt fts5ExprNodeT
8af0: 65 73 74 28 0a 20 20 46 74 73 35 45 78 70 72 20  est(.  Fts5Expr 
8b00: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
8b10: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
8b20: 73 69 6f 6e 20 6f 66 20 77 68 69 63 68 20 70 4e  sion of which pN
8b30: 6f 64 65 20 69 73 20 61 20 70 61 72 74 20 2a 2f  ode is a part */
8b40: 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
8b50: 2a 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20  *pNode          
8b60: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8b70: 20 6e 6f 64 65 20 74 6f 20 74 65 73 74 20 2a 2f   node to test */
8b80: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
8b90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
8ba0: 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20 29  pNode->bEof==0 )
8bb0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4e  {.    switch( pN
8bc0: 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 0a 20  ode->eType ){.. 
8bd0: 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 53       case FTS5_S
8be0: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 20  TRING: {.       
8bf0: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
8c00: 64 65 54 65 73 74 5f 53 54 52 49 4e 47 28 70 45  deTest_STRING(pE
8c10: 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  xpr, pNode);.   
8c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8c30: 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
8c40: 46 54 53 35 5f 54 45 52 4d 3a 20 7b 0a 20 20 20  FTS5_TERM: {.   
8c50: 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78       rc = fts5Ex
8c60: 70 72 4e 6f 64 65 54 65 73 74 5f 54 45 52 4d 28  prNodeTest_TERM(
8c70: 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20  pExpr, pNode);. 
8c80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8c90: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
8ca0: 65 20 46 54 53 35 5f 41 4e 44 3a 20 7b 0a 20 20  e FTS5_AND: {.  
8cb0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45        rc = fts5E
8cc0: 78 70 72 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28  xprNodeTest_AND(
8cd0: 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20  pExpr, pNode);. 
8ce0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
8d00: 65 20 46 54 53 35 5f 4f 52 3a 20 7b 0a 20 20 20  e FTS5_OR: {.   
8d10: 20 20 20 20 20 66 74 73 35 45 78 70 72 4e 6f 64       fts5ExprNod
8d20: 65 54 65 73 74 5f 4f 52 28 70 45 78 70 72 2c 20  eTest_OR(pExpr, 
8d30: 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  pNode);.        
8d40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
8d50: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61        default: a
8d60: 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54  ssert( pNode->eT
8d70: 79 70 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29 3b  ype==FTS5_NOT );
8d80: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
8d90: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
8da0: 5f 4e 4f 54 28 70 45 78 70 72 2c 20 70 4e 6f 64  _NOT(pExpr, pNod
8db0: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
8dc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
8dd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8de0: 3b 0a 7d 0a 0a 20 0a 2f 2a 0a 2a 2a 20 53 65 74  ;.}.. ./*.** Set
8df0: 20 6e 6f 64 65 20 70 4e 6f 64 65 2c 20 77 68 69   node pNode, whi
8e00: 63 68 20 69 73 20 70 61 72 74 20 6f 66 20 65 78  ch is part of ex
8e10: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2c 20  pression pExpr, 
8e20: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
8e30: 66 69 72 73 74 0a 2a 2a 20 6d 61 74 63 68 2e 20  first.** match. 
8e40: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
8e50: 6d 61 74 63 68 65 73 2c 20 73 65 74 20 74 68 65  matches, set the
8e60: 20 4e 6f 64 65 2e 62 45 6f 66 20 66 6c 61 67 20   Node.bEof flag 
8e70: 74 6f 20 69 6e 64 69 63 61 74 65 20 45 4f 46 2e  to indicate EOF.
8e80: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
8e90: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
8ea0: 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  de if an error o
8eb0: 63 63 75 72 73 2c 20 6f 72 20 53 51 4c 49 54 45  ccurs, or SQLITE
8ec0: 5f 4f 4b 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  _OK otherwise..*
8ed0: 2a 20 49 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  * It is not an e
8ee0: 72 72 6f 72 20 69 66 20 74 68 65 72 65 20 61 72  rror if there ar
8ef0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2f  e no matches..*/
8f00: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8f10: 45 78 70 72 4e 6f 64 65 46 69 72 73 74 28 46 74  ExprNodeFirst(Ft
8f20: 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 46  s5Expr *pExpr, F
8f30: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f  ts5ExprNode *pNo
8f40: 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  de){.  int rc = 
8f50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 4e 6f  SQLITE_OK;.  pNo
8f60: 64 65 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20  de->bEof = 0;.  
8f70: 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20  pNode->bNomatch 
8f80: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 46 74 73 35  = 0;..  if( Fts5
8f90: 4e 6f 64 65 49 73 53 74 72 69 6e 67 28 70 4e 6f  NodeIsString(pNo
8fa0: 64 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  de) ){.    /* In
8fb0: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 74 65 72  itialize all ter
8fc0: 6d 20 69 74 65 72 61 74 6f 72 73 20 69 6e 20 74  m iterators in t
8fd0: 68 65 20 4e 45 41 52 20 6f 62 6a 65 63 74 2e 20  he NEAR object. 
8fe0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  */.    rc = fts5
8ff0: 45 78 70 72 4e 65 61 72 49 6e 69 74 41 6c 6c 28  ExprNearInitAll(
9000: 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20  pExpr, pNode);. 
9010: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 6f 64 65   }else if( pNode
9020: 2d 3e 78 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ->xNext==0 ){.  
9030: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
9040: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
9050: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
9060: 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  Eof = 0;.    for
9070: 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e  (i=0; i<pNode->n
9080: 43 68 69 6c 64 20 26 26 20 72 63 3d 3d 53 51 4c  Child && rc==SQL
9090: 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
90a0: 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65      Fts5ExprNode
90b0: 20 2a 70 43 68 69 6c 64 20 3d 20 70 4e 6f 64 65   *pChild = pNode
90c0: 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 3b 0a 20 20  ->apChild[i];.  
90d0: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
90e0: 72 4e 6f 64 65 46 69 72 73 74 28 70 45 78 70 72  rNodeFirst(pExpr
90f0: 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  , pNode->apChild
9100: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  [i]);.      asse
9110: 72 74 28 20 70 43 68 69 6c 64 2d 3e 62 45 6f 66  rt( pChild->bEof
9120: 3d 3d 30 20 7c 7c 20 70 43 68 69 6c 64 2d 3e 62  ==0 || pChild->b
9130: 45 6f 66 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Eof==1 );.      
9140: 6e 45 6f 66 20 2b 3d 20 70 43 68 69 6c 64 2d 3e  nEof += pChild->
9150: 62 45 6f 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bEof;.    }.    
9160: 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20  pNode->iRowid = 
9170: 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30  pNode->apChild[0
9180: 5d 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20  ]->iRowid;..    
9190: 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65  switch( pNode->e
91a0: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
91b0: 73 65 20 46 54 53 35 5f 41 4e 44 3a 0a 20 20 20  se FTS5_AND:.   
91c0: 20 20 20 20 20 69 66 28 20 6e 45 6f 66 3e 30 20       if( nEof>0 
91d0: 29 20 66 74 73 35 45 78 70 72 53 65 74 45 6f 66  ) fts5ExprSetEof
91e0: 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  (pNode);.       
91f0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
9200: 61 73 65 20 46 54 53 35 5f 4f 52 3a 0a 20 20 20  ase FTS5_OR:.   
9210: 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e       if( pNode->
9220: 6e 43 68 69 6c 64 3d 3d 6e 45 6f 66 20 29 20 66  nChild==nEof ) f
9230: 74 73 35 45 78 70 72 53 65 74 45 6f 66 28 70 4e  ts5ExprSetEof(pN
9240: 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ode);.        br
9250: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61  eak;..      defa
9260: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
9270: 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70  ert( pNode->eTyp
9280: 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29 3b 0a 20  e==FTS5_NOT );. 
9290: 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45         pNode->bE
92a0: 6f 66 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68  of = pNode->apCh
92b0: 69 6c 64 5b 30 5d 2d 3e 62 45 6f 66 3b 0a 20 20  ild[0]->bEof;.  
92c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
92d0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
92e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
92f0: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
9300: 4e 6f 64 65 54 65 73 74 28 70 45 78 70 72 2c 20  NodeTest(pExpr, 
9310: 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pNode);.  }.  re
9320: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
9330: 2a 2a 20 42 65 67 69 6e 20 69 74 65 72 61 74 69  ** Begin iterati
9340: 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ng through the s
9350: 65 74 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  et of documents 
9360: 69 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6d 61  in index pIdx ma
9370: 74 63 68 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  tched by.** the 
9380: 4d 41 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e  MATCH expression
9390: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
93a0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
93b0: 66 20 74 68 65 20 22 62 44 65 73 63 22 20 0a 2a  f the "bDesc" .*
93c0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  * parameter is p
93d0: 61 73 73 65 64 20 61 20 6e 6f 6e 2d 7a 65 72 6f  assed a non-zero
93e0: 20 76 61 6c 75 65 2c 20 69 74 65 72 61 74 69 6f   value, iteratio
93f0: 6e 20 69 73 20 69 6e 20 64 65 73 63 65 6e 64 69  n is in descendi
9400: 6e 67 20 72 6f 77 69 64 20 0a 2a 2a 20 6f 72 64  ng rowid .** ord
9410: 65 72 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73  er. Or, if it is
9420: 20 7a 65 72 6f 2c 20 69 6e 20 61 73 63 65 6e 64   zero, in ascend
9430: 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a  ing order..**.**
9440: 20 49 66 20 69 74 65 72 61 74 69 6e 67 20 69 6e   If iterating in
9450: 20 61 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64   ascending rowid
9460: 20 6f 72 64 65 72 20 28 62 44 65 73 63 3d 3d 30   order (bDesc==0
9470: 29 2c 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  ), the first doc
9480: 75 6d 65 6e 74 0a 2a 2a 20 76 69 73 69 74 65 64  ument.** visited
9490: 20 69 73 20 74 68 61 74 20 77 69 74 68 20 74 68   is that with th
94a0: 65 20 73 6d 61 6c 6c 65 73 74 20 72 6f 77 69 64  e smallest rowid
94b0: 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
94c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
94d0: 20 74 6f 20 70 61 72 61 6d 65 74 65 72 20 69 46   to parameter iF
94e0: 69 72 73 74 2e 20 4f 72 2c 20 69 66 20 69 74 65  irst. Or, if ite
94f0: 72 61 74 69 6e 67 20 69 6e 20 61 73 63 65 6e 64  rating in ascend
9500: 69 6e 67 20 6f 72 64 65 72 20 28 62 44 65 73 63  ing order (bDesc
9510: 3d 3d 31 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ==1),.** then th
9520: 65 20 66 69 72 73 74 20 64 6f 63 75 6d 65 6e 74  e first document
9530: 20 76 69 73 69 74 65 64 20 6d 75 73 74 20 68 61   visited must ha
9540: 76 65 20 61 20 72 6f 77 69 64 20 73 6d 61 6c 6c  ve a rowid small
9550: 65 72 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71  er than or.** eq
9560: 75 61 6c 20 74 6f 20 69 46 69 72 73 74 2e 0a 2a  ual to iFirst..*
9570: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
9580: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
9590: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
95a0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
95b0: 65 72 77 69 73 65 2e 20 49 74 0a 2a 2a 20 69 73  erwise. It.** is
95c0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
95d0: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
95e0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 6d  query does not m
95f0: 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d 65 6e  atch any documen
9600: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
9610: 65 33 46 74 73 35 45 78 70 72 46 69 72 73 74 28  e3Fts5ExprFirst(
9620: 46 74 73 35 45 78 70 72 20 2a 70 2c 20 46 74 73  Fts5Expr *p, Fts
9630: 35 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 36  5Index *pIdx, i6
9640: 34 20 69 46 69 72 73 74 2c 20 69 6e 74 20 62 44  4 iFirst, int bD
9650: 65 73 63 29 7b 0a 20 20 46 74 73 35 45 78 70 72  esc){.  Fts5Expr
9660: 4e 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 70 2d  Node *pRoot = p-
9670: 3e 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  >pRoot;.  int rc
9680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
96a0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 70  urn code */..  p
96b0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  ->pIndex = pIdx;
96c0: 0a 20 20 70 2d 3e 62 44 65 73 63 20 3d 20 62 44  .  p->bDesc = bD
96d0: 65 73 63 3b 0a 20 20 72 63 20 3d 20 66 74 73 35  esc;.  rc = fts5
96e0: 45 78 70 72 4e 6f 64 65 46 69 72 73 74 28 70 2c  ExprNodeFirst(p,
96f0: 20 70 52 6f 6f 74 29 3b 0a 0a 20 20 2f 2a 20 49   pRoot);..  /* I
9700: 66 20 6e 6f 74 20 61 74 20 45 4f 46 20 62 75 74  f not at EOF but
9710: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
9720: 69 64 20 6f 63 63 75 72 73 20 65 61 72 6c 69 65  id occurs earlie
9730: 72 20 74 68 61 6e 20 69 46 69 72 73 74 20 69 6e  r than iFirst in
9740: 0a 20 20 2a 2a 20 74 68 65 20 69 74 65 72 61 74  .  ** the iterat
9750: 69 6f 6e 20 6f 72 64 65 72 2c 20 6d 6f 76 65 20  ion order, move 
9760: 74 6f 20 64 6f 63 75 6d 65 6e 74 20 69 46 69 72  to document iFir
9770: 73 74 20 6f 72 20 6c 61 74 65 72 2e 20 2a 2f 0a  st or later. */.
9780: 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 62 45 6f    if( pRoot->bEo
9790: 66 3d 3d 30 20 26 26 20 66 74 73 35 52 6f 77 69  f==0 && fts5Rowi
97a0: 64 43 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69  dCmp(p, pRoot->i
97b0: 52 6f 77 69 64 2c 20 69 46 69 72 73 74 29 3c 30  Rowid, iFirst)<0
97c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
97d0: 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70 2c  5ExprNodeNext(p,
97e0: 20 70 52 6f 6f 74 2c 20 31 2c 20 69 46 69 72 73   pRoot, 1, iFirs
97f0: 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
9800: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
9810: 20 6e 6f 74 20 61 74 20 61 20 72 65 61 6c 20 6d   not at a real m
9820: 61 74 63 68 2c 20 73 6b 69 70 20 66 6f 72 77 61  atch, skip forwa
9830: 72 64 20 75 6e 74 69 6c 20 69 74 20 69 73 2e 20  rd until it is. 
9840: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 6f  */.  while( pRoo
9850: 74 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 7b 0a 20  t->bNomatch ){. 
9860: 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
9870: 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 72 63 3d  ->bEof==0 && rc=
9880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9890: 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
98a0: 6f 64 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74  odeNext(p, pRoot
98b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
98c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
98d0: 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
98e0: 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a  ext document .**
98f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
9900: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
9910: 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
9920: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
9930: 72 77 69 73 65 2e 20 49 74 0a 2a 2a 20 69 73 20  rwise. It.** is 
9940: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
9950: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 71  n error if the q
9960: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61  uery does not ma
9970: 74 63 68 20 61 6e 79 20 64 6f 63 75 6d 65 6e 74  tch any document
9980: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9990: 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 46 74  3Fts5ExprNext(Ft
99a0: 73 35 45 78 70 72 20 2a 70 2c 20 69 36 34 20 69  s5Expr *p, i64 i
99b0: 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Last){.  int rc;
99c0: 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
99d0: 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52 6f 6f  *pRoot = p->pRoo
99e0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  t;.  assert( pRo
99f0: 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70  ot->bEof==0 && p
9a00: 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 3d 3d  Root->bNomatch==
9a10: 30 20 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  0 );.  do {.    
9a20: 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
9a30: 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74 2c 20  eNext(p, pRoot, 
9a40: 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  0, 0);.    asser
9a50: 74 28 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74  t( pRoot->bNomat
9a60: 63 68 3d 3d 30 20 7c 7c 20 28 72 63 3d 3d 53 51  ch==0 || (rc==SQ
9a70: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 6f 6f 74  LITE_OK && pRoot
9a80: 2d 3e 62 45 6f 66 3d 3d 30 29 20 29 3b 0a 20 20  ->bEof==0) );.  
9a90: 7d 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e 62  }while( pRoot->b
9aa0: 4e 6f 6d 61 74 63 68 20 29 3b 0a 20 20 69 66 28  Nomatch );.  if(
9ab0: 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70 2c   fts5RowidCmp(p,
9ac0: 20 70 52 6f 6f 74 2d 3e 69 52 6f 77 69 64 2c 20   pRoot->iRowid, 
9ad0: 69 4c 61 73 74 29 3e 30 20 29 7b 0a 20 20 20 20  iLast)>0 ){.    
9ae0: 70 52 6f 6f 74 2d 3e 62 45 6f 66 20 3d 20 31 3b  pRoot->bEof = 1;
9af0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9b00: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
9b10: 46 74 73 35 45 78 70 72 45 6f 66 28 46 74 73 35  Fts5ExprEof(Fts5
9b20: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9b30: 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e 62 45 6f  rn p->pRoot->bEo
9b40: 66 3b 0a 7d 0a 0a 69 36 34 20 73 71 6c 69 74 65  f;.}..i64 sqlite
9b50: 33 46 74 73 35 45 78 70 72 52 6f 77 69 64 28 46  3Fts5ExprRowid(F
9b60: 74 73 35 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  ts5Expr *p){.  r
9b70: 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e  eturn p->pRoot->
9b80: 69 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74 69  iRowid;.}..stati
9b90: 63 20 69 6e 74 20 66 74 73 35 50 61 72 73 65 53  c int fts5ParseS
9ba0: 74 72 69 6e 67 46 72 6f 6d 54 6f 6b 65 6e 28 46  tringFromToken(F
9bb0: 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  ts5Token *pToken
9bc0: 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a 20 20  , char **pz){.  
9bd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9be0: 4f 4b 3b 0a 20 20 2a 70 7a 20 3d 20 73 71 6c 69  OK;.  *pz = sqli
9bf0: 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26  te3Fts5Strndup(&
9c00: 72 63 2c 20 70 54 6f 6b 65 6e 2d 3e 70 2c 20 70  rc, pToken->p, p
9c10: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 72 65 74  Token->n);.  ret
9c20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9c30: 20 46 72 65 65 20 74 68 65 20 70 68 72 61 73 65   Free the phrase
9c40: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
9c50: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
9c60: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
9c70: 6f 69 64 20 66 74 73 35 45 78 70 72 50 68 72 61  oid fts5ExprPhra
9c80: 73 65 46 72 65 65 28 46 74 73 35 45 78 70 72 50  seFree(Fts5ExprP
9c90: 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 29 7b  hrase *pPhrase){
9ca0: 0a 20 20 69 66 28 20 70 50 68 72 61 73 65 20 29  .  if( pPhrase )
9cb0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9cc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72   for(i=0; i<pPhr
9cd0: 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  ase->nTerm; i++)
9ce0: 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72  {.      Fts5Expr
9cf0: 54 65 72 6d 20 2a 70 53 79 6e 3b 0a 20 20 20 20  Term *pSyn;.    
9d00: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
9d10: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 46 74 73  pNext;.      Fts
9d20: 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
9d30: 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54 65   = &pPhrase->aTe
9d40: 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  rm[i];.      sql
9d50: 69 74 65 33 5f 66 72 65 65 28 70 54 65 72 6d 2d  ite3_free(pTerm-
9d60: 3e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 73  >zTerm);.      s
9d70: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
9d80: 6f 73 65 28 70 54 65 72 6d 2d 3e 70 49 74 65 72  ose(pTerm->pIter
9d90: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 53 79  );.      for(pSy
9da0: 6e 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79  n=pTerm->pSynony
9db0: 6d 3b 20 70 53 79 6e 3b 20 70 53 79 6e 3d 70 4e  m; pSyn; pSyn=pN
9dc0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ext){.        pN
9dd0: 65 78 74 20 3d 20 70 53 79 6e 2d 3e 70 53 79 6e  ext = pSyn->pSyn
9de0: 6f 6e 79 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  onym;.        sq
9df0: 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
9e00: 73 65 28 70 53 79 6e 2d 3e 70 49 74 65 72 29 3b  se(pSyn->pIter);
9e10: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
9e20: 66 65 72 46 72 65 65 28 28 46 74 73 35 42 75 66  ferFree((Fts5Buf
9e30: 66 65 72 2a 29 26 70 53 79 6e 5b 31 5d 29 3b 0a  fer*)&pSyn[1]);.
9e40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9e50: 66 72 65 65 28 70 53 79 6e 29 3b 0a 20 20 20 20  free(pSyn);.    
9e60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9e70: 28 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69  ( pPhrase->posli
9e80: 73 74 2e 6e 53 70 61 63 65 3e 30 20 29 20 66 74  st.nSpace>0 ) ft
9e90: 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 50  s5BufferFree(&pP
9ea0: 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 29 3b  hrase->poslist);
9eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9ec0: 65 28 70 50 68 72 61 73 65 29 3b 0a 20 20 7d 0a  e(pPhrase);.  }.
9ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75  }../*.** If argu
9ee0: 6d 65 6e 74 20 70 4e 65 61 72 20 69 73 20 4e 55  ment pNear is NU
9ef0: 4c 4c 2c 20 74 68 65 6e 20 61 20 6e 65 77 20 46  LL, then a new F
9f00: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 6f  ts5ExprNearset o
9f10: 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
9f20: 65 64 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  ed.** and popula
9f30: 74 65 64 20 77 69 74 68 20 70 50 68 72 61 73 65  ted with pPhrase
9f40: 2e 20 4f 72 2c 20 69 66 20 70 4e 65 61 72 20 69  . Or, if pNear i
9f50: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 68 72 61  s not NULL, phra
9f60: 73 65 20 70 50 68 72 61 73 65 20 69 73 0a 2a 2a  se pPhrase is.**
9f70: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 69 74 20   appended to it 
9f80: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  and the results 
9f90: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
9fa0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
9fb0: 6f 63 63 75 72 73 2c 20 62 6f 74 68 20 74 68 65  occurs, both the
9fc0: 20 70 4e 65 61 72 20 61 6e 64 20 70 50 68 72 61   pNear and pPhra
9fd0: 73 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 66  se objects are f
9fe0: 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c  reed and.** NULL
9ff0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 46 74   returned..*/.Ft
a000: 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 73  s5ExprNearset *s
a010: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
a020: 65 61 72 73 65 74 28 0a 20 20 46 74 73 35 50 61  earset(.  Fts5Pa
a030: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
a050: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
a060: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
a070: 2a 70 4e 65 61 72 2c 20 20 20 20 20 20 20 20 20  *pNear,         
a080: 2f 2a 20 45 78 69 73 74 69 6e 67 20 6e 65 61 72  /* Existing near
a090: 73 65 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  set, or NULL */.
a0a0: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
a0b0: 20 2a 70 50 68 72 61 73 65 20 20 20 20 20 20 20   *pPhrase       
a0c0: 20 20 2f 2a 20 52 65 63 65 6e 74 6c 79 20 70 61    /* Recently pa
a0d0: 72 73 65 64 20 70 68 72 61 73 65 20 2a 2f 0a 29  rsed phrase */.)
a0e0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 53 5a  {.  const int SZ
a0f0: 41 4c 4c 4f 43 20 3d 20 38 3b 0a 20 20 46 74 73  ALLOC = 8;.  Fts
a100: 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 52  5ExprNearset *pR
a110: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
a120: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
a130: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
a140: 70 50 68 72 61 73 65 3d 3d 30 20 29 7b 0a 20 20  pPhrase==0 ){.  
a150: 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65 61 72      return pNear
a160: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a170: 70 4e 65 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pNear==0 ){.    
a180: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
a190: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e 65 61  zeof(Fts5ExprNea
a1a0: 72 73 65 74 29 20 2b 20 53 5a 41 4c 4c 4f 43 20  rset) + SZALLOC 
a1b0: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  * sizeof(Fts5Exp
a1c0: 72 50 68 72 61 73 65 2a 29 3b 0a 20 20 20 20 20  rPhrase*);.     
a1d0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f   pRet = sqlite3_
a1e0: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
a1f0: 20 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30       if( pRet==0
a200: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
a210: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
a220: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
a230: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
a240: 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74  et(pRet, 0, nByt
a250: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a260: 7d 65 6c 73 65 20 69 66 28 20 28 70 4e 65 61 72  }else if( (pNear
a270: 2d 3e 6e 50 68 72 61 73 65 20 25 20 53 5a 41 4c  ->nPhrase % SZAL
a280: 4c 4f 43 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  LOC)==0 ){.     
a290: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4e 65 61   int nNew = pNea
a2a0: 72 2d 3e 6e 50 68 72 61 73 65 20 2b 20 53 5a 41  r->nPhrase + SZA
a2b0: 4c 4c 4f 43 3b 0a 20 20 20 20 20 20 69 6e 74 20  LLOC;.      int 
a2c0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
a2d0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 29 20  ts5ExprNearset) 
a2e0: 2b 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66 28  + nNew * sizeof(
a2f0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29  Fts5ExprPhrase*)
a300: 3b 0a 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  ;..      pRet = 
a310: 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74  (Fts5ExprNearset
a320: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
a330: 63 28 70 4e 65 61 72 2c 20 6e 42 79 74 65 29 3b  c(pNear, nByte);
a340: 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 3d  .      if( pRet=
a350: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  =0 ){.        pP
a360: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
a370: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
a380: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a390: 20 20 70 52 65 74 20 3d 20 70 4e 65 61 72 3b 0a    pRet = pNear;.
a3a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
a3b0: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
a3c0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
a3d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
a3e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
a3f0: 50 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65  ParseNearsetFree
a400: 28 70 4e 65 61 72 29 3b 0a 20 20 20 20 73 71 6c  (pNear);.    sql
a410: 69 74 65 33 46 74 73 35 50 61 72 73 65 50 68 72  ite3Fts5ParsePhr
a420: 61 73 65 46 72 65 65 28 70 50 68 72 61 73 65 29  aseFree(pPhrase)
a430: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a440: 66 28 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65  f( pRet->nPhrase
a450: 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  >0 ){.      Fts5
a460: 45 78 70 72 50 68 72 61 73 65 20 2a 70 4c 61 73  ExprPhrase *pLas
a470: 74 20 3d 20 70 52 65 74 2d 3e 61 70 50 68 72 61  t = pRet->apPhra
a480: 73 65 5b 70 52 65 74 2d 3e 6e 50 68 72 61 73 65  se[pRet->nPhrase
a490: 2d 31 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  -1];.      asser
a4a0: 74 28 20 70 4c 61 73 74 3d 3d 70 50 61 72 73 65  t( pLast==pParse
a4b0: 2d 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73  ->apPhrase[pPars
a4c0: 65 2d 3e 6e 50 68 72 61 73 65 2d 32 5d 20 29 3b  e->nPhrase-2] );
a4d0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 68 72 61  .      if( pPhra
a4e0: 73 65 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a  se->nTerm==0 ){.
a4f0: 20 20 20 20 20 20 20 20 66 74 73 35 45 78 70 72          fts5Expr
a500: 50 68 72 61 73 65 46 72 65 65 28 70 50 68 72 61  PhraseFree(pPhra
a510: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  se);.        pRe
a520: 74 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a 20 20  t->nPhrase--;.  
a530: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50        pParse->nP
a540: 68 72 61 73 65 2d 2d 3b 0a 20 20 20 20 20 20 20  hrase--;.       
a550: 20 70 50 68 72 61 73 65 20 3d 20 70 4c 61 73 74   pPhrase = pLast
a560: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
a570: 28 20 70 4c 61 73 74 2d 3e 6e 54 65 72 6d 3d 3d  ( pLast->nTerm==
a580: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
a590: 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28  5ExprPhraseFree(
a5a0: 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pLast);.        
a5b0: 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65  pParse->apPhrase
a5c0: 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65  [pParse->nPhrase
a5d0: 2d 32 5d 20 3d 20 70 50 68 72 61 73 65 3b 0a 20  -2] = pPhrase;. 
a5e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
a5f0: 50 68 72 61 73 65 2d 2d 3b 0a 20 20 20 20 20 20  Phrase--;.      
a600: 20 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65 2d    pRet->nPhrase-
a610: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
a620: 0a 20 20 20 20 70 52 65 74 2d 3e 61 70 50 68 72  .    pRet->apPhr
a630: 61 73 65 5b 70 52 65 74 2d 3e 6e 50 68 72 61 73  ase[pRet->nPhras
a640: 65 2b 2b 5d 20 3d 20 70 50 68 72 61 73 65 3b 0a  e++] = pPhrase;.
a650: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
a660: 74 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  t;.}..typedef st
a670: 72 75 63 74 20 54 6f 6b 65 6e 43 74 78 20 54 6f  ruct TokenCtx To
a680: 6b 65 6e 43 74 78 3b 0a 73 74 72 75 63 74 20 54  kenCtx;.struct T
a690: 6f 6b 65 6e 43 74 78 20 7b 0a 20 20 46 74 73 35  okenCtx {.  Fts5
a6a0: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
a6b0: 61 73 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 7d  ase;.  int rc;.}
a6c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63  ;../*.** Callbac
a6d0: 6b 20 66 6f 72 20 74 6f 6b 65 6e 69 7a 69 6e 67  k for tokenizing
a6e0: 20 74 65 72 6d 73 20 75 73 65 64 20 62 79 20 50   terms used by P
a6f0: 61 72 73 65 54 65 72 6d 28 29 2e 0a 2a 2f 0a 73  arseTerm()..*/.s
a700: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 61  tatic int fts5Pa
a710: 72 73 65 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 76  rseTokenize(.  v
a720: 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20  oid *pContext,  
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a740: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 46 74 73  * Pointer to Fts
a750: 35 49 6e 73 65 72 74 43 74 78 20 6f 62 6a 65 63  5InsertCtx objec
a760: 74 20 2a 2f 0a 20 20 69 6e 74 20 74 66 6c 61 67  t */.  int tflag
a770: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
a780: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
a790: 66 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66  f FTS5_TOKEN_* f
a7a0: 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
a7b0: 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  char *pToken,   
a7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
a7d0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
a7e0: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  oken */.  int nT
a7f0: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
a800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a810: 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79  e of token in by
a820: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e  tes */.  int iUn
a830: 75 73 65 64 31 2c 20 20 20 20 20 20 20 20 20 20  used1,          
a840: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
a850: 74 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65  t offset of toke
a860: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73  n */.  int iUnus
a870: 65 64 32 20 20 20 20 20 20 20 20 20 20 20 20 20  ed2             
a880: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
a890: 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f  fset of token */
a8a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
a8b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
a8c0: 74 20 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20  t int SZALLOC = 
a8d0: 38 3b 0a 20 20 54 6f 6b 65 6e 43 74 78 20 2a 70  8;.  TokenCtx *p
a8e0: 43 74 78 20 3d 20 28 54 6f 6b 65 6e 43 74 78 2a  Ctx = (TokenCtx*
a8f0: 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 46 74 73  )pContext;.  Fts
a900: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
a910: 72 61 73 65 20 3d 20 70 43 74 78 2d 3e 70 50 68  rase = pCtx->pPh
a920: 72 61 73 65 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  rase;..  UNUSED_
a930: 50 41 52 41 4d 32 28 69 55 6e 75 73 65 64 31 2c  PARAM2(iUnused1,
a940: 20 69 55 6e 75 73 65 64 32 29 3b 0a 0a 20 20 2f   iUnused2);..  /
a950: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
a960: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
a970: 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
a980: 2d 6f 70 20 2a 2f 0a 20 20 69 66 28 20 70 43 74  -op */.  if( pCt
a990: 78 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc!=SQLITE_OK
a9a0: 20 29 20 72 65 74 75 72 6e 20 70 43 74 78 2d 3e   ) return pCtx->
a9b0: 72 63 3b 0a 20 20 69 66 28 20 6e 54 6f 6b 65 6e  rc;.  if( nToken
a9c0: 3e 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f  >FTS5_MAX_TOKEN_
a9d0: 53 49 5a 45 20 29 20 6e 54 6f 6b 65 6e 20 3d 20  SIZE ) nToken = 
a9e0: 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53  FTS5_MAX_TOKEN_S
a9f0: 49 5a 45 3b 0a 0a 20 20 69 66 28 20 70 50 68 72  IZE;..  if( pPhr
aa00: 61 73 65 20 26 26 20 70 50 68 72 61 73 65 2d 3e  ase && pPhrase->
aa10: 6e 54 65 72 6d 3e 30 20 26 26 20 28 74 66 6c 61  nTerm>0 && (tfla
aa20: 67 73 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e 5f  gs & FTS5_TOKEN_
aa30: 43 4f 4c 4f 43 41 54 45 44 29 20 29 7b 0a 20 20  COLOCATED) ){.  
aa40: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
aa50: 70 53 79 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 42  pSyn;.    int nB
aa60: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
aa70: 35 45 78 70 72 54 65 72 6d 29 20 2b 20 73 69 7a  5ExprTerm) + siz
aa80: 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 20  eof(Fts5Buffer) 
aa90: 2b 20 6e 54 6f 6b 65 6e 2b 31 3b 0a 20 20 20 20  + nToken+1;.    
aaa0: 70 53 79 6e 20 3d 20 28 46 74 73 35 45 78 70 72  pSyn = (Fts5Expr
aab0: 54 65 72 6d 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Term*)sqlite3_ma
aac0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
aad0: 20 69 66 28 20 70 53 79 6e 3d 3d 30 20 29 7b 0a   if( pSyn==0 ){.
aae0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
aaf0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
ab00: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
ab10: 28 70 53 79 6e 2c 20 30 2c 20 6e 42 79 74 65 29  (pSyn, 0, nByte)
ab20: 3b 0a 20 20 20 20 20 20 70 53 79 6e 2d 3e 7a 54  ;.      pSyn->zT
ab30: 65 72 6d 20 3d 20 28 28 63 68 61 72 2a 29 70 53  erm = ((char*)pS
ab40: 79 6e 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  yn) + sizeof(Fts
ab50: 35 45 78 70 72 54 65 72 6d 29 20 2b 20 73 69 7a  5ExprTerm) + siz
ab60: 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 3b  eof(Fts5Buffer);
ab70: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53  .      memcpy(pS
ab80: 79 6e 2d 3e 7a 54 65 72 6d 2c 20 70 54 6f 6b 65  yn->zTerm, pToke
ab90: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
aba0: 20 20 70 53 79 6e 2d 3e 70 53 79 6e 6f 6e 79 6d    pSyn->pSynonym
abb0: 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72   = pPhrase->aTer
abc0: 6d 5b 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  m[pPhrase->nTerm
abd0: 2d 31 5d 2e 70 53 79 6e 6f 6e 79 6d 3b 0a 20 20  -1].pSynonym;.  
abe0: 20 20 20 20 70 50 68 72 61 73 65 2d 3e 61 54 65      pPhrase->aTe
abf0: 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e 54 65 72  rm[pPhrase->nTer
ac00: 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79 6d 20 3d 20  m-1].pSynonym = 
ac10: 70 53 79 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pSyn;.    }.  }e
ac20: 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 45 78 70  lse{.    Fts5Exp
ac30: 72 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  rTerm *pTerm;.  
ac40: 20 20 69 66 28 20 70 50 68 72 61 73 65 3d 3d 30    if( pPhrase==0
ac50: 20 7c 7c 20 28 70 50 68 72 61 73 65 2d 3e 6e 54   || (pPhrase->nT
ac60: 65 72 6d 20 25 20 53 5a 41 4c 4c 4f 43 29 3d 3d  erm % SZALLOC)==
ac70: 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45  0 ){.      Fts5E
ac80: 78 70 72 50 68 72 61 73 65 20 2a 70 4e 65 77 3b  xprPhrase *pNew;
ac90: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  .      int nNew 
aca0: 3d 20 53 5a 41 4c 4c 4f 43 20 2b 20 28 70 50 68  = SZALLOC + (pPh
acb0: 72 61 73 65 20 3f 20 70 50 68 72 61 73 65 2d 3e  rase ? pPhrase->
acc0: 6e 54 65 72 6d 20 3a 20 30 29 3b 0a 0a 20 20 20  nTerm : 0);..   
acd0: 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 45     pNew = (Fts5E
ace0: 78 70 72 50 68 72 61 73 65 2a 29 73 71 6c 69 74  xprPhrase*)sqlit
acf0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 50 68 72 61  e3_realloc(pPhra
ad00: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  se, .          s
ad10: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68  izeof(Fts5ExprPh
ad20: 72 61 73 65 29 20 2b 20 73 69 7a 65 6f 66 28 46  rase) + sizeof(F
ad30: 74 73 35 45 78 70 72 54 65 72 6d 29 20 2a 20 6e  ts5ExprTerm) * n
ad40: 4e 65 77 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  New.      );.   
ad50: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
ad60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
ad70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ad80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ad90: 20 20 69 66 28 20 70 50 68 72 61 73 65 3d 3d 30    if( pPhrase==0
ada0: 20 29 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20   ) memset(pNew, 
adb0: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78  0, sizeof(Fts5Ex
adc0: 70 72 50 68 72 61 73 65 29 29 3b 0a 20 20 20 20  prPhrase));.    
add0: 20 20 20 20 70 43 74 78 2d 3e 70 50 68 72 61 73      pCtx->pPhras
ade0: 65 20 3d 20 70 50 68 72 61 73 65 20 3d 20 70 4e  e = pPhrase = pN
adf0: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ew;.        pNew
ae00: 2d 3e 6e 54 65 72 6d 20 3d 20 6e 4e 65 77 20 2d  ->nTerm = nNew -
ae10: 20 53 5a 41 4c 4c 4f 43 3b 0a 20 20 20 20 20 20   SZALLOC;.      
ae20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
ae30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ae40: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
ae50: 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b  &pPhrase->aTerm[
ae60: 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 2b 2b  pPhrase->nTerm++
ae70: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
ae80: 70 54 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pTerm, 0, sizeof
ae90: 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 29 3b  (Fts5ExprTerm));
aea0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 7a 54  .      pTerm->zT
aeb0: 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 46 74 73  erm = sqlite3Fts
aec0: 35 53 74 72 6e 64 75 70 28 26 72 63 2c 20 70 54  5Strndup(&rc, pT
aed0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
aee0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 74 78     }.  }..  pCtx
aef0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74  ->rc = rc;.  ret
af00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
af10: 2a 20 46 72 65 65 20 74 68 65 20 70 68 72 61 73  * Free the phras
af20: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
af30: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
af40: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
af50: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 50 68  lite3Fts5ParsePh
af60: 72 61 73 65 46 72 65 65 28 46 74 73 35 45 78 70  raseFree(Fts5Exp
af70: 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
af80: 29 7b 0a 20 20 66 74 73 35 45 78 70 72 50 68 72  ){.  fts5ExprPhr
af90: 61 73 65 46 72 65 65 28 70 50 68 72 61 73 65 29  aseFree(pPhrase)
afa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
afb0: 74 68 65 20 70 68 72 61 73 65 20 6f 62 6a 65 63  the phrase objec
afc0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
afd0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
afe0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
aff0: 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74  Fts5ParseNearset
b000: 46 72 65 65 28 46 74 73 35 45 78 70 72 4e 65 61  Free(Fts5ExprNea
b010: 72 73 65 74 20 2a 70 4e 65 61 72 29 7b 0a 20 20  rset *pNear){.  
b020: 69 66 28 20 70 4e 65 61 72 20 29 7b 0a 20 20 20  if( pNear ){.   
b030: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
b040: 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
b050: 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  hrase; i++){.   
b060: 20 20 20 66 74 73 35 45 78 70 72 50 68 72 61 73     fts5ExprPhras
b070: 65 46 72 65 65 28 70 4e 65 61 72 2d 3e 61 70 50  eFree(pNear->apP
b080: 68 72 61 73 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  hrase[i]);.    }
b090: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b0a0: 65 28 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  e(pNear->pColset
b0b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
b0c0: 72 65 65 28 70 4e 65 61 72 29 3b 0a 20 20 7d 0a  ree(pNear);.  }.
b0d0: 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  }..void sqlite3F
b0e0: 74 73 35 50 61 72 73 65 46 69 6e 69 73 68 65 64  ts5ParseFinished
b0f0: 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72  (Fts5Parse *pPar
b100: 73 65 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65  se, Fts5ExprNode
b110: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
b120: 70 50 61 72 73 65 2d 3e 70 45 78 70 72 3d 3d 30  pParse->pExpr==0
b130: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 45   );.  pParse->pE
b140: 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  xpr = p;.}../*.*
b150: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b160: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
b170: 20 70 61 72 73 65 72 20 74 6f 20 70 72 6f 63 65   parser to proce
b180: 73 73 20 61 20 73 74 72 69 6e 67 20 74 6f 6b 65  ss a string toke
b190: 6e 2e 20 54 68 65 0a 2a 2a 20 73 74 72 69 6e 67  n. The.** string
b1a0: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
b1b0: 62 65 20 71 75 6f 74 65 64 2e 20 49 6e 20 61 6e  be quoted. In an
b1c0: 79 20 63 61 73 65 20 69 74 20 69 73 20 74 6f 6b  y case it is tok
b1d0: 65 6e 69 7a 65 64 20 61 6e 64 20 61 0a 2a 2a 20  enized and a.** 
b1e0: 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 63 6f  phrase object co
b1f0: 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20  nsisting of all 
b200: 74 6f 6b 65 6e 73 20 72 65 74 75 72 6e 65 64 2e  tokens returned.
b210: 0a 2a 2f 0a 46 74 73 35 45 78 70 72 50 68 72 61  .*/.Fts5ExprPhra
b220: 73 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  se *sqlite3Fts5P
b230: 61 72 73 65 54 65 72 6d 28 0a 20 20 46 74 73 35  arseTerm(.  Fts5
b240: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b260: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
b270: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
b280: 20 2a 70 41 70 70 65 6e 64 2c 20 20 20 20 20 20   *pAppend,      
b290: 20 20 2f 2a 20 50 68 72 61 73 65 20 74 6f 20 61    /* Phrase to a
b2a0: 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 46 74  ppend to */.  Ft
b2b0: 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  s5Token *pToken,
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b2d0: 20 53 74 72 69 6e 67 20 74 6f 20 74 6f 6b 65 6e   String to token
b2e0: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 62 50 72  ize */.  int bPr
b2f0: 65 66 69 78 20 20 20 20 20 20 20 20 20 20 20 20  efix            
b300: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
b310: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 74   if there is a t
b320: 72 61 69 6c 69 6e 67 20 22 2a 22 20 2a 2f 0a 29  railing "*" */.)
b330: 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
b340: 70 43 6f 6e 66 69 67 20 3d 20 70 50 61 72 73 65  pConfig = pParse
b350: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 54 6f 6b  ->pConfig;.  Tok
b360: 65 6e 43 74 78 20 73 43 74 78 3b 20 20 20 20 20  enCtx sCtx;     
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b380: 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 70  Context object p
b390: 61 73 73 65 64 20 74 6f 20 63 61 6c 6c 62 61 63  assed to callbac
b3a0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  k */.  int rc;  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 69         /* Tokeni
b3d0: 7a 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ze return code *
b3e0: 2f 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  /.  char *z = 0;
b3f0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78  ..  memset(&sCtx
b400: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 54 6f 6b 65  , 0, sizeof(Toke
b410: 6e 43 74 78 29 29 3b 0a 20 20 73 43 74 78 2e 70  nCtx));.  sCtx.p
b420: 50 68 72 61 73 65 20 3d 20 70 41 70 70 65 6e 64  Phrase = pAppend
b430: 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 50 61  ;..  rc = fts5Pa
b440: 72 73 65 53 74 72 69 6e 67 46 72 6f 6d 54 6f 6b  rseStringFromTok
b450: 65 6e 28 70 54 6f 6b 65 6e 2c 20 26 7a 29 3b 0a  en(pToken, &z);.
b460: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b470: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  _OK ){.    int f
b480: 6c 61 67 73 20 3d 20 46 54 53 35 5f 54 4f 4b 45  lags = FTS5_TOKE
b490: 4e 49 5a 45 5f 51 55 45 52 59 20 7c 20 28 62 50  NIZE_QUERY | (bP
b4a0: 72 65 66 69 78 20 3f 20 46 54 53 35 5f 54 4f 4b  refix ? FTS5_TOK
b4b0: 45 4e 49 5a 45 5f 51 55 45 52 59 20 3a 20 30 29  ENIZE_QUERY : 0)
b4c0: 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
b4d0: 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71 75   sqlite3Fts5Dequ
b4e0: 6f 74 65 28 7a 29 3b 0a 20 20 20 20 6e 20 3d 20  ote(z);.    n = 
b4f0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a  (int)strlen(z);.
b500: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b510: 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f  Fts5Tokenize(pCo
b520: 6e 66 69 67 2c 20 66 6c 61 67 73 2c 20 7a 2c 20  nfig, flags, z, 
b530: 6e 2c 20 26 73 43 74 78 2c 20 66 74 73 35 50 61  n, &sCtx, fts5Pa
b540: 72 73 65 54 6f 6b 65 6e 69 7a 65 29 3b 0a 20 20  rseTokenize);.  
b550: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
b560: 28 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c  (z);.  if( rc ||
b570: 20 28 72 63 20 3d 20 73 43 74 78 2e 72 63 29 20   (rc = sCtx.rc) 
b580: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  ){.    pParse->r
b590: 63 20 3d 20 72 63 3b 0a 20 20 20 20 66 74 73 35  c = rc;.    fts5
b5a0: 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28 73  ExprPhraseFree(s
b5b0: 43 74 78 2e 70 50 68 72 61 73 65 29 3b 0a 20 20  Ctx.pPhrase);.  
b5c0: 20 20 73 43 74 78 2e 70 50 68 72 61 73 65 20 3d    sCtx.pPhrase =
b5d0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20   0;.  }else{..  
b5e0: 20 20 69 66 28 20 70 41 70 70 65 6e 64 3d 3d 30    if( pAppend==0
b5f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
b600: 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 20 25  Parse->nPhrase %
b610: 20 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   8)==0 ){.      
b620: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
b630: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72  zeof(Fts5ExprPhr
b640: 61 73 65 2a 29 20 2a 20 28 70 50 61 72 73 65 2d  ase*) * (pParse-
b650: 3e 6e 50 68 72 61 73 65 20 2b 20 38 29 3b 0a 20  >nPhrase + 8);. 
b660: 20 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50         Fts5ExprP
b670: 68 72 61 73 65 20 2a 2a 61 70 4e 65 77 3b 0a 20  hrase **apNew;. 
b680: 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 28         apNew = (
b690: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 2a  Fts5ExprPhrase**
b6a0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
b6b0: 28 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73  (pParse->apPhras
b6c0: 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  e, nByte);.     
b6d0: 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20     if( apNew==0 
b6e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
b6f0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
b700: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
b710: 20 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65    fts5ExprPhrase
b720: 46 72 65 65 28 73 43 74 78 2e 70 50 68 72 61 73  Free(sCtx.pPhras
b730: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
b740: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
b750: 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  }.        pParse
b760: 2d 3e 61 70 50 68 72 61 73 65 20 3d 20 61 70 4e  ->apPhrase = apN
b770: 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
b780: 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73    pParse->nPhras
b790: 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e++;.    }..    
b7a0: 69 66 28 20 73 43 74 78 2e 70 50 68 72 61 73 65  if( sCtx.pPhrase
b7b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
b7c0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
b7d0: 6e 20 70 61 72 73 69 6e 67 20 61 20 74 6f 6b 65  n parsing a toke
b7e0: 6e 20 6f 72 20 71 75 6f 74 65 64 20 70 68 72 61  n or quoted phra
b7f0: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
b800: 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 74 6f 6b  .      ** no tok
b810: 65 6e 20 63 68 61 72 61 63 74 65 72 73 20 61 74  en characters at
b820: 20 61 6c 6c 2e 20 28 65 2e 67 20 2e 2e 2e 20 4d   all. (e.g ... M
b830: 41 54 43 48 20 27 22 22 27 29 2e 20 2a 2f 0a 20  ATCH '""'). */. 
b840: 20 20 20 20 20 73 43 74 78 2e 70 50 68 72 61 73       sCtx.pPhras
b850: 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d  e = sqlite3Fts5M
b860: 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 50 61 72 73  allocZero(&pPars
b870: 65 2d 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74  e->rc, sizeof(Ft
b880: 73 35 45 78 70 72 50 68 72 61 73 65 29 29 3b 0a  s5ExprPhrase));.
b890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 43      }else if( sC
b8a0: 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e 54 65 72  tx.pPhrase->nTer
b8b0: 6d 20 29 7b 0a 20 20 20 20 20 20 73 43 74 78 2e  m ){.      sCtx.
b8c0: 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 73  pPhrase->aTerm[s
b8d0: 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e 54 65  Ctx.pPhrase->nTe
b8e0: 72 6d 2d 31 5d 2e 62 50 72 65 66 69 78 20 3d 20  rm-1].bPrefix = 
b8f0: 62 50 72 65 66 69 78 3b 0a 20 20 20 20 7d 0a 20  bPrefix;.    }. 
b900: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 50 68 72     pParse->apPhr
b910: 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72  ase[pParse->nPhr
b920: 61 73 65 2d 31 5d 20 3d 20 73 43 74 78 2e 70 50  ase-1] = sCtx.pP
b930: 68 72 61 73 65 3b 0a 20 20 7d 0a 0a 20 20 72 65  hrase;.  }..  re
b940: 74 75 72 6e 20 73 43 74 78 2e 70 50 68 72 61 73  turn sCtx.pPhras
b950: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  e;.}../*.** Crea
b960: 74 65 20 61 20 6e 65 77 20 46 54 53 35 20 65 78  te a new FTS5 ex
b970: 70 72 65 73 73 69 6f 6e 20 62 79 20 63 6c 6f 6e  pression by clon
b980: 69 6e 67 20 70 68 72 61 73 65 20 69 50 68 72 61  ing phrase iPhra
b990: 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  se of the.** exp
b9a0: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
b9b0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
b9c0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
b9d0: 6c 69 74 65 33 46 74 73 35 45 78 70 72 43 6c 6f  lite3Fts5ExprClo
b9e0: 6e 65 50 68 72 61 73 65 28 0a 20 20 46 74 73 35  nePhrase(.  Fts5
b9f0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20  Expr *pExpr, .  
ba00: 69 6e 74 20 69 50 68 72 61 73 65 2c 20 0a 20 20  int iPhrase, .  
ba10: 46 74 73 35 45 78 70 72 20 2a 2a 70 70 4e 65 77  Fts5Expr **ppNew
ba20: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
ba30: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
ba40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ba50: 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 45 78  code */.  Fts5Ex
ba60: 70 72 50 68 72 61 73 65 20 2a 70 4f 72 69 67 3b  prPhrase *pOrig;
ba70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ba80: 20 70 68 72 61 73 65 20 65 78 74 72 61 63 74 65   phrase extracte
ba90: 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
baa0: 20 20 46 74 73 35 45 78 70 72 20 2a 70 4e 65 77    Fts5Expr *pNew
bab0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
bac0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
bad0: 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
bae0: 70 4e 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 43  pNew */.  TokenC
baf0: 74 78 20 73 43 74 78 20 3d 20 7b 30 2c 30 7d 3b  tx sCtx = {0,0};
bb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
bb10: 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20  text object for 
bb20: 66 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a  fts5ParseTokeniz
bb30: 65 20 2a 2f 0a 0a 20 20 70 4f 72 69 67 20 3d 20  e */..  pOrig = 
bb40: 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72  pExpr->apExprPhr
bb50: 61 73 65 5b 69 50 68 72 61 73 65 5d 3b 0a 20 20  ase[iPhrase];.  
bb60: 70 4e 65 77 20 3d 20 28 46 74 73 35 45 78 70 72  pNew = (Fts5Expr
bb70: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
bb80: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a  locZero(&rc, siz
bb90: 65 6f 66 28 46 74 73 35 45 78 70 72 29 29 3b 0a  eof(Fts5Expr));.
bba0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bbb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  _OK ){.    pNew-
bbc0: 3e 61 70 45 78 70 72 50 68 72 61 73 65 20 3d 20  >apExprPhrase = 
bbd0: 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a  (Fts5ExprPhrase*
bbe0: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
bbf0: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20  locZero(&rc, .  
bc00: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
bc10: 35 45 78 70 72 50 68 72 61 73 65 2a 29 29 3b 0a  5ExprPhrase*));.
bc20: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
bc30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
bc40: 4e 65 77 2d 3e 70 52 6f 6f 74 20 3d 20 28 46 74  New->pRoot = (Ft
bc50: 73 35 45 78 70 72 4e 6f 64 65 2a 29 73 71 6c 69  s5ExprNode*)sqli
bc60: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
bc70: 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20  o(&rc, .        
bc80: 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e  sizeof(Fts5ExprN
bc90: 6f 64 65 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ode));.  }.  if(
bca0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
bcb0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f  {.    pNew->pRoo
bcc0: 74 2d 3e 70 4e 65 61 72 20 3d 20 28 46 74 73 35  t->pNear = (Fts5
bcd0: 45 78 70 72 4e 65 61 72 73 65 74 2a 29 73 71 6c  ExprNearset*)sql
bce0: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
bcf0: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
bd00: 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
bd10: 4e 65 61 72 73 65 74 29 20 2b 20 73 69 7a 65 6f  Nearset) + sizeo
bd20: 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65  f(Fts5ExprPhrase
bd30: 2a 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  *));.  }.  if( r
bd40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bd50: 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a      Fts5Colset *
bd60: 70 43 6f 6c 73 65 74 4f 72 69 67 20 3d 20 70 4f  pColsetOrig = pO
bd70: 72 69 67 2d 3e 70 4e 6f 64 65 2d 3e 70 4e 65 61  rig->pNode->pNea
bd80: 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20  r->pColset;.    
bd90: 69 66 28 20 70 43 6f 6c 73 65 74 4f 72 69 67 20  if( pColsetOrig 
bda0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
bdb0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
bdc0: 43 6f 6c 73 65 74 29 20 2b 20 28 70 43 6f 6c 73  Colset) + (pCols
bdd0: 65 74 4f 72 69 67 2d 3e 6e 43 6f 6c 2d 31 29 20  etOrig->nCol-1) 
bde0: 2a 20 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20  * sizeof(int);. 
bdf0: 20 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20       Fts5Colset 
be00: 2a 70 43 6f 6c 73 65 74 20 3d 20 28 46 74 73 35  *pColset = (Fts5
be10: 43 6f 6c 73 65 74 2a 29 73 71 6c 69 74 65 33 46  Colset*)sqlite3F
be20: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
be30: 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  c, nByte);.     
be40: 20 69 66 28 20 70 43 6f 6c 73 65 74 20 29 7b 20   if( pColset ){ 
be50: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
be60: 70 43 6f 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74  pColset, pColset
be70: 4f 72 69 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Orig, nByte);.  
be80: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
be90: 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 2d 3e  ->pRoot->pNear->
bea0: 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
beb0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
bec0: 69 66 28 20 70 4f 72 69 67 2d 3e 6e 54 65 72 6d  if( pOrig->nTerm
bed0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
bf00: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
bf10: 67 68 20 70 68 72 61 73 65 20 74 65 72 6d 73 20  gh phrase terms 
bf20: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
bf30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
bf40: 20 69 3c 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 3b   i<pOrig->nTerm;
bf50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
bf60: 20 74 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20   tflags = 0;.   
bf70: 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
bf80: 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
bf90: 26 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 69 5d  &pOrig->aTerm[i]
bfa0: 3b 20 70 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ; p && rc==SQLIT
bfb0: 45 5f 4f 4b 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f  E_OK; p=p->pSyno
bfc0: 6e 79 6d 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  nym){.        co
bfd0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
bfe0: 3d 20 70 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20  = p->zTerm;.    
bff0: 20 20 20 20 72 63 20 3d 20 66 74 73 35 50 61 72      rc = fts5Par
c000: 73 65 54 6f 6b 65 6e 69 7a 65 28 28 76 6f 69 64  seTokenize((void
c010: 2a 29 26 73 43 74 78 2c 20 74 66 6c 61 67 73 2c  *)&sCtx, tflags,
c020: 20 7a 54 65 72 6d 2c 20 28 69 6e 74 29 73 74 72   zTerm, (int)str
c030: 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20 20  len(zTerm),.    
c040: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
c050: 20 20 20 20 20 20 20 74 66 6c 61 67 73 20 3d 20         tflags = 
c060: 46 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43  FTS5_TOKEN_COLOC
c070: 41 54 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ATED;.      }.  
c080: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c090: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c0a0: 20 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 61   sCtx.pPhrase->a
c0b0: 54 65 72 6d 5b 69 5d 2e 62 50 72 65 66 69 78 20  Term[i].bPrefix 
c0c0: 3d 20 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 69  = pOrig->aTerm[i
c0d0: 5d 2e 62 50 72 65 66 69 78 3b 0a 20 20 20 20 20  ].bPrefix;.     
c0e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
c0f0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
c100: 70 70 65 6e 73 20 77 68 65 6e 20 70 61 72 73 69  ppens when parsi
c110: 6e 67 20 61 20 74 6f 6b 65 6e 20 6f 72 20 71 75  ng a token or qu
c120: 6f 74 65 64 20 70 68 72 61 73 65 20 74 68 61 74  oted phrase that
c130: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a   contains.    **
c140: 20 6e 6f 20 74 6f 6b 65 6e 20 63 68 61 72 61 63   no token charac
c150: 74 65 72 73 20 61 74 20 61 6c 6c 2e 20 28 65 2e  ters at all. (e.
c160: 67 20 2e 2e 2e 20 4d 41 54 43 48 20 27 22 22 27  g ... MATCH '""'
c170: 29 2e 20 2a 2f 0a 20 20 20 20 73 43 74 78 2e 70  ). */.    sCtx.p
c180: 50 68 72 61 73 65 20 3d 20 73 71 6c 69 74 65 33  Phrase = sqlite3
c190: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
c1a0: 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45  rc, sizeof(Fts5E
c1b0: 78 70 72 50 68 72 61 73 65 29 29 3b 0a 20 20 7d  xprPhrase));.  }
c1c0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
c1d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
c1e0: 41 6c 6c 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  All the allocati
c1f0: 6f 6e 73 20 73 75 63 63 65 65 64 65 64 2e 20 50  ons succeeded. P
c200: 75 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ut the expressio
c210: 6e 20 6f 62 6a 65 63 74 20 74 6f 67 65 74 68 65  n object togethe
c220: 72 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  r. */.    pNew->
c230: 70 49 6e 64 65 78 20 3d 20 70 45 78 70 72 2d 3e  pIndex = pExpr->
c240: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 4e 65 77  pIndex;.    pNew
c250: 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 45 78 70  ->pConfig = pExp
c260: 72 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  r->pConfig;.    
c270: 70 4e 65 77 2d 3e 6e 50 68 72 61 73 65 20 3d 20  pNew->nPhrase = 
c280: 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 70 45  1;.    pNew->apE
c290: 78 70 72 50 68 72 61 73 65 5b 30 5d 20 3d 20 73  xprPhrase[0] = s
c2a0: 43 74 78 2e 70 50 68 72 61 73 65 3b 0a 20 20 20  Ctx.pPhrase;.   
c2b0: 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e   pNew->pRoot->pN
c2c0: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
c2d0: 20 3d 20 73 43 74 78 2e 70 50 68 72 61 73 65 3b   = sCtx.pPhrase;
c2e0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74  .    pNew->pRoot
c2f0: 2d 3e 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  ->pNear->nPhrase
c300: 20 3d 20 31 3b 0a 20 20 20 20 73 43 74 78 2e 70   = 1;.    sCtx.p
c310: 50 68 72 61 73 65 2d 3e 70 4e 6f 64 65 20 3d 20  Phrase->pNode = 
c320: 70 4e 65 77 2d 3e 70 52 6f 6f 74 3b 0a 0a 20 20  pNew->pRoot;..  
c330: 20 20 69 66 28 20 70 4f 72 69 67 2d 3e 6e 54 65    if( pOrig->nTe
c340: 72 6d 3d 3d 31 20 26 26 20 70 4f 72 69 67 2d 3e  rm==1 && pOrig->
c350: 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79  aTerm[0].pSynony
c360: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  m==0 ){.      pN
c370: 65 77 2d 3e 70 52 6f 6f 74 2d 3e 65 54 79 70 65  ew->pRoot->eType
c380: 20 3d 20 46 54 53 35 5f 54 45 52 4d 3b 0a 20 20   = FTS5_TERM;.  
c390: 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d      pNew->pRoot-
c3a0: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70  >xNext = fts5Exp
c3b0: 72 4e 6f 64 65 4e 65 78 74 5f 54 45 52 4d 3b 0a  rNodeNext_TERM;.
c3c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c3d0: 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 65 54   pNew->pRoot->eT
c3e0: 79 70 65 20 3d 20 46 54 53 35 5f 53 54 52 49 4e  ype = FTS5_STRIN
c3f0: 47 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  G;.      pNew->p
c400: 52 6f 6f 74 2d 3e 78 4e 65 78 74 20 3d 20 66 74  Root->xNext = ft
c410: 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 53  s5ExprNodeNext_S
c420: 54 52 49 4e 47 3b 0a 20 20 20 20 7d 0a 20 20 7d  TRING;.    }.  }
c430: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
c440: 33 46 74 73 35 45 78 70 72 46 72 65 65 28 70 4e  3Fts5ExprFree(pN
c450: 65 77 29 3b 0a 20 20 20 20 66 74 73 35 45 78 70  ew);.    fts5Exp
c460: 72 50 68 72 61 73 65 46 72 65 65 28 73 43 74 78  rPhraseFree(sCtx
c470: 2e 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20 70  .pPhrase);.    p
c480: 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  New = 0;.  }..  
c490: 2a 70 70 4e 65 77 20 3d 20 70 4e 65 77 3b 0a 20  *ppNew = pNew;. 
c4a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
c4b0: 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 20 70 54 6f 6b  /*.** Token pTok
c4c0: 20 68 61 73 20 61 70 70 65 61 72 65 64 20 69 6e   has appeared in
c4d0: 20 61 20 4d 41 54 43 48 20 65 78 70 72 65 73 73   a MATCH express
c4e0: 69 6f 6e 20 77 68 65 72 65 20 74 68 65 20 4e 45  ion where the NE
c4f0: 41 52 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  AR operator.** i
c500: 73 20 65 78 70 65 63 74 65 64 2e 20 49 66 20 74  s expected. If t
c510: 6f 6b 65 6e 20 70 54 6f 6b 20 64 6f 65 73 20 6e  oken pTok does n
c520: 6f 74 20 63 6f 6e 74 61 69 6e 20 22 4e 45 41 52  ot contain "NEAR
c530: 22 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f  ", store an erro
c540: 72 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  r.** in the pPar
c550: 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  se object..*/.vo
c560: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
c570: 72 73 65 4e 65 61 72 28 46 74 73 35 50 61 72 73  rseNear(Fts5Pars
c580: 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 54  e *pParse, Fts5T
c590: 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 69  oken *pTok){.  i
c5a0: 66 28 20 70 54 6f 6b 2d 3e 6e 21 3d 34 20 7c 7c  f( pTok->n!=4 ||
c5b0: 20 6d 65 6d 63 6d 70 28 22 4e 45 41 52 22 2c 20   memcmp("NEAR", 
c5c0: 70 54 6f 6b 2d 3e 70 2c 20 34 29 20 29 7b 0a 20  pTok->p, 4) ){. 
c5d0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
c5e0: 72 73 65 45 72 72 6f 72 28 0a 20 20 20 20 20 20  rseError(.      
c5f0: 20 20 70 50 61 72 73 65 2c 20 22 66 74 73 35 3a    pParse, "fts5:
c600: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6e 65   syntax error ne
c610: 61 72 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 70 54  ar \"%.*s\"", pT
c620: 6f 6b 2d 3e 6e 2c 20 70 54 6f 6b 2d 3e 70 0a 20  ok->n, pTok->p. 
c630: 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69     );.  }.}..voi
c640: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
c650: 73 65 53 65 74 44 69 73 74 61 6e 63 65 28 0a 20  seSetDistance(. 
c660: 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
c670: 73 65 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e  se, .  Fts5ExprN
c680: 65 61 72 73 65 74 20 2a 70 4e 65 61 72 2c 0a 20  earset *pNear,. 
c690: 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 0a 29 7b   Fts5Token *p.){
c6a0: 0a 20 20 69 66 28 20 70 4e 65 61 72 20 29 7b 0a  .  if( pNear ){.
c6b0: 20 20 20 20 69 6e 74 20 6e 4e 65 61 72 20 3d 20      int nNear = 
c6c0: 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  0;.    int i;.  
c6d0: 20 20 69 66 28 20 70 2d 3e 6e 20 29 7b 0a 20 20    if( p->n ){.  
c6e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c6f0: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
c700: 20 20 20 63 68 61 72 20 63 20 3d 20 28 63 68 61     char c = (cha
c710: 72 29 70 2d 3e 70 5b 69 5d 3b 0a 20 20 20 20 20  r)p->p[i];.     
c720: 20 20 20 69 66 28 20 63 3c 27 30 27 20 7c 7c 20     if( c<'0' || 
c730: 63 3e 27 39 27 20 29 7b 0a 20 20 20 20 20 20 20  c>'9' ){.       
c740: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
c750: 72 73 65 45 72 72 6f 72 28 0a 20 20 20 20 20 20  rseError(.      
c760: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
c770: 22 65 78 70 65 63 74 65 64 20 69 6e 74 65 67 65  "expected intege
c780: 72 2c 20 67 6f 74 20 5c 22 25 2e 2a 73 5c 22 22  r, got \"%.*s\""
c790: 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 70 0a 20 20 20  , p->n, p->p.   
c7a0: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
c7b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
c7c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c7d0: 20 20 6e 4e 65 61 72 20 3d 20 6e 4e 65 61 72 20    nNear = nNear 
c7e0: 2a 20 31 30 20 2b 20 28 70 2d 3e 70 5b 69 5d 20  * 10 + (p->p[i] 
c7f0: 2d 20 27 30 27 29 3b 0a 20 20 20 20 20 20 7d 0a  - '0');.      }.
c800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c810: 20 6e 4e 65 61 72 20 3d 20 46 54 53 35 5f 44 45   nNear = FTS5_DE
c820: 46 41 55 4c 54 5f 4e 45 41 52 44 49 53 54 3b 0a  FAULT_NEARDIST;.
c830: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 61 72 2d      }.    pNear-
c840: 3e 6e 4e 65 61 72 20 3d 20 6e 4e 65 61 72 3b 0a  >nNear = nNear;.
c850: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
c860: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
c870: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
c880: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
c890: 4e 55 4c 4c 2c 20 6f 72 20 69 74 20 6d 61 79 20  NULL, or it may 
c8a0: 62 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  be.** an existin
c8b0: 67 20 46 74 73 35 43 6f 6c 73 65 74 20 6f 62 6a  g Fts5Colset obj
c8c0: 65 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ect. This functi
c8d0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
c8e0: 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 6e 65 77  nter to.** a new
c8f0: 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 63   colset object c
c900: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
c910: 6e 74 65 6e 74 73 20 6f 66 20 28 70 29 20 77 69  ntents of (p) wi
c920: 74 68 20 6e 65 77 20 76 61 6c 75 65 20 63 6f 6c  th new value col
c930: 75 6d 6e 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 43  umn.** number iC
c940: 6f 6c 20 61 70 70 65 6e 64 65 64 2e 20 0a 2a 2a  ol appended. .**
c950: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
c960: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 74 6f 72  ror occurs, stor
c970: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
c980: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
c990: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 54 68  turn NULL..** Th
c9a0: 65 20 6f 6c 64 20 63 6f 6c 73 65 74 20 6f 62 6a  e old colset obj
c9b0: 65 63 74 20 28 69 66 20 61 6e 79 29 20 69 73 20  ect (if any) is 
c9c0: 6e 6f 74 20 66 72 65 65 64 20 69 6e 20 74 68 69  not freed in thi
c9d0: 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
c9e0: 63 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 66 74  c Fts5Colset *ft
c9f0: 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28 0a 20  s5ParseColset(. 
ca00: 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
ca10: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
ca20: 20 2f 2a 20 53 74 6f 72 65 20 53 51 4c 49 54 45   /* Store SQLITE
ca30: 5f 4e 4f 4d 45 4d 20 68 65 72 65 20 69 66 20 72  _NOMEM here if r
ca40: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 46 74 73  equired */.  Fts
ca50: 35 43 6f 6c 73 65 74 20 2a 70 2c 20 20 20 20 20  5Colset *p,     
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ca70: 45 78 69 73 74 69 6e 67 20 63 6f 6c 73 65 74 20  Existing colset 
ca80: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
ca90: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cab0: 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 61 64 64  ew column to add
cac0: 20 74 6f 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63   to colset objec
cad0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  t */.){.  int nC
cae0: 6f 6c 20 3d 20 70 20 3f 20 70 2d 3e 6e 43 6f 6c  ol = p ? p->nCol
caf0: 20 3a 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   : 0;     /* Num
cb00: 2e 20 63 6f 6c 75 6d 6e 73 20 61 6c 72 65 61 64  . columns alread
cb10: 79 20 69 6e 20 63 6f 6c 73 65 74 20 6f 62 6a 65  y in colset obje
cb20: 63 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  ct */.  Fts5Cols
cb30: 65 74 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  et *pNew;       
cb40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
cb50: 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 74 6f 20  olset object to 
cb60: 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 61 73 73  return */..  ass
cb70: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 3d  ert( pParse->rc=
cb80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
cb90: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
cba0: 26 26 20 69 43 6f 6c 3c 70 50 61 72 73 65 2d 3e  && iCol<pParse->
cbb0: 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20 29 3b  pConfig->nCol );
cbc0: 0a 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ..  pNew = sqlit
cbd0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 73 69  e3_realloc(p, si
cbe0: 7a 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74 29  zeof(Fts5Colset)
cbf0: 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e   + sizeof(int)*n
cc00: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  Col);.  if( pNew
cc10: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
cc20: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
cc30: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
cc40: 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20     int *aiCol = 
cc50: 70 4e 65 77 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20  pNew->aiCol;.   
cc60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66   int i, j;.    f
cc70: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
cc80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
cc90: 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29  aiCol[i]==iCol )
cca0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
ccb0: 20 20 20 20 69 66 28 20 61 69 43 6f 6c 5b 69 5d      if( aiCol[i]
ccc0: 3e 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20  >iCol ) break;. 
ccd0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 6e     }.    for(j=n
cce0: 43 6f 6c 3b 20 6a 3e 69 3b 20 6a 2d 2d 29 7b 0a  Col; j>i; j--){.
ccf0: 20 20 20 20 20 20 61 69 43 6f 6c 5b 6a 5d 20 3d        aiCol[j] =
cd00: 20 61 69 43 6f 6c 5b 6a 2d 31 5d 3b 0a 20 20 20   aiCol[j-1];.   
cd10: 20 7d 0a 20 20 20 20 61 69 43 6f 6c 5b 69 5d 20   }.    aiCol[i] 
cd20: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 4e 65 77  = iCol;.    pNew
cd30: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 2b 31 3b  ->nCol = nCol+1;
cd40: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
cd50: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
cd60: 61 74 20 74 68 65 20 61 72 72 61 79 20 69 73 20  at the array is 
cd70: 69 6e 20 6f 72 64 65 72 20 61 6e 64 20 63 6f 6e  in order and con
cd80: 74 61 69 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61  tains no duplica
cd90: 74 65 20 65 6e 74 72 69 65 73 2e 20 2a 2f 0a 20  te entries. */. 
cda0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 4e     for(i=1; i<pN
cdb0: 65 77 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 61  ew->nCol; i++) a
cdc0: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 61 69 43  ssert( pNew->aiC
cdd0: 6f 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 61 69 43 6f  ol[i]>pNew->aiCo
cde0: 6c 5b 69 2d 31 5d 20 29 3b 0a 23 65 6e 64 69 66  l[i-1] );.#endif
cdf0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
ce00: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
ce10: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
ce20: 6e 20 61 6e 20 46 74 73 35 43 6f 6c 73 65 74 20  n an Fts5Colset 
ce30: 6f 62 6a 65 63 74 20 73 70 65 63 69 66 79 69 6e  object specifyin
ce40: 67 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  g the inverse of
ce50: 0a 2a 2a 20 74 68 65 20 63 6f 6c 73 65 74 20 70  .** the colset p
ce60: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
ce70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 46 72  ond argument. Fr
ce80: 65 65 20 74 68 65 20 63 6f 6c 73 65 74 20 70 61  ee the colset pa
ce90: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ssed.** as the s
cea0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 62  econd argument b
ceb0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
cec0: 0a 2a 2f 0a 46 74 73 35 43 6f 6c 73 65 74 20 2a  .*/.Fts5Colset *
ced0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
cee0: 43 6f 6c 73 65 74 49 6e 76 65 72 74 28 46 74 73  ColsetInvert(Fts
cef0: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
cf00: 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 29 7b 0a  Fts5Colset *p){.
cf10: 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 52    Fts5Colset *pR
cf20: 65 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  et;.  int nCol =
cf30: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67   pParse->pConfig
cf40: 2d 3e 6e 43 6f 6c 3b 0a 0a 20 20 70 52 65 74 20  ->nCol;..  pRet 
cf50: 3d 20 28 46 74 73 35 43 6f 6c 73 65 74 2a 29 73  = (Fts5Colset*)s
cf60: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
cf70: 5a 65 72 6f 28 26 70 50 61 72 73 65 2d 3e 72 63  Zero(&pParse->rc
cf80: 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  , .      sizeof(
cf90: 46 74 73 35 43 6f 6c 73 65 74 29 20 2b 20 73 69  Fts5Colset) + si
cfa0: 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 0a 20  zeof(int)*nCol. 
cfb0: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29   );.  if( pRet )
cfc0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
cfd0: 20 69 6e 74 20 69 4f 6c 64 20 3d 20 30 3b 0a 20   int iOld = 0;. 
cfe0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
cff0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
d000: 69 66 28 20 69 4f 6c 64 3e 3d 70 2d 3e 6e 43 6f  if( iOld>=p->nCo
d010: 6c 20 7c 7c 20 70 2d 3e 61 69 43 6f 6c 5b 69 4f  l || p->aiCol[iO
d020: 6c 64 5d 21 3d 69 20 29 7b 0a 20 20 20 20 20 20  ld]!=i ){.      
d030: 20 20 70 52 65 74 2d 3e 61 69 43 6f 6c 5b 70 52    pRet->aiCol[pR
d040: 65 74 2d 3e 6e 43 6f 6c 2b 2b 5d 20 3d 20 69 3b  et->nCol++] = i;
d050: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d060: 20 20 20 20 20 20 69 4f 6c 64 2b 2b 3b 0a 20 20        iOld++;.  
d070: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d080: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
d090: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  p);.  return pRe
d0a0: 74 3b 0a 7d 0a 0a 46 74 73 35 43 6f 6c 73 65 74  t;.}..Fts5Colset
d0b0: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72   *sqlite3Fts5Par
d0c0: 73 65 43 6f 6c 73 65 74 28 0a 20 20 46 74 73 35  seColset(.  Fts5
d0d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d0f0: 74 6f 72 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  tore SQLITE_NOME
d100: 4d 20 68 65 72 65 20 69 66 20 72 65 71 75 69 72  M here if requir
d110: 65 64 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  ed */.  Fts5Cols
d120: 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20  et *pColset,    
d130: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74          /* Exist
d140: 69 6e 67 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63  ing colset objec
d150: 74 20 2a 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e  t */.  Fts5Token
d160: 20 2a 70 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6c   *p.){.  Fts5Col
d170: 73 65 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  set *pRet = 0;. 
d180: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 63 68 61   int iCol;.  cha
d190: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d1b0: 44 65 71 75 6f 74 65 64 20 63 6f 70 79 20 6f 66  Dequoted copy of
d1c0: 20 74 6f 6b 65 6e 20 70 20 2a 2f 0a 0a 20 20 7a   token p */..  z
d1d0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
d1e0: 72 6e 64 75 70 28 26 70 50 61 72 73 65 2d 3e 72  rndup(&pParse->r
d1f0: 63 2c 20 70 2d 3e 70 2c 20 70 2d 3e 6e 29 3b 0a  c, p->p, p->n);.
d200: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63    if( pParse->rc
d210: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d220: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
d230: 43 6f 6e 66 69 67 20 3d 20 70 50 61 72 73 65 2d  Config = pParse-
d240: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 73 71  >pConfig;.    sq
d250: 6c 69 74 65 33 46 74 73 35 44 65 71 75 6f 74 65  lite3Fts5Dequote
d260: 28 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f  (z);.    for(iCo
d270: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 43 6f 6e 66 69  l=0; iCol<pConfi
d280: 67 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  g->nCol; iCol++)
d290: 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  {.      if( 0==s
d2a0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
d2b0: 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 43  Config->azCol[iC
d2c0: 6f 6c 5d 2c 20 7a 29 20 29 20 62 72 65 61 6b 3b  ol], z) ) break;
d2d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d2e0: 43 6f 6c 3d 3d 70 43 6f 6e 66 69 67 2d 3e 6e 43  Col==pConfig->nC
d2f0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
d300: 74 65 33 46 74 73 35 50 61 72 73 65 45 72 72 6f  te3Fts5ParseErro
d310: 72 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  r(pParse, "no su
d320: 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 2c 20  ch column: %s", 
d330: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
d340: 20 20 20 20 20 70 52 65 74 20 3d 20 66 74 73 35       pRet = fts5
d350: 50 61 72 73 65 43 6f 6c 73 65 74 28 70 50 61 72  ParseColset(pPar
d360: 73 65 2c 20 70 43 6f 6c 73 65 74 2c 20 69 43 6f  se, pColset, iCo
d370: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
d380: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
d390: 20 7d 0a 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   }..  if( pRet==
d3a0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
d3b0: 20 70 50 61 72 73 65 2d 3e 72 63 21 3d 53 51 4c   pParse->rc!=SQL
d3c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71  ITE_OK );.    sq
d3d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 73  lite3_free(pCols
d3e0: 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  et);.  }..  retu
d3f0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 76 6f 69 64  rn pRet;.}..void
d400: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
d410: 65 53 65 74 43 6f 6c 73 65 74 28 0a 20 20 46 74  eSetColset(.  Ft
d420: 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s5Parse *pParse,
d430: 20 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72   .  Fts5ExprNear
d440: 73 65 74 20 2a 70 4e 65 61 72 2c 20 0a 20 20 46  set *pNear, .  F
d450: 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
d460: 65 74 20 0a 29 7b 0a 20 20 69 66 28 20 70 50 61  et .){.  if( pPa
d470: 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  rse->pConfig->eD
d480: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
d490: 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70  IL_NONE ){.    p
d4a0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
d4b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 50  TE_ERROR;.    pP
d4c0: 61 72 73 65 2d 3e 7a 45 72 72 20 3d 20 73 71 6c  arse->zErr = sql
d4d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
d4e0: 20 20 20 20 22 66 74 73 35 3a 20 63 6f 6c 75 6d      "fts5: colum
d4f0: 6e 20 71 75 65 72 69 65 73 20 61 72 65 20 6e 6f  n queries are no
d500: 74 20 73 75 70 70 6f 72 74 65 64 20 28 64 65 74  t supported (det
d510: 61 69 6c 3d 6e 6f 6e 65 29 22 0a 20 20 20 20 29  ail=none)".    )
d520: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
d530: 65 65 28 70 43 6f 6c 73 65 74 29 3b 0a 20 20 20  ee(pColset);.   
d540: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
d550: 69 66 28 20 70 4e 65 61 72 20 29 7b 0a 20 20 20  if( pNear ){.   
d560: 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20   pNear->pColset 
d570: 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 7d 65 6c  = pColset;.  }el
d580: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
d590: 66 72 65 65 28 70 43 6f 6c 73 65 74 29 3b 0a 20  free(pColset);. 
d5a0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
d5b0: 64 20 66 74 73 35 45 78 70 72 41 73 73 69 67 6e  d fts5ExprAssign
d5c0: 58 4e 65 78 74 28 46 74 73 35 45 78 70 72 4e 6f  XNext(Fts5ExprNo
d5d0: 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 73 77  de *pNode){.  sw
d5e0: 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79  itch( pNode->eTy
d5f0: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 46  pe ){.    case F
d600: 54 53 35 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20  TS5_STRING: {.  
d610: 20 20 20 20 46 74 73 35 45 78 70 72 4e 65 61 72      Fts5ExprNear
d620: 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f  set *pNear = pNo
d630: 64 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 20 20 20  de->pNear;.     
d640: 20 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72   if( pNear->nPhr
d650: 61 73 65 3d 3d 31 20 26 26 20 70 4e 65 61 72 2d  ase==1 && pNear-
d660: 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54  >apPhrase[0]->nT
d670: 65 72 6d 3d 3d 31 20 0a 20 20 20 20 20 20 20 26  erm==1 .       &
d680: 26 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  & pNear->apPhras
d690: 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70  e[0]->aTerm[0].p
d6a0: 53 79 6e 6f 6e 79 6d 3d 3d 30 0a 20 20 20 20 20  Synonym==0.     
d6b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64   ){.        pNod
d6c0: 65 2d 3e 65 54 79 70 65 20 3d 20 46 54 53 35 5f  e->eType = FTS5_
d6d0: 54 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e  TERM;.        pN
d6e0: 6f 64 65 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73  ode->xNext = fts
d6f0: 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45  5ExprNodeNext_TE
d700: 52 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  RM;.      }else{
d710: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  .        pNode->
d720: 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70 72  xNext = fts5Expr
d730: 4e 6f 64 65 4e 65 78 74 5f 53 54 52 49 4e 47 3b  NodeNext_STRING;
d740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d750: 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20  reak;.    };..  
d760: 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20    case FTS5_OR: 
d770: 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78  {.      pNode->x
d780: 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e  Next = fts5ExprN
d790: 6f 64 65 4e 65 78 74 5f 4f 52 3b 0a 20 20 20 20  odeNext_OR;.    
d7a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a    break;.    };.
d7b0: 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41  .    case FTS5_A
d7c0: 4e 44 3a 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64  ND: {.      pNod
d7d0: 65 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45  e->xNext = fts5E
d7e0: 78 70 72 4e 6f 64 65 4e 65 78 74 5f 41 4e 44 3b  xprNodeNext_AND;
d7f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d800: 20 20 7d 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c    };..    defaul
d810: 74 3a 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  t: assert( pNode
d820: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f  ->eType==FTS5_NO
d830: 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 70 4e 6f  T ); {.      pNo
d840: 64 65 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  de->xNext = fts5
d850: 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54  ExprNodeNext_NOT
d860: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d870: 20 20 20 7d 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61     };.  }.}..sta
d880: 74 69 63 20 76 6f 69 64 20 66 74 73 35 45 78 70  tic void fts5Exp
d890: 72 41 64 64 43 68 69 6c 64 72 65 6e 28 46 74 73  rAddChildren(Fts
d8a0: 35 45 78 70 72 4e 6f 64 65 20 2a 70 2c 20 46 74  5ExprNode *p, Ft
d8b0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 53 75 62  s5ExprNode *pSub
d8c0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 54 79 70  ){.  if( p->eTyp
d8d0: 65 21 3d 46 54 53 35 5f 4e 4f 54 20 26 26 20 70  e!=FTS5_NOT && p
d8e0: 53 75 62 2d 3e 65 54 79 70 65 3d 3d 70 2d 3e 65  Sub->eType==p->e
d8f0: 54 79 70 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Type ){.    int 
d900: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
d910: 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 20 2a 20  ts5ExprNode*) * 
d920: 70 53 75 62 2d 3e 6e 43 68 69 6c 64 3b 0a 20 20  pSub->nChild;.  
d930: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 61 70 43    memcpy(&p->apC
d940: 68 69 6c 64 5b 70 2d 3e 6e 43 68 69 6c 64 5d 2c  hild[p->nChild],
d950: 20 70 53 75 62 2d 3e 61 70 43 68 69 6c 64 2c 20   pSub->apChild, 
d960: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 6e  nByte);.    p->n
d970: 43 68 69 6c 64 20 2b 3d 20 70 53 75 62 2d 3e 6e  Child += pSub->n
d980: 43 68 69 6c 64 3b 0a 20 20 20 20 73 71 6c 69 74  Child;.    sqlit
d990: 65 33 5f 66 72 65 65 28 70 53 75 62 29 3b 0a 20  e3_free(pSub);. 
d9a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61   }else{.    p->a
d9b0: 70 43 68 69 6c 64 5b 70 2d 3e 6e 43 68 69 6c 64  pChild[p->nChild
d9c0: 2b 2b 5d 20 3d 20 70 53 75 62 3b 0a 20 20 7d 0a  ++] = pSub;.  }.
d9d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
d9e0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e  e and return a n
d9f0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62  ew expression ob
da00: 6a 65 63 74 2e 20 49 66 20 61 6e 79 74 68 69 6e  ject. If anythin
da10: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 28 69 2e  g goes wrong (i.
da20: 65 2e 0a 2a 2a 20 4f 4f 4d 20 65 72 72 6f 72 29  e..** OOM error)
da30: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
da40: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
da50: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
da60: 0a 2a 2f 0a 46 74 73 35 45 78 70 72 4e 6f 64 65  .*/.Fts5ExprNode
da70: 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72   *sqlite3Fts5Par
da80: 73 65 4e 6f 64 65 28 0a 20 20 46 74 73 35 50 61  seNode(.  Fts5Pa
da90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
daa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
dab0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
dac0: 69 6e 74 20 65 54 79 70 65 2c 20 20 20 20 20 20  int eType,      
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 2f 2a 20 46 54 53 35 5f 53 54 52 49 4e 47 2c 20  /* FTS5_STRING, 
daf0: 41 4e 44 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 2a  AND, OR or NOT *
db00: 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  /.  Fts5ExprNode
db10: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20   *pLeft,        
db20: 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64      /* Left hand
db30: 20 63 68 69 6c 64 20 65 78 70 72 65 73 73 69 6f   child expressio
db40: 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e  n */.  Fts5ExprN
db50: 6f 64 65 20 2a 70 52 69 67 68 74 2c 20 20 20 20  ode *pRight,    
db60: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
db70: 68 61 6e 64 20 63 68 69 6c 64 20 65 78 70 72 65  hand child expre
db80: 73 73 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 45  ssion */.  Fts5E
db90: 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61  xprNearset *pNea
dba0: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  r          /* Fo
dbb0: 72 20 53 54 52 49 4e 47 20 65 78 70 72 65 73 73  r STRING express
dbc0: 69 6f 6e 73 2c 20 74 68 65 20 6e 65 61 72 20 63  ions, the near c
dbd0: 6c 75 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 46  luster */.){.  F
dbe0: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 65  ts5ExprNode *pRe
dbf0: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 50  t = 0;..  if( pP
dc00: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
dc10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
dc20: 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
dc30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
dc40: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 6f  er of children o
dc50: 66 20 72 65 74 75 72 6e 65 64 20 6e 6f 64 65 20  f returned node 
dc60: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
dc70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc80: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
dc90: 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
dca0: 74 65 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  te for this node
dcb0: 20 2a 2f 0a 20 0a 20 20 20 20 61 73 73 65 72 74   */. .    assert
dcc0: 28 20 28 65 54 79 70 65 21 3d 46 54 53 35 5f 53  ( (eType!=FTS5_S
dcd0: 54 52 49 4e 47 20 26 26 20 21 70 4e 65 61 72 29  TRING && !pNear)
dce0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 65 54  .         || (eT
dcf0: 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47  ype==FTS5_STRING
dd00: 20 26 26 20 21 70 4c 65 66 74 20 26 26 20 21 70   && !pLeft && !p
dd10: 52 69 67 68 74 29 0a 20 20 20 20 29 3b 0a 20 20  Right).    );.  
dd20: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 46 54 53    if( eType==FTS
dd30: 35 5f 53 54 52 49 4e 47 20 26 26 20 70 4e 65 61  5_STRING && pNea
dd40: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
dd50: 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d  .    if( eType!=
dd60: 46 54 53 35 5f 53 54 52 49 4e 47 20 26 26 20 70  FTS5_STRING && p
dd70: 4c 65 66 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Left==0 ) return
dd80: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28   pRight;.    if(
dd90: 20 65 54 79 70 65 21 3d 46 54 53 35 5f 53 54 52   eType!=FTS5_STR
dda0: 49 4e 47 20 26 26 20 70 52 69 67 68 74 3d 3d 30  ING && pRight==0
ddb0: 20 29 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b   ) return pLeft;
ddc0: 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
ddd0: 3d 46 54 53 35 5f 4e 4f 54 20 29 7b 0a 20 20 20  =FTS5_NOT ){.   
dde0: 20 20 20 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20     nChild = 2;. 
ddf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79     }else if( eTy
de00: 70 65 3d 3d 46 54 53 35 5f 41 4e 44 20 7c 7c 20  pe==FTS5_AND || 
de10: 65 54 79 70 65 3d 3d 46 54 53 35 5f 4f 52 20 29  eType==FTS5_OR )
de20: 7b 0a 20 20 20 20 20 20 6e 43 68 69 6c 64 20 3d  {.      nChild =
de30: 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   2;.      if( pL
de40: 65 66 74 2d 3e 65 54 79 70 65 3d 3d 65 54 79 70  eft->eType==eTyp
de50: 65 20 29 20 6e 43 68 69 6c 64 20 2b 3d 20 70 4c  e ) nChild += pL
de60: 65 66 74 2d 3e 6e 43 68 69 6c 64 2d 31 3b 0a 20  eft->nChild-1;. 
de70: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
de80: 3e 65 54 79 70 65 3d 3d 65 54 79 70 65 20 29 20  >eType==eType ) 
de90: 6e 43 68 69 6c 64 20 2b 3d 20 70 52 69 67 68 74  nChild += pRight
dea0: 2d 3e 6e 43 68 69 6c 64 2d 31 3b 0a 20 20 20 20  ->nChild-1;.    
deb0: 7d 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  }..    nByte = s
dec0: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e 6f  izeof(Fts5ExprNo
ded0: 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  de) + sizeof(Fts
dee0: 35 45 78 70 72 4e 6f 64 65 2a 29 2a 28 6e 43 68  5ExprNode*)*(nCh
def0: 69 6c 64 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  ild-1);.    pRet
df00: 20 3d 20 28 46 74 73 35 45 78 70 72 4e 6f 64 65   = (Fts5ExprNode
df10: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
df20: 6c 6f 63 5a 65 72 6f 28 26 70 50 61 72 73 65 2d  locZero(&pParse-
df30: 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  >rc, nByte);..  
df40: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
df50: 20 20 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20      pRet->eType 
df60: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
df70: 52 65 74 2d 3e 70 4e 65 61 72 20 3d 20 70 4e 65  Ret->pNear = pNe
df80: 61 72 3b 0a 20 20 20 20 20 20 66 74 73 35 45 78  ar;.      fts5Ex
df90: 70 72 41 73 73 69 67 6e 58 4e 65 78 74 28 70 52  prAssignXNext(pR
dfa0: 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  et);.      if( e
dfb0: 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e  Type==FTS5_STRIN
dfc0: 47 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  G ){.        int
dfd0: 20 69 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20   iPhrase;.      
dfe0: 20 20 66 6f 72 28 69 50 68 72 61 73 65 3d 30 3b    for(iPhrase=0;
dff0: 20 69 50 68 72 61 73 65 3c 70 4e 65 61 72 2d 3e   iPhrase<pNear->
e000: 6e 50 68 72 61 73 65 3b 20 69 50 68 72 61 73 65  nPhrase; iPhrase
e010: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ++){.          p
e020: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69  Near->apPhrase[i
e030: 50 68 72 61 73 65 5d 2d 3e 70 4e 6f 64 65 20 3d  Phrase]->pNode =
e040: 20 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 20   pRet;.         
e050: 20 69 66 28 20 70 4e 65 61 72 2d 3e 61 70 50 68   if( pNear->apPh
e060: 72 61 73 65 5b 69 50 68 72 61 73 65 5d 2d 3e 6e  rase[iPhrase]->n
e070: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Term==0 ){.     
e080: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 78 4e 65         pRet->xNe
e090: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
e0a0: 20 20 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20      pRet->eType 
e0b0: 3d 20 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20  = FTS5_EOF;.    
e0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e0d0: 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
e0e0: 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Parse->pConfig->
e0f0: 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45  eDetail!=FTS5_DE
e100: 54 41 49 4c 5f 46 55 4c 4c 20 0a 20 20 20 20 20  TAIL_FULL .     
e110: 20 20 20 20 26 26 20 28 70 4e 65 61 72 2d 3e 6e      && (pNear->n
e120: 50 68 72 61 73 65 21 3d 31 20 7c 7c 20 70 4e 65  Phrase!=1 || pNe
e130: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
e140: 3e 6e 54 65 72 6d 3e 31 29 0a 20 20 20 20 20 20  >nTerm>1).      
e150: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61    ){.          a
e160: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72  ssert( pParse->r
e170: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
e180: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
e190: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
e1a0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ROR;.          a
e1b0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 7a  ssert( pParse->z
e1c0: 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Err==0 );.      
e1d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72      pParse->zErr
e1e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
e1f0: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
e200: 20 20 22 66 74 73 35 3a 20 25 73 20 71 75 65 72    "fts5: %s quer
e210: 69 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70  ies are not supp
e220: 6f 72 74 65 64 20 28 64 65 74 61 69 6c 21 3d 66  orted (detail!=f
e230: 75 6c 6c 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ull)", .        
e240: 20 20 20 20 20 20 70 4e 65 61 72 2d 3e 6e 50 68        pNear->nPh
e250: 72 61 73 65 3d 3d 31 20 3f 20 22 70 68 72 61 73  rase==1 ? "phras
e260: 65 22 3a 20 22 4e 45 41 52 22 0a 20 20 20 20 20  e": "NEAR".     
e270: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
e280: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e290: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ret);.          
e2a0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
e2b0: 20 20 7d 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65    }..      }else
e2c0: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 45 78  {.        fts5Ex
e2d0: 70 72 41 64 64 43 68 69 6c 64 72 65 6e 28 70 52  prAddChildren(pR
e2e0: 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  et, pLeft);.    
e2f0: 20 20 20 20 66 74 73 35 45 78 70 72 41 64 64 43      fts5ExprAddC
e300: 68 69 6c 64 72 65 6e 28 70 52 65 74 2c 20 70 52  hildren(pRet, pR
e310: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ight);.      }. 
e320: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e330: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pRet==0 ){.    a
e340: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72  ssert( pParse->r
e350: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
e360: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
e370: 61 72 73 65 4e 6f 64 65 46 72 65 65 28 70 4c 65  arseNodeFree(pLe
e380: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
e390: 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65  Fts5ParseNodeFre
e3a0: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73  e(pRight);.    s
e3b0: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
e3c0: 65 61 72 73 65 74 46 72 65 65 28 70 4e 65 61 72  earsetFree(pNear
e3d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e3e0: 70 52 65 74 3b 0a 7d 0a 0a 46 74 73 35 45 78 70  pRet;.}..Fts5Exp
e3f0: 72 4e 6f 64 65 20 2a 73 71 6c 69 74 65 33 46 74  rNode *sqlite3Ft
e400: 73 35 50 61 72 73 65 49 6d 70 6c 69 63 69 74 41  s5ParseImplicitA
e410: 6e 64 28 0a 20 20 46 74 73 35 50 61 72 73 65 20  nd(.  Fts5Parse 
e420: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
e430: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
e440: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 46 74 73 35  ontext */.  Fts5
e450: 45 78 70 72 4e 6f 64 65 20 2a 70 4c 65 66 74 2c  ExprNode *pLeft,
e460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e470: 65 66 74 20 68 61 6e 64 20 63 68 69 6c 64 20 65  eft hand child e
e480: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 46  xpression */.  F
e490: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 69  ts5ExprNode *pRi
e4a0: 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ght            /
e4b0: 2a 20 52 69 67 68 74 20 68 61 6e 64 20 63 68 69  * Right hand chi
e4c0: 6c 64 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ld expression */
e4d0: 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  .){.  Fts5ExprNo
e4e0: 64 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  de *pRet = 0;.  
e4f0: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 50  Fts5ExprNode *pP
e500: 72 65 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  rev;..  if( pPar
e510: 73 65 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71  se->rc ){.    sq
e520: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
e530: 64 65 46 72 65 65 28 70 4c 65 66 74 29 3b 0a 20  deFree(pLeft);. 
e540: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
e550: 72 73 65 4e 6f 64 65 46 72 65 65 28 70 52 69 67  rseNodeFree(pRig
e560: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  ht);.  }else{.. 
e570: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
e580: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54  ->eType==FTS5_ST
e590: 52 49 4e 47 20 0a 20 20 20 20 20 20 20 20 7c 7c  RING .        ||
e5a0: 20 70 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46   pLeft->eType==F
e5b0: 54 53 35 5f 54 45 52 4d 0a 20 20 20 20 20 20 20  TS5_TERM.       
e5c0: 20 7c 7c 20 70 4c 65 66 74 2d 3e 65 54 79 70 65   || pLeft->eType
e5d0: 3d 3d 46 54 53 35 5f 45 4f 46 0a 20 20 20 20 20  ==FTS5_EOF.     
e5e0: 20 20 20 7c 7c 20 70 4c 65 66 74 2d 3e 65 54 79     || pLeft->eTy
e5f0: 70 65 3d 3d 46 54 53 35 5f 41 4e 44 0a 20 20 20  pe==FTS5_AND.   
e600: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e610: 70 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46  pRight->eType==F
e620: 54 53 35 5f 53 54 52 49 4e 47 20 0a 20 20 20 20  TS5_STRING .    
e630: 20 20 20 20 7c 7c 20 70 52 69 67 68 74 2d 3e 65      || pRight->e
e640: 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20  Type==FTS5_TERM 
e650: 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 52 69 67  .        || pRig
e660: 68 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  ht->eType==FTS5_
e670: 45 4f 46 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20  EOF .    );..   
e680: 20 69 66 28 20 70 4c 65 66 74 2d 3e 65 54 79 70   if( pLeft->eTyp
e690: 65 3d 3d 46 54 53 35 5f 41 4e 44 20 29 7b 0a 20  e==FTS5_AND ){. 
e6a0: 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 4c 65       pPrev = pLe
e6b0: 66 74 2d 3e 61 70 43 68 69 6c 64 5b 70 4c 65 66  ft->apChild[pLef
e6c0: 74 2d 3e 6e 43 68 69 6c 64 2d 31 5d 3b 0a 20 20  t->nChild-1];.  
e6d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
e6e0: 50 72 65 76 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Prev = pLeft;.  
e6f0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e700: 70 50 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46 54  pPrev->eType==FT
e710: 53 35 5f 53 54 52 49 4e 47 20 0a 20 20 20 20 20  S5_STRING .     
e720: 20 20 20 7c 7c 20 70 50 72 65 76 2d 3e 65 54 79     || pPrev->eTy
e730: 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 0a 20  pe==FTS5_TERM . 
e740: 20 20 20 20 20 20 20 7c 7c 20 70 50 72 65 76 2d         || pPrev-
e750: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46  >eType==FTS5_EOF
e760: 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20   .        );..  
e770: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 65 54    if( pRight->eT
e780: 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46 20 29 7b  ype==FTS5_EOF ){
e790: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e7a0: 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65 5b  Parse->apPhrase[
e7b0: 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d  pParse->nPhrase-
e7c0: 31 5d 3d 3d 70 52 69 67 68 74 2d 3e 70 4e 65 61  1]==pRight->pNea
e7d0: 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 20 29  r->apPhrase[0] )
e7e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
e7f0: 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65  ts5ParseNodeFree
e800: 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (pRight);.      
e810: 70 52 65 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  pRet = pLeft;.  
e820: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72      pParse->nPhr
e830: 61 73 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ase--;.    }.   
e840: 20 65 6c 73 65 20 69 66 28 20 70 50 72 65 76 2d   else if( pPrev-
e850: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46  >eType==FTS5_EOF
e860: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78   ){.      Fts5Ex
e870: 70 72 50 68 72 61 73 65 20 2a 2a 61 70 3b 0a 0a  prPhrase **ap;..
e880: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 3d        if( pPrev=
e890: 3d 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  =pLeft ){.      
e8a0: 20 20 70 52 65 74 20 3d 20 70 52 69 67 68 74 3b    pRet = pRight;
e8b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e8c0: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 61 70 43        pLeft->apC
e8d0: 68 69 6c 64 5b 70 4c 65 66 74 2d 3e 6e 43 68 69  hild[pLeft->nChi
e8e0: 6c 64 2d 31 5d 20 3d 20 70 52 69 67 68 74 3b 0a  ld-1] = pRight;.
e8f0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70          pRet = p
e900: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Left;.      }.. 
e910: 20 20 20 20 20 61 70 20 3d 20 26 70 50 61 72 73       ap = &pPars
e920: 65 2d 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72  e->apPhrase[pPar
e930: 73 65 2d 3e 6e 50 68 72 61 73 65 2d 31 2d 70 52  se->nPhrase-1-pR
e940: 69 67 68 74 2d 3e 70 4e 65 61 72 2d 3e 6e 50 68  ight->pNear->nPh
e950: 72 61 73 65 5d 3b 0a 20 20 20 20 20 20 61 73 73  rase];.      ass
e960: 65 72 74 28 20 61 70 5b 30 5d 3d 3d 70 50 72 65  ert( ap[0]==pPre
e970: 76 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61  v->pNear->apPhra
e980: 73 65 5b 30 5d 20 29 3b 0a 20 20 20 20 20 20 6d  se[0] );.      m
e990: 65 6d 6d 6f 76 65 28 61 70 2c 20 26 61 70 5b 31  emmove(ap, &ap[1
e9a0: 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78  ], sizeof(Fts5Ex
e9b0: 70 72 50 68 72 61 73 65 2a 29 2a 70 52 69 67 68  prPhrase*)*pRigh
e9c0: 74 2d 3e 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73  t->pNear->nPhras
e9d0: 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  e);.      pParse
e9e0: 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a 0a 20 20  ->nPhrase--;..  
e9f0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
ea00: 61 72 73 65 4e 6f 64 65 46 72 65 65 28 70 50 72  arseNodeFree(pPr
ea10: 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ev);.    }.    e
ea20: 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 74 20  lse{.      pRet 
ea30: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  = sqlite3Fts5Par
ea40: 73 65 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 46  seNode(pParse, F
ea50: 54 53 35 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20  TS5_AND, pLeft, 
ea60: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
ea70: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
ea80: 70 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  pRet;.}..static 
ea90: 63 68 61 72 20 2a 66 74 73 35 45 78 70 72 54 65  char *fts5ExprTe
eaa0: 72 6d 50 72 69 6e 74 28 46 74 73 35 45 78 70 72  rmPrint(Fts5Expr
eab0: 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
eac0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
ead0: 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
eae0: 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65  ;.  char *zQuote
eaf0: 64 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69  d;..  /* Determi
eb00: 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  ne the maximum a
eb10: 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 72  mount of space r
eb20: 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 66 6f  equired. */.  fo
eb30: 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20 70 3d  r(p=pTerm; p; p=
eb40: 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20  p->pSynonym){.  
eb50: 20 20 6e 42 79 74 65 20 2b 3d 20 28 69 6e 74 29    nByte += (int)
eb60: 73 74 72 6c 65 6e 28 70 54 65 72 6d 2d 3e 7a 54  strlen(pTerm->zT
eb70: 65 72 6d 29 20 2a 20 32 20 2b 20 33 20 2b 20 32  erm) * 2 + 3 + 2
eb80: 3b 0a 20 20 7d 0a 20 20 7a 51 75 6f 74 65 64 20  ;.  }.  zQuoted 
eb90: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
eba0: 28 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20  (nByte);..  if( 
ebb0: 7a 51 75 6f 74 65 64 20 29 7b 0a 20 20 20 20 69  zQuoted ){.    i
ebc0: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 66 6f  nt i = 0;.    fo
ebd0: 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20 70 3d  r(p=pTerm; p; p=
ebe0: 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20  p->pSynonym){.  
ebf0: 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20      char *zIn = 
ec00: 70 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20  p->zTerm;.      
ec10: 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27  zQuoted[i++] = '
ec20: 22 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  "';.      while(
ec30: 20 2a 7a 49 6e 20 29 7b 0a 20 20 20 20 20 20 20   *zIn ){.       
ec40: 20 69 66 28 20 2a 7a 49 6e 3d 3d 27 22 27 20 29   if( *zIn=='"' )
ec50: 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20   zQuoted[i++] = 
ec60: 27 22 27 3b 0a 20 20 20 20 20 20 20 20 7a 51 75  '"';.        zQu
ec70: 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 2a 7a 49 6e  oted[i++] = *zIn
ec80: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
ec90: 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d    zQuoted[i++] =
eca0: 20 27 22 27 3b 0a 20 20 20 20 20 20 69 66 28 20   '"';.      if( 
ecb0: 70 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 20 7a 51  p->pSynonym ) zQ
ecc0: 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 7c 27  uoted[i++] = '|'
ecd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ece0: 70 54 65 72 6d 2d 3e 62 50 72 65 66 69 78 20 29  pTerm->bPrefix )
ecf0: 7b 0a 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b  {.      zQuoted[
ed00: 69 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  i++] = ' ';.    
ed10: 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d    zQuoted[i++] =
ed20: 20 27 2a 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   '*';.    }.    
ed30: 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27  zQuoted[i++] = '
ed40: 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  \0';.  }.  retur
ed50: 6e 20 7a 51 75 6f 74 65 64 3b 0a 7d 0a 0a 73 74  n zQuoted;.}..st
ed60: 61 74 69 63 20 63 68 61 72 20 2a 66 74 73 35 50  atic char *fts5P
ed70: 72 69 6e 74 66 41 70 70 65 6e 64 28 63 68 61 72  rintfAppend(char
ed80: 20 2a 7a 41 70 70 2c 20 63 6f 6e 73 74 20 63 68   *zApp, const ch
ed90: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
eda0: 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20    char *zNew;.  
edb0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
edc0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
edd0: 3b 0a 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  zNew = sqlit
ede0: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
edf0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
ee00: 61 70 29 3b 0a 20 20 69 66 28 20 7a 41 70 70 20  ap);.  if( zApp 
ee10: 26 26 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 63  && zNew ){.    c
ee20: 68 61 72 20 2a 7a 4e 65 77 32 20 3d 20 73 71 6c  har *zNew2 = sql
ee30: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
ee40: 25 73 22 2c 20 7a 41 70 70 2c 20 7a 4e 65 77 29  %s", zApp, zNew)
ee50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
ee60: 65 65 28 7a 4e 65 77 29 3b 0a 20 20 20 20 7a 4e  ee(zNew);.    zN
ee70: 65 77 20 3d 20 7a 4e 65 77 32 3b 0a 20 20 7d 0a  ew = zNew2;.  }.
ee80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ee90: 41 70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  App);.  return z
eea0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  New;.}../*.** Co
eeb0: 6d 70 6f 73 65 20 61 20 74 63 6c 2d 72 65 61 64  mpose a tcl-read
eec0: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
eed0: 69 6f 6e 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ion of expressio
eee0: 6e 20 70 45 78 70 72 2e 20 52 65 74 75 72 6e 20  n pExpr. Return 
eef0: 61 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  a .** pointer to
ef00: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
ef10: 6e 69 6e 67 20 74 68 61 74 20 72 65 70 72 65 73  ning that repres
ef20: 65 6e 74 61 74 69 6f 6e 2e 20 49 74 20 69 73 20  entation. It is 
ef30: 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
ef40: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
ef50: 6c 6c 65 72 20 74 6f 20 61 74 20 73 6f 6d 65 20  ller to at some 
ef60: 70 6f 69 6e 74 20 66 72 65 65 20 74 68 65 20 62  point free the b
ef70: 75 66 66 65 72 20 75 73 69 6e 67 20 0a 2a 2a 20  uffer using .** 
ef80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
ef90: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
efa0: 66 74 73 35 45 78 70 72 50 72 69 6e 74 54 63 6c  fts5ExprPrintTcl
efb0: 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
efc0: 70 43 6f 6e 66 69 67 2c 20 0a 20 20 63 6f 6e 73  pConfig, .  cons
efd0: 74 20 63 68 61 72 20 2a 7a 4e 65 61 72 73 65 74  t char *zNearset
efe0: 43 6d 64 2c 0a 20 20 46 74 73 35 45 78 70 72 4e  Cmd,.  Fts5ExprN
eff0: 6f 64 65 20 2a 70 45 78 70 72 0a 29 7b 0a 20 20  ode *pExpr.){.  
f000: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a  char *zRet = 0;.
f010: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65 54 79    if( pExpr->eTy
f020: 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20  pe==FTS5_STRING 
f030: 7c 7c 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d  || pExpr->eType=
f040: 3d 46 54 53 35 5f 54 45 52 4d 20 29 7b 0a 20 20  =FTS5_TERM ){.  
f050: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
f060: 74 20 2a 70 4e 65 61 72 20 3d 20 70 45 78 70 72  t *pNear = pExpr
f070: 2d 3e 70 4e 65 61 72 3b 0a 20 20 20 20 69 6e 74  ->pNear;.    int
f080: 20 69 3b 20 0a 20 20 20 20 69 6e 74 20 69 54 65   i; .    int iTe
f090: 72 6d 3b 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20  rm;..    zRet = 
f0a0: 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64  fts5PrintfAppend
f0b0: 28 7a 52 65 74 2c 20 22 25 73 20 22 2c 20 7a 4e  (zRet, "%s ", zN
f0c0: 65 61 72 73 65 74 43 6d 64 29 3b 0a 20 20 20 20  earsetCmd);.    
f0d0: 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65  if( zRet==0 ) re
f0e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
f0f0: 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 29  pNear->pColset )
f100: 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 43  {.      int *aiC
f110: 6f 6c 20 3d 20 70 4e 65 61 72 2d 3e 70 43 6f 6c  ol = pNear->pCol
f120: 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20  set->aiCol;.    
f130: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 4e 65    int nCol = pNe
f140: 61 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  ar->pColset->nCo
f150: 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f  l;.      if( nCo
f160: 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  l==1 ){.        
f170: 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74  zRet = fts5Print
f180: 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2d  fAppend(zRet, "-
f190: 63 6f 6c 20 25 64 20 22 2c 20 61 69 43 6f 6c 5b  col %d ", aiCol[
f1a0: 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
f1b0: 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d  {.        zRet =
f1c0: 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e   fts5PrintfAppen
f1d0: 64 28 7a 52 65 74 2c 20 22 2d 63 6f 6c 20 7b 25  d(zRet, "-col {%
f1e0: 64 22 2c 20 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20  d", aiCol[0]);. 
f1f0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
f200: 69 3c 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  i<pNear->pColset
f210: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
f220: 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66          zRet = f
f230: 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
f240: 7a 52 65 74 2c 20 22 20 25 64 22 2c 20 61 69 43  zRet, " %d", aiC
f250: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
f260: 7d 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d  }.        zRet =
f270: 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e   fts5PrintfAppen
f280: 64 28 7a 52 65 74 2c 20 22 7d 20 22 29 3b 0a 20  d(zRet, "} ");. 
f290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f2a0: 20 7a 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72   zRet==0 ) retur
f2b0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
f2c0: 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61  if( pNear->nPhra
f2d0: 73 65 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 52  se>1 ){.      zR
f2e0: 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
f2f0: 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2d 6e 65  ppend(zRet, "-ne
f300: 61 72 20 25 64 20 22 2c 20 70 4e 65 61 72 2d 3e  ar %d ", pNear->
f310: 6e 4e 65 61 72 29 3b 0a 20 20 20 20 20 20 69 66  nNear);.      if
f320: 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65 74 75  ( zRet==0 ) retu
f330: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
f340: 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e   zRet = fts5Prin
f350: 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22  tfAppend(zRet, "
f360: 2d 2d 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  --");.    if( zR
f370: 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  et==0 ) return 0
f380: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
f390: 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  i<pNear->nPhrase
f3a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  ; i++){.      Ft
f3b0: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
f3c0: 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61  hrase = pNear->a
f3d0: 70 50 68 72 61 73 65 5b 69 5d 3b 0a 0a 20 20 20  pPhrase[i];..   
f3e0: 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72     zRet = fts5Pr
f3f0: 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c  intfAppend(zRet,
f400: 20 22 20 7b 22 29 3b 0a 20 20 20 20 20 20 66 6f   " {");.      fo
f410: 72 28 69 54 65 72 6d 3d 30 3b 20 7a 52 65 74 20  r(iTerm=0; zRet 
f420: 26 26 20 69 54 65 72 6d 3c 70 50 68 72 61 73 65  && iTerm<pPhrase
f430: 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b  ->nTerm; iTerm++
f440: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
f450: 2a 7a 54 65 72 6d 20 3d 20 70 50 68 72 61 73 65  *zTerm = pPhrase
f460: 2d 3e 61 54 65 72 6d 5b 69 54 65 72 6d 5d 2e 7a  ->aTerm[iTerm].z
f470: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 7a 52  Term;.        zR
f480: 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
f490: 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 25 73 25  ppend(zRet, "%s%
f4a0: 73 22 2c 20 69 54 65 72 6d 3d 3d 30 3f 22 22 3a  s", iTerm==0?"":
f4b0: 22 20 22 2c 20 7a 54 65 72 6d 29 3b 0a 20 20 20  " ", zTerm);.   
f4c0: 20 20 20 20 20 69 66 28 20 70 50 68 72 61 73 65       if( pPhrase
f4d0: 2d 3e 61 54 65 72 6d 5b 69 54 65 72 6d 5d 2e 62  ->aTerm[iTerm].b
f4e0: 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
f4f0: 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50      zRet = fts5P
f500: 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74  rintfAppend(zRet
f510: 2c 20 22 2a 22 29 3b 0a 20 20 20 20 20 20 20 20  , "*");.        
f520: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
f530: 20 69 66 28 20 7a 52 65 74 20 29 20 7a 52 65 74   if( zRet ) zRet
f540: 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
f550: 65 6e 64 28 7a 52 65 74 2c 20 22 7d 22 29 3b 0a  end(zRet, "}");.
f560: 20 20 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d        if( zRet==
f570: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f580: 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
f590: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
f5a0: 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
f5b0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 45  ;.    switch( pE
f5c0: 78 70 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  xpr->eType ){.  
f5d0: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e      case FTS5_AN
f5e0: 44 3a 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20  D: zOp = "AND"; 
f5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f600: 65 20 46 54 53 35 5f 4e 4f 54 3a 20 7a 4f 70 20  e FTS5_NOT: zOp 
f610: 3d 20 22 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a  = "NOT"; break;.
f620: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 0a        default: .
f630: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f640: 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
f650: 53 35 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 20  S5_OR );.       
f660: 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 0a 20 20   zOp = "OR"; .  
f670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f680: 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   }..    zRet = s
f690: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f6a0: 25 73 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 66  %s", zOp);.    f
f6b0: 6f 72 28 69 3d 30 3b 20 7a 52 65 74 20 26 26 20  or(i=0; zRet && 
f6c0: 69 3c 70 45 78 70 72 2d 3e 6e 43 68 69 6c 64 3b  i<pExpr->nChild;
f6d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
f6e0: 72 20 2a 7a 20 3d 20 66 74 73 35 45 78 70 72 50  r *z = fts5ExprP
f6f0: 72 69 6e 74 54 63 6c 28 70 43 6f 6e 66 69 67 2c  rintTcl(pConfig,
f700: 20 7a 4e 65 61 72 73 65 74 43 6d 64 2c 20 70 45   zNearsetCmd, pE
f710: 78 70 72 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29  xpr->apChild[i])
f720: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 20 29  ;.      if( !z )
f730: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f740: 33 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a 20 20  3_free(zRet);.  
f750: 20 20 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a        zRet = 0;.
f760: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f770: 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35       zRet = fts5
f780: 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65  PrintfAppend(zRe
f790: 74 2c 20 22 20 5b 25 7a 5d 22 2c 20 7a 29 3b 0a  t, " [%z]", z);.
f7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f7b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74  }..  return zRet
f7c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
f7d0: 20 2a 66 74 73 35 45 78 70 72 50 72 69 6e 74 28   *fts5ExprPrint(
f7e0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
f7f0: 66 69 67 2c 20 46 74 73 35 45 78 70 72 4e 6f 64  fig, Fts5ExprNod
f800: 65 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  e *pExpr){.  cha
f810: 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69  r *zRet = 0;.  i
f820: 66 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d  f( pExpr->eType=
f830: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
f840: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
f850: 28 22 5c 22 5c 22 22 29 3b 0a 20 20 7d 65 6c 73  ("\"\"");.  }els
f860: 65 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65  e.  if( pExpr->e
f870: 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e  Type==FTS5_STRIN
f880: 47 20 7c 7c 20 70 45 78 70 72 2d 3e 65 54 79 70  G || pExpr->eTyp
f890: 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29 7b 0a  e==FTS5_TERM ){.
f8a0: 20 20 20 20 46 74 73 35 45 78 70 72 4e 65 61 72      Fts5ExprNear
f8b0: 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 45 78  set *pNear = pEx
f8c0: 70 72 2d 3e 70 4e 65 61 72 3b 0a 20 20 20 20 69  pr->pNear;.    i
f8d0: 6e 74 20 69 3b 20 0a 20 20 20 20 69 6e 74 20 69  nt i; .    int i
f8e0: 54 65 72 6d 3b 0a 0a 20 20 20 20 69 66 28 20 70  Term;..    if( p
f8f0: 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 29 7b  Near->pColset ){
f900: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
f910: 3d 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  = pNear->pColset
f920: 2d 3e 61 69 43 6f 6c 5b 30 5d 3b 0a 20 20 20 20  ->aiCol[0];.    
f930: 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69    zRet = fts5Pri
f940: 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20  ntfAppend(zRet, 
f950: 22 25 73 20 3a 20 22 2c 20 70 43 6f 6e 66 69 67  "%s : ", pConfig
f960: 2d 3e 61 7a 43 6f 6c 5b 69 43 6f 6c 5d 29 3b 0a  ->azCol[iCol]);.
f970: 20 20 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d        if( zRet==
f980: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f990: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4e 65    }..    if( pNe
f9a0: 61 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20 29 7b  ar->nPhrase>1 ){
f9b0: 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74  .      zRet = ft
f9c0: 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a  s5PrintfAppend(z
f9d0: 52 65 74 2c 20 22 4e 45 41 52 28 22 29 3b 0a 20  Ret, "NEAR(");. 
f9e0: 20 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30       if( zRet==0
f9f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
fa00: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
fa10: 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
fa20: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  e; i++){.      F
fa30: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
fa40: 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e  Phrase = pNear->
fa50: 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20  apPhrase[i];.   
fa60: 20 20 20 69 66 28 20 69 21 3d 30 20 29 7b 0a 20     if( i!=0 ){. 
fa70: 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74         zRet = ft
fa80: 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a  s5PrintfAppend(z
fa90: 52 65 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20  Ret, " ");.     
faa0: 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29     if( zRet==0 )
fab0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
fac0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65   }.      for(iTe
fad0: 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 50 68 72  rm=0; iTerm<pPhr
fae0: 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72  ase->nTerm; iTer
faf0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  m++){.        ch
fb00: 61 72 20 2a 7a 54 65 72 6d 20 3d 20 66 74 73 35  ar *zTerm = fts5
fb10: 45 78 70 72 54 65 72 6d 50 72 69 6e 74 28 26 70  ExprTermPrint(&p
fb20: 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54  Phrase->aTerm[iT
fb30: 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  erm]);.        i
fb40: 66 28 20 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( zTerm ){.    
fb50: 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
fb60: 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
fb70: 65 74 2c 20 22 25 73 25 73 22 2c 20 69 54 65 72  et, "%s%s", iTer
fb80: 6d 3d 3d 30 3f 22 22 3a 22 20 2b 20 22 2c 20 7a  m==0?"":" + ", z
fb90: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  Term);.         
fba0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
fbb0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  erm);.        }.
fbc0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 65 72          if( zTer
fbd0: 6d 3d 3d 30 20 7c 7c 20 7a 52 65 74 3d 3d 30 20  m==0 || zRet==0 
fbe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
fbf0: 69 74 65 33 5f 66 72 65 65 28 7a 52 65 74 29 3b  ite3_free(zRet);
fc00: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
fc10: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
fc20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
fc30: 20 20 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68    if( pNear->nPh
fc40: 72 61 73 65 3e 31 20 29 7b 0a 20 20 20 20 20 20  rase>1 ){.      
fc50: 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74  zRet = fts5Print
fc60: 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2c  fAppend(zRet, ",
fc70: 20 25 64 29 22 2c 20 70 4e 65 61 72 2d 3e 6e 4e   %d)", pNear->nN
fc80: 65 61 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ear);.      if( 
fc90: 7a 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  zRet==0 ) return
fca0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c   0;.    }..  }el
fcb0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e  se{.    char con
fcc0: 73 74 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 20  st *zOp = 0;.   
fcd0: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 73 77 69   int i;..    swi
fce0: 74 63 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70  tch( pExpr->eTyp
fcf0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
fd00: 46 54 53 35 5f 41 4e 44 3a 20 7a 4f 70 20 3d 20  FTS5_AND: zOp = 
fd10: 22 20 41 4e 44 20 22 3b 20 62 72 65 61 6b 3b 0a  " AND "; break;.
fd20: 20 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f        case FTS5_
fd30: 4e 4f 54 3a 20 7a 4f 70 20 3d 20 22 20 4e 4f 54  NOT: zOp = " NOT
fd40: 20 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20   "; break;.     
fd50: 20 64 65 66 61 75 6c 74 3a 20 20 0a 20 20 20 20   default:  .    
fd60: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
fd70: 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4f  r->eType==FTS5_O
fd80: 52 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 70  R );.        zOp
fd90: 20 3d 20 22 20 4f 52 20 22 3b 20 0a 20 20 20 20   = " OR "; .    
fda0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fdb0: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
fdc0: 3c 70 45 78 70 72 2d 3e 6e 43 68 69 6c 64 3b 20  <pExpr->nChild; 
fdd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
fde0: 20 2a 7a 20 3d 20 66 74 73 35 45 78 70 72 50 72   *z = fts5ExprPr
fdf0: 69 6e 74 28 70 43 6f 6e 66 69 67 2c 20 70 45 78  int(pConfig, pEx
fe00: 70 72 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b  pr->apChild[i]);
fe10: 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  .      if( z==0 
fe20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
fe30: 65 33 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a 20  e3_free(zRet);. 
fe40: 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 30 3b         zRet = 0;
fe50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fe60: 20 20 20 20 20 20 69 6e 74 20 65 20 3d 20 70 45        int e = pE
fe70: 78 70 72 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 2d  xpr->apChild[i]-
fe80: 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  >eType;.        
fe90: 69 6e 74 20 62 20 3d 20 28 65 21 3d 46 54 53 35  int b = (e!=FTS5
fea0: 5f 53 54 52 49 4e 47 20 26 26 20 65 21 3d 46 54  _STRING && e!=FT
feb0: 53 35 5f 54 45 52 4d 20 26 26 20 65 21 3d 46 54  S5_TERM && e!=FT
fec0: 53 35 5f 45 4f 46 29 3b 0a 20 20 20 20 20 20 20  S5_EOF);.       
fed0: 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e   zRet = fts5Prin
fee0: 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22  tfAppend(zRet, "
fef0: 25 73 25 73 25 7a 25 73 22 2c 20 0a 20 20 20 20  %s%s%z%s", .    
ff00: 20 20 20 20 20 20 20 20 28 69 3d 3d 30 20 3f 20          (i==0 ? 
ff10: 22 22 20 3a 20 7a 4f 70 29 2c 0a 20 20 20 20 20  "" : zOp),.     
ff20: 20 20 20 20 20 20 20 28 62 3f 22 28 22 3a 22 22         (b?"(":""
ff30: 29 2c 20 7a 2c 20 28 62 3f 22 29 22 3a 22 22 29  ), z, (b?")":"")
ff40: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
ff50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 52    }.      if( zR
ff60: 65 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  et==0 ) break;. 
ff70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
ff80: 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zRet;.}../*.*
ff90: 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
ffa0: 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
ffb0: 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
ffc0: 74 69 6f 6e 73 20 66 74 73 35 5f 65 78 70 72 28  tions fts5_expr(
ffd0: 29 20 28 62 54 63 6c 3d 3d 30 29 0a 2a 2a 20 61  ) (bTcl==0).** a
ffe0: 6e 64 20 66 74 73 35 5f 65 78 70 72 5f 74 63 6c  nd fts5_expr_tcl
fff0: 28 29 20 28 62 54 63 6c 21 3d 30 29 2e 0a 2a 2f  () (bTcl!=0)..*/
10000 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
10010 35 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a 20  5ExprFunction(. 
10020 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
10030 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
10040 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
10050 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
10060 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10080 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
10090 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
100a0 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20  lue **apVal,    
100b0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
100c0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
100d0 20 69 6e 74 20 62 54 63 6c 0a 29 7b 0a 20 20 46   int bTcl.){.  F
100e0 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62  ts5Global *pGlob
100f0 61 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61 6c  al = (Fts5Global
10100 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
10110 61 74 61 28 70 43 74 78 29 3b 0a 20 20 73 71 6c  ata(pCtx);.  sql
10120 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
10130 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
10140 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f  ndle(pCtx);.  co
10150 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 72 20  nst char *zExpr 
10160 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  = 0;.  char *zEr
10170 72 20 3d 20 30 3b 0a 20 20 46 74 73 35 45 78 70  r = 0;.  Fts5Exp
10180 72 20 2a 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  r *pExpr = 0;.  
10190 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b  int rc;.  int i;
101a0 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
101b0 2a 61 7a 43 6f 6e 66 69 67 3b 20 20 20 20 20 20  *azConfig;      
101c0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
101d0 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 46 74  arguments for Ft
101e0 73 35 43 6f 6e 66 69 67 20 2a 2f 0a 20 20 63 6f  s5Config */.  co
101f0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 61 72 73  nst char *zNears
10200 65 74 43 6d 64 20 3d 20 22 6e 65 61 72 73 65 74  etCmd = "nearset
10210 22 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 66 69 67  ";.  int nConfig
10220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10230 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10240 61 7a 43 6f 6e 66 69 67 5b 5d 20 2a 2f 0a 20 20  azConfig[] */.  
10250 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
10260 66 69 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  fig = 0;.  int i
10270 41 72 67 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  Arg = 1;..  if( 
10280 6e 41 72 67 3c 31 20 29 7b 0a 20 20 20 20 7a 45  nArg<1 ){.    zE
10290 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
102a0 69 6e 74 66 28 22 77 72 6f 6e 67 20 6e 75 6d 62  intf("wrong numb
102b0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
102c0 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 73 22 2c  to function %s",
102d0 0a 20 20 20 20 20 20 20 20 62 54 63 6c 20 3f 20  .        bTcl ? 
102e0 22 66 74 73 35 5f 65 78 70 72 5f 74 63 6c 22 20  "fts5_expr_tcl" 
102f0 3a 20 22 66 74 73 35 5f 65 78 70 72 22 0a 20 20  : "fts5_expr".  
10300 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
10310 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
10320 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20  tx, zErr, -1);. 
10330 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10340 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 74 75 72  zErr);.    retur
10350 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 54  n;.  }..  if( bT
10360 63 6c 20 26 26 20 6e 41 72 67 3e 31 20 29 7b 0a  cl && nArg>1 ){.
10370 20 20 20 20 7a 4e 65 61 72 73 65 74 43 6d 64 20      zNearsetCmd 
10380 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
10390 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
103a0 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20  t(apVal[1]);.   
103b0 20 69 41 72 67 20 3d 20 32 3b 0a 20 20 7d 0a 0a   iArg = 2;.  }..
103c0 20 20 6e 43 6f 6e 66 69 67 20 3d 20 33 20 2b 20    nConfig = 3 + 
103d0 28 6e 41 72 67 2d 69 41 72 67 29 3b 0a 20 20 61  (nArg-iArg);.  a
103e0 7a 43 6f 6e 66 69 67 20 3d 20 28 63 6f 6e 73 74  zConfig = (const
103f0 20 63 68 61 72 2a 2a 29 73 71 6c 69 74 65 33 5f   char**)sqlite3_
10400 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 63 68  malloc(sizeof(ch
10410 61 72 2a 29 20 2a 20 6e 43 6f 6e 66 69 67 29 3b  ar*) * nConfig);
10420 0a 20 20 69 66 28 20 61 7a 43 6f 6e 66 69 67 3d  .  if( azConfig=
10430 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
10440 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
10450 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20  omem(pCtx);.    
10460 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 7a  return;.  }.  az
10470 43 6f 6e 66 69 67 5b 30 5d 20 3d 20 30 3b 0a 20  Config[0] = 0;. 
10480 20 61 7a 43 6f 6e 66 69 67 5b 31 5d 20 3d 20 22   azConfig[1] = "
10490 6d 61 69 6e 22 3b 0a 20 20 61 7a 43 6f 6e 66 69  main";.  azConfi
104a0 67 5b 32 5d 20 3d 20 22 74 62 6c 22 3b 0a 20 20  g[2] = "tbl";.  
104b0 66 6f 72 28 69 3d 33 3b 20 69 41 72 67 3c 6e 41  for(i=3; iArg<nA
104c0 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20  rg; iArg++){.   
104d0 20 61 7a 43 6f 6e 66 69 67 5b 69 2b 2b 5d 20 3d   azConfig[i++] =
104e0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
104f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
10500 28 61 70 56 61 6c 5b 69 41 72 67 5d 29 3b 0a 20  (apVal[iArg]);. 
10510 20 7d 0a 0a 20 20 7a 45 78 70 72 20 3d 20 28 63   }..  zExpr = (c
10520 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
10530 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
10540 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 72 63 20 3d  Val[0]);..  rc =
10550 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
10560 69 67 50 61 72 73 65 28 70 47 6c 6f 62 61 6c 2c  igParse(pGlobal,
10570 20 64 62 2c 20 6e 43 6f 6e 66 69 67 2c 20 61 7a   db, nConfig, az
10580 43 6f 6e 66 69 67 2c 20 26 70 43 6f 6e 66 69 67  Config, &pConfig
10590 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20  , &zErr);.  if( 
105a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
105b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
105c0 33 46 74 73 35 45 78 70 72 4e 65 77 28 70 43 6f  3Fts5ExprNew(pCo
105d0 6e 66 69 67 2c 20 7a 45 78 70 72 2c 20 26 70 45  nfig, zExpr, &pE
105e0 78 70 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d  xpr, &zErr);.  }
105f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10600 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 61 72  E_OK ){.    char
10610 20 2a 7a 54 65 78 74 3b 0a 20 20 20 20 69 66 28   *zText;.    if(
10620 20 70 45 78 70 72 2d 3e 70 52 6f 6f 74 2d 3e 78   pExpr->pRoot->x
10630 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Next==0 ){.     
10640 20 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33   zText = sqlite3
10650 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20  _mprintf("");.  
10660 20 20 7d 65 6c 73 65 20 69 66 28 20 62 54 63 6c    }else if( bTcl
10670 20 29 7b 0a 20 20 20 20 20 20 7a 54 65 78 74 20   ){.      zText 
10680 3d 20 66 74 73 35 45 78 70 72 50 72 69 6e 74 54  = fts5ExprPrintT
10690 63 6c 28 70 43 6f 6e 66 69 67 2c 20 7a 4e 65 61  cl(pConfig, zNea
106a0 72 73 65 74 43 6d 64 2c 20 70 45 78 70 72 2d 3e  rsetCmd, pExpr->
106b0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 65 6c 73  pRoot);.    }els
106c0 65 7b 0a 20 20 20 20 20 20 7a 54 65 78 74 20 3d  e{.      zText =
106d0 20 66 74 73 35 45 78 70 72 50 72 69 6e 74 28 70   fts5ExprPrint(p
106e0 43 6f 6e 66 69 67 2c 20 70 45 78 70 72 2d 3e 70  Config, pExpr->p
106f0 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Root);.    }.   
10700 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b   if( zText==0 ){
10710 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10720 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
10730 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10740 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
10750 43 74 78 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  Ctx, zText, -1, 
10760 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
10770 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10780 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
10790 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
107a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
107b0 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
107c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
107d0 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
107e0 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 20 20   zErr, -1);.    
107f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10800 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Err);.    }else{
10810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
10820 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
10830 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 20 20  (pCtx, rc);.    
10840 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
10850 66 72 65 65 28 28 76 6f 69 64 20 2a 29 61 7a 43  free((void *)azC
10860 6f 6e 66 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  onfig);.  sqlite
10870 33 46 74 73 35 43 6f 6e 66 69 67 46 72 65 65 28  3Fts5ConfigFree(
10880 70 43 6f 6e 66 69 67 29 3b 0a 20 20 73 71 6c 69  pConfig);.  sqli
10890 74 65 33 46 74 73 35 45 78 70 72 46 72 65 65 28  te3Fts5ExprFree(
108a0 70 45 78 70 72 29 3b 0a 7d 0a 0a 73 74 61 74 69  pExpr);.}..stati
108b0 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 46  c void fts5ExprF
108c0 75 6e 63 74 69 6f 6e 48 72 28 0a 20 20 73 71 6c  unctionHr(.  sql
108d0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
108e0 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tx,          /* 
108f0 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f  Function call co
10900 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
10910 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
10920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10930 6d 62 65 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a  mber of args */.
10940 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
10950 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
10960 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72    /* Function ar
10970 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
10980 66 74 73 35 45 78 70 72 46 75 6e 63 74 69 6f 6e  fts5ExprFunction
10990 28 70 43 74 78 2c 20 6e 41 72 67 2c 20 61 70 56  (pCtx, nArg, apV
109a0 61 6c 2c 20 30 29 3b 0a 7d 0a 73 74 61 74 69 63  al, 0);.}.static
109b0 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 46 75   void fts5ExprFu
109c0 6e 63 74 69 6f 6e 54 63 6c 28 0a 20 20 73 71 6c  nctionTcl(.  sql
109d0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
109e0 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tx,          /* 
109f0 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f  Function call co
10a00 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
10a10 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
10a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10a30 6d 62 65 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a  mber of args */.
10a40 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
10a50 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
10a60 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72    /* Function ar
10a70 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
10a80 66 74 73 35 45 78 70 72 46 75 6e 63 74 69 6f 6e  fts5ExprFunction
10a90 28 70 43 74 78 2c 20 6e 41 72 67 2c 20 61 70 56  (pCtx, nArg, apV
10aa0 61 6c 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al, 1);.}../*.**
10ab0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
10ac0 69 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 69 74 65  ion of an SQLite
10ad0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 2d 66 75   user-defined-fu
10ae0 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65  nction that acce
10af0 70 74 73 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20  pts a.** single 
10b00 69 6e 74 65 67 65 72 20 61 73 20 61 6e 20 61 72  integer as an ar
10b10 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 69  gument. If the i
10b20 6e 74 65 67 65 72 20 69 73 20 61 6e 20 61 6c 70  nteger is an alp
10b30 68 61 2d 6e 75 6d 65 72 69 63 20 0a 2a 2a 20 75  ha-numeric .** u
10b40 6e 69 63 6f 64 65 20 63 6f 64 65 20 70 6f 69 6e  nicode code poin
10b50 74 2c 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  t, 1 is returned
10b60 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
10b70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10b80 73 35 45 78 70 72 49 73 41 6c 6e 75 6d 28 0a 20  s5ExprIsAlnum(. 
10b90 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
10ba0 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
10bb0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
10bc0 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
10bd0 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10bf0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
10c00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
10c10 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
10c20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
10c30 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
10c40 7b 0a 20 20 69 6e 74 20 69 43 6f 64 65 3b 0a 20  {.  int iCode;. 
10c50 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a   if( nArg!=1 ){.
10c60 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
10c70 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
10c80 20 20 20 20 20 20 20 20 22 77 72 6f 6e 67 20 6e          "wrong n
10c90 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
10ca0 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 66  ts to function f
10cb0 74 73 35 5f 69 73 61 6c 6e 75 6d 22 2c 20 2d 31  ts5_isalnum", -1
10cc0 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
10cd0 72 6e 3b 0a 20 20 7d 0a 20 20 69 43 6f 64 65 20  rn;.  }.  iCode 
10ce0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
10cf0 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  int(apVal[0]);. 
10d00 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
10d10 69 6e 74 28 70 43 74 78 2c 20 73 71 6c 69 74 65  int(pCtx, sqlite
10d20 33 46 74 73 35 55 6e 69 63 6f 64 65 49 73 61 6c  3Fts5UnicodeIsal
10d30 6e 75 6d 28 69 43 6f 64 65 29 29 3b 0a 7d 0a 0a  num(iCode));.}..
10d40 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
10d50 45 78 70 72 46 6f 6c 64 28 0a 20 20 73 71 6c 69  ExprFold(.  sqli
10d60 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
10d70 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
10d80 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
10d90 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
10da0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
10db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10dc0 62 65 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20  ber of args */. 
10dd0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
10de0 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
10df0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
10e00 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
10e10 66 28 20 6e 41 72 67 21 3d 31 20 26 26 20 6e 41  f( nArg!=1 && nA
10e20 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c  rg!=2 ){.    sql
10e30 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
10e40 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
10e50 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
10e60 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
10e70 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 66 6f 6c  unction fts5_fol
10e80 64 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20  d", -1.    );.  
10e90 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
10ea0 43 6f 64 65 3b 0a 20 20 20 20 69 6e 74 20 62 52  Code;.    int bR
10eb0 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 73 20  emoveDiacritics 
10ec0 3d 20 30 3b 0a 20 20 20 20 69 43 6f 64 65 20 3d  = 0;.    iCode =
10ed0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
10ee0 6e 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  nt(apVal[0]);.  
10ef0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 20    if( nArg==2 ) 
10f00 62 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63  bRemoveDiacritic
10f10 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
10f20 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b  e_int(apVal[1]);
10f30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
10f40 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 73 71  ult_int(pCtx, sq
10f50 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
10f60 46 6f 6c 64 28 69 43 6f 64 65 2c 20 62 52 65 6d  Fold(iCode, bRem
10f70 6f 76 65 44 69 61 63 72 69 74 69 63 73 29 29 3b  oveDiacritics));
10f80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
10f90 69 73 20 69 73 20 63 61 6c 6c 65 64 20 64 75 72  is is called dur
10fa0 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ing initializati
10fb0 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20 74  on to register t
10fc0 68 65 20 66 74 73 35 5f 65 78 70 72 28 29 20 73  he fts5_expr() s
10fd0 63 61 6c 61 72 0a 2a 2a 20 55 44 46 20 77 69 74  calar.** UDF wit
10fe0 68 20 74 68 65 20 53 51 4c 69 74 65 20 68 61 6e  h the SQLite han
10ff0 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
11000 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
11010 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
11020 74 73 35 45 78 70 72 49 6e 69 74 28 46 74 73 35  ts5ExprInit(Fts5
11030 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c  Global *pGlobal,
11040 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20   sqlite3 *db){. 
11050 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72   struct Fts5Expr
11060 46 75 6e 63 20 7b 0a 20 20 20 20 63 6f 6e 73 74  Func {.    const
11070 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 6f   char *z;.    vo
11080 69 64 20 28 2a 78 29 28 73 71 6c 69 74 65 33 5f  id (*x)(sqlite3_
11090 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
110a0 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20  ite3_value**);. 
110b0 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20   } aFunc[] = {. 
110c0 20 20 20 7b 20 22 66 74 73 35 5f 65 78 70 72 22     { "fts5_expr"
110d0 2c 20 20 20 20 20 66 74 73 35 45 78 70 72 46 75  ,     fts5ExprFu
110e0 6e 63 74 69 6f 6e 48 72 20 7d 2c 0a 20 20 20 20  nctionHr },.    
110f0 7b 20 22 66 74 73 35 5f 65 78 70 72 5f 74 63 6c  { "fts5_expr_tcl
11100 22 2c 20 66 74 73 35 45 78 70 72 46 75 6e 63 74  ", fts5ExprFunct
11110 69 6f 6e 54 63 6c 20 7d 2c 0a 20 20 20 20 7b 20  ionTcl },.    { 
11120 22 66 74 73 35 5f 69 73 61 6c 6e 75 6d 22 2c 20  "fts5_isalnum", 
11130 20 66 74 73 35 45 78 70 72 49 73 41 6c 6e 75 6d   fts5ExprIsAlnum
11140 20 7d 2c 0a 20 20 20 20 7b 20 22 66 74 73 35 5f   },.    { "fts5_
11150 66 6f 6c 64 22 2c 20 20 20 20 20 66 74 73 35 45  fold",     fts5E
11160 78 70 72 46 6f 6c 64 20 7d 2c 0a 20 20 7d 3b 0a  xprFold },.  };.
11170 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
11180 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11190 20 76 6f 69 64 20 2a 70 43 74 78 20 3d 20 28 76   void *pCtx = (v
111a0 6f 69 64 2a 29 70 47 6c 6f 62 61 6c 3b 0a 0a 20  oid*)pGlobal;.. 
111b0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
111c0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 41 72 72  LITE_OK && i<Arr
111d0 61 79 53 69 7a 65 28 61 46 75 6e 63 29 3b 20 69  aySize(aFunc); i
111e0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
111f0 46 74 73 35 45 78 70 72 46 75 6e 63 20 2a 70 20  Fts5ExprFunc *p 
11200 3d 20 26 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  = &aFunc[i];.   
11210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
11220 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
11230 2c 20 70 2d 3e 7a 2c 20 2d 31 2c 20 53 51 4c 49  , p->z, -1, SQLI
11240 54 45 5f 55 54 46 38 2c 20 70 43 74 78 2c 20 70  TE_UTF8, pCtx, p
11250 2d 3e 78 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ->x, 0, 0);.  }.
11260 0a 20 20 2f 2a 20 41 76 6f 69 64 20 61 20 77 61  .  /* Avoid a wa
11270 72 6e 69 6e 67 20 69 6e 64 69 63 61 74 69 6e 67  rning indicating
11280 20 74 68 61 74 20 73 71 6c 69 74 65 33 46 74 73   that sqlite3Fts
11290 35 50 61 72 73 65 72 54 72 61 63 65 28 29 20 69  5ParserTrace() i
112a0 73 20 75 6e 75 73 65 64 20 2a 2f 0a 23 69 66 6e  s unused */.#ifn
112b0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 28 76 6f  def NDEBUG.  (vo
112c0 69 64 29 73 71 6c 69 74 65 33 46 74 73 35 50 61  id)sqlite3Fts5Pa
112d0 72 73 65 72 54 72 61 63 65 3b 0a 23 65 6e 64 69  rserTrace;.#endi
112e0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
112f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11300 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 68  the number of ph
11310 72 61 73 65 73 20 69 6e 20 65 78 70 72 65 73 73  rases in express
11320 69 6f 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e  ion pExpr..*/.in
11330 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
11340 72 50 68 72 61 73 65 43 6f 75 6e 74 28 46 74 73  rPhraseCount(Fts
11350 35 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  5Expr *pExpr){. 
11360 20 72 65 74 75 72 6e 20 28 70 45 78 70 72 20 3f   return (pExpr ?
11370 20 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 20   pExpr->nPhrase 
11380 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  : 0);.}../*.** R
11390 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
113a0 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
113b0 20 69 50 68 72 61 73 65 27 74 68 20 70 68 72 61   iPhrase'th phra
113c0 73 65 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a  se in pExpr..*/.
113d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
113e0 78 70 72 50 68 72 61 73 65 53 69 7a 65 28 46 74  xprPhraseSize(Ft
113f0 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  s5Expr *pExpr, i
11400 6e 74 20 69 50 68 72 61 73 65 29 7b 0a 20 20 69  nt iPhrase){.  i
11410 66 28 20 69 50 68 72 61 73 65 3c 30 20 7c 7c 20  f( iPhrase<0 || 
11420 69 50 68 72 61 73 65 3e 3d 70 45 78 70 72 2d 3e  iPhrase>=pExpr->
11430 6e 50 68 72 61 73 65 20 29 20 72 65 74 75 72 6e  nPhrase ) return
11440 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78   0;.  return pEx
11450 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  pr->apExprPhrase
11460 5b 69 50 68 72 61 73 65 5d 2d 3e 6e 54 65 72 6d  [iPhrase]->nTerm
11470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11480 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
11490 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 63   to access the c
114a0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
114b0 6c 69 73 74 20 66 6f 72 20 70 68 72 61 73 65 0a  list for phrase.
114c0 2a 2a 20 69 50 68 72 61 73 65 2e 0a 2a 2f 0a 69  ** iPhrase..*/.i
114d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
114e0 70 72 50 6f 73 6c 69 73 74 28 46 74 73 35 45 78  prPoslist(Fts5Ex
114f0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69  pr *pExpr, int i
11500 50 68 72 61 73 65 2c 20 63 6f 6e 73 74 20 75 38  Phrase, const u8
11510 20 2a 2a 70 61 29 7b 0a 20 20 69 6e 74 20 6e 52   **pa){.  int nR
11520 65 74 3b 0a 20 20 46 74 73 35 45 78 70 72 50 68  et;.  Fts5ExprPh
11530 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20  rase *pPhrase = 
11540 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72  pExpr->apExprPhr
11550 61 73 65 5b 69 50 68 72 61 73 65 5d 3b 0a 20 20  ase[iPhrase];.  
11560 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
11570 6f 64 65 20 3d 20 70 50 68 72 61 73 65 2d 3e 70  ode = pPhrase->p
11580 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 4e 6f 64  Node;.  if( pNod
11590 65 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70 4e  e->bEof==0 && pN
115a0 6f 64 65 2d 3e 69 52 6f 77 69 64 3d 3d 70 45 78  ode->iRowid==pEx
115b0 70 72 2d 3e 70 52 6f 6f 74 2d 3e 69 52 6f 77 69  pr->pRoot->iRowi
115c0 64 20 29 7b 0a 20 20 20 20 2a 70 61 20 3d 20 70  d ){.    *pa = p
115d0 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
115e0 70 3b 0a 20 20 20 20 6e 52 65 74 20 3d 20 70 50  p;.    nRet = pP
115f0 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e  hrase->poslist.n
11600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
11610 70 61 20 3d 20 30 3b 0a 20 20 20 20 6e 52 65 74  pa = 0;.    nRet
11620 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
11630 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 73 74 72 75  rn nRet;.}..stru
11640 63 74 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f  ct Fts5PoslistPo
11650 70 75 6c 61 74 6f 72 20 7b 0a 20 20 46 74 73 35  pulator {.  Fts5
11660 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
11670 69 74 65 72 3b 0a 20 20 69 6e 74 20 62 4f 6b 3b  iter;.  int bOk;
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
116a0 69 66 20 6f 6b 20 74 6f 20 70 6f 70 75 6c 61 74  if ok to populat
116b0 65 20 2a 2f 0a 20 20 69 6e 74 20 62 4d 69 73 73  e */.  int bMiss
116c0 3b 0a 7d 3b 0a 0a 46 74 73 35 50 6f 73 6c 69 73  ;.};..Fts5Poslis
116d0 74 50 6f 70 75 6c 61 74 6f 72 20 2a 73 71 6c 69  tPopulator *sqli
116e0 74 65 33 46 74 73 35 45 78 70 72 43 6c 65 61 72  te3Fts5ExprClear
116f0 50 6f 73 6c 69 73 74 73 28 46 74 73 35 45 78 70  Poslists(Fts5Exp
11700 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 62 4c  r *pExpr, int bL
11710 69 76 65 29 7b 0a 20 20 46 74 73 35 50 6f 73 6c  ive){.  Fts5Posl
11720 69 73 74 50 6f 70 75 6c 61 74 6f 72 20 2a 70 52  istPopulator *pR
11730 65 74 3b 0a 20 20 70 52 65 74 20 3d 20 73 71 6c  et;.  pRet = sql
11740 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
11750 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 50 6f  of(Fts5PoslistPo
11760 70 75 6c 61 74 6f 72 29 2a 70 45 78 70 72 2d 3e  pulator)*pExpr->
11770 6e 50 68 72 61 73 65 29 3b 0a 20 20 69 66 28 20  nPhrase);.  if( 
11780 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
11790 69 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52  i;.    memset(pR
117a0 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  et, 0, sizeof(Ft
117b0 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74  s5PoslistPopulat
117c0 6f 72 29 2a 70 45 78 70 72 2d 3e 6e 50 68 72 61  or)*pExpr->nPhra
117d0 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  se);.    for(i=0
117e0 3b 20 69 3c 70 45 78 70 72 2d 3e 6e 50 68 72 61  ; i<pExpr->nPhra
117f0 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  se; i++){.      
11800 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
11810 20 3d 20 26 70 45 78 70 72 2d 3e 61 70 45 78 70   = &pExpr->apExp
11820 72 50 68 72 61 73 65 5b 69 5d 2d 3e 70 6f 73 6c  rPhrase[i]->posl
11830 69 73 74 3b 0a 20 20 20 20 20 20 46 74 73 35 45  ist;.      Fts5E
11840 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d  xprNode *pNode =
11850 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50 68   pExpr->apExprPh
11860 72 61 73 65 5b 69 5d 2d 3e 70 4e 6f 64 65 3b 0a  rase[i]->pNode;.
11870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
11880 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73  xpr->apExprPhras
11890 65 5b 69 5d 2d 3e 6e 54 65 72 6d 3d 3d 31 20 29  e[i]->nTerm==1 )
118a0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4c 69 76  ;.      if( bLiv
118b0 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  e && .          
118c0 28 70 42 75 66 2d 3e 6e 3d 3d 30 20 7c 7c 20 70  (pBuf->n==0 || p
118d0 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 21 3d 70 45  Node->iRowid!=pE
118e0 78 70 72 2d 3e 70 52 6f 6f 74 2d 3e 69 52 6f 77  xpr->pRoot->iRow
118f0 69 64 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 45 6f  id || pNode->bEo
11900 66 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  f).      ){.    
11910 20 20 20 20 70 52 65 74 5b 69 5d 2e 62 4d 69 73      pRet[i].bMis
11920 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  s = 1;.      }el
11930 73 65 7b 0a 20 20 20 20 20 20 20 20 70 42 75 66  se{.        pBuf
11940 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ->n = 0;.      }
11950 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11960 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 72  urn pRet;.}..str
11970 75 63 74 20 46 74 73 35 45 78 70 72 43 74 78 20  uct Fts5ExprCtx 
11980 7b 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  {.  Fts5Expr *pE
11990 78 70 72 3b 0a 20 20 46 74 73 35 50 6f 73 6c 69  xpr;.  Fts5Posli
119a0 73 74 50 6f 70 75 6c 61 74 6f 72 20 2a 61 50 6f  stPopulator *aPo
119b0 70 75 6c 61 74 6f 72 3b 0a 20 20 69 36 34 20 69  pulator;.  i64 i
119c0 4f 66 66 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20  Off;.};.typedef 
119d0 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72 43  struct Fts5ExprC
119e0 74 78 20 46 74 73 35 45 78 70 72 43 74 78 3b 0a  tx Fts5ExprCtx;.
119f0 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b  ./*.** TODO: Mak
11a00 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69  e this more effi
11a10 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63  cient!.*/.static
11a20 20 69 6e 74 20 66 74 73 35 45 78 70 72 43 6f 6c   int fts5ExprCol
11a30 73 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73  setTest(Fts5Cols
11a40 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74  et *pColset, int
11a50 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b   iCol){.  int i;
11a60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
11a70 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  olset->nCol; i++
11a80 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  ){.    if( pCols
11a90 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43  et->aiCol[i]==iC
11aa0 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ol ) return 1;. 
11ab0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
11ac0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
11ad0 35 45 78 70 72 50 6f 70 75 6c 61 74 65 50 6f 73  5ExprPopulatePos
11ae0 6c 69 73 74 73 43 62 28 0a 20 20 76 6f 69 64 20  listsCb(.  void 
11af0 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
11b00 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
11b10 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   2nd argument to
11b20 20 78 54 6f 6b 65 6e 69 7a 65 28 29 20 2a 2f 0a   xTokenize() */.
11b30 20 20 69 6e 74 20 74 66 6c 61 67 73 2c 20 20 20    int tflags,   
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b50 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 54 4f 4b  Mask of FTS5_TOK
11b60 45 4e 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  EN_* flags */.  
11b70 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
11b80 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  en,        /* Po
11b90 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
11ba0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e  containing token
11bb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e   */.  int nToken
11bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11bd0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65   /* Size of toke
11be0 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
11bf0 69 6e 74 20 69 55 6e 75 73 65 64 31 2c 20 20 20  int iUnused1,   
11c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
11c10 74 65 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b  te offset of tok
11c20 65 6e 20 77 69 74 68 69 6e 20 69 6e 70 75 74 20  en within input 
11c30 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 55  text */.  int iU
11c40 6e 75 73 65 64 32 20 20 20 20 20 20 20 20 20 20  nused2          
11c50 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
11c60 73 65 74 20 6f 66 20 65 6e 64 20 6f 66 20 74 6f  set of end of to
11c70 6b 65 6e 20 77 69 74 68 69 6e 20 69 6e 70 75 74  ken within input
11c80 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 46 74   text */.){.  Ft
11c90 73 35 45 78 70 72 43 74 78 20 2a 70 20 3d 20 28  s5ExprCtx *p = (
11ca0 46 74 73 35 45 78 70 72 43 74 78 2a 29 70 43 74  Fts5ExprCtx*)pCt
11cb0 78 3b 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  x;.  Fts5Expr *p
11cc0 45 78 70 72 20 3d 20 70 2d 3e 70 45 78 70 72 3b  Expr = p->pExpr;
11cd0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  .  int i;..  UNU
11ce0 53 45 44 5f 50 41 52 41 4d 32 28 69 55 6e 75 73  SED_PARAM2(iUnus
11cf0 65 64 31 2c 20 69 55 6e 75 73 65 64 32 29 3b 0a  ed1, iUnused2);.
11d00 0a 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3e 46 54  .  if( nToken>FT
11d10 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53 49 5a  S5_MAX_TOKEN_SIZ
11d20 45 20 29 20 6e 54 6f 6b 65 6e 20 3d 20 46 54 53  E ) nToken = FTS
11d30 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53 49 5a 45  5_MAX_TOKEN_SIZE
11d40 3b 0a 20 20 69 66 28 20 28 74 66 6c 61 67 73 20  ;.  if( (tflags 
11d50 26 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c  & FTS5_TOKEN_COL
11d60 4f 43 41 54 45 44 29 3d 3d 30 20 29 20 70 2d 3e  OCATED)==0 ) p->
11d70 69 4f 66 66 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  iOff++;.  for(i=
11d80 30 3b 20 69 3c 70 45 78 70 72 2d 3e 6e 50 68 72  0; i<pExpr->nPhr
11d90 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ase; i++){.    F
11da0 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
11db0 72 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  rm;.    if( p->a
11dc0 50 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e 62 4f 6b  Populator[i].bOk
11dd0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
11de0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 26 70      for(pTerm=&p
11df0 45 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61  Expr->apExprPhra
11e00 73 65 5b 69 5d 2d 3e 61 54 65 72 6d 5b 30 5d 3b  se[i]->aTerm[0];
11e10 20 70 54 65 72 6d 3b 20 70 54 65 72 6d 3d 70 54   pTerm; pTerm=pT
11e20 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a  erm->pSynonym){.
11e30 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20        int nTerm 
11e40 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 54  = (int)strlen(pT
11e50 65 72 6d 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20 20  erm->zTerm);.   
11e60 20 20 20 69 66 28 20 28 6e 54 65 72 6d 3d 3d 6e     if( (nTerm==n
11e70 54 6f 6b 65 6e 20 7c 7c 20 28 6e 54 65 72 6d 3c  Token || (nTerm<
11e80 6e 54 6f 6b 65 6e 20 26 26 20 70 54 65 72 6d 2d  nToken && pTerm-
11e90 3e 62 50 72 65 66 69 78 29 29 0a 20 20 20 20 20  >bPrefix)).     
11ea0 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 65 72    && memcmp(pTer
11eb0 6d 2d 3e 7a 54 65 72 6d 2c 20 70 54 6f 6b 65 6e  m->zTerm, pToken
11ec0 2c 20 6e 54 65 72 6d 29 3d 3d 30 0a 20 20 20 20  , nTerm)==0.    
11ed0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
11ee0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
11ef0 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70  5PoslistWriterAp
11f00 70 65 6e 64 28 0a 20 20 20 20 20 20 20 20 20 20  pend(.          
11f10 20 20 26 70 45 78 70 72 2d 3e 61 70 45 78 70 72    &pExpr->apExpr
11f20 50 68 72 61 73 65 5b 69 5d 2d 3e 70 6f 73 6c 69  Phrase[i]->posli
11f30 73 74 2c 20 26 70 2d 3e 61 50 6f 70 75 6c 61 74  st, &p->aPopulat
11f40 6f 72 5b 69 5d 2e 77 72 69 74 65 72 2c 20 70 2d  or[i].writer, p-
11f50 3e 69 4f 66 66 0a 20 20 20 20 20 20 20 20 29 3b  >iOff.        );
11f60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
11f70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
11f80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11f90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
11fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11fb0 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
11fc0 46 74 73 35 45 78 70 72 50 6f 70 75 6c 61 74 65  Fts5ExprPopulate
11fd0 50 6f 73 6c 69 73 74 73 28 0a 20 20 46 74 73 35  Poslists(.  Fts5
11fe0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
11ff0 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78  .  Fts5Expr *pEx
12000 70 72 2c 20 0a 20 20 46 74 73 35 50 6f 73 6c 69  pr, .  Fts5Posli
12010 73 74 50 6f 70 75 6c 61 74 6f 72 20 2a 61 50 6f  stPopulator *aPo
12020 70 75 6c 61 74 6f 72 2c 0a 20 20 69 6e 74 20 69  pulator,.  int i
12030 43 6f 6c 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Col, .  const ch
12040 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 0a 29 7b 0a  ar *z, int n.){.
12050 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 45    int i;.  Fts5E
12060 78 70 72 43 74 78 20 73 43 74 78 3b 0a 20 20 73  xprCtx sCtx;.  s
12070 43 74 78 2e 70 45 78 70 72 20 3d 20 70 45 78 70  Ctx.pExpr = pExp
12080 72 3b 0a 20 20 73 43 74 78 2e 61 50 6f 70 75 6c  r;.  sCtx.aPopul
12090 61 74 6f 72 20 3d 20 61 50 6f 70 75 6c 61 74 6f  ator = aPopulato
120a0 72 3b 0a 20 20 73 43 74 78 2e 69 4f 66 66 20 3d  r;.  sCtx.iOff =
120b0 20 28 28 28 69 36 34 29 69 43 6f 6c 29 20 3c 3c   (((i64)iCol) <<
120c0 20 33 32 29 20 2d 20 31 3b 0a 0a 20 20 66 6f 72   32) - 1;..  for
120d0 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 6e  (i=0; i<pExpr->n
120e0 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20  Phrase; i++){.  
120f0 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
12100 70 4e 6f 64 65 20 3d 20 70 45 78 70 72 2d 3e 61  pNode = pExpr->a
12110 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e  pExprPhrase[i]->
12120 70 4e 6f 64 65 3b 0a 20 20 20 20 46 74 73 35 43  pNode;.    Fts5C
12130 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d  olset *pColset =
12140 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e 70   pNode->pNear->p
12150 43 6f 6c 73 65 74 3b 0a 20 20 20 20 69 66 28 20  Colset;.    if( 
12160 28 70 43 6f 6c 73 65 74 20 26 26 20 30 3d 3d 66  (pColset && 0==f
12170 74 73 35 45 78 70 72 43 6f 6c 73 65 74 54 65 73  ts5ExprColsetTes
12180 74 28 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29  t(pColset, iCol)
12190 29 20 0a 20 20 20 20 20 7c 7c 20 61 50 6f 70 75  ) .     || aPopu
121a0 6c 61 74 6f 72 5b 69 5d 2e 62 4d 69 73 73 0a 20  lator[i].bMiss. 
121b0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 50 6f 70     ){.      aPop
121c0 75 6c 61 74 6f 72 5b 69 5d 2e 62 4f 6b 20 3d 20  ulator[i].bOk = 
121d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
121e0 20 20 20 20 61 50 6f 70 75 6c 61 74 6f 72 5b 69      aPopulator[i
121f0 5d 2e 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 7d  ].bOk = 1;.    }
12200 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
12210 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69  qlite3Fts5Tokeni
12220 7a 65 28 70 43 6f 6e 66 69 67 2c 20 0a 20 20 20  ze(pConfig, .   
12230 20 20 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45     FTS5_TOKENIZE
12240 5f 44 4f 43 55 4d 45 4e 54 2c 20 7a 2c 20 6e 2c  _DOCUMENT, z, n,
12250 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66   (void*)&sCtx, f
12260 74 73 35 45 78 70 72 50 6f 70 75 6c 61 74 65 50  ts5ExprPopulateP
12270 6f 73 6c 69 73 74 73 43 62 0a 20 20 29 3b 0a 7d  oslistsCb.  );.}
12280 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
12290 73 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69  s5ExprClearPosli
122a0 73 74 73 28 46 74 73 35 45 78 70 72 4e 6f 64 65  sts(Fts5ExprNode
122b0 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 66 28 20   *pNode){.  if( 
122c0 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
122d0 53 35 5f 54 45 52 4d 20 7c 7c 20 70 4e 6f 64 65  S5_TERM || pNode
122e0 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54  ->eType==FTS5_ST
122f0 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 4e 6f 64  RING ){.    pNod
12300 65 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61  e->pNear->apPhra
12310 73 65 5b 30 5d 2d 3e 70 6f 73 6c 69 73 74 2e 6e  se[0]->poslist.n
12320 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12330 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
12340 72 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e  r(i=0; i<pNode->
12350 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nChild; i++){.  
12360 20 20 20 20 66 74 73 35 45 78 70 72 43 6c 65 61      fts5ExprClea
12370 72 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 2d  rPoslists(pNode-
12380 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20  >apChild[i]);.  
12390 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
123a0 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 43 68  c int fts5ExprCh
123b0 65 63 6b 50 6f 73 6c 69 73 74 73 28 46 74 73 35  eckPoslists(Fts5
123c0 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  ExprNode *pNode,
123d0 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20   i64 iRowid){.  
123e0 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20  pNode->iRowid = 
123f0 69 52 6f 77 69 64 3b 0a 20 20 70 4e 6f 64 65 2d  iRowid;.  pNode-
12400 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 73 77 69  >bEof = 0;.  swi
12410 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70  tch( pNode->eTyp
12420 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54  e ){.    case FT
12430 53 35 5f 54 45 52 4d 3a 0a 20 20 20 20 63 61 73  S5_TERM:.    cas
12440 65 20 46 54 53 35 5f 53 54 52 49 4e 47 3a 0a 20  e FTS5_STRING:. 
12450 20 20 20 20 20 72 65 74 75 72 6e 20 28 70 4e 6f       return (pNo
12460 64 65 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72  de->pNear->apPhr
12470 61 73 65 5b 30 5d 2d 3e 70 6f 73 6c 69 73 74 2e  ase[0]->poslist.
12480 6e 3e 30 29 3b 0a 0a 20 20 20 20 63 61 73 65 20  n>0);..    case 
12490 46 54 53 35 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  FTS5_AND: {.    
124a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
124b0 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d  or(i=0; i<pNode-
124c0 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nChild; i++){. 
124d0 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 45         if( fts5E
124e0 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74 73  xprCheckPoslists
124f0 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b  (pNode->apChild[
12500 69 5d 2c 20 69 52 6f 77 69 64 29 3d 3d 30 20 29  i], iRowid)==0 )
12510 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
12520 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73 74  ExprClearPoslist
12530 73 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  s(pNode);.      
12540 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12560 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12570 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 46 54 53   }..    case FTS
12580 35 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  5_OR: {.      in
12590 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  t i;.      int b
125a0 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Ret = 0;.      f
125b0 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d  or(i=0; i<pNode-
125c0 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nChild; i++){. 
125d0 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 45         if( fts5E
125e0 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74 73  xprCheckPoslists
125f0 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b  (pNode->apChild[
12600 69 5d 2c 20 69 52 6f 77 69 64 29 20 29 7b 0a 20  i], iRowid) ){. 
12610 20 20 20 20 20 20 20 20 20 62 52 65 74 20 3d 20           bRet = 
12620 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
12630 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
12640 6e 20 62 52 65 74 3b 0a 20 20 20 20 7d 0a 0a 20  n bRet;.    }.. 
12650 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
12660 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64      assert( pNod
12670 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e  e->eType==FTS5_N
12680 4f 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OT );.      if( 
12690 30 3d 3d 66 74 73 35 45 78 70 72 43 68 65 63 6b  0==fts5ExprCheck
126a0 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 2d 3e  Poslists(pNode->
126b0 61 70 43 68 69 6c 64 5b 30 5d 2c 20 69 52 6f 77  apChild[0], iRow
126c0 69 64 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  id).          ||
126d0 20 30 21 3d 66 74 73 35 45 78 70 72 43 68 65 63   0!=fts5ExprChec
126e0 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 2d  kPoslists(pNode-
126f0 3e 61 70 43 68 69 6c 64 5b 31 5d 2c 20 69 52 6f  >apChild[1], iRo
12700 77 69 64 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  wid).        ){.
12710 20 20 20 20 20 20 20 20 66 74 73 35 45 78 70 72          fts5Expr
12720 43 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 70 4e  ClearPoslists(pN
12730 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ode);.        re
12740 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
12750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12760 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12770 31 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74  1;.}..void sqlit
12780 65 33 46 74 73 35 45 78 70 72 43 68 65 63 6b 50  e3Fts5ExprCheckP
12790 6f 73 6c 69 73 74 73 28 46 74 73 35 45 78 70 72  oslists(Fts5Expr
127a0 20 2a 70 45 78 70 72 2c 20 69 36 34 20 69 52 6f   *pExpr, i64 iRo
127b0 77 69 64 29 7b 0a 20 20 66 74 73 35 45 78 70 72  wid){.  fts5Expr
127c0 43 68 65 63 6b 50 6f 73 6c 69 73 74 73 28 70 45  CheckPoslists(pE
127d0 78 70 72 2d 3e 70 52 6f 6f 74 2c 20 69 52 6f 77  xpr->pRoot, iRow
127e0 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  id);.}../*.** Th
127f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
12800 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 64  nly called for d
12810 65 74 61 69 6c 3d 63 6f 6c 75 6d 6e 73 20 74 61  etail=columns ta
12820 62 6c 65 73 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  bles. .*/.int sq
12830 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72  lite3Fts5ExprPhr
12840 61 73 65 43 6f 6c 6c 69 73 74 28 0a 20 20 46 74  aseCollist(.  Ft
12850 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a  s5Expr *pExpr, .
12860 20 20 69 6e 74 20 69 50 68 72 61 73 65 2c 20 0a    int iPhrase, .
12870 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 43    const u8 **ppC
12880 6f 6c 6c 69 73 74 2c 20 0a 20 20 69 6e 74 20 2a  ollist, .  int *
12890 70 6e 43 6f 6c 6c 69 73 74 0a 29 7b 0a 20 20 46  pnCollist.){.  F
128a0 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
128b0 50 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e  Phrase = pExpr->
128c0 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 50 68  apExprPhrase[iPh
128d0 72 61 73 65 5d 3b 0a 20 20 46 74 73 35 45 78 70  rase];.  Fts5Exp
128e0 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 70  rNode *pNode = p
128f0 50 68 72 61 73 65 2d 3e 70 4e 6f 64 65 3b 0a 20  Phrase->pNode;. 
12900 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12910 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
12920 69 50 68 72 61 73 65 3e 3d 30 20 26 26 20 69 50  iPhrase>=0 && iP
12930 68 72 61 73 65 3c 70 45 78 70 72 2d 3e 6e 50 68  hrase<pExpr->nPh
12940 72 61 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rase );.  assert
12950 28 20 70 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67  ( pExpr->pConfig
12960 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
12970 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29  DETAIL_COLUMNS )
12980 3b 0a 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  ;..  if( pNode->
12990 62 45 6f 66 3d 3d 30 20 0a 20 20 20 26 26 20 70  bEof==0 .   && p
129a0 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 3d 3d 70 45  Node->iRowid==pE
129b0 78 70 72 2d 3e 70 52 6f 6f 74 2d 3e 69 52 6f 77  xpr->pRoot->iRow
129c0 69 64 20 0a 20 20 20 26 26 20 70 50 68 72 61 73  id .   && pPhras
129d0 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3e 30 0a 20  e->poslist.n>0. 
129e0 20 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72   ){.    Fts5Expr
129f0 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
12a00 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d  Phrase->aTerm[0]
12a10 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
12a20 3e 70 53 79 6e 6f 6e 79 6d 20 29 7b 0a 20 20 20  >pSynonym ){.   
12a30 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
12a40 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65  Buf = (Fts5Buffe
12a50 72 2a 29 26 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  r*)&pTerm->pSyno
12a60 6e 79 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 72 63  nym[1];.      rc
12a70 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e   = fts5ExprSynon
12a80 79 6d 4c 69 73 74 28 0a 20 20 20 20 20 20 20 20  ymList(.        
12a90 20 20 70 54 65 72 6d 2c 20 70 4e 6f 64 65 2d 3e    pTerm, pNode->
12aa0 69 52 6f 77 69 64 2c 20 70 42 75 66 2c 20 28 75  iRowid, pBuf, (u
12ab0 38 2a 2a 29 70 70 43 6f 6c 6c 69 73 74 2c 20 70  8**)ppCollist, p
12ac0 6e 43 6f 6c 6c 69 73 74 0a 20 20 20 20 20 20 29  nCollist.      )
12ad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12ae0 20 20 20 2a 70 70 43 6f 6c 6c 69 73 74 20 3d 20     *ppCollist = 
12af0 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30  pPhrase->aTerm[0
12b00 5d 2e 70 49 74 65 72 2d 3e 70 44 61 74 61 3b 0a  ].pIter->pData;.
12b10 20 20 20 20 20 20 2a 70 6e 43 6f 6c 6c 69 73 74        *pnCollist
12b20 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72   = pPhrase->aTer
12b30 6d 5b 30 5d 2e 70 49 74 65 72 2d 3e 6e 44 61 74  m[0].pIter->nDat
12b40 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  a;.    }.  }else
12b50 7b 0a 20 20 20 20 2a 70 70 43 6f 6c 6c 69 73 74  {.    *ppCollist
12b60 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c   = 0;.    *pnCol
12b70 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  list = 0;.  }.. 
12b80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a      return rc;.}..