/ Hex Artifact Content
Login

Artifact 01048018d21524e2c302b063ff5c3cdcf546e03297215e577205d85b47499deb:


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 62 50 72 65 66 69 78 3b 0a 20  fix = bPrefix;. 
bf00: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
bf10: 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65  >apPhrase[pParse
bf20: 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 20 3d 20 73  ->nPhrase-1] = s
bf30: 43 74 78 2e 70 50 68 72 61 73 65 3b 0a 20 20 7d  Ctx.pPhrase;.  }
bf40: 0a 0a 20 20 72 65 74 75 72 6e 20 73 43 74 78 2e  ..  return sCtx.
bf50: 70 50 68 72 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPhrase;.}../*.*
bf60: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 46  * Create a new F
bf70: 54 53 35 20 65 78 70 72 65 73 73 69 6f 6e 20 62  TS5 expression b
bf80: 79 20 63 6c 6f 6e 69 6e 67 20 70 68 72 61 73 65  y cloning phrase
bf90: 20 69 50 68 72 61 73 65 20 6f 66 20 74 68 65 0a   iPhrase of the.
bfa0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
bfb0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
bfc0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
bfd0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
bfe0: 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65 28 0a  xprClonePhrase(.
bff0: 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70    Fts5Expr *pExp
c000: 72 2c 20 0a 20 20 69 6e 74 20 69 50 68 72 61 73  r, .  int iPhras
c010: 65 2c 20 0a 20 20 46 74 73 35 45 78 70 72 20 2a  e, .  Fts5Expr *
c020: 2a 70 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20  *ppNew.){.  int 
c030: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c050: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c060: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
c070: 70 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  pOrig;          
c080: 2f 2a 20 54 68 65 20 70 68 72 61 73 65 20 65 78  /* The phrase ex
c090: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
c0a0: 70 72 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  pr */.  Fts5Expr
c0b0: 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
c0c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
c0d0: 73 73 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20  ssion to return 
c0e0: 76 69 61 20 2a 70 70 4e 65 77 20 2a 2f 0a 20 20  via *ppNew */.  
c0f0: 54 6f 6b 65 6e 43 74 78 20 73 43 74 78 20 3d 20  TokenCtx sCtx = 
c100: 7b 30 2c 30 7d 3b 20 20 20 20 20 20 20 20 20 20  {0,0};          
c110: 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  /* Context objec
c120: 74 20 66 6f 72 20 66 74 73 35 50 61 72 73 65 54  t for fts5ParseT
c130: 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 0a 20 20 70 4f  okenize */..  pO
c140: 72 69 67 20 3d 20 70 45 78 70 72 2d 3e 61 70 45  rig = pExpr->apE
c150: 78 70 72 50 68 72 61 73 65 5b 69 50 68 72 61 73  xprPhrase[iPhras
c160: 65 5d 3b 0a 20 20 70 4e 65 77 20 3d 20 28 46 74  e];.  pNew = (Ft
c170: 73 35 45 78 70 72 2a 29 73 71 6c 69 74 65 33 46  s5Expr*)sqlite3F
c180: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
c190: 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78  c, sizeof(Fts5Ex
c1a0: 70 72 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pr));.  if( rc==
c1b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c1c0: 20 70 4e 65 77 2d 3e 61 70 45 78 70 72 50 68 72   pNew->apExprPhr
c1d0: 61 73 65 20 3d 20 28 46 74 73 35 45 78 70 72 50  ase = (Fts5ExprP
c1e0: 68 72 61 73 65 2a 2a 29 73 71 6c 69 74 65 33 46  hrase**)sqlite3F
c1f0: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
c200: 63 2c 20 0a 20 20 20 20 20 20 20 20 73 69 7a 65  c, .        size
c210: 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73  of(Fts5ExprPhras
c220: 65 2a 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e*));.  }.  if( 
c230: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c240: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74  .    pNew->pRoot
c250: 20 3d 20 28 46 74 73 35 45 78 70 72 4e 6f 64 65   = (Fts5ExprNode
c260: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
c270: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20  locZero(&rc, .  
c280: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
c290: 35 45 78 70 72 4e 6f 64 65 29 29 3b 0a 20 20 7d  5ExprNode));.  }
c2a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c2b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77  E_OK ){.    pNew
c2c0: 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 20 3d  ->pRoot->pNear =
c2d0: 20 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65   (Fts5ExprNearse
c2e0: 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
c2f0: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20  llocZero(&rc, . 
c300: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
c310: 73 35 45 78 70 72 4e 65 61 72 73 65 74 29 20 2b  s5ExprNearset) +
c320: 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
c330: 50 68 72 61 73 65 2a 29 29 3b 0a 20 20 7d 0a 20  Phrase*));.  }. 
c340: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c350: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  OK ){.    Fts5Co
c360: 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 4f 72 69  lset *pColsetOri
c370: 67 20 3d 20 70 4f 72 69 67 2d 3e 70 4e 6f 64 65  g = pOrig->pNode
c380: 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  ->pNear->pColset
c390: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  ;.    if( pColse
c3a0: 74 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 69  tOrig ){.      i
c3b0: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
c3c0: 66 28 46 74 73 35 43 6f 6c 73 65 74 29 20 2b 20  f(Fts5Colset) + 
c3d0: 28 70 43 6f 6c 73 65 74 4f 72 69 67 2d 3e 6e 43  (pColsetOrig->nC
c3e0: 6f 6c 2d 31 29 20 2a 20 73 69 7a 65 6f 66 28 69  ol-1) * sizeof(i
c3f0: 6e 74 29 3b 0a 20 20 20 20 20 20 46 74 73 35 43  nt);.      Fts5C
c400: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d  olset *pColset =
c410: 20 28 46 74 73 35 43 6f 6c 73 65 74 2a 29 73 71   (Fts5Colset*)sq
c420: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
c430: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
c440: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 73  .      if( pCols
c450: 65 74 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d  et ){ .        m
c460: 65 6d 63 70 79 28 70 43 6f 6c 73 65 74 2c 20 70  emcpy(pColset, p
c470: 43 6f 6c 73 65 74 4f 72 69 67 2c 20 6e 42 79 74  ColsetOrig, nByt
c480: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
c490: 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70    pNew->pRoot->p
c4a0: 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 3d 20  Near->pColset = 
c4b0: 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 20  pColset;.    }. 
c4c0: 20 7d 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 2d   }..  if( pOrig-
c4d0: 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 6e  >nTerm ){.    in
c4e0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c500: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
c510: 20 74 68 72 6f 75 67 68 20 70 68 72 61 73 65 20   through phrase 
c520: 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 66 6f 72  terms */.    for
c530: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
c540: 5f 4f 4b 20 26 26 20 69 3c 70 4f 72 69 67 2d 3e  _OK && i<pOrig->
c550: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
c560: 20 20 20 69 6e 74 20 74 66 6c 61 67 73 20 3d 20     int tflags = 
c570: 30 3b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  0;.      Fts5Exp
c580: 72 54 65 72 6d 20 2a 70 3b 0a 20 20 20 20 20 20  rTerm *p;.      
c590: 66 6f 72 28 70 3d 26 70 4f 72 69 67 2d 3e 61 54  for(p=&pOrig->aT
c5a0: 65 72 6d 5b 69 5d 3b 20 70 20 26 26 20 72 63 3d  erm[i]; p && rc=
c5b0: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 3d 70 2d  =SQLITE_OK; p=p-
c5c0: 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20  >pSynonym){.    
c5d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c5e0: 7a 54 65 72 6d 20 3d 20 70 2d 3e 7a 54 65 72 6d  zTerm = p->zTerm
c5f0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
c600: 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65  ts5ParseTokenize
c610: 28 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 74  ((void*)&sCtx, t
c620: 66 6c 61 67 73 2c 20 7a 54 65 72 6d 2c 20 28 69  flags, zTerm, (i
c630: 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29  nt)strlen(zTerm)
c640: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
c650: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 74 66 6c   0);.        tfl
c660: 61 67 73 20 3d 20 46 54 53 35 5f 54 4f 4b 45 4e  ags = FTS5_TOKEN
c670: 5f 43 4f 4c 4f 43 41 54 45 44 3b 0a 20 20 20 20  _COLOCATED;.    
c680: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
c690: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c6a0: 20 20 20 20 20 20 20 73 43 74 78 2e 70 50 68 72         sCtx.pPhr
c6b0: 61 73 65 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 50  ase->aTerm[i].bP
c6c0: 72 65 66 69 78 20 3d 20 70 4f 72 69 67 2d 3e 61  refix = pOrig->a
c6d0: 54 65 72 6d 5b 69 5d 2e 62 50 72 65 66 69 78 3b  Term[i].bPrefix;
c6e0: 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 50  .        sCtx.pP
c6f0: 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 5d 2e  hrase->aTerm[i].
c700: 62 46 69 72 73 74 20 3d 20 70 4f 72 69 67 2d 3e  bFirst = pOrig->
c710: 61 54 65 72 6d 5b 69 5d 2e 62 46 69 72 73 74 3b  aTerm[i].bFirst;
c720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
c740: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
c750: 20 70 61 72 73 69 6e 67 20 61 20 74 6f 6b 65 6e   parsing a token
c760: 20 6f 72 20 71 75 6f 74 65 64 20 70 68 72 61 73   or quoted phras
c770: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
c780: 20 20 20 20 2a 2a 20 6e 6f 20 74 6f 6b 65 6e 20      ** no token 
c790: 63 68 61 72 61 63 74 65 72 73 20 61 74 20 61 6c  characters at al
c7a0: 6c 2e 20 28 65 2e 67 20 2e 2e 2e 20 4d 41 54 43  l. (e.g ... MATC
c7b0: 48 20 27 22 22 27 29 2e 20 2a 2f 0a 20 20 20 20  H '""'). */.    
c7c0: 73 43 74 78 2e 70 50 68 72 61 73 65 20 3d 20 73  sCtx.pPhrase = s
c7d0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
c7e0: 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66  Zero(&rc, sizeof
c7f0: 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 29  (Fts5ExprPhrase)
c800: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
c810: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c820: 20 20 20 2f 2a 20 41 6c 6c 20 74 68 65 20 61 6c     /* All the al
c830: 6c 6f 63 61 74 69 6f 6e 73 20 73 75 63 63 65 65  locations succee
c840: 64 65 64 2e 20 50 75 74 20 74 68 65 20 65 78 70  ded. Put the exp
c850: 72 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74  ression object t
c860: 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  ogether. */.    
c870: 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pNew->pIndex = p
c880: 45 78 70 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Expr->pIndex;.  
c890: 20 20 70 4e 65 77 2d 3e 70 43 6f 6e 66 69 67 20    pNew->pConfig 
c8a0: 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67  = pExpr->pConfig
c8b0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 50 68 72  ;.    pNew->nPhr
c8c0: 61 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65  ase = 1;.    pNe
c8d0: 77 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b  w->apExprPhrase[
c8e0: 30 5d 20 3d 20 73 43 74 78 2e 70 50 68 72 61 73  0] = sCtx.pPhras
c8f0: 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f  e;.    pNew->pRo
c900: 6f 74 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72  ot->pNear->apPhr
c910: 61 73 65 5b 30 5d 20 3d 20 73 43 74 78 2e 70 50  ase[0] = sCtx.pP
c920: 68 72 61 73 65 3b 0a 20 20 20 20 70 4e 65 77 2d  hrase;.    pNew-
c930: 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 2d 3e 6e  >pRoot->pNear->n
c940: 50 68 72 61 73 65 20 3d 20 31 3b 0a 20 20 20 20  Phrase = 1;.    
c950: 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 70 4e  sCtx.pPhrase->pN
c960: 6f 64 65 20 3d 20 70 4e 65 77 2d 3e 70 52 6f 6f  ode = pNew->pRoo
c970: 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 69  t;..    if( pOri
c980: 67 2d 3e 6e 54 65 72 6d 3d 3d 31 20 0a 20 20 20  g->nTerm==1 .   
c990: 20 20 26 26 20 70 4f 72 69 67 2d 3e 61 54 65 72    && pOrig->aTer
c9a0: 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 3d 3d 30  m[0].pSynonym==0
c9b0: 20 0a 20 20 20 20 20 26 26 20 70 4f 72 69 67 2d   .     && pOrig-
c9c0: 3e 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74  >aTerm[0].bFirst
c9d0: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
c9e0: 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 65    pNew->pRoot->e
c9f0: 54 79 70 65 20 3d 20 46 54 53 35 5f 54 45 52 4d  Type = FTS5_TERM
ca00: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52  ;.      pNew->pR
ca10: 6f 6f 74 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73  oot->xNext = fts
ca20: 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45  5ExprNodeNext_TE
ca30: 52 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  RM;.    }else{. 
ca40: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74       pNew->pRoot
ca50: 2d 3e 65 54 79 70 65 20 3d 20 46 54 53 35 5f 53  ->eType = FTS5_S
ca60: 54 52 49 4e 47 3b 0a 20 20 20 20 20 20 70 4e 65  TRING;.      pNe
ca70: 77 2d 3e 70 52 6f 6f 74 2d 3e 78 4e 65 78 74 20  w->pRoot->xNext 
ca80: 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  = fts5ExprNodeNe
ca90: 78 74 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 7d  xt_STRING;.    }
caa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
cab0: 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 72 65  lite3Fts5ExprFre
cac0: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73  e(pNew);.    fts
cad0: 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28  5ExprPhraseFree(
cae0: 73 43 74 78 2e 70 50 68 72 61 73 65 29 3b 0a 20  sCtx.pPhrase);. 
caf0: 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d     pNew = 0;.  }
cb00: 0a 0a 20 20 2a 70 70 4e 65 77 20 3d 20 70 4e 65  ..  *ppNew = pNe
cb10: 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  w;.  return rc;.
cb20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 20  }.../*.** Token 
cb30: 70 54 6f 6b 20 68 61 73 20 61 70 70 65 61 72 65  pTok has appeare
cb40: 64 20 69 6e 20 61 20 4d 41 54 43 48 20 65 78 70  d in a MATCH exp
cb50: 72 65 73 73 69 6f 6e 20 77 68 65 72 65 20 74 68  ression where th
cb60: 65 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 0a  e NEAR operator.
cb70: 2a 2a 20 69 73 20 65 78 70 65 63 74 65 64 2e 20  ** is expected. 
cb80: 49 66 20 74 6f 6b 65 6e 20 70 54 6f 6b 20 64 6f  If token pTok do
cb90: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 22  es not contain "
cba0: 4e 45 41 52 22 2c 20 73 74 6f 72 65 20 61 6e 20  NEAR", store an 
cbb0: 65 72 72 6f 72 0a 2a 2a 20 69 6e 20 74 68 65 20  error.** in the 
cbc0: 70 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a  pParse object..*
cbd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
cbe0: 73 35 50 61 72 73 65 4e 65 61 72 28 46 74 73 35  s5ParseNear(Fts5
cbf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46  Parse *pParse, F
cc00: 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b  ts5Token *pTok){
cc10: 0a 20 20 69 66 28 20 70 54 6f 6b 2d 3e 6e 21 3d  .  if( pTok->n!=
cc20: 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 4e 45 41  4 || memcmp("NEA
cc30: 52 22 2c 20 70 54 6f 6b 2d 3e 70 2c 20 34 29 20  R", pTok->p, 4) 
cc40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
cc50: 73 35 50 61 72 73 65 45 72 72 6f 72 28 0a 20 20  s5ParseError(.  
cc60: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 66        pParse, "f
cc70: 74 73 35 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  ts5: syntax erro
cc80: 72 20 6e 65 61 72 20 5c 22 25 2e 2a 73 5c 22 22  r near \"%.*s\""
cc90: 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 70 54 6f 6b 2d  , pTok->n, pTok-
cca0: 3e 70 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  >p.    );.  }.}.
ccb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
ccc0: 35 50 61 72 73 65 53 65 74 44 69 73 74 61 6e 63  5ParseSetDistanc
ccd0: 65 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a  e(.  Fts5Parse *
cce0: 70 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45  pParse, .  Fts5E
ccf0: 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61  xprNearset *pNea
cd00: 72 2c 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a  r,.  Fts5Token *
cd10: 70 0a 29 7b 0a 20 20 69 66 28 20 70 4e 65 61 72  p.){.  if( pNear
cd20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 61   ){.    int nNea
cd30: 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  r = 0;.    int i
cd40: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 20 29  ;.    if( p->n )
cd50: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
cd60: 20 69 3c 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20   i<p->n; i++){. 
cd70: 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
cd80: 28 63 68 61 72 29 70 2d 3e 70 5b 69 5d 3b 0a 20  (char)p->p[i];. 
cd90: 20 20 20 20 20 20 20 69 66 28 20 63 3c 27 30 27         if( c<'0'
cda0: 20 7c 7c 20 63 3e 27 39 27 20 29 7b 0a 20 20 20   || c>'9' ){.   
cdb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
cdc0: 73 35 50 61 72 73 65 45 72 72 6f 72 28 0a 20 20  s5ParseError(.  
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
cde0: 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 69 6e  se, "expected in
cdf0: 74 65 67 65 72 2c 20 67 6f 74 20 5c 22 25 2e 2a  teger, got \"%.*
ce00: 73 5c 22 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 70  s\"", p->n, p->p
ce10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
ce20: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
ce30: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
ce40: 20 20 20 20 20 20 6e 4e 65 61 72 20 3d 20 6e 4e        nNear = nN
ce50: 65 61 72 20 2a 20 31 30 20 2b 20 28 70 2d 3e 70  ear * 10 + (p->p
ce60: 5b 69 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20  [i] - '0');.    
ce70: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
ce80: 20 20 20 20 20 6e 4e 65 61 72 20 3d 20 46 54 53       nNear = FTS
ce90: 35 5f 44 45 46 41 55 4c 54 5f 4e 45 41 52 44 49  5_DEFAULT_NEARDI
cea0: 53 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ST;.    }.    pN
ceb0: 65 61 72 2d 3e 6e 4e 65 61 72 20 3d 20 6e 4e 65  ear->nNear = nNe
cec0: 61 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ar;.  }.}../*.**
ced0: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
cee0: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
cef0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
cf00: 20 62 65 20 4e 55 4c 4c 2c 20 6f 72 20 69 74 20   be NULL, or it 
cf10: 6d 61 79 20 62 65 0a 2a 2a 20 61 6e 20 65 78 69  may be.** an exi
cf20: 73 74 69 6e 67 20 46 74 73 35 43 6f 6c 73 65 74  sting Fts5Colset
cf30: 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75   object. This fu
cf40: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
cf50: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61   pointer to.** a
cf60: 20 6e 65 77 20 63 6f 6c 73 65 74 20 6f 62 6a 65   new colset obje
cf70: 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ct containing th
cf80: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 28 70  e contents of (p
cf90: 29 20 77 69 74 68 20 6e 65 77 20 76 61 6c 75 65  ) with new value
cfa0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 75 6d 62 65   column.** numbe
cfb0: 72 20 69 43 6f 6c 20 61 70 70 65 6e 64 65 64 2e  r iCol appended.
cfc0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f   .**.** If an OO
cfd0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
cfe0: 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 63  store an error c
cff0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
d000: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
d010: 2a 20 54 68 65 20 6f 6c 64 20 63 6f 6c 73 65 74  * The old colset
d020: 20 6f 62 6a 65 63 74 20 28 69 66 20 61 6e 79 29   object (if any)
d030: 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 69 6e   is not freed in
d040: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
d050: 74 61 74 69 63 20 46 74 73 35 43 6f 6c 73 65 74  tatic Fts5Colset
d060: 20 2a 66 74 73 35 50 61 72 73 65 43 6f 6c 73 65   *fts5ParseColse
d070: 74 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a  t(.  Fts5Parse *
d080: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d090: 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 53 51       /* Store SQ
d0a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 68 65 72 65 20  LITE_NOMEM here 
d0b0: 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
d0c0: 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 2c 20   Fts5Colset *p, 
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 63 6f 6c   /* Existing col
d0f0: 73 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  set object */.  
d100: 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 2f 2a 20 4e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f  /* New column to
d130: 20 61 64 64 20 74 6f 20 63 6f 6c 73 65 74 20 6f   add to colset o
d140: 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
d150: 74 20 6e 43 6f 6c 20 3d 20 70 20 3f 20 70 2d 3e  t nCol = p ? p->
d160: 6e 43 6f 6c 20 3a 20 30 3b 20 20 20 20 20 2f 2a  nCol : 0;     /*
d170: 20 4e 75 6d 2e 20 63 6f 6c 75 6d 6e 73 20 61 6c   Num. columns al
d180: 72 65 61 64 79 20 69 6e 20 63 6f 6c 73 65 74 20  ready in colset 
d190: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
d1a0: 43 6f 6c 73 65 74 20 2a 70 4e 65 77 3b 20 20 20  Colset *pNew;   
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d1c0: 65 77 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74  ew colset object
d1d0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
d1e0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
d1f0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
d200: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ;.  assert( iCol
d210: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 50 61 72  >=0 && iCol<pPar
d220: 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  se->pConfig->nCo
d230: 6c 20 29 3b 0a 0a 20 20 70 4e 65 77 20 3d 20 73  l );..  pNew = s
d240: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
d250: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c  , sizeof(Fts5Col
d260: 73 65 74 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e  set) + sizeof(in
d270: 74 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  t)*nCol);.  if( 
d280: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
d290: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
d2a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
d2b0: 65 7b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f  e{.    int *aiCo
d2c0: 6c 20 3d 20 70 4e 65 77 2d 3e 61 69 43 6f 6c 3b  l = pNew->aiCol;
d2d0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
d2e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
d2f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
d300: 69 66 28 20 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43  if( aiCol[i]==iC
d310: 6f 6c 20 29 20 72 65 74 75 72 6e 20 70 4e 65 77  ol ) return pNew
d320: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 69 43 6f  ;.      if( aiCo
d330: 6c 5b 69 5d 3e 69 43 6f 6c 20 29 20 62 72 65 61  l[i]>iCol ) brea
d340: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  k;.    }.    for
d350: 28 6a 3d 6e 43 6f 6c 3b 20 6a 3e 69 3b 20 6a 2d  (j=nCol; j>i; j-
d360: 2d 29 7b 0a 20 20 20 20 20 20 61 69 43 6f 6c 5b  -){.      aiCol[
d370: 6a 5d 20 3d 20 61 69 43 6f 6c 5b 6a 2d 31 5d 3b  j] = aiCol[j-1];
d380: 0a 20 20 20 20 7d 0a 20 20 20 20 61 69 43 6f 6c  .    }.    aiCol
d390: 5b 69 5d 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  [i] = iCol;.    
d3a0: 70 4e 65 77 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pNew->nCol = nCo
d3b0: 6c 2b 31 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  l+1;..#ifndef ND
d3c0: 45 42 55 47 0a 20 20 20 20 2f 2a 20 43 68 65 63  EBUG.    /* Chec
d3d0: 6b 20 74 68 61 74 20 74 68 65 20 61 72 72 61 79  k that the array
d3e0: 20 69 73 20 69 6e 20 6f 72 64 65 72 20 61 6e 64   is in order and
d3f0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75 70   contains no dup
d400: 6c 69 63 61 74 65 20 65 6e 74 72 69 65 73 2e 20  licate entries. 
d410: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  */.    for(i=1; 
d420: 69 3c 70 4e 65 77 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pNew->nCol; i+
d430: 2b 29 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  +) assert( pNew-
d440: 3e 61 69 43 6f 6c 5b 69 5d 3e 70 4e 65 77 2d 3e  >aiCol[i]>pNew->
d450: 61 69 43 6f 6c 5b 69 2d 31 5d 20 29 3b 0a 23 65  aiCol[i-1] );.#e
d460: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
d470: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
d480: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
d490: 65 74 75 72 6e 20 61 6e 20 46 74 73 35 43 6f 6c  eturn an Fts5Col
d4a0: 73 65 74 20 6f 62 6a 65 63 74 20 73 70 65 63 69  set object speci
d4b0: 66 79 69 6e 67 20 74 68 65 20 69 6e 76 65 72 73  fying the invers
d4c0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 73  e of.** the cols
d4d0: 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  et passed as the
d4e0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
d4f0: 2e 20 46 72 65 65 20 74 68 65 20 63 6f 6c 73 65  . Free the colse
d500: 74 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  t passed.** as t
d510: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
d520: 6e 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  nt before return
d530: 69 6e 67 2e 0a 2a 2f 0a 46 74 73 35 43 6f 6c 73  ing..*/.Fts5Cols
d540: 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  et *sqlite3Fts5P
d550: 61 72 73 65 43 6f 6c 73 65 74 49 6e 76 65 72 74  arseColsetInvert
d560: 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72  (Fts5Parse *pPar
d570: 73 65 2c 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  se, Fts5Colset *
d580: 70 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  p){.  Fts5Colset
d590: 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 6e 43   *pRet;.  int nC
d5a0: 6f 6c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f  ol = pParse->pCo
d5b0: 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 0a 20 20 70  nfig->nCol;..  p
d5c0: 52 65 74 20 3d 20 28 46 74 73 35 43 6f 6c 73 65  Ret = (Fts5Colse
d5d0: 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
d5e0: 6c 6c 6f 63 5a 65 72 6f 28 26 70 50 61 72 73 65  llocZero(&pParse
d5f0: 2d 3e 72 63 2c 20 0a 20 20 20 20 20 20 73 69 7a  ->rc, .      siz
d600: 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74 29 20  eof(Fts5Colset) 
d610: 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43  + sizeof(int)*nC
d620: 6f 6c 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 52  ol.  );.  if( pR
d630: 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
d640: 0a 20 20 20 20 69 6e 74 20 69 4f 6c 64 20 3d 20  .    int iOld = 
d650: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
d660: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
d670: 20 20 20 20 69 66 28 20 69 4f 6c 64 3e 3d 70 2d      if( iOld>=p-
d680: 3e 6e 43 6f 6c 20 7c 7c 20 70 2d 3e 61 69 43 6f  >nCol || p->aiCo
d690: 6c 5b 69 4f 6c 64 5d 21 3d 69 20 29 7b 0a 20 20  l[iOld]!=i ){.  
d6a0: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 69 43 6f        pRet->aiCo
d6b0: 6c 5b 70 52 65 74 2d 3e 6e 43 6f 6c 2b 2b 5d 20  l[pRet->nCol++] 
d6c0: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = i;.      }else
d6d0: 7b 0a 20 20 20 20 20 20 20 20 69 4f 6c 64 2b 2b  {.        iOld++
d6e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d6f0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
d700: 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
d710: 20 70 52 65 74 3b 0a 7d 0a 0a 46 74 73 35 43 6f   pRet;.}..Fts5Co
d720: 6c 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73  lset *sqlite3Fts
d730: 35 50 61 72 73 65 43 6f 6c 73 65 74 28 0a 20 20  5ParseColset(.  
d740: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
d750: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
d760: 2f 2a 20 53 74 6f 72 65 20 53 51 4c 49 54 45 5f  /* Store SQLITE_
d770: 4e 4f 4d 45 4d 20 68 65 72 65 20 69 66 20 72 65  NOMEM here if re
d780: 71 75 69 72 65 64 20 2a 2f 0a 20 20 46 74 73 35  quired */.  Fts5
d790: 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d7b0: 78 69 73 74 69 6e 67 20 63 6f 6c 73 65 74 20 6f  xisting colset o
d7c0: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 54  bject */.  Fts5T
d7d0: 6f 6b 65 6e 20 2a 70 0a 29 7b 0a 20 20 46 74 73  oken *p.){.  Fts
d7e0: 35 43 6f 6c 73 65 74 20 2a 70 52 65 74 20 3d 20  5Colset *pRet = 
d7f0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  0;.  int iCol;. 
d800: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 63 6f 70   /* Dequoted cop
d830: 79 20 6f 66 20 74 6f 6b 65 6e 20 70 20 2a 2f 0a  y of token p */.
d840: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 46 74  .  z = sqlite3Ft
d850: 73 35 53 74 72 6e 64 75 70 28 26 70 50 61 72 73  s5Strndup(&pPars
d860: 65 2d 3e 72 63 2c 20 70 2d 3e 70 2c 20 70 2d 3e  e->rc, p->p, p->
d870: 6e 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  n);.  if( pParse
d880: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d890: 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
d8a0: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 50 61  g *pConfig = pPa
d8b0: 72 73 65 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  rse->pConfig;.  
d8c0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71    sqlite3Fts5Deq
d8d0: 75 6f 74 65 28 7a 29 3b 0a 20 20 20 20 66 6f 72  uote(z);.    for
d8e0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 43  (iCol=0; iCol<pC
d8f0: 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  onfig->nCol; iCo
d900: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
d910: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
d920: 6d 70 28 70 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f  mp(pConfig->azCo
d930: 6c 5b 69 43 6f 6c 5d 2c 20 7a 29 20 29 20 62 72  l[iCol], z) ) br
d940: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
d950: 66 28 20 69 43 6f 6c 3d 3d 70 43 6f 6e 66 69 67  f( iCol==pConfig
d960: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
d970: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
d980: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 22 6e  Error(pParse, "n
d990: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25  o such column: %
d9a0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  s", z);.    }els
d9b0: 65 7b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  e{.      pRet = 
d9c0: 66 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28  fts5ParseColset(
d9d0: 70 50 61 72 73 65 2c 20 70 43 6f 6c 73 65 74 2c  pParse, pColset,
d9e0: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
d9f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
da00: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 52  );.  }..  if( pR
da10: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  et==0 ){.    ass
da20: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 21  ert( pParse->rc!
da30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
da40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
da50: 43 6f 6c 73 65 74 29 3b 0a 20 20 7d 0a 0a 20 20  Colset);.  }..  
da60: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
da70: 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  /*.** If argumen
da80: 74 20 70 4f 72 69 67 20 69 73 20 4e 55 4c 4c 2c  t pOrig is NULL,
da90: 20 6f 72 20 69 66 20 28 2a 70 52 63 29 20 69 73   or if (*pRc) is
daa0: 20 73 65 74 20 74 6f 20 61 6e 79 74 68 69 6e 67   set to anything
dab0: 20 6f 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 53   other than.** S
dac0: 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68  QLITE_OK when th
dad0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
dae0: 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  alled, NULL is r
daf0: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
db00: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 63 6f 70  Otherwise, a cop
db10: 79 20 6f 66 20 28 2a 70 4f 72 69 67 29 20 69 73  y of (*pOrig) is
db20: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
db30: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
db40: 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61  ** sqlite3Fts5Ma
db50: 6c 6c 6f 63 5a 65 72 6f 28 29 20 61 6e 64 20 61  llocZero() and a
db60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 72   pointer to it r
db70: 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
db80: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
db90: 69 6c 73 2c 20 28 2a 70 52 63 29 20 69 73 20 73  ils, (*pRc) is s
dba0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
dbb0: 45 4d 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  EM and NULL is r
dbc0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
dbd0: 69 63 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 66  ic Fts5Colset *f
dbe0: 74 73 35 43 6c 6f 6e 65 43 6f 6c 73 65 74 28 69  ts5CloneColset(i
dbf0: 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 43 6f 6c  nt *pRc, Fts5Col
dc00: 73 65 74 20 2a 70 4f 72 69 67 29 7b 0a 20 20 46  set *pOrig){.  F
dc10: 74 73 35 43 6f 6c 73 65 74 20 2a 70 52 65 74 3b  ts5Colset *pRet;
dc20: 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a  .  if( pOrig ){.
dc30: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
dc40: 73 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c 73 65  sizeof(Fts5Colse
dc50: 74 29 20 2b 20 28 70 4f 72 69 67 2d 3e 6e 43 6f  t) + (pOrig->nCo
dc60: 6c 2d 31 29 20 2a 20 73 69 7a 65 6f 66 28 69 6e  l-1) * sizeof(in
dc70: 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 28  t);.    pRet = (
dc80: 46 74 73 35 43 6f 6c 73 65 74 2a 29 73 71 6c 69  Fts5Colset*)sqli
dc90: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
dca0: 6f 28 70 52 63 2c 20 6e 42 79 74 65 29 3b 0a 20  o(pRc, nByte);. 
dcb0: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 20 0a     if( pRet ){ .
dcc0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 52 65        memcpy(pRe
dcd0: 74 2c 20 70 4f 72 69 67 2c 20 6e 42 79 74 65 29  t, pOrig, nByte)
dce0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
dcf0: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
dd00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
dd10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
dd20: 65 20 66 72 6f 6d 20 63 6f 6c 73 65 74 20 70 43  e from colset pC
dd30: 6f 6c 73 65 74 20 61 6e 79 20 63 6f 6c 75 6d 6e  olset any column
dd40: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
dd50: 6c 73 6f 20 69 6e 20 63 6f 6c 73 65 74 20 70 4d  lso in colset pM
dd60: 65 72 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erge..*/.static 
dd70: 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 43 6f  void fts5MergeCo
dd80: 6c 73 65 74 28 46 74 73 35 43 6f 6c 73 65 74 20  lset(Fts5Colset 
dd90: 2a 70 43 6f 6c 73 65 74 2c 20 46 74 73 35 43 6f  *pColset, Fts5Co
dda0: 6c 73 65 74 20 2a 70 4d 65 72 67 65 29 7b 0a 20  lset *pMerge){. 
ddb0: 20 69 6e 74 20 69 49 6e 20 3d 20 30 3b 20 20 20   int iIn = 0;   
ddc0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69         /* Next i
ddd0: 6e 70 75 74 20 69 6e 20 70 43 6f 6c 73 65 74 20  nput in pColset 
dde0: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 72 67 65 20  */.  int iMerge 
ddf0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  = 0;       /* Ne
de00: 78 74 20 69 6e 70 75 74 20 69 6e 20 70 4d 65 72  xt input in pMer
de10: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 75 74  ge */.  int iOut
de20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
de30: 20 4e 65 78 74 20 6f 75 74 70 75 74 20 73 6c 6f   Next output slo
de40: 74 20 69 6e 20 70 43 6f 6c 73 65 74 20 2a 2f 0a  t in pColset */.
de50: 0a 20 20 77 68 69 6c 65 28 20 69 49 6e 3c 70 43  .  while( iIn<pC
de60: 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 20 26 26 20 69  olset->nCol && i
de70: 4d 65 72 67 65 3c 70 4d 65 72 67 65 2d 3e 6e 43  Merge<pMerge->nC
de80: 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44  ol ){.    int iD
de90: 69 66 66 20 3d 20 70 43 6f 6c 73 65 74 2d 3e 61  iff = pColset->a
dea0: 69 43 6f 6c 5b 69 49 6e 5d 20 2d 20 70 4d 65 72  iCol[iIn] - pMer
deb0: 67 65 2d 3e 61 69 43 6f 6c 5b 69 4d 65 72 67 65  ge->aiCol[iMerge
dec0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 44 69 66 66  ];.    if( iDiff
ded0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  ==0 ){.      pCo
dee0: 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 4f 75 74  lset->aiCol[iOut
def0: 2b 2b 5d 20 3d 20 70 4d 65 72 67 65 2d 3e 61 69  ++] = pMerge->ai
df00: 43 6f 6c 5b 69 4d 65 72 67 65 5d 3b 0a 20 20 20  Col[iMerge];.   
df10: 20 20 20 69 4d 65 72 67 65 2b 2b 3b 0a 20 20 20     iMerge++;.   
df20: 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 7d 65     iIn++;.    }e
df30: 6c 73 65 20 69 66 28 20 69 44 69 66 66 3e 30 20  lse if( iDiff>0 
df40: 29 7b 0a 20 20 20 20 20 20 69 4d 65 72 67 65 2b  ){.      iMerge+
df50: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
df60: 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 7d      iIn++;.    }
df70: 0a 20 20 7d 0a 20 20 70 43 6f 6c 73 65 74 2d 3e  .  }.  pColset->
df80: 6e 43 6f 6c 20 3d 20 69 4f 75 74 3b 0a 7d 0a 0a  nCol = iOut;.}..
df90: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
dfa0: 79 20 61 70 70 6c 79 20 63 6f 6c 73 65 74 20 70  y apply colset p
dfb0: 43 6f 6c 73 65 74 20 74 6f 20 65 78 70 72 65 73  Colset to expres
dfc0: 73 69 6f 6e 20 6e 6f 64 65 20 70 4e 6f 64 65 20  sion node pNode 
dfd0: 61 6e 64 20 61 6c 6c 20 6f 66 0a 2a 2a 20 69 74  and all of.** it
dfe0: 73 20 64 65 63 65 6e 64 65 6e 74 73 2e 20 49 66  s decendents. If
dff0: 20 28 2a 70 70 46 72 65 65 29 20 69 73 20 6e 6f   (*ppFree) is no
e000: 74 20 4e 55 4c 4c 2c 20 69 74 20 63 6f 6e 74 61  t NULL, it conta
e010: 69 6e 73 20 61 20 73 70 61 72 65 20 63 6f 70 79  ins a spare copy
e020: 0a 2a 2a 20 6f 66 20 70 43 6f 6c 73 65 74 2e 20  .** of pColset. 
e030: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
e040: 79 20 75 73 65 20 74 68 65 20 73 70 61 72 65 20  y use the spare 
e050: 63 6f 70 79 20 61 6e 64 20 73 65 74 20 28 2a 70  copy and set (*p
e060: 70 46 72 65 65 29 20 74 6f 0a 2a 2a 20 7a 65 72  pFree) to.** zer
e070: 6f 2c 20 6f 72 20 69 74 20 6d 61 79 20 63 72 65  o, or it may cre
e080: 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 70 43  ate copies of pC
e090: 6f 6c 73 65 74 20 75 73 69 6e 67 20 66 74 73 35  olset using fts5
e0a0: 43 6c 6f 6e 65 43 6f 6c 73 65 74 28 29 2e 0a 2a  CloneColset()..*
e0b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e0c0: 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74  s5ParseSetColset
e0d0: 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70  (.  Fts5Parse *p
e0e0: 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78  Parse, .  Fts5Ex
e0f0: 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 0a  prNode *pNode, .
e100: 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
e110: 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 43 6f 6c  olset,.  Fts5Col
e120: 73 65 74 20 2a 2a 70 70 46 72 65 65 0a 29 7b 0a  set **ppFree.){.
e130: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63    if( pParse->rc
e140: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e150: 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65     assert( pNode
e160: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45  ->eType==FTS5_TE
e170: 52 4d 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79  RM || pNode->eTy
e180: 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20  pe==FTS5_STRING 
e190: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 6f  .         || pNo
e1a0: 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  de->eType==FTS5_
e1b0: 41 4e 44 20 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65  AND  || pNode->e
e1c0: 54 79 70 65 3d 3d 46 54 53 35 5f 4f 52 0a 20 20  Type==FTS5_OR.  
e1d0: 20 20 20 20 20 20 20 7c 7c 20 70 4e 6f 64 65 2d         || pNode-
e1e0: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f 54  >eType==FTS5_NOT
e1f0: 20 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70    || pNode->eTyp
e200: 65 3d 3d 46 54 53 35 5f 45 4f 46 0a 20 20 20 20  e==FTS5_EOF.    
e210: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65  );.    if( pNode
e220: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54  ->eType==FTS5_ST
e230: 52 49 4e 47 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65  RING || pNode->e
e240: 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20  Type==FTS5_TERM 
e250: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  ){.      Fts5Exp
e260: 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
e270: 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0a  = pNode->pNear;.
e280: 20 20 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d        if( pNear-
e290: 3e 70 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20  >pColset ){.    
e2a0: 20 20 20 20 66 74 73 35 4d 65 72 67 65 43 6f 6c      fts5MergeCol
e2b0: 73 65 74 28 70 4e 65 61 72 2d 3e 70 43 6f 6c 73  set(pNear->pCols
e2c0: 65 74 2c 20 70 43 6f 6c 73 65 74 29 3b 0a 20 20  et, pColset);.  
e2d0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d        if( pNear-
e2e0: 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d  >pColset->nCol==
e2f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
e300: 4e 6f 64 65 2d 3e 65 54 79 70 65 20 3d 20 46 54  Node->eType = FT
e310: 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20 20 20 20  S5_EOF;.        
e320: 20 20 70 4e 6f 64 65 2d 3e 78 4e 65 78 74 20 3d    pNode->xNext =
e330: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
e340: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 70      }else if( *p
e350: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  pFree ){.       
e360: 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20   pNear->pColset 
e370: 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20  = pColset;.     
e380: 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a     *ppFree = 0;.
e390: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e3a0: 20 20 20 20 20 70 4e 65 61 72 2d 3e 70 43 6f 6c       pNear->pCol
e3b0: 73 65 74 20 3d 20 66 74 73 35 43 6c 6f 6e 65 43  set = fts5CloneC
e3c0: 6f 6c 73 65 74 28 26 70 50 61 72 73 65 2d 3e 72  olset(&pParse->r
e3d0: 63 2c 20 70 43 6f 6c 73 65 74 29 3b 0a 20 20 20  c, pColset);.   
e3e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e3f0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
e400: 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65     assert( pNode
e410: 2d 3e 65 54 79 70 65 21 3d 46 54 53 35 5f 45 4f  ->eType!=FTS5_EO
e420: 46 20 7c 7c 20 70 4e 6f 64 65 2d 3e 6e 43 68 69  F || pNode->nChi
e430: 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  ld==0 );.      f
e440: 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d  or(i=0; i<pNode-
e450: 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nChild; i++){. 
e460: 20 20 20 20 20 20 20 66 74 73 35 50 61 72 73 65         fts5Parse
e470: 53 65 74 43 6f 6c 73 65 74 28 70 50 61 72 73 65  SetColset(pParse
e480: 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  , pNode->apChild
e490: 5b 69 5d 2c 20 70 43 6f 6c 73 65 74 2c 20 70 70  [i], pColset, pp
e4a0: 46 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Free);.      }. 
e4b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e4c0: 2a 20 41 70 70 6c 79 20 63 6f 6c 73 65 74 20 70  * Apply colset p
e4d0: 43 6f 6c 73 65 74 20 74 6f 20 65 78 70 72 65 73  Colset to expres
e4e0: 73 69 6f 6e 20 6e 6f 64 65 20 70 45 78 70 72 20  sion node pExpr 
e4f0: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 64  and all of its d
e500: 65 73 63 65 6e 64 65 6e 74 73 2e 0a 2a 2f 0a 76  escendents..*/.v
e510: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
e520: 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28 0a 20  arseSetColset(. 
e530: 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
e540: 73 65 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e  se, .  Fts5ExprN
e550: 6f 64 65 20 2a 70 45 78 70 72 2c 20 0a 20 20 46  ode *pExpr, .  F
e560: 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
e570: 65 74 20 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6c  et .){.  Fts5Col
e580: 73 65 74 20 2a 70 46 72 65 65 20 3d 20 70 43 6f  set *pFree = pCo
e590: 6c 73 65 74 3b 0a 20 20 69 66 28 20 70 50 61 72  lset;.  if( pPar
e5a0: 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  se->pConfig->eDe
e5b0: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
e5c0: 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 50  L_NONE ){.    pP
e5d0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
e5e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 50 61  E_ERROR;.    pPa
e5f0: 72 73 65 2d 3e 7a 45 72 72 20 3d 20 73 71 6c 69  rse->zErr = sqli
e600: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
e610: 20 20 20 22 66 74 73 35 3a 20 63 6f 6c 75 6d 6e     "fts5: column
e620: 20 71 75 65 72 69 65 73 20 61 72 65 20 6e 6f 74   queries are not
e630: 20 73 75 70 70 6f 72 74 65 64 20 28 64 65 74 61   supported (deta
e640: 69 6c 3d 6e 6f 6e 65 29 22 0a 20 20 20 20 29 3b  il=none)".    );
e650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
e660: 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74  s5ParseSetColset
e670: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
e680: 70 43 6f 6c 73 65 74 2c 20 26 70 46 72 65 65 29  pColset, &pFree)
e690: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
e6a0: 66 72 65 65 28 70 46 72 65 65 29 3b 0a 7d 0a 0a  free(pFree);.}..
e6b0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e6c0: 45 78 70 72 41 73 73 69 67 6e 58 4e 65 78 74 28  ExprAssignXNext(
e6d0: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
e6e0: 6f 64 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ode){.  switch( 
e6f0: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a  pNode->eType ){.
e700: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 53 54      case FTS5_ST
e710: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 46 74  RING: {.      Ft
e720: 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70  s5ExprNearset *p
e730: 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e  Near = pNode->pN
e740: 65 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ear;.      if( p
e750: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3d 3d 31  Near->nPhrase==1
e760: 20 26 26 20 70 4e 65 61 72 2d 3e 61 70 50 68 72   && pNear->apPhr
e770: 61 73 65 5b 30 5d 2d 3e 6e 54 65 72 6d 3d 3d 31  ase[0]->nTerm==1
e780: 20 0a 20 20 20 20 20 20 20 26 26 20 70 4e 65 61   .       && pNea
e790: 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e  r->apPhrase[0]->
e7a0: 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79  aTerm[0].pSynony
e7b0: 6d 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  m==0.       && p
e7c0: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
e7d0: 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72  ]->aTerm[0].bFir
e7e0: 73 74 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  st==0.      ){. 
e7f0: 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 65 54         pNode->eT
e800: 79 70 65 20 3d 20 46 54 53 35 5f 54 45 52 4d 3b  ype = FTS5_TERM;
e810: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  .        pNode->
e820: 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70 72  xNext = fts5Expr
e830: 4e 6f 64 65 4e 65 78 74 5f 54 45 52 4d 3b 0a 20  NodeNext_TERM;. 
e840: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e850: 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65 78 74      pNode->xNext
e860: 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e   = fts5ExprNodeN
e870: 65 78 74 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20  ext_STRING;.    
e880: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e890: 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 63 61 73  .    };..    cas
e8a0: 65 20 46 54 53 35 5f 4f 52 3a 20 7b 0a 20 20 20  e FTS5_OR: {.   
e8b0: 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65 78 74 20     pNode->xNext 
e8c0: 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  = fts5ExprNodeNe
e8d0: 78 74 5f 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  xt_OR;.      bre
e8e0: 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20  ak;.    };..    
e8f0: 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a 20 7b  case FTS5_AND: {
e900: 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e  .      pNode->xN
e910: 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f  ext = fts5ExprNo
e920: 64 65 4e 65 78 74 5f 41 4e 44 3b 0a 20 20 20 20  deNext_AND;.    
e930: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a    break;.    };.
e940: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
e950: 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79  sert( pNode->eTy
e960: 70 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29 3b 20  pe==FTS5_NOT ); 
e970: 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78  {.      pNode->x
e980: 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e  Next = fts5ExprN
e990: 6f 64 65 4e 65 78 74 5f 4e 4f 54 3b 0a 20 20 20  odeNext_NOT;.   
e9a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b     break;.    };
e9b0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
e9c0: 6f 69 64 20 66 74 73 35 45 78 70 72 41 64 64 43  oid fts5ExprAddC
e9d0: 68 69 6c 64 72 65 6e 28 46 74 73 35 45 78 70 72  hildren(Fts5Expr
e9e0: 4e 6f 64 65 20 2a 70 2c 20 46 74 73 35 45 78 70  Node *p, Fts5Exp
e9f0: 72 4e 6f 64 65 20 2a 70 53 75 62 29 7b 0a 20 20  rNode *pSub){.  
ea00: 69 66 28 20 70 2d 3e 65 54 79 70 65 21 3d 46 54  if( p->eType!=FT
ea10: 53 35 5f 4e 4f 54 20 26 26 20 70 53 75 62 2d 3e  S5_NOT && pSub->
ea20: 65 54 79 70 65 3d 3d 70 2d 3e 65 54 79 70 65 20  eType==p->eType 
ea30: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
ea40: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78   = sizeof(Fts5Ex
ea50: 70 72 4e 6f 64 65 2a 29 20 2a 20 70 53 75 62 2d  prNode*) * pSub-
ea60: 3e 6e 43 68 69 6c 64 3b 0a 20 20 20 20 6d 65 6d  >nChild;.    mem
ea70: 63 70 79 28 26 70 2d 3e 61 70 43 68 69 6c 64 5b  cpy(&p->apChild[
ea80: 70 2d 3e 6e 43 68 69 6c 64 5d 2c 20 70 53 75 62  p->nChild], pSub
ea90: 2d 3e 61 70 43 68 69 6c 64 2c 20 6e 42 79 74 65  ->apChild, nByte
eaa0: 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 68 69 6c 64  );.    p->nChild
eab0: 20 2b 3d 20 70 53 75 62 2d 3e 6e 43 68 69 6c 64   += pSub->nChild
eac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
ead0: 65 65 28 70 53 75 62 29 3b 0a 20 20 7d 65 6c 73  ee(pSub);.  }els
eae0: 65 7b 0a 20 20 20 20 70 2d 3e 61 70 43 68 69 6c  e{.    p->apChil
eaf0: 64 5b 70 2d 3e 6e 43 68 69 6c 64 2b 2b 5d 20 3d  d[p->nChild++] =
eb00: 20 70 53 75 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pSub;.  }.}../*
eb10: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
eb20: 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 65 78   return a new ex
eb30: 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e  pression object.
eb40: 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
eb50: 73 20 77 72 6f 6e 67 20 28 69 2e 65 2e 0a 2a 2a  s wrong (i.e..**
eb60: 20 4f 4f 4d 20 65 72 72 6f 72 29 2c 20 6c 65 61   OOM error), lea
eb70: 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ve an error code
eb80: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
eb90: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 46  eturn NULL..*/.F
eba0: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 73 71 6c  ts5ExprNode *sql
ebb0: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64  ite3Fts5ParseNod
ebc0: 65 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a  e(.  Fts5Parse *
ebd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
ebe0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
ebf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
ec00: 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
ec10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
ec20: 53 35 5f 53 54 52 49 4e 47 2c 20 41 4e 44 2c 20  S5_STRING, AND, 
ec30: 4f 52 20 6f 72 20 4e 4f 54 20 2a 2f 0a 20 20 46  OR or NOT */.  F
ec40: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4c 65  ts5ExprNode *pLe
ec50: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
ec60: 2a 20 4c 65 66 74 20 68 61 6e 64 20 63 68 69 6c  * Left hand chil
ec70: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  d expression */.
ec80: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
ec90: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
eca0: 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20    /* Right hand 
ecb0: 63 68 69 6c 64 20 65 78 70 72 65 73 73 69 6f 6e  child expression
ecc0: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 65   */.  Fts5ExprNe
ecd0: 61 72 73 65 74 20 2a 70 4e 65 61 72 20 20 20 20  arset *pNear    
ece0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 53 54 52        /* For STR
ecf0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ING expressions,
ed00: 20 74 68 65 20 6e 65 61 72 20 63 6c 75 73 74 65   the near cluste
ed10: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 45 78  r */.){.  Fts5Ex
ed20: 70 72 4e 6f 64 65 20 2a 70 52 65 74 20 3d 20 30  prNode *pRet = 0
ed30: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
ed40: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
ed50: 7b 0a 20 20 20 20 69 6e 74 20 6e 43 68 69 6c 64  {.    int nChild
ed60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ed70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ed80: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 72 65 74   children of ret
ed90: 75 72 6e 65 64 20 6e 6f 64 65 20 2a 2f 0a 20 20  urned node */.  
eda0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
edd0: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  e to allocate fo
ede0: 72 20 74 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20  r this node */. 
edf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 65 54  .    assert( (eT
ee00: 79 70 65 21 3d 46 54 53 35 5f 53 54 52 49 4e 47  ype!=FTS5_STRING
ee10: 20 26 26 20 21 70 4e 65 61 72 29 0a 20 20 20 20   && !pNear).    
ee20: 20 20 20 20 20 7c 7c 20 28 65 54 79 70 65 3d 3d       || (eType==
ee30: 46 54 53 35 5f 53 54 52 49 4e 47 20 26 26 20 21  FTS5_STRING && !
ee40: 70 4c 65 66 74 20 26 26 20 21 70 52 69 67 68 74  pLeft && !pRight
ee50: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
ee60: 20 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52   eType==FTS5_STR
ee70: 49 4e 47 20 26 26 20 70 4e 65 61 72 3d 3d 30 20  ING && pNear==0 
ee80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
ee90: 69 66 28 20 65 54 79 70 65 21 3d 46 54 53 35 5f  if( eType!=FTS5_
eea0: 53 54 52 49 4e 47 20 26 26 20 70 4c 65 66 74 3d  STRING && pLeft=
eeb0: 3d 30 20 29 20 72 65 74 75 72 6e 20 70 52 69 67  =0 ) return pRig
eec0: 68 74 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70  ht;.    if( eTyp
eed0: 65 21 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 26  e!=FTS5_STRING &
eee0: 26 20 70 52 69 67 68 74 3d 3d 30 20 29 20 72 65  & pRight==0 ) re
eef0: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 0a 20 20 20  turn pLeft;..   
ef00: 20 69 66 28 20 65 54 79 70 65 3d 3d 46 54 53 35   if( eType==FTS5
ef10: 5f 4e 4f 54 20 29 7b 0a 20 20 20 20 20 20 6e 43  _NOT ){.      nC
ef20: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 65  hild = 2;.    }e
ef30: 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 46  lse if( eType==F
ef40: 54 53 35 5f 41 4e 44 20 7c 7c 20 65 54 79 70 65  TS5_AND || eType
ef50: 3d 3d 46 54 53 35 5f 4f 52 20 29 7b 0a 20 20 20  ==FTS5_OR ){.   
ef60: 20 20 20 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20     nChild = 2;. 
ef70: 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
ef80: 65 54 79 70 65 3d 3d 65 54 79 70 65 20 29 20 6e  eType==eType ) n
ef90: 43 68 69 6c 64 20 2b 3d 20 70 4c 65 66 74 2d 3e  Child += pLeft->
efa0: 6e 43 68 69 6c 64 2d 31 3b 0a 20 20 20 20 20 20  nChild-1;.      
efb0: 69 66 28 20 70 52 69 67 68 74 2d 3e 65 54 79 70  if( pRight->eTyp
efc0: 65 3d 3d 65 54 79 70 65 20 29 20 6e 43 68 69 6c  e==eType ) nChil
efd0: 64 20 2b 3d 20 70 52 69 67 68 74 2d 3e 6e 43 68  d += pRight->nCh
efe0: 69 6c 64 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  ild-1;.    }..  
eff0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
f000: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 29 20 2b  (Fts5ExprNode) +
f010: 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
f020: 4e 6f 64 65 2a 29 2a 28 6e 43 68 69 6c 64 2d 31  Node*)*(nChild-1
f030: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 28 46  );.    pRet = (F
f040: 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 73 71 6c  ts5ExprNode*)sql
f050: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
f060: 72 6f 28 26 70 50 61 72 73 65 2d 3e 72 63 2c 20  ro(&pParse->rc, 
f070: 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20 69 66 28  nByte);..    if(
f080: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70   pRet ){.      p
f090: 52 65 74 2d 3e 65 54 79 70 65 20 3d 20 65 54 79  Ret->eType = eTy
f0a0: 70 65 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  pe;.      pRet->
f0b0: 70 4e 65 61 72 20 3d 20 70 4e 65 61 72 3b 0a 20  pNear = pNear;. 
f0c0: 20 20 20 20 20 66 74 73 35 45 78 70 72 41 73 73       fts5ExprAss
f0d0: 69 67 6e 58 4e 65 78 74 28 70 52 65 74 29 3b 0a  ignXNext(pRet);.
f0e0: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
f0f0: 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 29 7b 0a  =FTS5_STRING ){.
f100: 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 68 72          int iPhr
f110: 61 73 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ase;.        for
f120: 28 69 50 68 72 61 73 65 3d 30 3b 20 69 50 68 72  (iPhrase=0; iPhr
f130: 61 73 65 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61  ase<pNear->nPhra
f140: 73 65 3b 20 69 50 68 72 61 73 65 2b 2b 29 7b 0a  se; iPhrase++){.
f150: 20 20 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d            pNear-
f160: 3e 61 70 50 68 72 61 73 65 5b 69 50 68 72 61 73  >apPhrase[iPhras
f170: 65 5d 2d 3e 70 4e 6f 64 65 20 3d 20 70 52 65 74  e]->pNode = pRet
f180: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f190: 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b  pNear->apPhrase[
f1a0: 69 50 68 72 61 73 65 5d 2d 3e 6e 54 65 72 6d 3d  iPhrase]->nTerm=
f1b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f1c0: 20 20 70 52 65 74 2d 3e 78 4e 65 78 74 20 3d 20    pRet->xNext = 
f1d0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
f1e0: 52 65 74 2d 3e 65 54 79 70 65 20 3d 20 46 54 53  Ret->eType = FTS
f1f0: 35 5f 45 4f 46 3b 0a 20 20 20 20 20 20 20 20 20  5_EOF;.         
f200: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
f210: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
f220: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
f230: 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
f240: 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  FULL ){.        
f250: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
f260: 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61   *pPhrase = pNea
f270: 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 3b 0a  r->apPhrase[0];.
f280: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
f290: 65 61 72 2d 3e 6e 50 68 72 61 73 65 21 3d 31 20  ear->nPhrase!=1 
f2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
f2b0: 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 31 0a  Phrase->nTerm>1.
f2c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
f2d0: 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 30 20  Phrase->nTerm>0 
f2e0: 26 26 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72  && pPhrase->aTer
f2f0: 6d 5b 30 5d 2e 62 46 69 72 73 74 29 0a 20 20 20  m[0].bFirst).   
f300: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
f310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f320: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
f330: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _OK );.         
f340: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
f350: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
f360: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
f370: 28 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 3d 3d  ( pParse->zErr==
f380: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
f390: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 20 3d 20   pParse->zErr = 
f3a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
f3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f3c0: 20 22 66 74 73 35 3a 20 25 73 20 71 75 65 72 69   "fts5: %s queri
f3d0: 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f  es are not suppo
f3e0: 72 74 65 64 20 28 64 65 74 61 69 6c 21 3d 66 75  rted (detail!=fu
f3f0: 6c 6c 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ll)", .         
f400: 20 20 20 20 20 20 20 70 4e 65 61 72 2d 3e 6e 50         pNear->nP
f410: 68 72 61 73 65 3d 3d 31 20 3f 20 22 70 68 72 61  hrase==1 ? "phra
f420: 73 65 22 3a 20 22 4e 45 41 52 22 0a 20 20 20 20  se": "NEAR".    
f430: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
f440: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f450: 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b 0a 20  e3_free(pRet);. 
f460: 20 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20             pRet 
f470: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
f480: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f4a0: 66 74 73 35 45 78 70 72 41 64 64 43 68 69 6c 64  fts5ExprAddChild
f4b0: 72 65 6e 28 70 52 65 74 2c 20 70 4c 65 66 74 29  ren(pRet, pLeft)
f4c0: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 45 78  ;.        fts5Ex
f4d0: 70 72 41 64 64 43 68 69 6c 64 72 65 6e 28 70 52  prAddChildren(pR
f4e0: 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  et, pRight);.   
f4f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
f500: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
f510: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f520: 72 73 65 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  rse->rc!=SQLITE_
f530: 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OK );.    sqlite
f540: 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72  3Fts5ParseNodeFr
f550: 65 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  ee(pLeft);.    s
f560: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
f570: 6f 64 65 46 72 65 65 28 70 52 69 67 68 74 29 3b  odeFree(pRight);
f580: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
f590: 50 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65  ParseNearsetFree
f5a0: 28 70 4e 65 61 72 29 3b 0a 20 20 7d 0a 20 20 72  (pNear);.  }.  r
f5b0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 46  eturn pRet;.}..F
f5c0: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 73 71 6c  ts5ExprNode *sql
f5d0: 69 74 65 33 46 74 73 35 50 61 72 73 65 49 6d 70  ite3Fts5ParseImp
f5e0: 6c 69 63 69 74 41 6e 64 28 0a 20 20 46 74 73 35  licitAnd(.  Fts5
f5f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f610: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
f620: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
f630: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
f640: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 63    /* Left hand c
f650: 68 69 6c 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hild expression 
f660: 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  */.  Fts5ExprNod
f670: 65 20 2a 70 52 69 67 68 74 20 20 20 20 20 20 20  e *pRight       
f680: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61       /* Right ha
f690: 6e 64 20 63 68 69 6c 64 20 65 78 70 72 65 73 73  nd child express
f6a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ion */.){.  Fts5
f6b0: 45 78 70 72 4e 6f 64 65 20 2a 70 52 65 74 20 3d  ExprNode *pRet =
f6c0: 20 30 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f   0;.  Fts5ExprNo
f6d0: 64 65 20 2a 70 50 72 65 76 3b 0a 0a 20 20 69 66  de *pPrev;..  if
f6e0: 28 20 70 50 61 72 73 65 2d 3e 72 63 20 29 7b 0a  ( pParse->rc ){.
f6f0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
f700: 61 72 73 65 4e 6f 64 65 46 72 65 65 28 70 4c 65  arseNodeFree(pLe
f710: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
f720: 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65  Fts5ParseNodeFre
f730: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  e(pRight);.  }el
f740: 73 65 7b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  se{..    assert(
f750: 20 70 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46   pLeft->eType==F
f760: 54 53 35 5f 53 54 52 49 4e 47 20 0a 20 20 20 20  TS5_STRING .    
f770: 20 20 20 20 7c 7c 20 70 4c 65 66 74 2d 3e 65 54      || pLeft->eT
f780: 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 0a 20  ype==FTS5_TERM. 
f790: 20 20 20 20 20 20 20 7c 7c 20 70 4c 65 66 74 2d         || pLeft-
f7a0: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46  >eType==FTS5_EOF
f7b0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 65 66  .        || pLef
f7c0: 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 41  t->eType==FTS5_A
f7d0: 4e 44 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  ND.    );.    as
f7e0: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 65 54  sert( pRight->eT
f7f0: 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47  ype==FTS5_STRING
f800: 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 52 69   .        || pRi
f810: 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ght->eType==FTS5
f820: 5f 54 45 52 4d 20 0a 20 20 20 20 20 20 20 20 7c  _TERM .        |
f830: 7c 20 70 52 69 67 68 74 2d 3e 65 54 79 70 65 3d  | pRight->eType=
f840: 3d 46 54 53 35 5f 45 4f 46 20 0a 20 20 20 20 29  =FTS5_EOF .    )
f850: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  ;..    if( pLeft
f860: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 41 4e  ->eType==FTS5_AN
f870: 44 20 29 7b 0a 20 20 20 20 20 20 70 50 72 65 76  D ){.      pPrev
f880: 20 3d 20 70 4c 65 66 74 2d 3e 61 70 43 68 69 6c   = pLeft->apChil
f890: 64 5b 70 4c 65 66 74 2d 3e 6e 43 68 69 6c 64 2d  d[pLeft->nChild-
f8a0: 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1];.    }else{. 
f8b0: 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 4c 65       pPrev = pLe
f8c0: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ft;.    }.    as
f8d0: 73 65 72 74 28 20 70 50 72 65 76 2d 3e 65 54 79  sert( pPrev->eTy
f8e0: 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20  pe==FTS5_STRING 
f8f0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 50 72 65  .        || pPre
f900: 76 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54  v->eType==FTS5_T
f910: 45 52 4d 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  ERM .        || 
f920: 70 50 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46 54  pPrev->eType==FT
f930: 53 35 5f 45 4f 46 20 0a 20 20 20 20 20 20 20 20  S5_EOF .        
f940: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 69 67  );..    if( pRig
f950: 68 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  ht->eType==FTS5_
f960: 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 61 73 73  EOF ){.      ass
f970: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 50  ert( pParse->apP
f980: 68 72 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50  hrase[pParse->nP
f990: 68 72 61 73 65 2d 31 5d 3d 3d 70 52 69 67 68 74  hrase-1]==pRight
f9a0: 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  ->pNear->apPhras
f9b0: 65 5b 30 5d 20 29 3b 0a 20 20 20 20 20 20 73 71  e[0] );.      sq
f9c0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
f9d0: 64 65 46 72 65 65 28 70 52 69 67 68 74 29 3b 0a  deFree(pRight);.
f9e0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 4c 65        pRet = pLe
f9f0: 66 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ft;.      pParse
fa00: 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a 20 20 20  ->nPhrase--;.   
fa10: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
fa20: 70 50 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46 54  pPrev->eType==FT
fa30: 53 35 5f 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  S5_EOF ){.      
fa40: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
fa50: 2a 61 70 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  *ap;..      if( 
fa60: 70 50 72 65 76 3d 3d 70 4c 65 66 74 20 29 7b 0a  pPrev==pLeft ){.
fa70: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70          pRet = p
fa80: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c  Right;.      }el
fa90: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  se{.        pLef
faa0: 74 2d 3e 61 70 43 68 69 6c 64 5b 70 4c 65 66 74  t->apChild[pLeft
fab0: 2d 3e 6e 43 68 69 6c 64 2d 31 5d 20 3d 20 70 52  ->nChild-1] = pR
fac0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52  ight;.        pR
fad0: 65 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  et = pLeft;.    
fae0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 70 20 3d 20    }..      ap = 
faf0: 26 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73  &pParse->apPhras
fb00: 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73  e[pParse->nPhras
fb10: 65 2d 31 2d 70 52 69 67 68 74 2d 3e 70 4e 65 61  e-1-pRight->pNea
fb20: 72 2d 3e 6e 50 68 72 61 73 65 5d 3b 0a 20 20 20  r->nPhrase];.   
fb30: 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 30 5d     assert( ap[0]
fb40: 3d 3d 70 50 72 65 76 2d 3e 70 4e 65 61 72 2d 3e  ==pPrev->pNear->
fb50: 61 70 50 68 72 61 73 65 5b 30 5d 20 29 3b 0a 20  apPhrase[0] );. 
fb60: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61 70 2c       memmove(ap,
fb70: 20 26 61 70 5b 31 5d 2c 20 73 69 7a 65 6f 66 28   &ap[1], sizeof(
fb80: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29  Fts5ExprPhrase*)
fb90: 2a 70 52 69 67 68 74 2d 3e 70 4e 65 61 72 2d 3e  *pRight->pNear->
fba0: 6e 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20  nPhrase);.      
fbb0: 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d  pParse->nPhrase-
fbc0: 2d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  -;..      sqlite
fbd0: 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46 72  3Fts5ParseNodeFr
fbe0: 65 65 28 70 50 72 65 76 29 3b 0a 20 20 20 20 7d  ee(pPrev);.    }
fbf0: 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
fc00: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 46   pRet = sqlite3F
fc10: 74 73 35 50 61 72 73 65 4e 6f 64 65 28 70 50 61  ts5ParseNode(pPa
fc20: 72 73 65 2c 20 46 54 53 35 5f 41 4e 44 2c 20 70  rse, FTS5_AND, p
fc30: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
fc40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
fc50: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73  eturn pRet;.}..s
fc60: 74 61 74 69 63 20 63 68 61 72 20 2a 66 74 73 35  tatic char *fts5
fc70: 45 78 70 72 54 65 72 6d 50 72 69 6e 74 28 46 74  ExprTermPrint(Ft
fc80: 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72  s5ExprTerm *pTer
fc90: 6d 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  m){.  int nByte 
fca0: 3d 20 30 3b 0a 20 20 46 74 73 35 45 78 70 72 54  = 0;.  Fts5ExprT
fcb0: 65 72 6d 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a  erm *p;.  char *
fcc0: 7a 51 75 6f 74 65 64 3b 0a 0a 20 20 2f 2a 20 44  zQuoted;..  /* D
fcd0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
fce0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 73  imum amount of s
fcf0: 70 61 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a  pace required. *
fd00: 2f 0a 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b  /.  for(p=pTerm;
fd10: 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79   p; p=p->pSynony
fd20: 6d 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d  m){.    nByte +=
fd30: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 54 65   (int)strlen(pTe
fd40: 72 6d 2d 3e 7a 54 65 72 6d 29 20 2a 20 32 20 2b  rm->zTerm) * 2 +
fd50: 20 33 20 2b 20 32 3b 0a 20 20 7d 0a 20 20 7a 51   3 + 2;.  }.  zQ
fd60: 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  uoted = sqlite3_
fd70: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 0a  malloc(nByte);..
fd80: 20 20 69 66 28 20 7a 51 75 6f 74 65 64 20 29 7b    if( zQuoted ){
fd90: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
fda0: 20 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b      for(p=pTerm;
fdb0: 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79   p; p=p->pSynony
fdc0: 6d 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  m){.      char *
fdd0: 7a 49 6e 20 3d 20 70 2d 3e 7a 54 65 72 6d 3b 0a  zIn = p->zTerm;.
fde0: 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b        zQuoted[i+
fdf0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20  +] = '"';.      
fe00: 77 68 69 6c 65 28 20 2a 7a 49 6e 20 29 7b 0a 20  while( *zIn ){. 
fe10: 20 20 20 20 20 20 20 69 66 28 20 2a 7a 49 6e 3d         if( *zIn=
fe20: 3d 27 22 27 20 29 20 7a 51 75 6f 74 65 64 5b 69  ='"' ) zQuoted[i
fe30: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20  ++] = '"';.     
fe40: 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20     zQuoted[i++] 
fe50: 3d 20 2a 7a 49 6e 2b 2b 3b 0a 20 20 20 20 20 20  = *zIn++;.      
fe60: 7d 0a 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b  }.      zQuoted[
fe70: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20  i++] = '"';.    
fe80: 20 20 69 66 28 20 70 2d 3e 70 53 79 6e 6f 6e 79    if( p->pSynony
fe90: 6d 20 29 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d  m ) zQuoted[i++]
fea0: 20 3d 20 27 7c 27 3b 0a 20 20 20 20 7d 0a 20 20   = '|';.    }.  
feb0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 62 50 72    if( pTerm->bPr
fec0: 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 7a 51  efix ){.      zQ
fed0: 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 20 27  uoted[i++] = ' '
fee0: 3b 0a 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b  ;.      zQuoted[
fef0: 69 2b 2b 5d 20 3d 20 27 2a 27 3b 0a 20 20 20 20  i++] = '*';.    
ff00: 7d 0a 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b  }.    zQuoted[i+
ff10: 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  +] = '\0';.  }. 
ff20: 20 72 65 74 75 72 6e 20 7a 51 75 6f 74 65 64 3b   return zQuoted;
ff30: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20  .}..static char 
ff40: 2a 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e  *fts5PrintfAppen
ff50: 64 28 63 68 61 72 20 2a 7a 41 70 70 2c 20 63 6f  d(char *zApp, co
ff60: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
ff70: 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ...){.  char *zN
ff80: 65 77 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  ew;.  va_list ap
ff90: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
ffa0: 20 7a 46 6d 74 29 3b 0a 20 20 7a 4e 65 77 20 3d   zFmt);.  zNew =
ffb0: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
ffc0: 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76  f(zFmt, ap);.  v
ffd0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
ffe0: 20 7a 41 70 70 20 26 26 20 7a 4e 65 77 20 29 7b   zApp && zNew ){
fff0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 32  .    char *zNew2
10000 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10010 74 66 28 22 25 73 25 73 22 2c 20 7a 41 70 70 2c  tf("%s%s", zApp,
10020 20 7a 4e 65 77 29 3b 0a 20 20 20 20 73 71 6c 69   zNew);.    sqli
10030 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 29 3b 0a  te3_free(zNew);.
10040 20 20 20 20 7a 4e 65 77 20 3d 20 7a 4e 65 77 32      zNew = zNew2
10050 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10060 66 72 65 65 28 7a 41 70 70 29 3b 0a 20 20 72 65  free(zApp);.  re
10070 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn zNew;.}../*
10080 0a 2a 2a 20 43 6f 6d 70 6f 73 65 20 61 20 74 63  .** Compose a tc
10090 6c 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65  l-readable repre
100a0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 65 78 70  sentation of exp
100b0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 52  ression pExpr. R
100c0 65 74 75 72 6e 20 61 20 0a 2a 2a 20 70 6f 69 6e  eturn a .** poin
100d0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
100e0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 61 74 20  containing that 
100f0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
10100 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
10110 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
10120 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 74  the caller to at
10130 20 73 6f 6d 65 20 70 6f 69 6e 74 20 66 72 65 65   some point free
10140 20 74 68 65 20 62 75 66 66 65 72 20 75 73 69 6e   the buffer usin
10150 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72  g .** sqlite3_fr
10160 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
10170 63 68 61 72 20 2a 66 74 73 35 45 78 70 72 50 72  char *fts5ExprPr
10180 69 6e 74 54 63 6c 28 0a 20 20 46 74 73 35 43 6f  intTcl(.  Fts5Co
10190 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a  nfig *pConfig, .
101a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
101b0 65 61 72 73 65 74 43 6d 64 2c 0a 20 20 46 74 73  earsetCmd,.  Fts
101c0 35 45 78 70 72 4e 6f 64 65 20 2a 70 45 78 70 72  5ExprNode *pExpr
101d0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74  .){.  char *zRet
101e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70   = 0;.  if( pExp
101f0 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53  r->eType==FTS5_S
10200 54 52 49 4e 47 20 7c 7c 20 70 45 78 70 72 2d 3e  TRING || pExpr->
10210 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d  eType==FTS5_TERM
10220 20 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72   ){.    Fts5Expr
10230 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d  Nearset *pNear =
10240 20 70 45 78 70 72 2d 3e 70 4e 65 61 72 3b 0a 20   pExpr->pNear;. 
10250 20 20 20 69 6e 74 20 69 3b 20 0a 20 20 20 20 69     int i; .    i
10260 6e 74 20 69 54 65 72 6d 3b 0a 0a 20 20 20 20 7a  nt iTerm;..    z
10270 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66  Ret = fts5Printf
10280 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 25 73  Append(zRet, "%s
10290 20 22 2c 20 7a 4e 65 61 72 73 65 74 43 6d 64 29   ", zNearsetCmd)
102a0 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d  ;.    if( zRet==
102b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
102c0 20 20 69 66 28 20 70 4e 65 61 72 2d 3e 70 43 6f    if( pNear->pCo
102d0 6c 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  lset ){.      in
102e0 74 20 2a 61 69 43 6f 6c 20 3d 20 70 4e 65 61 72  t *aiCol = pNear
102f0 2d 3e 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  ->pColset->aiCol
10300 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  ;.      int nCol
10310 20 3d 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65   = pNear->pColse
10320 74 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69  t->nCol;.      i
10330 66 28 20 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20  f( nCol==1 ){.  
10340 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
10350 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
10360 65 74 2c 20 22 2d 63 6f 6c 20 25 64 20 22 2c 20  et, "-col %d ", 
10370 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20  aiCol[0]);.     
10380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10390 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74  zRet = fts5Print
103a0 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2d  fAppend(zRet, "-
103b0 63 6f 6c 20 7b 25 64 22 2c 20 61 69 43 6f 6c 5b  col {%d", aiCol[
103c0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
103d0 28 69 3d 31 3b 20 69 3c 70 4e 65 61 72 2d 3e 70  (i=1; i<pNear->p
103e0 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b  Colset->nCol; i+
103f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52  +){.          zR
10400 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
10410 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 20 25 64  ppend(zRet, " %d
10420 22 2c 20 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", aiCol[i]);.  
10430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10440 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74  zRet = fts5Print
10450 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 7d  fAppend(zRet, "}
10460 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ");.      }.   
10470 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29     if( zRet==0 )
10480 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10490 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d  ..    if( pNear-
104a0 3e 6e 50 68 72 61 73 65 3e 31 20 29 7b 0a 20 20  >nPhrase>1 ){.  
104b0 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50      zRet = fts5P
104c0 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74  rintfAppend(zRet
104d0 2c 20 22 2d 6e 65 61 72 20 25 64 20 22 2c 20 70  , "-near %d ", p
104e0 4e 65 61 72 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20  Near->nNear);.  
104f0 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20      if( zRet==0 
10500 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
10510 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 66 74  }..    zRet = ft
10520 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a  s5PrintfAppend(z
10530 52 65 74 2c 20 22 2d 2d 22 29 3b 0a 20 20 20 20  Ret, "--");.    
10540 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65  if( zRet==0 ) re
10550 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 66 6f 72  turn 0;..    for
10560 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e  (i=0; i<pNear->n
10570 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20  Phrase; i++){.  
10580 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
10590 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e  se *pPhrase = pN
105a0 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d  ear->apPhrase[i]
105b0 3b 0a 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20  ;..      zRet = 
105c0 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64  fts5PrintfAppend
105d0 28 7a 52 65 74 2c 20 22 20 7b 22 29 3b 0a 20 20  (zRet, " {");.  
105e0 20 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b      for(iTerm=0;
105f0 20 7a 52 65 74 20 26 26 20 69 54 65 72 6d 3c 70   zRet && iTerm<p
10600 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69  Phrase->nTerm; i
10610 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
10620 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70   char *zTerm = p
10630 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54  Phrase->aTerm[iT
10640 65 72 6d 5d 2e 7a 54 65 72 6d 3b 0a 20 20 20 20  erm].zTerm;.    
10650 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50      zRet = fts5P
10660 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74  rintfAppend(zRet
10670 2c 20 22 25 73 25 73 22 2c 20 69 54 65 72 6d 3d  , "%s%s", iTerm=
10680 3d 30 3f 22 22 3a 22 20 22 2c 20 7a 54 65 72 6d  =0?"":" ", zTerm
10690 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
106a0 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54  Phrase->aTerm[iT
106b0 65 72 6d 5d 2e 62 50 72 65 66 69 78 20 29 7b 0a  erm].bPrefix ){.
106c0 20 20 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d            zRet =
106d0 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e   fts5PrintfAppen
106e0 64 28 7a 52 65 74 2c 20 22 2a 22 29 3b 0a 20 20  d(zRet, "*");.  
106f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10700 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65 74 20  .      if( zRet 
10710 29 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69  ) zRet = fts5Pri
10720 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20  ntfAppend(zRet, 
10730 22 7d 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "}");.      if( 
10740 7a 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  zRet==0 ) return
10750 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c   0;.    }..  }el
10760 73 65 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e  se{.    char con
10770 73 74 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 20  st *zOp = 0;.   
10780 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 77 69 74   int i;.    swit
10790 63 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65  ch( pExpr->eType
107a0 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 46   ){.      case F
107b0 54 53 35 5f 41 4e 44 3a 20 7a 4f 70 20 3d 20 22  TS5_AND: zOp = "
107c0 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  AND"; break;.   
107d0 20 20 20 63 61 73 65 20 46 54 53 35 5f 4e 4f 54     case FTS5_NOT
107e0 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 62  : zOp = "NOT"; b
107f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
10800 75 6c 74 3a 20 0a 20 20 20 20 20 20 20 20 61 73  ult: .        as
10810 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65 54 79  sert( pExpr->eTy
10820 70 65 3d 3d 46 54 53 35 5f 4f 52 20 29 3b 0a 20  pe==FTS5_OR );. 
10830 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52         zOp = "OR
10840 22 3b 20 0a 20 20 20 20 20 20 20 20 62 72 65 61  "; .        brea
10850 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 52  k;.    }..    zR
10860 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  et = sqlite3_mpr
10870 69 6e 74 66 28 22 25 73 22 2c 20 7a 4f 70 29 3b  intf("%s", zOp);
10880 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 52  .    for(i=0; zR
10890 65 74 20 26 26 20 69 3c 70 45 78 70 72 2d 3e 6e  et && i<pExpr->n
108a0 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Child; i++){.   
108b0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 66 74 73     char *z = fts
108c0 35 45 78 70 72 50 72 69 6e 74 54 63 6c 28 70 43  5ExprPrintTcl(pC
108d0 6f 6e 66 69 67 2c 20 7a 4e 65 61 72 73 65 74 43  onfig, zNearsetC
108e0 6d 64 2c 20 70 45 78 70 72 2d 3e 61 70 43 68 69  md, pExpr->apChi
108f0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  ld[i]);.      if
10900 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  ( !z ){.        
10910 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65  sqlite3_free(zRe
10920 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  t);.        zRet
10930 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
10940 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20  e{.        zRet 
10950 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65  = fts5PrintfAppe
10960 6e 64 28 7a 52 65 74 2c 20 22 20 5b 25 7a 5d 22  nd(zRet, " [%z]"
10970 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , z);.      }.  
10980 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
10990 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69  n zRet;.}..stati
109a0 63 20 63 68 61 72 20 2a 66 74 73 35 45 78 70 72  c char *fts5Expr
109b0 50 72 69 6e 74 28 46 74 73 35 43 6f 6e 66 69 67  Print(Fts5Config
109c0 20 2a 70 43 6f 6e 66 69 67 2c 20 46 74 73 35 45   *pConfig, Fts5E
109d0 78 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 29 7b  xprNode *pExpr){
109e0 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
109f0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
10a00 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
10a10 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
10a20 70 72 69 6e 74 66 28 22 5c 22 5c 22 22 29 3b 0a  printf("\"\"");.
10a30 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 45    }else.  if( pE
10a40 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  xpr->eType==FTS5
10a50 5f 53 54 52 49 4e 47 20 7c 7c 20 70 45 78 70 72  _STRING || pExpr
10a60 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45  ->eType==FTS5_TE
10a70 52 4d 20 29 7b 0a 20 20 20 20 46 74 73 35 45 78  RM ){.    Fts5Ex
10a80 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
10a90 20 3d 20 70 45 78 70 72 2d 3e 70 4e 65 61 72 3b   = pExpr->pNear;
10aa0 0a 20 20 20 20 69 6e 74 20 69 3b 20 0a 20 20 20  .    int i; .   
10ab0 20 69 6e 74 20 69 54 65 72 6d 3b 0a 0a 20 20 20   int iTerm;..   
10ac0 20 69 66 28 20 70 4e 65 61 72 2d 3e 70 43 6f 6c   if( pNear->pCol
10ad0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  set ){.      int
10ae0 20 69 43 6f 6c 20 3d 20 70 4e 65 61 72 2d 3e 70   iCol = pNear->p
10af0 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d  Colset->aiCol[0]
10b00 3b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66  ;.      zRet = f
10b10 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
10b20 7a 52 65 74 2c 20 22 25 73 20 3a 20 22 2c 20 70  zRet, "%s : ", p
10b30 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 43  Config->azCol[iC
10b40 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ol]);.      if( 
10b50 7a 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  zRet==0 ) return
10b60 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   0;.    }..    i
10b70 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73  f( pNear->nPhras
10b80 65 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 52 65  e>1 ){.      zRe
10b90 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70  t = fts5PrintfAp
10ba0 70 65 6e 64 28 7a 52 65 74 2c 20 22 4e 45 41 52  pend(zRet, "NEAR
10bb0 28 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  (");.      if( z
10bc0 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ret==0 ) return 
10bd0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  0;.    }..    fo
10be0 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e  r(i=0; i<pNear->
10bf0 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20  nPhrase; i++){. 
10c00 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72       Fts5ExprPhr
10c10 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
10c20 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69  Near->apPhrase[i
10c30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  ];.      if( i!=
10c40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  0 ){.        zRe
10c50 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70  t = fts5PrintfAp
10c60 70 65 6e 64 28 7a 52 65 74 2c 20 22 20 22 29 3b  pend(zRet, " ");
10c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 52 65  .        if( zRe
10c80 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
10c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
10ca0 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72  or(iTerm=0; iTer
10cb0 6d 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  m<pPhrase->nTerm
10cc0 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; iTerm++){.    
10cd0 20 20 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 20      char *zTerm 
10ce0 3d 20 66 74 73 35 45 78 70 72 54 65 72 6d 50 72  = fts5ExprTermPr
10cf0 69 6e 74 28 26 70 50 68 72 61 73 65 2d 3e 61 54  int(&pPhrase->aT
10d00 65 72 6d 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20  erm[iTerm]);.   
10d10 20 20 20 20 20 69 66 28 20 7a 54 65 72 6d 20 29       if( zTerm )
10d20 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 74  {.          zRet
10d30 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
10d40 65 6e 64 28 7a 52 65 74 2c 20 22 25 73 25 73 22  end(zRet, "%s%s"
10d50 2c 20 69 54 65 72 6d 3d 3d 30 3f 22 22 3a 22 20  , iTerm==0?"":" 
10d60 2b 20 22 2c 20 7a 54 65 72 6d 29 3b 0a 20 20 20  + ", zTerm);.   
10d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
10d80 72 65 65 28 7a 54 65 72 6d 29 3b 0a 20 20 20 20  ree(zTerm);.    
10d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10da0 28 20 7a 54 65 72 6d 3d 3d 30 20 7c 7c 20 7a 52  ( zTerm==0 || zR
10db0 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
10dc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10dd0 7a 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  zRet);.         
10de0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
10df0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10e00 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 61   }..    if( pNea
10e10 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20 29 7b 0a  r->nPhrase>1 ){.
10e20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
10e30 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
10e40 65 74 2c 20 22 2c 20 25 64 29 22 2c 20 70 4e 65  et, ", %d)", pNe
10e50 61 72 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20 20 20  ar->nNear);.    
10e60 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20    if( zRet==0 ) 
10e70 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
10e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
10e90 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 70 20 3d 20  ar const *zOp = 
10ea0 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  0;.    int i;.. 
10eb0 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72     switch( pExpr
10ec0 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20  ->eType ){.     
10ed0 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a 20   case FTS5_AND: 
10ee0 7a 4f 70 20 3d 20 22 20 41 4e 44 20 22 3b 20 62  zOp = " AND "; b
10ef0 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
10f00 20 46 54 53 35 5f 4e 4f 54 3a 20 7a 4f 70 20 3d   FTS5_NOT: zOp =
10f10 20 22 20 4e 4f 54 20 22 3b 20 62 72 65 61 6b 3b   " NOT "; break;
10f20 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
10f30 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
10f40 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d  ( pExpr->eType==
10f50 46 54 53 35 5f 4f 52 20 29 3b 0a 20 20 20 20 20  FTS5_OR );.     
10f60 20 20 20 7a 4f 70 20 3d 20 22 20 4f 52 20 22 3b     zOp = " OR ";
10f70 20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b   .        break;
10f80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
10f90 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 6e 43  i=0; i<pExpr->nC
10fa0 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  hild; i++){.    
10fb0 20 20 63 68 61 72 20 2a 7a 20 3d 20 66 74 73 35    char *z = fts5
10fc0 45 78 70 72 50 72 69 6e 74 28 70 43 6f 6e 66 69  ExprPrint(pConfi
10fd0 67 2c 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c  g, pExpr->apChil
10fe0 64 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  d[i]);.      if(
10ff0 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   z==0 ){.       
11000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
11010 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65  et);.        zRe
11020 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
11030 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
11040 65 20 3d 20 70 45 78 70 72 2d 3e 61 70 43 68 69  e = pExpr->apChi
11050 6c 64 5b 69 5d 2d 3e 65 54 79 70 65 3b 0a 20 20  ld[i]->eType;.  
11060 20 20 20 20 20 20 69 6e 74 20 62 20 3d 20 28 65        int b = (e
11070 21 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 26 26  !=FTS5_STRING &&
11080 20 65 21 3d 46 54 53 35 5f 54 45 52 4d 20 26 26   e!=FTS5_TERM &&
11090 20 65 21 3d 46 54 53 35 5f 45 4f 46 29 3b 0a 20   e!=FTS5_EOF);. 
110a0 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74         zRet = ft
110b0 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a  s5PrintfAppend(z
110c0 52 65 74 2c 20 22 25 73 25 73 25 7a 25 73 22 2c  Ret, "%s%s%z%s",
110d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 69   .            (i
110e0 3d 3d 30 20 3f 20 22 22 20 3a 20 7a 4f 70 29 2c  ==0 ? "" : zOp),
110f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 62 3f  .            (b?
11100 22 28 22 3a 22 22 29 2c 20 7a 2c 20 28 62 3f 22  "(":""), z, (b?"
11110 29 22 3a 22 22 29 0a 20 20 20 20 20 20 20 20 29  )":"").        )
11120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11130 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 62 72  if( zRet==0 ) br
11140 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
11150 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
11160 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
11170 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73  ementation of us
11180 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
11190 72 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 35  r functions fts5
111a0 5f 65 78 70 72 28 29 20 28 62 54 63 6c 3d 3d 30  _expr() (bTcl==0
111b0 29 0a 2a 2a 20 61 6e 64 20 66 74 73 35 5f 65 78  ).** and fts5_ex
111c0 70 72 5f 74 63 6c 28 29 20 28 62 54 63 6c 21 3d  pr_tcl() (bTcl!=
111d0 30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  0)..*/.static vo
111e0 69 64 20 66 74 73 35 45 78 70 72 46 75 6e 63 74  id fts5ExprFunct
111f0 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
11200 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
11210 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
11220 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
11230 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11260 66 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69  f args */.  sqli
11270 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
11280 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  l,          /* F
11290 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
112a0 73 20 2a 2f 0a 20 20 69 6e 74 20 62 54 63 6c 0a  s */.  int bTcl.
112b0 29 7b 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20  ){.  Fts5Global 
112c0 2a 70 47 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35  *pGlobal = (Fts5
112d0 47 6c 6f 62 61 6c 2a 29 73 71 6c 69 74 65 33 5f  Global*)sqlite3_
112e0 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
112f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11300 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
11310 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
11320 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
11330 7a 45 78 70 72 20 3d 20 30 3b 0a 20 20 63 68 61  zExpr = 0;.  cha
11340 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 46  r *zErr = 0;.  F
11350 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d  ts5Expr *pExpr =
11360 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
11370 69 6e 74 20 69 3b 0a 0a 20 20 63 6f 6e 73 74 20  int i;..  const 
11380 63 68 61 72 20 2a 2a 61 7a 43 6f 6e 66 69 67 3b  char **azConfig;
11390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
113a0 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
113b0 66 6f 72 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  for Fts5Config *
113c0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
113d0 7a 4e 65 61 72 73 65 74 43 6d 64 20 3d 20 22 6e  zNearsetCmd = "n
113e0 65 61 72 73 65 74 22 3b 0a 20 20 69 6e 74 20 6e  earset";.  int n
113f0 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
11400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11410 7a 65 20 6f 66 20 61 7a 43 6f 6e 66 69 67 5b 5d  ze of azConfig[]
11420 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
11430 20 2a 70 43 6f 6e 66 69 67 20 3d 20 30 3b 0a 20   *pConfig = 0;. 
11440 20 69 6e 74 20 69 41 72 67 20 3d 20 31 3b 0a 0a   int iArg = 1;..
11450 20 20 69 66 28 20 6e 41 72 67 3c 31 20 29 7b 0a    if( nArg<1 ){.
11460 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74      zErr = sqlit
11470 65 33 5f 6d 70 72 69 6e 74 66 28 22 77 72 6f 6e  e3_mprintf("wron
11480 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
11490 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
114a0 6e 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 62  n %s",.        b
114b0 54 63 6c 20 3f 20 22 66 74 73 35 5f 65 78 70 72  Tcl ? "fts5_expr
114c0 5f 74 63 6c 22 20 3a 20 22 66 74 73 35 5f 65 78  _tcl" : "fts5_ex
114d0 70 72 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  pr".    );.    s
114e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
114f0 72 6f 72 28 70 43 74 78 2c 20 7a 45 72 72 2c 20  ror(pCtx, zErr, 
11500 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
11510 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
11520 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
11530 69 66 28 20 62 54 63 6c 20 26 26 20 6e 41 72 67  if( bTcl && nArg
11540 3e 31 20 29 7b 0a 20 20 20 20 7a 4e 65 61 72 73  >1 ){.    zNears
11550 65 74 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63  etCmd = (const c
11560 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
11570 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
11580 29 3b 0a 20 20 20 20 69 41 72 67 20 3d 20 32 3b  );.    iArg = 2;
11590 0a 20 20 7d 0a 0a 20 20 6e 43 6f 6e 66 69 67 20  .  }..  nConfig 
115a0 3d 20 33 20 2b 20 28 6e 41 72 67 2d 69 41 72 67  = 3 + (nArg-iArg
115b0 29 3b 0a 20 20 61 7a 43 6f 6e 66 69 67 20 3d 20  );.  azConfig = 
115c0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 73 71  (const char**)sq
115d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
115e0 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 43 6f  eof(char*) * nCo
115f0 6e 66 69 67 29 3b 0a 20 20 69 66 28 20 61 7a 43  nfig);.  if( azC
11600 6f 6e 66 69 67 3d 3d 30 20 29 7b 0a 20 20 20 20  onfig==0 ){.    
11610 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
11620 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
11630 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
11640 7d 0a 20 20 61 7a 43 6f 6e 66 69 67 5b 30 5d 20  }.  azConfig[0] 
11650 3d 20 30 3b 0a 20 20 61 7a 43 6f 6e 66 69 67 5b  = 0;.  azConfig[
11660 31 5d 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 61  1] = "main";.  a
11670 7a 43 6f 6e 66 69 67 5b 32 5d 20 3d 20 22 74 62  zConfig[2] = "tb
11680 6c 22 3b 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69  l";.  for(i=3; i
11690 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b  Arg<nArg; iArg++
116a0 29 7b 0a 20 20 20 20 61 7a 43 6f 6e 66 69 67 5b  ){.    azConfig[
116b0 69 2b 2b 5d 20 3d 20 28 63 6f 6e 73 74 20 63 68  i++] = (const ch
116c0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
116d0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69 41 72  e_text(apVal[iAr
116e0 67 5d 29 3b 0a 20 20 7d 0a 0a 20 20 7a 45 78 70  g]);.  }..  zExp
116f0 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  r = (const char*
11700 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
11710 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a  ext(apVal[0]);..
11720 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
11730 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28 70 47  s5ConfigParse(pG
11740 6c 6f 62 61 6c 2c 20 64 62 2c 20 6e 43 6f 6e 66  lobal, db, nConf
11750 69 67 2c 20 61 7a 43 6f 6e 66 69 67 2c 20 26 70  ig, azConfig, &p
11760 43 6f 6e 66 69 67 2c 20 26 7a 45 72 72 29 3b 0a  Config, &zErr);.
11770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11780 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
11790 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e  sqlite3Fts5ExprN
117a0 65 77 28 70 43 6f 6e 66 69 67 2c 20 70 43 6f 6e  ew(pConfig, pCon
117b0 66 69 67 2d 3e 6e 43 6f 6c 2c 20 7a 45 78 70 72  fig->nCol, zExpr
117c0 2c 20 26 70 45 78 70 72 2c 20 26 7a 45 72 72 29  , &pExpr, &zErr)
117d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
117e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
117f0 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20   char *zText;.  
11800 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 6f    if( pExpr->pRo
11810 6f 74 2d 3e 78 4e 65 78 74 3d 3d 30 20 29 7b 0a  ot->xNext==0 ){.
11820 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 73 71        zText = sq
11830 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22  lite3_mprintf(""
11840 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
11850 20 62 54 63 6c 20 29 7b 0a 20 20 20 20 20 20 7a   bTcl ){.      z
11860 54 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 50  Text = fts5ExprP
11870 72 69 6e 74 54 63 6c 28 70 43 6f 6e 66 69 67 2c  rintTcl(pConfig,
11880 20 7a 4e 65 61 72 73 65 74 43 6d 64 2c 20 70 45   zNearsetCmd, pE
11890 78 70 72 2d 3e 70 52 6f 6f 74 29 3b 0a 20 20 20  xpr->pRoot);.   
118a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
118b0 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 50 72  ext = fts5ExprPr
118c0 69 6e 74 28 70 43 6f 6e 66 69 67 2c 20 70 45 78  int(pConfig, pEx
118d0 70 72 2d 3e 70 52 6f 6f 74 29 3b 0a 20 20 20 20  pr->pRoot);.    
118e0 7d 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74 3d  }.    if( zText=
118f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
11900 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11920 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
11930 65 78 74 28 70 43 74 78 2c 20 7a 54 65 78 74 2c  ext(pCtx, zText,
11940 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
11950 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71  SIENT);.      sq
11960 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74  lite3_free(zText
11970 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
11980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11990 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 45 72  K ){.    if( zEr
119a0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
119b0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
119c0 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29 3b  pCtx, zErr, -1);
119d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
119e0 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d  ree(zErr);.    }
119f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
11a00 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
11a10 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b  _code(pCtx, rc);
11a20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
11a30 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20  ite3_free((void 
11a40 2a 29 61 7a 43 6f 6e 66 69 67 29 3b 0a 20 20 73  *)azConfig);.  s
11a50 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
11a60 46 72 65 65 28 70 43 6f 6e 66 69 67 29 3b 0a 20  Free(pConfig);. 
11a70 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
11a80 46 72 65 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a  Free(pExpr);.}..
11a90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11aa0 45 78 70 72 46 75 6e 63 74 69 6f 6e 48 72 28 0a  ExprFunctionHr(.
11ab0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
11ac0 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
11ad0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
11ae0 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
11af0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
11b20 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
11b30 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
11b40 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
11b50 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
11b60 29 7b 0a 20 20 66 74 73 35 45 78 70 72 46 75 6e  ){.  fts5ExprFun
11b70 63 74 69 6f 6e 28 70 43 74 78 2c 20 6e 41 72 67  ction(pCtx, nArg
11b80 2c 20 61 70 56 61 6c 2c 20 30 29 3b 0a 7d 0a 73  , apVal, 0);.}.s
11b90 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 45  tatic void fts5E
11ba0 78 70 72 46 75 6e 63 74 69 6f 6e 54 63 6c 28 0a  xprFunctionTcl(.
11bb0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
11bc0 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
11bd0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
11be0 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
11bf0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
11c20 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
11c30 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
11c40 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
11c50 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
11c60 29 7b 0a 20 20 66 74 73 35 45 78 70 72 46 75 6e  ){.  fts5ExprFun
11c70 63 74 69 6f 6e 28 70 43 74 78 2c 20 6e 41 72 67  ction(pCtx, nArg
11c80 2c 20 61 70 56 61 6c 2c 20 31 29 3b 0a 7d 0a 0a  , apVal, 1);.}..
11c90 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
11ca0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 53  entation of an S
11cb0 51 4c 69 74 65 20 75 73 65 72 2d 64 65 66 69 6e  QLite user-defin
11cc0 65 64 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ed-function that
11cd0 20 61 63 63 65 70 74 73 20 61 0a 2a 2a 20 73 69   accepts a.** si
11ce0 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61 73 20  ngle integer as 
11cf0 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
11d00 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 61  the integer is a
11d10 6e 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 20  n alpha-numeric 
11d20 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 6f 64 65  .** unicode code
11d30 20 70 6f 69 6e 74 2c 20 31 20 69 73 20 72 65 74   point, 1 is ret
11d40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
11d50 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   0..*/.static vo
11d60 69 64 20 66 74 73 35 45 78 70 72 49 73 41 6c 6e  id fts5ExprIsAln
11d70 75 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  um(.  sqlite3_co
11d80 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
11d90 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
11da0 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
11db0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11de0 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74   args */.  sqlit
11df0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
11e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
11e10 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
11e20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 6f   */.){.  int iCo
11e30 64 65 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  de;.  if( nArg!=
11e40 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
11e50 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
11e60 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 77 72  tx, .        "wr
11e70 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
11e80 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
11e90 69 6f 6e 20 66 74 73 35 5f 69 73 61 6c 6e 75 6d  ion fts5_isalnum
11ea0 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20  ", -1.    );.   
11eb0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
11ec0 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  Code = sqlite3_v
11ed0 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30  alue_int(apVal[0
11ee0 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ]);.  sqlite3_re
11ef0 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 73  sult_int(pCtx, s
11f00 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64  qlite3Fts5Unicod
11f10 65 49 73 61 6c 6e 75 6d 28 69 43 6f 64 65 29 29  eIsalnum(iCode))
11f20 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
11f30 20 66 74 73 35 45 78 70 72 46 6f 6c 64 28 0a 20   fts5ExprFold(. 
11f40 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
11f50 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
11f60 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
11f70 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
11f80 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fa0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
11fb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
11fc0 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
11fd0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
11fe0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
11ff0 7b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20  {.  if( nArg!=1 
12000 26 26 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  && nArg!=2 ){.  
12010 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
12020 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
12030 20 20 20 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d        "wrong num
12040 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
12050 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 66 74 73   to function fts
12060 35 5f 66 6f 6c 64 22 2c 20 2d 31 0a 20 20 20 20  5_fold", -1.    
12070 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12080 69 6e 74 20 69 43 6f 64 65 3b 0a 20 20 20 20 69  int iCode;.    i
12090 6e 74 20 62 52 65 6d 6f 76 65 44 69 61 63 72 69  nt bRemoveDiacri
120a0 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 43  tics = 0;.    iC
120b0 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ode = sqlite3_va
120c0 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d  lue_int(apVal[0]
120d0 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  );.    if( nArg=
120e0 3d 32 20 29 20 62 52 65 6d 6f 76 65 44 69 61 63  =2 ) bRemoveDiac
120f0 72 69 74 69 63 73 20 3d 20 73 71 6c 69 74 65 33  ritics = sqlite3
12100 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
12110 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [1]);.    sqlite
12120 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74  3_result_int(pCt
12130 78 2c 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e  x, sqlite3Fts5Un
12140 69 63 6f 64 65 46 6f 6c 64 28 69 43 6f 64 65 2c  icodeFold(iCode,
12150 20 62 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69   bRemoveDiacriti
12160 63 73 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  cs));.  }.}../*.
12170 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
12180 64 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c  d during initial
12190 69 7a 61 74 69 6f 6e 20 74 6f 20 72 65 67 69 73  ization to regis
121a0 74 65 72 20 74 68 65 20 66 74 73 35 5f 65 78 70  ter the fts5_exp
121b0 72 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 55 44  r() scalar.** UD
121c0 46 20 77 69 74 68 20 74 68 65 20 53 51 4c 69 74  F with the SQLit
121d0 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
121e0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
121f0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
12200 69 74 65 33 46 74 73 35 45 78 70 72 49 6e 69 74  ite3Fts5ExprInit
12210 28 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c  (Fts5Global *pGl
12220 6f 62 61 6c 2c 20 73 71 6c 69 74 65 33 20 2a 64  obal, sqlite3 *d
12230 62 29 7b 0a 20 20 73 74 72 75 63 74 20 46 74 73  b){.  struct Fts
12240 35 45 78 70 72 46 75 6e 63 20 7b 0a 20 20 20 20  5ExprFunc {.    
12250 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
12260 20 20 20 76 6f 69 64 20 28 2a 78 29 28 73 71 6c     void (*x)(sql
12270 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
12280 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
12290 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63 5b 5d 20  *);.  } aFunc[] 
122a0 3d 20 7b 0a 20 20 20 20 7b 20 22 66 74 73 35 5f  = {.    { "fts5_
122b0 65 78 70 72 22 2c 20 20 20 20 20 66 74 73 35 45  expr",     fts5E
122c0 78 70 72 46 75 6e 63 74 69 6f 6e 48 72 20 7d 2c  xprFunctionHr },
122d0 0a 20 20 20 20 7b 20 22 66 74 73 35 5f 65 78 70  .    { "fts5_exp
122e0 72 5f 74 63 6c 22 2c 20 66 74 73 35 45 78 70 72  r_tcl", fts5Expr
122f0 46 75 6e 63 74 69 6f 6e 54 63 6c 20 7d 2c 0a 20  FunctionTcl },. 
12300 20 20 20 7b 20 22 66 74 73 35 5f 69 73 61 6c 6e     { "fts5_isaln
12310 75 6d 22 2c 20 20 66 74 73 35 45 78 70 72 49 73  um",  fts5ExprIs
12320 41 6c 6e 75 6d 20 7d 2c 0a 20 20 20 20 7b 20 22  Alnum },.    { "
12330 66 74 73 35 5f 66 6f 6c 64 22 2c 20 20 20 20 20  fts5_fold",     
12340 66 74 73 35 45 78 70 72 46 6f 6c 64 20 7d 2c 0a  fts5ExprFold },.
12350 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
12360 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12370 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  OK;.  void *pCtx
12380 20 3d 20 28 76 6f 69 64 2a 29 70 47 6c 6f 62 61   = (void*)pGloba
12390 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  l;..  for(i=0; r
123a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
123b0 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 75 6e  i<ArraySize(aFun
123c0 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  c); i++){.    st
123d0 72 75 63 74 20 46 74 73 35 45 78 70 72 46 75 6e  ruct Fts5ExprFun
123e0 63 20 2a 70 20 3d 20 26 61 46 75 6e 63 5b 69 5d  c *p = &aFunc[i]
123f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12400 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
12410 6f 6e 28 64 62 2c 20 70 2d 3e 7a 2c 20 2d 31 2c  on(db, p->z, -1,
12420 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 43   SQLITE_UTF8, pC
12430 74 78 2c 20 70 2d 3e 78 2c 20 30 2c 20 30 29 3b  tx, p->x, 0, 0);
12440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 76 6f 69 64  .  }..  /* Avoid
12450 20 61 20 77 61 72 6e 69 6e 67 20 69 6e 64 69 63   a warning indic
12460 61 74 69 6e 67 20 74 68 61 74 20 73 71 6c 69 74  ating that sqlit
12470 65 33 46 74 73 35 50 61 72 73 65 72 54 72 61 63  e3Fts5ParserTrac
12480 65 28 29 20 69 73 20 75 6e 75 73 65 64 20 2a 2f  e() is unused */
12490 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
124a0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 46    (void)sqlite3F
124b0 74 73 35 50 61 72 73 65 72 54 72 61 63 65 3b 0a  ts5ParserTrace;.
124c0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
124d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
124e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
124f0 6f 66 20 70 68 72 61 73 65 73 20 69 6e 20 65 78  of phrases in ex
12500 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 0a  pression pExpr..
12510 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
12520 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 75 6e  s5ExprPhraseCoun
12530 74 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70  t(Fts5Expr *pExp
12540 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 45  r){.  return (pE
12550 78 70 72 20 3f 20 70 45 78 70 72 2d 3e 6e 50 68  xpr ? pExpr->nPh
12560 72 61 73 65 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a  rase : 0);.}../*
12570 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
12580 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
12590 6e 20 74 68 65 20 69 50 68 72 61 73 65 27 74 68  n the iPhrase'th
125a0 20 70 68 72 61 73 65 20 69 6e 20 70 45 78 70 72   phrase in pExpr
125b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
125c0 46 74 73 35 45 78 70 72 50 68 72 61 73 65 53 69  Fts5ExprPhraseSi
125d0 7a 65 28 46 74 73 35 45 78 70 72 20 2a 70 45 78  ze(Fts5Expr *pEx
125e0 70 72 2c 20 69 6e 74 20 69 50 68 72 61 73 65 29  pr, int iPhrase)
125f0 7b 0a 20 20 69 66 28 20 69 50 68 72 61 73 65 3c  {.  if( iPhrase<
12600 30 20 7c 7c 20 69 50 68 72 61 73 65 3e 3d 70 45  0 || iPhrase>=pE
12610 78 70 72 2d 3e 6e 50 68 72 61 73 65 20 29 20 72  xpr->nPhrase ) r
12620 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
12630 6e 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50  n pExpr->apExprP
12640 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d 2d 3e  hrase[iPhrase]->
12650 6e 54 65 72 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nTerm;.}../*.** 
12660 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12670 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
12680 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
12690 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 70 68  tion list for ph
126a0 72 61 73 65 0a 2a 2a 20 69 50 68 72 61 73 65 2e  rase.** iPhrase.
126b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
126c0 74 73 35 45 78 70 72 50 6f 73 6c 69 73 74 28 46  ts5ExprPoslist(F
126d0 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ts5Expr *pExpr, 
126e0 69 6e 74 20 69 50 68 72 61 73 65 2c 20 63 6f 6e  int iPhrase, con
126f0 73 74 20 75 38 20 2a 2a 70 61 29 7b 0a 20 20 69  st u8 **pa){.  i
12700 6e 74 20 6e 52 65 74 3b 0a 20 20 46 74 73 35 45  nt nRet;.  Fts5E
12710 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61  xprPhrase *pPhra
12720 73 65 20 3d 20 70 45 78 70 72 2d 3e 61 70 45 78  se = pExpr->apEx
12730 70 72 50 68 72 61 73 65 5b 69 50 68 72 61 73 65  prPhrase[iPhrase
12740 5d 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  ];.  Fts5ExprNod
12750 65 20 2a 70 4e 6f 64 65 20 3d 20 70 50 68 72 61  e *pNode = pPhra
12760 73 65 2d 3e 70 4e 6f 64 65 3b 0a 20 20 69 66 28  se->pNode;.  if(
12770 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20   pNode->bEof==0 
12780 26 26 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64  && pNode->iRowid
12790 3d 3d 70 45 78 70 72 2d 3e 70 52 6f 6f 74 2d 3e  ==pExpr->pRoot->
127a0 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 2a 70  iRowid ){.    *p
127b0 61 20 3d 20 70 50 68 72 61 73 65 2d 3e 70 6f 73  a = pPhrase->pos
127c0 6c 69 73 74 2e 70 3b 0a 20 20 20 20 6e 52 65 74  list.p;.    nRet
127d0 20 3d 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c   = pPhrase->posl
127e0 69 73 74 2e 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist.n;.  }else{.
127f0 20 20 20 20 2a 70 61 20 3d 20 30 3b 0a 20 20 20      *pa = 0;.   
12800 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   nRet = 0;.  }. 
12810 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a   return nRet;.}.
12820 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 6c  .struct Fts5Posl
12830 69 73 74 50 6f 70 75 6c 61 74 6f 72 20 7b 0a 20  istPopulator {. 
12840 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
12850 65 72 20 77 72 69 74 65 72 3b 0a 20 20 69 6e 74  er writer;.  int
12860 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20   bOk;           
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12880 54 72 75 65 20 69 66 20 6f 6b 20 74 6f 20 70 6f  True if ok to po
12890 70 75 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  pulate */.  int 
128a0 62 4d 69 73 73 3b 0a 7d 3b 0a 0a 46 74 73 35 50  bMiss;.};..Fts5P
128b0 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 20  oslistPopulator 
128c0 2a 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72  *sqlite3Fts5Expr
128d0 43 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 46 74  ClearPoslists(Ft
128e0 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  s5Expr *pExpr, i
128f0 6e 74 20 62 4c 69 76 65 29 7b 0a 20 20 46 74 73  nt bLive){.  Fts
12900 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f  5PoslistPopulato
12910 72 20 2a 70 52 65 74 3b 0a 20 20 70 52 65 74 20  r *pRet;.  pRet 
12920 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
12930 28 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c  (sizeof(Fts5Posl
12940 69 73 74 50 6f 70 75 6c 61 74 6f 72 29 2a 70 45  istPopulator)*pE
12950 78 70 72 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20  xpr->nPhrase);. 
12960 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
12970 20 69 6e 74 20 69 3b 0a 20 20 20 20 6d 65 6d 73   int i;.    mems
12980 65 74 28 70 52 65 74 2c 20 30 2c 20 73 69 7a 65  et(pRet, 0, size
12990 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 50 6f  of(Fts5PoslistPo
129a0 70 75 6c 61 74 6f 72 29 2a 70 45 78 70 72 2d 3e  pulator)*pExpr->
129b0 6e 50 68 72 61 73 65 29 3b 0a 20 20 20 20 66 6f  nPhrase);.    fo
129c0 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e  r(i=0; i<pExpr->
129d0 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20  nPhrase; i++){. 
129e0 20 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20       Fts5Buffer 
129f0 2a 70 42 75 66 20 3d 20 26 70 45 78 70 72 2d 3e  *pBuf = &pExpr->
12a00 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d  apExprPhrase[i]-
12a10 3e 70 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20  >poslist;.      
12a20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
12a30 6f 64 65 20 3d 20 70 45 78 70 72 2d 3e 61 70 45  ode = pExpr->apE
12a40 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e 70 4e  xprPhrase[i]->pN
12a50 6f 64 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ode;.      asser
12a60 74 28 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72  t( pExpr->apExpr
12a70 50 68 72 61 73 65 5b 69 5d 2d 3e 6e 54 65 72 6d  Phrase[i]->nTerm
12a80 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
12a90 20 62 4c 69 76 65 20 26 26 20 0a 20 20 20 20 20   bLive && .     
12aa0 20 20 20 20 20 28 70 42 75 66 2d 3e 6e 3d 3d 30       (pBuf->n==0
12ab0 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69   || pNode->iRowi
12ac0 64 21 3d 70 45 78 70 72 2d 3e 70 52 6f 6f 74 2d  d!=pExpr->pRoot-
12ad0 3e 69 52 6f 77 69 64 20 7c 7c 20 70 4e 6f 64 65  >iRowid || pNode
12ae0 2d 3e 62 45 6f 66 29 0a 20 20 20 20 20 20 29 7b  ->bEof).      ){
12af0 0a 20 20 20 20 20 20 20 20 70 52 65 74 5b 69 5d  .        pRet[i]
12b00 2e 62 4d 69 73 73 20 3d 20 31 3b 0a 20 20 20 20  .bMiss = 1;.    
12b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12b20 20 70 42 75 66 2d 3e 6e 20 3d 20 30 3b 0a 20 20   pBuf->n = 0;.  
12b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12b40 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
12b50 0a 0a 73 74 72 75 63 74 20 46 74 73 35 45 78 70  ..struct Fts5Exp
12b60 72 43 74 78 20 7b 0a 20 20 46 74 73 35 45 78 70  rCtx {.  Fts5Exp
12b70 72 20 2a 70 45 78 70 72 3b 0a 20 20 46 74 73 35  r *pExpr;.  Fts5
12b80 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72  PoslistPopulator
12b90 20 2a 61 50 6f 70 75 6c 61 74 6f 72 3b 0a 20 20   *aPopulator;.  
12ba0 69 36 34 20 69 4f 66 66 3b 0a 7d 3b 0a 74 79 70  i64 iOff;.};.typ
12bb0 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
12bc0 45 78 70 72 43 74 78 20 46 74 73 35 45 78 70 72  ExprCtx Fts5Expr
12bd0 43 74 78 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f  Ctx;../*.** TODO
12be0 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72 65  : Make this more
12bf0 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a 73   efficient!.*/.s
12c00 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
12c10 70 72 43 6f 6c 73 65 74 54 65 73 74 28 46 74 73  prColsetTest(Fts
12c20 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
12c30 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69  , int iCol){.  i
12c40 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
12c50 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c   i<pColset->nCol
12c60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12c70 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69  pColset->aiCol[i
12c80 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72 6e  ]==iCol ) return
12c90 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
12ca0 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   0;.}..static in
12cb0 74 20 66 74 73 35 45 78 70 72 50 6f 70 75 6c 61  t fts5ExprPopula
12cc0 74 65 50 6f 73 6c 69 73 74 73 43 62 28 0a 20 20  tePoslistsCb(.  
12cd0 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
12ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
12cf0 70 79 20 6f 66 20 32 6e 64 20 61 72 67 75 6d 65  py of 2nd argume
12d00 6e 74 20 74 6f 20 78 54 6f 6b 65 6e 69 7a 65 28  nt to xTokenize(
12d10 29 20 2a 2f 0a 20 20 69 6e 74 20 74 66 6c 61 67  ) */.  int tflag
12d20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
12d30 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
12d40 35 5f 54 4f 4b 45 4e 5f 2a 20 66 6c 61 67 73 20  5_TOKEN_* flags 
12d50 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12d60 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20  *pToken,        
12d70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
12d80 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
12d90 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  token */.  int n
12da0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
12db0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12dc0 20 74 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20   token in bytes 
12dd0 2a 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64  */.  int iUnused
12de0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
12df0 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f  /* Byte offset o
12e00 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 69  f token within i
12e10 6e 70 75 74 20 74 65 78 74 20 2a 2f 0a 20 20 69  nput text */.  i
12e20 6e 74 20 69 55 6e 75 73 65 64 32 20 20 20 20 20  nt iUnused2     
12e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
12e40 65 20 6f 66 66 73 65 74 20 6f 66 20 65 6e 64 20  e offset of end 
12e50 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
12e60 69 6e 70 75 74 20 74 65 78 74 20 2a 2f 0a 29 7b  input text */.){
12e70 0a 20 20 46 74 73 35 45 78 70 72 43 74 78 20 2a  .  Fts5ExprCtx *
12e80 70 20 3d 20 28 46 74 73 35 45 78 70 72 43 74 78  p = (Fts5ExprCtx
12e90 2a 29 70 43 74 78 3b 0a 20 20 46 74 73 35 45 78  *)pCtx;.  Fts5Ex
12ea0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70  pr *pExpr = p->p
12eb0 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Expr;.  int i;..
12ec0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28    UNUSED_PARAM2(
12ed0 69 55 6e 75 73 65 64 31 2c 20 69 55 6e 75 73 65  iUnused1, iUnuse
12ee0 64 32 29 3b 0a 0a 20 20 69 66 28 20 6e 54 6f 6b  d2);..  if( nTok
12ef0 65 6e 3e 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45  en>FTS5_MAX_TOKE
12f00 4e 5f 53 49 5a 45 20 29 20 6e 54 6f 6b 65 6e 20  N_SIZE ) nToken 
12f10 3d 20 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e  = FTS5_MAX_TOKEN
12f20 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 28 74 66  _SIZE;.  if( (tf
12f30 6c 61 67 73 20 26 20 46 54 53 35 5f 54 4f 4b 45  lags & FTS5_TOKE
12f40 4e 5f 43 4f 4c 4f 43 41 54 45 44 29 3d 3d 30 20  N_COLOCATED)==0 
12f50 29 20 70 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20 66  ) p->iOff++;.  f
12f60 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d  or(i=0; i<pExpr-
12f70 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a  >nPhrase; i++){.
12f80 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
12f90 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 69 66 28   *pTerm;.    if(
12fa0 20 70 2d 3e 61 50 6f 70 75 6c 61 74 6f 72 5b 69   p->aPopulator[i
12fb0 5d 2e 62 4f 6b 3d 3d 30 20 29 20 63 6f 6e 74 69  ].bOk==0 ) conti
12fc0 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 70 54 65  nue;.    for(pTe
12fd0 72 6d 3d 26 70 45 78 70 72 2d 3e 61 70 45 78 70  rm=&pExpr->apExp
12fe0 72 50 68 72 61 73 65 5b 69 5d 2d 3e 61 54 65 72  rPhrase[i]->aTer
12ff0 6d 5b 30 5d 3b 20 70 54 65 72 6d 3b 20 70 54 65  m[0]; pTerm; pTe
13000 72 6d 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  rm=pTerm->pSynon
13010 79 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ym){.      int n
13020 54 65 72 6d 20 3d 20 28 69 6e 74 29 73 74 72 6c  Term = (int)strl
13030 65 6e 28 70 54 65 72 6d 2d 3e 7a 54 65 72 6d 29  en(pTerm->zTerm)
13040 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 54 65  ;.      if( (nTe
13050 72 6d 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 28 6e  rm==nToken || (n
13060 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 26 26 20 70  Term<nToken && p
13070 54 65 72 6d 2d 3e 62 50 72 65 66 69 78 29 29 0a  Term->bPrefix)).
13080 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
13090 28 70 54 65 72 6d 2d 3e 7a 54 65 72 6d 2c 20 70  (pTerm->zTerm, p
130a0 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 3d 3d 30  Token, nTerm)==0
130b0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
130c0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
130d0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69  e3Fts5PoslistWri
130e0 74 65 72 41 70 70 65 6e 64 28 0a 20 20 20 20 20  terAppend(.     
130f0 20 20 20 20 20 20 20 26 70 45 78 70 72 2d 3e 61         &pExpr->a
13100 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e  pExprPhrase[i]->
13110 70 6f 73 6c 69 73 74 2c 20 26 70 2d 3e 61 50 6f  poslist, &p->aPo
13120 70 75 6c 61 74 6f 72 5b 69 5d 2e 77 72 69 74 65  pulator[i].write
13130 72 2c 20 70 2d 3e 69 4f 66 66 0a 20 20 20 20 20  r, p->iOff.     
13140 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
13150 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13160 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
13170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13180 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13190 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71  TE_OK;.}..int sq
131a0 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 6f 70  lite3Fts5ExprPop
131b0 75 6c 61 74 65 50 6f 73 6c 69 73 74 73 28 0a 20  ulatePoslists(. 
131c0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
131d0 6e 66 69 67 2c 0a 20 20 46 74 73 35 45 78 70 72  nfig,.  Fts5Expr
131e0 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74 73 35   *pExpr, .  Fts5
131f0 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72  PoslistPopulator
13200 20 2a 61 50 6f 70 75 6c 61 74 6f 72 2c 0a 20 20   *aPopulator,.  
13210 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 63 6f 6e  int iCol, .  con
13220 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
13230 6e 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n.){.  int i;.  
13240 46 74 73 35 45 78 70 72 43 74 78 20 73 43 74 78  Fts5ExprCtx sCtx
13250 3b 0a 20 20 73 43 74 78 2e 70 45 78 70 72 20 3d  ;.  sCtx.pExpr =
13260 20 70 45 78 70 72 3b 0a 20 20 73 43 74 78 2e 61   pExpr;.  sCtx.a
13270 50 6f 70 75 6c 61 74 6f 72 20 3d 20 61 50 6f 70  Populator = aPop
13280 75 6c 61 74 6f 72 3b 0a 20 20 73 43 74 78 2e 69  ulator;.  sCtx.i
13290 4f 66 66 20 3d 20 28 28 28 69 36 34 29 69 43 6f  Off = (((i64)iCo
132a0 6c 29 20 3c 3c 20 33 32 29 20 2d 20 31 3b 0a 0a  l) << 32) - 1;..
132b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78    for(i=0; i<pEx
132c0 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b  pr->nPhrase; i++
132d0 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e  ){.    Fts5ExprN
132e0 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 70 45 78  ode *pNode = pEx
132f0 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  pr->apExprPhrase
13300 5b 69 5d 2d 3e 70 4e 6f 64 65 3b 0a 20 20 20 20  [i]->pNode;.    
13310 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
13320 73 65 74 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65  set = pNode->pNe
13330 61 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 20  ar->pColset;.   
13340 20 69 66 28 20 28 70 43 6f 6c 73 65 74 20 26 26   if( (pColset &&
13350 20 30 3d 3d 66 74 73 35 45 78 70 72 43 6f 6c 73   0==fts5ExprCols
13360 65 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20  etTest(pColset, 
13370 69 43 6f 6c 29 29 20 0a 20 20 20 20 20 7c 7c 20  iCol)) .     || 
13380 61 50 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e 62 4d  aPopulator[i].bM
13390 69 73 73 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  iss.    ){.     
133a0 20 61 50 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e 62   aPopulator[i].b
133b0 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Ok = 0;.    }els
133c0 65 7b 0a 20 20 20 20 20 20 61 50 6f 70 75 6c 61  e{.      aPopula
133d0 74 6f 72 5b 69 5d 2e 62 4f 6b 20 3d 20 31 3b 0a  tor[i].bOk = 1;.
133e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
133f0 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 54  urn sqlite3Fts5T
13400 6f 6b 65 6e 69 7a 65 28 70 43 6f 6e 66 69 67 2c  okenize(pConfig,
13410 20 0a 20 20 20 20 20 20 46 54 53 35 5f 54 4f 4b   .      FTS5_TOK
13420 45 4e 49 5a 45 5f 44 4f 43 55 4d 45 4e 54 2c 20  ENIZE_DOCUMENT, 
13430 7a 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 26 73 43  z, n, (void*)&sC
13440 74 78 2c 20 66 74 73 35 45 78 70 72 50 6f 70 75  tx, fts5ExprPopu
13450 6c 61 74 65 50 6f 73 6c 69 73 74 73 43 62 0a 20  latePoslistsCb. 
13460 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   );.}..static vo
13470 69 64 20 66 74 73 35 45 78 70 72 43 6c 65 61 72  id fts5ExprClear
13480 50 6f 73 6c 69 73 74 73 28 46 74 73 35 45 78 70  Poslists(Fts5Exp
13490 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20  rNode *pNode){. 
134a0 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70   if( pNode->eTyp
134b0 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 7c 7c 20  e==FTS5_TERM || 
134c0 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
134d0 53 35 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  S5_STRING ){.   
134e0 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e 61   pNode->pNear->a
134f0 70 50 68 72 61 73 65 5b 30 5d 2d 3e 70 6f 73 6c  pPhrase[0]->posl
13500 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c  ist.n = 0;.  }el
13510 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  se{.    int i;. 
13520 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
13530 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b  ode->nChild; i++
13540 29 7b 0a 20 20 20 20 20 20 66 74 73 35 45 78 70  ){.      fts5Exp
13550 72 43 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 70  rClearPoslists(p
13560 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d  Node->apChild[i]
13570 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
13580 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45  static int fts5E
13590 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74 73  xprCheckPoslists
135a0 28 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70  (Fts5ExprNode *p
135b0 4e 6f 64 65 2c 20 69 36 34 20 69 52 6f 77 69 64  Node, i64 iRowid
135c0 29 7b 0a 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77  ){.  pNode->iRow
135d0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70  id = iRowid;.  p
135e0 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a  Node->bEof = 0;.
135f0 20 20 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d    switch( pNode-
13600 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61  >eType ){.    ca
13610 73 65 20 46 54 53 35 5f 54 45 52 4d 3a 0a 20 20  se FTS5_TERM:.  
13620 20 20 63 61 73 65 20 46 54 53 35 5f 53 54 52 49    case FTS5_STRI
13630 4e 47 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  NG:.      return
13640 20 28 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e   (pNode->pNear->
13650 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 70 6f 73  apPhrase[0]->pos
13660 6c 69 73 74 2e 6e 3e 30 29 3b 0a 0a 20 20 20 20  list.n>0);..    
13670 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a 20 7b  case FTS5_AND: {
13680 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
13690 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
136a0 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b  Node->nChild; i+
136b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
136c0 66 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73  fts5ExprCheckPos
136d0 6c 69 73 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43  lists(pNode->apC
136e0 68 69 6c 64 5b 69 5d 2c 20 69 52 6f 77 69 64 29  hild[i], iRowid)
136f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13700 20 66 74 73 35 45 78 70 72 43 6c 65 61 72 50 6f   fts5ExprClearPo
13710 73 6c 69 73 74 73 28 70 4e 6f 64 65 29 3b 0a 20  slists(pNode);. 
13720 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13730 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
13740 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13750 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
13760 65 20 46 54 53 35 5f 4f 52 3a 20 7b 0a 20 20 20  e FTS5_OR: {.   
13770 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
13780 69 6e 74 20 62 52 65 74 20 3d 20 30 3b 0a 20 20  int bRet = 0;.  
13790 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
137a0 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b  Node->nChild; i+
137b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
137c0 66 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73  fts5ExprCheckPos
137d0 6c 69 73 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43  lists(pNode->apC
137e0 68 69 6c 64 5b 69 5d 2c 20 69 52 6f 77 69 64 29  hild[i], iRowid)
137f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 52   ){.          bR
13800 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  et = 1;.        
13810 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13820 72 65 74 75 72 6e 20 62 52 65 74 3b 0a 20 20 20  return bRet;.   
13830 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
13840 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
13850 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46   pNode->eType==F
13860 54 53 35 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  TS5_NOT );.     
13870 20 69 66 28 20 30 3d 3d 66 74 73 35 45 78 70 72   if( 0==fts5Expr
13880 43 68 65 63 6b 50 6f 73 6c 69 73 74 73 28 70 4e  CheckPoslists(pN
13890 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2c  ode->apChild[0],
138a0 20 69 52 6f 77 69 64 29 0a 20 20 20 20 20 20 20   iRowid).       
138b0 20 20 20 7c 7c 20 30 21 3d 66 74 73 35 45 78 70     || 0!=fts5Exp
138c0 72 43 68 65 63 6b 50 6f 73 6c 69 73 74 73 28 70  rCheckPoslists(p
138d0 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 31 5d  Node->apChild[1]
138e0 2c 20 69 52 6f 77 69 64 29 0a 20 20 20 20 20 20  , iRowid).      
138f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73    ){.        fts
13900 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73  5ExprClearPoslis
13910 74 73 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20  ts(pNode);.     
13920 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
13930 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
13950 74 75 72 6e 20 31 3b 0a 7d 0a 0a 76 6f 69 64 20  turn 1;.}..void 
13960 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 43  sqlite3Fts5ExprC
13970 68 65 63 6b 50 6f 73 6c 69 73 74 73 28 46 74 73  heckPoslists(Fts
13980 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 36  5Expr *pExpr, i6
13990 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 66 74 73  4 iRowid){.  fts
139a0 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73  5ExprCheckPoslis
139b0 74 73 28 70 45 78 70 72 2d 3e 70 52 6f 6f 74 2c  ts(pExpr->pRoot,
139c0 20 69 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a   iRowid);.}../*.
139d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
139e0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
139f0 66 6f 72 20 64 65 74 61 69 6c 3d 63 6f 6c 75 6d  for detail=colum
13a00 6e 73 20 74 61 62 6c 65 73 2e 20 0a 2a 2f 0a 69  ns tables. .*/.i
13a10 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
13a20 70 72 50 68 72 61 73 65 43 6f 6c 6c 69 73 74 28  prPhraseCollist(
13a30 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78  .  Fts5Expr *pEx
13a40 70 72 2c 20 0a 20 20 69 6e 74 20 69 50 68 72 61  pr, .  int iPhra
13a50 73 65 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  se, .  const u8 
13a60 2a 2a 70 70 43 6f 6c 6c 69 73 74 2c 20 0a 20 20  **ppCollist, .  
13a70 69 6e 74 20 2a 70 6e 43 6f 6c 6c 69 73 74 0a 29  int *pnCollist.)
13a80 7b 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61  {.  Fts5ExprPhra
13a90 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 45  se *pPhrase = pE
13aa0 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73  xpr->apExprPhras
13ab0 65 5b 69 50 68 72 61 73 65 5d 3b 0a 20 20 46 74  e[iPhrase];.  Ft
13ac0 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
13ad0 65 20 3d 20 70 50 68 72 61 73 65 2d 3e 70 4e 6f  e = pPhrase->pNo
13ae0 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
13af0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
13b00 65 72 74 28 20 69 50 68 72 61 73 65 3e 3d 30 20  ert( iPhrase>=0 
13b10 26 26 20 69 50 68 72 61 73 65 3c 70 45 78 70 72  && iPhrase<pExpr
13b20 2d 3e 6e 50 68 72 61 73 65 20 29 3b 0a 20 20 61  ->nPhrase );.  a
13b30 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 43  ssert( pExpr->pC
13b40 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
13b50 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55  FTS5_DETAIL_COLU
13b60 4d 4e 53 20 29 3b 0a 0a 20 20 69 66 28 20 70 4e  MNS );..  if( pN
13b70 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20 0a 20 20  ode->bEof==0 .  
13b80 20 26 26 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69   && pNode->iRowi
13b90 64 3d 3d 70 45 78 70 72 2d 3e 70 52 6f 6f 74 2d  d==pExpr->pRoot-
13ba0 3e 69 52 6f 77 69 64 20 0a 20 20 20 26 26 20 70  >iRowid .   && p
13bb0 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
13bc0 6e 3e 30 0a 20 20 29 7b 0a 20 20 20 20 46 74 73  n>0.  ){.    Fts
13bd0 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
13be0 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54 65   = &pPhrase->aTe
13bf0 72 6d 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  rm[0];.    if( p
13c00 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29  Term->pSynonym )
13c10 7b 0a 20 20 20 20 20 20 46 74 73 35 42 75 66 66  {.      Fts5Buff
13c20 65 72 20 2a 70 42 75 66 20 3d 20 28 46 74 73 35  er *pBuf = (Fts5
13c30 42 75 66 66 65 72 2a 29 26 70 54 65 72 6d 2d 3e  Buffer*)&pTerm->
13c40 70 53 79 6e 6f 6e 79 6d 5b 31 5d 3b 0a 20 20 20  pSynonym[1];.   
13c50 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
13c60 53 79 6e 6f 6e 79 6d 4c 69 73 74 28 0a 20 20 20  SynonymList(.   
13c70 20 20 20 20 20 20 20 70 54 65 72 6d 2c 20 70 4e         pTerm, pN
13c80 6f 64 65 2d 3e 69 52 6f 77 69 64 2c 20 70 42 75  ode->iRowid, pBu
13c90 66 2c 20 28 75 38 2a 2a 29 70 70 43 6f 6c 6c 69  f, (u8**)ppColli
13ca0 73 74 2c 20 70 6e 43 6f 6c 6c 69 73 74 0a 20 20  st, pnCollist.  
13cb0 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
13cc0 7b 0a 20 20 20 20 20 20 2a 70 70 43 6f 6c 6c 69  {.      *ppColli
13cd0 73 74 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54  st = pPhrase->aT
13ce0 65 72 6d 5b 30 5d 2e 70 49 74 65 72 2d 3e 70 44  erm[0].pIter->pD
13cf0 61 74 61 3b 0a 20 20 20 20 20 20 2a 70 6e 43 6f  ata;.      *pnCo
13d00 6c 6c 69 73 74 20 3d 20 70 50 68 72 61 73 65 2d  llist = pPhrase-
13d10 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 2d  >aTerm[0].pIter-
13d20 3e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  >nData;.    }.  
13d30 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 43 6f  }else{.    *ppCo
13d40 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 2a  llist = 0;.    *
13d50 70 6e 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20  pnCollist = 0;. 
13d60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
13d70 0a 7d 0a 0a                                      .}..