/ Hex Artifact Content
Login

Artifact c23a2e4c14c401a147c4a730460e5b37057627bf4be95515ee281cd87f4d277c:


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 75 38  5ExprTerm {.  u8
0a80: 20 62 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   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 75 38 20  ix term */.  u8 
0ac0: 62 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  bFirst;         
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0ae0: 54 72 75 65 20 69 66 20 74 6f 6b 65 6e 20 6d 75  True if token mu
0af0: 73 74 20 62 65 20 66 69 72 73 74 20 69 6e 20 63  st be first in c
0b00: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
0b10: 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *zTerm;         
0b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75             /* nu
0b30: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 65 72  l-terminated ter
0b40: 6d 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  m */.  Fts5Index
0b50: 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20  Iter *pIter;    
0b60: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
0b70: 6f 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  or for this term
0b80: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 54 65   */.  Fts5ExprTe
0b90: 72 6d 20 2a 70 53 79 6e 6f 6e 79 6d 3b 20 20 20  rm *pSynonym;   
0ba0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
0bb0: 20 74 6f 20 66 69 72 73 74 20 69 6e 20 6c 69 73   to first in lis
0bc0: 74 20 6f 66 20 73 79 6e 6f 6e 79 6d 73 20 2a 2f  t of synonyms */
0bd0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 68 72  .};../*.** A phr
0be0: 61 73 65 2e 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  ase. One or more
0bf0: 20 74 65 72 6d 73 20 74 68 61 74 20 6d 75 73 74   terms that must
0c00: 20 61 70 70 65 61 72 20 69 6e 20 61 20 63 6f 6e   appear in a con
0c10: 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63 65  tiguous sequence
0c20: 0a 2a 2a 20 77 69 74 68 69 6e 20 61 20 64 6f 63  .** within a doc
0c30: 75 6d 65 6e 74 20 66 6f 72 20 69 74 20 74 6f 20  ument for it to 
0c40: 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 72 75 63 74  match..*/.struct
0c50: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
0c60: 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  {.  Fts5ExprNode
0c70: 20 2a 70 4e 6f 64 65 3b 20 20 20 20 20 20 20 20   *pNode;        
0c80: 20 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 52 49      /* FTS5_STRI
0c90: 4e 47 20 6e 6f 64 65 20 74 68 69 73 20 70 68 72  NG node this phr
0ca0: 61 73 65 20 69 73 20 70 61 72 74 20 6f 66 20 2a  ase is part of *
0cb0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70  /.  Fts5Buffer p
0cc0: 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oslist;         
0cd0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70      /* Current p
0ce0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
0cf0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
0d20: 6e 74 72 69 65 73 20 69 6e 20 61 54 65 72 6d 5b  ntries in aTerm[
0d30: 5d 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 54  ] */.  Fts5ExprT
0d40: 65 72 6d 20 61 54 65 72 6d 5b 31 5d 3b 20 20 20  erm aTerm[1];   
0d50: 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 73 20         /* Terms 
0d60: 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 69  that make up thi
0d70: 73 20 70 68 72 61 73 65 20 2a 2f 0a 7d 3b 0a 0a  s phrase */.};..
0d80: 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72  /*.** One or mor
0d90: 65 20 70 68 72 61 73 65 73 20 74 68 61 74 20 6d  e phrases that m
0da0: 75 73 74 20 61 70 70 65 61 72 20 77 69 74 68 69  ust appear withi
0db0: 6e 20 61 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  n a certain toke
0dc0: 6e 20 64 69 73 74 61 6e 63 65 20 6f 66 0a 2a 2a  n distance of.**
0dd0: 20 65 61 63 68 20 6f 74 68 65 72 20 77 69 74 68   each other with
0de0: 69 6e 20 65 61 63 68 20 6d 61 74 63 68 69 6e 67  in each matching
0df0: 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   document..*/.st
0e00: 72 75 63 74 20 46 74 73 35 45 78 70 72 4e 65 61  ruct Fts5ExprNea
0e10: 72 73 65 74 20 7b 0a 20 20 69 6e 74 20 6e 4e 65  rset {.  int nNe
0e20: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
0e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 45 41 52           /* NEAR
0e40: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
0e50: 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
0e60: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
0e70: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 6f 20 73 65  /* Columns to se
0e80: 61 72 63 68 20 28 4e 55 4c 4c 20 2d 3e 20 61 6c  arch (NULL -> al
0e90: 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20  l columns) */.  
0ea0: 69 6e 74 20 6e 50 68 72 61 73 65 3b 20 20 20 20  int nPhrase;    
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
0ed0: 72 69 65 73 20 69 6e 20 61 50 68 72 61 73 65 5b  ries in aPhrase[
0ee0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
0ef0: 35 45 78 70 72 50 68 72 61 73 65 20 2a 61 70 50  5ExprPhrase *apP
0f00: 68 72 61 73 65 5b 31 5d 3b 20 20 20 20 2f 2a 20  hrase[1];    /* 
0f10: 41 72 72 61 79 20 6f 66 20 70 68 72 61 73 65 20  Array of phrase 
0f20: 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 7d 3b 0a 0a  pointers */.};..
0f30: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 63 6f 6e  ./*.** Parse con
0f40: 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  text..*/.struct 
0f50: 46 74 73 35 50 61 72 73 65 20 7b 0a 20 20 46 74  Fts5Parse {.  Ft
0f60: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
0f70: 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  g;.  char *zErr;
0f80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
0f90: 20 6e 50 68 72 61 73 65 3b 20 20 20 20 20 20 20   nPhrase;       
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fb0: 53 69 7a 65 20 6f 66 20 61 70 50 68 72 61 73 65  Size of apPhrase
0fc0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35   array */.  Fts5
0fd0: 45 78 70 72 50 68 72 61 73 65 20 2a 2a 61 70 50  ExprPhrase **apP
0fe0: 68 72 61 73 65 3b 20 20 20 20 20 20 2f 2a 20 41  hrase;      /* A
0ff0: 72 72 61 79 20 6f 66 20 61 6c 6c 20 70 68 72 61  rray of all phra
1000: 73 65 73 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  ses */.  Fts5Exp
1010: 72 4e 6f 64 65 20 2a 70 45 78 70 72 3b 20 20 20  rNode *pExpr;   
1020: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1030: 6c 74 20 6f 66 20 61 20 73 75 63 63 65 73 73 66  lt of a successf
1040: 75 6c 20 70 61 72 73 65 20 2a 2f 0a 7d 3b 0a 0a  ul parse */.};..
1050: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
1060: 50 61 72 73 65 45 72 72 6f 72 28 46 74 73 35 50  ParseError(Fts5P
1070: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1080: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
1090: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
10a0: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
10b0: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 69 66 28 20  p, zFmt);.  if( 
10c0: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
10d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
10e0: 72 73 65 2d 3e 7a 45 72 72 20 3d 20 73 71 6c 69  rse->zErr = sqli
10f0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
1100: 74 2c 20 61 70 29 3b 0a 20 20 20 20 70 50 61 72  t, ap);.    pPar
1110: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1120: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 76 61 5f  ERROR;.  }.  va_
1130: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 73 74 61 74  end(ap);.}..stat
1140: 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 49  ic int fts5ExprI
1150: 73 73 70 61 63 65 28 63 68 61 72 20 74 29 7b 0a  sspace(char t){.
1160: 20 20 72 65 74 75 72 6e 20 74 3d 3d 27 20 27 20    return t==' ' 
1170: 7c 7c 20 74 3d 3d 27 5c 74 27 20 7c 7c 20 74 3d  || t=='\t' || t=
1180: 3d 27 5c 6e 27 20 7c 7c 20 74 3d 3d 27 5c 72 27  ='\n' || t=='\r'
1190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
11a0: 74 68 65 20 66 69 72 73 74 20 74 6f 6b 65 6e 20  the first token 
11b0: 66 72 6f 6d 20 74 68 65 20 6e 75 6c 2d 74 65 72  from the nul-ter
11c0: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 61  minated string a
11d0: 74 20 2a 70 7a 2e 0a 2a 2f 0a 73 74 61 74 69 63  t *pz..*/.static
11e0: 20 69 6e 74 20 66 74 73 35 45 78 70 72 47 65 74   int fts5ExprGet
11f0: 54 6f 6b 65 6e 28 0a 20 20 46 74 73 35 50 61 72  Token(.  Fts5Par
1200: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 63  se *pParse, .  c
1210: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20  onst char **pz, 
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1230: 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
1240: 72 20 69 6e 74 6f 20 62 75 66 66 65 72 20 2a 2f  r into buffer */
1250: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54  .  Fts5Token *pT
1260: 6f 6b 65 6e 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  oken.){.  const 
1270: 63 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20  char *z = *pz;. 
1280: 20 69 6e 74 20 74 6f 6b 3b 0a 0a 20 20 2f 2a 20   int tok;..  /* 
1290: 53 6b 69 70 20 70 61 73 74 20 61 6e 79 20 77 68  Skip past any wh
12a0: 69 74 65 73 70 61 63 65 20 2a 2f 0a 20 20 77 68  itespace */.  wh
12b0: 69 6c 65 28 20 66 74 73 35 45 78 70 72 49 73 73  ile( fts5ExprIss
12c0: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
12d0: 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70 20 3d 20 7a  .  pToken->p = z
12e0: 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 6e 20 3d 20  ;.  pToken->n = 
12f0: 31 3b 0a 20 20 73 77 69 74 63 68 28 20 2a 7a 20  1;.  switch( *z 
1300: 29 7b 0a 20 20 20 20 63 61 73 65 20 27 28 27 3a  ){.    case '(':
1310: 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4c 50 3b    tok = FTS5_LP;
1320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1330: 61 73 65 20 27 29 27 3a 20 20 74 6f 6b 20 3d 20  ase ')':  tok = 
1340: 46 54 53 35 5f 52 50 3b 20 20 20 20 62 72 65 61  FTS5_RP;    brea
1350: 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 7b 27 3a  k;.    case '{':
1360: 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4c 43 50    tok = FTS5_LCP
1370: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
1380: 61 73 65 20 27 7d 27 3a 20 20 74 6f 6b 20 3d 20  ase '}':  tok = 
1390: 46 54 53 35 5f 52 43 50 3b 20 20 20 62 72 65 61  FTS5_RCP;   brea
13a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 3a 27 3a  k;.    case ':':
13b0: 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 43 4f 4c    tok = FTS5_COL
13c0: 4f 4e 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ON; break;.    c
13d0: 61 73 65 20 27 2c 27 3a 20 20 74 6f 6b 20 3d 20  ase ',':  tok = 
13e0: 46 54 53 35 5f 43 4f 4d 4d 41 3b 20 62 72 65 61  FTS5_COMMA; brea
13f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 2b 27 3a  k;.    case '+':
1400: 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 50 4c 55    tok = FTS5_PLU
1410: 53 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  S;  break;.    c
1420: 61 73 65 20 27 2a 27 3a 20 20 74 6f 6b 20 3d 20  ase '*':  tok = 
1430: 46 54 53 35 5f 53 54 41 52 3b 20 20 62 72 65 61  FTS5_STAR;  brea
1440: 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 2d 27 3a  k;.    case '-':
1450: 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4d 49 4e    tok = FTS5_MIN
1460: 55 53 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  US; break;.    c
1470: 61 73 65 20 27 5e 27 3a 20 20 74 6f 6b 20 3d 20  ase '^':  tok = 
1480: 46 54 53 35 5f 43 41 52 45 54 3b 20 62 72 65 61  FTS5_CARET; brea
1490: 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 5c 30 27  k;.    case '\0'
14a0: 3a 20 74 6f 6b 20 3d 20 46 54 53 35 5f 45 4f 46  : tok = FTS5_EOF
14b0: 3b 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  ;   break;..    
14c0: 63 61 73 65 20 27 22 27 3a 20 7b 0a 20 20 20 20  case '"': {.    
14d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
14e0: 3b 0a 20 20 20 20 20 20 74 6f 6b 20 3d 20 46 54  ;.      tok = FT
14f0: 53 35 5f 53 54 52 49 4e 47 3b 0a 0a 20 20 20 20  S5_STRING;..    
1500: 20 20 66 6f 72 28 7a 32 3d 26 7a 5b 31 5d 3b 20    for(z2=&z[1]; 
1510: 31 3b 20 7a 32 2b 2b 29 7b 0a 20 20 20 20 20 20  1; z2++){.      
1520: 20 20 69 66 28 20 7a 32 5b 30 5d 3d 3d 27 22 27    if( z2[0]=='"'
1530: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 32   ){.          z2
1540: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
1550: 28 20 7a 32 5b 30 5d 21 3d 27 22 27 20 29 20 62  ( z2[0]!='"' ) b
1560: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1570: 20 20 20 20 20 20 20 20 69 66 28 20 7a 32 5b 30          if( z2[0
1580: 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 20  ]=='\0' ){.     
1590: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
15a0: 50 61 72 73 65 45 72 72 6f 72 28 70 50 61 72 73  ParseError(pPars
15b0: 65 2c 20 22 75 6e 74 65 72 6d 69 6e 61 74 65 64  e, "unterminated
15c0: 20 73 74 72 69 6e 67 22 29 3b 0a 20 20 20 20 20   string");.     
15d0: 20 20 20 20 20 72 65 74 75 72 6e 20 46 54 53 35       return FTS5
15e0: 5f 45 4f 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _EOF;.        }.
15f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
1600: 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a 32 20 2d 20  oken->n = (z2 - 
1610: 7a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  z);.      break;
1620: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
1630: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ult: {.      con
1640: 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20  st char *z2;.   
1650: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74     if( sqlite3Ft
1660: 73 35 49 73 42 61 72 65 77 6f 72 64 28 7a 5b 30  s5IsBareword(z[0
1670: 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])==0 ){.       
1680: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
1690: 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 22  eError(pParse, "
16a0: 66 74 73 35 3a 20 73 79 6e 74 61 78 20 65 72 72  fts5: syntax err
16b0: 6f 72 20 6e 65 61 72 20 5c 22 25 2e 31 73 5c 22  or near \"%.1s\"
16c0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  ", z);.        r
16d0: 65 74 75 72 6e 20 46 54 53 35 5f 45 4f 46 3b 0a  eturn FTS5_EOF;.
16e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 6f        }.      to
16f0: 6b 20 3d 20 46 54 53 35 5f 53 54 52 49 4e 47 3b  k = FTS5_STRING;
1700: 0a 20 20 20 20 20 20 66 6f 72 28 7a 32 3d 26 7a  .      for(z2=&z
1710: 5b 31 5d 3b 20 73 71 6c 69 74 65 33 46 74 73 35  [1]; sqlite3Fts5
1720: 49 73 42 61 72 65 77 6f 72 64 28 2a 7a 32 29 3b  IsBareword(*z2);
1730: 20 7a 32 2b 2b 29 3b 0a 20 20 20 20 20 20 70 54   z2++);.      pT
1740: 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a 32 20 2d 20  oken->n = (z2 - 
1750: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  z);.      if( pT
1760: 6f 6b 65 6e 2d 3e 6e 3d 3d 32 20 26 26 20 6d 65  oken->n==2 && me
1770: 6d 63 6d 70 28 70 54 6f 6b 65 6e 2d 3e 70 2c 20  mcmp(pToken->p, 
1780: 22 4f 52 22 2c 20 32 29 3d 3d 30 20 29 20 20 74  "OR", 2)==0 )  t
1790: 6f 6b 20 3d 20 46 54 53 35 5f 4f 52 3b 0a 20 20  ok = FTS5_OR;.  
17a0: 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
17b0: 6e 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 70  n==3 && memcmp(p
17c0: 54 6f 6b 65 6e 2d 3e 70 2c 20 22 4e 4f 54 22 2c  Token->p, "NOT",
17d0: 20 33 29 3d 3d 30 20 29 20 74 6f 6b 20 3d 20 46   3)==0 ) tok = F
17e0: 54 53 35 5f 4e 4f 54 3b 0a 20 20 20 20 20 20 69  TS5_NOT;.      i
17f0: 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 33 20  f( pToken->n==3 
1800: 26 26 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e  && memcmp(pToken
1810: 2d 3e 70 2c 20 22 41 4e 44 22 2c 20 33 29 3d 3d  ->p, "AND", 3)==
1820: 30 20 29 20 74 6f 6b 20 3d 20 46 54 53 35 5f 41  0 ) tok = FTS5_A
1830: 4e 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ND;.      break;
1840: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
1850: 7a 20 3d 20 26 70 54 6f 6b 65 6e 2d 3e 70 5b 70  z = &pToken->p[p
1860: 54 6f 6b 65 6e 2d 3e 6e 5d 3b 0a 20 20 72 65 74  Token->n];.  ret
1870: 75 72 6e 20 74 6f 6b 3b 0a 7d 0a 0a 73 74 61 74  urn tok;.}..stat
1880: 69 63 20 76 6f 69 64 20 2a 66 74 73 35 50 61 72  ic void *fts5Par
1890: 73 65 41 6c 6c 6f 63 28 75 36 34 20 74 29 7b 20  seAlloc(u64 t){ 
18a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
18b0: 61 6c 6c 6f 63 28 28 69 6e 74 29 74 29 3b 20 7d  alloc((int)t); }
18c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18d0: 35 50 61 72 73 65 46 72 65 65 28 76 6f 69 64 20  5ParseFree(void 
18e0: 2a 70 29 7b 20 73 71 6c 69 74 65 33 5f 66 72 65  *p){ sqlite3_fre
18f0: 65 28 70 29 3b 20 7d 0a 0a 69 6e 74 20 73 71 6c  e(p); }..int sql
1900: 69 74 65 33 46 74 73 35 45 78 70 72 4e 65 77 28  ite3Fts5ExprNew(
1910: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
1920: 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20  Config,         
1930: 20 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69     /* FTS5 Confi
1940: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  guration */.  in
1950: 74 20 69 43 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20  t iCol,.  const 
1960: 63 68 61 72 20 2a 7a 45 78 70 72 2c 20 20 20 20  char *zExpr,    
1970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
1980: 72 65 73 73 69 6f 6e 20 74 65 78 74 20 2a 2f 0a  ression text */.
1990: 20 20 46 74 73 35 45 78 70 72 20 2a 2a 70 70 4e    Fts5Expr **ppN
19a0: 65 77 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a  ew, .  char **pz
19b0: 45 72 72 0a 29 7b 0a 20 20 46 74 73 35 50 61 72  Err.){.  Fts5Par
19c0: 73 65 20 73 50 61 72 73 65 3b 0a 20 20 46 74 73  se sParse;.  Fts
19d0: 35 54 6f 6b 65 6e 20 74 6f 6b 65 6e 3b 0a 20 20  5Token token;.  
19e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
19f0: 7a 45 78 70 72 3b 0a 20 20 69 6e 74 20 74 3b 20  zExpr;.  int t; 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1a20: 20 74 6f 6b 65 6e 20 74 79 70 65 20 2a 2f 0a 20   token type */. 
1a30: 20 76 6f 69 64 20 2a 70 45 6e 67 69 6e 65 3b 0a   void *pEngine;.
1a40: 20 20 46 74 73 35 45 78 70 72 20 2a 70 4e 65 77    Fts5Expr *pNew
1a50: 3b 0a 0a 20 20 2a 70 70 4e 65 77 20 3d 20 30 3b  ;..  *ppNew = 0;
1a60: 0a 20 20 2a 70 7a 45 72 72 20 3d 20 30 3b 0a 20  .  *pzErr = 0;. 
1a70: 20 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c   memset(&sParse,
1a80: 20 30 2c 20 73 69 7a 65 6f 66 28 73 50 61 72 73   0, sizeof(sPars
1a90: 65 29 29 3b 0a 20 20 70 45 6e 67 69 6e 65 20 3d  e));.  pEngine =
1aa0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
1ab0: 65 72 41 6c 6c 6f 63 28 66 74 73 35 50 61 72 73  erAlloc(fts5Pars
1ac0: 65 41 6c 6c 6f 63 29 3b 0a 20 20 69 66 28 20 70  eAlloc);.  if( p
1ad0: 45 6e 67 69 6e 65 3d 3d 30 20 29 7b 20 72 65 74  Engine==0 ){ ret
1ae0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1af0: 3b 20 7d 0a 20 20 73 50 61 72 73 65 2e 70 43 6f  ; }.  sParse.pCo
1b00: 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a  nfig = pConfig;.
1b10: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 74 20 3d 20  .  do {.    t = 
1b20: 66 74 73 35 45 78 70 72 47 65 74 54 6f 6b 65 6e  fts5ExprGetToken
1b30: 28 26 73 50 61 72 73 65 2c 20 26 7a 2c 20 26 74  (&sParse, &z, &t
1b40: 6f 6b 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  oken);.    sqlit
1b50: 65 33 46 74 73 35 50 61 72 73 65 72 28 70 45 6e  e3Fts5Parser(pEn
1b60: 67 69 6e 65 2c 20 74 2c 20 74 6f 6b 65 6e 2c 20  gine, t, token, 
1b70: 26 73 50 61 72 73 65 29 3b 0a 20 20 7d 77 68 69  &sParse);.  }whi
1b80: 6c 65 28 20 73 50 61 72 73 65 2e 72 63 3d 3d 53  le( sParse.rc==S
1b90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 74 21 3d 46  QLITE_OK && t!=F
1ba0: 54 53 35 5f 45 4f 46 20 29 3b 0a 20 20 73 71 6c  TS5_EOF );.  sql
1bb0: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 46 72  ite3Fts5ParserFr
1bc0: 65 65 28 70 45 6e 67 69 6e 65 2c 20 66 74 73 35  ee(pEngine, fts5
1bd0: 50 61 72 73 65 46 72 65 65 29 3b 0a 0a 20 20 2f  ParseFree);..  /
1be0: 2a 20 49 66 20 74 68 65 20 4c 48 53 20 6f 66 20  * If the LHS of 
1bf0: 74 68 65 20 4d 41 54 43 48 20 65 78 70 72 65 73  the MATCH expres
1c00: 73 69 6f 6e 20 77 61 73 20 61 20 75 73 65 72 20  sion was a user 
1c10: 63 6f 6c 75 6d 6e 2c 20 61 70 70 6c 79 20 74 68  column, apply th
1c20: 65 0a 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20  e.  ** implicit 
1c30: 63 6f 6c 75 6d 6e 2d 66 69 6c 74 65 72 2e 20 20  column-filter.  
1c40: 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 70 43  */.  if( iCol<pC
1c50: 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20 26 26 20 73  onfig->nCol && s
1c60: 50 61 72 73 65 2e 70 45 78 70 72 20 26 26 20 73  Parse.pExpr && s
1c70: 50 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45  Parse.rc==SQLITE
1c80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
1c90: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f   = sizeof(Fts5Co
1ca0: 6c 73 65 74 29 3b 0a 20 20 20 20 46 74 73 35 43  lset);.    Fts5C
1cb0: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d  olset *pColset =
1cc0: 20 28 46 74 73 35 43 6f 6c 73 65 74 2a 29 73 71   (Fts5Colset*)sq
1cd0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
1ce0: 65 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c 20  ero(&sParse.rc, 
1cf0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  n);.    if( pCol
1d00: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  set ){.      pCo
1d10: 6c 73 65 74 2d 3e 6e 43 6f 6c 20 3d 20 31 3b 0a  lset->nCol = 1;.
1d20: 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2d 3e 61        pColset->a
1d30: 69 43 6f 6c 5b 30 5d 20 3d 20 69 43 6f 6c 3b 0a  iCol[0] = iCol;.
1d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1d50: 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28  5ParseSetColset(
1d60: 26 73 50 61 72 73 65 2c 20 73 50 61 72 73 65 2e  &sParse, sParse.
1d70: 70 45 78 70 72 2c 20 70 43 6f 6c 73 65 74 29 3b  pExpr, pColset);
1d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1d90: 73 65 72 74 28 20 73 50 61 72 73 65 2e 72 63 21  sert( sParse.rc!
1da0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 50  =SQLITE_OK || sP
1db0: 61 72 73 65 2e 7a 45 72 72 3d 3d 30 20 29 3b 0a  arse.zErr==0 );.
1dc0: 20 20 69 66 28 20 73 50 61 72 73 65 2e 72 63 3d    if( sParse.rc=
1dd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1de0: 20 20 2a 70 70 4e 65 77 20 3d 20 70 4e 65 77 20    *ppNew = pNew 
1df0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1e00: 28 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72  (sizeof(Fts5Expr
1e10: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
1e20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 50 61  ==0 ){.      sPa
1e30: 72 73 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f  rse.rc = SQLITE_
1e40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 73 71 6c  NOMEM;.      sql
1e50: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64  ite3Fts5ParseNod
1e60: 65 46 72 65 65 28 73 50 61 72 73 65 2e 70 45 78  eFree(sParse.pEx
1e70: 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pr);.    }else{.
1e80: 20 20 20 20 20 20 69 66 28 20 21 73 50 61 72 73        if( !sPars
1e90: 65 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  e.pExpr ){.     
1ea0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79     const int nBy
1eb0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
1ec0: 45 78 70 72 4e 6f 64 65 29 3b 0a 20 20 20 20 20  ExprNode);.     
1ed0: 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20 3d     pNew->pRoot =
1ee0: 20 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29   (Fts5ExprNode*)
1ef0: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
1f00: 63 5a 65 72 6f 28 26 73 50 61 72 73 65 2e 72 63  cZero(&sParse.rc
1f10: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
1f20: 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 52 6f 6f    if( pNew->pRoo
1f30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
1f40: 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 62 45 6f 66  New->pRoot->bEof
1f50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
1f60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f70: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74       pNew->pRoot
1f80: 20 3d 20 73 50 61 72 73 65 2e 70 45 78 70 72 3b   = sParse.pExpr;
1f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1fa0: 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b  New->pIndex = 0;
1fb0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f  .      pNew->pCo
1fc0: 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a  nfig = pConfig;.
1fd0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 70 45 78        pNew->apEx
1fe0: 70 72 50 68 72 61 73 65 20 3d 20 73 50 61 72 73  prPhrase = sPars
1ff0: 65 2e 61 70 50 68 72 61 73 65 3b 0a 20 20 20 20  e.apPhrase;.    
2000: 20 20 70 4e 65 77 2d 3e 6e 50 68 72 61 73 65 20    pNew->nPhrase 
2010: 3d 20 73 50 61 72 73 65 2e 6e 50 68 72 61 73 65  = sParse.nPhrase
2020: 3b 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e 61  ;.      sParse.a
2030: 70 50 68 72 61 73 65 20 3d 20 30 3b 0a 20 20 20  pPhrase = 0;.   
2040: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2050: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
2060: 4e 6f 64 65 46 72 65 65 28 73 50 61 72 73 65 2e  NodeFree(sParse.
2070: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 73  pExpr);.  }..  s
2080: 71 6c 69 74 65 33 5f 66 72 65 65 28 73 50 61 72  qlite3_free(sPar
2090: 73 65 2e 61 70 50 68 72 61 73 65 29 3b 0a 20 20  se.apPhrase);.  
20a0: 2a 70 7a 45 72 72 20 3d 20 73 50 61 72 73 65 2e  *pzErr = sParse.
20b0: 7a 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  zErr;.  return s
20c0: 50 61 72 73 65 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  Parse.rc;.}../*.
20d0: 2a 2a 20 46 72 65 65 20 74 68 65 20 65 78 70 72  ** Free the expr
20e0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 6f 62 6a 65  ession node obje
20f0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2100: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
2110: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
2120: 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65  ts5ParseNodeFree
2130: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70  (Fts5ExprNode *p
2140: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
2150: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
2160: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
2170: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  d; i++){.      s
2180: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
2190: 6f 64 65 46 72 65 65 28 70 2d 3e 61 70 43 68 69  odeFree(p->apChi
21a0: 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ld[i]);.    }.  
21b0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
21c0: 73 65 4e 65 61 72 73 65 74 46 72 65 65 28 70 2d  seNearsetFree(p-
21d0: 3e 70 4e 65 61 72 29 3b 0a 20 20 20 20 73 71 6c  >pNear);.    sql
21e0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
21f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
2200: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
2210: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
2220: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
2230: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
2240: 65 33 46 74 73 35 45 78 70 72 46 72 65 65 28 46  e3Fts5ExprFree(F
2250: 74 73 35 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ts5Expr *p){.  i
2260: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
2270: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
2280: 46 72 65 65 28 70 2d 3e 70 52 6f 6f 74 29 3b 0a  Free(p->pRoot);.
2290: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22a0: 28 70 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  (p->apExprPhrase
22b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
22c0: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
22d0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 54  *.** Argument pT
22e0: 65 72 6d 20 6d 75 73 74 20 62 65 20 61 20 73 79  erm must be a sy
22f0: 6e 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e 20  nonym iterator. 
2300: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
2310: 6e 74 20 72 6f 77 69 64 0a 2a 2a 20 74 68 61 74  nt rowid.** that
2320: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a   it points to..*
2330: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  /.static i64 fts
2340: 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69  5ExprSynonymRowi
2350: 64 28 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a  d(Fts5ExprTerm *
2360: 70 54 65 72 6d 2c 20 69 6e 74 20 62 44 65 73 63  pTerm, int bDesc
2370: 2c 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20  , int *pbEof){. 
2380: 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a 20   i64 iRet = 0;. 
2390: 20 69 6e 74 20 62 52 65 74 56 61 6c 69 64 20 3d   int bRetValid =
23a0: 20 30 3b 0a 20 20 46 74 73 35 45 78 70 72 54 65   0;.  Fts5ExprTe
23b0: 72 6d 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  rm *p;..  assert
23c0: 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79  ( pTerm->pSynony
23d0: 6d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62  m );.  assert( b
23e0: 44 65 73 63 3d 3d 30 20 7c 7c 20 62 44 65 73 63  Desc==0 || bDesc
23f0: 3d 3d 31 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ==1 );.  for(p=p
2400: 54 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53  Term; p; p=p->pS
2410: 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 69 66 28  ynonym){.    if(
2420: 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49   0==sqlite3Fts5I
2430: 74 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29  terEof(p->pIter)
2440: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
2450: 6f 77 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d  owid = p->pIter-
2460: 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69  >iRowid;.      i
2470: 66 28 20 62 52 65 74 56 61 6c 69 64 3d 3d 30 20  f( bRetValid==0 
2480: 7c 7c 20 28 62 44 65 73 63 21 3d 28 69 52 6f 77  || (bDesc!=(iRow
2490: 69 64 3c 69 52 65 74 29 29 20 29 7b 0a 20 20 20  id<iRet)) ){.   
24a0: 20 20 20 20 20 69 52 65 74 20 3d 20 69 52 6f 77       iRet = iRow
24b0: 69 64 3b 0a 20 20 20 20 20 20 20 20 62 52 65 74  id;.        bRet
24c0: 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
24d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
24e0: 69 66 28 20 70 62 45 6f 66 20 26 26 20 62 52 65  if( pbEof && bRe
24f0: 74 56 61 6c 69 64 3d 3d 30 20 29 20 2a 70 62 45  tValid==0 ) *pbE
2500: 6f 66 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  of = 1;.  return
2510: 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
2520: 41 72 67 75 6d 65 6e 74 20 70 54 65 72 6d 20 6d  Argument pTerm m
2530: 75 73 74 20 62 65 20 61 20 73 79 6e 6f 6e 79 6d  ust be a synonym
2540: 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   iterator..*/.st
2550: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
2560: 72 53 79 6e 6f 6e 79 6d 4c 69 73 74 28 0a 20 20  rSynonymList(.  
2570: 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
2580: 65 72 6d 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  erm, .  i64 iRow
2590: 69 64 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  id,.  Fts5Buffer
25a0: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
25b0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
25c0: 73 20 62 75 66 66 65 72 20 66 6f 72 20 73 70 61  s buffer for spa
25d0: 63 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  ce if required *
25e0: 2f 0a 20 20 75 38 20 2a 2a 70 61 2c 20 69 6e 74  /.  u8 **pa, int
25f0: 20 2a 70 6e 0a 29 7b 0a 20 20 46 74 73 35 50 6f   *pn.){.  Fts5Po
2600: 73 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61  slistReader aSta
2610: 74 69 63 5b 34 5d 3b 0a 20 20 46 74 73 35 50 6f  tic[4];.  Fts5Po
2620: 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49 74  slistReader *aIt
2630: 65 72 20 3d 20 61 53 74 61 74 69 63 3b 0a 20 20  er = aStatic;.  
2640: 69 6e 74 20 6e 49 74 65 72 20 3d 20 30 3b 0a 20  int nIter = 0;. 
2650: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 34 3b   int nAlloc = 4;
2660: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2670: 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 45 78 70  TE_OK;.  Fts5Exp
2680: 72 54 65 72 6d 20 2a 70 3b 0a 0a 20 20 61 73 73  rTerm *p;..  ass
2690: 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e  ert( pTerm->pSyn
26a0: 6f 6e 79 6d 20 29 3b 0a 20 20 66 6f 72 28 70 3d  onym );.  for(p=
26b0: 70 54 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70  pTerm; p; p=p->p
26c0: 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 46 74  Synonym){.    Ft
26d0: 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
26e0: 65 72 20 3d 20 70 2d 3e 70 49 74 65 72 3b 0a 20  er = p->pIter;. 
26f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74     if( sqlite3Ft
2700: 73 35 49 74 65 72 45 6f 66 28 70 49 74 65 72 29  s5IterEof(pIter)
2710: 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52  ==0 && pIter->iR
2720: 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 7b 0a  owid==iRowid ){.
2730: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
2740: 3e 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74  >nData==0 ) cont
2750: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2760: 6e 49 74 65 72 3d 3d 6e 41 6c 6c 6f 63 20 29 7b  nIter==nAlloc ){
2770: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
2780: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
2790: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 29 20 2a  PoslistReader) *
27a0: 20 6e 41 6c 6c 6f 63 20 2a 20 32 3b 0a 20 20 20   nAlloc * 2;.   
27b0: 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
27c0: 52 65 61 64 65 72 20 2a 61 4e 65 77 20 3d 20 28  Reader *aNew = (
27d0: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
27e0: 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  r*)sqlite3_mallo
27f0: 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  c(nByte);.      
2800: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
2810: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2820: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2830: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e          goto syn
2840: 6f 6e 79 6d 5f 70 6f 73 6c 69 73 74 5f 6f 75 74  onym_poslist_out
2850: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2860: 20 20 20 20 6d 65 6d 63 70 79 28 61 4e 65 77 2c      memcpy(aNew,
2870: 20 61 49 74 65 72 2c 20 73 69 7a 65 6f 66 28 46   aIter, sizeof(F
2880: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2890: 29 20 2a 20 6e 49 74 65 72 29 3b 0a 20 20 20 20  ) * nIter);.    
28a0: 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c      nAlloc = nAl
28b0: 6c 6f 63 2a 32 3b 0a 20 20 20 20 20 20 20 20 69  loc*2;.        i
28c0: 66 28 20 61 49 74 65 72 21 3d 61 53 74 61 74 69  f( aIter!=aStati
28d0: 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  c ) sqlite3_free
28e0: 28 61 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20  (aIter);.       
28f0: 20 61 49 74 65 72 20 3d 20 61 4e 65 77 3b 0a 20   aIter = aNew;. 
2900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2910: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
2920: 65 61 64 65 72 49 6e 69 74 28 70 49 74 65 72 2d  eaderInit(pIter-
2930: 3e 70 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 6e  >pData, pIter->n
2940: 44 61 74 61 2c 20 26 61 49 74 65 72 5b 6e 49 74  Data, &aIter[nIt
2950: 65 72 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er]);.      asse
2960: 72 74 28 20 61 49 74 65 72 5b 6e 49 74 65 72 5d  rt( aIter[nIter]
2970: 2e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20  .bEof==0 );.    
2980: 20 20 6e 49 74 65 72 2b 2b 3b 0a 20 20 20 20 7d    nIter++;.    }
2990: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 49 74 65  .  }..  if( nIte
29a0: 72 3d 3d 31 20 29 7b 0a 20 20 20 20 2a 70 61 20  r==1 ){.    *pa 
29b0: 3d 20 28 75 38 2a 29 61 49 74 65 72 5b 30 5d 2e  = (u8*)aIter[0].
29c0: 61 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 61 49 74  a;.    *pn = aIt
29d0: 65 72 5b 30 5d 2e 6e 3b 0a 20 20 7d 65 6c 73 65  er[0].n;.  }else
29e0: 7b 0a 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73  {.    Fts5Poslis
29f0: 74 57 72 69 74 65 72 20 77 72 69 74 65 72 20 3d  tWriter writer =
2a00: 20 7b 30 7d 3b 0a 20 20 20 20 69 36 34 20 69 50   {0};.    i64 iP
2a10: 72 65 76 20 3d 20 2d 31 3b 0a 20 20 20 20 66 74  rev = -1;.    ft
2a20: 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75  s5BufferZero(pBu
2a30: 66 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31  f);.    while( 1
2a40: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
2a50: 0a 20 20 20 20 20 20 69 36 34 20 69 4d 69 6e 20  .      i64 iMin 
2a60: 3d 20 46 54 53 35 5f 4c 41 52 47 45 53 54 5f 49  = FTS5_LARGEST_I
2a70: 4e 54 36 34 3b 0a 20 20 20 20 20 20 66 6f 72 28  NT64;.      for(
2a80: 69 3d 30 3b 20 69 3c 6e 49 74 65 72 3b 20 69 2b  i=0; i<nIter; i+
2a90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2aa0: 61 49 74 65 72 5b 69 5d 2e 62 45 6f 66 3d 3d 30  aIter[i].bEof==0
2ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2ac0: 28 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73 3d  ( aIter[i].iPos=
2ad0: 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  =iPrev ){.      
2ae0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2af0: 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
2b00: 65 72 4e 65 78 74 28 26 61 49 74 65 72 5b 69 5d  erNext(&aIter[i]
2b10: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2b20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b30: 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d      if( aIter[i]
2b40: 2e 69 50 6f 73 3c 69 4d 69 6e 20 29 7b 0a 20 20  .iPos<iMin ){.  
2b50: 20 20 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d            iMin =
2b60: 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73 3b 0a   aIter[i].iPos;.
2b70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b90: 20 20 20 20 69 66 28 20 69 4d 69 6e 3d 3d 46 54      if( iMin==FT
2ba0: 53 35 5f 4c 41 52 47 45 53 54 5f 49 4e 54 36 34  S5_LARGEST_INT64
2bb0: 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
2bc0: 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K ) break;.     
2bd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
2be0: 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70  5PoslistWriterAp
2bf0: 70 65 6e 64 28 70 42 75 66 2c 20 26 77 72 69 74  pend(pBuf, &writ
2c00: 65 72 2c 20 69 4d 69 6e 29 3b 0a 20 20 20 20 20  er, iMin);.     
2c10: 20 69 50 72 65 76 20 3d 20 69 4d 69 6e 3b 0a 20   iPrev = iMin;. 
2c20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2c30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c40: 20 20 20 20 2a 70 61 20 3d 20 70 42 75 66 2d 3e      *pa = pBuf->
2c50: 70 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 70  p;.      *pn = p
2c60: 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20  Buf->n;.    }.  
2c70: 7d 0a 0a 20 73 79 6e 6f 6e 79 6d 5f 70 6f 73 6c  }.. synonym_posl
2c80: 69 73 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 61  ist_out:.  if( a
2c90: 49 74 65 72 21 3d 61 53 74 61 74 69 63 20 29 20  Iter!=aStatic ) 
2ca0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49 74  sqlite3_free(aIt
2cb0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
2cc0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  ;.}.../*.** All 
2cd0: 69 6e 64 69 76 69 64 75 61 6c 20 74 65 72 6d 20  individual term 
2ce0: 69 74 65 72 61 74 6f 72 73 20 69 6e 20 70 50 68  iterators in pPh
2cf0: 72 61 73 65 20 61 72 65 20 67 75 61 72 61 6e 74  rase are guarant
2d00: 65 65 64 20 74 6f 20 62 65 20 76 61 6c 69 64 20  eed to be valid 
2d10: 61 6e 64 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  and.** pointing 
2d20: 74 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69  to the same rowi
2d30: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2d40: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20  tion is called. 
2d50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
2d60: 2a 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20  * checks if the 
2d70: 63 75 72 72 65 6e 74 20 72 6f 77 69 64 20 72 65  current rowid re
2d80: 61 6c 6c 79 20 69 73 20 61 20 6d 61 74 63 68 2c  ally is a match,
2d90: 20 61 6e 64 20 69 66 20 73 6f 20 70 6f 70 75 6c   and if so popul
2da0: 61 74 65 73 0a 2a 2a 20 74 68 65 20 70 50 68 72  ates.** the pPhr
2db0: 61 73 65 2d 3e 70 6f 73 6c 69 73 74 20 62 75 66  ase->poslist buf
2dc0: 66 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  fer accordingly.
2dd0: 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
2de0: 72 20 2a 70 62 4d 61 74 63 68 0a 2a 2a 20 69 73  r *pbMatch.** is
2df0: 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   set to true if 
2e00: 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  this is really a
2e10: 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65   match, or false
2e20: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
2e30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2e40: 65 74 75 72 6e 65 64 20 69 66 20 61 6e 20 65 72  eturned if an er
2e50: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 61  ror occurs, or a
2e60: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
2e70: 6f 64 65 20 0a 2a 2a 20 6f 74 68 65 72 77 69 73  ode .** otherwis
2e80: 65 2e 20 49 74 20 69 73 20 6e 6f 74 20 63 6f 6e  e. It is not con
2e90: 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72  sidered an error
2ea0: 20 63 6f 64 65 20 69 66 20 74 68 65 20 63 75 72   code if the cur
2eb0: 72 65 6e 74 20 72 6f 77 69 64 20 69 73 20 0a 2a  rent rowid is .*
2ec0: 2a 20 6e 6f 74 20 61 20 6d 61 74 63 68 2e 0a 2a  * not a match..*
2ed0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2ee0: 35 45 78 70 72 50 68 72 61 73 65 49 73 4d 61 74  5ExprPhraseIsMat
2ef0: 63 68 28 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  ch(.  Fts5ExprNo
2f00: 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20  de *pNode,      
2f10: 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 70 50        /* Node pP
2f20: 68 72 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f  hrase belongs to
2f30: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 50 68   */.  Fts5ExprPh
2f40: 72 61 73 65 20 2a 70 50 68 72 61 73 65 2c 20 20  rase *pPhrase,  
2f50: 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20        /* Phrase 
2f60: 6f 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61  object to initia
2f70: 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lize */.  int *p
2f80: 62 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20  bMatch          
2f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2fa0: 3a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  : Set to true if
2fb0: 20 72 65 61 6c 6c 79 20 61 20 6d 61 74 63 68 20   really a match 
2fc0: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 50 6f 73 6c  */.){.  Fts5Posl
2fd0: 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
2fe0: 20 3d 20 7b 30 7d 3b 0a 20 20 46 74 73 35 50 6f   = {0};.  Fts5Po
2ff0: 73 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61  slistReader aSta
3000: 74 69 63 5b 34 5d 3b 0a 20 20 46 74 73 35 50 6f  tic[4];.  Fts5Po
3010: 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49 74  slistReader *aIt
3020: 65 72 20 3d 20 61 53 74 61 74 69 63 3b 0a 20 20  er = aStatic;.  
3030: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
3040: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
3050: 6e 74 20 62 46 69 72 73 74 20 3d 20 70 50 68 72  nt bFirst = pPhr
3060: 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46  ase->aTerm[0].bF
3070: 69 72 73 74 3b 0a 20 20 0a 20 20 66 74 73 35 42  irst;.  .  fts5B
3080: 75 66 66 65 72 5a 65 72 6f 28 26 70 50 68 72 61  ufferZero(&pPhra
3090: 73 65 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 0a 20  se->poslist);.. 
30a0: 20 2f 2a 20 49 66 20 74 68 65 20 61 53 74 61 74   /* If the aStat
30b0: 69 63 5b 5d 20 61 72 72 61 79 20 69 73 20 6e 6f  ic[] array is no
30c0: 74 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20  t large enough, 
30d0: 61 6c 6c 6f 63 61 74 65 20 61 20 6c 61 72 67 65  allocate a large
30e0: 20 61 72 72 61 79 0a 20 20 2a 2a 20 75 73 69 6e   array.  ** usin
30f0: 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  g sqlite3_malloc
3100: 28 29 2e 20 54 68 69 73 20 61 70 70 72 6f 61 63  (). This approac
3110: 68 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f  h could be impro
3120: 76 65 64 20 75 70 6f 6e 2e 20 2a 2f 0a 20 20 69  ved upon. */.  i
3130: 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72  f( pPhrase->nTer
3140: 6d 3e 41 72 72 61 79 53 69 7a 65 28 61 53 74 61  m>ArraySize(aSta
3150: 74 69 63 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  tic) ){.    int 
3160: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
3170: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
3180: 29 20 2a 20 70 50 68 72 61 73 65 2d 3e 6e 54 65  ) * pPhrase->nTe
3190: 72 6d 3b 0a 20 20 20 20 61 49 74 65 72 20 3d 20  rm;.    aIter = 
31a0: 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  (Fts5PoslistRead
31b0: 65 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  er*)sqlite3_mall
31c0: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  oc(nByte);.    i
31d0: 66 28 20 21 61 49 74 65 72 20 29 20 72 65 74 75  f( !aIter ) retu
31e0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
31f0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 61 49  .  }.  memset(aI
3200: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
3210: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
3220: 29 20 2a 20 70 50 68 72 61 73 65 2d 3e 6e 54 65  ) * pPhrase->nTe
3230: 72 6d 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  rm);..  /* Initi
3240: 61 6c 69 7a 65 20 61 20 74 65 72 6d 20 69 74 65  alize a term ite
3250: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 74  rator for each t
3260: 65 72 6d 20 69 6e 20 74 68 65 20 70 68 72 61 73  erm in the phras
3270: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
3280: 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  i<pPhrase->nTerm
3290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
32a0: 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20  ExprTerm *pTerm 
32b0: 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72  = &pPhrase->aTer
32c0: 6d 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m[i];.    int n 
32d0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 46 6c  = 0;.    int bFl
32e0: 61 67 20 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a  ag = 0;.    u8 *
32f0: 61 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  a = 0;.    if( p
3300: 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29  Term->pSynonym )
3310: 7b 0a 20 20 20 20 20 20 46 74 73 35 42 75 66 66  {.      Fts5Buff
3320: 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20  er buf = {0, 0, 
3330: 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  0};.      rc = f
3340: 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 4c 69  ts5ExprSynonymLi
3350: 73 74 28 70 54 65 72 6d 2c 20 70 4e 6f 64 65 2d  st(pTerm, pNode-
3360: 3e 69 52 6f 77 69 64 2c 20 26 62 75 66 2c 20 26  >iRowid, &buf, &
3370: 61 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  a, &n);.      if
3380: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
3390: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
33a0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69 73  .        goto is
33b0: 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20 20 20 20  match_out;.     
33c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 3d 3d   }.      if( a==
33d0: 62 75 66 2e 70 20 29 20 62 46 6c 61 67 20 3d 20  buf.p ) bFlag = 
33e0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
33f0: 20 20 20 20 61 20 3d 20 28 75 38 2a 29 70 54 65      a = (u8*)pTe
3400: 72 6d 2d 3e 70 49 74 65 72 2d 3e 70 44 61 74 61  rm->pIter->pData
3410: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 54 65 72  ;.      n = pTer
3420: 6d 2d 3e 70 49 74 65 72 2d 3e 6e 44 61 74 61 3b  m->pIter->nData;
3430: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3440: 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
3450: 64 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 61  derInit(a, n, &a
3460: 49 74 65 72 5b 69 5d 29 3b 0a 20 20 20 20 61 49  Iter[i]);.    aI
3470: 74 65 72 5b 69 5d 2e 62 46 6c 61 67 20 3d 20 28  ter[i].bFlag = (
3480: 75 38 29 62 46 6c 61 67 3b 0a 20 20 20 20 69 66  u8)bFlag;.    if
3490: 28 20 61 49 74 65 72 5b 69 5d 2e 62 45 6f 66 20  ( aIter[i].bEof 
34a0: 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f  ) goto ismatch_o
34b0: 75 74 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ut;.  }..  while
34c0: 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ( 1 ){.    int b
34d0: 4d 61 74 63 68 3b 0a 20 20 20 20 69 36 34 20 69  Match;.    i64 i
34e0: 50 6f 73 20 3d 20 61 49 74 65 72 5b 30 5d 2e 69  Pos = aIter[0].i
34f0: 50 6f 73 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  Pos;.    do {.  
3500: 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a      bMatch = 1;.
3510: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3520: 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b  <pPhrase->nTerm;
3530: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46   i++){.        F
3540: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
3550: 20 2a 70 50 6f 73 20 3d 20 26 61 49 74 65 72 5b   *pPos = &aIter[
3560: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  i];.        i64 
3570: 69 41 64 6a 20 3d 20 69 50 6f 73 20 2b 20 69 3b  iAdj = iPos + i;
3580: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6f  .        if( pPo
3590: 73 2d 3e 69 50 6f 73 21 3d 69 41 64 6a 20 29 7b  s->iPos!=iAdj ){
35a0: 0a 20 20 20 20 20 20 20 20 20 20 62 4d 61 74 63  .          bMatc
35b0: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
35c0: 20 77 68 69 6c 65 28 20 70 50 6f 73 2d 3e 69 50   while( pPos->iP
35d0: 6f 73 3c 69 41 64 6a 20 29 7b 0a 20 20 20 20 20  os<iAdj ){.     
35e0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
35f0: 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
3600: 64 65 72 4e 65 78 74 28 70 50 6f 73 29 20 29 20  derNext(pPos) ) 
3610: 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74  goto ismatch_out
3620: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3630: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6f 73          if( pPos
3640: 2d 3e 69 50 6f 73 3e 69 41 64 6a 20 29 20 69 50  ->iPos>iAdj ) iP
3650: 6f 73 20 3d 20 70 50 6f 73 2d 3e 69 50 6f 73 2d  os = pPos->iPos-
3660: 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  i;.        }.   
3670: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
3680: 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20   bMatch==0 );.. 
3690: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 70 6f 73     /* Append pos
36a0: 69 74 69 6f 6e 20 69 50 6f 73 20 74 6f 20 74 68  ition iPos to th
36b0: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
36c0: 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 7c 7c  if( bFirst==0 ||
36d0: 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
36e0: 28 69 50 6f 73 29 3d 3d 30 20 29 7b 0a 20 20 20  (iPos)==0 ){.   
36f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
3700: 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
3710: 41 70 70 65 6e 64 28 26 70 50 68 72 61 73 65 2d  Append(&pPhrase-
3720: 3e 70 6f 73 6c 69 73 74 2c 20 26 77 72 69 74 65  >poslist, &write
3730: 72 2c 20 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  r, iPos);.      
3740: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3750: 4b 20 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68  K ) goto ismatch
3760: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
3770: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72   for(i=0; i<pPhr
3780: 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29  ase->nTerm; i++)
3790: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
37a0: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
37b0: 61 64 65 72 4e 65 78 74 28 26 61 49 74 65 72 5b  aderNext(&aIter[
37c0: 69 5d 29 20 29 20 67 6f 74 6f 20 69 73 6d 61 74  i]) ) goto ismat
37d0: 63 68 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ch_out;.    }.  
37e0: 7d 0a 0a 20 69 73 6d 61 74 63 68 5f 6f 75 74 3a  }.. ismatch_out:
37f0: 0a 20 20 2a 70 62 4d 61 74 63 68 20 3d 20 28 70  .  *pbMatch = (p
3800: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
3810: 6e 3e 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n>0);.  for(i=0;
3820: 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72   i<pPhrase->nTer
3830: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  m; i++){.    if(
3840: 20 61 49 74 65 72 5b 69 5d 2e 62 46 6c 61 67 20   aIter[i].bFlag 
3850: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28  ) sqlite3_free((
3860: 75 38 2a 29 61 49 74 65 72 5b 69 5d 2e 61 29 3b  u8*)aIter[i].a);
3870: 0a 20 20 7d 0a 20 20 69 66 28 20 61 49 74 65 72  .  }.  if( aIter
3880: 21 3d 61 53 74 61 74 69 63 20 29 20 73 71 6c 69  !=aStatic ) sqli
3890: 74 65 33 5f 66 72 65 65 28 61 49 74 65 72 29 3b  te3_free(aIter);
38a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
38b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
38c0: 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61  Fts5LookaheadRea
38d0: 64 65 72 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61  der Fts5Lookahea
38e0: 64 52 65 61 64 65 72 3b 0a 73 74 72 75 63 74 20  dReader;.struct 
38f0: 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61  Fts5LookaheadRea
3900: 64 65 72 20 7b 0a 20 20 63 6f 6e 73 74 20 75 38  der {.  const u8
3910: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
3920: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
3930: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 6f 73  r containing pos
3940: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
3950: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
3980: 72 20 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  r a[] in bytes *
3990: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
39c0: 66 66 73 65 74 20 69 6e 20 70 6f 73 69 74 69 6f  ffset in positio
39d0: 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 36 34 20  n list */.  i64 
39e0: 69 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20  iPos;           
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3a00: 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
3a10: 2a 2f 0a 20 20 69 36 34 20 69 4c 6f 6f 6b 61 68  */.  i64 iLookah
3a20: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3a30: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 70 6f 73       /* Next pos
3a40: 69 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 64 65  ition */.};..#de
3a50: 66 69 6e 65 20 46 54 53 35 5f 4c 4f 4f 4b 41 48  fine FTS5_LOOKAH
3a60: 45 41 44 5f 45 4f 46 20 28 28 28 69 36 34 29 31  EAD_EOF (((i64)1
3a70: 29 20 3c 3c 20 36 32 29 0a 0a 73 74 61 74 69 63  ) << 62)..static
3a80: 20 69 6e 74 20 66 74 73 35 4c 6f 6f 6b 61 68 65   int fts5Lookahe
3a90: 61 64 52 65 61 64 65 72 4e 65 78 74 28 46 74 73  adReaderNext(Fts
3aa0: 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72  5LookaheadReader
3ab0: 20 2a 70 29 7b 0a 20 20 70 2d 3e 69 50 6f 73 20   *p){.  p->iPos 
3ac0: 3d 20 70 2d 3e 69 4c 6f 6f 6b 61 68 65 61 64 3b  = p->iLookahead;
3ad0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74  .  if( sqlite3Ft
3ae0: 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
3af0: 70 2d 3e 61 2c 20 70 2d 3e 6e 2c 20 26 70 2d 3e  p->a, p->n, &p->
3b00: 69 2c 20 26 70 2d 3e 69 4c 6f 6f 6b 61 68 65 61  i, &p->iLookahea
3b10: 64 29 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 6f  d) ){.    p->iLo
3b20: 6f 6b 61 68 65 61 64 20 3d 20 46 54 53 35 5f 4c  okahead = FTS5_L
3b30: 4f 4f 4b 41 48 45 41 44 5f 45 4f 46 3b 0a 20 20  OOKAHEAD_EOF;.  
3b40: 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 69  }.  return (p->i
3b50: 50 6f 73 3d 3d 46 54 53 35 5f 4c 4f 4f 4b 41 48  Pos==FTS5_LOOKAH
3b60: 45 41 44 5f 45 4f 46 29 3b 0a 7d 0a 0a 73 74 61  EAD_EOF);.}..sta
3b70: 74 69 63 20 69 6e 74 20 66 74 73 35 4c 6f 6f 6b  tic int fts5Look
3b80: 61 68 65 61 64 52 65 61 64 65 72 49 6e 69 74 28  aheadReaderInit(
3b90: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  .  const u8 *a, 
3ba0: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
3bb0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
3bc0: 72 65 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69  read position li
3bd0: 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74 73  st from */.  Fts
3be0: 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72  5LookaheadReader
3bf0: 20 2a 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20   *p          /* 
3c00: 49 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  Iterator object 
3c10: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f  to initialize */
3c20: 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  .){.  memset(p, 
3c30: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 4c 6f  0, sizeof(Fts5Lo
3c40: 6f 6b 61 68 65 61 64 52 65 61 64 65 72 29 29 3b  okaheadReader));
3c50: 0a 20 20 70 2d 3e 61 20 3d 20 61 3b 0a 20 20 70  .  p->a = a;.  p
3c60: 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 66 74 73 35 4c  ->n = n;.  fts5L
3c70: 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65  ookaheadReaderNe
3c80: 78 74 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  xt(p);.  return 
3c90: 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61  fts5LookaheadRea
3ca0: 64 65 72 4e 65 78 74 28 70 29 3b 0a 7d 0a 0a 74  derNext(p);.}..t
3cb0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
3cc0: 73 35 4e 65 61 72 54 72 69 6d 6d 65 72 20 46 74  s5NearTrimmer Ft
3cd0: 73 35 4e 65 61 72 54 72 69 6d 6d 65 72 3b 0a 73  s5NearTrimmer;.s
3ce0: 74 72 75 63 74 20 46 74 73 35 4e 65 61 72 54 72  truct Fts5NearTr
3cf0: 69 6d 6d 65 72 20 7b 0a 20 20 46 74 73 35 4c 6f  immer {.  Fts5Lo
3d00: 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20 72 65  okaheadReader re
3d10: 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 49 6e 70  ader;     /* Inp
3d20: 75 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  ut iterator */. 
3d30: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
3d40: 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20  er writer;      
3d50: 20 2f 2a 20 57 72 69 74 65 72 20 63 6f 6e 74 65   /* Writer conte
3d60: 78 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  xt */.  Fts5Buff
3d70: 65 72 20 2a 70 4f 75 74 3b 20 20 20 20 20 20 20  er *pOut;       
3d80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
3d90: 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 7d 3b 0a  t poslist */.};.
3da0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 61 72 2d  ./*.** The near-
3db0: 73 65 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65  set object passe
3dc0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3dd0: 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
3de0: 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 6f 6e   more than.** on
3df0: 65 20 70 68 72 61 73 65 2e 20 41 6c 6c 20 70 68  e phrase. All ph
3e00: 72 61 73 65 73 20 63 75 72 72 65 6e 74 6c 79 20  rases currently 
3e10: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
3e20: 65 20 72 6f 77 2e 20 54 68 65 0a 2a 2a 20 46 74  e row. The.** Ft
3e30: 73 35 45 78 70 72 50 68 72 61 73 65 2e 70 6f 73  s5ExprPhrase.pos
3e40: 6c 69 73 74 20 62 75 66 66 65 72 73 20 61 72 65  list buffers are
3e50: 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72   populated accor
3e60: 64 69 6e 67 6c 79 2e 20 54 68 69 73 20 66 75 6e  dingly. This fun
3e70: 63 74 69 6f 6e 0a 2a 2a 20 74 65 73 74 73 20 69  ction.** tests i
3e80: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
3e90: 77 20 63 6f 6e 74 61 69 6e 73 20 69 6e 73 74 61  w contains insta
3ea0: 6e 63 65 73 20 6f 66 20 65 61 63 68 20 70 68 72  nces of each phr
3eb0: 61 73 65 20 73 75 66 66 69 63 69 65 6e 74 6c 79  ase sufficiently
3ec0: 0a 2a 2a 20 63 6c 6f 73 65 20 74 6f 67 65 74 68  .** close togeth
3ed0: 65 72 20 74 6f 20 6d 65 65 74 20 74 68 65 20 4e  er to meet the N
3ee0: 45 41 52 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  EAR constraint. 
3ef0: 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  Non-zero is retu
3f00: 72 6e 65 64 20 69 66 20 69 74 0a 2a 2a 20 64 6f  rned if it.** do
3f10: 65 73 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65  es, or zero othe
3f20: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
3f30: 69 6e 2f 6f 75 74 20 70 61 72 61 6d 65 74 65 72  in/out parameter
3f40: 20 28 2a 70 52 63 29 20 69 73 20 73 65 74 20 74   (*pRc) is set t
3f50: 6f 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  o other than SQL
3f60: 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
3f70: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
3f80: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
3f90: 6e 6f 2d 6f 70 2e 20 4f 72 2c 20 69 66 20 61 6e  no-op. Or, if an
3fa0: 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 53 51 4c   error (e.g. SQL
3fb0: 49 54 45 5f 4e 4f 4d 45 4d 29 0a 2a 2a 20 6f 63  ITE_NOMEM).** oc
3fc0: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 69 73  curs within this
3fd0: 20 66 75 6e 63 74 69 6f 6e 20 28 2a 70 52 63 29   function (*pRc)
3fe0: 20 69 73 20 73 65 74 20 61 63 63 6f 72 64 69 6e   is set accordin
3ff0: 67 6c 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  gly before retur
4000: 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ning..** The ret
4010: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 75 6e 64  urn value is und
4020: 65 66 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  efined in both t
4030: 68 65 73 65 20 63 61 73 65 73 2e 0a 2a 2a 20 0a  hese cases..** .
4040: 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
4050: 63 63 75 72 73 20 61 6e 64 20 6e 6f 6e 2d 7a 65  ccurs and non-ze
4060: 72 6f 20 28 61 20 6d 61 74 63 68 29 20 69 73 20  ro (a match) is 
4070: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 70 6f  returned, the po
4080: 73 69 74 69 6f 6e 2d 6c 69 73 74 0a 2a 2a 20 6f  sition-list.** o
4090: 66 20 65 61 63 68 20 70 68 72 61 73 65 20 6f 62  f each phrase ob
40a0: 6a 65 63 74 20 69 73 20 65 64 69 74 65 64 20 74  ject is edited t
40b0: 6f 20 63 6f 6e 74 61 69 6e 20 6f 6e 6c 79 20 74  o contain only t
40c0: 68 6f 73 65 20 65 6e 74 72 69 65 73 20 74 68 61  hose entries tha
40d0: 74 0a 2a 2a 20 6d 65 65 74 20 74 68 65 20 63 6f  t.** meet the co
40e0: 6e 73 74 72 61 69 6e 74 20 62 65 66 6f 72 65 20  nstraint before 
40f0: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
4100: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
4110: 72 4e 65 61 72 49 73 4d 61 74 63 68 28 69 6e 74  rNearIsMatch(int
4120: 20 2a 70 52 63 2c 20 46 74 73 35 45 78 70 72 4e   *pRc, Fts5ExprN
4130: 65 61 72 73 65 74 20 2a 70 4e 65 61 72 29 7b 0a  earset *pNear){.
4140: 20 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65    Fts5NearTrimme
4150: 72 20 61 53 74 61 74 69 63 5b 34 5d 3b 0a 20 20  r aStatic[4];.  
4160: 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65 72 20  Fts5NearTrimmer 
4170: 2a 61 20 3d 20 61 53 74 61 74 69 63 3b 0a 20 20  *a = aStatic;.  
4180: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
4190: 2a 61 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61  *apPhrase = pNea
41a0: 72 2d 3e 61 70 50 68 72 61 73 65 3b 0a 0a 20 20  r->apPhrase;..  
41b0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
41c0: 3d 20 2a 70 52 63 3b 0a 20 20 69 6e 74 20 62 4d  = *pRc;.  int bM
41d0: 61 74 63 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  atch;..  assert(
41e0: 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e   pNear->nPhrase>
41f0: 31 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  1 );..  /* If th
4200: 65 20 61 53 74 61 74 69 63 5b 5d 20 61 72 72 61  e aStatic[] arra
4210: 79 20 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65  y is not large e
4220: 6e 6f 75 67 68 2c 20 61 6c 6c 6f 63 61 74 65 20  nough, allocate 
4230: 61 20 6c 61 72 67 65 20 61 72 72 61 79 0a 20 20  a large array.  
4240: 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
4250: 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73 20  _malloc(). This 
4260: 61 70 70 72 6f 61 63 68 20 63 6f 75 6c 64 20 62  approach could b
4270: 65 20 69 6d 70 72 6f 76 65 64 20 75 70 6f 6e 2e  e improved upon.
4280: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 61 72 2d   */.  if( pNear-
4290: 3e 6e 50 68 72 61 73 65 3e 41 72 72 61 79 53 69  >nPhrase>ArraySi
42a0: 7a 65 28 61 53 74 61 74 69 63 29 20 29 7b 0a 20  ze(aStatic) ){. 
42b0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
42c0: 69 7a 65 6f 66 28 46 74 73 35 4e 65 61 72 54 72  izeof(Fts5NearTr
42d0: 69 6d 6d 65 72 29 20 2a 20 70 4e 65 61 72 2d 3e  immer) * pNear->
42e0: 6e 50 68 72 61 73 65 3b 0a 20 20 20 20 61 20 3d  nPhrase;.    a =
42f0: 20 28 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65   (Fts5NearTrimme
4300: 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  r*)sqlite3Fts5Ma
4310: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
4320: 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
4330: 20 20 20 6d 65 6d 73 65 74 28 61 53 74 61 74 69     memset(aStati
4340: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 74  c, 0, sizeof(aSt
4350: 61 74 69 63 29 29 3b 0a 20 20 7d 0a 20 20 69 66  atic));.  }.  if
4360: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4370: 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  ){.    *pRc = rc
4380: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
4390: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
43a0: 6c 69 7a 65 20 61 20 6c 6f 6f 6b 61 68 65 61 64  lize a lookahead
43b0: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 65 61   iterator for ea
43c0: 63 68 20 70 68 72 61 73 65 2e 20 41 66 74 65 72  ch phrase. After
43d0: 20 70 61 73 73 69 6e 67 20 74 68 65 0a 20 20 2a   passing the.  *
43e0: 2a 20 62 75 66 66 65 72 20 61 6e 64 20 62 75 66  * buffer and buf
43f0: 66 65 72 20 73 69 7a 65 20 74 6f 20 74 68 65 20  fer size to the 
4400: 6c 6f 6f 6b 61 73 69 64 65 2d 72 65 61 64 65 72  lookaside-reader
4410: 20 69 6e 69 74 20 66 75 6e 63 74 69 6f 6e 2c 20   init function, 
4420: 7a 65 72 6f 0a 20 20 2a 2a 20 74 68 65 20 70 68  zero.  ** the ph
4430: 72 61 73 65 20 70 6f 73 6c 69 73 74 20 62 75 66  rase poslist buf
4440: 66 65 72 2e 20 54 68 65 20 6e 65 77 20 70 6f 73  fer. The new pos
4450: 6c 69 73 74 20 66 6f 72 20 74 68 65 20 70 68 72  list for the phr
4460: 61 73 65 20 28 63 6f 6e 74 61 69 6e 69 6e 67 0a  ase (containing.
4470: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 65 6e    ** the same en
4480: 74 72 69 65 73 20 61 73 20 74 68 65 20 6f 72 69  tries as the ori
4490: 67 69 6e 61 6c 20 77 69 74 68 20 73 6f 6d 65 20  ginal with some 
44a0: 65 6e 74 72 69 65 73 20 72 65 6d 6f 76 65 64 20  entries removed 
44b0: 6f 6e 20 61 63 63 6f 75 6e 74 20 0a 20 20 2a 2a  on account .  **
44c0: 20 6f 66 20 74 68 65 20 4e 45 41 52 20 63 6f 6e   of the NEAR con
44d0: 73 74 72 61 69 6e 74 29 20 69 73 20 77 72 69 74  straint) is writ
44e0: 74 65 6e 20 6f 76 65 72 20 74 68 65 20 6f 72 69  ten over the ori
44f0: 67 69 6e 61 6c 20 65 76 65 6e 20 61 73 20 69 74  ginal even as it
4500: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72   is.  ** being r
4510: 65 61 64 2e 20 54 68 69 73 20 69 73 20 73 61 66  ead. This is saf
4520: 65 20 61 73 20 74 68 65 20 65 6e 74 72 69 65 73  e as the entries
4530: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 6f 73   for the new pos
4540: 6c 69 73 74 20 61 72 65 20 61 0a 20 20 2a 2a 20  list are a.  ** 
4550: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 6f 6c  subset of the ol
4560: 64 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20  d, so it is not 
4570: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 64 61 74  possible for dat
4580: 61 20 79 65 74 20 74 6f 20 62 65 20 72 65 61 64  a yet to be read
4590: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 76 65 72   to.  ** be over
45a0: 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 66  written.  */.  f
45b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d  or(i=0; i<pNear-
45c0: 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a  >nPhrase; i++){.
45d0: 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a      Fts5Buffer *
45e0: 70 50 6f 73 6c 69 73 74 20 3d 20 26 61 70 50 68  pPoslist = &apPh
45f0: 72 61 73 65 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74  rase[i]->poslist
4600: 3b 0a 20 20 20 20 66 74 73 35 4c 6f 6f 6b 61 68  ;.    fts5Lookah
4610: 65 61 64 52 65 61 64 65 72 49 6e 69 74 28 70 50  eadReaderInit(pP
4620: 6f 73 6c 69 73 74 2d 3e 70 2c 20 70 50 6f 73 6c  oslist->p, pPosl
4630: 69 73 74 2d 3e 6e 2c 20 26 61 5b 69 5d 2e 72 65  ist->n, &a[i].re
4640: 61 64 65 72 29 3b 0a 20 20 20 20 70 50 6f 73 6c  ader);.    pPosl
4650: 69 73 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20  ist->n = 0;.    
4660: 61 5b 69 5d 2e 70 4f 75 74 20 3d 20 70 50 6f 73  a[i].pOut = pPos
4670: 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  list;.  }..  whi
4680: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74  le( 1 ){.    int
4690: 20 69 41 64 76 3b 0a 20 20 20 20 69 36 34 20 69   iAdv;.    i64 i
46a0: 4d 69 6e 3b 0a 20 20 20 20 69 36 34 20 69 4d 61  Min;.    i64 iMa
46b0: 78 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  x;..    /* This 
46c0: 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73 20 74  block advances t
46d0: 68 65 20 70 68 72 61 73 65 20 69 74 65 72 61 74  he phrase iterat
46e0: 6f 72 73 20 75 6e 74 69 6c 20 74 68 65 79 20 70  ors until they p
46f0: 6f 69 6e 74 20 74 6f 20 61 20 73 65 74 20 6f 66  oint to a set of
4700: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20  .    ** entries 
4710: 74 68 61 74 20 74 6f 67 65 74 68 65 72 20 63 6f  that together co
4720: 6d 70 72 69 73 65 20 61 20 6d 61 74 63 68 2e 20  mprise a match. 
4730: 20 2a 2f 0a 20 20 20 20 69 4d 61 78 20 3d 20 61   */.    iMax = a
4740: 5b 30 5d 2e 72 65 61 64 65 72 2e 69 50 6f 73 3b  [0].reader.iPos;
4750: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
4760: 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  bMatch = 1;.    
4770: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65    for(i=0; i<pNe
4780: 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b  ar->nPhrase; i++
4790: 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 4c  ){.        Fts5L
47a0: 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20 2a  ookaheadReader *
47b0: 70 50 6f 73 20 3d 20 26 61 5b 69 5d 2e 72 65 61  pPos = &a[i].rea
47c0: 64 65 72 3b 0a 20 20 20 20 20 20 20 20 69 4d 69  der;.        iMi
47d0: 6e 20 3d 20 69 4d 61 78 20 2d 20 70 4e 65 61 72  n = iMax - pNear
47e0: 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 2d 3e 6e  ->apPhrase[i]->n
47f0: 54 65 72 6d 20 2d 20 70 4e 65 61 72 2d 3e 6e 4e  Term - pNear->nN
4800: 65 61 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ear;.        if(
4810: 20 70 50 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e   pPos->iPos<iMin
4820: 20 7c 7c 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69   || pPos->iPos>i
4830: 4d 61 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Max ){.         
4840: 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20   bMatch = 0;.   
4850: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50         while( pP
4860: 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e 20 29 7b  os->iPos<iMin ){
4870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
4880: 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
4890: 61 64 65 72 4e 65 78 74 28 70 50 6f 73 29 20 29  aderNext(pPos) )
48a0: 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75   goto ismatch_ou
48b0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
48c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6f           if( pPo
48d0: 73 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29 20 69  s->iPos>iMax ) i
48e0: 4d 61 78 20 3d 20 70 50 6f 73 2d 3e 69 50 6f 73  Max = pPos->iPos
48f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4900: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
4910: 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20  bMatch==0 );..  
4920: 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
4930: 79 20 74 6f 20 65 61 63 68 20 6f 75 74 70 75 74  y to each output
4940: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
4950: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
4960: 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b  <pNear->nPhrase;
4970: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 36 34   i++){.      i64
4980: 20 69 50 6f 73 20 3d 20 61 5b 69 5d 2e 72 65 61   iPos = a[i].rea
4990: 64 65 72 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20  der.iPos;.      
49a0: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
49b0: 72 20 2a 70 57 72 69 74 65 72 20 3d 20 26 61 5b  r *pWriter = &a[
49c0: 69 5d 2e 77 72 69 74 65 72 3b 0a 20 20 20 20 20  i].writer;.     
49d0: 20 69 66 28 20 61 5b 69 5d 2e 70 4f 75 74 2d 3e   if( a[i].pOut->
49e0: 6e 3d 3d 30 20 7c 7c 20 69 50 6f 73 21 3d 70 57  n==0 || iPos!=pW
49f0: 72 69 74 65 72 2d 3e 69 50 72 65 76 20 29 7b 0a  riter->iPrev ){.
4a00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
4a10: 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
4a20: 41 70 70 65 6e 64 28 61 5b 69 5d 2e 70 4f 75 74  Append(a[i].pOut
4a30: 2c 20 70 57 72 69 74 65 72 2c 20 69 50 6f 73 29  , pWriter, iPos)
4a40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4a50: 0a 20 20 20 20 69 41 64 76 20 3d 20 30 3b 0a 20  .    iAdv = 0;. 
4a60: 20 20 20 69 4d 69 6e 20 3d 20 61 5b 30 5d 2e 72     iMin = a[0].r
4a70: 65 61 64 65 72 2e 69 4c 6f 6f 6b 61 68 65 61 64  eader.iLookahead
4a80: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4a90: 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b  <pNear->nPhrase;
4aa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4ab0: 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c 6f   a[i].reader.iLo
4ac0: 6f 6b 61 68 65 61 64 20 3c 20 69 4d 69 6e 20 29  okahead < iMin )
4ad0: 7b 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d  {.        iMin =
4ae0: 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c 6f   a[i].reader.iLo
4af0: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20 20  okahead;.       
4b00: 20 69 41 64 76 20 3d 20 69 3b 0a 20 20 20 20 20   iAdv = i;.     
4b10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4b20: 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
4b30: 61 64 65 72 4e 65 78 74 28 26 61 5b 69 41 64 76  aderNext(&a[iAdv
4b40: 5d 2e 72 65 61 64 65 72 29 20 29 20 67 6f 74 6f  ].reader) ) goto
4b50: 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20   ismatch_out;.  
4b60: 7d 0a 0a 20 20 69 73 6d 61 74 63 68 5f 6f 75 74  }..  ismatch_out
4b70: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 62 52 65 74  : {.    int bRet
4b80: 20 3d 20 61 5b 30 5d 2e 70 4f 75 74 2d 3e 6e 3e   = a[0].pOut->n>
4b90: 30 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  0;.    *pRc = rc
4ba0: 3b 0a 20 20 20 20 69 66 28 20 61 21 3d 61 53 74  ;.    if( a!=aSt
4bb0: 61 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66  atic ) sqlite3_f
4bc0: 72 65 65 28 61 29 3b 0a 20 20 20 20 72 65 74 75  ree(a);.    retu
4bd0: 72 6e 20 62 52 65 74 3b 0a 20 20 7d 0a 7d 0a 0a  rn bRet;.  }.}..
4be0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
4bf0: 65 72 61 74 6f 72 20 70 49 74 65 72 20 75 6e 74  erator pIter unt
4c00: 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
4c10: 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74 6f  a value equal to
4c20: 20 6f 72 20 6c 61 73 74 65 72 0a 2a 2a 20 74 68   or laster.** th
4c30: 61 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  an the initial v
4c40: 61 6c 75 65 20 6f 66 20 2a 70 69 4c 61 73 74 2e  alue of *piLast.
4c50: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
4c60: 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
4c70: 74 73 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 75 65  ts.** to a value
4c80: 20 6c 61 73 74 65 72 20 74 68 61 6e 20 2a 70 69   laster than *pi
4c90: 4c 61 73 74 2c 20 75 70 64 61 74 65 20 2a 70 69  Last, update *pi
4ca0: 4c 61 73 74 20 74 6f 20 74 68 65 20 6e 65 77 20  Last to the new 
4cb0: 6c 61 73 74 65 73 74 20 76 61 6c 75 65 2e 0a 2a  lastest value..*
4cc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 74 65 72  *.** If the iter
4cd0: 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
4ce0: 2c 20 73 65 74 20 2a 70 62 45 6f 66 20 74 6f 20  , set *pbEof to 
4cf0: 74 72 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  true before retu
4d00: 72 6e 69 6e 67 2e 20 49 66 0a 2a 2a 20 61 6e 20  rning. If.** an 
4d10: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
4d20: 74 20 2a 70 52 63 20 74 6f 20 61 6e 20 65 72 72  t *pRc to an err
4d30: 6f 72 20 63 6f 64 65 2e 20 49 66 20 65 69 74 68  or code. If eith
4d40: 65 72 20 2a 70 62 45 6f 66 20 6f 72 20 2a 70 52  er *pbEof or *pR
4d50: 63 0a 2a 2a 20 61 72 65 20 73 65 74 2c 20 72 65  c.** are set, re
4d60: 74 75 72 6e 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  turn a non-zero 
4d70: 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65  value. Otherwise
4d80: 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a  , return zero..*
4d90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
4da0: 35 45 78 70 72 41 64 76 61 6e 63 65 74 6f 28 0a  5ExprAdvanceto(.
4db0: 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
4dc0: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
4dd0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
4de0: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
4df0: 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4e10: 20 54 72 75 65 20 69 66 20 69 74 65 72 61 74 6f   True if iterato
4e20: 72 20 69 73 20 22 72 6f 77 69 64 20 44 45 53 43  r is "rowid DESC
4e30: 22 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61  " */.  i64 *piLa
4e40: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
4e50: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
4e60: 3a 20 4c 61 73 74 65 73 74 20 72 6f 77 69 64 20  : Lastest rowid 
4e70: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
4e80: 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 63   /* OUT: Error c
4eb0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  ode */.  int *pb
4ec0: 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Eof             
4ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4ee0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
4ef0: 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  EOF */.){.  i64 
4f00: 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74 3b  iLast = *piLast;
4f10: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a  .  i64 iRowid;..
4f20: 20 20 69 52 6f 77 69 64 20 3d 20 70 49 74 65 72    iRowid = pIter
4f30: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28 20  ->iRowid;.  if( 
4f40: 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69 4c 61  (bDesc==0 && iLa
4f50: 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20 28 62  st>iRowid) || (b
4f60: 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c 69 52  Desc && iLast<iR
4f70: 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 69 6e 74  owid) ){.    int
4f80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
4f90: 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49  5IterNextFrom(pI
4fa0: 74 65 72 2c 20 69 4c 61 73 74 29 3b 0a 20 20 20  ter, iLast);.   
4fb0: 20 69 66 28 20 72 63 20 7c 7c 20 73 71 6c 69 74   if( rc || sqlit
4fc0: 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
4fd0: 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  ter) ){.      *p
4fe0: 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 2a  Rc = rc;.      *
4ff0: 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20  pbEof = 1;.     
5000: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
5010: 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 70 49  .    iRowid = pI
5020: 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20  ter->iRowid;.   
5030: 20 61 73 73 65 72 74 28 20 28 62 44 65 73 63 3d   assert( (bDesc=
5040: 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c  =0 && iRowid>=iL
5050: 61 73 74 29 20 7c 7c 20 28 62 44 65 73 63 3d 3d  ast) || (bDesc==
5060: 31 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61  1 && iRowid<=iLa
5070: 73 74 29 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 69  st) );.  }.  *pi
5080: 4c 61 73 74 20 3d 20 69 52 6f 77 69 64 3b 0a 0a  Last = iRowid;..
5090: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
50a0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
50b0: 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e 63 65  prSynonymAdvance
50c0: 74 6f 28 0a 20 20 46 74 73 35 45 78 70 72 54 65  to(.  Fts5ExprTe
50d0: 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
50e0: 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 69 74        /* Term it
50f0: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
5100: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  e */.  int bDesc
5110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5120: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5130: 66 20 69 74 65 72 61 74 6f 72 20 69 73 20 22 72  f iterator is "r
5140: 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20  owid DESC" */.  
5150: 69 36 34 20 2a 70 69 4c 61 73 74 2c 20 20 20 20  i64 *piLast,    
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 61 73 74 65  /* IN/OUT: Laste
5180: 73 74 20 72 6f 77 69 64 20 73 65 65 6e 20 73 6f  st rowid seen so
5190: 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   far */.  int *p
51a0: 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
51b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
51c0: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
51d0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
51e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 36 34 20 69  LITE_OK;.  i64 i
51f0: 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74 3b 0a  Last = *piLast;.
5200: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
5210: 70 3b 0a 20 20 69 6e 74 20 62 45 6f 66 20 3d 20  p;.  int bEof = 
5220: 30 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 54 65 72  0;..  for(p=pTer
5230: 6d 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  m; rc==SQLITE_OK
5240: 20 26 26 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e   && p; p=p->pSyn
5250: 6f 6e 79 6d 29 7b 0a 20 20 20 20 69 66 28 20 73  onym){.    if( s
5260: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
5270: 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20 29  f(p->pIter)==0 )
5280: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
5290: 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69  id = p->pIter->i
52a0: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 66 28  Rowid;.      if(
52b0: 20 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69 4c   (bDesc==0 && iL
52c0: 61 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20 28  ast>iRowid) || (
52d0: 62 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c 69  bDesc && iLast<i
52e0: 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20  Rowid) ){.      
52f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
5300: 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  s5IterNextFrom(p
5310: 2d 3e 70 49 74 65 72 2c 20 69 4c 61 73 74 29 3b  ->pIter, iLast);
5320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5330: 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
5340: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
5350: 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 62 45  pRc = rc;.    bE
5360: 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
5370: 0a 20 20 20 20 2a 70 69 4c 61 73 74 20 3d 20 66  .    *piLast = f
5380: 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f  ts5ExprSynonymRo
5390: 77 69 64 28 70 54 65 72 6d 2c 20 62 44 65 73 63  wid(pTerm, bDesc
53a0: 2c 20 26 62 45 6f 66 29 3b 0a 20 20 7d 0a 20 20  , &bEof);.  }.  
53b0: 72 65 74 75 72 6e 20 62 45 6f 66 3b 0a 7d 0a 0a  return bEof;.}..
53c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
53d0: 45 78 70 72 4e 65 61 72 54 65 73 74 28 0a 20 20  ExprNearTest(.  
53e0: 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35  int *pRc,.  Fts5
53f0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
5400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
5410: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 70  xpression that p
5420: 4e 65 61 72 20 69 73 20 61 20 70 61 72 74 20 6f  Near is a part o
5430: 66 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e  f */.  Fts5ExprN
5440: 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20 20  ode *pNode      
5450: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 4e         /* The "N
5460: 45 41 52 22 20 6e 6f 64 65 20 28 46 54 53 35 5f  EAR" node (FTS5_
5470: 53 54 52 49 4e 47 29 20 2a 2f 0a 29 7b 0a 20 20  STRING) */.){.  
5480: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
5490: 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e  *pNear = pNode->
54a0: 70 4e 65 61 72 3b 0a 20 20 69 6e 74 20 72 63 20  pNear;.  int rc 
54b0: 3d 20 2a 70 52 63 3b 0a 0a 20 20 69 66 28 20 70  = *pRc;..  if( p
54c0: 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  Expr->pConfig->e
54d0: 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54  Detail!=FTS5_DET
54e0: 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
54f0: 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
5500: 65 72 6d 3b 0a 20 20 20 20 46 74 73 35 45 78 70  erm;.    Fts5Exp
5510: 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
5520: 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
5530: 73 65 5b 30 5d 3b 0a 20 20 20 20 70 50 68 72 61  se[0];.    pPhra
5540: 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20  se->poslist.n = 
5550: 30 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  0;.    for(pTerm
5560: 3d 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  =&pPhrase->aTerm
5570: 5b 30 5d 3b 20 70 54 65 72 6d 3b 20 70 54 65 72  [0]; pTerm; pTer
5580: 6d 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79  m=pTerm->pSynony
5590: 6d 29 7b 0a 20 20 20 20 20 20 46 74 73 35 49 6e  m){.      Fts5In
55a0: 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  dexIter *pIter =
55b0: 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0a 20   pTerm->pIter;. 
55c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
55d0: 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65  Fts5IterEof(pIte
55e0: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
55f0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77   if( pIter->iRow
5600: 69 64 3d 3d 70 4e 6f 64 65 2d 3e 69 52 6f 77 69  id==pNode->iRowi
5610: 64 20 26 26 20 70 49 74 65 72 2d 3e 6e 44 61 74  d && pIter->nDat
5620: 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  a>0 ){.         
5630: 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73   pPhrase->poslis
5640: 74 2e 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  t.n = 1;.       
5650: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5660: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 68 72  .    return pPhr
5670: 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a  ase->poslist.n;.
5680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
5690: 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   i;..    /* Chec
56a0: 6b 20 74 68 61 74 20 65 61 63 68 20 70 68 72 61  k that each phra
56b0: 73 65 20 69 6e 20 74 68 65 20 6e 65 61 72 73 65  se in the nearse
56c0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 75  t matches the cu
56d0: 72 72 65 6e 74 20 72 6f 77 2e 0a 20 20 20 20 2a  rrent row..    *
56e0: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
56f0: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 20  Phrase->poslist 
5700: 62 75 66 66 65 72 73 20 61 74 20 74 68 65 20 73  buffers at the s
5710: 61 6d 65 20 74 69 6d 65 2e 20 49 66 20 61 6e 79  ame time. If any
5720: 0a 20 20 20 20 2a 2a 20 70 68 72 61 73 65 20 69  .    ** phrase i
5730: 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 62  s not a match, b
5740: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
5750: 6c 6f 6f 70 20 65 61 72 6c 79 2e 20 20 2a 2f 0a  loop early.  */.
5760: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
5770: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
5780: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20  pNear->nPhrase; 
5790: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i++){.      Fts5
57a0: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
57b0: 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50  ase = pNear->apP
57c0: 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20 20  hrase[i];.      
57d0: 69 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54 65  if( pPhrase->nTe
57e0: 72 6d 3e 31 20 7c 7c 20 70 50 68 72 61 73 65 2d  rm>1 || pPhrase-
57f0: 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e  >aTerm[0].pSynon
5800: 79 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  ym .       || pN
5810: 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 7c 7c 20  ear->pColset || 
5820: 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30  pPhrase->aTerm[0
5830: 5d 2e 62 46 69 72 73 74 0a 20 20 20 20 20 20 29  ].bFirst.      )
5840: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4d  {.        int bM
5850: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
5860: 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 50    rc = fts5ExprP
5870: 68 72 61 73 65 49 73 4d 61 74 63 68 28 70 4e 6f  hraseIsMatch(pNo
5880: 64 65 2c 20 70 50 68 72 61 73 65 2c 20 26 62 4d  de, pPhrase, &bM
5890: 61 74 63 68 29 3b 0a 20 20 20 20 20 20 20 20 69  atch);.        i
58a0: 66 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 20 62  f( bMatch==0 ) b
58b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
58c0: 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 49  e{.        Fts5I
58d0: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
58e0: 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  = pPhrase->aTerm
58f0: 5b 30 5d 2e 70 49 74 65 72 3b 0a 20 20 20 20 20  [0].pIter;.     
5900: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
5910: 28 26 72 63 2c 20 26 70 50 68 72 61 73 65 2d 3e  (&rc, &pPhrase->
5920: 70 6f 73 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e  poslist, pIter->
5930: 6e 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 70 44  nData, pIter->pD
5940: 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata);.      }.  
5950: 20 20 7d 0a 0a 20 20 20 20 2a 70 52 63 20 3d 20    }..    *pRc = 
5960: 72 63 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70  rc;.    if( i==p
5970: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20 26 26  Near->nPhrase &&
5980: 20 28 69 3d 3d 31 20 7c 7c 20 66 74 73 35 45 78   (i==1 || fts5Ex
5990: 70 72 4e 65 61 72 49 73 4d 61 74 63 68 28 70 52  prNearIsMatch(pR
59a0: 63 2c 20 70 4e 65 61 72 29 29 20 29 7b 0a 20 20  c, pNear)) ){.  
59b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
59c0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
59d0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
59e0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 74  Initialize all t
59f0: 65 72 6d 20 69 74 65 72 61 74 6f 72 73 20 69 6e  erm iterators in
5a00: 20 74 68 65 20 70 4e 65 61 72 20 6f 62 6a 65 63   the pNear objec
5a10: 74 2e 20 49 66 20 61 6e 79 20 74 65 72 6d 20 69  t. If any term i
5a20: 73 20 66 6f 75 6e 64 0a 2a 2a 20 74 6f 20 6d 61  s found.** to ma
5a30: 74 63 68 20 6e 6f 20 64 6f 63 75 6d 65 6e 74 73  tch no documents
5a40: 20 61 74 20 61 6c 6c 2c 20 72 65 74 75 72 6e 20   at all, return 
5a50: 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68  immediately with
5a60: 6f 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  out initializing
5a70: 20 61 6e 79 0a 2a 2a 20 66 75 72 74 68 65 72 20   any.** further 
5a80: 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a  iterators..**.**
5a90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
5aa0: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  urs, return an S
5ab0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
5ac0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
5ad0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
5ae0: 2e 20 49 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73  . It is not cons
5af0: 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
5b00: 69 66 20 73 6f 6d 65 20 74 65 72 6d 20 6d 61 74  if some term mat
5b10: 63 68 65 73 20 7a 65 72 6f 0a 2a 2a 20 64 6f 63  ches zero.** doc
5b20: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  uments..*/.stati
5b30: 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 65  c int fts5ExprNe
5b40: 61 72 49 6e 69 74 41 6c 6c 28 0a 20 20 46 74 73  arInitAll(.  Fts
5b50: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20  5Expr *pExpr,.  
5b60: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
5b70: 6f 64 65 0a 29 7b 0a 20 20 46 74 73 35 45 78 70  ode.){.  Fts5Exp
5b80: 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
5b90: 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0a  = pNode->pNear;.
5ba0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
5bb0: 72 74 28 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61  rt( pNode->bNoma
5bc0: 74 63 68 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  tch==0 );.  for(
5bd0: 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
5be0: 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  hrase; i++){.   
5bf0: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
5c00: 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72  *pPhrase = pNear
5c10: 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20  ->apPhrase[i];. 
5c20: 20 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e     if( pPhrase->
5c30: 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nTerm==0 ){.    
5c40: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
5c50: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
5c60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
5c70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
5c80: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
5c90: 3b 20 6a 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65  ; j<pPhrase->nTe
5ca0: 72 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; j++){.      
5cb0: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
5cc0: 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
5cd0: 2d 3e 61 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  ->aTerm[j];.    
5ce0: 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
5cf0: 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   *p;.        int
5d00: 20 62 48 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20   bHit = 0;..    
5d10: 20 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b      for(p=pTerm;
5d20: 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79   p; p=p->pSynony
5d30: 6d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  m){.          in
5d40: 74 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  t rc;.          
5d50: 69 66 28 20 70 2d 3e 70 49 74 65 72 20 29 7b 0a  if( p->pIter ){.
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5d70: 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
5d80: 28 70 2d 3e 70 49 74 65 72 29 3b 0a 20 20 20 20  (p->pIter);.    
5d90: 20 20 20 20 20 20 20 20 70 2d 3e 70 49 74 65 72          p->pIter
5da0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
5db0: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
5dc0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
5dd0: 78 51 75 65 72 79 28 0a 20 20 20 20 20 20 20 20  xQuery(.        
5de0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 49 6e        pExpr->pIn
5df0: 64 65 78 2c 20 70 2d 3e 7a 54 65 72 6d 2c 20 28  dex, p->zTerm, (
5e00: 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 54  int)strlen(p->zT
5e10: 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  erm),.          
5e20: 20 20 20 20 28 70 54 65 72 6d 2d 3e 62 50 72 65      (pTerm->bPre
5e30: 66 69 78 20 3f 20 46 54 53 35 49 4e 44 45 58 5f  fix ? FTS5INDEX_
5e40: 51 55 45 52 59 5f 50 52 45 46 49 58 20 3a 20 30  QUERY_PREFIX : 0
5e50: 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) |.            
5e60: 20 20 28 70 45 78 70 72 2d 3e 62 44 65 73 63 20    (pExpr->bDesc 
5e70: 3f 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  ? FTS5INDEX_QUER
5e80: 59 5f 44 45 53 43 20 3a 20 30 29 2c 0a 20 20 20  Y_DESC : 0),.   
5e90: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 61 72             pNear
5ea0: 2d 3e 70 43 6f 6c 73 65 74 2c 0a 20 20 20 20 20  ->pColset,.     
5eb0: 20 20 20 20 20 20 20 20 20 26 70 2d 3e 70 49 74           &p->pIt
5ec0: 65 72 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  er.          );.
5ed0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5ee0: 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
5ef0: 29 3d 3d 28 70 2d 3e 70 49 74 65 72 21 3d 30 29  )==(p->pIter!=0)
5f00: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
5f10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5f20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
5f30: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71         if( 0==sq
5f40: 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
5f50: 28 70 2d 3e 70 49 74 65 72 29 20 29 7b 0a 20 20  (p->pIter) ){.  
5f60: 20 20 20 20 20 20 20 20 20 20 62 48 69 74 20 3d            bHit =
5f70: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
5f80: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
5f90: 20 20 20 69 66 28 20 62 48 69 74 3d 3d 30 20 29     if( bHit==0 )
5fa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64  {.          pNod
5fb0: 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  e->bEof = 1;.   
5fc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
5fd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
5fe0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5ff0: 0a 20 20 7d 0a 0a 20 20 70 4e 6f 64 65 2d 3e 62  .  }..  pNode->b
6000: 45 6f 66 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Eof = 0;.  retur
6010: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6020: 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  /*.** If pExpr i
6030: 73 20 61 6e 20 41 53 43 20 69 74 65 72 61 74 6f  s an ASC iterato
6040: 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
6050: 20 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65   returns a value
6060: 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 61 6d   with the.** sam
6070: 65 20 73 69 67 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  e sign as:.**.**
6080: 20 20 20 28 69 4c 68 73 20 2d 20 69 52 68 73 29     (iLhs - iRhs)
6090: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
60a0: 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 44  , if this is a D
60b0: 45 53 43 20 69 74 65 72 61 74 6f 72 2c 20 74 68  ESC iterator, th
60c0: 65 20 6f 70 70 6f 73 69 74 65 20 69 73 20 72 65  e opposite is re
60d0: 74 75 72 6e 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  turned:.**.**   
60e0: 28 69 52 68 73 20 2d 20 69 4c 68 73 29 0a 2a 2f  (iRhs - iLhs).*/
60f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
6100: 52 6f 77 69 64 43 6d 70 28 0a 20 20 46 74 73 35  RowidCmp(.  Fts5
6110: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 69  Expr *pExpr,.  i
6120: 36 34 20 69 4c 68 73 2c 0a 20 20 69 36 34 20 69  64 iLhs,.  i64 i
6130: 52 68 73 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  Rhs.){.  assert(
6140: 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d 30   pExpr->bDesc==0
6150: 20 7c 7c 20 70 45 78 70 72 2d 3e 62 44 65 73 63   || pExpr->bDesc
6160: 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 45 78  ==1 );.  if( pEx
6170: 70 72 2d 3e 62 44 65 73 63 3d 3d 30 20 29 7b 0a  pr->bDesc==0 ){.
6180: 20 20 20 20 69 66 28 20 69 4c 68 73 3c 69 52 68      if( iLhs<iRh
6190: 73 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  s ) return -1;. 
61a0: 20 20 20 72 65 74 75 72 6e 20 28 69 4c 68 73 20     return (iLhs 
61b0: 3e 20 69 52 68 73 29 3b 0a 20 20 7d 65 6c 73 65  > iRhs);.  }else
61c0: 7b 0a 20 20 20 20 69 66 28 20 69 4c 68 73 3e 69  {.    if( iLhs>i
61d0: 52 68 73 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  Rhs ) return -1;
61e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 4c 68  .    return (iLh
61f0: 73 20 3c 20 69 52 68 73 29 3b 0a 20 20 7d 0a 7d  s < iRhs);.  }.}
6200: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
6210: 73 35 45 78 70 72 53 65 74 45 6f 66 28 46 74 73  s5ExprSetEof(Fts
6220: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
6230: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  ){.  int i;.  pN
6240: 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  ode->bEof = 1;. 
6250: 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68   pNode->bNomatch
6260: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
6270: 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
6280: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35  ; i++){.    fts5
6290: 45 78 70 72 53 65 74 45 6f 66 28 70 4e 6f 64 65  ExprSetEof(pNode
62a0: 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20  ->apChild[i]);. 
62b0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
62c0: 64 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65  d fts5ExprNodeZe
62d0: 72 6f 50 6f 73 6c 69 73 74 28 46 74 73 35 45 78  roPoslist(Fts5Ex
62e0: 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  prNode *pNode){.
62f0: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54 79    if( pNode->eTy
6300: 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20  pe==FTS5_STRING 
6310: 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  || pNode->eType=
6320: 3d 46 54 53 35 5f 54 45 52 4d 20 29 7b 0a 20 20  =FTS5_TERM ){.  
6330: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
6340: 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65  t *pNear = pNode
6350: 2d 3e 70 4e 65 61 72 3b 0a 20 20 20 20 69 6e 74  ->pNear;.    int
6360: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
6370: 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
6380: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  e; i++){.      F
6390: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
63a0: 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e  Phrase = pNear->
63b0: 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20  apPhrase[i];.   
63c0: 20 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c     pPhrase->posl
63d0: 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ist.n = 0;.    }
63e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
63f0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
6400: 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
6410: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  d; i++){.      f
6420: 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
6430: 6f 73 6c 69 73 74 28 70 4e 6f 64 65 2d 3e 61 70  oslist(pNode->ap
6440: 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 7d  Child[i]);.    }
6450: 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  .  }.}..../*.** 
6460: 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
6470: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64  es currently ind
6480: 69 63 61 74 65 64 20 62 79 20 74 68 65 20 74 77  icated by the tw
6490: 6f 20 6e 6f 64 65 73 20 61 73 20 66 6f 6c 6c 6f  o nodes as follo
64a0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 72 65 73  ws:.**.**    res
64b0: 20 3d 20 28 2a 70 31 29 20 2d 20 28 2a 70 32 29   = (*p1) - (*p2)
64c0: 0a 2a 2a 0a 2a 2a 20 4e 6f 64 65 73 20 74 68 61  .**.** Nodes tha
64d0: 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 75 65  t point to value
64e0: 73 20 74 68 61 74 20 63 6f 6d 65 20 6c 61 74 65  s that come late
64f0: 72 20 69 6e 20 74 68 65 20 69 74 65 72 61 74 69  r in the iterati
6500: 6f 6e 20 6f 72 64 65 72 20 61 72 65 0a 2a 2a 20  on order are.** 
6510: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
6520: 20 6c 61 72 67 65 72 2e 20 4e 6f 64 65 73 20 61   larger. Nodes a
6530: 74 20 45 4f 46 20 61 72 65 20 74 68 65 20 6c 61  t EOF are the la
6540: 72 67 65 73 74 20 6f 66 20 61 6c 6c 2e 0a 2a 2a  rgest of all..**
6550: 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74  .** This means t
6560: 68 61 74 20 69 66 20 74 68 65 20 69 74 65 72 61  hat if the itera
6570: 74 69 6f 6e 20 6f 72 64 65 72 20 69 73 20 41 53  tion order is AS
6580: 43 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 61  C, then numerica
6590: 6c 6c 79 20 6c 61 72 67 65 72 0a 2a 2a 20 72 6f  lly larger.** ro
65a0: 77 69 64 73 20 61 72 65 20 63 6f 6e 73 69 64 65  wids are conside
65b0: 72 65 64 20 6c 61 72 67 65 72 2e 20 4f 72 20 69  red larger. Or i
65c0: 66 20 69 74 20 69 73 20 74 68 65 20 64 65 66 61  f it is the defa
65d0: 75 6c 74 20 44 45 53 43 2c 20 6e 75 6d 65 72 69  ult DESC, numeri
65e0: 63 61 6c 6c 79 0a 2a 2a 20 73 6d 61 6c 6c 65 72  cally.** smaller
65f0: 20 72 6f 77 69 64 73 20 61 72 65 20 6c 61 72 67   rowids are larg
6600: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
6610: 74 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72  t fts5NodeCompar
6620: 65 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  e(.  Fts5Expr *p
6630: 45 78 70 72 2c 0a 20 20 46 74 73 35 45 78 70 72  Expr,.  Fts5Expr
6640: 4e 6f 64 65 20 2a 70 31 2c 20 0a 20 20 46 74 73  Node *p1, .  Fts
6650: 35 45 78 70 72 4e 6f 64 65 20 2a 70 32 0a 29 7b  5ExprNode *p2.){
6660: 0a 20 20 69 66 28 20 70 32 2d 3e 62 45 6f 66 20  .  if( p2->bEof 
6670: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69  ) return -1;.  i
6680: 66 28 20 70 31 2d 3e 62 45 6f 66 20 29 20 72 65  f( p1->bEof ) re
6690: 74 75 72 6e 20 2b 31 3b 0a 20 20 72 65 74 75 72  turn +1;.  retur
66a0: 6e 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70  n fts5RowidCmp(p
66b0: 45 78 70 72 2c 20 70 31 2d 3e 69 52 6f 77 69 64  Expr, p1->iRowid
66c0: 2c 20 70 32 2d 3e 69 52 6f 77 69 64 29 3b 0a 7d  , p2->iRowid);.}
66d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 69 6e 64 69  ../*.** All indi
66e0: 76 69 64 75 61 6c 20 74 65 72 6d 20 69 74 65 72  vidual term iter
66f0: 61 74 6f 72 73 20 69 6e 20 70 4e 65 61 72 20 61  ators in pNear a
6700: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
6710: 20 62 65 20 76 61 6c 69 64 20 77 68 65 6e 0a 2a   be valid when.*
6720: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
6730: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20  is called. This 
6740: 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
6750: 69 66 20 61 6c 6c 20 74 65 72 6d 20 69 74 65 72  if all term iter
6760: 61 74 6f 72 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  ators.** point t
6770: 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69 64  o the same rowid
6780: 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 61 64  , and if not, ad
6790: 76 61 6e 63 65 73 20 74 68 65 6d 20 75 6e 74 69  vances them unti
67a0: 6c 20 74 68 65 79 20 64 6f 2e 0a 2a 2a 20 49 66  l they do..** If
67b0: 20 61 6e 20 45 4f 46 20 69 73 20 72 65 61 63 68   an EOF is reach
67c0: 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 68  ed before this h
67d0: 61 70 70 65 6e 73 2c 20 2a 70 62 45 6f 66 20 69  appens, *pbEof i
67e0: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 62 65  s set to true be
67f0: 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
6800: 67 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  g..**.** SQLITE_
6810: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
6820: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6830: 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s, or an SQLite 
6840: 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 6f  error code .** o
6850: 74 68 65 72 77 69 73 65 2e 20 49 74 20 69 73 20  therwise. It is 
6860: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
6870: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
6880: 61 6e 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  an iterator reac
6890: 68 65 73 0a 2a 2a 20 45 4f 46 2e 0a 2a 2f 0a 73  hes.** EOF..*/.s
68a0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
68b0: 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52 49 4e  prNodeTest_STRIN
68c0: 47 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  G(.  Fts5Expr *p
68d0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
68e0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
68f0: 6f 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f 6e  on pPhrase belon
6900: 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 45  gs to */.  Fts5E
6910: 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 0a 29  xprNode *pNode.)
6920: 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72  {.  Fts5ExprNear
6930: 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f  set *pNear = pNo
6940: 64 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 46 74 73  de->pNear;.  Fts
6950: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 4c 65  5ExprPhrase *pLe
6960: 66 74 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68  ft = pNear->apPh
6970: 72 61 73 65 5b 30 5d 3b 0a 20 20 69 6e 74 20 72  rase[0];.  int r
6980: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6990: 20 69 36 34 20 69 4c 61 73 74 3b 20 20 20 20 20   i64 iLast;     
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 2f 2a 20 4c 61 73 74 65 73 74 20 72 6f 77 69   /* Lastest rowi
69c0: 64 20 61 6e 79 20 69 74 65 72 61 74 6f 72 20 70  d any iterator p
69d0: 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  oints to */.  in
69e0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a00: 20 50 68 72 61 73 65 20 61 6e 64 20 74 6f 6b 65   Phrase and toke
6a10: 6e 20 69 6e 64 65 78 2c 20 72 65 73 70 65 63 74  n index, respect
6a20: 69 76 65 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62  ively */.  int b
6a30: 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
6a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
6a50: 75 65 20 69 66 20 61 6c 6c 20 74 65 72 6d 73 20  ue if all terms 
6a60: 61 72 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  are at the same 
6a70: 72 6f 77 69 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rowid */.  const
6a80: 20 69 6e 74 20 62 44 65 73 63 20 3d 20 70 45 78   int bDesc = pEx
6a90: 70 72 2d 3e 62 44 65 73 63 3b 0a 0a 20 20 2f 2a  pr->bDesc;..  /*
6aa0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
6ab0: 20 6e 6f 64 65 20 73 68 6f 75 6c 64 20 6e 6f 74   node should not
6ac0: 20 62 65 20 46 54 53 35 5f 54 45 52 4d 20 2a 2f   be FTS5_TERM */
6ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 61 72  .  assert( pNear
6ae0: 2d 3e 6e 50 68 72 61 73 65 3e 31 20 0a 20 20 20  ->nPhrase>1 .   
6af0: 20 20 20 20 7c 7c 20 70 4e 65 61 72 2d 3e 61 70      || pNear->ap
6b00: 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54 65 72 6d  Phrase[0]->nTerm
6b10: 3e 31 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  >1 .       || pN
6b20: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
6b30: 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f  ->aTerm[0].pSyno
6b40: 6e 79 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  nym.       || pN
6b50: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
6b60: 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73  ->aTerm[0].bFirs
6b70: 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  t.  );..  /* Ini
6b80: 74 69 61 6c 69 7a 65 20 69 4c 61 73 74 2c 20 74  tialize iLast, t
6b90: 68 65 20 22 6c 61 73 74 65 73 74 22 20 72 6f 77  he "lastest" row
6ba0: 69 64 20 61 6e 79 20 69 74 65 72 61 74 6f 72 20  id any iterator 
6bb0: 70 6f 69 6e 74 73 20 74 6f 2e 20 49 66 20 74 68  points to. If th
6bc0: 65 0a 20 20 2a 2a 20 69 74 65 72 61 74 6f 72 20  e.  ** iterator 
6bd0: 73 6b 69 70 73 20 74 68 72 6f 75 67 68 20 72 6f  skips through ro
6be0: 77 69 64 73 20 69 6e 20 74 68 65 20 64 65 66 61  wids in the defa
6bf0: 75 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72  ult ascending or
6c00: 64 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a  der, this means.
6c10: 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
6c20: 20 72 6f 77 69 64 2e 20 4f 72 2c 20 69 66 20 74   rowid. Or, if t
6c30: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 22  he iterator is "
6c40: 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
6c50: 45 53 43 22 2c 20 74 68 65 6e 20 69 74 0a 20 20  ESC", then it.  
6c60: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 6d 69 6e  ** means the min
6c70: 69 6d 75 6d 20 72 6f 77 69 64 2e 20 20 2a 2f 0a  imum rowid.  */.
6c80: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 61 54 65    if( pLeft->aTe
6c90: 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 20 29  rm[0].pSynonym )
6ca0: 7b 0a 20 20 20 20 69 4c 61 73 74 20 3d 20 66 74  {.    iLast = ft
6cb0: 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77  s5ExprSynonymRow
6cc0: 69 64 28 26 70 4c 65 66 74 2d 3e 61 54 65 72 6d  id(&pLeft->aTerm
6cd0: 5b 30 5d 2c 20 62 44 65 73 63 2c 20 30 29 3b 0a  [0], bDesc, 0);.
6ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4c 61    }else{.    iLa
6cf0: 73 74 20 3d 20 70 4c 65 66 74 2d 3e 61 54 65 72  st = pLeft->aTer
6d00: 6d 5b 30 5d 2e 70 49 74 65 72 2d 3e 69 52 6f 77  m[0].pIter->iRow
6d10: 69 64 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a  id;.  }..  do {.
6d20: 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a      bMatch = 1;.
6d30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6d40: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69  Near->nPhrase; i
6d50: 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45  ++){.      Fts5E
6d60: 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61  xprPhrase *pPhra
6d70: 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68  se = pNear->apPh
6d80: 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20 20 66  rase[i];.      f
6d90: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 68 72 61 73  or(j=0; j<pPhras
6da0: 65 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 29 7b 0a  e->nTerm; j++){.
6db0: 20 20 20 20 20 20 20 20 46 74 73 35 45 78 70 72          Fts5Expr
6dc0: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
6dd0: 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 6a 5d  Phrase->aTerm[j]
6de0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
6df0: 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 7b  erm->pSynonym ){
6e00: 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
6e10: 52 6f 77 69 64 20 3d 20 66 74 73 35 45 78 70 72  Rowid = fts5Expr
6e20: 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70 54 65  SynonymRowid(pTe
6e30: 72 6d 2c 20 62 44 65 73 63 2c 20 30 29 3b 0a 20  rm, bDesc, 0);. 
6e40: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
6e50: 77 69 64 3d 3d 69 4c 61 73 74 20 29 20 63 6f 6e  wid==iLast ) con
6e60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
6e70: 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20   bMatch = 0;.   
6e80: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 45         if( fts5E
6e90: 78 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e 63  xprSynonymAdvanc
6ea0: 65 74 6f 28 70 54 65 72 6d 2c 20 62 44 65 73 63  eto(pTerm, bDesc
6eb0: 2c 20 26 69 4c 61 73 74 2c 20 26 72 63 29 20 29  , &iLast, &rc) )
6ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  {.            pN
6ed0: 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20  ode->bNomatch = 
6ee0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
6ef0: 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Node->bEof = 1;.
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
6f10: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
6f20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
6f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35  {.          Fts5
6f40: 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
6f50: 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72   = pPhrase->aTer
6f60: 6d 5b 6a 5d 2e 70 49 74 65 72 3b 0a 20 20 20 20  m[j].pIter;.    
6f70: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
6f80: 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 20 7c  >iRowid==iLast |
6f90: 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 29 20  | pIter->bEof ) 
6fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6fb0: 20 20 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a      bMatch = 0;.
6fc0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74            if( ft
6fd0: 73 35 45 78 70 72 41 64 76 61 6e 63 65 74 6f 28  s5ExprAdvanceto(
6fe0: 70 49 74 65 72 2c 20 62 44 65 73 63 2c 20 26 69  pIter, bDesc, &i
6ff0: 4c 61 73 74 2c 20 26 72 63 2c 20 26 70 4e 6f 64  Last, &rc, &pNod
7000: 65 2d 3e 62 45 6f 66 29 20 29 7b 0a 20 20 20 20  e->bEof) ){.    
7010: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
7020: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
7030: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7040: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
7050: 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20   bMatch==0 );.. 
7060: 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d   pNode->iRowid =
7070: 20 69 4c 61 73 74 3b 0a 20 20 70 4e 6f 64 65 2d   iLast;.  pNode-
7080: 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28 28 30 3d  >bNomatch = ((0=
7090: 3d 66 74 73 35 45 78 70 72 4e 65 61 72 54 65 73  =fts5ExprNearTes
70a0: 74 28 26 72 63 2c 20 70 45 78 70 72 2c 20 70 4e  t(&rc, pExpr, pN
70b0: 6f 64 65 29 29 20 26 26 20 72 63 3d 3d 53 51 4c  ode)) && rc==SQL
70c0: 49 54 45 5f 4f 4b 29 3b 0a 20 20 61 73 73 65 72  ITE_OK);.  asser
70d0: 74 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d  t( pNode->bEof==
70e0: 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  0 || pNode->bNom
70f0: 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  atch==0 );..  re
7100: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7110: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 66 69  * Advance the fi
7120: 72 73 74 20 74 65 72 6d 20 69 74 65 72 61 74 6f  rst term iterato
7130: 72 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 70  r in the first p
7140: 68 72 61 73 65 20 6f 66 20 70 4e 65 61 72 2e 20  hrase of pNear. 
7150: 53 65 74 20 6f 75 74 70 75 74 0a 2a 2a 20 76 61  Set output.** va
7160: 72 69 61 62 6c 65 20 2a 70 62 45 6f 66 20 74 6f  riable *pbEof to
7170: 20 74 72 75 65 20 69 66 20 69 74 20 72 65 61 63   true if it reac
7180: 68 65 73 20 45 4f 46 20 6f 72 20 69 66 20 61 6e  hes EOF or if an
7190: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
71a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
71b0: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
71c0: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
71d0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
71e0: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
71f0: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
7200: 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  t fts5ExprNodeNe
7210: 78 74 5f 53 54 52 49 4e 47 28 0a 20 20 46 74 73  xt_STRING(.  Fts
7220: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  5Expr *pExpr,   
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7240: 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61  Expression pPhra
7250: 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  se belongs to */
7260: 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
7270: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
7280: 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 52 49 4e     /* FTS5_STRIN
7290: 47 20 6f 72 20 46 54 53 35 5f 54 45 52 4d 20 6e  G or FTS5_TERM n
72a0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46 72  ode */.  int bFr
72b0: 6f 6d 56 61 6c 69 64 2c 0a 20 20 69 36 34 20 69  omValid,.  i64 i
72c0: 46 72 6f 6d 20 0a 29 7b 0a 20 20 46 74 73 35 45  From .){.  Fts5E
72d0: 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  xprTerm *pTerm =
72e0: 20 26 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e   &pNode->pNear->
72f0: 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 61 54 65  apPhrase[0]->aTe
7300: 72 6d 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20  rm[0];.  int rc 
7310: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
7320: 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20  pNode->bNomatch 
7330: 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  = 0;.  if( pTerm
7340: 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 7b 0a 20 20  ->pSynonym ){.  
7350: 20 20 69 6e 74 20 62 45 6f 66 20 3d 20 31 3b 0a    int bEof = 1;.
7360: 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
7370: 20 2a 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e   *p;..    /* Fin
7380: 64 20 74 68 65 20 66 69 72 73 74 65 73 74 20 72  d the firstest r
7390: 6f 77 69 64 20 61 6e 79 20 73 79 6e 6f 6e 79 6d  owid any synonym
73a0: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 2a 2f 0a 20   points to. */. 
73b0: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
73c0: 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52  fts5ExprSynonymR
73d0: 6f 77 69 64 28 70 54 65 72 6d 2c 20 70 45 78 70  owid(pTerm, pExp
73e0: 72 2d 3e 62 44 65 73 63 2c 20 30 29 3b 0a 0a 20  r->bDesc, 0);.. 
73f0: 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61     /* Advance ea
7400: 63 68 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  ch iterator that
7410: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
7420: 73 20 74 6f 20 69 52 6f 77 69 64 2e 20 4f 72 2c  s to iRowid. Or,
7430: 20 69 66 20 69 46 72 6f 6d 0a 20 20 20 20 2a 2a   if iFrom.    **
7440: 20 69 73 20 76 61 6c 69 64 20 2d 20 65 61 63 68   is valid - each
7450: 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 70   iterator that p
7460: 6f 69 6e 74 73 20 74 6f 20 61 20 72 6f 77 69 64  oints to a rowid
7470: 20 62 65 66 6f 72 65 20 69 46 72 6f 6d 2e 20 20   before iFrom.  
7480: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 65  */.    for(p=pTe
7490: 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e  rm; p; p=p->pSyn
74a0: 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20 69 66 28  onym){.      if(
74b0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
74c0: 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30  Eof(p->pIter)==0
74d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
74e0: 69 69 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69  ii = p->pIter->i
74f0: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 69  Rowid;.        i
7500: 66 28 20 69 69 3d 3d 69 52 6f 77 69 64 20 0a 20  f( ii==iRowid . 
7510: 20 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72 6f          || (bFro
7520: 6d 56 61 6c 69 64 20 26 26 20 69 69 21 3d 69 46  mValid && ii!=iF
7530: 72 6f 6d 20 26 26 20 28 69 69 3e 69 46 72 6f 6d  rom && (ii>iFrom
7540: 29 3d 3d 70 45 78 70 72 2d 3e 62 44 65 73 63 29  )==pExpr->bDesc)
7550: 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
7560: 20 20 20 20 20 20 20 69 66 28 20 62 46 72 6f 6d         if( bFrom
7570: 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Valid ){.       
7580: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7590: 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f  3Fts5IterNextFro
75a0: 6d 28 70 2d 3e 70 49 74 65 72 2c 20 69 46 72 6f  m(p->pIter, iFro
75b0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  m);.          }e
75c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
75d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
75e0: 35 49 74 65 72 4e 65 78 74 28 70 2d 3e 70 49 74  5IterNext(p->pIt
75f0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
7600: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
7610: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
7620: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
7630: 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 49  if( sqlite3Fts5I
7640: 74 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29  terEof(p->pIter)
7650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7660: 20 20 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20     bEof = 0;.   
7670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7690: 20 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20    bEof = 0;.    
76a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
76b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
76c0: 74 68 65 20 45 4f 46 20 66 6c 61 67 20 69 66 20  the EOF flag if 
76d0: 65 69 74 68 65 72 20 61 6c 6c 20 73 79 6e 6f 6e  either all synon
76e0: 79 6d 20 69 74 65 72 61 74 6f 72 73 20 61 72 65  ym iterators are
76f0: 20 61 74 20 45 4f 46 20 6f 72 20 61 6e 0a 20 20   at EOF or an.  
7700: 20 20 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 6f    ** error has o
7710: 63 63 75 72 72 65 64 2e 20 20 2a 2f 0a 20 20 20  ccurred.  */.   
7720: 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 28   pNode->bEof = (
7730: 72 63 20 7c 7c 20 62 45 6f 66 29 3b 0a 20 20 7d  rc || bEof);.  }
7740: 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 49 6e  else{.    Fts5In
7750: 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  dexIter *pIter =
7760: 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0a 0a   pTerm->pIter;..
7770: 20 20 20 20 61 73 73 65 72 74 28 20 46 74 73 35      assert( Fts5
7780: 4e 6f 64 65 49 73 53 74 72 69 6e 67 28 70 4e 6f  NodeIsString(pNo
7790: 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 62  de) );.    if( b
77a0: 46 72 6f 6d 56 61 6c 69 64 20 29 7b 0a 20 20 20  FromValid ){.   
77b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
77c0: 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ts5IterNextFrom(
77d0: 70 49 74 65 72 2c 20 69 46 72 6f 6d 29 3b 0a 20  pIter, iFrom);. 
77e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
7800: 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b  IterNext(pIter);
7810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 6f 64  .    }..    pNod
7820: 65 2d 3e 62 45 6f 66 20 3d 20 28 72 63 20 7c 7c  e->bEof = (rc ||
7830: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
7840: 45 6f 66 28 70 49 74 65 72 29 29 3b 0a 20 20 7d  Eof(pIter));.  }
7850: 0a 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62  ..  if( pNode->b
7860: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Eof==0 ){.    as
7870: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
7880: 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
7890: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
78a0: 5f 53 54 52 49 4e 47 28 70 45 78 70 72 2c 20 70  _STRING(pExpr, p
78b0: 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Node);.  }..  re
78c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
78d0: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
78e0: 4e 6f 64 65 54 65 73 74 5f 54 45 52 4d 28 0a 20  NodeTest_TERM(. 
78f0: 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
7900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7910: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
7920: 68 61 74 20 70 4e 65 61 72 20 69 73 20 61 20 70  hat pNear is a p
7930: 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35  art of */.  Fts5
7940: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  ExprNode *pNode 
7950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7960: 68 65 20 22 4e 45 41 52 22 20 6e 6f 64 65 20 28  he "NEAR" node (
7970: 46 54 53 35 5f 54 45 52 4d 29 20 2a 2f 0a 29 7b  FTS5_TERM) */.){
7980: 0a 20 20 2f 2a 20 41 73 20 74 68 69 73 20 22 4e  .  /* As this "N
7990: 45 41 52 22 20 6f 62 6a 65 63 74 20 69 73 20 61  EAR" object is a
79a0: 63 74 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  ctually a single
79b0: 20 70 68 72 61 73 65 20 74 68 61 74 20 63 6f 6e   phrase that con
79c0: 73 69 73 74 73 20 0a 20 20 2a 2a 20 6f 66 20 61  sists .  ** of a
79d0: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 6e 6c   single term onl
79e0: 79 2c 20 67 72 61 62 20 70 6f 69 6e 74 65 72 73  y, grab pointers
79f0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 73 6c 69 73   into the poslis
7a00: 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65  t managed by the
7a10: 0a 20 20 2a 2a 20 66 74 73 35 5f 69 6e 64 65 78  .  ** fts5_index
7a20: 2e 63 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  .c iterator obje
7a30: 63 74 2e 20 54 68 69 73 20 69 73 20 6d 75 63 68  ct. This is much
7a40: 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 79 6e   faster than syn
7a50: 74 68 65 73 69 7a 69 6e 67 20 0a 20 20 2a 2a 20  thesizing .  ** 
7a60: 61 20 6e 65 77 20 70 6f 73 6c 69 73 74 20 74 68  a new poslist th
7a70: 65 20 77 61 79 20 77 65 20 68 61 76 65 20 74 6f  e way we have to
7a80: 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6c 69   for more compli
7a90: 63 61 74 65 64 20 70 68 72 61 73 65 20 6f 72 20  cated phrase or 
7aa0: 4e 45 41 52 0a 20 20 2a 2a 20 65 78 70 72 65 73  NEAR.  ** expres
7ab0: 73 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 46 74 73  sions.  */.  Fts
7ac0: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
7ad0: 72 61 73 65 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e  rase = pNode->pN
7ae0: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
7af0: 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ;.  Fts5IndexIte
7b00: 72 20 2a 70 49 74 65 72 20 3d 20 70 50 68 72 61  r *pIter = pPhra
7b10: 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74  se->aTerm[0].pIt
7b20: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  er;..  assert( p
7b30: 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Node->eType==FTS
7b40: 35 5f 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  5_TERM );.  asse
7b50: 72 74 28 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72  rt( pNode->pNear
7b60: 2d 3e 6e 50 68 72 61 73 65 3d 3d 31 20 26 26 20  ->nPhrase==1 && 
7b70: 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d  pPhrase->nTerm==
7b80: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
7b90: 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d  Phrase->aTerm[0]
7ba0: 2e 70 53 79 6e 6f 6e 79 6d 3d 3d 30 20 29 3b 0a  .pSynonym==0 );.
7bb0: 0a 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  .  pPhrase->posl
7bc0: 69 73 74 2e 6e 20 3d 20 70 49 74 65 72 2d 3e 6e  ist.n = pIter->n
7bd0: 44 61 74 61 3b 0a 20 20 69 66 28 20 70 45 78 70  Data;.  if( pExp
7be0: 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  r->pConfig->eDet
7bf0: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
7c00: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 70 50 68  _FULL ){.    pPh
7c10: 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 70 20  rase->poslist.p 
7c20: 3d 20 28 75 38 2a 29 70 49 74 65 72 2d 3e 70 44  = (u8*)pIter->pD
7c30: 61 74 61 3b 0a 20 20 7d 0a 20 20 70 4e 6f 64 65  ata;.  }.  pNode
7c40: 2d 3e 69 52 6f 77 69 64 20 3d 20 70 49 74 65 72  ->iRowid = pIter
7c50: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 4e 6f 64  ->iRowid;.  pNod
7c60: 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28 70  e->bNomatch = (p
7c70: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
7c80: 6e 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  n==0);.  return 
7c90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7ca0: 0a 2a 2a 20 78 4e 65 78 74 28 29 20 6d 65 74 68  .** xNext() meth
7cb0: 6f 64 20 66 6f 72 20 61 20 6e 6f 64 65 20 6f 66  od for a node of
7cc0: 20 74 79 70 65 20 46 54 53 35 5f 54 45 52 4d 2e   type FTS5_TERM.
7cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7ce0: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f  ts5ExprNodeNext_
7cf0: 54 45 52 4d 28 0a 20 20 46 74 73 35 45 78 70 72  TERM(.  Fts5Expr
7d00: 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74 73 35   *pExpr, .  Fts5
7d10: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  ExprNode *pNode,
7d20: 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69  .  int bFromVali
7d30: 64 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d 0a 29  d,.  i64 iFrom.)
7d40: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 74  {.  int rc;.  Ft
7d50: 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
7d60: 65 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  er = pNode->pNea
7d70: 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e  r->apPhrase[0]->
7d80: 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 3b 0a  aTerm[0].pIter;.
7d90: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  .  assert( pNode
7da0: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69  ->bEof==0 );.  i
7db0: 66 28 20 62 46 72 6f 6d 56 61 6c 69 64 20 29 7b  f( bFromValid ){
7dc0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7dd0: 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f  3Fts5IterNextFro
7de0: 6d 28 70 49 74 65 72 2c 20 69 46 72 6f 6d 29 3b  m(pIter, iFrom);
7df0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
7e00: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74   = sqlite3Fts5It
7e10: 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20  erNext(pIter);. 
7e20: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
7e30: 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
7e40: 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74  3Fts5IterEof(pIt
7e50: 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  er)==0 ){.    rc
7e60: 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54   = fts5ExprNodeT
7e70: 65 73 74 5f 54 45 52 4d 28 70 45 78 70 72 2c 20  est_TERM(pExpr, 
7e80: 70 4e 6f 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  pNode);.  }else{
7e90: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66  .    pNode->bEof
7ea0: 20 3d 20 31 3b 0a 20 20 20 20 70 4e 6f 64 65 2d   = 1;.    pNode-
7eb0: 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20  >bNomatch = 0;. 
7ec0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7ed0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
7ee0: 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f  ts5ExprNodeTest_
7ef0: 4f 52 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a  OR(.  Fts5Expr *
7f00: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
7f10: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
7f20: 69 6f 6e 20 6f 66 20 77 68 69 63 68 20 70 4e 6f  ion of which pNo
7f30: 64 65 20 69 73 20 61 20 70 61 72 74 20 2a 2f 0a  de is a part */.
7f40: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
7f50: 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  pNode           
7f60: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
7f70: 6e 6f 64 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a  node to test */.
7f80: 29 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  ){.  Fts5ExprNod
7f90: 65 20 2a 70 4e 65 78 74 20 3d 20 70 4e 6f 64 65  e *pNext = pNode
7fa0: 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 3b 0a 20 20  ->apChild[0];.  
7fb0: 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d  int i;..  for(i=
7fc0: 31 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69  1; i<pNode->nChi
7fd0: 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  ld; i++){.    Ft
7fe0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 43 68 69  s5ExprNode *pChi
7ff0: 6c 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68  ld = pNode->apCh
8000: 69 6c 64 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ild[i];.    int 
8010: 63 6d 70 20 3d 20 66 74 73 35 4e 6f 64 65 43 6f  cmp = fts5NodeCo
8020: 6d 70 61 72 65 28 70 45 78 70 72 2c 20 70 4e 65  mpare(pExpr, pNe
8030: 78 74 2c 20 70 43 68 69 6c 64 29 3b 0a 20 20 20  xt, pChild);.   
8040: 20 69 66 28 20 63 6d 70 3e 30 20 7c 7c 20 28 63   if( cmp>0 || (c
8050: 6d 70 3d 3d 30 20 26 26 20 70 43 68 69 6c 64 2d  mp==0 && pChild-
8060: 3e 62 4e 6f 6d 61 74 63 68 3d 3d 30 29 20 29 7b  >bNomatch==0) ){
8070: 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
8080: 43 68 69 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  Child;.    }.  }
8090: 0a 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64  .  pNode->iRowid
80a0: 20 3d 20 70 4e 65 78 74 2d 3e 69 52 6f 77 69 64   = pNext->iRowid
80b0: 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20  ;.  pNode->bEof 
80c0: 3d 20 70 4e 65 78 74 2d 3e 62 45 6f 66 3b 0a 20  = pNext->bEof;. 
80d0: 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68   pNode->bNomatch
80e0: 20 3d 20 70 4e 65 78 74 2d 3e 62 4e 6f 6d 61 74   = pNext->bNomat
80f0: 63 68 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ch;.}..static in
8100: 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  t fts5ExprNodeNe
8110: 78 74 5f 4f 52 28 0a 20 20 46 74 73 35 45 78 70  xt_OR(.  Fts5Exp
8120: 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74 73  r *pExpr, .  Fts
8130: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
8140: 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c  ,.  int bFromVal
8150: 69 64 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d 0a  id,.  i64 iFrom.
8160: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 36  ){.  int i;.  i6
8170: 34 20 69 4c 61 73 74 20 3d 20 70 4e 6f 64 65 2d  4 iLast = pNode-
8180: 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 66 6f 72 28  >iRowid;..  for(
8190: 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43  i=0; i<pNode->nC
81a0: 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  hild; i++){.    
81b0: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 31  Fts5ExprNode *p1
81c0: 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c   = pNode->apChil
81d0: 64 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  d[i];.    assert
81e0: 28 20 70 31 2d 3e 62 45 6f 66 20 7c 7c 20 66 74  ( p1->bEof || ft
81f0: 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72  s5RowidCmp(pExpr
8200: 2c 20 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69 4c  , p1->iRowid, iL
8210: 61 73 74 29 3e 3d 30 20 29 3b 0a 20 20 20 20 69  ast)>=0 );.    i
8220: 66 28 20 70 31 2d 3e 62 45 6f 66 3d 3d 30 20 29  f( p1->bEof==0 )
8230: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 31 2d  {.      if( (p1-
8240: 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 29 20  >iRowid==iLast) 
8250: 0a 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72 6f  .       || (bFro
8260: 6d 56 61 6c 69 64 20 26 26 20 66 74 73 35 52 6f  mValid && fts5Ro
8270: 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 70 31  widCmp(pExpr, p1
8280: 2d 3e 69 52 6f 77 69 64 2c 20 69 46 72 6f 6d 29  ->iRowid, iFrom)
8290: 3c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  <0).      ){.   
82a0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74       int rc = ft
82b0: 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70  s5ExprNodeNext(p
82c0: 45 78 70 72 2c 20 70 31 2c 20 62 46 72 6f 6d 56  Expr, p1, bFromV
82d0: 61 6c 69 64 2c 20 69 46 72 6f 6d 29 3b 0a 20 20  alid, iFrom);.  
82e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
82f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8300: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d       pNode->bNom
8310: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
8320: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8330: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
8350: 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f  s5ExprNodeTest_O
8360: 52 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b  R(pExpr, pNode);
8370: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8380: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  _OK;.}../*.** Ar
8390: 67 75 6d 65 6e 74 20 70 4e 6f 64 65 20 69 73 20  gument pNode is 
83a0: 61 6e 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64 65  an FTS5_AND node
83b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
83c0: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
83d0: 5f 41 4e 44 28 0a 20 20 46 74 73 35 45 78 70 72  _AND(.  Fts5Expr
83e0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
83f0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
8400: 73 73 69 6f 6e 20 70 50 68 72 61 73 65 20 62 65  ssion pPhrase be
8410: 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74  longs to */.  Ft
8420: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 41 6e 64  s5ExprNode *pAnd
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8440: 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64 65 20 74   FTS5_AND node t
8450: 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a  o advance */.){.
8460: 20 20 69 6e 74 20 69 43 68 69 6c 64 3b 0a 20 20    int iChild;.  
8470: 69 36 34 20 69 4c 61 73 74 20 3d 20 70 41 6e 64  i64 iLast = pAnd
8480: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  ->iRowid;.  int 
8490: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
84a0: 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 0a 20    int bMatch;.. 
84b0: 20 61 73 73 65 72 74 28 20 70 41 6e 64 2d 3e 62   assert( pAnd->b
84c0: 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 64 6f 20 7b  Eof==0 );.  do {
84d0: 0a 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61  .    pAnd->bNoma
84e0: 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 62 4d 61  tch = 0;.    bMa
84f0: 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  tch = 1;.    for
8500: 28 69 43 68 69 6c 64 3d 30 3b 20 69 43 68 69 6c  (iChild=0; iChil
8510: 64 3c 70 41 6e 64 2d 3e 6e 43 68 69 6c 64 3b 20  d<pAnd->nChild; 
8520: 69 43 68 69 6c 64 2b 2b 29 7b 0a 20 20 20 20 20  iChild++){.     
8530: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
8540: 43 68 69 6c 64 20 3d 20 70 41 6e 64 2d 3e 61 70  Child = pAnd->ap
8550: 43 68 69 6c 64 5b 69 43 68 69 6c 64 5d 3b 0a 20  Child[iChild];. 
8560: 20 20 20 20 20 69 6e 74 20 63 6d 70 20 3d 20 66       int cmp = f
8570: 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70  ts5RowidCmp(pExp
8580: 72 2c 20 69 4c 61 73 74 2c 20 70 43 68 69 6c 64  r, iLast, pChild
8590: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
85a0: 20 69 66 28 20 63 6d 70 3e 30 20 29 7b 0a 20 20   if( cmp>0 ){.  
85b0: 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
85c0: 20 70 43 68 69 6c 64 20 75 6e 74 69 6c 20 69 74   pChild until it
85d0: 20 70 6f 69 6e 74 73 20 74 6f 20 69 4c 61 73 74   points to iLast
85e0: 20 6f 72 20 6c 61 73 74 65 72 20 2a 2f 0a 20 20   or laster */.  
85f0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45        rc = fts5E
8600: 78 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70  xprNodeNext(pExp
8610: 72 2c 20 70 43 68 69 6c 64 2c 20 31 2c 20 69 4c  r, pChild, 1, iL
8620: 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ast);.        if
8630: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8640: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  ){.          pAn
8650: 64 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b  d->bNomatch = 0;
8660: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8670: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
8680: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
8690: 2a 20 49 66 20 74 68 65 20 63 68 69 6c 64 20 6e  * If the child n
86a0: 6f 64 65 20 69 73 20 6e 6f 77 20 61 74 20 45 4f  ode is now at EO
86b0: 46 2c 20 73 6f 20 69 73 20 74 68 65 20 70 61 72  F, so is the par
86c0: 65 6e 74 20 41 4e 44 20 6e 6f 64 65 2e 20 4f 74  ent AND node. Ot
86d0: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
86e0: 2a 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65  * the child node
86f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
8700: 6f 20 68 61 76 65 20 61 64 76 61 6e 63 65 64 20  o have advanced 
8710: 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20  at least as far 
8720: 61 73 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69  as.      ** rowi
8730: 64 20 69 4c 61 73 74 2e 20 53 6f 20 69 66 20 69  d iLast. So if i
8740: 74 20 69 73 20 6e 6f 74 20 61 74 20 65 78 61 63  t is not at exac
8750: 74 6c 79 20 69 4c 61 73 74 2c 20 70 43 68 69 6c  tly iLast, pChil
8760: 64 2d 3e 69 52 6f 77 69 64 20 69 73 20 74 68 65  d->iRowid is the
8770: 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 6c 61  .      ** new la
8780: 73 74 65 73 74 20 72 6f 77 69 64 20 73 65 65 6e  stest rowid seen
8790: 20 73 6f 20 66 61 72 2e 20 20 2a 2f 0a 20 20 20   so far.  */.   
87a0: 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
87b0: 64 2d 3e 62 45 6f 66 20 7c 7c 20 66 74 73 35 52  d->bEof || fts5R
87c0: 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 69  owidCmp(pExpr, i
87d0: 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d 3e 69 52  Last, pChild->iR
87e0: 6f 77 69 64 29 3c 3d 30 20 29 3b 0a 20 20 20 20  owid)<=0 );.    
87f0: 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 62 45    if( pChild->bE
8800: 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  of ){.        ft
8810: 73 35 45 78 70 72 53 65 74 45 6f 66 28 70 41 6e  s5ExprSetEof(pAn
8820: 64 29 3b 0a 20 20 20 20 20 20 20 20 62 4d 61 74  d);.        bMat
8830: 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
8840: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
8850: 73 65 20 69 66 28 20 69 4c 61 73 74 21 3d 70 43  se if( iLast!=pC
8860: 68 69 6c 64 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  hild->iRowid ){.
8870: 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d          bMatch =
8880: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 4c 61 73   0;.        iLas
8890: 74 20 3d 20 70 43 68 69 6c 64 2d 3e 69 52 6f 77  t = pChild->iRow
88a0: 69 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  id;.      }..   
88b0: 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 62     if( pChild->b
88c0: 4e 6f 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  Nomatch ){.     
88d0: 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63     pAnd->bNomatc
88e0: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 1;.      }. 
88f0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 62     }.  }while( b
8900: 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20 69  Match==0 );..  i
8910: 66 28 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63  f( pAnd->bNomatc
8920: 68 20 26 26 20 70 41 6e 64 21 3d 70 45 78 70 72  h && pAnd!=pExpr
8930: 2d 3e 70 52 6f 6f 74 20 29 7b 0a 20 20 20 20 66  ->pRoot ){.    f
8940: 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
8950: 6f 73 6c 69 73 74 28 70 41 6e 64 29 3b 0a 20 20  oslist(pAnd);.  
8960: 7d 0a 20 20 70 41 6e 64 2d 3e 69 52 6f 77 69 64  }.  pAnd->iRowid
8970: 20 3d 20 69 4c 61 73 74 3b 0a 20 20 72 65 74 75   = iLast;.  retu
8980: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8990: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
89a0: 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 41 4e 44  ExprNodeNext_AND
89b0: 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  (.  Fts5Expr *pE
89c0: 78 70 72 2c 20 0a 20 20 46 74 73 35 45 78 70 72  xpr, .  Fts5Expr
89d0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 69  Node *pNode,.  i
89e0: 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a 20  nt bFromValid,. 
89f0: 20 69 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20 20   i64 iFrom.){.  
8a00: 69 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78 70  int rc = fts5Exp
8a10: 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c  rNodeNext(pExpr,
8a20: 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
8a30: 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20  0], bFromValid, 
8a40: 69 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72 63  iFrom);.  if( rc
8a50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8a60: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
8a70: 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28 70 45 78  NodeTest_AND(pEx
8a80: 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 65  pr, pNode);.  }e
8a90: 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  lse{.    pNode->
8aa0: 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20  bNomatch = 0;.  
8ab0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8ac0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
8ad0: 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4e 4f  5ExprNodeTest_NO
8ae0: 54 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  T(.  Fts5Expr *p
8af0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
8b00: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
8b10: 6f 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f 6e  on pPhrase belon
8b20: 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 45  gs to */.  Fts5E
8b30: 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20  xprNode *pNode  
8b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
8b50: 53 35 5f 4e 4f 54 20 6e 6f 64 65 20 74 6f 20 61  S5_NOT node to a
8b60: 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20 69  dvance */.){.  i
8b70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8b80: 4b 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  K;.  Fts5ExprNod
8b90: 65 20 2a 70 31 20 3d 20 70 4e 6f 64 65 2d 3e 61  e *p1 = pNode->a
8ba0: 70 43 68 69 6c 64 5b 30 5d 3b 0a 20 20 46 74 73  pChild[0];.  Fts
8bb0: 35 45 78 70 72 4e 6f 64 65 20 2a 70 32 20 3d 20  5ExprNode *p2 = 
8bc0: 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 31  pNode->apChild[1
8bd0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f  ];.  assert( pNo
8be0: 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 32 20 29 3b  de->nChild==2 );
8bf0: 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
8c00: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 2d 3e  QLITE_OK && p1->
8c10: 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  bEof==0 ){.    i
8c20: 6e 74 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f 64  nt cmp = fts5Nod
8c30: 65 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 20  eCompare(pExpr, 
8c40: 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 69 66 28  p1, p2);.    if(
8c50: 20 63 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20   cmp>0 ){.      
8c60: 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
8c70: 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70 32 2c  eNext(pExpr, p2,
8c80: 20 31 2c 20 70 31 2d 3e 69 52 6f 77 69 64 29 3b   1, p1->iRowid);
8c90: 0a 20 20 20 20 20 20 63 6d 70 20 3d 20 66 74 73  .      cmp = fts
8ca0: 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45 78  5NodeCompare(pEx
8cb0: 70 72 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 20  pr, p1, p2);.   
8cc0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
8cd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8ce0: 63 6d 70 3c 3d 30 20 29 3b 0a 20 20 20 20 69 66  cmp<=0 );.    if
8cf0: 28 20 63 6d 70 20 7c 7c 20 70 32 2d 3e 62 4e 6f  ( cmp || p2->bNo
8d00: 6d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  match ) break;. 
8d10: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
8d20: 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20  NodeNext(pExpr, 
8d30: 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  p1, 0, 0);.  }. 
8d40: 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 70   pNode->bEof = p
8d50: 31 2d 3e 62 45 6f 66 3b 0a 20 20 70 4e 6f 64 65  1->bEof;.  pNode
8d60: 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 70 31 2d  ->bNomatch = p1-
8d70: 3e 62 4e 6f 6d 61 74 63 68 3b 0a 20 20 70 4e 6f  >bNomatch;.  pNo
8d80: 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 31 2d  de->iRowid = p1-
8d90: 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28 20 70  >iRowid;.  if( p
8da0: 31 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20 66  1->bEof ){.    f
8db0: 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
8dc0: 6f 73 6c 69 73 74 28 70 32 29 3b 0a 20 20 7d 0a  oslist(p2);.  }.
8dd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8de0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45  static int fts5E
8df0: 78 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54 28  xprNodeNext_NOT(
8e00: 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78  .  Fts5Expr *pEx
8e10: 70 72 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e  pr, .  Fts5ExprN
8e20: 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 69 6e  ode *pNode,.  in
8e30: 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a 20 20  t bFromValid,.  
8e40: 69 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20 20 69  i64 iFrom.){.  i
8e50: 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78 70 72  nt rc = fts5Expr
8e60: 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20  NodeNext(pExpr, 
8e70: 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30  pNode->apChild[0
8e80: 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20 69  ], bFromValid, i
8e90: 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72 63 3d  From);.  if( rc=
8ea0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8eb0: 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
8ec0: 6f 64 65 54 65 73 74 5f 4e 4f 54 28 70 45 78 70  odeTest_NOT(pExp
8ed0: 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 20  r, pNode);.  }. 
8ee0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8ef0: 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d  OK ){.    pNode-
8f00: 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20  >bNomatch = 0;. 
8f10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 4e 6f 64  }../*.** If pNod
8f30: 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  e currently poin
8f40: 74 73 20 74 6f 20 61 20 6d 61 74 63 68 2c 20 74  ts to a match, t
8f50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
8f60: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  urns SQLITE_OK.*
8f70: 2a 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66 79  * without modify
8f80: 69 6e 67 20 69 74 2e 20 4f 74 68 65 72 77 69 73  ing it. Otherwis
8f90: 65 2c 20 70 4e 6f 64 65 20 69 73 20 61 64 76 61  e, pNode is adva
8fa0: 6e 63 65 64 20 75 6e 74 69 6c 20 69 74 20 64 6f  nced until it do
8fb0: 65 73 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 61  es point.** to a
8fc0: 20 6d 61 74 63 68 20 6f 72 20 45 4f 46 20 69 73   match or EOF is
8fd0: 20 72 65 61 63 68 65 64 2e 0a 2a 2f 0a 73 74 61   reached..*/.sta
8fe0: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
8ff0: 4e 6f 64 65 54 65 73 74 28 0a 20 20 46 74 73 35  NodeTest(.  Fts5
9000: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
9010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9020: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 77 68 69  xpression of whi
9030: 63 68 20 70 4e 6f 64 65 20 69 73 20 61 20 70 61  ch pNode is a pa
9040: 72 74 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  rt */.  Fts5Expr
9050: 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20  Node *pNode     
9060: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
9070: 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 74 65  ssion node to te
9080: 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  st */.){.  int r
9090: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
90a0: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66   if( pNode->bEof
90b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 77 69 74 63  ==0 ){.    switc
90c0: 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20  h( pNode->eType 
90d0: 29 7b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 46  ){..      case F
90e0: 54 53 35 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20  TS5_STRING: {.  
90f0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45        rc = fts5E
9100: 78 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52 49  xprNodeTest_STRI
9110: 4e 47 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29  NG(pExpr, pNode)
9120: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9130: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9140: 63 61 73 65 20 46 54 53 35 5f 54 45 52 4d 3a 20  case FTS5_TERM: 
9150: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
9160: 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f  ts5ExprNodeTest_
9170: 54 45 52 4d 28 70 45 78 70 72 2c 20 70 4e 6f 64  TERM(pExpr, pNod
9180: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
9190: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
91a0: 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a    case FTS5_AND:
91b0: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
91c0: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
91d0: 5f 41 4e 44 28 70 45 78 70 72 2c 20 70 4e 6f 64  _AND(pExpr, pNod
91e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
91f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
9200: 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20    case FTS5_OR: 
9210: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 45 78  {.        fts5Ex
9220: 70 72 4e 6f 64 65 54 65 73 74 5f 4f 52 28 70 45  prNodeTest_OR(pE
9230: 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  xpr, pNode);.   
9240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9250: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
9260: 6c 74 3a 20 61 73 73 65 72 74 28 20 70 4e 6f 64  lt: assert( pNod
9270: 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e  e->eType==FTS5_N
9280: 4f 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20  OT ); {.        
9290: 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
92a0: 65 54 65 73 74 5f 4e 4f 54 28 70 45 78 70 72 2c  eTest_NOT(pExpr,
92b0: 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   pNode);.       
92c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
92d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
92e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 20 0a 2f 2a 0a 2a  rn rc;.}.. ./*.*
92f0: 2a 20 53 65 74 20 6e 6f 64 65 20 70 4e 6f 64 65  * Set node pNode
9300: 2c 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20  , which is part 
9310: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
9320: 78 70 72 2c 20 74 6f 20 70 6f 69 6e 74 20 74 6f  xpr, to point to
9330: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6d 61   the first.** ma
9340: 74 63 68 2e 20 49 66 20 74 68 65 72 65 20 61 72  tch. If there ar
9350: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 73 65  e no matches, se
9360: 74 20 74 68 65 20 4e 6f 64 65 2e 62 45 6f 66 20  t the Node.bEof 
9370: 66 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  flag to indicate
9380: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75   EOF..**.** Retu
9390: 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
93a0: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
93b0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 53  ror occurs, or S
93c0: 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77 69  QLITE_OK otherwi
93d0: 73 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  se..** It is not
93e0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
93f0: 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65  re are no matche
9400: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
9410: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72   fts5ExprNodeFir
9420: 73 74 28 46 74 73 35 45 78 70 72 20 2a 70 45 78  st(Fts5Expr *pEx
9430: 70 72 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65  pr, Fts5ExprNode
9440: 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20   *pNode){.  int 
9450: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9460: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
9470: 30 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  0;.  pNode->bNom
9480: 61 74 63 68 20 3d 20 30 3b 0a 0a 20 20 69 66 28  atch = 0;..  if(
9490: 20 46 74 73 35 4e 6f 64 65 49 73 53 74 72 69 6e   Fts5NodeIsStrin
94a0: 67 28 70 4e 6f 64 65 29 20 29 7b 0a 20 20 20 20  g(pNode) ){.    
94b0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c  /* Initialize al
94c0: 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72 73  l term iterators
94d0: 20 69 6e 20 74 68 65 20 4e 45 41 52 20 6f 62 6a   in the NEAR obj
94e0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ect. */.    rc =
94f0: 20 66 74 73 35 45 78 70 72 4e 65 61 72 49 6e 69   fts5ExprNearIni
9500: 74 41 6c 6c 28 70 45 78 70 72 2c 20 70 4e 6f 64  tAll(pExpr, pNod
9510: 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e);.  }else if( 
9520: 70 4e 6f 64 65 2d 3e 78 4e 65 78 74 3d 3d 30 20  pNode->xNext==0 
9530: 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45  ){.    pNode->bE
9540: 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
9550: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9560: 69 6e 74 20 6e 45 6f 66 20 3d 20 30 3b 0a 20 20  int nEof = 0;.  
9570: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f    for(i=0; i<pNo
9580: 64 65 2d 3e 6e 43 68 69 6c 64 20 26 26 20 72 63  de->nChild && rc
9590: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
95a0: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  ){.      Fts5Exp
95b0: 72 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d 20  rNode *pChild = 
95c0: 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69  pNode->apChild[i
95d0: 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ];.      rc = ft
95e0: 73 35 45 78 70 72 4e 6f 64 65 46 69 72 73 74 28  s5ExprNodeFirst(
95f0: 70 45 78 70 72 2c 20 70 4e 6f 64 65 2d 3e 61 70  pExpr, pNode->ap
9600: 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 20  Child[i]);.     
9610: 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
9620: 3e 62 45 6f 66 3d 3d 30 20 7c 7c 20 70 43 68 69  >bEof==0 || pChi
9630: 6c 64 2d 3e 62 45 6f 66 3d 3d 31 20 29 3b 0a 20  ld->bEof==1 );. 
9640: 20 20 20 20 20 6e 45 6f 66 20 2b 3d 20 70 43 68       nEof += pCh
9650: 69 6c 64 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 7d  ild->bEof;.    }
9660: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77  .    pNode->iRow
9670: 69 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68  id = pNode->apCh
9680: 69 6c 64 5b 30 5d 2d 3e 69 52 6f 77 69 64 3b 0a  ild[0]->iRowid;.
9690: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4e 6f  .    switch( pNo
96a0: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  de->eType ){.   
96b0: 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44     case FTS5_AND
96c0: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 45  :.        if( nE
96d0: 6f 66 3e 30 20 29 20 66 74 73 35 45 78 70 72 53  of>0 ) fts5ExprS
96e0: 65 74 45 6f 66 28 70 4e 6f 64 65 29 3b 0a 20 20  etEof(pNode);.  
96f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
9700: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52      case FTS5_OR
9710: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  :.        if( pN
9720: 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 6e 45 6f  ode->nChild==nEo
9730: 66 20 29 20 66 74 73 35 45 78 70 72 53 65 74 45  f ) fts5ExprSetE
9740: 6f 66 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20  of(pNode);.     
9750: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
9760: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
9770: 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
9780: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f 54  >eType==FTS5_NOT
9790: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64   );.        pNod
97a0: 65 2d 3e 62 45 6f 66 20 3d 20 70 4e 6f 64 65 2d  e->bEof = pNode-
97b0: 3e 61 70 43 68 69 6c 64 5b 30 5d 2d 3e 62 45 6f  >apChild[0]->bEo
97c0: 66 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  f;.        break
97d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
97e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
97f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
9800: 35 45 78 70 72 4e 6f 64 65 54 65 73 74 28 70 45  5ExprNodeTest(pE
9810: 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d  xpr, pNode);.  }
9820: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9830: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 69 74  ../*.** Begin it
9840: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
9850: 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  the set of docum
9860: 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 70 49  ents in index pI
9870: 64 78 20 6d 61 74 63 68 65 64 20 62 79 0a 2a 2a  dx matched by.**
9880: 20 74 68 65 20 4d 41 54 43 48 20 65 78 70 72 65   the MATCH expre
9890: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
98a0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
98b0: 6e 74 2e 20 49 66 20 74 68 65 20 22 62 44 65 73  nt. If the "bDes
98c0: 63 22 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  c" .** parameter
98d0: 20 69 73 20 70 61 73 73 65 64 20 61 20 6e 6f 6e   is passed a non
98e0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 74 65  -zero value, ite
98f0: 72 61 74 69 6f 6e 20 69 73 20 69 6e 20 64 65 73  ration is in des
9900: 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 0a 2a  cending rowid .*
9910: 2a 20 6f 72 64 65 72 2e 20 4f 72 2c 20 69 66 20  * order. Or, if 
9920: 69 74 20 69 73 20 7a 65 72 6f 2c 20 69 6e 20 61  it is zero, in a
9930: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
9940: 2a 2a 0a 2a 2a 20 49 66 20 69 74 65 72 61 74 69  **.** If iterati
9950: 6e 67 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ng in ascending 
9960: 72 6f 77 69 64 20 6f 72 64 65 72 20 28 62 44 65  rowid order (bDe
9970: 73 63 3d 3d 30 29 2c 20 74 68 65 20 66 69 72 73  sc==0), the firs
9980: 74 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 76 69  t document.** vi
9990: 73 69 74 65 64 20 69 73 20 74 68 61 74 20 77 69  sited is that wi
99a0: 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
99b0: 72 6f 77 69 64 20 74 68 61 74 20 69 73 20 6c 61  rowid that is la
99c0: 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
99d0: 61 6c 0a 2a 2a 20 74 6f 20 70 61 72 61 6d 65 74  al.** to paramet
99e0: 65 72 20 69 46 69 72 73 74 2e 20 4f 72 2c 20 69  er iFirst. Or, i
99f0: 66 20 69 74 65 72 61 74 69 6e 67 20 69 6e 20 61  f iterating in a
9a00: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 28  scending order (
9a10: 62 44 65 73 63 3d 3d 31 29 2c 0a 2a 2a 20 74 68  bDesc==1),.** th
9a20: 65 6e 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  en the first doc
9a30: 75 6d 65 6e 74 20 76 69 73 69 74 65 64 20 6d 75  ument visited mu
9a40: 73 74 20 68 61 76 65 20 61 20 72 6f 77 69 64 20  st have a rowid 
9a50: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 0a  smaller than or.
9a60: 2a 2a 20 65 71 75 61 6c 20 74 6f 20 69 46 69 72  ** equal to iFir
9a70: 73 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  st..**.** Return
9a80: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
9a90: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
9aa0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
9ab0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 0a  e otherwise. It.
9ac0: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
9ad0: 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
9ae0: 20 74 68 65 20 71 75 65 72 79 20 64 6f 65 73 20   the query does 
9af0: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 64 6f  not match any do
9b00: 63 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  cuments..*/.int 
9b10: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46  sqlite3Fts5ExprF
9b20: 69 72 73 74 28 46 74 73 35 45 78 70 72 20 2a 70  irst(Fts5Expr *p
9b30: 2c 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64  , Fts5Index *pId
9b40: 78 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69  x, i64 iFirst, i
9b50: 6e 74 20 62 44 65 73 63 29 7b 0a 20 20 46 74 73  nt bDesc){.  Fts
9b60: 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 6f 6f 74  5ExprNode *pRoot
9b70: 20 3d 20 70 2d 3e 70 52 6f 6f 74 3b 0a 20 20 69   = p->pRoot;.  i
9b80: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ba0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
9bb0: 0a 0a 20 20 70 2d 3e 70 49 6e 64 65 78 20 3d 20  ..  p->pIndex = 
9bc0: 70 49 64 78 3b 0a 20 20 70 2d 3e 62 44 65 73 63  pIdx;.  p->bDesc
9bd0: 20 3d 20 62 44 65 73 63 3b 0a 20 20 72 63 20 3d   = bDesc;.  rc =
9be0: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72   fts5ExprNodeFir
9bf0: 73 74 28 70 2c 20 70 52 6f 6f 74 29 3b 0a 0a 20  st(p, pRoot);.. 
9c00: 20 2f 2a 20 49 66 20 6e 6f 74 20 61 74 20 45 4f   /* If not at EO
9c10: 46 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  F but the curren
9c20: 74 20 72 6f 77 69 64 20 6f 63 63 75 72 73 20 65  t rowid occurs e
9c30: 61 72 6c 69 65 72 20 74 68 61 6e 20 69 46 69 72  arlier than iFir
9c40: 73 74 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 69  st in.  ** the i
9c50: 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72 2c 20  teration order, 
9c60: 6d 6f 76 65 20 74 6f 20 64 6f 63 75 6d 65 6e 74  move to document
9c70: 20 69 46 69 72 73 74 20 6f 72 20 6c 61 74 65 72   iFirst or later
9c80: 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
9c90: 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
9ca0: 30 3d 3d 70 52 6f 6f 74 2d 3e 62 45 6f 66 20 0a  0==pRoot->bEof .
9cb0: 20 20 20 26 26 20 66 74 73 35 52 6f 77 69 64 43     && fts5RowidC
9cc0: 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69 52 6f  mp(p, pRoot->iRo
9cd0: 77 69 64 2c 20 69 46 69 72 73 74 29 3c 30 20 0a  wid, iFirst)<0 .
9ce0: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74    ){.    rc = ft
9cf0: 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70  s5ExprNodeNext(p
9d00: 2c 20 70 52 6f 6f 74 2c 20 31 2c 20 69 46 69 72  , pRoot, 1, iFir
9d10: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  st);.  }..  /* I
9d20: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
9d30: 73 20 6e 6f 74 20 61 74 20 61 20 72 65 61 6c 20  s not at a real 
9d40: 6d 61 74 63 68 2c 20 73 6b 69 70 20 66 6f 72 77  match, skip forw
9d50: 61 72 64 20 75 6e 74 69 6c 20 69 74 20 69 73 2e  ard until it is.
9d60: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 52 6f   */.  while( pRo
9d70: 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 7b 0a  ot->bNomatch ){.
9d80: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
9d90: 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 72 63  t->bEof==0 && rc
9da0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9db0: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
9dc0: 4e 6f 64 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f  NodeNext(p, pRoo
9dd0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  t, 0, 0);.  }.  
9de0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9df0: 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
9e00: 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 0a 2a  next document .*
9e10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
9e20: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
9e30: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
9e40: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
9e50: 65 72 77 69 73 65 2e 20 49 74 0a 2a 2a 20 69 73  erwise. It.** is
9e60: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
9e70: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
9e80: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 6d  query does not m
9e90: 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d 65 6e  atch any documen
9ea0: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
9eb0: 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 46  e3Fts5ExprNext(F
9ec0: 74 73 35 45 78 70 72 20 2a 70 2c 20 69 36 34 20  ts5Expr *p, i64 
9ed0: 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  iLast){.  int rc
9ee0: 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ;.  Fts5ExprNode
9ef0: 20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52 6f   *pRoot = p->pRo
9f00: 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  ot;.  assert( pR
9f10: 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20  oot->bEof==0 && 
9f20: 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 3d  pRoot->bNomatch=
9f30: 3d 30 20 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  =0 );.  do {.   
9f40: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
9f50: 64 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74 2c  deNext(p, pRoot,
9f60: 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65   0, 0);.    asse
9f70: 72 74 28 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61  rt( pRoot->bNoma
9f80: 74 63 68 3d 3d 30 20 7c 7c 20 28 72 63 3d 3d 53  tch==0 || (rc==S
9f90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 6f 6f  QLITE_OK && pRoo
9fa0: 74 2d 3e 62 45 6f 66 3d 3d 30 29 20 29 3b 0a 20  t->bEof==0) );. 
9fb0: 20 7d 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e   }while( pRoot->
9fc0: 62 4e 6f 6d 61 74 63 68 20 29 3b 0a 20 20 69 66  bNomatch );.  if
9fd0: 28 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70  ( fts5RowidCmp(p
9fe0: 2c 20 70 52 6f 6f 74 2d 3e 69 52 6f 77 69 64 2c  , pRoot->iRowid,
9ff0: 20 69 4c 61 73 74 29 3e 30 20 29 7b 0a 20 20 20   iLast)>0 ){.   
a000: 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 20 3d 20 31   pRoot->bEof = 1
a010: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a020: 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
a030: 33 46 74 73 35 45 78 70 72 45 6f 66 28 46 74 73  3Fts5ExprEof(Fts
a040: 35 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  5Expr *p){.  ret
a050: 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e 62 45  urn p->pRoot->bE
a060: 6f 66 3b 0a 7d 0a 0a 69 36 34 20 73 71 6c 69 74  of;.}..i64 sqlit
a070: 65 33 46 74 73 35 45 78 70 72 52 6f 77 69 64 28  e3Fts5ExprRowid(
a080: 46 74 73 35 45 78 70 72 20 2a 70 29 7b 0a 20 20  Fts5Expr *p){.  
a090: 72 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d  return p->pRoot-
a0a0: 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74  >iRowid;.}..stat
a0b0: 69 63 20 69 6e 74 20 66 74 73 35 50 61 72 73 65  ic int fts5Parse
a0c0: 53 74 72 69 6e 67 46 72 6f 6d 54 6f 6b 65 6e 28  StringFromToken(
a0d0: 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  Fts5Token *pToke
a0e0: 6e 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a 20  n, char **pz){. 
a0f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a100: 5f 4f 4b 3b 0a 20 20 2a 70 7a 20 3d 20 73 71 6c  _OK;.  *pz = sql
a110: 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28  ite3Fts5Strndup(
a120: 26 72 63 2c 20 70 54 6f 6b 65 6e 2d 3e 70 2c 20  &rc, pToken->p, 
a130: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 72 65  pToken->n);.  re
a140: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a150: 2a 20 46 72 65 65 20 74 68 65 20 70 68 72 61 73  * Free the phras
a160: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
a170: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
a180: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
a190: 76 6f 69 64 20 66 74 73 35 45 78 70 72 50 68 72  void fts5ExprPhr
a1a0: 61 73 65 46 72 65 65 28 46 74 73 35 45 78 70 72  aseFree(Fts5Expr
a1b0: 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 29  Phrase *pPhrase)
a1c0: 7b 0a 20 20 69 66 28 20 70 50 68 72 61 73 65 20  {.  if( pPhrase 
a1d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
a1e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68    for(i=0; i<pPh
a1f0: 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  rase->nTerm; i++
a200: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  ){.      Fts5Exp
a210: 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0a 20 20 20  rTerm *pSyn;.   
a220: 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
a230: 2a 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 46 74  *pNext;.      Ft
a240: 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72  s5ExprTerm *pTer
a250: 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54  m = &pPhrase->aT
a260: 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  erm[i];.      sq
a270: 6c 69 74 65 33 5f 66 72 65 65 28 70 54 65 72 6d  lite3_free(pTerm
a280: 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  ->zTerm);.      
a290: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
a2a0: 6c 6f 73 65 28 70 54 65 72 6d 2d 3e 70 49 74 65  lose(pTerm->pIte
a2b0: 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 53  r);.      for(pS
a2c0: 79 6e 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  yn=pTerm->pSynon
a2d0: 79 6d 3b 20 70 53 79 6e 3b 20 70 53 79 6e 3d 70  ym; pSyn; pSyn=p
a2e0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 70  Next){.        p
a2f0: 4e 65 78 74 20 3d 20 70 53 79 6e 2d 3e 70 53 79  Next = pSyn->pSy
a300: 6e 6f 6e 79 6d 3b 0a 20 20 20 20 20 20 20 20 73  nonym;.        s
a310: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
a320: 6f 73 65 28 70 53 79 6e 2d 3e 70 49 74 65 72 29  ose(pSyn->pIter)
a330: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
a340: 66 66 65 72 46 72 65 65 28 28 46 74 73 35 42 75  fferFree((Fts5Bu
a350: 66 66 65 72 2a 29 26 70 53 79 6e 5b 31 5d 29 3b  ffer*)&pSyn[1]);
a360: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a370: 5f 66 72 65 65 28 70 53 79 6e 29 3b 0a 20 20 20  _free(pSyn);.   
a380: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
a390: 66 28 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  f( pPhrase->posl
a3a0: 69 73 74 2e 6e 53 70 61 63 65 3e 30 20 29 20 66  ist.nSpace>0 ) f
a3b0: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
a3c0: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 29  Phrase->poslist)
a3d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
a3e0: 65 65 28 70 50 68 72 61 73 65 29 3b 0a 20 20 7d  ee(pPhrase);.  }
a3f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a400: 65 20 22 62 46 69 72 73 74 22 20 66 6c 61 67 20  e "bFirst" flag 
a410: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b  on the first tok
a420: 65 6e 20 6f 66 20 74 68 65 20 70 68 72 61 73 65  en of the phrase
a430: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
a440: 2a 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  * only argument.
a450: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a460: 46 74 73 35 50 61 72 73 65 53 65 74 43 61 72 65  Fts5ParseSetCare
a470: 74 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65  t(Fts5ExprPhrase
a480: 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69 66   *pPhrase){.  if
a490: 28 20 70 50 68 72 61 73 65 20 26 26 20 70 50 68  ( pPhrase && pPh
a4a0: 72 61 73 65 2d 3e 6e 54 65 72 6d 20 29 7b 0a 20  rase->nTerm ){. 
a4b0: 20 20 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72     pPhrase->aTer
a4c0: 6d 5b 30 5d 2e 62 46 69 72 73 74 20 3d 20 31 3b  m[0].bFirst = 1;
a4d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
a4e0: 20 61 72 67 75 6d 65 6e 74 20 70 4e 65 61 72 20   argument pNear 
a4f0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20  is NULL, then a 
a500: 6e 65 77 20 46 74 73 35 45 78 70 72 4e 65 61 72  new Fts5ExprNear
a510: 73 65 74 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  set object is al
a520: 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20 70  located.** and p
a530: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 70 50  opulated with pP
a540: 68 72 61 73 65 2e 20 4f 72 2c 20 69 66 20 70 4e  hrase. Or, if pN
a550: 65 61 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ear is not NULL,
a560: 20 70 68 72 61 73 65 20 70 50 68 72 61 73 65 20   phrase pPhrase 
a570: 69 73 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20 74  is.** appended t
a580: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 72 65 73  o it and the res
a590: 75 6c 74 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  ults returned..*
a5a0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
a5b0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 62 6f 74  rror occurs, bot
a5c0: 68 20 74 68 65 20 70 4e 65 61 72 20 61 6e 64 20  h the pNear and 
a5d0: 70 50 68 72 61 73 65 20 6f 62 6a 65 63 74 73 20  pPhrase objects 
a5e0: 61 72 65 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a  are freed and.**
a5f0: 20 4e 55 4c 4c 20 72 65 74 75 72 6e 65 64 2e 0a   NULL returned..
a600: 2a 2f 0a 46 74 73 35 45 78 70 72 4e 65 61 72 73  */.Fts5ExprNears
a610: 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  et *sqlite3Fts5P
a620: 61 72 73 65 4e 65 61 72 73 65 74 28 0a 20 20 46  arseNearset(.  F
a630: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
a640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a650: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
a660: 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61  */.  Fts5ExprNea
a670: 72 73 65 74 20 2a 70 4e 65 61 72 2c 20 20 20 20  rset *pNear,    
a680: 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
a690: 20 6e 65 61 72 73 65 74 2c 20 6f 72 20 4e 55 4c   nearset, or NUL
a6a0: 4c 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 50  L */.  Fts5ExprP
a6b0: 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 20  hrase *pPhrase  
a6c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 63 65 6e 74         /* Recent
a6d0: 6c 79 20 70 61 72 73 65 64 20 70 68 72 61 73 65  ly parsed phrase
a6e0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
a6f0: 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20 38 3b 0a  nt SZALLOC = 8;.
a700: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
a710: 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a 20 20  t *pRet = 0;..  
a720: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
a730: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a740: 20 69 66 28 20 70 50 68 72 61 73 65 3d 3d 30 20   if( pPhrase==0 
a750: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a760: 70 4e 65 61 72 3b 0a 20 20 20 20 7d 0a 20 20 20  pNear;.    }.   
a770: 20 69 66 28 20 70 4e 65 61 72 3d 3d 30 20 29 7b   if( pNear==0 ){
a780: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
a790: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78   = sizeof(Fts5Ex
a7a0: 70 72 4e 65 61 72 73 65 74 29 20 2b 20 53 5a 41  prNearset) + SZA
a7b0: 4c 4c 4f 43 20 2a 20 73 69 7a 65 6f 66 28 46 74  LLOC * sizeof(Ft
a7c0: 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0a  s5ExprPhrase*);.
a7d0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c        pRet = sql
a7e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
a7f0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  e);.      if( pR
a800: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
a810: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
a820: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
a830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a840: 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c   memset(pRet, 0,
a850: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d   nByte);.      }
a860: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
a870: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20 25  pNear->nPhrase %
a880: 20 53 5a 41 4c 4c 4f 43 29 3d 3d 30 20 29 7b 0a   SZALLOC)==0 ){.
a890: 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
a8a0: 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20   pNear->nPhrase 
a8b0: 2b 20 53 5a 41 4c 4c 4f 43 3b 0a 20 20 20 20 20  + SZALLOC;.     
a8c0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
a8d0: 65 6f 66 28 46 74 73 35 45 78 70 72 4e 65 61 72  eof(Fts5ExprNear
a8e0: 73 65 74 29 20 2b 20 6e 4e 65 77 20 2a 20 73 69  set) + nNew * si
a8f0: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72  zeof(Fts5ExprPhr
a900: 61 73 65 2a 29 3b 0a 0a 20 20 20 20 20 20 70 52  ase*);..      pR
a910: 65 74 20 3d 20 28 46 74 73 35 45 78 70 72 4e 65  et = (Fts5ExprNe
a920: 61 72 73 65 74 2a 29 73 71 6c 69 74 65 33 5f 72  arset*)sqlite3_r
a930: 65 61 6c 6c 6f 63 28 70 4e 65 61 72 2c 20 6e 42  ealloc(pNear, nB
a940: 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
a950: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pRet==0 ){.     
a960: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
a970: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a980: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
a990: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 4e  .      pRet = pN
a9a0: 65 61 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ear;.    }.  }..
a9b0: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
a9c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
a9d0: 72 73 65 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  rse->rc!=SQLITE_
a9e0: 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OK );.    sqlite
a9f0: 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65  3Fts5ParseNearse
aa00: 74 46 72 65 65 28 70 4e 65 61 72 29 3b 0a 20 20  tFree(pNear);.  
aa10: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
aa20: 73 65 50 68 72 61 73 65 46 72 65 65 28 70 50 68  sePhraseFree(pPh
aa30: 72 61 73 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rase);.  }else{.
aa40: 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 6e 50      if( pRet->nP
aa50: 68 72 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  hrase>0 ){.     
aa60: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
aa70: 2a 70 4c 61 73 74 20 3d 20 70 52 65 74 2d 3e 61  *pLast = pRet->a
aa80: 70 50 68 72 61 73 65 5b 70 52 65 74 2d 3e 6e 50  pPhrase[pRet->nP
aa90: 68 72 61 73 65 2d 31 5d 3b 0a 20 20 20 20 20 20  hrase-1];.      
aaa0: 61 73 73 65 72 74 28 20 70 4c 61 73 74 3d 3d 70  assert( pLast==p
aab0: 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65 5b  Parse->apPhrase[
aac0: 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d  pParse->nPhrase-
aad0: 32 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  2] );.      if( 
aae0: 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d  pPhrase->nTerm==
aaf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
ab00: 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28  5ExprPhraseFree(
ab10: 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20  pPhrase);.      
ab20: 20 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65 2d    pRet->nPhrase-
ab30: 2d 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  -;.        pPars
ab40: 65 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a 20 20  e->nPhrase--;.  
ab50: 20 20 20 20 20 20 70 50 68 72 61 73 65 20 3d 20        pPhrase = 
ab60: 70 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pLast;.      }el
ab70: 73 65 20 69 66 28 20 70 4c 61 73 74 2d 3e 6e 54  se if( pLast->nT
ab80: 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  erm==0 ){.      
ab90: 20 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65    fts5ExprPhrase
aba0: 46 72 65 65 28 70 4c 61 73 74 29 3b 0a 20 20 20  Free(pLast);.   
abb0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 50       pParse->apP
abc0: 68 72 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50  hrase[pParse->nP
abd0: 68 72 61 73 65 2d 32 5d 20 3d 20 70 50 68 72 61  hrase-2] = pPhra
abe0: 73 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  se;.        pPar
abf0: 73 65 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a 20  se->nPhrase--;. 
ac00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68         pRet->nPh
ac10: 72 61 73 65 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  rase--;.      }.
ac20: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74 2d 3e      }.    pRet->
ac30: 61 70 50 68 72 61 73 65 5b 70 52 65 74 2d 3e 6e  apPhrase[pRet->n
ac40: 50 68 72 61 73 65 2b 2b 5d 20 3d 20 70 50 68 72  Phrase++] = pPhr
ac50: 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ase;.  }.  retur
ac60: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 74 79 70 65 64  n pRet;.}..typed
ac70: 65 66 20 73 74 72 75 63 74 20 54 6f 6b 65 6e 43  ef struct TokenC
ac80: 74 78 20 54 6f 6b 65 6e 43 74 78 3b 0a 73 74 72  tx TokenCtx;.str
ac90: 75 63 74 20 54 6f 6b 65 6e 43 74 78 20 7b 0a 20  uct TokenCtx {. 
aca0: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
acb0: 2a 70 50 68 72 61 73 65 3b 0a 20 20 69 6e 74 20  *pPhrase;.  int 
acc0: 72 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61  rc;.};../*.** Ca
acd0: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 6f 6b 65 6e  llback for token
ace0: 69 7a 69 6e 67 20 74 65 72 6d 73 20 75 73 65 64  izing terms used
acf0: 20 62 79 20 50 61 72 73 65 54 65 72 6d 28 29 2e   by ParseTerm().
ad00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
ad10: 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65  ts5ParseTokenize
ad20: 28 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65  (.  void *pConte
ad30: 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
ad40: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
ad50: 6f 20 46 74 73 35 49 6e 73 65 72 74 43 74 78 20  o Fts5InsertCtx 
ad60: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
ad70: 74 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  tflags,         
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
ad90: 61 73 6b 20 6f 66 20 46 54 53 35 5f 54 4f 4b 45  ask of FTS5_TOKE
ada0: 4e 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  N_* flags */.  c
adb0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
adc0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
add0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
ade0: 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69  ing token */.  i
adf0: 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae10: 2a 20 53 69 7a 65 20 6f 66 20 74 6f 6b 65 6e 20  * Size of token 
ae20: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
ae30: 74 20 69 55 6e 75 73 65 64 31 2c 20 20 20 20 20  t iUnused1,     
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae50: 20 53 74 61 72 74 20 6f 66 66 73 65 74 20 6f 66   Start offset of
ae60: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   token */.  int 
ae70: 69 55 6e 75 73 65 64 32 20 20 20 20 20 20 20 20  iUnused2        
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
ae90: 6e 64 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b  nd offset of tok
aea0: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  en */.){.  int r
aeb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
aec0: 20 63 6f 6e 73 74 20 69 6e 74 20 53 5a 41 4c 4c   const int SZALL
aed0: 4f 43 20 3d 20 38 3b 0a 20 20 54 6f 6b 65 6e 43  OC = 8;.  TokenC
aee0: 74 78 20 2a 70 43 74 78 20 3d 20 28 54 6f 6b 65  tx *pCtx = (Toke
aef0: 6e 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  nCtx*)pContext;.
af00: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
af10: 20 2a 70 50 68 72 61 73 65 20 3d 20 70 43 74 78   *pPhrase = pCtx
af20: 2d 3e 70 50 68 72 61 73 65 3b 0a 0a 20 20 55 4e  ->pPhrase;..  UN
af30: 55 53 45 44 5f 50 41 52 41 4d 32 28 69 55 6e 75  USED_PARAM2(iUnu
af40: 73 65 64 31 2c 20 69 55 6e 75 73 65 64 32 29 3b  sed1, iUnused2);
af50: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
af60: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
af70: 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 69 73  ccurred, this is
af80: 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 69 66   a no-op */.  if
af90: 28 20 70 43 74 78 2d 3e 72 63 21 3d 53 51 4c 49  ( pCtx->rc!=SQLI
afa0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 70  TE_OK ) return p
afb0: 43 74 78 2d 3e 72 63 3b 0a 20 20 69 66 28 20 6e  Ctx->rc;.  if( n
afc0: 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58 5f 54  Token>FTS5_MAX_T
afd0: 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54 6f 6b  OKEN_SIZE ) nTok
afe0: 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f 54 4f  en = FTS5_MAX_TO
aff0: 4b 45 4e 5f 53 49 5a 45 3b 0a 0a 20 20 69 66 28  KEN_SIZE;..  if(
b000: 20 70 50 68 72 61 73 65 20 26 26 20 70 50 68 72   pPhrase && pPhr
b010: 61 73 65 2d 3e 6e 54 65 72 6d 3e 30 20 26 26 20  ase->nTerm>0 && 
b020: 28 74 66 6c 61 67 73 20 26 20 46 54 53 35 5f 54  (tflags & FTS5_T
b030: 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 29 20  OKEN_COLOCATED) 
b040: 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72 54  ){.    Fts5ExprT
b050: 65 72 6d 20 2a 70 53 79 6e 3b 0a 20 20 20 20 69  erm *pSyn;.    i
b060: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
b070: 66 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 20  f(Fts5ExprTerm) 
b080: 2b 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  + sizeof(Fts5Buf
b090: 66 65 72 29 20 2b 20 6e 54 6f 6b 65 6e 2b 31 3b  fer) + nToken+1;
b0a0: 0a 20 20 20 20 70 53 79 6e 20 3d 20 28 46 74 73  .    pSyn = (Fts
b0b0: 35 45 78 70 72 54 65 72 6d 2a 29 73 71 6c 69 74  5ExprTerm*)sqlit
b0c0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
b0d0: 3b 0a 20 20 20 20 69 66 28 20 70 53 79 6e 3d 3d  ;.    if( pSyn==
b0e0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
b0f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
b110: 65 6d 73 65 74 28 70 53 79 6e 2c 20 30 2c 20 6e  emset(pSyn, 0, n
b120: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 53 79  Byte);.      pSy
b130: 6e 2d 3e 7a 54 65 72 6d 20 3d 20 28 28 63 68 61  n->zTerm = ((cha
b140: 72 2a 29 70 53 79 6e 29 20 2b 20 73 69 7a 65 6f  r*)pSyn) + sizeo
b150: 66 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 20  f(Fts5ExprTerm) 
b160: 2b 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  + sizeof(Fts5Buf
b170: 66 65 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fer);.      memc
b180: 70 79 28 70 53 79 6e 2d 3e 7a 54 65 72 6d 2c 20  py(pSyn->zTerm, 
b190: 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
b1a0: 0a 20 20 20 20 20 20 70 53 79 6e 2d 3e 70 53 79  .      pSyn->pSy
b1b0: 6e 6f 6e 79 6d 20 3d 20 70 50 68 72 61 73 65 2d  nonym = pPhrase-
b1c0: 3e 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e  >aTerm[pPhrase->
b1d0: 6e 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79  nTerm-1].pSynony
b1e0: 6d 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65  m;.      pPhrase
b1f0: 2d 3e 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d  ->aTerm[pPhrase-
b200: 3e 6e 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e  >nTerm-1].pSynon
b210: 79 6d 20 3d 20 70 53 79 6e 3b 0a 20 20 20 20 7d  ym = pSyn;.    }
b220: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
b230: 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72  s5ExprTerm *pTer
b240: 6d 3b 0a 20 20 20 20 69 66 28 20 70 50 68 72 61  m;.    if( pPhra
b250: 73 65 3d 3d 30 20 7c 7c 20 28 70 50 68 72 61 73  se==0 || (pPhras
b260: 65 2d 3e 6e 54 65 72 6d 20 25 20 53 5a 41 4c 4c  e->nTerm % SZALL
b270: 4f 43 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OC)==0 ){.      
b280: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
b290: 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20  pNew;.      int 
b2a0: 6e 4e 65 77 20 3d 20 53 5a 41 4c 4c 4f 43 20 2b  nNew = SZALLOC +
b2b0: 20 28 70 50 68 72 61 73 65 20 3f 20 70 50 68 72   (pPhrase ? pPhr
b2c0: 61 73 65 2d 3e 6e 54 65 72 6d 20 3a 20 30 29 3b  ase->nTerm : 0);
b2d0: 0a 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  ..      pNew = (
b2e0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29  Fts5ExprPhrase*)
b2f0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
b300: 70 50 68 72 61 73 65 2c 20 0a 20 20 20 20 20 20  pPhrase, .      
b310: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 45      sizeof(Fts5E
b320: 78 70 72 50 68 72 61 73 65 29 20 2b 20 73 69 7a  xprPhrase) + siz
b330: 65 6f 66 28 46 74 73 35 45 78 70 72 54 65 72 6d  eof(Fts5ExprTerm
b340: 29 20 2a 20 6e 4e 65 77 0a 20 20 20 20 20 20 29  ) * nNew.      )
b350: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
b360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
b370: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
b380: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b390: 20 20 20 20 20 20 20 69 66 28 20 70 50 68 72 61         if( pPhra
b3a0: 73 65 3d 3d 30 20 29 20 6d 65 6d 73 65 74 28 70  se==0 ) memset(p
b3b0: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  New, 0, sizeof(F
b3c0: 74 73 35 45 78 70 72 50 68 72 61 73 65 29 29 3b  ts5ExprPhrase));
b3d0: 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 70  .        pCtx->p
b3e0: 50 68 72 61 73 65 20 3d 20 70 50 68 72 61 73 65  Phrase = pPhrase
b3f0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
b400: 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 6e   pNew->nTerm = n
b410: 4e 65 77 20 2d 20 53 5a 41 4c 4c 4f 43 3b 0a 20  New - SZALLOC;. 
b420: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
b430: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b440: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 54 65  _OK ){.      pTe
b450: 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61  rm = &pPhrase->a
b460: 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e 54  Term[pPhrase->nT
b470: 65 72 6d 2b 2b 5d 3b 0a 20 20 20 20 20 20 6d 65  erm++];.      me
b480: 6d 73 65 74 28 70 54 65 72 6d 2c 20 30 2c 20 73  mset(pTerm, 0, s
b490: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54 65  izeof(Fts5ExprTe
b4a0: 72 6d 29 29 3b 0a 20 20 20 20 20 20 70 54 65 72  rm));.      pTer
b4b0: 6d 2d 3e 7a 54 65 72 6d 20 3d 20 73 71 6c 69 74  m->zTerm = sqlit
b4c0: 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26 72  e3Fts5Strndup(&r
b4d0: 63 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  c, pToken, nToke
b4e0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
b4f0: 20 70 43 74 78 2d 3e 72 63 20 3d 20 72 63 3b 0a   pCtx->rc = rc;.
b500: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b510: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
b520: 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70 61  phrase object pa
b530: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
b540: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
b550: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
b560: 72 73 65 50 68 72 61 73 65 46 72 65 65 28 46 74  rsePhraseFree(Ft
b570: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
b580: 68 72 61 73 65 29 7b 0a 20 20 66 74 73 35 45 78  hrase){.  fts5Ex
b590: 70 72 50 68 72 61 73 65 46 72 65 65 28 70 50 68  prPhraseFree(pPh
b5a0: 72 61 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rase);.}../*.** 
b5b0: 46 72 65 65 20 74 68 65 20 70 68 72 61 73 65 20  Free the phrase 
b5c0: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
b5d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b5e0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
b5f0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
b600: 61 72 73 65 74 46 72 65 65 28 46 74 73 35 45 78  arsetFree(Fts5Ex
b610: 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
b620: 29 7b 0a 20 20 69 66 28 20 70 4e 65 61 72 20 29  ){.  if( pNear )
b630: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
b640: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61   for(i=0; i<pNea
b650: 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29  r->nPhrase; i++)
b660: 7b 0a 20 20 20 20 20 20 66 74 73 35 45 78 70 72  {.      fts5Expr
b670: 50 68 72 61 73 65 46 72 65 65 28 70 4e 65 61 72  PhraseFree(pNear
b680: 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 29 3b 0a  ->apPhrase[i]);.
b690: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b6a0: 33 5f 66 72 65 65 28 70 4e 65 61 72 2d 3e 70 43  3_free(pNear->pC
b6b0: 6f 6c 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  olset);.    sqli
b6c0: 74 65 33 5f 66 72 65 65 28 70 4e 65 61 72 29 3b  te3_free(pNear);
b6d0: 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  .  }.}..void sql
b6e0: 69 74 65 33 46 74 73 35 50 61 72 73 65 46 69 6e  ite3Fts5ParseFin
b6f0: 69 73 68 65 64 28 46 74 73 35 50 61 72 73 65 20  ished(Fts5Parse 
b700: 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45 78 70  *pParse, Fts5Exp
b710: 72 4e 6f 64 65 20 2a 70 29 7b 0a 20 20 61 73 73  rNode *p){.  ass
b720: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 45 78  ert( pParse->pEx
b730: 70 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  pr==0 );.  pPars
b740: 65 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 7d 0a  e->pExpr = p;.}.
b750: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b760: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
b770: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
b780: 70 72 6f 63 65 73 73 20 61 20 73 74 72 69 6e 67  process a string
b790: 20 74 6f 6b 65 6e 2e 20 54 68 65 0a 2a 2a 20 73   token. The.** s
b7a0: 74 72 69 6e 67 20 6d 61 79 20 6f 72 20 6d 61 79  tring may or may
b7b0: 20 6e 6f 74 20 62 65 20 71 75 6f 74 65 64 2e 20   not be quoted. 
b7c0: 49 6e 20 61 6e 79 20 63 61 73 65 20 69 74 20 69  In any case it i
b7d0: 73 20 74 6f 6b 65 6e 69 7a 65 64 20 61 6e 64 20  s tokenized and 
b7e0: 61 0a 2a 2a 20 70 68 72 61 73 65 20 6f 62 6a 65  a.** phrase obje
b7f0: 63 74 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ct consisting of
b800: 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 72 65 74 75   all tokens retu
b810: 72 6e 65 64 2e 0a 2a 2f 0a 46 74 73 35 45 78 70  rned..*/.Fts5Exp
b820: 72 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65 33  rPhrase *sqlite3
b830: 46 74 73 35 50 61 72 73 65 54 65 72 6d 28 0a 20  Fts5ParseTerm(. 
b840: 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
b850: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
b860: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
b870: 74 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 50  t */.  Fts5ExprP
b880: 68 72 61 73 65 20 2a 70 41 70 70 65 6e 64 2c 20  hrase *pAppend, 
b890: 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65         /* Phrase
b8a0: 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f   to append to */
b8b0: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54  .  Fts5Token *pT
b8c0: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
b8d0: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20     /* String to 
b8e0: 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 20 20 69 6e  tokenize */.  in
b8f0: 74 20 62 50 72 65 66 69 78 20 20 20 20 20 20 20  t bPrefix       
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b910: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69   True if there i
b920: 73 20 61 20 74 72 61 69 6c 69 6e 67 20 22 2a 22  s a trailing "*"
b930: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
b940: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
b950: 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 3b 0a  Parse->pConfig;.
b960: 20 20 54 6f 6b 65 6e 43 74 78 20 73 43 74 78 3b    TokenCtx sCtx;
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a    /* Context obj
b990: 65 63 74 20 70 61 73 73 65 64 20 74 6f 20 63 61  ect passed to ca
b9a0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
b9b0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b9d0: 6f 6b 65 6e 69 7a 65 20 72 65 74 75 72 6e 20 63  okenize return c
b9e0: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
b9f0: 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28   = 0;..  memset(
ba00: 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  &sCtx, 0, sizeof
ba10: 28 54 6f 6b 65 6e 43 74 78 29 29 3b 0a 20 20 73  (TokenCtx));.  s
ba20: 43 74 78 2e 70 50 68 72 61 73 65 20 3d 20 70 41  Ctx.pPhrase = pA
ba30: 70 70 65 6e 64 3b 0a 0a 20 20 72 63 20 3d 20 66  ppend;..  rc = f
ba40: 74 73 35 50 61 72 73 65 53 74 72 69 6e 67 46 72  ts5ParseStringFr
ba50: 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 2c 20  omToken(pToken, 
ba60: 26 7a 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  &z);.  if( rc==S
ba70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ba80: 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
ba90: 5f 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 20  _TOKENIZE_QUERY 
baa0: 7c 20 28 62 50 72 65 66 69 78 20 3f 20 46 54 53  | (bPrefix ? FTS
bab0: 35 5f 54 4f 4b 45 4e 49 5a 45 5f 50 52 45 46 49  5_TOKENIZE_PREFI
bac0: 58 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  X : 0);.    int 
bad0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  n;.    sqlite3Ft
bae0: 73 35 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  s5Dequote(z);.  
baf0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
bb00: 6e 28 7a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  n(z);.    rc = s
bb10: 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69  qlite3Fts5Tokeni
bb20: 7a 65 28 70 43 6f 6e 66 69 67 2c 20 66 6c 61 67  ze(pConfig, flag
bb30: 73 2c 20 7a 2c 20 6e 2c 20 26 73 43 74 78 2c 20  s, z, n, &sCtx, 
bb40: 66 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a  fts5ParseTokeniz
bb50: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
bb60: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 69 66 28  3_free(z);.  if(
bb70: 20 72 63 20 7c 7c 20 28 72 63 20 3d 20 73 43 74   rc || (rc = sCt
bb80: 78 2e 72 63 29 20 29 7b 0a 20 20 20 20 70 50 61  x.rc) ){.    pPa
bb90: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
bba0: 20 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65    fts5ExprPhrase
bbb0: 46 72 65 65 28 73 43 74 78 2e 70 50 68 72 61 73  Free(sCtx.pPhras
bbc0: 65 29 3b 0a 20 20 20 20 73 43 74 78 2e 70 50 68  e);.    sCtx.pPh
bbd0: 72 61 73 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rase = 0;.  }els
bbe0: 65 7b 0a 0a 20 20 20 20 69 66 28 20 70 41 70 70  e{..    if( pApp
bbf0: 65 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  end==0 ){.      
bc00: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 50 68  if( (pParse->nPh
bc10: 72 61 73 65 20 25 20 38 29 3d 3d 30 20 29 7b 0a  rase % 8)==0 ){.
bc20: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
bc30: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45  e = sizeof(Fts5E
bc40: 78 70 72 50 68 72 61 73 65 2a 29 20 2a 20 28 70  xprPhrase*) * (p
bc50: 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 20 2b  Parse->nPhrase +
bc60: 20 38 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73   8);.        Fts
bc70: 35 45 78 70 72 50 68 72 61 73 65 20 2a 2a 61 70  5ExprPhrase **ap
bc80: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 61 70 4e  New;.        apN
bc90: 65 77 20 3d 20 28 46 74 73 35 45 78 70 72 50 68  ew = (Fts5ExprPh
bca0: 72 61 73 65 2a 2a 29 73 71 6c 69 74 65 33 5f 72  rase**)sqlite3_r
bcb0: 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61  ealloc(pParse->a
bcc0: 70 50 68 72 61 73 65 2c 20 6e 42 79 74 65 29 3b  pPhrase, nByte);
bcd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 4e  .        if( apN
bce0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
bcf0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
bd00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bd10: 20 20 20 20 20 20 20 20 66 74 73 35 45 78 70 72          fts5Expr
bd20: 50 68 72 61 73 65 46 72 65 65 28 73 43 74 78 2e  PhraseFree(sCtx.
bd30: 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20  pPhrase);.      
bd40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bd50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bd60: 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65  pParse->apPhrase
bd70: 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20   = apNew;.      
bd80: 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  }.      pParse->
bd90: 6e 50 68 72 61 73 65 2b 2b 3b 0a 20 20 20 20 7d  nPhrase++;.    }
bda0: 0a 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 70  ..    if( sCtx.p
bdb0: 50 68 72 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20  Phrase==0 ){.   
bdc0: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
bdd0: 6e 73 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ns when parsing 
bde0: 61 20 74 6f 6b 65 6e 20 6f 72 20 71 75 6f 74 65  a token or quote
bdf0: 64 20 70 68 72 61 73 65 20 74 68 61 74 20 63 6f  d phrase that co
be00: 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
be10: 6e 6f 20 74 6f 6b 65 6e 20 63 68 61 72 61 63 74  no token charact
be20: 65 72 73 20 61 74 20 61 6c 6c 2e 20 28 65 2e 67  ers at all. (e.g
be30: 20 2e 2e 2e 20 4d 41 54 43 48 20 27 22 22 27 29   ... MATCH '""')
be40: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 43 74 78 2e  . */.      sCtx.
be50: 70 50 68 72 61 73 65 20 3d 20 73 71 6c 69 74 65  pPhrase = sqlite
be60: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
be70: 26 70 50 61 72 73 65 2d 3e 72 63 2c 20 73 69 7a  &pParse->rc, siz
be80: 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61  eof(Fts5ExprPhra
be90: 73 65 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  se));.    }else 
bea0: 69 66 28 20 73 43 74 78 2e 70 50 68 72 61 73 65  if( sCtx.pPhrase
beb0: 2d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ->nTerm ){.     
bec0: 20 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 61   sCtx.pPhrase->a
bed0: 54 65 72 6d 5b 73 43 74 78 2e 70 50 68 72 61 73  Term[sCtx.pPhras
bee0: 65 2d 3e 6e 54 65 72 6d 2d 31 5d 2e 62 50 72 65  e->nTerm-1].bPre
bef0: 66 69 78 20 3d 20 28 75 38 29 62 50 72 65 66 69  fix = (u8)bPrefi
bf00: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  x;.    }.    pPa
bf10: 72 73 65 2d 3e 61 70 50 68 72 61 73 65 5b 70 50  rse->apPhrase[pP
bf20: 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d 31 5d  arse->nPhrase-1]
bf30: 20 3d 20 73 43 74 78 2e 70 50 68 72 61 73 65 3b   = sCtx.pPhrase;
bf40: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
bf50: 43 74 78 2e 70 50 68 72 61 73 65 3b 0a 7d 0a 0a  Ctx.pPhrase;.}..
bf60: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
bf70: 65 77 20 46 54 53 35 20 65 78 70 72 65 73 73 69  ew FTS5 expressi
bf80: 6f 6e 20 62 79 20 63 6c 6f 6e 69 6e 67 20 70 68  on by cloning ph
bf90: 72 61 73 65 20 69 50 68 72 61 73 65 20 6f 66 20  rase iPhrase of 
bfa0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
bfb0: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
bfc0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
bfd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
bfe0: 74 73 35 45 78 70 72 43 6c 6f 6e 65 50 68 72 61  ts5ExprClonePhra
bff0: 73 65 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a  se(.  Fts5Expr *
c000: 70 45 78 70 72 2c 20 0a 20 20 69 6e 74 20 69 50  pExpr, .  int iP
c010: 68 72 61 73 65 2c 20 0a 20 20 46 74 73 35 45 78  hrase, .  Fts5Ex
c020: 70 72 20 2a 2a 70 70 4e 65 77 0a 29 7b 0a 20 20  pr **ppNew.){.  
c030: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c040: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
c050: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
c060: 2f 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61  /.  Fts5ExprPhra
c070: 73 65 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 20  se *pOrig;      
c080: 20 20 20 20 2f 2a 20 54 68 65 20 70 68 72 61 73      /* The phras
c090: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
c0a0: 20 70 45 78 70 72 20 2a 2f 0a 20 20 46 74 73 35   pExpr */.  Fts5
c0b0: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20  Expr *pNew = 0; 
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
c0d0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 72 65 74  xpression to ret
c0e0: 75 72 6e 20 76 69 61 20 2a 70 70 4e 65 77 20 2a  urn via *ppNew *
c0f0: 2f 0a 20 20 54 6f 6b 65 6e 43 74 78 20 73 43 74  /.  TokenCtx sCt
c100: 78 20 3d 20 7b 30 2c 30 7d 3b 20 20 20 20 20 20  x = {0,0};      
c110: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f      /* Context o
c120: 62 6a 65 63 74 20 66 6f 72 20 66 74 73 35 50 61  bject for fts5Pa
c130: 72 73 65 54 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 0a  rseTokenize */..
c140: 20 20 70 4f 72 69 67 20 3d 20 70 45 78 70 72 2d    pOrig = pExpr-
c150: 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 50  >apExprPhrase[iP
c160: 68 72 61 73 65 5d 3b 0a 20 20 70 4e 65 77 20 3d  hrase];.  pNew =
c170: 20 28 46 74 73 35 45 78 70 72 2a 29 73 71 6c 69   (Fts5Expr*)sqli
c180: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
c190: 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74  o(&rc, sizeof(Ft
c1a0: 73 35 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20  s5Expr));.  if( 
c1b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c1c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 70 45 78 70  .    pNew->apExp
c1d0: 72 50 68 72 61 73 65 20 3d 20 28 46 74 73 35 45  rPhrase = (Fts5E
c1e0: 78 70 72 50 68 72 61 73 65 2a 2a 29 73 71 6c 69  xprPhrase**)sqli
c1f0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
c200: 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20  o(&rc, .        
c210: 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50  sizeof(Fts5ExprP
c220: 68 72 61 73 65 2a 29 29 3b 0a 20 20 7d 0a 20 20  hrase*));.  }.  
c230: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c240: 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  K ){.    pNew->p
c250: 52 6f 6f 74 20 3d 20 28 46 74 73 35 45 78 70 72  Root = (Fts5Expr
c260: 4e 6f 64 65 2a 29 73 71 6c 69 74 65 33 46 74 73  Node*)sqlite3Fts
c270: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
c280: 20 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66   .        sizeof
c290: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 29 29 3b  (Fts5ExprNode));
c2a0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
c2b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c2c0: 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65  pNew->pRoot->pNe
c2d0: 61 72 20 3d 20 28 46 74 73 35 45 78 70 72 4e 65  ar = (Fts5ExprNe
c2e0: 61 72 73 65 74 2a 29 73 71 6c 69 74 65 33 46 74  arset*)sqlite3Ft
c2f0: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
c300: 2c 20 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f  , .        sizeo
c310: 66 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  f(Fts5ExprNearse
c320: 74 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 35  t) + sizeof(Fts5
c330: 45 78 70 72 50 68 72 61 73 65 2a 29 29 3b 0a 20  ExprPhrase*));. 
c340: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
c350: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
c360: 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
c370: 74 4f 72 69 67 20 3d 20 70 4f 72 69 67 2d 3e 70  tOrig = pOrig->p
c380: 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f  Node->pNear->pCo
c390: 6c 73 65 74 3b 0a 20 20 20 20 69 66 28 20 70 43  lset;.    if( pC
c3a0: 6f 6c 73 65 74 4f 72 69 67 20 29 7b 0a 20 20 20  olsetOrig ){.   
c3b0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
c3c0: 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74  izeof(Fts5Colset
c3d0: 29 20 2b 20 28 70 43 6f 6c 73 65 74 4f 72 69 67  ) + (pColsetOrig
c3e0: 2d 3e 6e 43 6f 6c 2d 31 29 20 2a 20 73 69 7a 65  ->nCol-1) * size
c3f0: 6f 66 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 46  of(int);.      F
c400: 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
c410: 65 74 20 3d 20 28 46 74 73 35 43 6f 6c 73 65 74  et = (Fts5Colset
c420: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
c430: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79  locZero(&rc, nBy
c440: 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
c450: 43 6f 6c 73 65 74 20 29 7b 20 0a 20 20 20 20 20  Colset ){ .     
c460: 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 73 65     memcpy(pColse
c470: 74 2c 20 70 43 6f 6c 73 65 74 4f 72 69 67 2c 20  t, pColsetOrig, 
c480: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nByte);.      }.
c490: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f        pNew->pRoo
c4a0: 74 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65  t->pNear->pColse
c4b0: 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20  t = pColset;.   
c4c0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
c4d0: 72 69 67 2d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20  rig->nTerm ){.  
c4e0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
c510: 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 68 72  rate through phr
c520: 61 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  ase terms */.   
c530: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
c540: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4f 72  LITE_OK && i<pOr
c550: 69 67 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  ig->nTerm; i++){
c560: 0a 20 20 20 20 20 20 69 6e 74 20 74 66 6c 61 67  .      int tflag
c570: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73  s = 0;.      Fts
c580: 35 45 78 70 72 54 65 72 6d 20 2a 70 3b 0a 20 20  5ExprTerm *p;.  
c590: 20 20 20 20 66 6f 72 28 70 3d 26 70 4f 72 69 67      for(p=&pOrig
c5a0: 2d 3e 61 54 65 72 6d 5b 69 5d 3b 20 70 20 26 26  ->aTerm[i]; p &&
c5b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
c5c0: 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a  p=p->pSynonym){.
c5d0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
c5e0: 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70 2d 3e 7a  ar *zTerm = p->z
c5f0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 72 63  Term;.        rc
c600: 20 3d 20 66 74 73 35 50 61 72 73 65 54 6f 6b 65   = fts5ParseToke
c610: 6e 69 7a 65 28 28 76 6f 69 64 2a 29 26 73 43 74  nize((void*)&sCt
c620: 78 2c 20 74 66 6c 61 67 73 2c 20 7a 54 65 72 6d  x, tflags, zTerm
c630: 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  , (int)strlen(zT
c640: 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  erm),.          
c650: 20 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20    0, 0);.       
c660: 20 74 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 54   tflags = FTS5_T
c670: 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 3b 0a  OKEN_COLOCATED;.
c680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c6a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  ){.        sCtx.
c6b0: 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69  pPhrase->aTerm[i
c6c0: 5d 2e 62 50 72 65 66 69 78 20 3d 20 70 4f 72 69  ].bPrefix = pOri
c6d0: 67 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 50 72 65  g->aTerm[i].bPre
c6e0: 66 69 78 3b 0a 20 20 20 20 20 20 20 20 73 43 74  fix;.        sCt
c6f0: 78 2e 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  x.pPhrase->aTerm
c700: 5b 69 5d 2e 62 46 69 72 73 74 20 3d 20 70 4f 72  [i].bFirst = pOr
c710: 69 67 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 46 69  ig->aTerm[i].bFi
c720: 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rst;.      }.   
c730: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
c740: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
c750: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 74  when parsing a t
c760: 6f 6b 65 6e 20 6f 72 20 71 75 6f 74 65 64 20 70  oken or quoted p
c770: 68 72 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  hrase that conta
c780: 69 6e 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 74 6f  ins.    ** no to
c790: 6b 65 6e 20 63 68 61 72 61 63 74 65 72 73 20 61  ken characters a
c7a0: 74 20 61 6c 6c 2e 20 28 65 2e 67 20 2e 2e 2e 20  t all. (e.g ... 
c7b0: 4d 41 54 43 48 20 27 22 22 27 29 2e 20 2a 2f 0a  MATCH '""'). */.
c7c0: 20 20 20 20 73 43 74 78 2e 70 50 68 72 61 73 65      sCtx.pPhrase
c7d0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61   = sqlite3Fts5Ma
c7e0: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69  llocZero(&rc, si
c7f0: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72  zeof(Fts5ExprPhr
c800: 61 73 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ase));.  }..  if
c810: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c820: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 68  ){.    /* All th
c830: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 73 75  e allocations su
c840: 63 63 65 65 64 65 64 2e 20 50 75 74 20 74 68 65  cceeded. Put the
c850: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65   expression obje
c860: 63 74 20 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a  ct together. */.
c870: 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78      pNew->pIndex
c880: 20 3d 20 70 45 78 70 72 2d 3e 70 49 6e 64 65 78   = pExpr->pIndex
c890: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6e  ;.    pNew->pCon
c8a0: 66 69 67 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  fig = pExpr->pCo
c8b0: 6e 66 69 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nfig;.    pNew->
c8c0: 6e 50 68 72 61 73 65 20 3d 20 31 3b 0a 20 20 20  nPhrase = 1;.   
c8d0: 20 70 4e 65 77 2d 3e 61 70 45 78 70 72 50 68 72   pNew->apExprPhr
c8e0: 61 73 65 5b 30 5d 20 3d 20 73 43 74 78 2e 70 50  ase[0] = sCtx.pP
c8f0: 68 72 61 73 65 3b 0a 20 20 20 20 70 4e 65 77 2d  hrase;.    pNew-
c900: 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 2d 3e 61  >pRoot->pNear->a
c910: 70 50 68 72 61 73 65 5b 30 5d 20 3d 20 73 43 74  pPhrase[0] = sCt
c920: 78 2e 70 50 68 72 61 73 65 3b 0a 20 20 20 20 70  x.pPhrase;.    p
c930: 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61  New->pRoot->pNea
c940: 72 2d 3e 6e 50 68 72 61 73 65 20 3d 20 31 3b 0a  r->nPhrase = 1;.
c950: 20 20 20 20 73 43 74 78 2e 70 50 68 72 61 73 65      sCtx.pPhrase
c960: 2d 3e 70 4e 6f 64 65 20 3d 20 70 4e 65 77 2d 3e  ->pNode = pNew->
c970: 70 52 6f 6f 74 3b 0a 0a 20 20 20 20 69 66 28 20  pRoot;..    if( 
c980: 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 3d 3d 31 20  pOrig->nTerm==1 
c990: 0a 20 20 20 20 20 26 26 20 70 4f 72 69 67 2d 3e  .     && pOrig->
c9a0: 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79  aTerm[0].pSynony
c9b0: 6d 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 4f  m==0 .     && pO
c9c0: 72 69 67 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46  rig->aTerm[0].bF
c9d0: 69 72 73 74 3d 3d 30 20 0a 20 20 20 20 29 7b 0a  irst==0 .    ){.
c9e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f        pNew->pRoo
c9f0: 74 2d 3e 65 54 79 70 65 20 3d 20 46 54 53 35 5f  t->eType = FTS5_
ca00: 54 45 52 4d 3b 0a 20 20 20 20 20 20 70 4e 65 77  TERM;.      pNew
ca10: 2d 3e 70 52 6f 6f 74 2d 3e 78 4e 65 78 74 20 3d  ->pRoot->xNext =
ca20: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78   fts5ExprNodeNex
ca30: 74 5f 54 45 52 4d 3b 0a 20 20 20 20 7d 65 6c 73  t_TERM;.    }els
ca40: 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
ca50: 52 6f 6f 74 2d 3e 65 54 79 70 65 20 3d 20 46 54  Root->eType = FT
ca60: 53 35 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 20  S5_STRING;.     
ca70: 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 78 4e   pNew->pRoot->xN
ca80: 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f  ext = fts5ExprNo
ca90: 64 65 4e 65 78 74 5f 53 54 52 49 4e 47 3b 0a 20  deNext_STRING;. 
caa0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
cab0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70    sqlite3Fts5Exp
cac0: 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  rFree(pNew);.   
cad0: 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65 46   fts5ExprPhraseF
cae0: 72 65 65 28 73 43 74 78 2e 70 50 68 72 61 73 65  ree(sCtx.pPhrase
caf0: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  );.    pNew = 0;
cb00: 0a 20 20 7d 0a 0a 20 20 2a 70 70 4e 65 77 20 3d  .  }..  *ppNew =
cb10: 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20   pNew;.  return 
cb20: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 6f  rc;.}.../*.** To
cb30: 6b 65 6e 20 70 54 6f 6b 20 68 61 73 20 61 70 70  ken pTok has app
cb40: 65 61 72 65 64 20 69 6e 20 61 20 4d 41 54 43 48  eared in a MATCH
cb50: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68 65 72   expression wher
cb60: 65 20 74 68 65 20 4e 45 41 52 20 6f 70 65 72 61  e the NEAR opera
cb70: 74 6f 72 0a 2a 2a 20 69 73 20 65 78 70 65 63 74  tor.** is expect
cb80: 65 64 2e 20 49 66 20 74 6f 6b 65 6e 20 70 54 6f  ed. If token pTo
cb90: 6b 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  k does not conta
cba0: 69 6e 20 22 4e 45 41 52 22 2c 20 73 74 6f 72 65  in "NEAR", store
cbb0: 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 69 6e 20   an error.** in 
cbc0: 74 68 65 20 70 50 61 72 73 65 20 6f 62 6a 65 63  the pParse objec
cbd0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
cbe0: 65 33 46 74 73 35 50 61 72 73 65 4e 65 61 72 28  e3Fts5ParseNear(
cbf0: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
cc00: 65 2c 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54  e, Fts5Token *pT
cc10: 6f 6b 29 7b 0a 20 20 69 66 28 20 70 54 6f 6b 2d  ok){.  if( pTok-
cc20: 3e 6e 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28  >n!=4 || memcmp(
cc30: 22 4e 45 41 52 22 2c 20 70 54 6f 6b 2d 3e 70 2c  "NEAR", pTok->p,
cc40: 20 34 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   4) ){.    sqlit
cc50: 65 33 46 74 73 35 50 61 72 73 65 45 72 72 6f 72  e3Fts5ParseError
cc60: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
cc70: 2c 20 22 66 74 73 35 3a 20 73 79 6e 74 61 78 20  , "fts5: syntax 
cc80: 65 72 72 6f 72 20 6e 65 61 72 20 5c 22 25 2e 2a  error near \"%.*
cc90: 73 5c 22 22 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 70  s\"", pTok->n, p
cca0: 54 6f 6b 2d 3e 70 0a 20 20 20 20 29 3b 0a 20 20  Tok->p.    );.  
ccb0: 7d 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  }.}..void sqlite
ccc0: 33 46 74 73 35 50 61 72 73 65 53 65 74 44 69 73  3Fts5ParseSetDis
ccd0: 74 61 6e 63 65 28 0a 20 20 46 74 73 35 50 61 72  tance(.  Fts5Par
cce0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 46  se *pParse, .  F
ccf0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a  ts5ExprNearset *
cd00: 70 4e 65 61 72 2c 0a 20 20 46 74 73 35 54 6f 6b  pNear,.  Fts5Tok
cd10: 65 6e 20 2a 70 0a 29 7b 0a 20 20 69 66 28 20 70  en *p.){.  if( p
cd20: 4e 65 61 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Near ){.    int 
cd30: 6e 4e 65 61 72 20 3d 20 30 3b 0a 20 20 20 20 69  nNear = 0;.    i
cd40: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 70 2d  nt i;.    if( p-
cd50: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  >n ){.      for(
cd60: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 3b 20 69 2b 2b  i=0; i<p->n; i++
cd70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
cd80: 63 20 3d 20 28 63 68 61 72 29 70 2d 3e 70 5b 69  c = (char)p->p[i
cd90: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ];.        if( c
cda0: 3c 27 30 27 20 7c 7c 20 63 3e 27 39 27 20 29 7b  <'0' || c>'9' ){
cdb0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cdc0: 65 33 46 74 73 35 50 61 72 73 65 45 72 72 6f 72  e3Fts5ParseError
cdd0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
cde0: 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65  pParse, "expecte
cdf0: 64 20 69 6e 74 65 67 65 72 2c 20 67 6f 74 20 5c  d integer, got \
ce00: 22 25 2e 2a 73 5c 22 22 2c 20 70 2d 3e 6e 2c 20  "%.*s\"", p->n, 
ce10: 70 2d 3e 70 0a 20 20 20 20 20 20 20 20 20 20 20  p->p.           
ce20: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
ce30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
ce40: 7d 0a 20 20 20 20 20 20 20 20 6e 4e 65 61 72 20  }.        nNear 
ce50: 3d 20 6e 4e 65 61 72 20 2a 20 31 30 20 2b 20 28  = nNear * 10 + (
ce60: 70 2d 3e 70 5b 69 5d 20 2d 20 27 30 27 29 3b 0a  p->p[i] - '0');.
ce70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
ce80: 65 7b 0a 20 20 20 20 20 20 6e 4e 65 61 72 20 3d  e{.      nNear =
ce90: 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 4e 45   FTS5_DEFAULT_NE
cea0: 41 52 44 49 53 54 3b 0a 20 20 20 20 7d 0a 20 20  ARDIST;.    }.  
ceb0: 20 20 70 4e 65 61 72 2d 3e 6e 4e 65 61 72 20 3d    pNear->nNear =
cec0: 20 6e 4e 65 61 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f   nNear;.  }.}../
ced0: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
cee0: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
cef0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
cf00: 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 6f 72   may be NULL, or
cf10: 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 61 6e   it may be.** an
cf20: 20 65 78 69 73 74 69 6e 67 20 46 74 73 35 43 6f   existing Fts5Co
cf30: 6c 73 65 74 20 6f 62 6a 65 63 74 2e 20 54 68 69  lset object. Thi
cf40: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
cf50: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  ns a pointer to.
cf60: 2a 2a 20 61 20 6e 65 77 20 63 6f 6c 73 65 74 20  ** a new colset 
cf70: 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e  object containin
cf80: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
cf90: 66 20 28 70 29 20 77 69 74 68 20 6e 65 77 20 76  f (p) with new v
cfa0: 61 6c 75 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e  alue column.** n
cfb0: 75 6d 62 65 72 20 69 43 6f 6c 20 61 70 70 65 6e  umber iCol appen
cfc0: 64 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ded. .**.** If a
cfd0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
cfe0: 72 73 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72  rs, store an err
cff0: 6f 72 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  or code in pPars
d000: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
d010: 4c 2e 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 63 6f  L..** The old co
d020: 6c 73 65 74 20 6f 62 6a 65 63 74 20 28 69 66 20  lset object (if 
d030: 61 6e 79 29 20 69 73 20 6e 6f 74 20 66 72 65 65  any) is not free
d040: 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
d050: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 43 6f  */.static Fts5Co
d060: 6c 73 65 74 20 2a 66 74 73 35 50 61 72 73 65 43  lset *fts5ParseC
d070: 6f 6c 73 65 74 28 0a 20 20 46 74 73 35 50 61 72  olset(.  Fts5Par
d080: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d090: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
d0a0: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 68  e SQLITE_NOMEM h
d0b0: 65 72 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ere if required 
d0c0: 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
d0d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
d0e0: 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
d0f0: 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 2a   colset object *
d100: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 20 20 20 20 2f 2a 20 4e 65 77 20 63 6f 6c 75 6d      /* New colum
d130: 6e 20 74 6f 20 61 64 64 20 74 6f 20 63 6f 6c 73  n to add to cols
d140: 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  et object */.){.
d150: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 20 3f    int nCol = p ?
d160: 20 70 2d 3e 6e 43 6f 6c 20 3a 20 30 3b 20 20 20   p->nCol : 0;   
d170: 20 20 2f 2a 20 4e 75 6d 2e 20 63 6f 6c 75 6d 6e    /* Num. column
d180: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 6f 6c  s already in col
d190: 73 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  set object */.  
d1a0: 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 4e 65 77  Fts5Colset *pNew
d1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d1c0: 2f 2a 20 4e 65 77 20 63 6f 6c 73 65 74 20 6f 62  /* New colset ob
d1d0: 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a  ject to return *
d1e0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
d1f0: 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
d200: 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
d210: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
d220: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d  pParse->pConfig-
d230: 3e 6e 43 6f 6c 20 29 3b 0a 0a 20 20 70 4e 65 77  >nCol );..  pNew
d240: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
d250: 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
d260: 35 43 6f 6c 73 65 74 29 20 2b 20 73 69 7a 65 6f  5Colset) + sizeo
d270: 66 28 69 6e 74 29 2a 6e 43 6f 6c 29 3b 0a 20 20  f(int)*nCol);.  
d280: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
d290: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
d2a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d2b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 2a  }else{.    int *
d2c0: 61 69 43 6f 6c 20 3d 20 70 4e 65 77 2d 3e 61 69  aiCol = pNew->ai
d2d0: 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20  Col;.    int i, 
d2e0: 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  j;.    for(i=0; 
d2f0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
d300: 20 20 20 20 69 66 28 20 61 69 43 6f 6c 5b 69 5d      if( aiCol[i]
d310: 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20  ==iCol ) return 
d320: 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28 20  pNew;.      if( 
d330: 61 69 43 6f 6c 5b 69 5d 3e 69 43 6f 6c 20 29 20  aiCol[i]>iCol ) 
d340: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d350: 20 66 6f 72 28 6a 3d 6e 43 6f 6c 3b 20 6a 3e 69   for(j=nCol; j>i
d360: 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 61 69  ; j--){.      ai
d370: 43 6f 6c 5b 6a 5d 20 3d 20 61 69 43 6f 6c 5b 6a  Col[j] = aiCol[j
d380: 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  -1];.    }.    a
d390: 69 43 6f 6c 5b 69 5d 20 3d 20 69 43 6f 6c 3b 0a  iCol[i] = iCol;.
d3a0: 20 20 20 20 70 4e 65 77 2d 3e 6e 43 6f 6c 20 3d      pNew->nCol =
d3b0: 20 6e 43 6f 6c 2b 31 3b 0a 0a 23 69 66 6e 64 65   nCol+1;..#ifnde
d3c0: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
d3d0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
d3e0: 72 72 61 79 20 69 73 20 69 6e 20 6f 72 64 65 72  rray is in order
d3f0: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   and contains no
d400: 20 64 75 70 6c 69 63 61 74 65 20 65 6e 74 72 69   duplicate entri
d410: 65 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  es. */.    for(i
d420: 3d 31 3b 20 69 3c 70 4e 65 77 2d 3e 6e 43 6f 6c  =1; i<pNew->nCol
d430: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
d440: 4e 65 77 2d 3e 61 69 43 6f 6c 5b 69 5d 3e 70 4e  New->aiCol[i]>pN
d450: 65 77 2d 3e 61 69 43 6f 6c 5b 69 2d 31 5d 20 29  ew->aiCol[i-1] )
d460: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
d470: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
d480: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
d490: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 46 74 73  nd return an Fts
d4a0: 35 43 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 73  5Colset object s
d4b0: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 69 6e  pecifying the in
d4c0: 76 65 72 73 65 20 6f 66 0a 2a 2a 20 74 68 65 20  verse of.** the 
d4d0: 63 6f 6c 73 65 74 20 70 61 73 73 65 64 20 61 73  colset passed as
d4e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
d4f0: 6d 65 6e 74 2e 20 46 72 65 65 20 74 68 65 20 63  ment. Free the c
d500: 6f 6c 73 65 74 20 70 61 73 73 65 64 0a 2a 2a 20  olset passed.** 
d510: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
d520: 67 75 6d 65 6e 74 20 62 65 66 6f 72 65 20 72 65  gument before re
d530: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 46 74 73 35  turning..*/.Fts5
d540: 43 6f 6c 73 65 74 20 2a 73 71 6c 69 74 65 33 46  Colset *sqlite3F
d550: 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74 49 6e  ts5ParseColsetIn
d560: 76 65 72 74 28 46 74 73 35 50 61 72 73 65 20 2a  vert(Fts5Parse *
d570: 70 50 61 72 73 65 2c 20 46 74 73 35 43 6f 6c 73  pParse, Fts5Cols
d580: 65 74 20 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f  et *p){.  Fts5Co
d590: 6c 73 65 74 20 2a 70 52 65 74 3b 0a 20 20 69 6e  lset *pRet;.  in
d5a0: 74 20 6e 43 6f 6c 20 3d 20 70 50 61 72 73 65 2d  t nCol = pParse-
d5b0: 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a  >pConfig->nCol;.
d5c0: 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 43  .  pRet = (Fts5C
d5d0: 6f 6c 73 65 74 2a 29 73 71 6c 69 74 65 33 46 74  olset*)sqlite3Ft
d5e0: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 50  s5MallocZero(&pP
d5f0: 61 72 73 65 2d 3e 72 63 2c 20 0a 20 20 20 20 20  arse->rc, .     
d600: 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c 73   sizeof(Fts5Cols
d610: 65 74 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74  et) + sizeof(int
d620: 29 2a 6e 43 6f 6c 0a 20 20 29 3b 0a 20 20 69 66  )*nCol.  );.  if
d630: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( pRet ){.    in
d640: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 4f 6c  t i;.    int iOl
d650: 64 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  d = 0;.    for(i
d660: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
d670: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 6c 64  {.      if( iOld
d680: 3e 3d 70 2d 3e 6e 43 6f 6c 20 7c 7c 20 70 2d 3e  >=p->nCol || p->
d690: 61 69 43 6f 6c 5b 69 4f 6c 64 5d 21 3d 69 20 29  aiCol[iOld]!=i )
d6a0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
d6b0: 61 69 43 6f 6c 5b 70 52 65 74 2d 3e 6e 43 6f 6c  aiCol[pRet->nCol
d6c0: 2b 2b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d  ++] = i;.      }
d6d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
d6e0: 6c 64 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ld++;.      }.  
d6f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
d700: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
d710: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 46 74  turn pRet;.}..Ft
d720: 73 35 43 6f 6c 73 65 74 20 2a 73 71 6c 69 74 65  s5Colset *sqlite
d730: 33 46 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74  3Fts5ParseColset
d740: 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70  (.  Fts5Parse *p
d750: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d760: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 53 51 4c      /* Store SQL
d770: 49 54 45 5f 4e 4f 4d 45 4d 20 68 65 72 65 20 69  ITE_NOMEM here i
d780: 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
d790: 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
d7a0: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
d7b0: 2f 2a 20 45 78 69 73 74 69 6e 67 20 63 6f 6c 73  /* Existing cols
d7c0: 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  et object */.  F
d7d0: 74 73 35 54 6f 6b 65 6e 20 2a 70 0a 29 7b 0a 20  ts5Token *p.){. 
d7e0: 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 52 65   Fts5Colset *pRe
d7f0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  t = 0;.  int iCo
d800: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  l;.  char *z;   
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
d830: 20 63 6f 70 79 20 6f 66 20 74 6f 6b 65 6e 20 70   copy of token p
d840: 20 2a 2f 0a 0a 20 20 7a 20 3d 20 73 71 6c 69 74   */..  z = sqlit
d850: 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26 70  e3Fts5Strndup(&p
d860: 50 61 72 73 65 2d 3e 72 63 2c 20 70 2d 3e 70 2c  Parse->rc, p->p,
d870: 20 70 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 50   p->n);.  if( pP
d880: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
d890: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43  _OK ){.    Fts5C
d8a0: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
d8b0: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67   pParse->pConfig
d8c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
d8d0: 35 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 20  5Dequote(z);.   
d8e0: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
d8f0: 6c 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b  l<pConfig->nCol;
d900: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
d910: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
d920: 74 72 69 63 6d 70 28 70 43 6f 6e 66 69 67 2d 3e  tricmp(pConfig->
d930: 61 7a 43 6f 6c 5b 69 43 6f 6c 5d 2c 20 7a 29 20  azCol[iCol], z) 
d940: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
d950: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 43 6f     if( iCol==pCo
d960: 6e 66 69 67 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  nfig->nCol ){.  
d970: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
d980: 61 72 73 65 45 72 72 6f 72 28 70 50 61 72 73 65  arseError(pParse
d990: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  , "no such colum
d9a0: 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  n: %s", z);.    
d9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65  }else{.      pRe
d9c0: 74 20 3d 20 66 74 73 35 50 61 72 73 65 43 6f 6c  t = fts5ParseCol
d9d0: 73 65 74 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  set(pParse, pCol
d9e0: 73 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  set, iCol);.    
d9f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
da00: 65 65 28 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ee(z);.  }..  if
da10: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
da20: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
da30: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
da40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
da50: 65 65 28 70 43 6f 6c 73 65 74 29 3b 0a 20 20 7d  ee(pColset);.  }
da60: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
da70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
da80: 75 6d 65 6e 74 20 70 4f 72 69 67 20 69 73 20 4e  ument pOrig is N
da90: 55 4c 4c 2c 20 6f 72 20 69 66 20 28 2a 70 52 63  ULL, or if (*pRc
daa0: 29 20 69 73 20 73 65 74 20 74 6f 20 61 6e 79 74  ) is set to anyt
dab0: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a  hing other than.
dac0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  ** SQLITE_OK whe
dad0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
dae0: 69 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20  is called, NULL 
daf0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
db00: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
db10: 20 63 6f 70 79 20 6f 66 20 28 2a 70 4f 72 69 67   copy of (*pOrig
db20: 29 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  ) is made into m
db30: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
db40: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74  rom.** sqlite3Ft
db50: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 61  s5MallocZero() a
db60: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
db70: 69 74 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  it returned. If 
db80: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  the allocation.*
db90: 2a 20 66 61 69 6c 73 2c 20 28 2a 70 52 63 29 20  * fails, (*pRc) 
dba0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
dbb0: 5f 4e 4f 4d 45 4d 20 61 6e 64 20 4e 55 4c 4c 20  _NOMEM and NULL 
dbc0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
dbd0: 73 74 61 74 69 63 20 46 74 73 35 43 6f 6c 73 65  static Fts5Colse
dbe0: 74 20 2a 66 74 73 35 43 6c 6f 6e 65 43 6f 6c 73  t *fts5CloneCols
dbf0: 65 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  et(int *pRc, Fts
dc00: 35 43 6f 6c 73 65 74 20 2a 70 4f 72 69 67 29 7b  5Colset *pOrig){
dc10: 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
dc20: 52 65 74 3b 0a 20 20 69 66 28 20 70 4f 72 69 67  Ret;.  if( pOrig
dc30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
dc40: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 43  e = sizeof(Fts5C
dc50: 6f 6c 73 65 74 29 20 2b 20 28 70 4f 72 69 67 2d  olset) + (pOrig-
dc60: 3e 6e 43 6f 6c 2d 31 29 20 2a 20 73 69 7a 65 6f  >nCol-1) * sizeo
dc70: 66 28 69 6e 74 29 3b 0a 20 20 20 20 70 52 65 74  f(int);.    pRet
dc80: 20 3d 20 28 46 74 73 35 43 6f 6c 73 65 74 2a 29   = (Fts5Colset*)
dc90: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
dca0: 63 5a 65 72 6f 28 70 52 63 2c 20 6e 42 79 74 65  cZero(pRc, nByte
dcb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
dcc0: 29 7b 20 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ){ .      memcpy
dcd0: 28 70 52 65 74 2c 20 70 4f 72 69 67 2c 20 6e 42  (pRet, pOrig, nB
dce0: 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  yte);.    }.  }e
dcf0: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
dd00: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
dd10: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
dd20: 65 6d 6f 76 65 20 66 72 6f 6d 20 63 6f 6c 73 65  emove from colse
dd30: 74 20 70 43 6f 6c 73 65 74 20 61 6e 79 20 63 6f  t pColset any co
dd40: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e  lumns that are n
dd50: 6f 74 20 61 6c 73 6f 20 69 6e 20 63 6f 6c 73 65  ot also in colse
dd60: 74 20 70 4d 65 72 67 65 2e 0a 2a 2f 0a 73 74 61  t pMerge..*/.sta
dd70: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
dd80: 67 65 43 6f 6c 73 65 74 28 46 74 73 35 43 6f 6c  geColset(Fts5Col
dd90: 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 46 74  set *pColset, Ft
dda0: 73 35 43 6f 6c 73 65 74 20 2a 70 4d 65 72 67 65  s5Colset *pMerge
ddb0: 29 7b 0a 20 20 69 6e 74 20 69 49 6e 20 3d 20 30  ){.  int iIn = 0
ddc0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ;          /* Ne
ddd0: 78 74 20 69 6e 70 75 74 20 69 6e 20 70 43 6f 6c  xt input in pCol
dde0: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  set */.  int iMe
ddf0: 72 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  rge = 0;       /
de00: 2a 20 4e 65 78 74 20 69 6e 70 75 74 20 69 6e 20  * Next input in 
de10: 70 4d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20  pMerge */.  int 
de20: 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  iOut = 0;       
de30: 20 20 2f 2a 20 4e 65 78 74 20 6f 75 74 70 75 74    /* Next output
de40: 20 73 6c 6f 74 20 69 6e 20 70 43 6f 6c 73 65 74   slot in pColset
de50: 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 49   */..  while( iI
de60: 6e 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 20  n<pColset->nCol 
de70: 26 26 20 69 4d 65 72 67 65 3c 70 4d 65 72 67 65  && iMerge<pMerge
de80: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 6e  ->nCol ){.    in
de90: 74 20 69 44 69 66 66 20 3d 20 70 43 6f 6c 73 65  t iDiff = pColse
dea0: 74 2d 3e 61 69 43 6f 6c 5b 69 49 6e 5d 20 2d 20  t->aiCol[iIn] - 
deb0: 70 4d 65 72 67 65 2d 3e 61 69 43 6f 6c 5b 69 4d  pMerge->aiCol[iM
dec0: 65 72 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 69  erge];.    if( i
ded0: 44 69 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Diff==0 ){.     
dee0: 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b   pColset->aiCol[
def0: 69 4f 75 74 2b 2b 5d 20 3d 20 70 4d 65 72 67 65  iOut++] = pMerge
df00: 2d 3e 61 69 43 6f 6c 5b 69 4d 65 72 67 65 5d 3b  ->aiCol[iMerge];
df10: 0a 20 20 20 20 20 20 69 4d 65 72 67 65 2b 2b 3b  .      iMerge++;
df20: 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
df30: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44 69 66    }else if( iDif
df40: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 4d 65  f>0 ){.      iMe
df50: 72 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  rge++;.    }else
df60: 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20  {.      iIn++;. 
df70: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 6f 6c 73     }.  }.  pCols
df80: 65 74 2d 3e 6e 43 6f 6c 20 3d 20 69 4f 75 74 3b  et->nCol = iOut;
df90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
dfa0: 69 76 65 6c 79 20 61 70 70 6c 79 20 63 6f 6c 73  ively apply cols
dfb0: 65 74 20 70 43 6f 6c 73 65 74 20 74 6f 20 65 78  et pColset to ex
dfc0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 70 4e  pression node pN
dfd0: 6f 64 65 20 61 6e 64 20 61 6c 6c 20 6f 66 0a 2a  ode and all of.*
dfe0: 2a 20 69 74 73 20 64 65 63 65 6e 64 65 6e 74 73  * its decendents
dff0: 2e 20 49 66 20 28 2a 70 70 46 72 65 65 29 20 69  . If (*ppFree) i
e000: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 63  s not NULL, it c
e010: 6f 6e 74 61 69 6e 73 20 61 20 73 70 61 72 65 20  ontains a spare 
e020: 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 43 6f 6c 73  copy.** of pCols
e030: 65 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  et. This functio
e040: 6e 20 6d 61 79 20 75 73 65 20 74 68 65 20 73 70  n may use the sp
e050: 61 72 65 20 63 6f 70 79 20 61 6e 64 20 73 65 74  are copy and set
e060: 20 28 2a 70 70 46 72 65 65 29 20 74 6f 0a 2a 2a   (*ppFree) to.**
e070: 20 7a 65 72 6f 2c 20 6f 72 20 69 74 20 6d 61 79   zero, or it may
e080: 20 63 72 65 61 74 65 20 63 6f 70 69 65 73 20 6f   create copies o
e090: 66 20 70 43 6f 6c 73 65 74 20 75 73 69 6e 67 20  f pColset using 
e0a0: 66 74 73 35 43 6c 6f 6e 65 43 6f 6c 73 65 74 28  fts5CloneColset(
e0b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
e0c0: 64 20 66 74 73 35 50 61 72 73 65 53 65 74 43 6f  d fts5ParseSetCo
e0d0: 6c 73 65 74 28 0a 20 20 46 74 73 35 50 61 72 73  lset(.  Fts5Pars
e0e0: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 46 74  e *pParse, .  Ft
e0f0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
e100: 65 2c 20 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  e, .  Fts5Colset
e110: 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73   *pColset,.  Fts
e120: 35 43 6f 6c 73 65 74 20 2a 2a 70 70 46 72 65 65  5Colset **ppFree
e130: 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
e140: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
e150: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e160: 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Node->eType==FTS
e170: 35 5f 54 45 52 4d 20 7c 7c 20 70 4e 6f 64 65 2d  5_TERM || pNode-
e180: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52  >eType==FTS5_STR
e190: 49 4e 47 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ING .         ||
e1a0: 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46   pNode->eType==F
e1b0: 54 53 35 5f 41 4e 44 20 20 7c 7c 20 70 4e 6f 64  TS5_AND  || pNod
e1c0: 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4f  e->eType==FTS5_O
e1d0: 52 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e  R.         || pN
e1e0: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ode->eType==FTS5
e1f0: 5f 4e 4f 54 20 20 7c 7c 20 70 4e 6f 64 65 2d 3e  _NOT  || pNode->
e200: 65 54 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46 0a  eType==FTS5_EOF.
e210: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
e220: 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Node->eType==FTS
e230: 35 5f 53 54 52 49 4e 47 20 7c 7c 20 70 4e 6f 64  5_STRING || pNod
e240: 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54  e->eType==FTS5_T
e250: 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 46 74 73  ERM ){.      Fts
e260: 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e  5ExprNearset *pN
e270: 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65  ear = pNode->pNe
e280: 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  ar;.      if( pN
e290: 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 29 7b 0a  ear->pColset ){.
e2a0: 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
e2b0: 65 43 6f 6c 73 65 74 28 70 4e 65 61 72 2d 3e 70  eColset(pNear->p
e2c0: 43 6f 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74 29  Colset, pColset)
e2d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
e2e0: 65 61 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43  ear->pColset->nC
e2f0: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ol==0 ){.       
e300: 20 20 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20     pNode->eType 
e310: 3d 20 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20  = FTS5_EOF;.    
e320: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65        pNode->xNe
e330: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
e340: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
e350: 28 20 2a 70 70 46 72 65 65 20 29 7b 0a 20 20 20  ( *ppFree ){.   
e360: 20 20 20 20 20 70 4e 65 61 72 2d 3e 70 43 6f 6c       pNear->pCol
e370: 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
e380: 20 20 20 20 20 20 20 2a 70 70 46 72 65 65 20 3d         *ppFree =
e390: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
e3a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d 3e  .        pNear->
e3b0: 70 43 6f 6c 73 65 74 20 3d 20 66 74 73 35 43 6c  pColset = fts5Cl
e3c0: 6f 6e 65 43 6f 6c 73 65 74 28 26 70 50 61 72 73  oneColset(&pPars
e3d0: 65 2d 3e 72 63 2c 20 70 43 6f 6c 73 65 74 29 3b  e->rc, pColset);
e3e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e3f0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
e400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e410: 4e 6f 64 65 2d 3e 65 54 79 70 65 21 3d 46 54 53  Node->eType!=FTS
e420: 35 5f 45 4f 46 20 7c 7c 20 70 4e 6f 64 65 2d 3e  5_EOF || pNode->
e430: 6e 43 68 69 6c 64 3d 3d 30 20 29 3b 0a 20 20 20  nChild==0 );.   
e440: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
e450: 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b  ode->nChild; i++
e460: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 50  ){.        fts5P
e470: 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28 70 50  arseSetColset(pP
e480: 61 72 73 65 2c 20 70 4e 6f 64 65 2d 3e 61 70 43  arse, pNode->apC
e490: 68 69 6c 64 5b 69 5d 2c 20 70 43 6f 6c 73 65 74  hild[i], pColset
e4a0: 2c 20 70 70 46 72 65 65 29 3b 0a 20 20 20 20 20  , ppFree);.     
e4b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
e4c0: 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 63 6f 6c 73  /*.** Apply cols
e4d0: 65 74 20 70 43 6f 6c 73 65 74 20 74 6f 20 65 78  et pColset to ex
e4e0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 70 45  pression node pE
e4f0: 78 70 72 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  xpr and all of i
e500: 74 73 20 64 65 73 63 65 6e 64 65 6e 74 73 2e 0a  ts descendents..
e510: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
e520: 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65  ts5ParseSetColse
e530: 74 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a  t(.  Fts5Parse *
e540: 70 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45  pParse, .  Fts5E
e550: 78 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 2c 20  xprNode *pExpr, 
e560: 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
e570: 43 6f 6c 73 65 74 20 0a 29 7b 0a 20 20 46 74 73  Colset .){.  Fts
e580: 35 43 6f 6c 73 65 74 20 2a 70 46 72 65 65 20 3d  5Colset *pFree =
e590: 20 70 43 6f 6c 73 65 74 3b 0a 20 20 69 66 28 20   pColset;.  if( 
e5a0: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d  pParse->pConfig-
e5b0: 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
e5c0: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
e5d0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
e5e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
e5f0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 20 3d 20   pParse->zErr = 
e600: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e610: 0a 20 20 20 20 20 20 22 66 74 73 35 3a 20 63 6f  .      "fts5: co
e620: 6c 75 6d 6e 20 71 75 65 72 69 65 73 20 61 72 65  lumn queries are
e630: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 28   not supported (
e640: 64 65 74 61 69 6c 3d 6e 6f 6e 65 29 22 0a 20 20  detail=none)".  
e650: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
e660: 20 20 66 74 73 35 50 61 72 73 65 53 65 74 43 6f    fts5ParseSetCo
e670: 6c 73 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  lset(pParse, pEx
e680: 70 72 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 46  pr, pColset, &pF
e690: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ree);.  }.  sqli
e6a0: 74 65 33 5f 66 72 65 65 28 70 46 72 65 65 29 3b  te3_free(pFree);
e6b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
e6c0: 66 74 73 35 45 78 70 72 41 73 73 69 67 6e 58 4e  fts5ExprAssignXN
e6d0: 65 78 74 28 46 74 73 35 45 78 70 72 4e 6f 64 65  ext(Fts5ExprNode
e6e0: 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 73 77 69 74   *pNode){.  swit
e6f0: 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65  ch( pNode->eType
e700: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53   ){.    case FTS
e710: 35 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  5_STRING: {.    
e720: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
e730: 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65  t *pNear = pNode
e740: 2d 3e 70 4e 65 61 72 3b 0a 20 20 20 20 20 20 69  ->pNear;.      i
e750: 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73  f( pNear->nPhras
e760: 65 3d 3d 31 20 26 26 20 70 4e 65 61 72 2d 3e 61  e==1 && pNear->a
e770: 70 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54 65 72  pPhrase[0]->nTer
e780: 6d 3d 3d 31 20 0a 20 20 20 20 20 20 20 26 26 20  m==1 .       && 
e790: 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b  pNear->apPhrase[
e7a0: 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79  0]->aTerm[0].pSy
e7b0: 6e 6f 6e 79 6d 3d 3d 30 0a 20 20 20 20 20 20 20  nonym==0.       
e7c0: 26 26 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61  && pNear->apPhra
e7d0: 73 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e  se[0]->aTerm[0].
e7e0: 62 46 69 72 73 74 3d 3d 30 0a 20 20 20 20 20 20  bFirst==0.      
e7f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65  ){.        pNode
e800: 2d 3e 65 54 79 70 65 20 3d 20 46 54 53 35 5f 54  ->eType = FTS5_T
e810: 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  ERM;.        pNo
e820: 64 65 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  de->xNext = fts5
e830: 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45 52  ExprNodeNext_TER
e840: 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
e850: 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78          pNode->x
e860: 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e  Next = fts5ExprN
e870: 6f 64 65 4e 65 78 74 5f 53 54 52 49 4e 47 3b 0a  odeNext_STRING;.
e880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e890: 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20 20  eak;.    };..   
e8a0: 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20 7b   case FTS5_OR: {
e8b0: 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e  .      pNode->xN
e8c0: 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f  ext = fts5ExprNo
e8d0: 64 65 4e 65 78 74 5f 4f 52 3b 0a 20 20 20 20 20  deNext_OR;.     
e8e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a   break;.    };..
e8f0: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e      case FTS5_AN
e900: 44 3a 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65  D: {.      pNode
e910: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78  ->xNext = fts5Ex
e920: 70 72 4e 6f 64 65 4e 65 78 74 5f 41 4e 44 3b 0a  prNodeNext_AND;.
e930: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e940: 20 7d 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74   };..    default
e950: 3a 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d  : assert( pNode-
e960: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f 54  >eType==FTS5_NOT
e970: 20 29 3b 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64   ); {.      pNod
e980: 65 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45  e->xNext = fts5E
e990: 78 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54 3b  xprNodeNext_NOT;
e9a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e9b0: 20 20 7d 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74    };.  }.}..stat
e9c0: 69 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72  ic void fts5Expr
e9d0: 41 64 64 43 68 69 6c 64 72 65 6e 28 46 74 73 35  AddChildren(Fts5
e9e0: 45 78 70 72 4e 6f 64 65 20 2a 70 2c 20 46 74 73  ExprNode *p, Fts
e9f0: 35 45 78 70 72 4e 6f 64 65 20 2a 70 53 75 62 29  5ExprNode *pSub)
ea00: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65  {.  if( p->eType
ea10: 21 3d 46 54 53 35 5f 4e 4f 54 20 26 26 20 70 53  !=FTS5_NOT && pS
ea20: 75 62 2d 3e 65 54 79 70 65 3d 3d 70 2d 3e 65 54  ub->eType==p->eT
ea30: 79 70 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ype ){.    int n
ea40: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
ea50: 73 35 45 78 70 72 4e 6f 64 65 2a 29 20 2a 20 70  s5ExprNode*) * p
ea60: 53 75 62 2d 3e 6e 43 68 69 6c 64 3b 0a 20 20 20  Sub->nChild;.   
ea70: 20 6d 65 6d 63 70 79 28 26 70 2d 3e 61 70 43 68   memcpy(&p->apCh
ea80: 69 6c 64 5b 70 2d 3e 6e 43 68 69 6c 64 5d 2c 20  ild[p->nChild], 
ea90: 70 53 75 62 2d 3e 61 70 43 68 69 6c 64 2c 20 6e  pSub->apChild, n
eaa0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 6e 43  Byte);.    p->nC
eab0: 68 69 6c 64 20 2b 3d 20 70 53 75 62 2d 3e 6e 43  hild += pSub->nC
eac0: 68 69 6c 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  hild;.    sqlite
ead0: 33 5f 66 72 65 65 28 70 53 75 62 29 3b 0a 20 20  3_free(pSub);.  
eae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61 70  }else{.    p->ap
eaf0: 43 68 69 6c 64 5b 70 2d 3e 6e 43 68 69 6c 64 2b  Child[p->nChild+
eb00: 2b 5d 20 3d 20 70 53 75 62 3b 0a 20 20 7d 0a 7d  +] = pSub;.  }.}
eb10: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
eb20: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65   and return a ne
eb30: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62 6a  w expression obj
eb40: 65 63 74 2e 20 49 66 20 61 6e 79 74 68 69 6e 67  ect. If anything
eb50: 20 67 6f 65 73 20 77 72 6f 6e 67 20 28 69 2e 65   goes wrong (i.e
eb60: 2e 0a 2a 2a 20 4f 4f 4d 20 65 72 72 6f 72 29 2c  ..** OOM error),
eb70: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
eb80: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
eb90: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
eba0: 2a 2f 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20  */.Fts5ExprNode 
ebb0: 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73  *sqlite3Fts5Pars
ebc0: 65 4e 6f 64 65 28 0a 20 20 46 74 73 35 50 61 72  eNode(.  Fts5Par
ebd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ebe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
ebf0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  e context */.  i
ec00: 6e 74 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  nt eType,       
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ec20: 2a 20 46 54 53 35 5f 53 54 52 49 4e 47 2c 20 41  * FTS5_STRING, A
ec30: 4e 44 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 2a 2f  ND, OR or NOT */
ec40: 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
ec50: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
ec60: 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20     /* Left hand 
ec70: 63 68 69 6c 64 20 65 78 70 72 65 73 73 69 6f 6e  child expression
ec80: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f   */.  Fts5ExprNo
ec90: 64 65 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  de *pRight,     
eca0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68        /* Right h
ecb0: 61 6e 64 20 63 68 69 6c 64 20 65 78 70 72 65 73  and child expres
ecc0: 73 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78  sion */.  Fts5Ex
ecd0: 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
ece0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
ecf0: 20 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69   STRING expressi
ed00: 6f 6e 73 2c 20 74 68 65 20 6e 65 61 72 20 63 6c  ons, the near cl
ed10: 75 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74  uster */.){.  Ft
ed20: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 65 74  s5ExprNode *pRet
ed30: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 50 61   = 0;..  if( pPa
ed40: 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
ed50: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43  OK ){.    int nC
ed60: 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
ed70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ed80: 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 6f 66  r of children of
ed90: 20 72 65 74 75 72 6e 65 64 20 6e 6f 64 65 20 2a   returned node *
eda0: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
edd0: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
ede0: 65 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  e for this node 
edf0: 2a 2f 0a 20 0a 20 20 20 20 61 73 73 65 72 74 28  */. .    assert(
ee00: 20 28 65 54 79 70 65 21 3d 46 54 53 35 5f 53 54   (eType!=FTS5_ST
ee10: 52 49 4e 47 20 26 26 20 21 70 4e 65 61 72 29 0a  RING && !pNear).
ee20: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 65 54 79           || (eTy
ee30: 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20  pe==FTS5_STRING 
ee40: 26 26 20 21 70 4c 65 66 74 20 26 26 20 21 70 52  && !pLeft && !pR
ee50: 69 67 68 74 29 0a 20 20 20 20 29 3b 0a 20 20 20  ight).    );.   
ee60: 20 69 66 28 20 65 54 79 70 65 3d 3d 46 54 53 35   if( eType==FTS5
ee70: 5f 53 54 52 49 4e 47 20 26 26 20 70 4e 65 61 72  _STRING && pNear
ee80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ee90: 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 46      if( eType!=F
eea0: 54 53 35 5f 53 54 52 49 4e 47 20 26 26 20 70 4c  TS5_STRING && pL
eeb0: 65 66 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  eft==0 ) return 
eec0: 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20  pRight;.    if( 
eed0: 65 54 79 70 65 21 3d 46 54 53 35 5f 53 54 52 49  eType!=FTS5_STRI
eee0: 4e 47 20 26 26 20 70 52 69 67 68 74 3d 3d 30 20  NG && pRight==0 
eef0: 29 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a  ) return pLeft;.
ef00: 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
ef10: 46 54 53 35 5f 4e 4f 54 20 29 7b 0a 20 20 20 20  FTS5_NOT ){.    
ef20: 20 20 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20    nChild = 2;.  
ef30: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70    }else if( eTyp
ef40: 65 3d 3d 46 54 53 35 5f 41 4e 44 20 7c 7c 20 65  e==FTS5_AND || e
ef50: 54 79 70 65 3d 3d 46 54 53 35 5f 4f 52 20 29 7b  Type==FTS5_OR ){
ef60: 0a 20 20 20 20 20 20 6e 43 68 69 6c 64 20 3d 20  .      nChild = 
ef70: 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  2;.      if( pLe
ef80: 66 74 2d 3e 65 54 79 70 65 3d 3d 65 54 79 70 65  ft->eType==eType
ef90: 20 29 20 6e 43 68 69 6c 64 20 2b 3d 20 70 4c 65   ) nChild += pLe
efa0: 66 74 2d 3e 6e 43 68 69 6c 64 2d 31 3b 0a 20 20  ft->nChild-1;.  
efb0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
efc0: 65 54 79 70 65 3d 3d 65 54 79 70 65 20 29 20 6e  eType==eType ) n
efd0: 43 68 69 6c 64 20 2b 3d 20 70 52 69 67 68 74 2d  Child += pRight-
efe0: 3e 6e 43 68 69 6c 64 2d 31 3b 0a 20 20 20 20 7d  >nChild-1;.    }
eff0: 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ..    nByte = si
f000: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e 6f 64  zeof(Fts5ExprNod
f010: 65 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 35  e) + sizeof(Fts5
f020: 45 78 70 72 4e 6f 64 65 2a 29 2a 28 6e 43 68 69  ExprNode*)*(nChi
f030: 6c 64 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20  ld-1);.    pRet 
f040: 3d 20 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a  = (Fts5ExprNode*
f050: 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
f060: 6f 63 5a 65 72 6f 28 26 70 50 61 72 73 65 2d 3e  ocZero(&pParse->
f070: 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20  rc, nByte);..   
f080: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
f090: 20 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d     pRet->eType =
f0a0: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 52   eType;.      pR
f0b0: 65 74 2d 3e 70 4e 65 61 72 20 3d 20 70 4e 65 61  et->pNear = pNea
f0c0: 72 3b 0a 20 20 20 20 20 20 66 74 73 35 45 78 70  r;.      fts5Exp
f0d0: 72 41 73 73 69 67 6e 58 4e 65 78 74 28 70 52 65  rAssignXNext(pRe
f0e0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  t);.      if( eT
f0f0: 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47  ype==FTS5_STRING
f100: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
f110: 69 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20  iPhrase;.       
f120: 20 66 6f 72 28 69 50 68 72 61 73 65 3d 30 3b 20   for(iPhrase=0; 
f130: 69 50 68 72 61 73 65 3c 70 4e 65 61 72 2d 3e 6e  iPhrase<pNear->n
f140: 50 68 72 61 73 65 3b 20 69 50 68 72 61 73 65 2b  Phrase; iPhrase+
f150: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  +){.          pN
f160: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 50  ear->apPhrase[iP
f170: 68 72 61 73 65 5d 2d 3e 70 4e 6f 64 65 20 3d 20  hrase]->pNode = 
f180: 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  pRet;.          
f190: 69 66 28 20 70 4e 65 61 72 2d 3e 61 70 50 68 72  if( pNear->apPhr
f1a0: 61 73 65 5b 69 50 68 72 61 73 65 5d 2d 3e 6e 54  ase[iPhrase]->nT
f1b0: 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  erm==0 ){.      
f1c0: 20 20 20 20 20 20 70 52 65 74 2d 3e 78 4e 65 78        pRet->xNex
f1d0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
f1e0: 20 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d     pRet->eType =
f1f0: 20 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20   FTS5_EOF;.     
f200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
f210: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
f220: 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  arse->pConfig->e
f230: 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54  Detail!=FTS5_DET
f240: 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
f250: 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68        Fts5ExprPh
f260: 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20  rase *pPhrase = 
f270: 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b  pNear->apPhrase[
f280: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0];.          if
f290: 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  ( pNear->nPhrase
f2a0: 21 3d 31 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=1 .           
f2b0: 7c 7c 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72  || pPhrase->nTer
f2c0: 6d 3e 31 0a 20 20 20 20 20 20 20 20 20 20 20 7c  m>1.           |
f2d0: 7c 20 28 70 50 68 72 61 73 65 2d 3e 6e 54 65 72  | (pPhrase->nTer
f2e0: 6d 3e 30 20 26 26 20 70 50 68 72 61 73 65 2d 3e  m>0 && pPhrase->
f2f0: 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 29  aTerm[0].bFirst)
f300: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
f310: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
f320: 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ( pParse->rc==SQ
f330: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
f340: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
f350: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
f360: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
f370: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 7a 45  sert( pParse->zE
f380: 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  rr==0 );.       
f390: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 45 72       pParse->zEr
f3a0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
f3b0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
f3c0: 20 20 20 20 20 22 66 74 73 35 3a 20 25 73 20 71       "fts5: %s q
f3d0: 75 65 72 69 65 73 20 61 72 65 20 6e 6f 74 20 73  ueries are not s
f3e0: 75 70 70 6f 72 74 65 64 20 28 64 65 74 61 69 6c  upported (detail
f3f0: 21 3d 66 75 6c 6c 29 22 2c 20 0a 20 20 20 20 20  !=full)", .     
f400: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 61 72             pNear
f410: 2d 3e 6e 50 68 72 61 73 65 3d 3d 31 20 3f 20 22  ->nPhrase==1 ? "
f420: 70 68 72 61 73 65 22 3a 20 22 4e 45 41 52 22 0a  phrase": "NEAR".
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
f450: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74  qlite3_free(pRet
f460: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
f470: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Ret = 0;.       
f480: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
f490: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f4a0: 20 20 20 20 66 74 73 35 45 78 70 72 41 64 64 43      fts5ExprAddC
f4b0: 68 69 6c 64 72 65 6e 28 70 52 65 74 2c 20 70 4c  hildren(pRet, pL
f4c0: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  eft);.        ft
f4d0: 73 35 45 78 70 72 41 64 64 43 68 69 6c 64 72 65  s5ExprAddChildre
f4e0: 6e 28 70 52 65 74 2c 20 70 52 69 67 68 74 29 3b  n(pRet, pRight);
f4f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f500: 20 7d 0a 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   }..  if( pRet==
f510: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
f520: 20 70 50 61 72 73 65 2d 3e 72 63 21 3d 53 51 4c   pParse->rc!=SQL
f530: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71  ITE_OK );.    sq
f540: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
f550: 64 65 46 72 65 65 28 70 4c 65 66 74 29 3b 0a 20  deFree(pLeft);. 
f560: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
f570: 72 73 65 4e 6f 64 65 46 72 65 65 28 70 52 69 67  rseNodeFree(pRig
f580: 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ht);.    sqlite3
f590: 46 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74  Fts5ParseNearset
f5a0: 46 72 65 65 28 70 4e 65 61 72 29 3b 0a 20 20 7d  Free(pNear);.  }
f5b0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
f5c0: 7d 0a 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20  }..Fts5ExprNode 
f5d0: 2a 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73  *sqlite3Fts5Pars
f5e0: 65 49 6d 70 6c 69 63 69 74 41 6e 64 28 0a 20 20  eImplicitAnd(.  
f5f0: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
f600: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f610: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
f620: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f   */.  Fts5ExprNo
f630: 64 65 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  de *pLeft,      
f640: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61        /* Left ha
f650: 6e 64 20 63 68 69 6c 64 20 65 78 70 72 65 73 73  nd child express
f660: 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  ion */.  Fts5Exp
f670: 72 4e 6f 64 65 20 2a 70 52 69 67 68 74 20 20 20  rNode *pRight   
f680: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
f690: 74 20 68 61 6e 64 20 63 68 69 6c 64 20 65 78 70  t hand child exp
f6a0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
f6b0: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52  Fts5ExprNode *pR
f6c0: 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 45 78  et = 0;.  Fts5Ex
f6d0: 70 72 4e 6f 64 65 20 2a 70 50 72 65 76 3b 0a 0a  prNode *pPrev;..
f6e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63    if( pParse->rc
f6f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
f700: 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65  ts5ParseNodeFree
f710: 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  (pLeft);.    sql
f720: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64  ite3Fts5ParseNod
f730: 65 46 72 65 65 28 70 52 69 67 68 74 29 3b 0a 20  eFree(pRight);. 
f740: 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 61 73 73   }else{..    ass
f750: 65 72 74 28 20 70 4c 65 66 74 2d 3e 65 54 79 70  ert( pLeft->eTyp
f760: 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 0a  e==FTS5_STRING .
f770: 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 65 66 74          || pLeft
f780: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45  ->eType==FTS5_TE
f790: 52 4d 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 4c  RM.        || pL
f7a0: 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  eft->eType==FTS5
f7b0: 5f 45 4f 46 0a 20 20 20 20 20 20 20 20 7c 7c 20  _EOF.        || 
f7c0: 70 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54  pLeft->eType==FT
f7d0: 53 35 5f 41 4e 44 0a 20 20 20 20 29 3b 0a 20 20  S5_AND.    );.  
f7e0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
f7f0: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54  ->eType==FTS5_ST
f800: 52 49 4e 47 20 0a 20 20 20 20 20 20 20 20 7c 7c  RING .        ||
f810: 20 70 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d   pRight->eType==
f820: 46 54 53 35 5f 54 45 52 4d 20 0a 20 20 20 20 20  FTS5_TERM .     
f830: 20 20 20 7c 7c 20 70 52 69 67 68 74 2d 3e 65 54     || pRight->eT
f840: 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46 20 0a 20  ype==FTS5_EOF . 
f850: 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70     );..    if( p
f860: 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Left->eType==FTS
f870: 35 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 70  5_AND ){.      p
f880: 50 72 65 76 20 3d 20 70 4c 65 66 74 2d 3e 61 70  Prev = pLeft->ap
f890: 43 68 69 6c 64 5b 70 4c 65 66 74 2d 3e 6e 43 68  Child[pLeft->nCh
f8a0: 69 6c 64 2d 31 5d 3b 0a 20 20 20 20 7d 65 6c 73  ild-1];.    }els
f8b0: 65 7b 0a 20 20 20 20 20 20 70 50 72 65 76 20 3d  e{.      pPrev =
f8c0: 20 70 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20   pLeft;.    }.  
f8d0: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 2d    assert( pPrev-
f8e0: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52  >eType==FTS5_STR
f8f0: 49 4e 47 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  ING .        || 
f900: 70 50 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46 54  pPrev->eType==FT
f910: 53 35 5f 54 45 52 4d 20 0a 20 20 20 20 20 20 20  S5_TERM .       
f920: 20 7c 7c 20 70 50 72 65 76 2d 3e 65 54 79 70 65   || pPrev->eType
f930: 3d 3d 46 54 53 35 5f 45 4f 46 20 0a 20 20 20 20  ==FTS5_EOF .    
f940: 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20      );..    if( 
f950: 70 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46  pRight->eType==F
f960: 54 53 35 5f 45 4f 46 20 29 7b 0a 20 20 20 20 20  TS5_EOF ){.     
f970: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
f980: 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65  >apPhrase[pParse
f990: 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 3d 3d 70 52  ->nPhrase-1]==pR
f9a0: 69 67 68 74 2d 3e 70 4e 65 61 72 2d 3e 61 70 50  ight->pNear->apP
f9b0: 68 72 61 73 65 5b 30 5d 20 29 3b 0a 20 20 20 20  hrase[0] );.    
f9c0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
f9d0: 73 65 4e 6f 64 65 46 72 65 65 28 70 52 69 67 68  seNodeFree(pRigh
f9e0: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
f9f0: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 50   pLeft;.      pP
fa00: 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b  arse->nPhrase--;
fa10: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
fa20: 69 66 28 20 70 50 72 65 76 2d 3e 65 54 79 70 65  if( pPrev->eType
fa30: 3d 3d 46 54 53 35 5f 45 4f 46 20 29 7b 0a 20 20  ==FTS5_EOF ){.  
fa40: 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
fa50: 73 65 20 2a 2a 61 70 3b 0a 0a 20 20 20 20 20 20  se **ap;..      
fa60: 69 66 28 20 70 50 72 65 76 3d 3d 70 4c 65 66 74  if( pPrev==pLeft
fa70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74   ){.        pRet
fa80: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
fa90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
faa0: 70 4c 65 66 74 2d 3e 61 70 43 68 69 6c 64 5b 70  pLeft->apChild[p
fab0: 4c 65 66 74 2d 3e 6e 43 68 69 6c 64 2d 31 5d 20  Left->nChild-1] 
fac0: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
fad0: 20 20 70 52 65 74 20 3d 20 70 4c 65 66 74 3b 0a    pRet = pLeft;.
fae0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
faf0: 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 70 50  p = &pParse->apP
fb00: 68 72 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50  hrase[pParse->nP
fb10: 68 72 61 73 65 2d 31 2d 70 52 69 67 68 74 2d 3e  hrase-1-pRight->
fb20: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 5d 3b  pNear->nPhrase];
fb30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
fb40: 70 5b 30 5d 3d 3d 70 50 72 65 76 2d 3e 70 4e 65  p[0]==pPrev->pNe
fb50: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 20  ar->apPhrase[0] 
fb60: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  );.      memmove
fb70: 28 61 70 2c 20 26 61 70 5b 31 5d 2c 20 73 69 7a  (ap, &ap[1], siz
fb80: 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61  eof(Fts5ExprPhra
fb90: 73 65 2a 29 2a 70 52 69 67 68 74 2d 3e 70 4e 65  se*)*pRight->pNe
fba0: 61 72 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20 20  ar->nPhrase);.  
fbb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72      pParse->nPhr
fbc0: 61 73 65 2d 2d 3b 0a 0a 20 20 20 20 20 20 73 71  ase--;..      sq
fbd0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
fbe0: 64 65 46 72 65 65 28 70 50 72 65 76 29 3b 0a 20  deFree(pPrev);. 
fbf0: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20     }.    else{. 
fc00: 20 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69       pRet = sqli
fc10: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
fc20: 28 70 50 61 72 73 65 2c 20 46 54 53 35 5f 41 4e  (pParse, FTS5_AN
fc30: 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  D, pLeft, pRight
fc40: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
fc50: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
fc60: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
fc70: 66 74 73 35 45 78 70 72 54 65 72 6d 50 72 69 6e  fts5ExprTermPrin
fc80: 74 28 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a  t(Fts5ExprTerm *
fc90: 70 54 65 72 6d 29 7b 0a 20 20 69 6e 74 20 6e 42  pTerm){.  int nB
fca0: 79 74 65 20 3d 20 30 3b 0a 20 20 46 74 73 35 45  yte = 0;.  Fts5E
fcb0: 78 70 72 54 65 72 6d 20 2a 70 3b 0a 20 20 63 68  xprTerm *p;.  ch
fcc0: 61 72 20 2a 7a 51 75 6f 74 65 64 3b 0a 0a 20 20  ar *zQuoted;..  
fcd0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
fce0: 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
fcf0: 6f 66 20 73 70 61 63 65 20 72 65 71 75 69 72 65  of space require
fd00: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 54  d. */.  for(p=pT
fd10: 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
fd20: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 6e 42 79 74  nonym){.    nByt
fd30: 65 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  e += (int)strlen
fd40: 28 70 54 65 72 6d 2d 3e 7a 54 65 72 6d 29 20 2a  (pTerm->zTerm) *
fd50: 20 32 20 2b 20 33 20 2b 20 32 3b 0a 20 20 7d 0a   2 + 3 + 2;.  }.
fd60: 20 20 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c 69    zQuoted = sqli
fd70: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
fd80: 29 3b 0a 0a 20 20 69 66 28 20 7a 51 75 6f 74 65  );..  if( zQuote
fd90: 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  d ){.    int i =
fda0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 54   0;.    for(p=pT
fdb0: 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
fdc0: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20 63 68  nonym){.      ch
fdd0: 61 72 20 2a 7a 49 6e 20 3d 20 70 2d 3e 7a 54 65  ar *zIn = p->zTe
fde0: 72 6d 3b 0a 20 20 20 20 20 20 7a 51 75 6f 74 65  rm;.      zQuote
fdf0: 64 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  d[i++] = '"';.  
fe00: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 49 6e 20      while( *zIn 
fe10: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  ){.        if( *
fe20: 7a 49 6e 3d 3d 27 22 27 20 29 20 7a 51 75 6f 74  zIn=='"' ) zQuot
fe30: 65 64 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20  ed[i++] = '"';. 
fe40: 20 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69         zQuoted[i
fe50: 2b 2b 5d 20 3d 20 2a 7a 49 6e 2b 2b 3b 0a 20 20  ++] = *zIn++;.  
fe60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 51 75 6f      }.      zQuo
fe70: 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ted[i++] = '"';.
fe80: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 79        if( p->pSy
fe90: 6e 6f 6e 79 6d 20 29 20 7a 51 75 6f 74 65 64 5b  nonym ) zQuoted[
fea0: 69 2b 2b 5d 20 3d 20 27 7c 27 3b 0a 20 20 20 20  i++] = '|';.    
feb0: 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  }.    if( pTerm-
fec0: 3e 62 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20  >bPrefix ){.    
fed0: 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d    zQuoted[i++] =
fee0: 20 27 20 27 3b 0a 20 20 20 20 20 20 7a 51 75 6f   ' ';.      zQuo
fef0: 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 2a 27 3b 0a  ted[i++] = '*';.
ff00: 20 20 20 20 7d 0a 20 20 20 20 7a 51 75 6f 74 65      }.    zQuote
ff10: 64 5b 69 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  d[i++] = '\0';. 
ff20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 51 75 6f   }.  return zQuo
ff30: 74 65 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  ted;.}..static c
ff40: 68 61 72 20 2a 66 74 73 35 50 72 69 6e 74 66 41  har *fts5PrintfA
ff50: 70 70 65 6e 64 28 63 68 61 72 20 2a 7a 41 70 70  ppend(char *zApp
ff60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
ff70: 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72  mt, ...){.  char
ff80: 20 2a 7a 4e 65 77 3b 0a 20 20 76 61 5f 6c 69 73   *zNew;.  va_lis
ff90: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
ffa0: 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 4e  (ap, zFmt);.  zN
ffb0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  ew = sqlite3_vmp
ffc0: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
ffd0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
ffe0: 20 69 66 28 20 7a 41 70 70 20 26 26 20 7a 4e 65   if( zApp && zNe
fff0: 77 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  w ){.    char *z
10000 4e 65 77 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d  New2 = sqlite3_m
10010 70 72 69 6e 74 66 28 22 25 73 25 73 22 2c 20 7a  printf("%s%s", z
10020 41 70 70 2c 20 7a 4e 65 77 29 3b 0a 20 20 20 20  App, zNew);.    
10030 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
10040 77 29 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 7a  w);.    zNew = z
10050 4e 65 77 32 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  New2;.  }.  sqli
10060 74 65 33 5f 66 72 65 65 28 7a 41 70 70 29 3b 0a  te3_free(zApp);.
10070 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d    return zNew;.}
10080 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 6f 73 65 20  ../*.** Compose 
10090 61 20 74 63 6c 2d 72 65 61 64 61 62 6c 65 20 72  a tcl-readable r
100a0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
100b0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
100c0 72 2e 20 52 65 74 75 72 6e 20 61 20 0a 2a 2a 20  r. Return a .** 
100d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
100e0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
100f0 68 61 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  hat representati
10100 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  on. It is the .*
10110 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
10120 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
10130 6f 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  o at some point 
10140 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72 20  free the buffer 
10150 75 73 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65  using .** sqlite
10160 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
10170 74 69 63 20 63 68 61 72 20 2a 66 74 73 35 45 78  tic char *fts5Ex
10180 70 72 50 72 69 6e 74 54 63 6c 28 0a 20 20 46 74  prPrintTcl(.  Ft
10190 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
101a0 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g, .  const char
101b0 20 2a 7a 4e 65 61 72 73 65 74 43 6d 64 2c 0a 20   *zNearsetCmd,. 
101c0 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
101d0 45 78 70 72 0a 29 7b 0a 20 20 63 68 61 72 20 2a  Expr.){.  char *
101e0 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  zRet = 0;.  if( 
101f0 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
10200 53 35 5f 53 54 52 49 4e 47 20 7c 7c 20 70 45 78  S5_STRING || pEx
10210 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  pr->eType==FTS5_
10220 54 45 52 4d 20 29 7b 0a 20 20 20 20 46 74 73 35  TERM ){.    Fts5
10230 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65  ExprNearset *pNe
10240 61 72 20 3d 20 70 45 78 70 72 2d 3e 70 4e 65 61  ar = pExpr->pNea
10250 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20 0a 20  r;.    int i; . 
10260 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 0a 20     int iTerm;.. 
10270 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72     zRet = fts5Pr
10280 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c  intfAppend(zRet,
10290 20 22 25 73 20 22 2c 20 7a 4e 65 61 72 73 65 74   "%s ", zNearset
102a0 43 6d 64 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  Cmd);.    if( zR
102b0 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  et==0 ) return 0
102c0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d  ;.    if( pNear-
102d0 3e 70 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20  >pColset ){.    
102e0 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 70    int *aiCol = p
102f0 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 61  Near->pColset->a
10300 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  iCol;.      int 
10310 6e 43 6f 6c 20 3d 20 70 4e 65 61 72 2d 3e 70 43  nCol = pNear->pC
10320 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  olset->nCol;.   
10330 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 31 20 29     if( nCol==1 )
10340 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d  {.        zRet =
10350 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e   fts5PrintfAppen
10360 64 28 7a 52 65 74 2c 20 22 2d 63 6f 6c 20 25 64  d(zRet, "-col %d
10370 20 22 2c 20 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20   ", aiCol[0]);. 
10380 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10390 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50      zRet = fts5P
103a0 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74  rintfAppend(zRet
103b0 2c 20 22 2d 63 6f 6c 20 7b 25 64 22 2c 20 61 69  , "-col {%d", ai
103c0 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Col[0]);.       
103d0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 4e 65 61   for(i=1; i<pNea
103e0 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c  r->pColset->nCol
103f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
10400 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69    zRet = fts5Pri
10410 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20  ntfAppend(zRet, 
10420 22 20 25 64 22 2c 20 61 69 43 6f 6c 5b 69 5d 29  " %d", aiCol[i])
10430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10440 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50      zRet = fts5P
10450 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74  rintfAppend(zRet
10460 2c 20 22 7d 20 22 29 3b 0a 20 20 20 20 20 20 7d  , "} ");.      }
10470 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65 74 3d  .      if( zRet=
10480 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
10490 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4e     }..    if( pN
104a0 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20 29  ear->nPhrase>1 )
104b0 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66  {.      zRet = f
104c0 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
104d0 7a 52 65 74 2c 20 22 2d 6e 65 61 72 20 25 64 20  zRet, "-near %d 
104e0 22 2c 20 70 4e 65 61 72 2d 3e 6e 4e 65 61 72 29  ", pNear->nNear)
104f0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65 74  ;.      if( zRet
10500 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10510 20 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20      }..    zRet 
10520 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65  = fts5PrintfAppe
10530 6e 64 28 7a 52 65 74 2c 20 22 2d 2d 22 29 3b 0a  nd(zRet, "--");.
10540 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20      if( zRet==0 
10550 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
10560 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61   for(i=0; i<pNea
10570 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29  r->nPhrase; i++)
10580 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72  {.      Fts5Expr
10590 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
105a0 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  = pNear->apPhras
105b0 65 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 7a 52 65  e[i];..      zRe
105c0 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70  t = fts5PrintfAp
105d0 70 65 6e 64 28 7a 52 65 74 2c 20 22 20 7b 22 29  pend(zRet, " {")
105e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72  ;.      for(iTer
105f0 6d 3d 30 3b 20 7a 52 65 74 20 26 26 20 69 54 65  m=0; zRet && iTe
10600 72 6d 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72  rm<pPhrase->nTer
10610 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  m; iTerm++){.   
10620 20 20 20 20 20 63 68 61 72 20 2a 7a 54 65 72 6d       char *zTerm
10630 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72   = pPhrase->aTer
10640 6d 5b 69 54 65 72 6d 5d 2e 7a 54 65 72 6d 3b 0a  m[iTerm].zTerm;.
10650 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66          zRet = f
10660 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
10670 7a 52 65 74 2c 20 22 25 73 25 73 22 2c 20 69 54  zRet, "%s%s", iT
10680 65 72 6d 3d 3d 30 3f 22 22 3a 22 20 22 2c 20 7a  erm==0?"":" ", z
10690 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  Term);.        i
106a0 66 28 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72  f( pPhrase->aTer
106b0 6d 5b 69 54 65 72 6d 5d 2e 62 50 72 65 66 69 78  m[iTerm].bPrefix
106c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52   ){.          zR
106d0 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
106e0 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2a 22 29  ppend(zRet, "*")
106f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10700 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 7a    }..      if( z
10710 52 65 74 20 29 20 7a 52 65 74 20 3d 20 66 74 73  Ret ) zRet = fts
10720 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
10730 65 74 2c 20 22 7d 22 29 3b 0a 20 20 20 20 20 20  et, "}");.      
10740 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65  if( zRet==0 ) re
10750 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
10760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
10770 20 63 6f 6e 73 74 20 2a 7a 4f 70 20 3d 20 30 3b   const *zOp = 0;
10780 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10790 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 65  switch( pExpr->e
107a0 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
107b0 73 65 20 46 54 53 35 5f 41 4e 44 3a 20 7a 4f 70  se FTS5_AND: zOp
107c0 20 3d 20 22 41 4e 44 22 3b 20 62 72 65 61 6b 3b   = "AND"; break;
107d0 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53 35  .      case FTS5
107e0 5f 4e 4f 54 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54  _NOT: zOp = "NOT
107f0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
10800 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 20 20  default: .      
10810 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
10820 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4f 52 20  >eType==FTS5_OR 
10830 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 70 20 3d  );.        zOp =
10840 20 22 4f 52 22 3b 20 0a 20 20 20 20 20 20 20 20   "OR"; .        
10850 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
10860 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33    zRet = sqlite3
10870 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
10880 4f 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Op);.    for(i=0
10890 3b 20 7a 52 65 74 20 26 26 20 69 3c 70 45 78 70  ; zRet && i<pExp
108a0 72 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b  r->nChild; i++){
108b0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
108c0 20 66 74 73 35 45 78 70 72 50 72 69 6e 74 54 63   fts5ExprPrintTc
108d0 6c 28 70 43 6f 6e 66 69 67 2c 20 7a 4e 65 61 72  l(pConfig, zNear
108e0 73 65 74 43 6d 64 2c 20 70 45 78 70 72 2d 3e 61  setCmd, pExpr->a
108f0 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  pChild[i]);.    
10900 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20    if( !z ){.    
10910 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10920 28 7a 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  (zRet);.        
10930 7a 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  zRet = 0;.      
10940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
10950 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66  Ret = fts5Printf
10960 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 20 5b  Append(zRet, " [
10970 25 7a 5d 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  %z]", z);.      
10980 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
10990 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73  eturn zRet;.}..s
109a0 74 61 74 69 63 20 63 68 61 72 20 2a 66 74 73 35  tatic char *fts5
109b0 45 78 70 72 50 72 69 6e 74 28 46 74 73 35 43 6f  ExprPrint(Fts5Co
109c0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 46  nfig *pConfig, F
109d0 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 45 78  ts5ExprNode *pEx
109e0 70 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65  pr){.  char *zRe
109f0 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78  t = 0;.  if( pEx
10a00 70 72 2d 3e 65 54 79 70 65 3d 3d 30 20 29 7b 0a  pr->eType==0 ){.
10a10 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
10a20 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 5c 22  e3_mprintf("\"\"
10a30 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66  ");.  }else.  if
10a40 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d  ( pExpr->eType==
10a50 46 54 53 35 5f 53 54 52 49 4e 47 20 7c 7c 20 70  FTS5_STRING || p
10a60 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Expr->eType==FTS
10a70 35 5f 54 45 52 4d 20 29 7b 0a 20 20 20 20 46 74  5_TERM ){.    Ft
10a80 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70  s5ExprNearset *p
10a90 4e 65 61 72 20 3d 20 70 45 78 70 72 2d 3e 70 4e  Near = pExpr->pN
10aa0 65 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20  ear;.    int i; 
10ab0 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a  .    int iTerm;.
10ac0 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d 3e  .    if( pNear->
10ad0 70 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20 20  pColset ){.     
10ae0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 4e 65 61   int iCol = pNea
10af0 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  r->pColset->aiCo
10b00 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 7a 52 65 74  l[0];.      zRet
10b10 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
10b20 65 6e 64 28 7a 52 65 74 2c 20 22 25 73 20 3a 20  end(zRet, "%s : 
10b30 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f  ", pConfig->azCo
10b40 6c 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20  l[iCol]);.      
10b50 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65  if( zRet==0 ) re
10b60 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
10b70 20 20 20 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50     if( pNear->nP
10b80 68 72 61 73 65 3e 31 20 29 7b 0a 20 20 20 20 20  hrase>1 ){.     
10b90 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e   zRet = fts5Prin
10ba0 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22  tfAppend(zRet, "
10bb0 4e 45 41 52 28 22 29 3b 0a 20 20 20 20 20 20 69  NEAR(");.      i
10bc0 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65 74  f( zRet==0 ) ret
10bd0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
10be0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65    for(i=0; i<pNe
10bf0 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b  ar->nPhrase; i++
10c00 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  ){.      Fts5Exp
10c10 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
10c20 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
10c30 73 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  se[i];.      if(
10c40 20 69 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i!=0 ){.       
10c50 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e   zRet = fts5Prin
10c60 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22  tfAppend(zRet, "
10c70 20 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   ");.        if(
10c80 20 7a 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72   zRet==0 ) retur
10c90 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
10ca0 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20     for(iTerm=0; 
10cb0 69 54 65 72 6d 3c 70 50 68 72 61 73 65 2d 3e 6e  iTerm<pPhrase->n
10cc0 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a  Term; iTerm++){.
10cd0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
10ce0 65 72 6d 20 3d 20 66 74 73 35 45 78 70 72 54 65  erm = fts5ExprTe
10cf0 72 6d 50 72 69 6e 74 28 26 70 50 68 72 61 73 65  rmPrint(&pPhrase
10d00 2d 3e 61 54 65 72 6d 5b 69 54 65 72 6d 5d 29 3b  ->aTerm[iTerm]);
10d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 65  .        if( zTe
10d20 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rm ){.          
10d30 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74  zRet = fts5Print
10d40 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 25  fAppend(zRet, "%
10d50 73 25 73 22 2c 20 69 54 65 72 6d 3d 3d 30 3f 22  s%s", iTerm==0?"
10d60 22 3a 22 20 2b 20 22 2c 20 7a 54 65 72 6d 29 3b  ":" + ", zTerm);
10d70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10d80 65 33 5f 66 72 65 65 28 7a 54 65 72 6d 29 3b 0a  e3_free(zTerm);.
10d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10da0 20 20 69 66 28 20 7a 54 65 72 6d 3d 3d 30 20 7c    if( zTerm==0 |
10db0 7c 20 7a 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  | zRet==0 ){.   
10dc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
10dd0 72 65 65 28 7a 52 65 74 29 3b 0a 20 20 20 20 20  ree(zRet);.     
10de0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10e00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
10e10 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e 31  pNear->nPhrase>1
10e20 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d   ){.      zRet =
10e30 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e   fts5PrintfAppen
10e40 64 28 7a 52 65 74 2c 20 22 2c 20 25 64 29 22 2c  d(zRet, ", %d)",
10e50 20 70 4e 65 61 72 2d 3e 6e 4e 65 61 72 29 3b 0a   pNear->nNear);.
10e60 20 20 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d        if( zRet==
10e70 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10e80 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
10e90 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
10ea0 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
10eb0 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ;..    switch( p
10ec0 45 78 70 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20  Expr->eType ){. 
10ed0 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41       case FTS5_A
10ee0 4e 44 3a 20 7a 4f 70 20 3d 20 22 20 41 4e 44 20  ND: zOp = " AND 
10ef0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
10f00 63 61 73 65 20 46 54 53 35 5f 4e 4f 54 3a 20 7a  case FTS5_NOT: z
10f10 4f 70 20 3d 20 22 20 4e 4f 54 20 22 3b 20 62 72  Op = " NOT "; br
10f20 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
10f30 6c 74 3a 20 20 0a 20 20 20 20 20 20 20 20 61 73  lt:  .        as
10f40 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65 54 79  sert( pExpr->eTy
10f50 70 65 3d 3d 46 54 53 35 5f 4f 52 20 29 3b 0a 20  pe==FTS5_OR );. 
10f60 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 20 4f         zOp = " O
10f70 52 20 22 3b 20 0a 20 20 20 20 20 20 20 20 62 72  R "; .        br
10f80 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
10f90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72  for(i=0; i<pExpr
10fa0 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a  ->nChild; i++){.
10fb0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
10fc0 66 74 73 35 45 78 70 72 50 72 69 6e 74 28 70 43  fts5ExprPrint(pC
10fd0 6f 6e 66 69 67 2c 20 70 45 78 70 72 2d 3e 61 70  onfig, pExpr->ap
10fe0 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 20  Child[i]);.     
10ff0 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
11000 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11010 65 28 7a 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(zRet);.       
11020 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   zRet = 0;.     
11030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11040 69 6e 74 20 65 20 3d 20 70 45 78 70 72 2d 3e 61  int e = pExpr->a
11050 70 43 68 69 6c 64 5b 69 5d 2d 3e 65 54 79 70 65  pChild[i]->eType
11060 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 20  ;.        int b 
11070 3d 20 28 65 21 3d 46 54 53 35 5f 53 54 52 49 4e  = (e!=FTS5_STRIN
11080 47 20 26 26 20 65 21 3d 46 54 53 35 5f 54 45 52  G && e!=FTS5_TER
11090 4d 20 26 26 20 65 21 3d 46 54 53 35 5f 45 4f 46  M && e!=FTS5_EOF
110a0 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20  );.        zRet 
110b0 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65  = fts5PrintfAppe
110c0 6e 64 28 7a 52 65 74 2c 20 22 25 73 25 73 25 7a  nd(zRet, "%s%s%z
110d0 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
110e0 20 20 28 69 3d 3d 30 20 3f 20 22 22 20 3a 20 7a    (i==0 ? "" : z
110f0 4f 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Op),.           
11100 20 28 62 3f 22 28 22 3a 22 22 29 2c 20 7a 2c 20   (b?"(":""), z, 
11110 28 62 3f 22 29 22 3a 22 22 29 0a 20 20 20 20 20  (b?")":"").     
11120 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
11130 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20      if( zRet==0 
11140 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
11150 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65   }..  return zRe
11160 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
11170 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
11180 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
11190 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
111a0 66 74 73 35 5f 65 78 70 72 28 29 20 28 62 54 63  fts5_expr() (bTc
111b0 6c 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 74 73  l==0).** and fts
111c0 35 5f 65 78 70 72 5f 74 63 6c 28 29 20 28 62 54  5_expr_tcl() (bT
111d0 63 6c 21 3d 30 29 2e 0a 2a 2f 0a 73 74 61 74 69  cl!=0)..*/.stati
111e0 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 46  c void fts5ExprF
111f0 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
11200 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
11210 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
11220 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
11230 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
11240 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
11250 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11260 65 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20 20  er of args */.  
11270 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
11280 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20  apVal,          
11290 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75  /* Function argu
112a0 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62  ments */.  int b
112b0 54 63 6c 0a 29 7b 0a 20 20 46 74 73 35 47 6c 6f  Tcl.){.  Fts5Glo
112c0 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 20 3d 20 28  bal *pGlobal = (
112d0 46 74 73 35 47 6c 6f 62 61 6c 2a 29 73 71 6c 69  Fts5Global*)sqli
112e0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
112f0 74 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tx);.  sqlite3 *
11300 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
11310 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70  text_db_handle(p
11320 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Ctx);.  const ch
11330 61 72 20 2a 7a 45 78 70 72 20 3d 20 30 3b 0a 20  ar *zExpr = 0;. 
11340 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
11350 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78  .  Fts5Expr *pEx
11360 70 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  pr = 0;.  int rc
11370 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 63 6f  ;.  int i;..  co
11380 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6e  nst char **azCon
11390 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  fig;          /*
113a0 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
113b0 6e 74 73 20 66 6f 72 20 46 74 73 35 43 6f 6e 66  nts for Fts5Conf
113c0 69 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ig */.  const ch
113d0 61 72 20 2a 7a 4e 65 61 72 73 65 74 43 6d 64 20  ar *zNearsetCmd 
113e0 3d 20 22 6e 65 61 72 73 65 74 22 3b 0a 20 20 69  = "nearset";.  i
113f0 6e 74 20 6e 43 6f 6e 66 69 67 3b 20 20 20 20 20  nt nConfig;     
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11410 2a 20 53 69 7a 65 20 6f 66 20 61 7a 43 6f 6e 66  * Size of azConf
11420 69 67 5b 5d 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ig[] */.  Fts5Co
11430 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
11440 30 3b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  0;.  int iArg = 
11450 31 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 31  1;..  if( nArg<1
11460 20 29 7b 0a 20 20 20 20 7a 45 72 72 20 3d 20 73   ){.    zErr = s
11470 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
11480 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
11490 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
114a0 63 74 69 6f 6e 20 25 73 22 2c 0a 20 20 20 20 20  ction %s",.     
114b0 20 20 20 62 54 63 6c 20 3f 20 22 66 74 73 35 5f     bTcl ? "fts5_
114c0 65 78 70 72 5f 74 63 6c 22 20 3a 20 22 66 74 73  expr_tcl" : "fts
114d0 35 5f 65 78 70 72 22 0a 20 20 20 20 29 3b 0a 20  5_expr".    );. 
114e0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
114f0 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 45  t_error(pCtx, zE
11500 72 72 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c  rr, -1);.    sql
11510 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
11520 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11530 0a 0a 20 20 69 66 28 20 62 54 63 6c 20 26 26 20  ..  if( bTcl && 
11540 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 7a 4e  nArg>1 ){.    zN
11550 65 61 72 73 65 74 43 6d 64 20 3d 20 28 63 6f 6e  earsetCmd = (con
11560 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
11570 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
11580 6c 5b 31 5d 29 3b 0a 20 20 20 20 69 41 72 67 20  l[1]);.    iArg 
11590 3d 20 32 3b 0a 20 20 7d 0a 0a 20 20 6e 43 6f 6e  = 2;.  }..  nCon
115a0 66 69 67 20 3d 20 33 20 2b 20 28 6e 41 72 67 2d  fig = 3 + (nArg-
115b0 69 41 72 67 29 3b 0a 20 20 61 7a 43 6f 6e 66 69  iArg);.  azConfi
115c0 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
115d0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
115e0 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a  (sizeof(char*) *
115f0 20 6e 43 6f 6e 66 69 67 29 3b 0a 20 20 69 66 28   nConfig);.  if(
11600 20 61 7a 43 6f 6e 66 69 67 3d 3d 30 20 29 7b 0a   azConfig==0 ){.
11610 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
11620 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
11630 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ctx);.    return
11640 3b 0a 20 20 7d 0a 20 20 61 7a 43 6f 6e 66 69 67  ;.  }.  azConfig
11650 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6e  [0] = 0;.  azCon
11660 66 69 67 5b 31 5d 20 3d 20 22 6d 61 69 6e 22 3b  fig[1] = "main";
11670 0a 20 20 61 7a 43 6f 6e 66 69 67 5b 32 5d 20 3d  .  azConfig[2] =
11680 20 22 74 62 6c 22 3b 0a 20 20 66 6f 72 28 69 3d   "tbl";.  for(i=
11690 33 3b 20 69 41 72 67 3c 6e 41 72 67 3b 20 69 41  3; iArg<nArg; iA
116a0 72 67 2b 2b 29 7b 0a 20 20 20 20 61 7a 43 6f 6e  rg++){.    azCon
116b0 66 69 67 5b 69 2b 2b 5d 20 3d 20 28 63 6f 6e 73  fig[i++] = (cons
116c0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
116d0 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
116e0 5b 69 41 72 67 5d 29 3b 0a 20 20 7d 0a 0a 20 20  [iArg]);.  }..  
116f0 7a 45 78 70 72 20 3d 20 28 63 6f 6e 73 74 20 63  zExpr = (const c
11700 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
11710 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
11720 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
11730 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73  e3Fts5ConfigPars
11740 65 28 70 47 6c 6f 62 61 6c 2c 20 64 62 2c 20 6e  e(pGlobal, db, n
11750 43 6f 6e 66 69 67 2c 20 61 7a 43 6f 6e 66 69 67  Config, azConfig
11760 2c 20 26 70 43 6f 6e 66 69 67 2c 20 26 7a 45 72  , &pConfig, &zEr
11770 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
11780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
11790 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  c = sqlite3Fts5E
117a0 78 70 72 4e 65 77 28 70 43 6f 6e 66 69 67 2c 20  xprNew(pConfig, 
117b0 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 2c 20 7a  pConfig->nCol, z
117c0 45 78 70 72 2c 20 26 70 45 78 70 72 2c 20 26 7a  Expr, &pExpr, &z
117d0 45 72 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Err);.  }.  if( 
117e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
117f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 78 74  .    char *zText
11800 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
11810 3e 70 52 6f 6f 74 2d 3e 78 4e 65 78 74 3d 3d 30  >pRoot->xNext==0
11820 20 29 7b 0a 20 20 20 20 20 20 7a 54 65 78 74 20   ){.      zText 
11830 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
11840 66 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  f("");.    }else
11850 20 69 66 28 20 62 54 63 6c 20 29 7b 0a 20 20 20   if( bTcl ){.   
11860 20 20 20 7a 54 65 78 74 20 3d 20 66 74 73 35 45     zText = fts5E
11870 78 70 72 50 72 69 6e 74 54 63 6c 28 70 43 6f 6e  xprPrintTcl(pCon
11880 66 69 67 2c 20 7a 4e 65 61 72 73 65 74 43 6d 64  fig, zNearsetCmd
11890 2c 20 70 45 78 70 72 2d 3e 70 52 6f 6f 74 29 3b  , pExpr->pRoot);
118a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
118b0 20 20 7a 54 65 78 74 20 3d 20 66 74 73 35 45 78    zText = fts5Ex
118c0 70 72 50 72 69 6e 74 28 70 43 6f 6e 66 69 67 2c  prPrint(pConfig,
118d0 20 70 45 78 70 72 2d 3e 70 52 6f 6f 74 29 3b 0a   pExpr->pRoot);.
118e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 54      }.    if( zT
118f0 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ext==0 ){.      
11900 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11910 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
11920 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
11930 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 54  lt_text(pCtx, zT
11940 65 78 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ext, -1, SQLITE_
11950 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
11960 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11970 54 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Text);.    }.  }
11980 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
11990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
119a0 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73   zErr ){.      s
119b0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
119c0 72 6f 72 28 70 43 74 78 2c 20 7a 45 72 72 2c 20  ror(pCtx, zErr, 
119d0 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
119e0 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
119f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11a00 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
11a10 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20  rror_code(pCtx, 
11a20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
11a30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
11a40 6f 69 64 20 2a 29 61 7a 43 6f 6e 66 69 67 29 3b  oid *)azConfig);
11a50 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f  .  sqlite3Fts5Co
11a60 6e 66 69 67 46 72 65 65 28 70 43 6f 6e 66 69 67  nfigFree(pConfig
11a70 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  );.  sqlite3Fts5
11a80 45 78 70 72 46 72 65 65 28 70 45 78 70 72 29 3b  ExprFree(pExpr);
11a90 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
11aa0 66 74 73 35 45 78 70 72 46 75 6e 63 74 69 6f 6e  fts5ExprFunction
11ab0 48 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  Hr(.  sqlite3_co
11ac0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
11ad0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
11ae0 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
11af0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11b20 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74   args */.  sqlit
11b30 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
11b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
11b50 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
11b60 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 45 78 70   */.){.  fts5Exp
11b70 72 46 75 6e 63 74 69 6f 6e 28 70 43 74 78 2c 20  rFunction(pCtx, 
11b80 6e 41 72 67 2c 20 61 70 56 61 6c 2c 20 30 29 3b  nArg, apVal, 0);
11b90 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
11ba0 74 73 35 45 78 70 72 46 75 6e 63 74 69 6f 6e 54  ts5ExprFunctionT
11bb0 63 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  cl(.  sqlite3_co
11bc0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
11bd0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
11be0 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
11bf0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11c20 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74   args */.  sqlit
11c30 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
11c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
11c50 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
11c60 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 45 78 70   */.){.  fts5Exp
11c70 72 46 75 6e 63 74 69 6f 6e 28 70 43 74 78 2c 20  rFunction(pCtx, 
11c80 6e 41 72 67 2c 20 61 70 56 61 6c 2c 20 31 29 3b  nArg, apVal, 1);
11c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  .}../*.** The im
11ca0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
11cb0 61 6e 20 53 51 4c 69 74 65 20 75 73 65 72 2d 64  an SQLite user-d
11cc0 65 66 69 6e 65 64 2d 66 75 6e 63 74 69 6f 6e 20  efined-function 
11cd0 74 68 61 74 20 61 63 63 65 70 74 73 20 61 0a 2a  that accepts a.*
11ce0 2a 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  * single integer
11cf0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
11d00 20 49 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   If the integer 
11d10 69 73 20 61 6e 20 61 6c 70 68 61 2d 6e 75 6d 65  is an alpha-nume
11d20 72 69 63 20 0a 2a 2a 20 75 6e 69 63 6f 64 65 20  ric .** unicode 
11d30 63 6f 64 65 20 70 6f 69 6e 74 2c 20 31 20 69 73  code point, 1 is
11d40 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
11d50 77 69 73 65 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  wise 0..*/.stati
11d60 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 49  c void fts5ExprI
11d70 73 41 6c 6e 75 6d 28 0a 20 20 73 71 6c 69 74 65  sAlnum(.  sqlite
11d80 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
11d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
11da0 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
11db0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
11dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11de0 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20 20 73  r of args */.  s
11df0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
11e00 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
11e10 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
11e20 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
11e30 20 69 43 6f 64 65 3b 0a 20 20 69 66 28 20 6e 41   iCode;.  if( nA
11e40 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  rg!=1 ){.    sql
11e50 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
11e60 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
11e70 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
11e80 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
11e90 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 69 73 61  unction fts5_isa
11ea0 6c 6e 75 6d 22 2c 20 2d 31 0a 20 20 20 20 29 3b  lnum", -1.    );
11eb0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11ec0 0a 20 20 69 43 6f 64 65 20 3d 20 73 71 6c 69 74  .  iCode = sqlit
11ed0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
11ee0 61 6c 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65  al[0]);.  sqlite
11ef0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74  3_result_int(pCt
11f00 78 2c 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e  x, sqlite3Fts5Un
11f10 69 63 6f 64 65 49 73 61 6c 6e 75 6d 28 69 43 6f  icodeIsalnum(iCo
11f20 64 65 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  de));.}..static 
11f30 76 6f 69 64 20 66 74 73 35 45 78 70 72 46 6f 6c  void fts5ExprFol
11f40 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  d(.  sqlite3_con
11f50 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
11f60 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
11f70 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f   call context */
11f80 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11fb0 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  args */.  sqlite
11fc0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
11fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
11fe0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
11ff0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 41 72 67  */.){.  if( nArg
12000 21 3d 31 20 26 26 20 6e 41 72 67 21 3d 32 20 29  !=1 && nArg!=2 )
12010 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
12020 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
12030 20 0a 20 20 20 20 20 20 20 20 22 77 72 6f 6e 67   .        "wrong
12040 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
12050 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
12060 20 66 74 73 35 5f 66 6f 6c 64 22 2c 20 2d 31 0a   fts5_fold", -1.
12070 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
12080 20 20 20 20 69 6e 74 20 69 43 6f 64 65 3b 0a 20      int iCode;. 
12090 20 20 20 69 6e 74 20 62 52 65 6d 6f 76 65 44 69     int bRemoveDi
120a0 61 63 72 69 74 69 63 73 20 3d 20 30 3b 0a 20 20  acritics = 0;.  
120b0 20 20 69 43 6f 64 65 20 3d 20 73 71 6c 69 74 65    iCode = sqlite
120c0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
120d0 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  l[0]);.    if( n
120e0 41 72 67 3d 3d 32 20 29 20 62 52 65 6d 6f 76 65  Arg==2 ) bRemove
120f0 44 69 61 63 72 69 74 69 63 73 20 3d 20 73 71 6c  Diacritics = sql
12100 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
12110 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 73 71  pVal[1]);.    sq
12120 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
12130 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 46 74  (pCtx, sqlite3Ft
12140 73 35 55 6e 69 63 6f 64 65 46 6f 6c 64 28 69 43  s5UnicodeFold(iC
12150 6f 64 65 2c 20 62 52 65 6d 6f 76 65 44 69 61 63  ode, bRemoveDiac
12160 72 69 74 69 63 73 29 29 3b 0a 20 20 7d 0a 7d 0a  ritics));.  }.}.
12170 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
12180 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 69 6e 69  alled during ini
12190 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 20 72  tialization to r
121a0 65 67 69 73 74 65 72 20 74 68 65 20 66 74 73 35  egister the fts5
121b0 5f 65 78 70 72 28 29 20 73 63 61 6c 61 72 0a 2a  _expr() scalar.*
121c0 2a 20 55 44 46 20 77 69 74 68 20 74 68 65 20 53  * UDF with the S
121d0 51 4c 69 74 65 20 68 61 6e 64 6c 65 20 70 61 73  QLite handle pas
121e0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
121f0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
12200 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
12210 49 6e 69 74 28 46 74 73 35 47 6c 6f 62 61 6c 20  Init(Fts5Global 
12220 2a 70 47 6c 6f 62 61 6c 2c 20 73 71 6c 69 74 65  *pGlobal, sqlite
12230 33 20 2a 64 62 29 7b 0a 20 20 73 74 72 75 63 74  3 *db){.  struct
12240 20 46 74 73 35 45 78 70 72 46 75 6e 63 20 7b 0a   Fts5ExprFunc {.
12250 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12260 7a 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a 78 29  z;.    void (*x)
12270 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
12280 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
12290 6c 75 65 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e  lue**);.  } aFun
122a0 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 66  c[] = {.    { "f
122b0 74 73 35 5f 65 78 70 72 22 2c 20 20 20 20 20 66  ts5_expr",     f
122c0 74 73 35 45 78 70 72 46 75 6e 63 74 69 6f 6e 48  ts5ExprFunctionH
122d0 72 20 7d 2c 0a 20 20 20 20 7b 20 22 66 74 73 35  r },.    { "fts5
122e0 5f 65 78 70 72 5f 74 63 6c 22 2c 20 66 74 73 35  _expr_tcl", fts5
122f0 45 78 70 72 46 75 6e 63 74 69 6f 6e 54 63 6c 20  ExprFunctionTcl 
12300 7d 2c 0a 20 20 20 20 7b 20 22 66 74 73 35 5f 69  },.    { "fts5_i
12310 73 61 6c 6e 75 6d 22 2c 20 20 66 74 73 35 45 78  salnum",  fts5Ex
12320 70 72 49 73 41 6c 6e 75 6d 20 7d 2c 0a 20 20 20  prIsAlnum },.   
12330 20 7b 20 22 66 74 73 35 5f 66 6f 6c 64 22 2c 20   { "fts5_fold", 
12340 20 20 20 20 66 74 73 35 45 78 70 72 46 6f 6c 64      fts5ExprFold
12350 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
12360 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12370 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a  ITE_OK;.  void *
12380 70 43 74 78 20 3d 20 28 76 6f 69 64 2a 29 70 47  pCtx = (void*)pG
12390 6c 6f 62 61 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  lobal;..  for(i=
123a0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
123b0 20 26 26 20 69 3c 41 72 72 61 79 53 69 7a 65 28   && i<ArraySize(
123c0 61 46 75 6e 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  aFunc); i++){.  
123d0 20 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70    struct Fts5Exp
123e0 72 46 75 6e 63 20 2a 70 20 3d 20 26 61 46 75 6e  rFunc *p = &aFun
123f0 63 5b 69 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73  c[i];.    rc = s
12400 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12410 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 7a 2c  nction(db, p->z,
12420 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
12430 2c 20 70 43 74 78 2c 20 70 2d 3e 78 2c 20 30 2c  , pCtx, p->x, 0,
12440 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41   0);.  }..  /* A
12450 76 6f 69 64 20 61 20 77 61 72 6e 69 6e 67 20 69  void a warning i
12460 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 73  ndicating that s
12470 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
12480 54 72 61 63 65 28 29 20 69 73 20 75 6e 75 73 65  Trace() is unuse
12490 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  d */.#ifndef NDE
124a0 42 55 47 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  BUG.  (void)sqli
124b0 74 65 33 46 74 73 35 50 61 72 73 65 72 54 72 61  te3Fts5ParserTra
124c0 63 65 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  ce;.#endif..  re
124d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
124e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
124f0 62 65 72 20 6f 66 20 70 68 72 61 73 65 73 20 69  ber of phrases i
12500 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
12510 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pr..*/.int sqlit
12520 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65  e3Fts5ExprPhrase
12530 43 6f 75 6e 74 28 46 74 73 35 45 78 70 72 20 2a  Count(Fts5Expr *
12540 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e  pExpr){.  return
12550 20 28 70 45 78 70 72 20 3f 20 70 45 78 70 72 2d   (pExpr ? pExpr-
12560 3e 6e 50 68 72 61 73 65 20 3a 20 30 29 3b 0a 7d  >nPhrase : 0);.}
12570 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
12580 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  he number of ter
12590 6d 73 20 69 6e 20 74 68 65 20 69 50 68 72 61 73  ms in the iPhras
125a0 65 27 74 68 20 70 68 72 61 73 65 20 69 6e 20 70  e'th phrase in p
125b0 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  Expr..*/.int sql
125c0 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61  ite3Fts5ExprPhra
125d0 73 65 53 69 7a 65 28 46 74 73 35 45 78 70 72 20  seSize(Fts5Expr 
125e0 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 50 68 72  *pExpr, int iPhr
125f0 61 73 65 29 7b 0a 20 20 69 66 28 20 69 50 68 72  ase){.  if( iPhr
12600 61 73 65 3c 30 20 7c 7c 20 69 50 68 72 61 73 65  ase<0 || iPhrase
12610 3e 3d 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65  >=pExpr->nPhrase
12620 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
12630 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 70 45  eturn pExpr->apE
12640 78 70 72 50 68 72 61 73 65 5b 69 50 68 72 61 73  xprPhrase[iPhras
12650 65 5d 2d 3e 6e 54 65 72 6d 3b 0a 7d 0a 0a 2f 2a  e]->nTerm;.}../*
12660 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12670 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 63 63  n is used to acc
12680 65 73 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ess the current 
12690 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f  position list fo
126a0 72 20 70 68 72 61 73 65 0a 2a 2a 20 69 50 68 72  r phrase.** iPhr
126b0 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
126c0 74 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69  te3Fts5ExprPosli
126d0 73 74 28 46 74 73 35 45 78 70 72 20 2a 70 45 78  st(Fts5Expr *pEx
126e0 70 72 2c 20 69 6e 74 20 69 50 68 72 61 73 65 2c  pr, int iPhrase,
126f0 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 29 7b   const u8 **pa){
12700 0a 20 20 69 6e 74 20 6e 52 65 74 3b 0a 20 20 46  .  int nRet;.  F
12710 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
12720 50 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e  Phrase = pExpr->
12730 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 50 68  apExprPhrase[iPh
12740 72 61 73 65 5d 3b 0a 20 20 46 74 73 35 45 78 70  rase];.  Fts5Exp
12750 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 70  rNode *pNode = p
12760 50 68 72 61 73 65 2d 3e 70 4e 6f 64 65 3b 0a 20  Phrase->pNode;. 
12770 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66   if( pNode->bEof
12780 3d 3d 30 20 26 26 20 70 4e 6f 64 65 2d 3e 69 52  ==0 && pNode->iR
12790 6f 77 69 64 3d 3d 70 45 78 70 72 2d 3e 70 52 6f  owid==pExpr->pRo
127a0 6f 74 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  ot->iRowid ){.  
127b0 20 20 2a 70 61 20 3d 20 70 50 68 72 61 73 65 2d    *pa = pPhrase-
127c0 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20  >poslist.p;.    
127d0 6e 52 65 74 20 3d 20 70 50 68 72 61 73 65 2d 3e  nRet = pPhrase->
127e0 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 65 6c  poslist.n;.  }el
127f0 73 65 7b 0a 20 20 20 20 2a 70 61 20 3d 20 30 3b  se{.    *pa = 0;
12800 0a 20 20 20 20 6e 52 65 74 20 3d 20 30 3b 0a 20  .    nRet = 0;. 
12810 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74   }.  return nRet
12820 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 46 74 73 35  ;.}..struct Fts5
12830 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72  PoslistPopulator
12840 20 7b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74   {.  Fts5Poslist
12850 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20  Writer writer;. 
12860 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20   int bOk;       
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12880 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6b 20 74   /* True if ok t
12890 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20  o populate */.  
128a0 69 6e 74 20 62 4d 69 73 73 3b 0a 7d 3b 0a 0a 46  int bMiss;.};..F
128b0 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61  ts5PoslistPopula
128c0 74 6f 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35  tor *sqlite3Fts5
128d0 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73 74  ExprClearPoslist
128e0 73 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70  s(Fts5Expr *pExp
128f0 72 2c 20 69 6e 74 20 62 4c 69 76 65 29 7b 0a 20  r, int bLive){. 
12900 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75   Fts5PoslistPopu
12910 6c 61 74 6f 72 20 2a 70 52 65 74 3b 0a 20 20 70  lator *pRet;.  p
12920 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ret = sqlite3_ma
12930 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 35  lloc(sizeof(Fts5
12940 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72  PoslistPopulator
12950 29 2a 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65  )*pExpr->nPhrase
12960 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
12970 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12980 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20  memset(pRet, 0, 
12990 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69  sizeof(Fts5Posli
129a0 73 74 50 6f 70 75 6c 61 74 6f 72 29 2a 70 45 78  stPopulator)*pEx
129b0 70 72 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20 20  pr->nPhrase);.  
129c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78    for(i=0; i<pEx
129d0 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b  pr->nPhrase; i++
129e0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 42 75 66  ){.      Fts5Buf
129f0 66 65 72 20 2a 70 42 75 66 20 3d 20 26 70 45 78  fer *pBuf = &pEx
12a00 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  pr->apExprPhrase
12a10 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74 3b 0a 20 20  [i]->poslist;.  
12a20 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65      Fts5ExprNode
12a30 20 2a 70 4e 6f 64 65 20 3d 20 70 45 78 70 72 2d   *pNode = pExpr-
12a40 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d  >apExprPhrase[i]
12a50 2d 3e 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20 61  ->pNode;.      a
12a60 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 70  ssert( pExpr->ap
12a70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e 6e  ExprPhrase[i]->n
12a80 54 65 72 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Term==1 );.     
12a90 20 69 66 28 20 62 4c 69 76 65 20 26 26 20 0a 20   if( bLive && . 
12aa0 20 20 20 20 20 20 20 20 20 28 70 42 75 66 2d 3e           (pBuf->
12ab0 6e 3d 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69  n==0 || pNode->i
12ac0 52 6f 77 69 64 21 3d 70 45 78 70 72 2d 3e 70 52  Rowid!=pExpr->pR
12ad0 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 7c 7c 20 70  oot->iRowid || p
12ae0 4e 6f 64 65 2d 3e 62 45 6f 66 29 0a 20 20 20 20  Node->bEof).    
12af0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65    ){.        pRe
12b00 74 5b 69 5d 2e 62 4d 69 73 73 20 3d 20 31 3b 0a  t[i].bMiss = 1;.
12b10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12b20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 30       pBuf->n = 0
12b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12b40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
12b50 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 46 74 73  t;.}..struct Fts
12b60 35 45 78 70 72 43 74 78 20 7b 0a 20 20 46 74 73  5ExprCtx {.  Fts
12b70 35 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20  5Expr *pExpr;.  
12b80 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
12b90 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f 72  ator *aPopulator
12ba0 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a 7d 3b  ;.  i64 iOff;.};
12bb0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
12bc0 46 74 73 35 45 78 70 72 43 74 78 20 46 74 73 35  Fts5ExprCtx Fts5
12bd0 45 78 70 72 43 74 78 3b 0a 0a 2f 2a 0a 2a 2a 20  ExprCtx;../*.** 
12be0 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20  TODO: Make this 
12bf0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a  more efficient!.
12c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
12c10 73 35 45 78 70 72 43 6f 6c 73 65 74 54 65 73 74  s5ExprColsetTest
12c20 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f  (Fts5Colset *pCo
12c30 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  lset, int iCol){
12c40 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
12c50 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e  i=0; i<pColset->
12c60 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
12c70 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43  if( pColset->aiC
12c80 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65  ol[i]==iCol ) re
12c90 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
12ca0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
12cb0 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 50 6f  c int fts5ExprPo
12cc0 70 75 6c 61 74 65 50 6f 73 6c 69 73 74 73 43 62  pulatePoslistsCb
12cd0 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12cf0 2a 20 43 6f 70 79 20 6f 66 20 32 6e 64 20 61 72  * Copy of 2nd ar
12d00 67 75 6d 65 6e 74 20 74 6f 20 78 54 6f 6b 65 6e  gument to xToken
12d10 69 7a 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 74  ize() */.  int t
12d20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12d30 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
12d40 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66 6c   FTS5_TOKEN_* fl
12d50 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
12d60 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  har *pToken,    
12d70 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
12d80 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
12d90 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69  ing token */.  i
12da0 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
12db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
12dc0 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79  e of token in by
12dd0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e  tes */.  int iUn
12de0 75 73 65 64 31 2c 20 20 20 20 20 20 20 20 20 20  used1,          
12df0 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
12e00 65 74 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68  et of token with
12e10 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20 2a 2f  in input text */
12e20 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64 32 20  .  int iUnused2 
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e40 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20   Byte offset of 
12e50 65 6e 64 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  end of token wit
12e60 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20 2a  hin input text *
12e70 2f 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72 43  /.){.  Fts5ExprC
12e80 74 78 20 2a 70 20 3d 20 28 46 74 73 35 45 78 70  tx *p = (Fts5Exp
12e90 72 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 46 74  rCtx*)pCtx;.  Ft
12ea0 73 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20  s5Expr *pExpr = 
12eb0 70 2d 3e 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  p->pExpr;.  int 
12ec0 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
12ed0 41 4d 32 28 69 55 6e 75 73 65 64 31 2c 20 69 55  AM2(iUnused1, iU
12ee0 6e 75 73 65 64 32 29 3b 0a 0a 20 20 69 66 28 20  nused2);..  if( 
12ef0 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58 5f  nToken>FTS5_MAX_
12f00 54 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54 6f  TOKEN_SIZE ) nTo
12f10 6b 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f 54  ken = FTS5_MAX_T
12f20 4f 4b 45 4e 5f 53 49 5a 45 3b 0a 20 20 69 66 28  OKEN_SIZE;.  if(
12f30 20 28 74 66 6c 61 67 73 20 26 20 46 54 53 35 5f   (tflags & FTS5_
12f40 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 29  TOKEN_COLOCATED)
12f50 3d 3d 30 20 29 20 70 2d 3e 69 4f 66 66 2b 2b 3b  ==0 ) p->iOff++;
12f60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
12f70 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  xpr->nPhrase; i+
12f80 2b 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72  +){.    Fts5Expr
12f90 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
12fa0 20 69 66 28 20 70 2d 3e 61 50 6f 70 75 6c 61 74   if( p->aPopulat
12fb0 6f 72 5b 69 5d 2e 62 4f 6b 3d 3d 30 20 29 20 63  or[i].bOk==0 ) c
12fc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
12fd0 28 70 54 65 72 6d 3d 26 70 45 78 70 72 2d 3e 61  (pTerm=&pExpr->a
12fe0 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e  pExprPhrase[i]->
12ff0 61 54 65 72 6d 5b 30 5d 3b 20 70 54 65 72 6d 3b  aTerm[0]; pTerm;
13000 20 70 54 65 72 6d 3d 70 54 65 72 6d 2d 3e 70 53   pTerm=pTerm->pS
13010 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20 69  ynonym){.      i
13020 6e 74 20 6e 54 65 72 6d 20 3d 20 28 69 6e 74 29  nt nTerm = (int)
13030 73 74 72 6c 65 6e 28 70 54 65 72 6d 2d 3e 7a 54  strlen(pTerm->zT
13040 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  erm);.      if( 
13050 28 6e 54 65 72 6d 3d 3d 6e 54 6f 6b 65 6e 20 7c  (nTerm==nToken |
13060 7c 20 28 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20  | (nTerm<nToken 
13070 26 26 20 70 54 65 72 6d 2d 3e 62 50 72 65 66 69  && pTerm->bPrefi
13080 78 29 29 0a 20 20 20 20 20 20 20 26 26 20 6d 65  x)).       && me
13090 6d 63 6d 70 28 70 54 65 72 6d 2d 3e 7a 54 65 72  mcmp(pTerm->zTer
130a0 6d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d  m, pToken, nTerm
130b0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
130c0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
130d0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
130e0 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 0a 20  tWriterAppend(. 
130f0 20 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70             &pExp
13100 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b  r->apExprPhrase[
13110 69 5d 2d 3e 70 6f 73 6c 69 73 74 2c 20 26 70 2d  i]->poslist, &p-
13120 3e 61 50 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e 77  >aPopulator[i].w
13130 72 69 74 65 72 2c 20 70 2d 3e 69 4f 66 66 0a 20  riter, p->iOff. 
13140 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
13150 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13160 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 62 72  n rc;.        br
13170 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
13180 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
131a0 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
131b0 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74  rPopulatePoslist
131c0 73 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  s(.  Fts5Config 
131d0 2a 70 43 6f 6e 66 69 67 2c 0a 20 20 46 74 73 35  *pConfig,.  Fts5
131e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20  Expr *pExpr, .  
131f0 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
13200 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f 72  ator *aPopulator
13210 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20  ,.  int iCol, . 
13220 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
13230 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 6e 74 20 69  int n.){.  int i
13240 3b 0a 20 20 46 74 73 35 45 78 70 72 43 74 78 20  ;.  Fts5ExprCtx 
13250 73 43 74 78 3b 0a 20 20 73 43 74 78 2e 70 45 78  sCtx;.  sCtx.pEx
13260 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 43  pr = pExpr;.  sC
13270 74 78 2e 61 50 6f 70 75 6c 61 74 6f 72 20 3d 20  tx.aPopulator = 
13280 61 50 6f 70 75 6c 61 74 6f 72 3b 0a 20 20 73 43  aPopulator;.  sC
13290 74 78 2e 69 4f 66 66 20 3d 20 28 28 28 69 36 34  tx.iOff = (((i64
132a0 29 69 43 6f 6c 29 20 3c 3c 20 33 32 29 20 2d 20  )iCol) << 32) - 
132b0 31 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1;..  for(i=0; i
132c0 3c 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b  <pExpr->nPhrase;
132d0 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 45   i++){.    Fts5E
132e0 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d  xprNode *pNode =
132f0 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50 68   pExpr->apExprPh
13300 72 61 73 65 5b 69 5d 2d 3e 70 4e 6f 64 65 3b 0a  rase[i]->pNode;.
13310 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a      Fts5Colset *
13320 70 43 6f 6c 73 65 74 20 3d 20 70 4e 6f 64 65 2d  pColset = pNode-
13330 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 3b  >pNear->pColset;
13340 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 73 65  .    if( (pColse
13350 74 20 26 26 20 30 3d 3d 66 74 73 35 45 78 70 72  t && 0==fts5Expr
13360 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c 73  ColsetTest(pCols
13370 65 74 2c 20 69 43 6f 6c 29 29 20 0a 20 20 20 20  et, iCol)) .    
13380 20 7c 7c 20 61 50 6f 70 75 6c 61 74 6f 72 5b 69   || aPopulator[i
13390 5d 2e 62 4d 69 73 73 0a 20 20 20 20 29 7b 0a 20  ].bMiss.    ){. 
133a0 20 20 20 20 20 61 50 6f 70 75 6c 61 74 6f 72 5b       aPopulator[
133b0 69 5d 2e 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20  i].bOk = 0;.    
133c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 50 6f  }else{.      aPo
133d0 70 75 6c 61 74 6f 72 5b 69 5d 2e 62 4f 6b 20 3d  pulator[i].bOk =
133e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
133f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
13400 74 73 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f 6e  ts5Tokenize(pCon
13410 66 69 67 2c 20 0a 20 20 20 20 20 20 46 54 53 35  fig, .      FTS5
13420 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d 45  _TOKENIZE_DOCUME
13430 4e 54 2c 20 7a 2c 20 6e 2c 20 28 76 6f 69 64 2a  NT, z, n, (void*
13440 29 26 73 43 74 78 2c 20 66 74 73 35 45 78 70 72  )&sCtx, fts5Expr
13450 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74 73  PopulatePoslists
13460 43 62 0a 20 20 29 3b 0a 7d 0a 0a 73 74 61 74 69  Cb.  );.}..stati
13470 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 43  c void fts5ExprC
13480 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 46 74 73  learPoslists(Fts
13490 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
134a0 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  ){.  if( pNode->
134b0 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d  eType==FTS5_TERM
134c0 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65   || pNode->eType
134d0 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 29 7b  ==FTS5_STRING ){
134e0 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  .    pNode->pNea
134f0 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e  r->apPhrase[0]->
13500 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20  poslist.n = 0;. 
13510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
13520 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
13530 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b  i<pNode->nChild;
13540 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
13550 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73  5ExprClearPoslis
13560 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c  ts(pNode->apChil
13570 64 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  d[i]);.    }.  }
13580 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
13590 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c  ts5ExprCheckPosl
135a0 69 73 74 73 28 46 74 73 35 45 78 70 72 4e 6f 64  ists(Fts5ExprNod
135b0 65 20 2a 70 4e 6f 64 65 2c 20 69 36 34 20 69 52  e *pNode, i64 iR
135c0 6f 77 69 64 29 7b 0a 20 20 70 4e 6f 64 65 2d 3e  owid){.  pNode->
135d0 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  iRowid = iRowid;
135e0 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d  .  pNode->bEof =
135f0 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4e   0;.  switch( pN
13600 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  ode->eType ){.  
13610 20 20 63 61 73 65 20 46 54 53 35 5f 54 45 52 4d    case FTS5_TERM
13620 3a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f  :.    case FTS5_
13630 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 72 65  STRING:.      re
13640 74 75 72 6e 20 28 70 4e 6f 64 65 2d 3e 70 4e 65  turn (pNode->pNe
13650 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
13660 3e 70 6f 73 6c 69 73 74 2e 6e 3e 30 29 3b 0a 0a  >poslist.n>0);..
13670 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e      case FTS5_AN
13680 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  D: {.      int i
13690 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
136a0 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
136b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
136c0 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65 63  if( fts5ExprChec
136d0 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 2d  kPoslists(pNode-
136e0 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52 6f  >apChild[i], iRo
136f0 77 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  wid)==0 ){.     
13700 20 20 20 20 20 66 74 73 35 45 78 70 72 43 6c 65       fts5ExprCle
13710 61 72 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65  arPoslists(pNode
13720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
13730 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
13740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13750 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
13760 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20 7b   case FTS5_OR: {
13770 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
13780 20 20 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30      int bRet = 0
13790 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
137a0 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
137b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
137c0 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65 63  if( fts5ExprChec
137d0 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 2d  kPoslists(pNode-
137e0 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52 6f  >apChild[i], iRo
137f0 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  wid) ){.        
13800 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20    bRet = 1;.    
13810 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13820 20 20 20 20 72 65 74 75 72 6e 20 62 52 65 74 3b      return bRet;
13830 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
13840 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
13850 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70  ert( pNode->eTyp
13860 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29 3b 0a 20  e==FTS5_NOT );. 
13870 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35       if( 0==fts5
13880 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74  ExprCheckPoslist
13890 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  s(pNode->apChild
138a0 5b 30 5d 2c 20 69 52 6f 77 69 64 29 0a 20 20 20  [0], iRowid).   
138b0 20 20 20 20 20 20 20 7c 7c 20 30 21 3d 66 74 73         || 0!=fts
138c0 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73  5ExprCheckPoslis
138d0 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c  ts(pNode->apChil
138e0 64 5b 31 5d 2c 20 69 52 6f 77 69 64 29 0a 20 20  d[1], iRowid).  
138f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13900 20 66 74 73 35 45 78 70 72 43 6c 65 61 72 50 6f   fts5ExprClearPo
13910 73 6c 69 73 74 73 28 70 4e 6f 64 65 29 3b 0a 20  slists(pNode);. 
13920 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
13930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13940 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
13950 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 76    return 1;.}..v
13960 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 45  oid sqlite3Fts5E
13970 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74 73  xprCheckPoslists
13980 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72  (Fts5Expr *pExpr
13990 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
139a0 20 66 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f   fts5ExprCheckPo
139b0 73 6c 69 73 74 73 28 70 45 78 70 72 2d 3e 70 52  slists(pExpr->pR
139c0 6f 6f 74 2c 20 69 52 6f 77 69 64 29 3b 0a 7d 0a  oot, iRowid);.}.
139d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
139e0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
139f0 6c 65 64 20 66 6f 72 20 64 65 74 61 69 6c 3d 63  led for detail=c
13a00 6f 6c 75 6d 6e 73 20 74 61 62 6c 65 73 2e 20 0a  olumns tables. .
13a10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
13a20 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 6c 6c  s5ExprPhraseColl
13a30 69 73 74 28 0a 20 20 46 74 73 35 45 78 70 72 20  ist(.  Fts5Expr 
13a40 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e 74 20 69  *pExpr, .  int i
13a50 50 68 72 61 73 65 2c 20 0a 20 20 63 6f 6e 73 74  Phrase, .  const
13a60 20 75 38 20 2a 2a 70 70 43 6f 6c 6c 69 73 74 2c   u8 **ppCollist,
13a70 20 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 6c 69   .  int *pnColli
13a80 73 74 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72  st.){.  Fts5Expr
13a90 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
13aa0 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50  = pExpr->apExprP
13ab0 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d 3b 0a  hrase[iPhrase];.
13ac0 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
13ad0 70 4e 6f 64 65 20 3d 20 70 50 68 72 61 73 65 2d  pNode = pPhrase-
13ae0 3e 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  >pNode;.  int rc
13af0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
13b00 20 61 73 73 65 72 74 28 20 69 50 68 72 61 73 65   assert( iPhrase
13b10 3e 3d 30 20 26 26 20 69 50 68 72 61 73 65 3c 70  >=0 && iPhrase<p
13b20 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 20 29 3b  Expr->nPhrase );
13b30 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
13b40 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
13b50 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
13b60 43 4f 4c 55 4d 4e 53 20 29 3b 0a 0a 20 20 69 66  COLUMNS );..  if
13b70 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30  ( pNode->bEof==0
13b80 20 0a 20 20 20 26 26 20 70 4e 6f 64 65 2d 3e 69   .   && pNode->i
13b90 52 6f 77 69 64 3d 3d 70 45 78 70 72 2d 3e 70 52  Rowid==pExpr->pR
13ba0 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 0a 20 20 20  oot->iRowid .   
13bb0 26 26 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  && pPhrase->posl
13bc0 69 73 74 2e 6e 3e 30 0a 20 20 29 7b 0a 20 20 20  ist.n>0.  ){.   
13bd0 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
13be0 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d  Term = &pPhrase-
13bf0 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 69  >aTerm[0];.    i
13c00 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  f( pTerm->pSynon
13c10 79 6d 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  ym ){.      Fts5
13c20 42 75 66 66 65 72 20 2a 70 42 75 66 20 3d 20 28  Buffer *pBuf = (
13c30 46 74 73 35 42 75 66 66 65 72 2a 29 26 70 54 65  Fts5Buffer*)&pTe
13c40 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 5b 31 5d 3b  rm->pSynonym[1];
13c50 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35  .      rc = fts5
13c60 45 78 70 72 53 79 6e 6f 6e 79 6d 4c 69 73 74 28  ExprSynonymList(
13c70 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
13c80 2c 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 2c  , pNode->iRowid,
13c90 20 70 42 75 66 2c 20 28 75 38 2a 2a 29 70 70 43   pBuf, (u8**)ppC
13ca0 6f 6c 6c 69 73 74 2c 20 70 6e 43 6f 6c 6c 69 73  ollist, pnCollis
13cb0 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
13cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 43  else{.      *ppC
13cd0 6f 6c 6c 69 73 74 20 3d 20 70 50 68 72 61 73 65  ollist = pPhrase
13ce0 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72  ->aTerm[0].pIter
13cf0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 2a  ->pData;.      *
13d00 70 6e 43 6f 6c 6c 69 73 74 20 3d 20 70 50 68 72  pnCollist = pPhr
13d10 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49  ase->aTerm[0].pI
13d20 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20  ter->nData;.    
13d30 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  }.  }else{.    *
13d40 70 70 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20  ppCollist = 0;. 
13d50 20 20 20 2a 70 6e 43 6f 6c 6c 69 73 74 20 3d 20     *pnCollist = 
13d60 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
13d70 20 72 63 3b 0a 7d 0a 0a                           rc;.}..