/ Hex Artifact Content
Login

Artifact 5aef080ba3c8947e22f38ce1ff9fe548e4a740e72b77241f35ed941ae128d2c7:


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 69 6e 74 20 73 71 6c 69 74  #endif.int sqlit
03c0: 65 33 46 74 73 35 50 61 72 73 65 72 46 61 6c 6c  e3Fts5ParserFall
03d0: 62 61 63 6b 28 69 6e 74 29 3b 0a 0a 0a 73 74 72  back(int);...str
03e0: 75 63 74 20 46 74 73 35 45 78 70 72 20 7b 0a 20  uct Fts5Expr {. 
03f0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64   Fts5Index *pInd
0400: 65 78 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  ex;.  Fts5Config
0410: 20 2a 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73   *pConfig;.  Fts
0420: 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 6f 6f 74  5ExprNode *pRoot
0430: 3b 0a 20 20 69 6e 74 20 62 44 65 73 63 3b 20 20  ;.  int bDesc;  
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 69      /* Iterate i
0460: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  n descending row
0470: 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e  id order */.  in
0480: 74 20 6e 50 68 72 61 73 65 3b 20 20 20 20 20 20  t nPhrase;      
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
04a0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 68 72 61 73   Number of phras
04b0: 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
04c0: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 50 68   */.  Fts5ExprPh
04d0: 72 61 73 65 20 2a 2a 61 70 45 78 70 72 50 68 72  rase **apExprPhr
04e0: 61 73 65 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ase;  /* Pointer
04f0: 73 20 74 6f 20 70 68 72 61 73 65 20 6f 62 6a 65  s to phrase obje
0500: 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  cts */.};../*.**
0510: 20 65 54 79 70 65 3a 0a 2a 2a 20 20 20 45 78 70   eType:.**   Exp
0520: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 79 70  ression node typ
0530: 65 2e 20 41 6c 77 61 79 73 20 6f 6e 65 20 6f 66  e. Always one of
0540: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 54  :.**.**       FT
0550: 53 35 5f 41 4e 44 20 20 20 20 20 20 20 20 20 20  S5_AND          
0560: 20 20 20 20 20 20 20 28 6e 43 68 69 6c 64 2c 20         (nChild, 
0570: 61 70 43 68 69 6c 64 20 76 61 6c 69 64 29 0a 2a  apChild valid).*
0580: 2a 20 20 20 20 20 20 20 46 54 53 35 5f 4f 52 20  *       FTS5_OR 
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 20 28 6e 43 68 69 6c 64 2c 20 61 70 43 68 69 6c   (nChild, apChil
05b0: 64 20 76 61 6c 69 64 29 0a 2a 2a 20 20 20 20 20  d valid).**     
05c0: 20 20 46 54 53 35 5f 4e 4f 54 20 20 20 20 20 20    FTS5_NOT      
05d0: 20 20 20 20 20 20 20 20 20 20 20 28 6e 43 68 69             (nChi
05e0: 6c 64 2c 20 61 70 43 68 69 6c 64 20 76 61 6c 69  ld, apChild vali
05f0: 64 29 0a 2a 2a 20 20 20 20 20 20 20 46 54 53 35  d).**       FTS5
0600: 5f 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 20  _STRING         
0610: 20 20 20 20 20 28 70 4e 65 61 72 20 76 61 6c 69       (pNear vali
0620: 64 29 0a 2a 2a 20 20 20 20 20 20 20 46 54 53 35  d).**       FTS5
0630: 5f 54 45 52 4d 20 20 20 20 20 20 20 20 20 20 20  _TERM           
0640: 20 20 20 20 20 28 70 4e 65 61 72 20 76 61 6c 69       (pNear vali
0650: 64 29 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  d).*/.struct Fts
0660: 35 45 78 70 72 4e 6f 64 65 20 7b 0a 20 20 69 6e  5ExprNode {.  in
0670: 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0690: 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20   Node type */.  
06a0: 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20  int bEof;       
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 2f 2a 20 54 72 75 65 20 61 74 20 45 4f 46 20 2a  /* True at EOF *
06d0: 2f 0a 20 20 69 6e 74 20 62 4e 6f 6d 61 74 63 68  /.  int bNomatch
06e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
06f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
0700: 6e 74 72 79 20 69 73 20 6e 6f 74 20 61 20 6d 61  ntry is not a ma
0710: 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65 78  tch */..  /* Nex
0720: 74 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 69  t method for thi
0730: 73 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 6e 74  s node. */.  int
0740: 20 28 2a 78 4e 65 78 74 29 28 46 74 73 35 45 78   (*xNext)(Fts5Ex
0750: 70 72 2a 2c 20 46 74 73 35 45 78 70 72 4e 6f 64  pr*, Fts5ExprNod
0760: 65 2a 2c 20 69 6e 74 2c 20 69 36 34 29 3b 0a 0a  e*, int, i64);..
0770: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
07a0: 69 64 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  id */.  Fts5Expr
07b0: 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 3b 20  Nearset *pNear; 
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 46          /* For F
07d0: 54 53 35 5f 53 54 52 49 4e 47 20 2d 20 63 6c 75  TS5_STRING - clu
07e0: 73 74 65 72 20 6f 66 20 70 68 72 61 73 65 73 20  ster of phrases 
07f0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 69 6c 64 20 6e  */..  /* Child n
0800: 6f 64 65 73 2e 20 46 6f 72 20 61 20 4e 4f 54 20  odes. For a NOT 
0810: 6e 6f 64 65 2c 20 74 68 69 73 20 61 72 72 61 79  node, this array
0820: 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 73   always contains
0830: 20 32 20 65 6e 74 72 69 65 73 2e 20 46 6f 72 20   2 entries. For 
0840: 0a 20 20 2a 2a 20 41 4e 44 20 6f 72 20 4f 52 20  .  ** AND or OR 
0850: 6e 6f 64 65 73 2c 20 69 74 20 63 6f 6e 74 61 69  nodes, it contai
0860: 6e 73 20 32 20 6f 72 20 6d 6f 72 65 20 65 6e 74  ns 2 or more ent
0870: 72 69 65 73 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  ries.  */.  int 
0880: 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  nChild;         
0890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
08a0: 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 6e  umber of child n
08b0: 6f 64 65 73 20 2a 2f 0a 20 20 46 74 73 35 45 78  odes */.  Fts5Ex
08c0: 70 72 4e 6f 64 65 20 2a 61 70 43 68 69 6c 64 5b  prNode *apChild[
08d0: 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  1];       /* Arr
08e0: 61 79 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64 65  ay of child node
08f0: 73 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  s */.};..#define
0900: 20 46 74 73 35 4e 6f 64 65 49 73 53 74 72 69 6e   Fts5NodeIsStrin
0910: 67 28 70 29 20 28 28 70 29 2d 3e 65 54 79 70 65  g(p) ((p)->eType
0920: 3d 3d 46 54 53 35 5f 54 45 52 4d 20 7c 7c 20 28  ==FTS5_TERM || (
0930: 70 29 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  p)->eType==FTS5_
0940: 53 54 52 49 4e 47 29 0a 0a 2f 2a 0a 2a 2a 20 49  STRING)../*.** I
0950: 6e 76 6f 6b 65 20 74 68 65 20 78 4e 65 78 74 20  nvoke the xNext 
0960: 6d 65 74 68 6f 64 20 6f 66 20 61 6e 20 46 74 73  method of an Fts
0970: 35 45 78 70 72 4e 6f 64 65 20 6f 62 6a 65 63 74  5ExprNode object
0980: 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 73 68 6f  . This macro sho
0990: 75 6c 64 20 62 65 0a 2a 2a 20 75 73 65 64 20 61  uld be.** used a
09a0: 73 20 69 66 20 69 74 20 68 61 73 20 74 68 65 20  s if it has the 
09b0: 73 61 6d 65 20 73 69 67 6e 61 74 75 72 65 20 61  same signature a
09c0: 73 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d 65  s the xNext() me
09d0: 74 68 6f 64 73 20 74 68 65 6d 73 65 6c 76 65 73  thods themselves
09e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 74 73  ..*/.#define fts
09f0: 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 61 2c  5ExprNodeNext(a,
0a00: 62 2c 63 2c 64 29 20 28 62 29 2d 3e 78 4e 65 78  b,c,d) (b)->xNex
0a10: 74 28 28 61 29 2c 20 28 62 29 2c 20 28 63 29 2c  t((a), (b), (c),
0a20: 20 28 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   (d))../*.** An 
0a30: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0a40: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0a50: 75 72 65 20 72 65 70 72 65 73 65 6e 74 73 20 61  ure represents a
0a60: 20 73 69 6e 67 6c 65 20 73 65 61 72 63 68 20 74   single search t
0a70: 65 72 6d 0a 2a 2a 20 6f 72 20 74 65 72 6d 20 70  erm.** or term p
0a80: 72 65 66 69 78 2e 0a 2a 2f 0a 73 74 72 75 63 74  refix..*/.struct
0a90: 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 7b 0a   Fts5ExprTerm {.
0aa0: 20 20 75 38 20 62 50 72 65 66 69 78 3b 20 20 20    u8 bPrefix;   
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
0ad0: 70 72 65 66 69 78 20 74 65 72 6d 20 2a 2f 0a 20  prefix term */. 
0ae0: 20 75 38 20 62 46 69 72 73 74 3b 20 20 20 20 20   u8 bFirst;     
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 6f 6b 65   /* True if toke
0b10: 6e 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20  n must be first 
0b20: 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  in column */.  c
0b30: 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20  har *zTerm;     
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0b50: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
0b60: 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 49   term */.  Fts5I
0b70: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 3b  ndexIter *pIter;
0b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
0b90: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 69 73 20  erator for this 
0ba0: 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 45 78  term */.  Fts5Ex
0bb0: 70 72 54 65 72 6d 20 2a 70 53 79 6e 6f 6e 79 6d  prTerm *pSynonym
0bc0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
0bd0: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 69 6e  nter to first in
0be0: 20 6c 69 73 74 20 6f 66 20 73 79 6e 6f 6e 79 6d   list of synonym
0bf0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  s */.};../*.** A
0c00: 20 70 68 72 61 73 65 2e 20 4f 6e 65 20 6f 72 20   phrase. One or 
0c10: 6d 6f 72 65 20 74 65 72 6d 73 20 74 68 61 74 20  more terms that 
0c20: 6d 75 73 74 20 61 70 70 65 61 72 20 69 6e 20 61  must appear in a
0c30: 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75   contiguous sequ
0c40: 65 6e 63 65 0a 2a 2a 20 77 69 74 68 69 6e 20 61  ence.** within a
0c50: 20 64 6f 63 75 6d 65 6e 74 20 66 6f 72 20 69 74   document for it
0c60: 20 74 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74   to match..*/.st
0c70: 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68 72  ruct Fts5ExprPhr
0c80: 61 73 65 20 7b 0a 20 20 46 74 73 35 45 78 70 72  ase {.  Fts5Expr
0c90: 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 20 20 20 20  Node *pNode;    
0ca0: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f          /* FTS5_
0cb0: 53 54 52 49 4e 47 20 6e 6f 64 65 20 74 68 69 73  STRING node this
0cc0: 20 70 68 72 61 73 65 20 69 73 20 70 61 72 74 20   phrase is part 
0cd0: 6f 66 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  of */.  Fts5Buff
0ce0: 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20  er poslist;     
0cf0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
0d00: 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
0d10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0d40: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  of entries in aT
0d50: 65 72 6d 5b 5d 20 2a 2f 0a 20 20 46 74 73 35 45  erm[] */.  Fts5E
0d60: 78 70 72 54 65 72 6d 20 61 54 65 72 6d 5b 31 5d  xprTerm aTerm[1]
0d70: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
0d80: 72 6d 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  rms that make up
0d90: 20 74 68 69 73 20 70 68 72 61 73 65 20 2a 2f 0a   this phrase */.
0da0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  };../*.** One or
0db0: 20 6d 6f 72 65 20 70 68 72 61 73 65 73 20 74 68   more phrases th
0dc0: 61 74 20 6d 75 73 74 20 61 70 70 65 61 72 20 77  at must appear w
0dd0: 69 74 68 69 6e 20 61 20 63 65 72 74 61 69 6e 20  ithin a certain 
0de0: 74 6f 6b 65 6e 20 64 69 73 74 61 6e 63 65 20 6f  token distance o
0df0: 66 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 20  f.** each other 
0e00: 77 69 74 68 69 6e 20 65 61 63 68 20 6d 61 74 63  within each matc
0e10: 68 69 6e 67 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a  hing document..*
0e20: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 45 78 70  /.struct Fts5Exp
0e30: 72 4e 65 61 72 73 65 74 20 7b 0a 20 20 69 6e 74  rNearset {.  int
0e40: 20 6e 4e 65 61 72 3b 20 20 20 20 20 20 20 20 20   nNear;         
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e60: 4e 45 41 52 20 70 61 72 61 6d 65 74 65 72 20 2a  NEAR parameter *
0e70: 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
0e80: 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20  pColset;        
0e90: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74      /* Columns t
0ea0: 6f 20 73 65 61 72 63 68 20 28 4e 55 4c 4c 20 2d  o search (NULL -
0eb0: 3e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a  > all columns) *
0ec0: 2f 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65 3b  /.  int nPhrase;
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0ef0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 50 68 72   entries in aPhr
0f00: 61 73 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ase[] array */. 
0f10: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
0f20: 2a 61 70 50 68 72 61 73 65 5b 31 5d 3b 20 20 20  *apPhrase[1];   
0f30: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 68 72   /* Array of phr
0f40: 61 73 65 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a  ase pointers */.
0f50: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  };.../*.** Parse
0f60: 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 73 74 72   context..*/.str
0f70: 75 63 74 20 46 74 73 35 50 61 72 73 65 20 7b 0a  uct Fts5Parse {.
0f80: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
0f90: 6f 6e 66 69 67 3b 0a 20 20 63 68 61 72 20 2a 7a  onfig;.  char *z
0fa0: 45 72 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Err;.  int rc;. 
0fb0: 20 69 6e 74 20 6e 50 68 72 61 73 65 3b 20 20 20   int nPhrase;   
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 50 68   /* Size of apPh
0fe0: 72 61 73 65 20 61 72 72 61 79 20 2a 2f 0a 20 20  rase array */.  
0ff0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
1000: 2a 61 70 50 68 72 61 73 65 3b 20 20 20 20 20 20  *apPhrase;      
1010: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 6c 6c 20  /* Array of all 
1020: 70 68 72 61 73 65 73 20 2a 2f 0a 20 20 46 74 73  phrases */.  Fts
1030: 35 45 78 70 72 4e 6f 64 65 20 2a 70 45 78 70 72  5ExprNode *pExpr
1040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1050: 52 65 73 75 6c 74 20 6f 66 20 61 20 73 75 63 63  Result of a succ
1060: 65 73 73 66 75 6c 20 70 61 72 73 65 20 2a 2f 0a  essful parse */.
1070: 7d 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  };..void sqlite3
1080: 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 46  Fts5ParseError(F
1090: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
10a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
10b0: 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  mt, ...){.  va_l
10c0: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
10d0: 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
10e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
10f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1100: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 20 3d 20   pParse->zErr = 
1110: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
1120: 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20  (zFmt, ap);.    
1130: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1140: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1150: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
1160: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45  static int fts5E
1170: 78 70 72 49 73 73 70 61 63 65 28 63 68 61 72 20  xprIsspace(char 
1180: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 74 3d 3d  t){.  return t==
1190: 27 20 27 20 7c 7c 20 74 3d 3d 27 5c 74 27 20 7c  ' ' || t=='\t' |
11a0: 7c 20 74 3d 3d 27 5c 6e 27 20 7c 7c 20 74 3d 3d  | t=='\n' || t==
11b0: 27 5c 72 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  '\r';.}../*.** R
11c0: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74 6f  ead the first to
11d0: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 6e 75 6c  ken from the nul
11e0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
11f0: 6e 67 20 61 74 20 2a 70 7a 2e 0a 2a 2f 0a 73 74  ng at *pz..*/.st
1200: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
1210: 72 47 65 74 54 6f 6b 65 6e 28 0a 20 20 46 74 73  rGetToken(.  Fts
1220: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
1230: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
1240: 70 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pz,             
1250: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f     /* IN/OUT: Po
1260: 69 6e 74 65 72 20 69 6e 74 6f 20 62 75 66 66 65  inter into buffe
1270: 72 20 2a 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e  r */.  Fts5Token
1280: 20 2a 70 54 6f 6b 65 6e 0a 29 7b 0a 20 20 63 6f   *pToken.){.  co
1290: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 2a 70  nst char *z = *p
12a0: 7a 3b 0a 20 20 69 6e 74 20 74 6f 6b 3b 0a 0a 20  z;.  int tok;.. 
12b0: 20 2f 2a 20 53 6b 69 70 20 70 61 73 74 20 61 6e   /* Skip past an
12c0: 79 20 77 68 69 74 65 73 70 61 63 65 20 2a 2f 0a  y whitespace */.
12d0: 20 20 77 68 69 6c 65 28 20 66 74 73 35 45 78 70    while( fts5Exp
12e0: 72 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  rIsspace(*z) ) z
12f0: 2b 2b 3b 0a 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70  ++;..  pToken->p
1300: 20 3d 20 7a 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e   = z;.  pToken->
1310: 6e 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28  n = 1;.  switch(
1320: 20 2a 7a 20 29 7b 0a 20 20 20 20 63 61 73 65 20   *z ){.    case 
1330: 27 28 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  '(':  tok = FTS5
1340: 5f 4c 50 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  _LP;    break;. 
1350: 20 20 20 63 61 73 65 20 27 29 27 3a 20 20 74 6f     case ')':  to
1360: 6b 20 3d 20 46 54 53 35 5f 52 50 3b 20 20 20 20  k = FTS5_RP;    
1370: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1380: 27 7b 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  '{':  tok = FTS5
1390: 5f 4c 43 50 3b 20 20 20 62 72 65 61 6b 3b 0a 20  _LCP;   break;. 
13a0: 20 20 20 63 61 73 65 20 27 7d 27 3a 20 20 74 6f     case '}':  to
13b0: 6b 20 3d 20 46 54 53 35 5f 52 43 50 3b 20 20 20  k = FTS5_RCP;   
13c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
13d0: 27 3a 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  ':':  tok = FTS5
13e0: 5f 43 4f 4c 4f 4e 3b 20 62 72 65 61 6b 3b 0a 20  _COLON; break;. 
13f0: 20 20 20 63 61 73 65 20 27 2c 27 3a 20 20 74 6f     case ',':  to
1400: 6b 20 3d 20 46 54 53 35 5f 43 4f 4d 4d 41 3b 20  k = FTS5_COMMA; 
1410: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1420: 27 2b 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  '+':  tok = FTS5
1430: 5f 50 4c 55 53 3b 20 20 62 72 65 61 6b 3b 0a 20  _PLUS;  break;. 
1440: 20 20 20 63 61 73 65 20 27 2a 27 3a 20 20 74 6f     case '*':  to
1450: 6b 20 3d 20 46 54 53 35 5f 53 54 41 52 3b 20 20  k = FTS5_STAR;  
1460: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1470: 27 2d 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  '-':  tok = FTS5
1480: 5f 4d 49 4e 55 53 3b 20 62 72 65 61 6b 3b 0a 20  _MINUS; break;. 
1490: 20 20 20 63 61 73 65 20 27 5e 27 3a 20 20 74 6f     case '^':  to
14a0: 6b 20 3d 20 46 54 53 35 5f 43 41 52 45 54 3b 20  k = FTS5_CARET; 
14b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
14c0: 27 5c 30 27 3a 20 74 6f 6b 20 3d 20 46 54 53 35  '\0': tok = FTS5
14d0: 5f 45 4f 46 3b 20 20 20 62 72 65 61 6b 3b 0a 0a  _EOF;   break;..
14e0: 20 20 20 20 63 61 73 65 20 27 22 27 3a 20 7b 0a      case '"': {.
14f0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1500: 20 2a 7a 32 3b 0a 20 20 20 20 20 20 74 6f 6b 20   *z2;.      tok 
1510: 3d 20 46 54 53 35 5f 53 54 52 49 4e 47 3b 0a 0a  = FTS5_STRING;..
1520: 20 20 20 20 20 20 66 6f 72 28 7a 32 3d 26 7a 5b        for(z2=&z[
1530: 31 5d 3b 20 31 3b 20 7a 32 2b 2b 29 7b 0a 20 20  1]; 1; z2++){.  
1540: 20 20 20 20 20 20 69 66 28 20 7a 32 5b 30 5d 3d        if( z2[0]=
1550: 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='"' ){.        
1560: 20 20 7a 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20    z2++;.        
1570: 20 20 69 66 28 20 7a 32 5b 30 5d 21 3d 27 22 27    if( z2[0]!='"'
1580: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1590: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15a0: 7a 32 5b 30 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20  z2[0]=='\0' ){. 
15b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15c0: 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 70  Fts5ParseError(p
15d0: 50 61 72 73 65 2c 20 22 75 6e 74 65 72 6d 69 6e  Parse, "untermin
15e0: 61 74 65 64 20 73 74 72 69 6e 67 22 29 3b 0a 20  ated string");. 
15f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1600: 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20 20  FTS5_EOF;.      
1610: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1620: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a    pToken->n = (z
1630: 32 20 2d 20 7a 29 3b 0a 20 20 20 20 20 20 62 72  2 - z);.      br
1640: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1650: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
1670: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1680: 65 33 46 74 73 35 49 73 42 61 72 65 77 6f 72 64  e3Fts5IsBareword
1690: 28 7a 5b 30 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  (z[0])==0 ){.   
16a0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
16b0: 50 61 72 73 65 45 72 72 6f 72 28 70 50 61 72 73  ParseError(pPars
16c0: 65 2c 20 22 66 74 73 35 3a 20 73 79 6e 74 61 78  e, "fts5: syntax
16d0: 20 65 72 72 6f 72 20 6e 65 61 72 20 5c 22 25 2e   error near \"%.
16e0: 31 73 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20  1s\"", z);.     
16f0: 20 20 20 72 65 74 75 72 6e 20 46 54 53 35 5f 45     return FTS5_E
1700: 4f 46 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OF;.      }.    
1710: 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 53 54 52    tok = FTS5_STR
1720: 49 4e 47 3b 0a 20 20 20 20 20 20 66 6f 72 28 7a  ING;.      for(z
1730: 32 3d 26 7a 5b 31 5d 3b 20 73 71 6c 69 74 65 33  2=&z[1]; sqlite3
1740: 46 74 73 35 49 73 42 61 72 65 77 6f 72 64 28 2a  Fts5IsBareword(*
1750: 7a 32 29 3b 20 7a 32 2b 2b 29 3b 0a 20 20 20 20  z2); z2++);.    
1760: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a    pToken->n = (z
1770: 32 20 2d 20 7a 29 3b 0a 20 20 20 20 20 20 69 66  2 - z);.      if
1780: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 32 20 26  ( pToken->n==2 &
1790: 26 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2d  & memcmp(pToken-
17a0: 3e 70 2c 20 22 4f 52 22 2c 20 32 29 3d 3d 30 20  >p, "OR", 2)==0 
17b0: 29 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4f 52  )  tok = FTS5_OR
17c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b  ;.      if( pTok
17d0: 65 6e 2d 3e 6e 3d 3d 33 20 26 26 20 6d 65 6d 63  en->n==3 && memc
17e0: 6d 70 28 70 54 6f 6b 65 6e 2d 3e 70 2c 20 22 4e  mp(pToken->p, "N
17f0: 4f 54 22 2c 20 33 29 3d 3d 30 20 29 20 74 6f 6b  OT", 3)==0 ) tok
1800: 20 3d 20 46 54 53 35 5f 4e 4f 54 3b 0a 20 20 20   = FTS5_NOT;.   
1810: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e     if( pToken->n
1820: 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 70 54  ==3 && memcmp(pT
1830: 6f 6b 65 6e 2d 3e 70 2c 20 22 41 4e 44 22 2c 20  oken->p, "AND", 
1840: 33 29 3d 3d 30 20 29 20 74 6f 6b 20 3d 20 46 54  3)==0 ) tok = FT
1850: 53 35 5f 41 4e 44 3b 0a 20 20 20 20 20 20 62 72  S5_AND;.      br
1860: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
1870: 20 20 2a 70 7a 20 3d 20 26 70 54 6f 6b 65 6e 2d    *pz = &pToken-
1880: 3e 70 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 3b 0a 20  >p[pToken->n];. 
1890: 20 72 65 74 75 72 6e 20 74 6f 6b 3b 0a 7d 0a 0a   return tok;.}..
18a0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
18b0: 35 50 61 72 73 65 41 6c 6c 6f 63 28 75 36 34 20  5ParseAlloc(u64 
18c0: 74 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  t){ return sqlit
18d0: 65 33 5f 6d 61 6c 6c 6f 63 28 28 69 6e 74 29 74  e3_malloc((int)t
18e0: 29 3b 20 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  ); }.static void
18f0: 20 66 74 73 35 50 61 72 73 65 46 72 65 65 28 76   fts5ParseFree(v
1900: 6f 69 64 20 2a 70 29 7b 20 73 71 6c 69 74 65 33  oid *p){ sqlite3
1910: 5f 66 72 65 65 28 70 29 3b 20 7d 0a 0a 69 6e 74  _free(p); }..int
1920: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
1930: 4e 65 77 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  New(.  Fts5Confi
1940: 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20  g *pConfig,     
1950: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 43         /* FTS5 C
1960: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
1970: 20 20 69 6e 74 20 69 43 6f 6c 2c 0a 20 20 63 6f    int iCol,.  co
1980: 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 72 2c  nst char *zExpr,
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a0: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 65 78 74   Expression text
19b0: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 20 2a   */.  Fts5Expr *
19c0: 2a 70 70 4e 65 77 2c 20 0a 20 20 63 68 61 72 20  *ppNew, .  char 
19d0: 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 46 74 73  **pzErr.){.  Fts
19e0: 35 50 61 72 73 65 20 73 50 61 72 73 65 3b 0a 20  5Parse sParse;. 
19f0: 20 46 74 73 35 54 6f 6b 65 6e 20 74 6f 6b 65 6e   Fts5Token token
1a00: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1a10: 7a 20 3d 20 7a 45 78 70 72 3b 0a 20 20 69 6e 74  z = zExpr;.  int
1a20: 20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   t;             
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a40: 4e 65 78 74 20 74 6f 6b 65 6e 20 74 79 70 65 20  Next token type 
1a50: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 45 6e 67 69  */.  void *pEngi
1a60: 6e 65 3b 0a 20 20 46 74 73 35 45 78 70 72 20 2a  ne;.  Fts5Expr *
1a70: 70 4e 65 77 3b 0a 0a 20 20 2a 70 70 4e 65 77 20  pNew;..  *ppNew 
1a80: 3d 20 30 3b 0a 20 20 2a 70 7a 45 72 72 20 3d 20  = 0;.  *pzErr = 
1a90: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 50 61  0;.  memset(&sPa
1aa0: 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  rse, 0, sizeof(s
1ab0: 50 61 72 73 65 29 29 3b 0a 20 20 70 45 6e 67 69  Parse));.  pEngi
1ac0: 6e 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  ne = sqlite3Fts5
1ad0: 50 61 72 73 65 72 41 6c 6c 6f 63 28 66 74 73 35  ParserAlloc(fts5
1ae0: 50 61 72 73 65 41 6c 6c 6f 63 29 3b 0a 20 20 69  ParseAlloc);.  i
1af0: 66 28 20 70 45 6e 67 69 6e 65 3d 3d 30 20 29 7b  f( pEngine==0 ){
1b00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1b10: 4f 4d 45 4d 3b 20 7d 0a 20 20 73 50 61 72 73 65  OMEM; }.  sParse
1b20: 2e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  .pConfig = pConf
1b30: 69 67 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ig;..  do {.    
1b40: 74 20 3d 20 66 74 73 35 45 78 70 72 47 65 74 54  t = fts5ExprGetT
1b50: 6f 6b 65 6e 28 26 73 50 61 72 73 65 2c 20 26 7a  oken(&sParse, &z
1b60: 2c 20 26 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 73  , &token);.    s
1b70: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
1b80: 28 70 45 6e 67 69 6e 65 2c 20 74 2c 20 74 6f 6b  (pEngine, t, tok
1b90: 65 6e 2c 20 26 73 50 61 72 73 65 29 3b 0a 20 20  en, &sParse);.  
1ba0: 7d 77 68 69 6c 65 28 20 73 50 61 72 73 65 2e 72  }while( sParse.r
1bb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bc0: 74 21 3d 46 54 53 35 5f 45 4f 46 20 29 3b 0a 20  t!=FTS5_EOF );. 
1bd0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
1be0: 65 72 46 72 65 65 28 70 45 6e 67 69 6e 65 2c 20  erFree(pEngine, 
1bf0: 66 74 73 35 50 61 72 73 65 46 72 65 65 29 3b 0a  fts5ParseFree);.
1c00: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53  .  /* If the LHS
1c10: 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 65 78   of the MATCH ex
1c20: 70 72 65 73 73 69 6f 6e 20 77 61 73 20 61 20 75  pression was a u
1c30: 73 65 72 20 63 6f 6c 75 6d 6e 2c 20 61 70 70 6c  ser column, appl
1c40: 79 20 74 68 65 0a 20 20 2a 2a 20 69 6d 70 6c 69  y the.  ** impli
1c50: 63 69 74 20 63 6f 6c 75 6d 6e 2d 66 69 6c 74 65  cit column-filte
1c60: 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  r.  */.  if( iCo
1c70: 6c 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20  l<pConfig->nCol 
1c80: 26 26 20 73 50 61 72 73 65 2e 70 45 78 70 72 20  && sParse.pExpr 
1c90: 26 26 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51  && sParse.rc==SQ
1ca0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1cb0: 6e 74 20 6e 20 3d 20 73 69 7a 65 6f 66 28 46 74  nt n = sizeof(Ft
1cc0: 73 35 43 6f 6c 73 65 74 29 3b 0a 20 20 20 20 46  s5Colset);.    F
1cd0: 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
1ce0: 65 74 20 3d 20 28 46 74 73 35 43 6f 6c 73 65 74  et = (Fts5Colset
1cf0: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
1d00: 6c 6f 63 5a 65 72 6f 28 26 73 50 61 72 73 65 2e  locZero(&sParse.
1d10: 72 63 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  rc, n);.    if( 
1d20: 70 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20 20  pColset ){.     
1d30: 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 20 3d   pColset->nCol =
1d40: 20 31 3b 0a 20 20 20 20 20 20 70 43 6f 6c 73 65   1;.      pColse
1d50: 74 2d 3e 61 69 43 6f 6c 5b 30 5d 20 3d 20 69 43  t->aiCol[0] = iC
1d60: 6f 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ol;.      sqlite
1d70: 33 46 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c  3Fts5ParseSetCol
1d80: 73 65 74 28 26 73 50 61 72 73 65 2c 20 73 50 61  set(&sParse, sPa
1d90: 72 73 65 2e 70 45 78 70 72 2c 20 70 43 6f 6c 73  rse.pExpr, pCols
1da0: 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  et);.    }.  }..
1db0: 20 20 61 73 73 65 72 74 28 20 73 50 61 72 73 65    assert( sParse
1dc0: 2e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  .rc!=SQLITE_OK |
1dd0: 7c 20 73 50 61 72 73 65 2e 7a 45 72 72 3d 3d 30  | sParse.zErr==0
1de0: 20 29 3b 0a 20 20 69 66 28 20 73 50 61 72 73 65   );.  if( sParse
1df0: 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  .rc==SQLITE_OK )
1e00: 7b 0a 20 20 20 20 2a 70 70 4e 65 77 20 3d 20 70  {.    *ppNew = p
1e10: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
1e20: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 35  lloc(sizeof(Fts5
1e30: 45 78 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20  Expr));.    if( 
1e40: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1e50: 20 73 50 61 72 73 65 2e 72 63 20 3d 20 53 51 4c   sParse.rc = SQL
1e60: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1e70: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
1e80: 65 4e 6f 64 65 46 72 65 65 28 73 50 61 72 73 65  eNodeFree(sParse
1e90: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c  .pExpr);.    }el
1ea0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73  se{.      if( !s
1eb0: 50 61 72 73 65 2e 70 45 78 70 72 20 29 7b 0a 20  Parse.pExpr ){. 
1ec0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
1ed0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1ee0: 46 74 73 35 45 78 70 72 4e 6f 64 65 29 3b 0a 20  Fts5ExprNode);. 
1ef0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f         pNew->pRo
1f00: 6f 74 20 3d 20 28 46 74 73 35 45 78 70 72 4e 6f  ot = (Fts5ExprNo
1f10: 64 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  de*)sqlite3Fts5M
1f20: 61 6c 6c 6f 63 5a 65 72 6f 28 26 73 50 61 72 73  allocZero(&sPars
1f30: 65 2e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  e.rc, nByte);.  
1f40: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
1f50: 70 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  pRoot ){.       
1f60: 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e     pNew->pRoot->
1f70: 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  bEof = 1;.      
1f80: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1f90: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
1fa0: 52 6f 6f 74 20 3d 20 73 50 61 72 73 65 2e 70 45  Root = sParse.pE
1fb0: 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xpr;.      }.   
1fc0: 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20     pNew->pIndex 
1fd0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  = 0;.      pNew-
1fe0: 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
1ff0: 69 67 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ig;.      pNew->
2000: 61 70 45 78 70 72 50 68 72 61 73 65 20 3d 20 73  apExprPhrase = s
2010: 50 61 72 73 65 2e 61 70 50 68 72 61 73 65 3b 0a  Parse.apPhrase;.
2020: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 50 68 72        pNew->nPhr
2030: 61 73 65 20 3d 20 73 50 61 72 73 65 2e 6e 50 68  ase = sParse.nPh
2040: 72 61 73 65 3b 0a 20 20 20 20 20 20 73 50 61 72  rase;.      sPar
2050: 73 65 2e 61 70 50 68 72 61 73 65 20 3d 20 30 3b  se.apPhrase = 0;
2060: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2070: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
2080: 61 72 73 65 4e 6f 64 65 46 72 65 65 28 73 50 61  arseNodeFree(sPa
2090: 72 73 65 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  rse.pExpr);.  }.
20a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20b0: 73 50 61 72 73 65 2e 61 70 50 68 72 61 73 65 29  sParse.apPhrase)
20c0: 3b 0a 20 20 2a 70 7a 45 72 72 20 3d 20 73 50 61  ;.  *pzErr = sPa
20d0: 72 73 65 2e 7a 45 72 72 3b 0a 20 20 72 65 74 75  rse.zErr;.  retu
20e0: 72 6e 20 73 50 61 72 73 65 2e 72 63 3b 0a 7d 0a  rn sParse.rc;.}.
20f0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
2100: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
2110: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2120: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
2130: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
2140: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
2150: 46 72 65 65 28 46 74 73 35 45 78 70 72 4e 6f 64  Free(Fts5ExprNod
2160: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  e *p){.  if( p )
2170: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2180: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2190: 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Child; i++){.   
21a0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61     sqlite3Fts5Pa
21b0: 72 73 65 4e 6f 64 65 46 72 65 65 28 70 2d 3e 61  rseNodeFree(p->a
21c0: 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  pChild[i]);.    
21d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
21e0: 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72 65  5ParseNearsetFre
21f0: 65 28 70 2d 3e 70 4e 65 61 72 29 3b 0a 20 20 20  e(p->pNear);.   
2200: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
2210: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
2220: 72 65 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ree the expressi
2230: 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  on object passed
2240: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
2250: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
2260: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 72  qlite3Fts5ExprFr
2270: 65 65 28 46 74 73 35 45 78 70 72 20 2a 70 29 7b  ee(Fts5Expr *p){
2280: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2290: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
22a0: 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70 52 6f 6f  NodeFree(p->pRoo
22b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
22c0: 66 72 65 65 28 70 2d 3e 61 70 45 78 70 72 50 68  free(p->apExprPh
22d0: 72 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  rase);.    sqlit
22e0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
22f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
2300: 74 20 70 54 65 72 6d 20 6d 75 73 74 20 62 65 20  t pTerm must be 
2310: 61 20 73 79 6e 6f 6e 79 6d 20 69 74 65 72 61 74  a synonym iterat
2320: 6f 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20 63  or. Return the c
2330: 75 72 72 65 6e 74 20 72 6f 77 69 64 0a 2a 2a 20  urrent rowid.** 
2340: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2350: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  o..*/.static i64
2360: 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d   fts5ExprSynonym
2370: 52 6f 77 69 64 28 46 74 73 35 45 78 70 72 54 65  Rowid(Fts5ExprTe
2380: 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 62  rm *pTerm, int b
2390: 44 65 73 63 2c 20 69 6e 74 20 2a 70 62 45 6f 66  Desc, int *pbEof
23a0: 29 7b 0a 20 20 69 36 34 20 69 52 65 74 20 3d 20  ){.  i64 iRet = 
23b0: 30 3b 0a 20 20 69 6e 74 20 62 52 65 74 56 61 6c  0;.  int bRetVal
23c0: 69 64 20 3d 20 30 3b 0a 20 20 46 74 73 35 45 78  id = 0;.  Fts5Ex
23d0: 70 72 54 65 72 6d 20 2a 70 3b 0a 0a 20 20 61 73  prTerm *p;..  as
23e0: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 53 79  sert( pTerm->pSy
23f0: 6e 6f 6e 79 6d 20 29 3b 0a 20 20 61 73 73 65 72  nonym );.  asser
2400: 74 28 20 62 44 65 73 63 3d 3d 30 20 7c 7c 20 62  t( bDesc==0 || b
2410: 44 65 73 63 3d 3d 31 20 29 3b 0a 20 20 66 6f 72  Desc==1 );.  for
2420: 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20 70 3d 70  (p=pTerm; p; p=p
2430: 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20  ->pSynonym){.   
2440: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 46   if( 0==sqlite3F
2450: 74 73 35 49 74 65 72 45 6f 66 28 70 2d 3e 70 49  ts5IterEof(p->pI
2460: 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ter) ){.      i6
2470: 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 70 49  4 iRowid = p->pI
2480: 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20  ter->iRowid;.   
2490: 20 20 20 69 66 28 20 62 52 65 74 56 61 6c 69 64     if( bRetValid
24a0: 3d 3d 30 20 7c 7c 20 28 62 44 65 73 63 21 3d 28  ==0 || (bDesc!=(
24b0: 69 52 6f 77 69 64 3c 69 52 65 74 29 29 20 29 7b  iRowid<iRet)) ){
24c0: 0a 20 20 20 20 20 20 20 20 69 52 65 74 20 3d 20  .        iRet = 
24d0: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
24e0: 62 52 65 74 56 61 6c 69 64 20 3d 20 31 3b 0a 20  bRetValid = 1;. 
24f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2500: 0a 0a 20 20 69 66 28 20 70 62 45 6f 66 20 26 26  ..  if( pbEof &&
2510: 20 62 52 65 74 56 61 6c 69 64 3d 3d 30 20 29 20   bRetValid==0 ) 
2520: 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 72 65  *pbEof = 1;.  re
2530: 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn iRet;.}../*
2540: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 54 65  .** Argument pTe
2550: 72 6d 20 6d 75 73 74 20 62 65 20 61 20 73 79 6e  rm must be a syn
2560: 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e 0a 2a  onym iterator..*
2570: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2580: 35 45 78 70 72 53 79 6e 6f 6e 79 6d 4c 69 73 74  5ExprSynonymList
2590: 28 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d  (.  Fts5ExprTerm
25a0: 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69 36 34 20   *pTerm, .  i64 
25b0: 69 52 6f 77 69 64 2c 0a 20 20 46 74 73 35 42 75  iRowid,.  Fts5Bu
25c0: 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20  ffer *pBuf,     
25d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
25e0: 20 74 68 69 73 20 62 75 66 66 65 72 20 66 6f 72   this buffer for
25f0: 20 73 70 61 63 65 20 69 66 20 72 65 71 75 69 72   space if requir
2600: 65 64 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 61 2c  ed */.  u8 **pa,
2610: 20 69 6e 74 20 2a 70 6e 0a 29 7b 0a 20 20 46 74   int *pn.){.  Ft
2620: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
2630: 61 53 74 61 74 69 63 5b 34 5d 3b 0a 20 20 46 74  aStatic[4];.  Ft
2640: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
2650: 2a 61 49 74 65 72 20 3d 20 61 53 74 61 74 69 63  *aIter = aStatic
2660: 3b 0a 20 20 69 6e 74 20 6e 49 74 65 72 20 3d 20  ;.  int nIter = 
2670: 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  0;.  int nAlloc 
2680: 3d 20 34 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 4;.  int rc = 
2690: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
26a0: 35 45 78 70 72 54 65 72 6d 20 2a 70 3b 0a 0a 20  5ExprTerm *p;.. 
26b0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
26c0: 70 53 79 6e 6f 6e 79 6d 20 29 3b 0a 20 20 66 6f  pSynonym );.  fo
26d0: 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20 70 3d  r(p=pTerm; p; p=
26e0: 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20  p->pSynonym){.  
26f0: 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
2700: 2a 70 49 74 65 72 20 3d 20 70 2d 3e 70 49 74 65  *pIter = p->pIte
2710: 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
2720: 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
2730: 74 65 72 29 3d 3d 30 20 26 26 20 70 49 74 65 72  ter)==0 && pIter
2740: 2d 3e 69 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64  ->iRowid==iRowid
2750: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
2760: 74 65 72 2d 3e 6e 44 61 74 61 3d 3d 30 20 29 20  ter->nData==0 ) 
2770: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2780: 69 66 28 20 6e 49 74 65 72 3d 3d 6e 41 6c 6c 6f  if( nIter==nAllo
2790: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  c ){.        int
27a0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
27b0: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
27c0: 72 29 20 2a 20 6e 41 6c 6c 6f 63 20 2a 20 32 3b  r) * nAlloc * 2;
27d0: 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
27e0: 6c 69 73 74 52 65 61 64 65 72 20 2a 61 4e 65 77  listReader *aNew
27f0: 20 3d 20 28 46 74 73 35 50 6f 73 6c 69 73 74 52   = (Fts5PoslistR
2800: 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33 5f 6d  eader*)sqlite3_m
2810: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
2820: 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
2830: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
2840: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2850: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2860: 20 73 79 6e 6f 6e 79 6d 5f 70 6f 73 6c 69 73 74   synonym_poslist
2870: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
2880: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
2890: 4e 65 77 2c 20 61 49 74 65 72 2c 20 73 69 7a 65  New, aIter, size
28a0: 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  of(Fts5PoslistRe
28b0: 61 64 65 72 29 20 2a 20 6e 49 74 65 72 29 3b 0a  ader) * nIter);.
28c0: 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d          nAlloc =
28d0: 20 6e 41 6c 6c 6f 63 2a 32 3b 0a 20 20 20 20 20   nAlloc*2;.     
28e0: 20 20 20 69 66 28 20 61 49 74 65 72 21 3d 61 53     if( aIter!=aS
28f0: 74 61 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f  tatic ) sqlite3_
2900: 66 72 65 65 28 61 49 74 65 72 29 3b 0a 20 20 20  free(aIter);.   
2910: 20 20 20 20 20 61 49 74 65 72 20 3d 20 61 4e 65       aIter = aNe
2920: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
2930: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2940: 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 70 49  istReaderInit(pI
2950: 74 65 72 2d 3e 70 44 61 74 61 2c 20 70 49 74 65  ter->pData, pIte
2960: 72 2d 3e 6e 44 61 74 61 2c 20 26 61 49 74 65 72  r->nData, &aIter
2970: 5b 6e 49 74 65 72 5d 29 3b 0a 20 20 20 20 20 20  [nIter]);.      
2980: 61 73 73 65 72 74 28 20 61 49 74 65 72 5b 6e 49  assert( aIter[nI
2990: 74 65 72 5d 2e 62 45 6f 66 3d 3d 30 20 29 3b 0a  ter].bEof==0 );.
29a0: 20 20 20 20 20 20 6e 49 74 65 72 2b 2b 3b 0a 20        nIter++;. 
29b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
29c0: 6e 49 74 65 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nIter==1 ){.    
29d0: 2a 70 61 20 3d 20 28 75 38 2a 29 61 49 74 65 72  *pa = (u8*)aIter
29e0: 5b 30 5d 2e 61 3b 0a 20 20 20 20 2a 70 6e 20 3d  [0].a;.    *pn =
29f0: 20 61 49 74 65 72 5b 30 5d 2e 6e 3b 0a 20 20 7d   aIter[0].n;.  }
2a00: 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 50 6f  else{.    Fts5Po
2a10: 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69 74  slistWriter writ
2a20: 65 72 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 69 36  er = {0};.    i6
2a30: 34 20 69 50 72 65 76 20 3d 20 2d 31 3b 0a 20 20  4 iPrev = -1;.  
2a40: 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
2a50: 28 70 42 75 66 29 3b 0a 20 20 20 20 77 68 69 6c  (pBuf);.    whil
2a60: 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  e( 1 ){.      in
2a70: 74 20 69 3b 0a 20 20 20 20 20 20 69 36 34 20 69  t i;.      i64 i
2a80: 4d 69 6e 20 3d 20 46 54 53 35 5f 4c 41 52 47 45  Min = FTS5_LARGE
2a90: 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 20 20  ST_INT64;.      
2aa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 74 65 72  for(i=0; i<nIter
2ab0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2ac0: 69 66 28 20 61 49 74 65 72 5b 69 5d 2e 62 45 6f  if( aIter[i].bEo
2ad0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
2ae0: 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d 2e 69    if( aIter[i].i
2af0: 50 6f 73 3d 3d 69 50 72 65 76 20 29 7b 0a 20 20  Pos==iPrev ){.  
2b00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2b10: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
2b20: 52 65 61 64 65 72 4e 65 78 74 28 26 61 49 74 65  ReaderNext(&aIte
2b30: 72 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  r[i]) ) continue
2b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b50: 20 20 20 20 20 20 20 20 69 66 28 20 61 49 74 65          if( aIte
2b60: 72 5b 69 5d 2e 69 50 6f 73 3c 69 4d 69 6e 20 29  r[i].iPos<iMin )
2b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4d  {.            iM
2b80: 69 6e 20 3d 20 61 49 74 65 72 5b 69 5d 2e 69 50  in = aIter[i].iP
2b90: 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  os;.          }.
2ba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 4d 69 6e  }.      if( iMin
2bc0: 3d 3d 46 54 53 35 5f 4c 41 52 47 45 53 54 5f 49  ==FTS5_LARGEST_I
2bd0: 4e 54 36 34 20 7c 7c 20 72 63 21 3d 53 51 4c 49  NT64 || rc!=SQLI
2be0: 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20  TE_OK ) break;. 
2bf0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c00: 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74  3Fts5PoslistWrit
2c10: 65 72 41 70 70 65 6e 64 28 70 42 75 66 2c 20 26  erAppend(pBuf, &
2c20: 77 72 69 74 65 72 2c 20 69 4d 69 6e 29 3b 0a 20  writer, iMin);. 
2c30: 20 20 20 20 20 69 50 72 65 76 20 3d 20 69 4d 69       iPrev = iMi
2c40: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
2c50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c60: 7b 0a 20 20 20 20 20 20 2a 70 61 20 3d 20 70 42  {.      *pa = pB
2c70: 75 66 2d 3e 70 3b 0a 20 20 20 20 20 20 2a 70 6e  uf->p;.      *pn
2c80: 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20   = pBuf->n;.    
2c90: 7d 0a 20 20 7d 0a 0a 20 73 79 6e 6f 6e 79 6d 5f  }.  }.. synonym_
2ca0: 70 6f 73 6c 69 73 74 5f 6f 75 74 3a 0a 20 20 69  poslist_out:.  i
2cb0: 66 28 20 61 49 74 65 72 21 3d 61 53 74 61 74 69  f( aIter!=aStati
2cc0: 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  c ) sqlite3_free
2cd0: 28 61 49 74 65 72 29 3b 0a 20 20 72 65 74 75 72  (aIter);.  retur
2ce0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2cf0: 41 6c 6c 20 69 6e 64 69 76 69 64 75 61 6c 20 74  All individual t
2d00: 65 72 6d 20 69 74 65 72 61 74 6f 72 73 20 69 6e  erm iterators in
2d10: 20 70 50 68 72 61 73 65 20 61 72 65 20 67 75 61   pPhrase are gua
2d20: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 76 61  ranteed to be va
2d30: 6c 69 64 20 61 6e 64 0a 2a 2a 20 70 6f 69 6e 74  lid and.** point
2d40: 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
2d50: 72 6f 77 69 64 20 77 68 65 6e 20 74 68 69 73 20  rowid when this 
2d60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2d70: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2d80: 6e 20 0a 2a 2a 20 63 68 65 63 6b 73 20 69 66 20  n .** checks if 
2d90: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69  the current rowi
2da0: 64 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6d 61  d really is a ma
2db0: 74 63 68 2c 20 61 6e 64 20 69 66 20 73 6f 20 70  tch, and if so p
2dc0: 6f 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68 65 20  opulates.** the 
2dd0: 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
2de0: 20 62 75 66 66 65 72 20 61 63 63 6f 72 64 69 6e   buffer accordin
2df0: 67 6c 79 2e 20 4f 75 74 70 75 74 20 70 61 72 61  gly. Output para
2e00: 6d 65 74 65 72 20 2a 70 62 4d 61 74 63 68 0a 2a  meter *pbMatch.*
2e10: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  * is set to true
2e20: 20 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c   if this is real
2e30: 6c 79 20 61 20 6d 61 74 63 68 2c 20 6f 72 20 66  ly a match, or f
2e40: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
2e50: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2e60: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
2e70: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2e80: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
2e90: 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 6f 74 68 65  or code .** othe
2ea0: 72 77 69 73 65 2e 20 49 74 20 69 73 20 6e 6f 74  rwise. It is not
2eb0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
2ec0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
2ed0: 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 20 69   current rowid i
2ee0: 73 20 0a 2a 2a 20 6e 6f 74 20 61 20 6d 61 74 63  s .** not a matc
2ef0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
2f00: 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65 49   fts5ExprPhraseI
2f10: 73 4d 61 74 63 68 28 0a 20 20 46 74 73 35 45 78  sMatch(.  Fts5Ex
2f20: 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20  prNode *pNode,  
2f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64            /* Nod
2f40: 65 20 70 50 68 72 61 73 65 20 62 65 6c 6f 6e 67  e pPhrase belong
2f50: 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 45 78  s to */.  Fts5Ex
2f60: 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
2f70: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72  e,        /* Phr
2f80: 61 73 65 20 6f 62 6a 65 63 74 20 74 6f 20 69 6e  ase object to in
2f90: 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e  itialize */.  in
2fa0: 74 20 2a 70 62 4d 61 74 63 68 20 20 20 20 20 20  t *pbMatch      
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc0: 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74 72 75   OUT: Set to tru
2fd0: 65 20 69 66 20 72 65 61 6c 6c 79 20 61 20 6d 61  e if really a ma
2fe0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  tch */.){.  Fts5
2ff0: 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
3000: 69 74 65 72 20 3d 20 7b 30 7d 3b 0a 20 20 46 74  iter = {0};.  Ft
3010: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
3020: 61 53 74 61 74 69 63 5b 34 5d 3b 0a 20 20 46 74  aStatic[4];.  Ft
3030: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
3040: 2a 61 49 74 65 72 20 3d 20 61 53 74 61 74 69 63  *aIter = aStatic
3050: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
3060: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3070: 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d 20  .  int bFirst = 
3080: 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30  pPhrase->aTerm[0
3090: 5d 2e 62 46 69 72 73 74 3b 0a 20 20 0a 20 20 66  ].bFirst;.  .  f
30a0: 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
30b0: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 29  Phrase->poslist)
30c0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  ;..  /* If the a
30d0: 53 74 61 74 69 63 5b 5d 20 61 72 72 61 79 20 69  Static[] array i
30e0: 73 20 6e 6f 74 20 6c 61 72 67 65 20 65 6e 6f 75  s not large enou
30f0: 67 68 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6c  gh, allocate a l
3100: 61 72 67 65 20 61 72 72 61 79 0a 20 20 2a 2a 20  arge array.  ** 
3110: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61  using sqlite3_ma
3120: 6c 6c 6f 63 28 29 2e 20 54 68 69 73 20 61 70 70  lloc(). This app
3130: 72 6f 61 63 68 20 63 6f 75 6c 64 20 62 65 20 69  roach could be i
3140: 6d 70 72 6f 76 65 64 20 75 70 6f 6e 2e 20 2a 2f  mproved upon. */
3150: 0a 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e  .  if( pPhrase->
3160: 6e 54 65 72 6d 3e 41 72 72 61 79 53 69 7a 65 28  nTerm>ArraySize(
3170: 61 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  aStatic) ){.    
3180: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
3190: 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  of(Fts5PoslistRe
31a0: 61 64 65 72 29 20 2a 20 70 50 68 72 61 73 65 2d  ader) * pPhrase-
31b0: 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 61 49 74 65  >nTerm;.    aIte
31c0: 72 20 3d 20 28 46 74 73 35 50 6f 73 6c 69 73 74  r = (Fts5Poslist
31d0: 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33 5f  Reader*)sqlite3_
31e0: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
31f0: 20 20 20 69 66 28 20 21 61 49 74 65 72 20 29 20     if( !aIter ) 
3200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
3210: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
3220: 74 28 61 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(aIter, 0, size
3230: 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  of(Fts5PoslistRe
3240: 61 64 65 72 29 20 2a 20 70 50 68 72 61 73 65 2d  ader) * pPhrase-
3250: 3e 6e 54 65 72 6d 29 3b 0a 0a 20 20 2f 2a 20 49  >nTerm);..  /* I
3260: 6e 69 74 69 61 6c 69 7a 65 20 61 20 74 65 72 6d  nitialize a term
3270: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 65 61   iterator for ea
3280: 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 70  ch term in the p
3290: 68 72 61 73 65 20 2a 2f 0a 20 20 66 6f 72 28 69  hrase */.  for(i
32a0: 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e  =0; i<pPhrase->n
32b0: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
32c0: 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
32d0: 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e  erm = &pPhrase->
32e0: 61 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 69 6e  aTerm[i];.    in
32f0: 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t n = 0;.    int
3300: 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20   bFlag = 0;.    
3310: 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 20 20 69  u8 *a = 0;.    i
3320: 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  f( pTerm->pSynon
3330: 79 6d 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  ym ){.      Fts5
3340: 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c  Buffer buf = {0,
3350: 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20 72 63   0, 0};.      rc
3360: 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e   = fts5ExprSynon
3370: 79 6d 4c 69 73 74 28 70 54 65 72 6d 2c 20 70 4e  ymList(pTerm, pN
3380: 6f 64 65 2d 3e 69 52 6f 77 69 64 2c 20 26 62 75  ode->iRowid, &bu
3390: 66 2c 20 26 61 2c 20 26 6e 29 3b 0a 20 20 20 20  f, &a, &n);.    
33a0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
33b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
33c0: 28 61 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  (a);.        got
33d0: 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20  o ismatch_out;. 
33e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
33f0: 20 61 3d 3d 62 75 66 2e 70 20 29 20 62 46 6c 61   a==buf.p ) bFla
3400: 67 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 1;.    }else
3410: 7b 0a 20 20 20 20 20 20 61 20 3d 20 28 75 38 2a  {.      a = (u8*
3420: 29 70 54 65 72 6d 2d 3e 70 49 74 65 72 2d 3e 70  )pTerm->pIter->p
3430: 44 61 74 61 3b 0a 20 20 20 20 20 20 6e 20 3d 20  Data;.      n = 
3440: 70 54 65 72 6d 2d 3e 70 49 74 65 72 2d 3e 6e 44  pTerm->pIter->nD
3450: 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
3460: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
3470: 74 52 65 61 64 65 72 49 6e 69 74 28 61 2c 20 6e  tReaderInit(a, n
3480: 2c 20 26 61 49 74 65 72 5b 69 5d 29 3b 0a 20 20  , &aIter[i]);.  
3490: 20 20 61 49 74 65 72 5b 69 5d 2e 62 46 6c 61 67    aIter[i].bFlag
34a0: 20 3d 20 28 75 38 29 62 46 6c 61 67 3b 0a 20 20   = (u8)bFlag;.  
34b0: 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d 2e 62    if( aIter[i].b
34c0: 45 6f 66 20 29 20 67 6f 74 6f 20 69 73 6d 61 74  Eof ) goto ismat
34d0: 63 68 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 77  ch_out;.  }..  w
34e0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
34f0: 6e 74 20 62 4d 61 74 63 68 3b 0a 20 20 20 20 69  nt bMatch;.    i
3500: 36 34 20 69 50 6f 73 20 3d 20 61 49 74 65 72 5b  64 iPos = aIter[
3510: 30 5d 2e 69 50 6f 73 3b 0a 20 20 20 20 64 6f 20  0].iPos;.    do 
3520: 7b 0a 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d  {.      bMatch =
3530: 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
3540: 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54  0; i<pPhrase->nT
3550: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
3560: 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65     Fts5PoslistRe
3570: 61 64 65 72 20 2a 70 50 6f 73 20 3d 20 26 61 49  ader *pPos = &aI
3580: 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ter[i];.        
3590: 69 36 34 20 69 41 64 6a 20 3d 20 69 50 6f 73 20  i64 iAdj = iPos 
35a0: 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + i;.        if(
35b0: 20 70 50 6f 73 2d 3e 69 50 6f 73 21 3d 69 41 64   pPos->iPos!=iAd
35c0: 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  j ){.          b
35d0: 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
35e0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 6f 73       while( pPos
35f0: 2d 3e 69 50 6f 73 3c 69 41 64 6a 20 29 7b 0a 20  ->iPos<iAdj ){. 
3600: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
3610: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
3620: 74 52 65 61 64 65 72 4e 65 78 74 28 70 50 6f 73  tReaderNext(pPos
3630: 29 20 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68  ) ) goto ismatch
3640: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
3650: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
3660: 70 50 6f 73 2d 3e 69 50 6f 73 3e 69 41 64 6a 20  pPos->iPos>iAdj 
3670: 29 20 69 50 6f 73 20 3d 20 70 50 6f 73 2d 3e 69  ) iPos = pPos->i
3680: 50 6f 73 2d 69 3b 0a 20 20 20 20 20 20 20 20 7d  Pos-i;.        }
3690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
36a0: 69 6c 65 28 20 62 4d 61 74 63 68 3d 3d 30 20 29  ile( bMatch==0 )
36b0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  ;..    /* Append
36c0: 20 70 6f 73 69 74 69 6f 6e 20 69 50 6f 73 20 74   position iPos t
36d0: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
36e0: 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d      if( bFirst==
36f0: 30 20 7c 7c 20 46 54 53 35 5f 50 4f 53 32 4f 46  0 || FTS5_POS2OF
3700: 46 53 45 54 28 69 50 6f 73 29 3d 3d 30 20 29 7b  FSET(iPos)==0 ){
3710: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
3720: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72  te3Fts5PoslistWr
3730: 69 74 65 72 41 70 70 65 6e 64 28 26 70 50 68 72  iterAppend(&pPhr
3740: 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2c 20 26 77  ase->poslist, &w
3750: 72 69 74 65 72 2c 20 69 50 6f 73 29 3b 0a 20 20  riter, iPos);.  
3760: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
3770: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 69 73 6d  TE_OK ) goto ism
3780: 61 74 63 68 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  atch_out;.    }.
3790: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
37a0: 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20  pPhrase->nTerm; 
37b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
37c0: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
37d0: 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 61 49  stReaderNext(&aI
37e0: 74 65 72 5b 69 5d 29 20 29 20 67 6f 74 6f 20 69  ter[i]) ) goto i
37f0: 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20 20 20  smatch_out;.    
3800: 7d 0a 20 20 7d 0a 0a 20 69 73 6d 61 74 63 68 5f  }.  }.. ismatch_
3810: 6f 75 74 3a 0a 20 20 2a 70 62 4d 61 74 63 68 20  out:.  *pbMatch 
3820: 3d 20 28 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  = (pPhrase->posl
3830: 69 73 74 2e 6e 3e 30 29 3b 0a 20 20 66 6f 72 28  ist.n>0);.  for(
3840: 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e  i=0; i<pPhrase->
3850: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
3860: 20 69 66 28 20 61 49 74 65 72 5b 69 5d 2e 62 46   if( aIter[i].bF
3870: 6c 61 67 20 29 20 73 71 6c 69 74 65 33 5f 66 72  lag ) sqlite3_fr
3880: 65 65 28 28 75 38 2a 29 61 49 74 65 72 5b 69 5d  ee((u8*)aIter[i]
3890: 2e 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  .a);.  }.  if( a
38a0: 49 74 65 72 21 3d 61 53 74 61 74 69 63 20 29 20  Iter!=aStatic ) 
38b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49 74  sqlite3_free(aIt
38c0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
38d0: 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
38e0: 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61  uct Fts5Lookahea
38f0: 64 52 65 61 64 65 72 20 46 74 73 35 4c 6f 6f 6b  dReader Fts5Look
3900: 61 68 65 61 64 52 65 61 64 65 72 3b 0a 73 74 72  aheadReader;.str
3910: 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61  uct Fts5Lookahea
3920: 64 52 65 61 64 65 72 20 7b 0a 20 20 63 6f 6e 73  dReader {.  cons
3930: 74 20 75 38 20 2a 61 3b 20 20 20 20 20 20 20 20  t u8 *a;        
3940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3950: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3960: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
3970: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
39a0: 75 66 66 65 72 20 61 5b 5d 20 69 6e 20 62 79 74  uffer a[] in byt
39b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  es */.  int i;  
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
39e0: 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 70 6f 73  nt offset in pos
39f0: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
3a00: 69 36 34 20 69 50 6f 73 3b 20 20 20 20 20 20 20  i64 iPos;       
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 2f 2a 20 43 75 72 72 65 6e 74 20 70 6f 73 69 74  /* Current posit
3a30: 69 6f 6e 20 2a 2f 0a 20 20 69 36 34 20 69 4c 6f  ion */.  i64 iLo
3a40: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
3a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
3a60: 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a   position */.};.
3a70: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4c 4f  .#define FTS5_LO
3a80: 4f 4b 41 48 45 41 44 5f 45 4f 46 20 28 28 28 69  OKAHEAD_EOF (((i
3a90: 36 34 29 31 29 20 3c 3c 20 36 32 29 0a 0a 73 74  64)1) << 62)..st
3aa0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 6f 6f  atic int fts5Loo
3ab0: 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65 78 74  kaheadReaderNext
3ac0: 28 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65  (Fts5LookaheadRe
3ad0: 61 64 65 72 20 2a 70 29 7b 0a 20 20 70 2d 3e 69  ader *p){.  p->i
3ae0: 50 6f 73 20 3d 20 70 2d 3e 69 4c 6f 6f 6b 61 68  Pos = p->iLookah
3af0: 65 61 64 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ead;.  if( sqlit
3b00: 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
3b10: 74 36 34 28 70 2d 3e 61 2c 20 70 2d 3e 6e 2c 20  t64(p->a, p->n, 
3b20: 26 70 2d 3e 69 2c 20 26 70 2d 3e 69 4c 6f 6f 6b  &p->i, &p->iLook
3b30: 61 68 65 61 64 29 20 29 7b 0a 20 20 20 20 70 2d  ahead) ){.    p-
3b40: 3e 69 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 46 54  >iLookahead = FT
3b50: 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46  S5_LOOKAHEAD_EOF
3b60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
3b70: 70 2d 3e 69 50 6f 73 3d 3d 46 54 53 35 5f 4c 4f  p->iPos==FTS5_LO
3b80: 4f 4b 41 48 45 41 44 5f 45 4f 46 29 3b 0a 7d 0a  OKAHEAD_EOF);.}.
3b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
3ba0: 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 49  LookaheadReaderI
3bb0: 6e 69 74 28 0a 20 20 63 6f 6e 73 74 20 75 38 20  nit(.  const u8 
3bc0: 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  *a, int n,      
3bd0: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
3be0: 20 74 6f 20 72 65 61 64 20 70 6f 73 69 74 69 6f   to read positio
3bf0: 6e 20 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20  n list from */. 
3c00: 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   Fts5LookaheadRe
3c10: 61 64 65 72 20 2a 70 20 20 20 20 20 20 20 20 20  ader *p         
3c20: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a   /* Iterator obj
3c30: 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ect to initializ
3c40: 65 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  e */.){.  memset
3c50: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  (p, 0, sizeof(Ft
3c60: 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65  s5LookaheadReade
3c70: 72 29 29 3b 0a 20 20 70 2d 3e 61 20 3d 20 61 3b  r));.  p->a = a;
3c80: 0a 20 20 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 66  .  p->n = n;.  f
3c90: 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64  ts5LookaheadRead
3ca0: 65 72 4e 65 78 74 28 70 29 3b 0a 20 20 72 65 74  erNext(p);.  ret
3cb0: 75 72 6e 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61  urn fts5Lookahea
3cc0: 64 52 65 61 64 65 72 4e 65 78 74 28 70 29 3b 0a  dReaderNext(p);.
3cd0: 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
3ce0: 74 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65  t Fts5NearTrimme
3cf0: 72 20 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65  r Fts5NearTrimme
3d00: 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35 4e 65  r;.struct Fts5Ne
3d10: 61 72 54 72 69 6d 6d 65 72 20 7b 0a 20 20 46 74  arTrimmer {.  Ft
3d20: 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65  s5LookaheadReade
3d30: 72 20 72 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  r reader;     /*
3d40: 20 49 6e 70 75 74 20 69 74 65 72 61 74 6f 72 20   Input iterator 
3d50: 2a 2f 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74  */.  Fts5Poslist
3d60: 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
3d70: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 63       /* Writer c
3d80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 46 74 73 35  ontext */.  Fts5
3d90: 42 75 66 66 65 72 20 2a 70 4f 75 74 3b 20 20 20  Buffer *pOut;   
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3db0: 75 74 70 75 74 20 70 6f 73 6c 69 73 74 20 2a 2f  utput poslist */
3dc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e  .};../*.** The n
3dd0: 65 61 72 2d 73 65 74 20 6f 62 6a 65 63 74 20 70  ear-set object p
3de0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
3df0: 73 74 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74  st argument cont
3e00: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 0a 2a  ains more than.*
3e10: 2a 20 6f 6e 65 20 70 68 72 61 73 65 2e 20 41 6c  * one phrase. Al
3e20: 6c 20 70 68 72 61 73 65 73 20 63 75 72 72 65 6e  l phrases curren
3e30: 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  tly point to the
3e40: 20 73 61 6d 65 20 72 6f 77 2e 20 54 68 65 0a 2a   same row. The.*
3e50: 2a 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65  * Fts5ExprPhrase
3e60: 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 73  .poslist buffers
3e70: 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
3e80: 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 69 73  ccordingly. This
3e90: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 65 73   function.** tes
3ea0: 74 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ts if the curren
3eb0: 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73 20 69  t row contains i
3ec0: 6e 73 74 61 6e 63 65 73 20 6f 66 20 65 61 63 68  nstances of each
3ed0: 20 70 68 72 61 73 65 20 73 75 66 66 69 63 69 65   phrase sufficie
3ee0: 6e 74 6c 79 0a 2a 2a 20 63 6c 6f 73 65 20 74 6f  ntly.** close to
3ef0: 67 65 74 68 65 72 20 74 6f 20 6d 65 65 74 20 74  gether to meet t
3f00: 68 65 20 4e 45 41 52 20 63 6f 6e 73 74 72 61 69  he NEAR constrai
3f10: 6e 74 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20  nt. Non-zero is 
3f20: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 0a 2a  returned if it.*
3f30: 2a 20 64 6f 65 73 2c 20 6f 72 20 7a 65 72 6f 20  * does, or zero 
3f40: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
3f50: 20 49 66 20 69 6e 2f 6f 75 74 20 70 61 72 61 6d   If in/out param
3f60: 65 74 65 72 20 28 2a 70 52 63 29 20 69 73 20 73  eter (*pRc) is s
3f70: 65 74 20 74 6f 20 6f 74 68 65 72 20 74 68 61 6e  et to other than
3f80: 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
3f90: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
3fa0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
3fb0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 72 2c 20 69  s a no-op. Or, i
3fc0: 66 20 61 6e 20 65 72 72 6f 72 20 28 65 2e 67 2e  f an error (e.g.
3fd0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 0a 2a   SQLITE_NOMEM).*
3fe0: 2a 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  * occurs within 
3ff0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 28 2a  this function (*
4000: 70 52 63 29 20 69 73 20 73 65 74 20 61 63 63 6f  pRc) is set acco
4010: 72 64 69 6e 67 6c 79 20 62 65 66 6f 72 65 20 72  rdingly before r
4020: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65  eturning..** The
4030: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
4040: 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 62 6f   undefined in bo
4050: 74 68 20 74 68 65 73 65 20 63 61 73 65 73 2e 0a  th these cases..
4060: 2a 2a 20 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  ** .** If no err
4070: 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 6e 6f  or occurs and no
4080: 6e 2d 7a 65 72 6f 20 28 61 20 6d 61 74 63 68 29  n-zero (a match)
4090: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
40a0: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a  e position-list.
40b0: 2a 2a 20 6f 66 20 65 61 63 68 20 70 68 72 61 73  ** of each phras
40c0: 65 20 6f 62 6a 65 63 74 20 69 73 20 65 64 69 74  e object is edit
40d0: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 6f 6e  ed to contain on
40e0: 6c 79 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73  ly those entries
40f0: 20 74 68 61 74 0a 2a 2a 20 6d 65 65 74 20 74 68   that.** meet th
4100: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 62 65 66  e constraint bef
4110: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
4120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
4130: 35 45 78 70 72 4e 65 61 72 49 73 4d 61 74 63 68  5ExprNearIsMatch
4140: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 45  (int *pRc, Fts5E
4150: 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61  xprNearset *pNea
4160: 72 29 7b 0a 20 20 46 74 73 35 4e 65 61 72 54 72  r){.  Fts5NearTr
4170: 69 6d 6d 65 72 20 61 53 74 61 74 69 63 5b 34 5d  immer aStatic[4]
4180: 3b 0a 20 20 46 74 73 35 4e 65 61 72 54 72 69 6d  ;.  Fts5NearTrim
4190: 6d 65 72 20 2a 61 20 3d 20 61 53 74 61 74 69 63  mer *a = aStatic
41a0: 3b 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61  ;.  Fts5ExprPhra
41b0: 73 65 20 2a 2a 61 70 50 68 72 61 73 65 20 3d 20  se **apPhrase = 
41c0: 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 3b  pNear->apPhrase;
41d0: 0a 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ..  int i;.  int
41e0: 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69 6e   rc = *pRc;.  in
41f0: 74 20 62 4d 61 74 63 68 3b 0a 0a 20 20 61 73 73  t bMatch;..  ass
4200: 65 72 74 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72  ert( pNear->nPhr
4210: 61 73 65 3e 31 20 29 3b 0a 0a 20 20 2f 2a 20 49  ase>1 );..  /* I
4220: 66 20 74 68 65 20 61 53 74 61 74 69 63 5b 5d 20  f the aStatic[] 
4230: 61 72 72 61 79 20 69 73 20 6e 6f 74 20 6c 61 72  array is not lar
4240: 67 65 20 65 6e 6f 75 67 68 2c 20 61 6c 6c 6f 63  ge enough, alloc
4250: 61 74 65 20 61 20 6c 61 72 67 65 20 61 72 72 61  ate a large arra
4260: 79 0a 20 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c  y.  ** using sql
4270: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54  ite3_malloc(). T
4280: 68 69 73 20 61 70 70 72 6f 61 63 68 20 63 6f 75  his approach cou
4290: 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 75  ld be improved u
42a0: 70 6f 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  pon. */.  if( pN
42b0: 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e 41 72 72  ear->nPhrase>Arr
42c0: 61 79 53 69 7a 65 28 61 53 74 61 74 69 63 29 20  aySize(aStatic) 
42d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
42e0: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 4e 65   = sizeof(Fts5Ne
42f0: 61 72 54 72 69 6d 6d 65 72 29 20 2a 20 70 4e 65  arTrimmer) * pNe
4300: 61 72 2d 3e 6e 50 68 72 61 73 65 3b 0a 20 20 20  ar->nPhrase;.   
4310: 20 61 20 3d 20 28 46 74 73 35 4e 65 61 72 54 72   a = (Fts5NearTr
4320: 69 6d 6d 65 72 2a 29 73 71 6c 69 74 65 33 46 74  immer*)sqlite3Ft
4330: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
4340: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
4350: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53  e{.    memset(aS
4360: 74 61 74 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66  tatic, 0, sizeof
4370: 28 61 53 74 61 74 69 63 29 29 3b 0a 20 20 7d 0a  (aStatic));.  }.
4380: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4390: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20  _OK ){.    *pRc 
43a0: 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
43b0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   0;.  }..  /* In
43c0: 69 74 69 61 6c 69 7a 65 20 61 20 6c 6f 6f 6b 61  itialize a looka
43d0: 68 65 61 64 20 69 74 65 72 61 74 6f 72 20 66 6f  head iterator fo
43e0: 72 20 65 61 63 68 20 70 68 72 61 73 65 2e 20 41  r each phrase. A
43f0: 66 74 65 72 20 70 61 73 73 69 6e 67 20 74 68 65  fter passing the
4400: 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 61 6e 64  .  ** buffer and
4410: 20 62 75 66 66 65 72 20 73 69 7a 65 20 74 6f 20   buffer size to 
4420: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 72 65  the lookaside-re
4430: 61 64 65 72 20 69 6e 69 74 20 66 75 6e 63 74 69  ader init functi
4440: 6f 6e 2c 20 7a 65 72 6f 0a 20 20 2a 2a 20 74 68  on, zero.  ** th
4450: 65 20 70 68 72 61 73 65 20 70 6f 73 6c 69 73 74  e phrase poslist
4460: 20 62 75 66 66 65 72 2e 20 54 68 65 20 6e 65 77   buffer. The new
4470: 20 70 6f 73 6c 69 73 74 20 66 6f 72 20 74 68 65   poslist for the
4480: 20 70 68 72 61 73 65 20 28 63 6f 6e 74 61 69 6e   phrase (contain
4490: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  ing.  ** the sam
44a0: 65 20 65 6e 74 72 69 65 73 20 61 73 20 74 68 65  e entries as the
44b0: 20 6f 72 69 67 69 6e 61 6c 20 77 69 74 68 20 73   original with s
44c0: 6f 6d 65 20 65 6e 74 72 69 65 73 20 72 65 6d 6f  ome entries remo
44d0: 76 65 64 20 6f 6e 20 61 63 63 6f 75 6e 74 20 0a  ved on account .
44e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 4e 45 41 52    ** of the NEAR
44f0: 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 69 73 20   constraint) is 
4500: 77 72 69 74 74 65 6e 20 6f 76 65 72 20 74 68 65  written over the
4510: 20 6f 72 69 67 69 6e 61 6c 20 65 76 65 6e 20 61   original even a
4520: 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 62 65 69  s it is.  ** bei
4530: 6e 67 20 72 65 61 64 2e 20 54 68 69 73 20 69 73  ng read. This is
4540: 20 73 61 66 65 20 61 73 20 74 68 65 20 65 6e 74   safe as the ent
4550: 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
4560: 20 70 6f 73 6c 69 73 74 20 61 72 65 20 61 0a 20   poslist are a. 
4570: 20 2a 2a 20 73 75 62 73 65 74 20 6f 66 20 74 68   ** subset of th
4580: 65 20 6f 6c 64 2c 20 73 6f 20 69 74 20 69 73 20  e old, so it is 
4590: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
45a0: 20 64 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   data yet to be 
45b0: 72 65 61 64 20 74 6f 0a 20 20 2a 2a 20 62 65 20  read to.  ** be 
45c0: 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
45d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e  .  for(i=0; i<pN
45e0: 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  ear->nPhrase; i+
45f0: 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66  +){.    Fts5Buff
4600: 65 72 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26  er *pPoslist = &
4610: 61 70 50 68 72 61 73 65 5b 69 5d 2d 3e 70 6f 73  apPhrase[i]->pos
4620: 6c 69 73 74 3b 0a 20 20 20 20 66 74 73 35 4c 6f  list;.    fts5Lo
4630: 6f 6b 61 68 65 61 64 52 65 61 64 65 72 49 6e 69  okaheadReaderIni
4640: 74 28 70 50 6f 73 6c 69 73 74 2d 3e 70 2c 20 70  t(pPoslist->p, p
4650: 50 6f 73 6c 69 73 74 2d 3e 6e 2c 20 26 61 5b 69  Poslist->n, &a[i
4660: 5d 2e 72 65 61 64 65 72 29 3b 0a 20 20 20 20 70  ].reader);.    p
4670: 50 6f 73 6c 69 73 74 2d 3e 6e 20 3d 20 30 3b 0a  Poslist->n = 0;.
4680: 20 20 20 20 61 5b 69 5d 2e 70 4f 75 74 20 3d 20      a[i].pOut = 
4690: 70 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20  pPoslist;.  }.. 
46a0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
46b0: 20 69 6e 74 20 69 41 64 76 3b 0a 20 20 20 20 69   int iAdv;.    i
46c0: 36 34 20 69 4d 69 6e 3b 0a 20 20 20 20 69 36 34  64 iMin;.    i64
46d0: 20 69 4d 61 78 3b 0a 0a 20 20 20 20 2f 2a 20 54   iMax;..    /* T
46e0: 68 69 73 20 62 6c 6f 63 6b 20 61 64 76 61 6e 63  his block advanc
46f0: 65 73 20 74 68 65 20 70 68 72 61 73 65 20 69 74  es the phrase it
4700: 65 72 61 74 6f 72 73 20 75 6e 74 69 6c 20 74 68  erators until th
4710: 65 79 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 65  ey point to a se
4720: 74 20 6f 66 0a 20 20 20 20 2a 2a 20 65 6e 74 72  t of.    ** entr
4730: 69 65 73 20 74 68 61 74 20 74 6f 67 65 74 68 65  ies that togethe
4740: 72 20 63 6f 6d 70 72 69 73 65 20 61 20 6d 61 74  r comprise a mat
4750: 63 68 2e 20 20 2a 2f 0a 20 20 20 20 69 4d 61 78  ch.  */.    iMax
4760: 20 3d 20 61 5b 30 5d 2e 72 65 61 64 65 72 2e 69   = a[0].reader.i
4770: 50 6f 73 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  Pos;.    do {.  
4780: 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a      bMatch = 1;.
4790: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
47a0: 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b  <pNear->nPhrase;
47b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46   i++){.        F
47c0: 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64  ts5LookaheadRead
47d0: 65 72 20 2a 70 50 6f 73 20 3d 20 26 61 5b 69 5d  er *pPos = &a[i]
47e0: 2e 72 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20  .reader;.       
47f0: 20 69 4d 69 6e 20 3d 20 69 4d 61 78 20 2d 20 70   iMin = iMax - p
4800: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69  Near->apPhrase[i
4810: 5d 2d 3e 6e 54 65 72 6d 20 2d 20 70 4e 65 61 72  ]->nTerm - pNear
4820: 2d 3e 6e 4e 65 61 72 3b 0a 20 20 20 20 20 20 20  ->nNear;.       
4830: 20 69 66 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3c   if( pPos->iPos<
4840: 69 4d 69 6e 20 7c 7c 20 70 50 6f 73 2d 3e 69 50  iMin || pPos->iP
4850: 6f 73 3e 69 4d 61 78 20 29 7b 0a 20 20 20 20 20  os>iMax ){.     
4860: 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20 30 3b       bMatch = 0;
4870: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
4880: 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69  ( pPos->iPos<iMi
4890: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
48a0: 20 69 66 28 20 66 74 73 35 4c 6f 6f 6b 61 68 65   if( fts5Lookahe
48b0: 61 64 52 65 61 64 65 72 4e 65 78 74 28 70 50 6f  adReaderNext(pPo
48c0: 73 29 20 29 20 67 6f 74 6f 20 69 73 6d 61 74 63  s) ) goto ismatc
48d0: 68 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  h_out;.         
48e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
48f0: 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69 4d 61 78   pPos->iPos>iMax
4900: 20 29 20 69 4d 61 78 20 3d 20 70 50 6f 73 2d 3e   ) iMax = pPos->
4910: 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iPos;.        }.
4920: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
4930: 6c 65 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b  le( bMatch==0 );
4940: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
4950: 65 6e 74 72 79 20 74 6f 20 65 61 63 68 20 6f 75  entry to each ou
4960: 74 70 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  tput position li
4970: 73 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  st */.    for(i=
4980: 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72  0; i<pNear->nPhr
4990: 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ase; i++){.     
49a0: 20 69 36 34 20 69 50 6f 73 20 3d 20 61 5b 69 5d   i64 iPos = a[i]
49b0: 2e 72 65 61 64 65 72 2e 69 50 6f 73 3b 0a 20 20  .reader.iPos;.  
49c0: 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57      Fts5PoslistW
49d0: 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d  riter *pWriter =
49e0: 20 26 61 5b 69 5d 2e 77 72 69 74 65 72 3b 0a 20   &a[i].writer;. 
49f0: 20 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 4f       if( a[i].pO
4a00: 75 74 2d 3e 6e 3d 3d 30 20 7c 7c 20 69 50 6f 73  ut->n==0 || iPos
4a10: 21 3d 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76  !=pWriter->iPrev
4a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4a30: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72  te3Fts5PoslistWr
4a40: 69 74 65 72 41 70 70 65 6e 64 28 61 5b 69 5d 2e  iterAppend(a[i].
4a50: 70 4f 75 74 2c 20 70 57 72 69 74 65 72 2c 20 69  pOut, pWriter, i
4a60: 50 6f 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Pos);.      }.  
4a70: 20 20 7d 0a 0a 20 20 20 20 69 41 64 76 20 3d 20    }..    iAdv = 
4a80: 30 3b 0a 20 20 20 20 69 4d 69 6e 20 3d 20 61 5b  0;.    iMin = a[
4a90: 30 5d 2e 72 65 61 64 65 72 2e 69 4c 6f 6f 6b 61  0].reader.iLooka
4aa0: 68 65 61 64 3b 0a 20 20 20 20 66 6f 72 28 69 3d  head;.    for(i=
4ab0: 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72  0; i<pNear->nPhr
4ac0: 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ase; i++){.     
4ad0: 20 69 66 28 20 61 5b 69 5d 2e 72 65 61 64 65 72   if( a[i].reader
4ae0: 2e 69 4c 6f 6f 6b 61 68 65 61 64 20 3c 20 69 4d  .iLookahead < iM
4af0: 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4d  in ){.        iM
4b00: 69 6e 20 3d 20 61 5b 69 5d 2e 72 65 61 64 65 72  in = a[i].reader
4b10: 2e 69 4c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  .iLookahead;.   
4b20: 20 20 20 20 20 69 41 64 76 20 3d 20 69 3b 0a 20       iAdv = i;. 
4b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4b40: 20 69 66 28 20 66 74 73 35 4c 6f 6f 6b 61 68 65   if( fts5Lookahe
4b50: 61 64 52 65 61 64 65 72 4e 65 78 74 28 26 61 5b  adReaderNext(&a[
4b60: 69 41 64 76 5d 2e 72 65 61 64 65 72 29 20 29 20  iAdv].reader) ) 
4b70: 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74  goto ismatch_out
4b80: 3b 0a 20 20 7d 0a 0a 20 20 69 73 6d 61 74 63 68  ;.  }..  ismatch
4b90: 5f 6f 75 74 3a 20 7b 0a 20 20 20 20 69 6e 74 20  _out: {.    int 
4ba0: 62 52 65 74 20 3d 20 61 5b 30 5d 2e 70 4f 75 74  bRet = a[0].pOut
4bb0: 2d 3e 6e 3e 30 3b 0a 20 20 20 20 2a 70 52 63 20  ->n>0;.    *pRc 
4bc0: 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20 61 21  = rc;.    if( a!
4bd0: 3d 61 53 74 61 74 69 63 20 29 20 73 71 6c 69 74  =aStatic ) sqlit
4be0: 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20  e3_free(a);.    
4bf0: 72 65 74 75 72 6e 20 62 52 65 74 3b 0a 20 20 7d  return bRet;.  }
4c00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
4c10: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
4c20: 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
4c30: 20 74 6f 20 61 20 76 61 6c 75 65 20 65 71 75 61   to a value equa
4c40: 6c 20 74 6f 20 6f 72 20 6c 61 73 74 65 72 0a 2a  l to or laster.*
4c50: 2a 20 74 68 61 6e 20 74 68 65 20 69 6e 69 74 69  * than the initi
4c60: 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 69 4c  al value of *piL
4c70: 61 73 74 2e 20 49 66 20 74 68 69 73 20 6d 65 61  ast. If this mea
4c80: 6e 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ns the iterator 
4c90: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 76  points.** to a v
4ca0: 61 6c 75 65 20 6c 61 73 74 65 72 20 74 68 61 6e  alue laster than
4cb0: 20 2a 70 69 4c 61 73 74 2c 20 75 70 64 61 74 65   *piLast, update
4cc0: 20 2a 70 69 4c 61 73 74 20 74 6f 20 74 68 65 20   *piLast to the 
4cd0: 6e 65 77 20 6c 61 73 74 65 73 74 20 76 61 6c 75  new lastest valu
4ce0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
4cf0: 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
4d00: 20 45 4f 46 2c 20 73 65 74 20 2a 70 62 45 6f 66   EOF, set *pbEof
4d10: 20 74 6f 20 74 72 75 65 20 62 65 66 6f 72 65 20   to true before 
4d20: 72 65 74 75 72 6e 69 6e 67 2e 20 49 66 0a 2a 2a  returning. If.**
4d30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
4d40: 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20 61 6e  , set *pRc to an
4d50: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
4d60: 65 69 74 68 65 72 20 2a 70 62 45 6f 66 20 6f 72  either *pbEof or
4d70: 20 2a 70 52 63 0a 2a 2a 20 61 72 65 20 73 65 74   *pRc.** are set
4d80: 2c 20 72 65 74 75 72 6e 20 61 20 6e 6f 6e 2d 7a  , return a non-z
4d90: 65 72 6f 20 76 61 6c 75 65 2e 20 4f 74 68 65 72  ero value. Other
4da0: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72  wise, return zer
4db0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
4dc0: 20 66 74 73 35 45 78 70 72 41 64 76 61 6e 63 65   fts5ExprAdvance
4dd0: 74 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49  to(.  Fts5IndexI
4de0: 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
4df0: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
4e00: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
4e10: 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20    int bDesc,    
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 65    /* True if ite
4e40: 72 61 74 6f 72 20 69 73 20 22 72 6f 77 69 64 20  rator is "rowid 
4e50: 44 45 53 43 22 20 2a 2f 0a 20 20 69 36 34 20 2a  DESC" */.  i64 *
4e60: 70 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20  piLast,         
4e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
4e80: 2f 4f 55 54 3a 20 4c 61 73 74 65 73 74 20 72 6f  /OUT: Lastest ro
4e90: 77 69 64 20 73 65 65 6e 20 73 6f 20 66 61 72 20  wid seen so far 
4ea0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  */.  int *pRc,  
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
4ed0: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
4ee0: 20 2a 70 62 45 6f 66 20 20 20 20 20 20 20 20 20   *pbEof         
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f00: 4f 55 54 3a 20 53 65 74 20 74 6f 20 74 72 75 65  OUT: Set to true
4f10: 20 69 66 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20   if EOF */.){.  
4f20: 69 36 34 20 69 4c 61 73 74 20 3d 20 2a 70 69 4c  i64 iLast = *piL
4f30: 61 73 74 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  ast;.  i64 iRowi
4f40: 64 3b 0a 0a 20 20 69 52 6f 77 69 64 20 3d 20 70  d;..  iRowid = p
4f50: 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  Iter->iRowid;.  
4f60: 69 66 28 20 28 62 44 65 73 63 3d 3d 30 20 26 26  if( (bDesc==0 &&
4f70: 20 69 4c 61 73 74 3e 69 52 6f 77 69 64 29 20 7c   iLast>iRowid) |
4f80: 7c 20 28 62 44 65 73 63 20 26 26 20 69 4c 61 73  | (bDesc && iLas
4f90: 74 3c 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  t<iRowid) ){.   
4fa0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
4fb0: 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f  3Fts5IterNextFro
4fc0: 6d 28 70 49 74 65 72 2c 20 69 4c 61 73 74 29 3b  m(pIter, iLast);
4fd0: 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 73  .    if( rc || s
4fe0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
4ff0: 66 28 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20  f(pIter) ){.    
5000: 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
5010: 20 20 20 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20     *pbEof = 1;. 
5020: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5030: 20 20 20 7d 0a 20 20 20 20 69 52 6f 77 69 64 20     }.    iRowid 
5040: 3d 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b  = pIter->iRowid;
5050: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 62 44  .    assert( (bD
5060: 65 73 63 3d 3d 30 20 26 26 20 69 52 6f 77 69 64  esc==0 && iRowid
5070: 3e 3d 69 4c 61 73 74 29 20 7c 7c 20 28 62 44 65  >=iLast) || (bDe
5080: 73 63 3d 3d 31 20 26 26 20 69 52 6f 77 69 64 3c  sc==1 && iRowid<
5090: 3d 69 4c 61 73 74 29 20 29 3b 0a 20 20 7d 0a 20  =iLast) );.  }. 
50a0: 20 2a 70 69 4c 61 73 74 20 3d 20 69 52 6f 77 69   *piLast = iRowi
50b0: 64 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  d;..  return 0;.
50c0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
50d0: 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 41 64 76  s5ExprSynonymAdv
50e0: 61 6e 63 65 74 6f 28 0a 20 20 46 74 73 35 45 78  anceto(.  Fts5Ex
50f0: 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  prTerm *pTerm,  
5100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
5110: 6d 20 69 74 65 72 61 74 6f 72 20 74 6f 20 61 64  m iterator to ad
5120: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 62  vance */.  int b
5130: 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20  Desc,           
5140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
5150: 75 65 20 69 66 20 69 74 65 72 61 74 6f 72 20 69  ue if iterator i
5160: 73 20 22 72 6f 77 69 64 20 44 45 53 43 22 20 2a  s "rowid DESC" *
5170: 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 2c  /.  i64 *piLast,
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c      /* IN/OUT: L
51a0: 61 73 74 65 73 74 20 72 6f 77 69 64 20 73 65 65  astest rowid see
51b0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e  n so far */.  in
51c0: 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20  t *pRc          
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51e0: 20 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65   OUT: Error code
51f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
5200: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
5210: 36 34 20 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61  64 iLast = *piLa
5220: 73 74 3b 0a 20 20 46 74 73 35 45 78 70 72 54 65  st;.  Fts5ExprTe
5230: 72 6d 20 2a 70 3b 0a 20 20 69 6e 74 20 62 45 6f  rm *p;.  int bEo
5240: 66 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70 3d  f = 0;..  for(p=
5250: 70 54 65 72 6d 3b 20 72 63 3d 3d 53 51 4c 49 54  pTerm; rc==SQLIT
5260: 45 5f 4f 4b 20 26 26 20 70 3b 20 70 3d 70 2d 3e  E_OK && p; p=p->
5270: 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 69  pSynonym){.    i
5280: 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  f( sqlite3Fts5It
5290: 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d  erEof(p->pIter)=
52a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  =0 ){.      i64 
52b0: 69 52 6f 77 69 64 20 3d 20 70 2d 3e 70 49 74 65  iRowid = p->pIte
52c0: 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  r->iRowid;.     
52d0: 20 69 66 28 20 28 62 44 65 73 63 3d 3d 30 20 26   if( (bDesc==0 &
52e0: 26 20 69 4c 61 73 74 3e 69 52 6f 77 69 64 29 20  & iLast>iRowid) 
52f0: 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69 4c 61  || (bDesc && iLa
5300: 73 74 3c 69 52 6f 77 69 64 29 20 29 7b 0a 20 20  st<iRowid) ){.  
5310: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5320: 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
5330: 6f 6d 28 70 2d 3e 70 49 74 65 72 2c 20 69 4c 61  om(p->pIter, iLa
5340: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
5350: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
5360: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5370: 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
5380: 20 20 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65    bEof = 1;.  }e
5390: 6c 73 65 7b 0a 20 20 20 20 2a 70 69 4c 61 73 74  lse{.    *piLast
53a0: 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e   = fts5ExprSynon
53b0: 79 6d 52 6f 77 69 64 28 70 54 65 72 6d 2c 20 62  ymRowid(pTerm, b
53c0: 44 65 73 63 2c 20 26 62 45 6f 66 29 3b 0a 20 20  Desc, &bEof);.  
53d0: 7d 0a 20 20 72 65 74 75 72 6e 20 62 45 6f 66 3b  }.  return bEof;
53e0: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .}...static int 
53f0: 66 74 73 35 45 78 70 72 4e 65 61 72 54 65 73 74  fts5ExprNearTest
5400: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20  (.  int *pRc,.  
5410: 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts5Expr *pExpr,
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 68  /* Expression th
5440: 61 74 20 70 4e 65 61 72 20 69 73 20 61 20 70 61  at pNear is a pa
5450: 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 45  rt of */.  Fts5E
5460: 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20  xprNode *pNode  
5470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5480: 65 20 22 4e 45 41 52 22 20 6e 6f 64 65 20 28 46  e "NEAR" node (F
5490: 54 53 35 5f 53 54 52 49 4e 47 29 20 2a 2f 0a 29  TS5_STRING) */.)
54a0: 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72  {.  Fts5ExprNear
54b0: 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f  set *pNear = pNo
54c0: 64 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 69 6e 74  de->pNear;.  int
54d0: 20 72 63 20 3d 20 2a 70 52 63 3b 0a 0a 20 20 69   rc = *pRc;..  i
54e0: 66 28 20 70 45 78 70 72 2d 3e 70 43 6f 6e 66 69  f( pExpr->pConfi
54f0: 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
5500: 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a  _DETAIL_FULL ){.
5510: 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
5520: 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 46 74 73   *pTerm;.    Fts
5530: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
5540: 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70  rase = pNear->ap
5550: 50 68 72 61 73 65 5b 30 5d 3b 0a 20 20 20 20 70  Phrase[0];.    p
5560: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
5570: 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  n = 0;.    for(p
5580: 54 65 72 6d 3d 26 70 50 68 72 61 73 65 2d 3e 61  Term=&pPhrase->a
5590: 54 65 72 6d 5b 30 5d 3b 20 70 54 65 72 6d 3b 20  Term[0]; pTerm; 
55a0: 70 54 65 72 6d 3d 70 54 65 72 6d 2d 3e 70 53 79  pTerm=pTerm->pSy
55b0: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20 46 74  nonym){.      Ft
55c0: 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
55d0: 65 72 20 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65  er = pTerm->pIte
55e0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  r;.      if( sql
55f0: 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
5600: 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pIter)==0 ){.   
5610: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
5620: 69 52 6f 77 69 64 3d 3d 70 4e 6f 64 65 2d 3e 69  iRowid==pNode->i
5630: 52 6f 77 69 64 20 26 26 20 70 49 74 65 72 2d 3e  Rowid && pIter->
5640: 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 20  nData>0 ){.     
5650: 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 70 6f       pPhrase->po
5660: 73 6c 69 73 74 2e 6e 20 3d 20 31 3b 0a 20 20 20  slist.n = 1;.   
5670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5680: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
5690: 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
56a0: 2e 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  .n;.  }else{.   
56b0: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
56c0: 43 68 65 63 6b 20 74 68 61 74 20 65 61 63 68 20  Check that each 
56d0: 70 68 72 61 73 65 20 69 6e 20 74 68 65 20 6e 65  phrase in the ne
56e0: 61 72 73 65 74 20 6d 61 74 63 68 65 73 20 74 68  arset matches th
56f0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 20  e current row.. 
5700: 20 20 20 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74     ** Populate t
5710: 68 65 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  he pPhrase->posl
5720: 69 73 74 20 62 75 66 66 65 72 73 20 61 74 20 74  ist buffers at t
5730: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 49 66  he same time. If
5740: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 70 68 72 61   any.    ** phra
5750: 73 65 20 69 73 20 6e 6f 74 20 61 20 6d 61 74 63  se is not a matc
5760: 68 2c 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  h, break out of 
5770: 74 68 65 20 6c 6f 6f 70 20 65 61 72 6c 79 2e 20  the loop early. 
5780: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
5790: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
57a0: 26 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61  & i<pNear->nPhra
57b0: 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  se; i++){.      
57c0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
57d0: 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d  pPhrase = pNear-
57e0: 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20  >apPhrase[i];.  
57f0: 20 20 20 20 69 66 28 20 70 50 68 72 61 73 65 2d      if( pPhrase-
5800: 3e 6e 54 65 72 6d 3e 31 20 7c 7c 20 70 50 68 72  >nTerm>1 || pPhr
5810: 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53  ase->aTerm[0].pS
5820: 79 6e 6f 6e 79 6d 20 0a 20 20 20 20 20 20 20 7c  ynonym .       |
5830: 7c 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  | pNear->pColset
5840: 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 61 54 65   || pPhrase->aTe
5850: 72 6d 5b 30 5d 2e 62 46 69 72 73 74 0a 20 20 20  rm[0].bFirst.   
5860: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
5870: 74 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20  t bMatch = 0;.  
5880: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45        rc = fts5E
5890: 78 70 72 50 68 72 61 73 65 49 73 4d 61 74 63 68  xprPhraseIsMatch
58a0: 28 70 4e 6f 64 65 2c 20 70 50 68 72 61 73 65 2c  (pNode, pPhrase,
58b0: 20 26 62 4d 61 74 63 68 29 3b 0a 20 20 20 20 20   &bMatch);.     
58c0: 20 20 20 69 66 28 20 62 4d 61 74 63 68 3d 3d 30     if( bMatch==0
58d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
58e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 46  }else{.        F
58f0: 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
5900: 74 65 72 20 3d 20 70 50 68 72 61 73 65 2d 3e 61  ter = pPhrase->a
5910: 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 3b 0a 20  Term[0].pIter;. 
5920: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
5930: 72 53 65 74 28 26 72 63 2c 20 26 70 50 68 72 61  rSet(&rc, &pPhra
5940: 73 65 2d 3e 70 6f 73 6c 69 73 74 2c 20 70 49 74  se->poslist, pIt
5950: 65 72 2d 3e 6e 44 61 74 61 2c 20 70 49 74 65 72  er->nData, pIter
5960: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
5970: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 52  }.    }..    *pR
5980: 63 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  c = rc;.    if( 
5990: 69 3d 3d 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73  i==pNear->nPhras
59a0: 65 20 26 26 20 28 69 3d 3d 31 20 7c 7c 20 66 74  e && (i==1 || ft
59b0: 73 35 45 78 70 72 4e 65 61 72 49 73 4d 61 74 63  s5ExprNearIsMatc
59c0: 68 28 70 52 63 2c 20 70 4e 65 61 72 29 29 20 29  h(pRc, pNear)) )
59d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
59e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
59f0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  rn 0;.  }.}.../*
5a00: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
5a10: 6c 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72  ll term iterator
5a20: 73 20 69 6e 20 74 68 65 20 70 4e 65 61 72 20 6f  s in the pNear o
5a30: 62 6a 65 63 74 2e 20 49 66 20 61 6e 79 20 74 65  bject. If any te
5a40: 72 6d 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 74  rm is found.** t
5a50: 6f 20 6d 61 74 63 68 20 6e 6f 20 64 6f 63 75 6d  o match no docum
5a60: 65 6e 74 73 20 61 74 20 61 6c 6c 2c 20 72 65 74  ents at all, ret
5a70: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  urn immediately 
5a80: 77 69 74 68 6f 75 74 20 69 6e 69 74 69 61 6c 69  without initiali
5a90: 7a 69 6e 67 20 61 6e 79 0a 2a 2a 20 66 75 72 74  zing any.** furt
5aa0: 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  her iterators..*
5ab0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5ac0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
5ad0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
5ae0: 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
5af0: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
5b00: 45 5f 4f 4b 2e 20 49 74 20 69 73 20 6e 6f 74 20  E_OK. It is not 
5b10: 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
5b20: 72 6f 72 20 69 66 20 73 6f 6d 65 20 74 65 72 6d  ror if some term
5b30: 20 6d 61 74 63 68 65 73 20 7a 65 72 6f 0a 2a 2a   matches zero.**
5b40: 20 64 6f 63 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73   documents..*/.s
5b50: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
5b60: 70 72 4e 65 61 72 49 6e 69 74 41 6c 6c 28 0a 20  prNearInitAll(. 
5b70: 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
5b80: 2c 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ,.  Fts5ExprNode
5b90: 20 2a 70 4e 6f 64 65 0a 29 7b 0a 20 20 46 74 73   *pNode.){.  Fts
5ba0: 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e  5ExprNearset *pN
5bb0: 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65  ear = pNode->pNe
5bc0: 61 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ar;.  int i;..  
5bd0: 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62  assert( pNode->b
5be0: 4e 6f 6d 61 74 63 68 3d 3d 30 20 29 3b 0a 20 20  Nomatch==0 );.  
5bf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72  for(i=0; i<pNear
5c00: 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b  ->nPhrase; i++){
5c10: 0a 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72  .    Fts5ExprPhr
5c20: 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
5c30: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69  Near->apPhrase[i
5c40: 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 68 72 61  ];.    if( pPhra
5c50: 73 65 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a  se->nTerm==0 ){.
5c60: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f        pNode->bEo
5c70: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  f = 1;.      ret
5c80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5c90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5ca0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
5cb0: 28 6a 3d 30 3b 20 6a 3c 70 50 68 72 61 73 65 2d  (j=0; j<pPhrase-
5cc0: 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 29 7b 0a 20 20  >nTerm; j++){.  
5cd0: 20 20 20 20 20 20 46 74 73 35 45 78 70 72 54 65        Fts5ExprTe
5ce0: 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 50 68  rm *pTerm = &pPh
5cf0: 72 61 73 65 2d 3e 61 54 65 72 6d 5b 6a 5d 3b 0a  rase->aTerm[j];.
5d00: 20 20 20 20 20 20 20 20 46 74 73 35 45 78 70 72          Fts5Expr
5d10: 54 65 72 6d 20 2a 70 3b 0a 20 20 20 20 20 20 20  Term *p;.       
5d20: 20 69 6e 74 20 62 48 69 74 20 3d 20 30 3b 0a 0a   int bHit = 0;..
5d30: 20 20 20 20 20 20 20 20 66 6f 72 28 70 3d 70 54          for(p=pT
5d40: 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
5d50: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20 20 20  nonym){.        
5d60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
5d70: 20 20 20 20 69 66 28 20 70 2d 3e 70 49 74 65 72      if( p->pIter
5d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5d90: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
5da0: 6c 6f 73 65 28 70 2d 3e 70 49 74 65 72 29 3b 0a  lose(p->pIter);.
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
5dc0: 49 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Iter = 0;.      
5dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5de0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
5df0: 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 20 20  IndexQuery(.    
5e00: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
5e10: 3e 70 49 6e 64 65 78 2c 20 70 2d 3e 7a 54 65 72  >pIndex, p->zTer
5e20: 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70  m, (int)strlen(p
5e30: 2d 3e 7a 54 65 72 6d 29 2c 0a 20 20 20 20 20 20  ->zTerm),.      
5e40: 20 20 20 20 20 20 20 20 28 70 54 65 72 6d 2d 3e          (pTerm->
5e50: 62 50 72 65 66 69 78 20 3f 20 46 54 53 35 49 4e  bPrefix ? FTS5IN
5e60: 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
5e70: 20 3a 20 30 29 20 7c 0a 20 20 20 20 20 20 20 20   : 0) |.        
5e80: 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 62 44        (pExpr->bD
5e90: 65 73 63 20 3f 20 46 54 53 35 49 4e 44 45 58 5f  esc ? FTS5INDEX_
5ea0: 51 55 45 52 59 5f 44 45 53 43 20 3a 20 30 29 2c  QUERY_DESC : 0),
5eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
5ec0: 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 2c 0a 20  Near->pColset,. 
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 2d               &p-
5ee0: 3e 70 49 74 65 72 0a 20 20 20 20 20 20 20 20 20  >pIter.         
5ef0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
5f00: 73 65 72 74 28 20 28 72 63 3d 3d 53 51 4c 49 54  sert( (rc==SQLIT
5f10: 45 5f 4f 4b 29 3d 3d 28 70 2d 3e 70 49 74 65 72  E_OK)==(p->pIter
5f20: 21 3d 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20  !=0) );.        
5f30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5f40: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5f50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
5f60: 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ==sqlite3Fts5Ite
5f70: 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 20 29  rEof(p->pIter) )
5f80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 48  {.            bH
5f90: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
5fa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
5fb0: 20 20 20 20 20 20 20 69 66 28 20 62 48 69 74 3d         if( bHit=
5fc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5fd0: 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b  pNode->bEof = 1;
5fe0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5ff0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
6000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6010: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4e 6f 64     }.  }..  pNod
6020: 65 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 72  e->bEof = 0;.  r
6030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78  .}../*.** If pEx
6050: 70 72 20 69 73 20 61 6e 20 41 53 43 20 69 74 65  pr is an ASC ite
6060: 72 61 74 6f 72 2c 20 74 68 69 73 20 66 75 6e 63  rator, this func
6070: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 76  tion returns a v
6080: 61 6c 75 65 20 77 69 74 68 20 74 68 65 0a 2a 2a  alue with the.**
6090: 20 73 61 6d 65 20 73 69 67 6e 20 61 73 3a 0a 2a   same sign as:.*
60a0: 2a 0a 2a 2a 20 20 20 28 69 4c 68 73 20 2d 20 69  *.**   (iLhs - i
60b0: 52 68 73 29 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  Rhs).**.** Other
60c0: 77 69 73 65 2c 20 69 66 20 74 68 69 73 20 69 73  wise, if this is
60d0: 20 61 20 44 45 53 43 20 69 74 65 72 61 74 6f 72   a DESC iterator
60e0: 2c 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 69  , the opposite i
60f0: 73 20 72 65 74 75 72 6e 65 64 3a 0a 2a 2a 0a 2a  s returned:.**.*
6100: 2a 20 20 20 28 69 52 68 73 20 2d 20 69 4c 68 73  *   (iRhs - iLhs
6110: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
6120: 66 74 73 35 52 6f 77 69 64 43 6d 70 28 0a 20 20  fts5RowidCmp(.  
6130: 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts5Expr *pExpr,
6140: 0a 20 20 69 36 34 20 69 4c 68 73 2c 0a 20 20 69  .  i64 iLhs,.  i
6150: 36 34 20 69 52 68 73 0a 29 7b 0a 20 20 61 73 73  64 iRhs.){.  ass
6160: 65 72 74 28 20 70 45 78 70 72 2d 3e 62 44 65 73  ert( pExpr->bDes
6170: 63 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 62  c==0 || pExpr->b
6180: 44 65 73 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Desc==1 );.  if(
6190: 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d 30   pExpr->bDesc==0
61a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 68 73   ){.    if( iLhs
61b0: 3c 69 52 68 73 20 29 20 72 65 74 75 72 6e 20 2d  <iRhs ) return -
61c0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69  1;.    return (i
61d0: 4c 68 73 20 3e 20 69 52 68 73 29 3b 0a 20 20 7d  Lhs > iRhs);.  }
61e0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 69 4c  else{.    if( iL
61f0: 68 73 3e 69 52 68 73 20 29 20 72 65 74 75 72 6e  hs>iRhs ) return
6200: 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
6210: 28 69 4c 68 73 20 3c 20 69 52 68 73 29 3b 0a 20  (iLhs < iRhs);. 
6220: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
6230: 64 20 66 74 73 35 45 78 70 72 53 65 74 45 6f 66  d fts5ExprSetEof
6240: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70  (Fts5ExprNode *p
6250: 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Node){.  int i;.
6260: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
6270: 31 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  1;.  pNode->bNom
6280: 61 74 63 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28  atch = 0;.  for(
6290: 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43  i=0; i<pNode->nC
62a0: 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  hild; i++){.    
62b0: 66 74 73 35 45 78 70 72 53 65 74 45 6f 66 28 70  fts5ExprSetEof(p
62c0: 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d  Node->apChild[i]
62d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
62e0: 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 4e 6f   void fts5ExprNo
62f0: 64 65 5a 65 72 6f 50 6f 73 6c 69 73 74 28 46 74  deZeroPoslist(Ft
6300: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
6310: 65 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  e){.  if( pNode-
6320: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52  >eType==FTS5_STR
6330: 49 4e 47 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54  ING || pNode->eT
6340: 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29  ype==FTS5_TERM )
6350: 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e 65  {.    Fts5ExprNe
6360: 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70  arset *pNear = p
6370: 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 20  Node->pNear;.   
6380: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
6390: 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
63a0: 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  hrase; i++){.   
63b0: 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
63c0: 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65  e *pPhrase = pNe
63d0: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b  ar->apPhrase[i];
63e0: 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
63f0: 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20  poslist.n = 0;. 
6400: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6410: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
6420: 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e  (i=0; i<pNode->n
6430: 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Child; i++){.   
6440: 20 20 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a     fts5ExprNodeZ
6450: 65 72 6f 50 6f 73 6c 69 73 74 28 70 4e 6f 64 65  eroPoslist(pNode
6460: 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20  ->apChild[i]);. 
6470: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a     }.  }.}..../*
6480: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
6490: 76 61 6c 75 65 73 20 63 75 72 72 65 6e 74 6c 79  values currently
64a0: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
64b0: 65 20 74 77 6f 20 6e 6f 64 65 73 20 61 73 20 66  e two nodes as f
64c0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
64d0: 20 72 65 73 20 3d 20 28 2a 70 31 29 20 2d 20 28   res = (*p1) - (
64e0: 2a 70 32 29 0a 2a 2a 0a 2a 2a 20 4e 6f 64 65 73  *p2).**.** Nodes
64f0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
6500: 61 6c 75 65 73 20 74 68 61 74 20 63 6f 6d 65 20  alues that come 
6510: 6c 61 74 65 72 20 69 6e 20 74 68 65 20 69 74 65  later in the ite
6520: 72 61 74 69 6f 6e 20 6f 72 64 65 72 20 61 72 65  ration order are
6530: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74  .** considered t
6540: 6f 20 62 65 20 6c 61 72 67 65 72 2e 20 4e 6f 64  o be larger. Nod
6550: 65 73 20 61 74 20 45 4f 46 20 61 72 65 20 74 68  es at EOF are th
6560: 65 20 6c 61 72 67 65 73 74 20 6f 66 20 61 6c 6c  e largest of all
6570: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61  ..**.** This mea
6580: 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20 69  ns that if the i
6590: 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72 20 69  teration order i
65a0: 73 20 41 53 43 2c 20 74 68 65 6e 20 6e 75 6d 65  s ASC, then nume
65b0: 72 69 63 61 6c 6c 79 20 6c 61 72 67 65 72 0a 2a  rically larger.*
65c0: 2a 20 72 6f 77 69 64 73 20 61 72 65 20 63 6f 6e  * rowids are con
65d0: 73 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e 20  sidered larger. 
65e0: 4f 72 20 69 66 20 69 74 20 69 73 20 74 68 65 20  Or if it is the 
65f0: 64 65 66 61 75 6c 74 20 44 45 53 43 2c 20 6e 75  default DESC, nu
6600: 6d 65 72 69 63 61 6c 6c 79 0a 2a 2a 20 73 6d 61  merically.** sma
6610: 6c 6c 65 72 20 72 6f 77 69 64 73 20 61 72 65 20  ller rowids are 
6620: 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  larger..*/.stati
6630: 63 20 69 6e 74 20 66 74 73 35 4e 6f 64 65 43 6f  c int fts5NodeCo
6640: 6d 70 61 72 65 28 0a 20 20 46 74 73 35 45 78 70  mpare(.  Fts5Exp
6650: 72 20 2a 70 45 78 70 72 2c 0a 20 20 46 74 73 35  r *pExpr,.  Fts5
6660: 45 78 70 72 4e 6f 64 65 20 2a 70 31 2c 20 0a 20  ExprNode *p1, . 
6670: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
6680: 32 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 62  2.){.  if( p2->b
6690: 45 6f 66 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  Eof ) return -1;
66a0: 0a 20 20 69 66 28 20 70 31 2d 3e 62 45 6f 66 20  .  if( p1->bEof 
66b0: 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 72  ) return +1;.  r
66c0: 65 74 75 72 6e 20 66 74 73 35 52 6f 77 69 64 43  eturn fts5RowidC
66d0: 6d 70 28 70 45 78 70 72 2c 20 70 31 2d 3e 69 52  mp(pExpr, p1->iR
66e0: 6f 77 69 64 2c 20 70 32 2d 3e 69 52 6f 77 69 64  owid, p2->iRowid
66f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  );.}../*.** All 
6700: 69 6e 64 69 76 69 64 75 61 6c 20 74 65 72 6d 20  individual term 
6710: 69 74 65 72 61 74 6f 72 73 20 69 6e 20 70 4e 65  iterators in pNe
6720: 61 72 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ar are guarantee
6730: 64 20 74 6f 20 62 65 20 76 61 6c 69 64 20 77 68  d to be valid wh
6740: 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
6750: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  ion is called. T
6760: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
6770: 63 6b 73 20 69 66 20 61 6c 6c 20 74 65 72 6d 20  cks if all term 
6780: 69 74 65 72 61 74 6f 72 73 0a 2a 2a 20 70 6f 69  iterators.** poi
6790: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72  nt to the same r
67a0: 6f 77 69 64 2c 20 61 6e 64 20 69 66 20 6e 6f 74  owid, and if not
67b0: 2c 20 61 64 76 61 6e 63 65 73 20 74 68 65 6d 20  , advances them 
67c0: 75 6e 74 69 6c 20 74 68 65 79 20 64 6f 2e 0a 2a  until they do..*
67d0: 2a 20 49 66 20 61 6e 20 45 4f 46 20 69 73 20 72  * If an EOF is r
67e0: 65 61 63 68 65 64 20 62 65 66 6f 72 65 20 74 68  eached before th
67f0: 69 73 20 68 61 70 70 65 6e 73 2c 20 2a 70 62 45  is happens, *pbE
6800: 6f 66 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  of is set to tru
6810: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  e before.** retu
6820: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  rning..**.** SQL
6830: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6840: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
6850: 63 63 75 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c  ccurs, or an SQL
6860: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 0a  ite error code .
6870: 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74  ** otherwise. It
6880: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
6890: 65 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ed an error code
68a0: 20 69 66 20 61 6e 20 69 74 65 72 61 74 6f 72 20   if an iterator 
68b0: 72 65 61 63 68 65 73 0a 2a 2a 20 45 4f 46 2e 0a  reaches.** EOF..
68c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
68d0: 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 53  s5ExprNodeTest_S
68e0: 54 52 49 4e 47 28 0a 20 20 46 74 73 35 45 78 70  TRING(.  Fts5Exp
68f0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
6900: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6910: 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65 20 62  ession pPhrase b
6920: 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46  elongs to */.  F
6930: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f  ts5ExprNode *pNo
6940: 64 65 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72  de.){.  Fts5Expr
6950: 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d  Nearset *pNear =
6960: 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0a 20   pNode->pNear;. 
6970: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
6980: 2a 70 4c 65 66 74 20 3d 20 70 4e 65 61 72 2d 3e  *pLeft = pNear->
6990: 61 70 50 68 72 61 73 65 5b 30 5d 3b 0a 20 20 69  apPhrase[0];.  i
69a0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
69b0: 4b 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 3b 20  K;.  i64 iLast; 
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 65 73 74 20       /* Lastest 
69e0: 72 6f 77 69 64 20 61 6e 79 20 69 74 65 72 61 74  rowid any iterat
69f0: 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a  or points to */.
6a00: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a20: 20 20 2f 2a 20 50 68 72 61 73 65 20 61 6e 64 20    /* Phrase and 
6a30: 74 6f 6b 65 6e 20 69 6e 64 65 78 2c 20 72 65 73  token index, res
6a40: 70 65 63 74 69 76 65 6c 79 20 2a 2f 0a 20 20 69  pectively */.  i
6a50: 6e 74 20 62 4d 61 74 63 68 3b 20 20 20 20 20 20  nt bMatch;      
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a70: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 74 65  * True if all te
6a80: 72 6d 73 20 61 72 65 20 61 74 20 74 68 65 20 73  rms are at the s
6a90: 61 6d 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63  ame rowid */.  c
6aa0: 6f 6e 73 74 20 69 6e 74 20 62 44 65 73 63 20 3d  onst int bDesc =
6ab0: 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3b 0a 0a   pExpr->bDesc;..
6ac0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
6ad0: 74 68 69 73 20 6e 6f 64 65 20 73 68 6f 75 6c 64  this node should
6ae0: 20 6e 6f 74 20 62 65 20 46 54 53 35 5f 54 45 52   not be FTS5_TER
6af0: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  M */.  assert( p
6b00: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20  Near->nPhrase>1 
6b10: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 61 72  .       || pNear
6b20: 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 6e  ->apPhrase[0]->n
6b30: 54 65 72 6d 3e 31 20 0a 20 20 20 20 20 20 20 7c  Term>1 .       |
6b40: 7c 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  | pNear->apPhras
6b50: 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70  e[0]->aTerm[0].p
6b60: 53 79 6e 6f 6e 79 6d 0a 20 20 20 20 20 20 20 7c  Synonym.       |
6b70: 7c 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  | pNear->apPhras
6b80: 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62  e[0]->aTerm[0].b
6b90: 46 69 72 73 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a  First.  );..  /*
6ba0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 69 4c 61 73   Initialize iLas
6bb0: 74 2c 20 74 68 65 20 22 6c 61 73 74 65 73 74 22  t, the "lastest"
6bc0: 20 72 6f 77 69 64 20 61 6e 79 20 69 74 65 72 61   rowid any itera
6bd0: 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 20 49  tor points to. I
6be0: 66 20 74 68 65 0a 20 20 2a 2a 20 69 74 65 72 61  f the.  ** itera
6bf0: 74 6f 72 20 73 6b 69 70 73 20 74 68 72 6f 75 67  tor skips throug
6c00: 68 20 72 6f 77 69 64 73 20 69 6e 20 74 68 65 20  h rowids in the 
6c10: 64 65 66 61 75 6c 74 20 61 73 63 65 6e 64 69 6e  default ascendin
6c20: 67 20 6f 72 64 65 72 2c 20 74 68 69 73 20 6d 65  g order, this me
6c30: 61 6e 73 0a 20 20 2a 2a 20 74 68 65 20 6d 61 78  ans.  ** the max
6c40: 69 6d 75 6d 20 72 6f 77 69 64 2e 20 4f 72 2c 20  imum rowid. Or, 
6c50: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
6c60: 69 73 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77  is "ORDER BY row
6c70: 69 64 20 44 45 53 43 22 2c 20 74 68 65 6e 20 69  id DESC", then i
6c80: 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 65  t.  ** means the
6c90: 20 6d 69 6e 69 6d 75 6d 20 72 6f 77 69 64 2e 20   minimum rowid. 
6ca0: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   */.  if( pLeft-
6cb0: 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e  >aTerm[0].pSynon
6cc0: 79 6d 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 20  ym ){.    iLast 
6cd0: 3d 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79  = fts5ExprSynony
6ce0: 6d 52 6f 77 69 64 28 26 70 4c 65 66 74 2d 3e 61  mRowid(&pLeft->a
6cf0: 54 65 72 6d 5b 30 5d 2c 20 62 44 65 73 63 2c 20  Term[0], bDesc, 
6d00: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
6d10: 20 69 4c 61 73 74 20 3d 20 70 4c 65 66 74 2d 3e   iLast = pLeft->
6d20: 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 2d 3e  aTerm[0].pIter->
6d30: 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 0a 20 20 64  iRowid;.  }..  d
6d40: 6f 20 7b 0a 20 20 20 20 62 4d 61 74 63 68 20 3d  o {.    bMatch =
6d50: 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   1;.    for(i=0;
6d60: 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
6d70: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  e; i++){.      F
6d80: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
6d90: 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e  Phrase = pNear->
6da0: 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20  apPhrase[i];.   
6db0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
6dc0: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 6a 2b  hrase->nTerm; j+
6dd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  +){.        Fts5
6de0: 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20  ExprTerm *pTerm 
6df0: 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72  = &pPhrase->aTer
6e00: 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[j];.        if
6e10: 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79  ( pTerm->pSynony
6e20: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  m ){.          i
6e30: 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
6e40: 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64  ExprSynonymRowid
6e50: 28 70 54 65 72 6d 2c 20 62 44 65 73 63 2c 20 30  (pTerm, bDesc, 0
6e60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6e70: 20 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 20 29   iRowid==iLast )
6e80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6e90: 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20 30 3b       bMatch = 0;
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
6eb0: 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 41 64  ts5ExprSynonymAd
6ec0: 76 61 6e 63 65 74 6f 28 70 54 65 72 6d 2c 20 62  vanceto(pTerm, b
6ed0: 44 65 73 63 2c 20 26 69 4c 61 73 74 2c 20 26 72  Desc, &iLast, &r
6ee0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
6ef0: 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63    pNode->bNomatc
6f00: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
6f10: 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d     pNode->bEof =
6f20: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
6f30: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
6f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6f50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6f60: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
6f70: 49 74 65 72 20 3d 20 70 50 68 72 61 73 65 2d 3e  Iter = pPhrase->
6f80: 61 54 65 72 6d 5b 6a 5d 2e 70 49 74 65 72 3b 0a  aTerm[j].pIter;.
6f90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
6fa0: 74 65 72 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61  ter->iRowid==iLa
6fb0: 73 74 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f  st || pIter->bEo
6fc0: 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  f ) continue;.  
6fd0: 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d          bMatch =
6fe0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
6ff0: 28 20 66 74 73 35 45 78 70 72 41 64 76 61 6e 63  ( fts5ExprAdvanc
7000: 65 74 6f 28 70 49 74 65 72 2c 20 62 44 65 73 63  eto(pIter, bDesc
7010: 2c 20 26 69 4c 61 73 74 2c 20 26 72 63 2c 20 26  , &iLast, &rc, &
7020: 70 4e 6f 64 65 2d 3e 62 45 6f 66 29 20 29 7b 0a  pNode->bEof) ){.
7030: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
7040: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
7050: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7060: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68     }.    }.  }wh
7070: 69 6c 65 28 20 62 4d 61 74 63 68 3d 3d 30 20 29  ile( bMatch==0 )
7080: 3b 0a 0a 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77  ;..  pNode->iRow
7090: 69 64 20 3d 20 69 4c 61 73 74 3b 0a 20 20 70 4e  id = iLast;.  pN
70a0: 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20  ode->bNomatch = 
70b0: 28 28 30 3d 3d 66 74 73 35 45 78 70 72 4e 65 61  ((0==fts5ExprNea
70c0: 72 54 65 73 74 28 26 72 63 2c 20 70 45 78 70 72  rTest(&rc, pExpr
70d0: 2c 20 70 4e 6f 64 65 29 29 20 26 26 20 72 63 3d  , pNode)) && rc=
70e0: 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 61  =SQLITE_OK);.  a
70f0: 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 45  ssert( pNode->bE
7100: 6f 66 3d 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e  of==0 || pNode->
7110: 62 4e 6f 6d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a  bNomatch==0 );..
7120: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7130: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
7140: 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 74 65  e first term ite
7150: 72 61 74 6f 72 20 69 6e 20 74 68 65 20 66 69 72  rator in the fir
7160: 73 74 20 70 68 72 61 73 65 20 6f 66 20 70 4e 65  st phrase of pNe
7170: 61 72 2e 20 53 65 74 20 6f 75 74 70 75 74 0a 2a  ar. Set output.*
7180: 2a 20 76 61 72 69 61 62 6c 65 20 2a 70 62 45 6f  * variable *pbEo
7190: 66 20 74 6f 20 74 72 75 65 20 69 66 20 69 74 20  f to true if it 
71a0: 72 65 61 63 68 65 73 20 45 4f 46 20 6f 72 20 69  reaches EOF or i
71b0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
71c0: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
71d0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
71e0: 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
71f0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
7200: 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   if an error.** 
7210: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
7220: 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f  c int fts5ExprNo
7230: 64 65 4e 65 78 74 5f 53 54 52 49 4e 47 28 0a 20  deNext_STRING(. 
7240: 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
7250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7260: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70   /* Expression p
7270: 50 68 72 61 73 65 20 62 65 6c 6f 6e 67 73 20 74  Phrase belongs t
7280: 6f 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e  o */.  Fts5ExprN
7290: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20  ode *pNode,     
72a0: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 53         /* FTS5_S
72b0: 54 52 49 4e 47 20 6f 72 20 46 54 53 35 5f 54 45  TRING or FTS5_TE
72c0: 52 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  RM node */.  int
72d0: 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a 20 20 69   bFromValid,.  i
72e0: 36 34 20 69 46 72 6f 6d 20 0a 29 7b 0a 20 20 46  64 iFrom .){.  F
72f0: 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
7300: 72 6d 20 3d 20 26 70 4e 6f 64 65 2d 3e 70 4e 65  rm = &pNode->pNe
7310: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
7320: 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 69 6e 74  >aTerm[0];.  int
7330: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7340: 0a 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61  ..  pNode->bNoma
7350: 74 63 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  tch = 0;.  if( p
7360: 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29  Term->pSynonym )
7370: 7b 0a 20 20 20 20 69 6e 74 20 62 45 6f 66 20 3d  {.    int bEof =
7380: 20 31 3b 0a 20 20 20 20 46 74 73 35 45 78 70 72   1;.    Fts5Expr
7390: 54 65 72 6d 20 2a 70 3b 0a 0a 20 20 20 20 2f 2a  Term *p;..    /*
73a0: 20 46 69 6e 64 20 74 68 65 20 66 69 72 73 74 65   Find the firste
73b0: 73 74 20 72 6f 77 69 64 20 61 6e 79 20 73 79 6e  st rowid any syn
73c0: 6f 6e 79 6d 20 70 6f 69 6e 74 73 20 74 6f 2e 20  onym points to. 
73d0: 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  */.    i64 iRowi
73e0: 64 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e 6f  d = fts5ExprSyno
73f0: 6e 79 6d 52 6f 77 69 64 28 70 54 65 72 6d 2c 20  nymRowid(pTerm, 
7400: 70 45 78 70 72 2d 3e 62 44 65 73 63 2c 20 30 29  pExpr->bDesc, 0)
7410: 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  ;..    /* Advanc
7420: 65 20 65 61 63 68 20 69 74 65 72 61 74 6f 72 20  e each iterator 
7430: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 70  that currently p
7440: 6f 69 6e 74 73 20 74 6f 20 69 52 6f 77 69 64 2e  oints to iRowid.
7450: 20 4f 72 2c 20 69 66 20 69 46 72 6f 6d 0a 20 20   Or, if iFrom.  
7460: 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 20 2d 20    ** is valid - 
7470: 65 61 63 68 20 69 74 65 72 61 74 6f 72 20 74 68  each iterator th
7480: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 72  at points to a r
7490: 6f 77 69 64 20 62 65 66 6f 72 65 20 69 46 72 6f  owid before iFro
74a0: 6d 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  m.  */.    for(p
74b0: 3d 70 54 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e  =pTerm; p; p=p->
74c0: 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20  pSynonym){.     
74d0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
74e0: 49 74 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72  IterEof(p->pIter
74f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7500: 69 36 34 20 69 69 20 3d 20 70 2d 3e 70 49 74 65  i64 ii = p->pIte
7510: 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  r->iRowid;.     
7520: 20 20 20 69 66 28 20 69 69 3d 3d 69 52 6f 77 69     if( ii==iRowi
7530: 64 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  d .         || (
7540: 62 46 72 6f 6d 56 61 6c 69 64 20 26 26 20 69 69  bFromValid && ii
7550: 21 3d 69 46 72 6f 6d 20 26 26 20 28 69 69 3e 69  !=iFrom && (ii>i
7560: 46 72 6f 6d 29 3d 3d 70 45 78 70 72 2d 3e 62 44  From)==pExpr->bD
7570: 65 73 63 29 20 0a 20 20 20 20 20 20 20 20 29 7b  esc) .        ){
7580: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
7590: 46 72 6f 6d 56 61 6c 69 64 20 29 7b 0a 20 20 20  FromValid ){.   
75a0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
75b0: 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
75c0: 74 46 72 6f 6d 28 70 2d 3e 70 49 74 65 72 2c 20  tFrom(p->pIter, 
75d0: 69 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 20 20  iFrom);.        
75e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
75f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7600: 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 2d  3Fts5IterNext(p-
7610: 3e 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20  >pIter);.       
7620: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
7630: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7640: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7650: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
7660: 74 73 35 49 74 65 72 45 6f 66 28 70 2d 3e 70 49  ts5IterEof(p->pI
7670: 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ter)==0 ){.     
7680: 20 20 20 20 20 20 20 62 45 6f 66 20 3d 20 30 3b         bEof = 0;
7690: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
76a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
76b0: 20 20 20 20 20 20 62 45 6f 66 20 3d 20 30 3b 0a        bEof = 0;.
76c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
76d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
76e0: 53 65 74 20 74 68 65 20 45 4f 46 20 66 6c 61 67  Set the EOF flag
76f0: 20 69 66 20 65 69 74 68 65 72 20 61 6c 6c 20 73   if either all s
7700: 79 6e 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 73  ynonym iterators
7710: 20 61 72 65 20 61 74 20 45 4f 46 20 6f 72 20 61   are at EOF or a
7720: 6e 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 68  n.    ** error h
7730: 61 73 20 6f 63 63 75 72 72 65 64 2e 20 20 2a 2f  as occurred.  */
7740: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66  .    pNode->bEof
7750: 20 3d 20 28 72 63 20 7c 7c 20 62 45 6f 66 29 3b   = (rc || bEof);
7760: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
7770: 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
7780: 65 72 20 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65  er = pTerm->pIte
7790: 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
77a0: 46 74 73 35 4e 6f 64 65 49 73 53 74 72 69 6e 67  Fts5NodeIsString
77b0: 28 70 4e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69  (pNode) );.    i
77c0: 66 28 20 62 46 72 6f 6d 56 61 6c 69 64 20 29 7b  f( bFromValid ){
77d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
77e0: 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
77f0: 72 6f 6d 28 70 49 74 65 72 2c 20 69 46 72 6f 6d  rom(pIter, iFrom
7800: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7810: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7820: 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 74  Fts5IterNext(pIt
7830: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
7840: 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 28 72  pNode->bEof = (r
7850: 63 20 7c 7c 20 73 71 6c 69 74 65 33 46 74 73 35  c || sqlite3Fts5
7860: 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 29 3b  IterEof(pIter));
7870: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 6f 64  .  }..  if( pNod
7880: 65 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  e->bEof==0 ){.  
7890: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
78a0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
78b0: 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
78c0: 54 65 73 74 5f 53 54 52 49 4e 47 28 70 45 78 70  Test_STRING(pExp
78d0: 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a  r, pNode);.  }..
78e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
78f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7900: 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 54 45 52  ExprNodeTest_TER
7910: 4d 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  M(.  Fts5Expr *p
7920: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
7930: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
7940: 6f 6e 20 74 68 61 74 20 70 4e 65 61 72 20 69 73  on that pNear is
7950: 20 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20   a part of */.  
7960: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
7970: 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
7980: 2f 2a 20 54 68 65 20 22 4e 45 41 52 22 20 6e 6f  /* The "NEAR" no
7990: 64 65 20 28 46 54 53 35 5f 54 45 52 4d 29 20 2a  de (FTS5_TERM) *
79a0: 2f 0a 29 7b 0a 20 20 2f 2a 20 41 73 20 74 68 69  /.){.  /* As thi
79b0: 73 20 22 4e 45 41 52 22 20 6f 62 6a 65 63 74 20  s "NEAR" object 
79c0: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 69  is actually a si
79d0: 6e 67 6c 65 20 70 68 72 61 73 65 20 74 68 61 74  ngle phrase that
79e0: 20 63 6f 6e 73 69 73 74 73 20 0a 20 20 2a 2a 20   consists .  ** 
79f0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  of a single term
7a00: 20 6f 6e 6c 79 2c 20 67 72 61 62 20 70 6f 69 6e   only, grab poin
7a10: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 70 6f  ters into the po
7a20: 73 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79  slist managed by
7a30: 20 74 68 65 0a 20 20 2a 2a 20 66 74 73 35 5f 69   the.  ** fts5_i
7a40: 6e 64 65 78 2e 63 20 69 74 65 72 61 74 6f 72 20  ndex.c iterator 
7a50: 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 69 73 20  object. This is 
7a60: 6d 75 63 68 20 66 61 73 74 65 72 20 74 68 61 6e  much faster than
7a70: 20 73 79 6e 74 68 65 73 69 7a 69 6e 67 20 0a 20   synthesizing . 
7a80: 20 2a 2a 20 61 20 6e 65 77 20 70 6f 73 6c 69 73   ** a new poslis
7a90: 74 20 74 68 65 20 77 61 79 20 77 65 20 68 61 76  t the way we hav
7aa0: 65 20 74 6f 20 66 6f 72 20 6d 6f 72 65 20 63 6f  e to for more co
7ab0: 6d 70 6c 69 63 61 74 65 64 20 70 68 72 61 73 65  mplicated phrase
7ac0: 20 6f 72 20 4e 45 41 52 0a 20 20 2a 2a 20 65 78   or NEAR.  ** ex
7ad0: 70 72 65 73 73 69 6f 6e 73 2e 20 20 2a 2f 0a 20  pressions.  */. 
7ae0: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
7af0: 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 6f 64 65  *pPhrase = pNode
7b00: 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  ->pNear->apPhras
7b10: 65 5b 30 5d 3b 0a 20 20 46 74 73 35 49 6e 64 65  e[0];.  Fts5Inde
7b20: 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 70  xIter *pIter = p
7b30: 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d  Phrase->aTerm[0]
7b40: 2e 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  .pIter;..  asser
7b50: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  t( pNode->eType=
7b60: 3d 46 54 53 35 5f 54 45 52 4d 20 29 3b 0a 20 20  =FTS5_TERM );.  
7b70: 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 70  assert( pNode->p
7b80: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3d 3d 31  Near->nPhrase==1
7b90: 20 26 26 20 70 50 68 72 61 73 65 2d 3e 6e 54 65   && pPhrase->nTe
7ba0: 72 6d 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  rm==1 );.  asser
7bb0: 74 28 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72  t( pPhrase->aTer
7bc0: 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 3d 3d 30  m[0].pSynonym==0
7bd0: 20 29 3b 0a 0a 20 20 70 50 68 72 61 73 65 2d 3e   );..  pPhrase->
7be0: 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 70 49 74 65  poslist.n = pIte
7bf0: 72 2d 3e 6e 44 61 74 61 3b 0a 20 20 69 66 28 20  r->nData;.  if( 
7c00: 70 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e  pExpr->pConfig->
7c10: 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
7c20: 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  TAIL_FULL ){.   
7c30: 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73   pPhrase->poslis
7c40: 74 2e 70 20 3d 20 28 75 38 2a 29 70 49 74 65 72  t.p = (u8*)pIter
7c50: 2d 3e 70 44 61 74 61 3b 0a 20 20 7d 0a 20 20 70  ->pData;.  }.  p
7c60: 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70  Node->iRowid = p
7c70: 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  Iter->iRowid;.  
7c80: 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20  pNode->bNomatch 
7c90: 3d 20 28 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  = (pPhrase->posl
7ca0: 69 73 74 2e 6e 3d 3d 30 29 3b 0a 20 20 72 65 74  ist.n==0);.  ret
7cb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7cc0: 0a 0a 2f 2a 0a 2a 2a 20 78 4e 65 78 74 28 29 20  ../*.** xNext() 
7cd0: 6d 65 74 68 6f 64 20 66 6f 72 20 61 20 6e 6f 64  method for a nod
7ce0: 65 20 6f 66 20 74 79 70 65 20 46 54 53 35 5f 54  e of type FTS5_T
7cf0: 45 52 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ERM..*/.static i
7d00: 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e  nt fts5ExprNodeN
7d10: 65 78 74 5f 54 45 52 4d 28 0a 20 20 46 74 73 35  ext_TERM(.  Fts5
7d20: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20  Expr *pExpr, .  
7d30: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
7d40: 6f 64 65 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d  ode,.  int bFrom
7d50: 56 61 6c 69 64 2c 0a 20 20 69 36 34 20 69 46 72  Valid,.  i64 iFr
7d60: 6f 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  om.){.  int rc;.
7d70: 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
7d80: 2a 70 49 74 65 72 20 3d 20 70 4e 6f 64 65 2d 3e  *pIter = pNode->
7d90: 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b  pNear->apPhrase[
7da0: 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74  0]->aTerm[0].pIt
7db0: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  er;..  assert( p
7dc0: 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b  Node->bEof==0 );
7dd0: 0a 20 20 69 66 28 20 62 46 72 6f 6d 56 61 6c 69  .  if( bFromVali
7de0: 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  d ){.    rc = sq
7df0: 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
7e00: 74 46 72 6f 6d 28 70 49 74 65 72 2c 20 69 46 72  tFrom(pIter, iFr
7e10: 6f 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  om);.  }else{.  
7e20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
7e30: 73 35 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  s5IterNext(pIter
7e40: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
7e50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
7e60: 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
7e70: 28 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20  (pIter)==0 ){.  
7e80: 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
7e90: 6f 64 65 54 65 73 74 5f 54 45 52 4d 28 70 45 78  odeTest_TERM(pEx
7ea0: 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 65  pr, pNode);.  }e
7eb0: 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  lse{.    pNode->
7ec0: 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e  bEof = 1;.    pN
7ed0: 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20  ode->bNomatch = 
7ee0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7ef0: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  rc;.}..static vo
7f00: 69 64 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54  id fts5ExprNodeT
7f10: 65 73 74 5f 4f 52 28 0a 20 20 46 74 73 35 45 78  est_OR(.  Fts5Ex
7f20: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
7f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
7f40: 72 65 73 73 69 6f 6e 20 6f 66 20 77 68 69 63 68  ression of which
7f50: 20 70 4e 6f 64 65 20 69 73 20 61 20 70 61 72 74   pNode is a part
7f60: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f   */.  Fts5ExprNo
7f70: 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20 20 20  de *pNode       
7f80: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
7f90: 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 74 65 73 74  ion node to test
7fa0: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 45 78 70   */.){.  Fts5Exp
7fb0: 72 4e 6f 64 65 20 2a 70 4e 65 78 74 20 3d 20 70  rNode *pNext = p
7fc0: 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d  Node->apChild[0]
7fd0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
7fe0: 72 28 69 3d 31 3b 20 69 3c 70 4e 6f 64 65 2d 3e  r(i=1; i<pNode->
7ff0: 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nChild; i++){.  
8000: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
8010: 70 43 68 69 6c 64 20 3d 20 70 4e 6f 64 65 2d 3e  pChild = pNode->
8020: 61 70 43 68 69 6c 64 5b 69 5d 3b 0a 20 20 20 20  apChild[i];.    
8030: 69 6e 74 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f  int cmp = fts5No
8040: 64 65 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c  deCompare(pExpr,
8050: 20 70 4e 65 78 74 2c 20 70 43 68 69 6c 64 29 3b   pNext, pChild);
8060: 0a 20 20 20 20 69 66 28 20 63 6d 70 3e 30 20 7c  .    if( cmp>0 |
8070: 7c 20 28 63 6d 70 3d 3d 30 20 26 26 20 70 43 68  | (cmp==0 && pCh
8080: 69 6c 64 2d 3e 62 4e 6f 6d 61 74 63 68 3d 3d 30  ild->bNomatch==0
8090: 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  ) ){.      pNext
80a0: 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 20 20 7d   = pChild;.    }
80b0: 0a 20 20 7d 0a 20 20 70 4e 6f 64 65 2d 3e 69 52  .  }.  pNode->iR
80c0: 6f 77 69 64 20 3d 20 70 4e 65 78 74 2d 3e 69 52  owid = pNext->iR
80d0: 6f 77 69 64 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62  owid;.  pNode->b
80e0: 45 6f 66 20 3d 20 70 4e 65 78 74 2d 3e 62 45 6f  Eof = pNext->bEo
80f0: 66 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  f;.  pNode->bNom
8100: 61 74 63 68 20 3d 20 70 4e 65 78 74 2d 3e 62 4e  atch = pNext->bN
8110: 6f 6d 61 74 63 68 3b 0a 7d 0a 0a 73 74 61 74 69  omatch;.}..stati
8120: 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f  c int fts5ExprNo
8130: 64 65 4e 65 78 74 5f 4f 52 28 0a 20 20 46 74 73  deNext_OR(.  Fts
8140: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20  5Expr *pExpr, . 
8150: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
8160: 4e 6f 64 65 2c 0a 20 20 69 6e 74 20 62 46 72 6f  Node,.  int bFro
8170: 6d 56 61 6c 69 64 2c 0a 20 20 69 36 34 20 69 46  mValid,.  i64 iF
8180: 72 6f 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rom.){.  int i;.
8190: 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20 70 4e    i64 iLast = pN
81a0: 6f 64 65 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20  ode->iRowid;..  
81b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65  for(i=0; i<pNode
81c0: 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a  ->nChild; i++){.
81d0: 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65      Fts5ExprNode
81e0: 20 2a 70 31 20 3d 20 70 4e 6f 64 65 2d 3e 61 70   *p1 = pNode->ap
81f0: 43 68 69 6c 64 5b 69 5d 3b 0a 20 20 20 20 61 73  Child[i];.    as
8200: 73 65 72 74 28 20 70 31 2d 3e 62 45 6f 66 20 7c  sert( p1->bEof |
8210: 7c 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70  | fts5RowidCmp(p
8220: 45 78 70 72 2c 20 70 31 2d 3e 69 52 6f 77 69 64  Expr, p1->iRowid
8230: 2c 20 69 4c 61 73 74 29 3e 3d 30 20 29 3b 0a 20  , iLast)>=0 );. 
8240: 20 20 20 69 66 28 20 70 31 2d 3e 62 45 6f 66 3d     if( p1->bEof=
8250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
8260: 28 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61  (p1->iRowid==iLa
8270: 73 74 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  st) .       || (
8280: 62 46 72 6f 6d 56 61 6c 69 64 20 26 26 20 66 74  bFromValid && ft
8290: 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72  s5RowidCmp(pExpr
82a0: 2c 20 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69 46  , p1->iRowid, iF
82b0: 72 6f 6d 29 3c 30 29 0a 20 20 20 20 20 20 29 7b  rom)<0).      ){
82c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
82d0: 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  = fts5ExprNodeNe
82e0: 78 74 28 70 45 78 70 72 2c 20 70 31 2c 20 62 46  xt(pExpr, p1, bF
82f0: 72 6f 6d 56 61 6c 69 64 2c 20 69 46 72 6f 6d 29  romValid, iFrom)
8300: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
8310: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8320: 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e           pNode->
8330: 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20  bNomatch = 0;.  
8340: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
8350: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
8360: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
8370: 20 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65    fts5ExprNodeTe
8380: 73 74 5f 4f 52 28 70 45 78 70 72 2c 20 70 4e 6f  st_OR(pExpr, pNo
8390: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  de);.  return SQ
83a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
83b0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 4e 6f 64 65  * Argument pNode
83c0: 20 69 73 20 61 6e 20 46 54 53 35 5f 41 4e 44 20   is an FTS5_AND 
83d0: 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  node..*/.static 
83e0: 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65  int fts5ExprNode
83f0: 54 65 73 74 5f 41 4e 44 28 0a 20 20 46 74 73 35  Test_AND(.  Fts5
8400: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
8410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
8420: 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61 73  xpression pPhras
8430: 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
8440: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
8450: 70 41 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  pAnd            
8460: 20 20 2f 2a 20 46 54 53 35 5f 41 4e 44 20 6e 6f    /* FTS5_AND no
8470: 64 65 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  de to advance */
8480: 0a 29 7b 0a 20 20 69 6e 74 20 69 43 68 69 6c 64  .){.  int iChild
8490: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
84a0: 70 41 6e 64 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pAnd->iRowid;.  
84b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
84c0: 4f 4b 3b 0a 20 20 69 6e 74 20 62 4d 61 74 63 68  OK;.  int bMatch
84d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 41 6e  ;..  assert( pAn
84e0: 64 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  d->bEof==0 );.  
84f0: 64 6f 20 7b 0a 20 20 20 20 70 41 6e 64 2d 3e 62  do {.    pAnd->b
8500: 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  Nomatch = 0;.   
8510: 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20   bMatch = 1;.   
8520: 20 66 6f 72 28 69 43 68 69 6c 64 3d 30 3b 20 69   for(iChild=0; i
8530: 43 68 69 6c 64 3c 70 41 6e 64 2d 3e 6e 43 68 69  Child<pAnd->nChi
8540: 6c 64 3b 20 69 43 68 69 6c 64 2b 2b 29 7b 0a 20  ld; iChild++){. 
8550: 20 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64       Fts5ExprNod
8560: 65 20 2a 70 43 68 69 6c 64 20 3d 20 70 41 6e 64  e *pChild = pAnd
8570: 2d 3e 61 70 43 68 69 6c 64 5b 69 43 68 69 6c 64  ->apChild[iChild
8580: 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6d 70  ];.      int cmp
8590: 20 3d 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28   = fts5RowidCmp(
85a0: 70 45 78 70 72 2c 20 69 4c 61 73 74 2c 20 70 43  pExpr, iLast, pC
85b0: 68 69 6c 64 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  hild->iRowid);. 
85c0: 20 20 20 20 20 69 66 28 20 63 6d 70 3e 30 20 29       if( cmp>0 )
85d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76  {.        /* Adv
85e0: 61 6e 63 65 20 70 43 68 69 6c 64 20 75 6e 74 69  ance pChild unti
85f0: 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  l it points to i
8600: 4c 61 73 74 20 6f 72 20 6c 61 73 74 65 72 20 2a  Last or laster *
8610: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
8620: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28  ts5ExprNodeNext(
8630: 70 45 78 70 72 2c 20 70 43 68 69 6c 64 2c 20 31  pExpr, pChild, 1
8640: 2c 20 69 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  , iLast);.      
8650: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8660: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
8670: 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63 68 20   pAnd->bNomatch 
8680: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
8690: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
86a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
86b0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 69     /* If the chi
86c0: 6c 64 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20 61  ld node is now a
86d0: 74 20 45 4f 46 2c 20 73 6f 20 69 73 20 74 68 65  t EOF, so is the
86e0: 20 70 61 72 65 6e 74 20 41 4e 44 20 6e 6f 64 65   parent AND node
86f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
8700: 20 20 20 2a 2a 20 74 68 65 20 63 68 69 6c 64 20     ** the child 
8710: 6e 6f 64 65 20 69 73 20 67 75 61 72 61 6e 74 65  node is guarante
8720: 65 64 20 74 6f 20 68 61 76 65 20 61 64 76 61 6e  ed to have advan
8730: 63 65 64 20 61 74 20 6c 65 61 73 74 20 61 73 20  ced at least as 
8740: 66 61 72 20 61 73 0a 20 20 20 20 20 20 2a 2a 20  far as.      ** 
8750: 72 6f 77 69 64 20 69 4c 61 73 74 2e 20 53 6f 20  rowid iLast. So 
8760: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20  if it is not at 
8770: 65 78 61 63 74 6c 79 20 69 4c 61 73 74 2c 20 70  exactly iLast, p
8780: 43 68 69 6c 64 2d 3e 69 52 6f 77 69 64 20 69 73  Child->iRowid is
8790: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
87a0: 77 20 6c 61 73 74 65 73 74 20 72 6f 77 69 64 20  w lastest rowid 
87b0: 73 65 65 6e 20 73 6f 20 66 61 72 2e 20 20 2a 2f  seen so far.  */
87c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
87d0: 43 68 69 6c 64 2d 3e 62 45 6f 66 20 7c 7c 20 66  Child->bEof || f
87e0: 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70  ts5RowidCmp(pExp
87f0: 72 2c 20 69 4c 61 73 74 2c 20 70 43 68 69 6c 64  r, iLast, pChild
8800: 2d 3e 69 52 6f 77 69 64 29 3c 3d 30 20 29 3b 0a  ->iRowid)<=0 );.
8810: 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64        if( pChild
8820: 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20  ->bEof ){.      
8830: 20 20 66 74 73 35 45 78 70 72 53 65 74 45 6f 66    fts5ExprSetEof
8840: 28 70 41 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  (pAnd);.        
8850: 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  bMatch = 1;.    
8860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8870: 20 7d 65 6c 73 65 20 69 66 28 20 69 4c 61 73 74   }else if( iLast
8880: 21 3d 70 43 68 69 6c 64 2d 3e 69 52 6f 77 69 64  !=pChild->iRowid
8890: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4d 61 74   ){.        bMat
88a0: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
88b0: 69 4c 61 73 74 20 3d 20 70 43 68 69 6c 64 2d 3e  iLast = pChild->
88c0: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 7d 0a  iRowid;.      }.
88d0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c  .      if( pChil
88e0: 64 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 7b 0a 20  d->bNomatch ){. 
88f0: 20 20 20 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f         pAnd->bNo
8900: 6d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20  match = 1;.     
8910: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
8920: 65 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a  e( bMatch==0 );.
8930: 0a 20 20 69 66 28 20 70 41 6e 64 2d 3e 62 4e 6f  .  if( pAnd->bNo
8940: 6d 61 74 63 68 20 26 26 20 70 41 6e 64 21 3d 70  match && pAnd!=p
8950: 45 78 70 72 2d 3e 70 52 6f 6f 74 20 29 7b 0a 20  Expr->pRoot ){. 
8960: 20 20 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a     fts5ExprNodeZ
8970: 65 72 6f 50 6f 73 6c 69 73 74 28 70 41 6e 64 29  eroPoslist(pAnd)
8980: 3b 0a 20 20 7d 0a 20 20 70 41 6e 64 2d 3e 69 52  ;.  }.  pAnd->iR
8990: 6f 77 69 64 20 3d 20 69 4c 61 73 74 3b 0a 20 20  owid = iLast;.  
89a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
89b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
89c0: 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
89d0: 5f 41 4e 44 28 0a 20 20 46 74 73 35 45 78 70 72  _AND(.  Fts5Expr
89e0: 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74 73 35   *pExpr, .  Fts5
89f0: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  ExprNode *pNode,
8a00: 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69  .  int bFromVali
8a10: 64 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d 0a 29  d,.  i64 iFrom.)
8a20: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  {.  int rc = fts
8a30: 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70 45  5ExprNodeNext(pE
8a40: 78 70 72 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68  xpr, pNode->apCh
8a50: 69 6c 64 5b 30 5d 2c 20 62 46 72 6f 6d 56 61 6c  ild[0], bFromVal
8a60: 69 64 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 69 66  id, iFrom);.  if
8a70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8a80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  ){.    rc = fts5
8a90: 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 41 4e 44  ExprNodeTest_AND
8aa0: 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a  (pExpr, pNode);.
8ab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 6f    }else{.    pNo
8ac0: 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30  de->bNomatch = 0
8ad0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8ae0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
8af0: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73   fts5ExprNodeTes
8b00: 74 5f 4e 4f 54 28 0a 20 20 46 74 73 35 45 78 70  t_NOT(.  Fts5Exp
8b10: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
8b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
8b30: 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65 20 62  ession pPhrase b
8b40: 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46  elongs to */.  F
8b50: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f  ts5ExprNode *pNo
8b60: 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  de             /
8b70: 2a 20 46 54 53 35 5f 4e 4f 54 20 6e 6f 64 65 20  * FTS5_NOT node 
8b80: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b  to advance */.){
8b90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8ba0: 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 45 78 70  TE_OK;.  Fts5Exp
8bb0: 72 4e 6f 64 65 20 2a 70 31 20 3d 20 70 4e 6f 64  rNode *p1 = pNod
8bc0: 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 3b 0a 20  e->apChild[0];. 
8bd0: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
8be0: 32 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69  2 = pNode->apChi
8bf0: 6c 64 5b 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ld[1];.  assert(
8c00: 20 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d   pNode->nChild==
8c10: 32 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72  2 );..  while( r
8c20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8c30: 70 31 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20  p1->bEof==0 ){. 
8c40: 20 20 20 69 6e 74 20 63 6d 70 20 3d 20 66 74 73     int cmp = fts
8c50: 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45 78  5NodeCompare(pEx
8c60: 70 72 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 20  pr, p1, p2);.   
8c70: 20 69 66 28 20 63 6d 70 3e 30 20 29 7b 0a 20 20   if( cmp>0 ){.  
8c80: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
8c90: 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c  rNodeNext(pExpr,
8ca0: 20 70 32 2c 20 31 2c 20 70 31 2d 3e 69 52 6f 77   p2, 1, p1->iRow
8cb0: 69 64 29 3b 0a 20 20 20 20 20 20 63 6d 70 20 3d  id);.      cmp =
8cc0: 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72 65   fts5NodeCompare
8cd0: 28 70 45 78 70 72 2c 20 70 31 2c 20 70 32 29 3b  (pExpr, p1, p2);
8ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
8cf0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
8d00: 20 7c 7c 20 63 6d 70 3c 3d 30 20 29 3b 0a 20 20   || cmp<=0 );.  
8d10: 20 20 69 66 28 20 63 6d 70 20 7c 7c 20 70 32 2d    if( cmp || p2-
8d20: 3e 62 4e 6f 6d 61 74 63 68 20 29 20 62 72 65 61  >bNomatch ) brea
8d30: 6b 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  k;.    rc = fts5
8d40: 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78  ExprNodeNext(pEx
8d50: 70 72 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 20  pr, p1, 0, 0);. 
8d60: 20 7d 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66   }.  pNode->bEof
8d70: 20 3d 20 70 31 2d 3e 62 45 6f 66 3b 0a 20 20 70   = p1->bEof;.  p
8d80: 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d  Node->bNomatch =
8d90: 20 70 31 2d 3e 62 4e 6f 6d 61 74 63 68 3b 0a 20   p1->bNomatch;. 
8da0: 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d   pNode->iRowid =
8db0: 20 70 31 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69   p1->iRowid;.  i
8dc0: 66 28 20 70 31 2d 3e 62 45 6f 66 20 29 7b 0a 20  f( p1->bEof ){. 
8dd0: 20 20 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a     fts5ExprNodeZ
8de0: 65 72 6f 50 6f 73 6c 69 73 74 28 70 32 29 3b 0a  eroPoslist(p2);.
8df0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8e00: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
8e10: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f  ts5ExprNodeNext_
8e20: 4e 4f 54 28 0a 20 20 46 74 73 35 45 78 70 72 20  NOT(.  Fts5Expr 
8e30: 2a 70 45 78 70 72 2c 20 0a 20 20 46 74 73 35 45  *pExpr, .  Fts5E
8e40: 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a  xprNode *pNode,.
8e50: 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64    int bFromValid
8e60: 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d 0a 29 7b  ,.  i64 iFrom.){
8e70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 35  .  int rc = fts5
8e80: 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78  ExprNodeNext(pEx
8e90: 70 72 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69  pr, pNode->apChi
8ea0: 6c 64 5b 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69  ld[0], bFromVali
8eb0: 64 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 69 66 28  d, iFrom);.  if(
8ec0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8ed0: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45  {.    rc = fts5E
8ee0: 78 70 72 4e 6f 64 65 54 65 73 74 5f 4e 4f 54 28  xprNodeTest_NOT(
8ef0: 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20  pExpr, pNode);. 
8f00: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
8f10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e  ITE_OK ){.    pN
8f20: 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20  ode->bNomatch = 
8f30: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
8f40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
8f50: 70 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  pNode currently 
8f60: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6d 61 74 63  points to a matc
8f70: 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  h, this function
8f80: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
8f90: 4f 4b 0a 2a 2a 20 77 69 74 68 6f 75 74 20 6d 6f  OK.** without mo
8fa0: 64 69 66 79 69 6e 67 20 69 74 2e 20 4f 74 68 65  difying it. Othe
8fb0: 72 77 69 73 65 2c 20 70 4e 6f 64 65 20 69 73 20  rwise, pNode is 
8fc0: 61 64 76 61 6e 63 65 64 20 75 6e 74 69 6c 20 69  advanced until i
8fd0: 74 20 64 6f 65 73 20 70 6f 69 6e 74 0a 2a 2a 20  t does point.** 
8fe0: 74 6f 20 61 20 6d 61 74 63 68 20 6f 72 20 45 4f  to a match or EO
8ff0: 46 20 69 73 20 72 65 61 63 68 65 64 2e 0a 2a 2f  F is reached..*/
9000: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
9010: 45 78 70 72 4e 6f 64 65 54 65 73 74 28 0a 20 20  ExprNodeTest(.  
9020: 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts5Expr *pExpr,
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 66  /* Expression of
9050: 20 77 68 69 63 68 20 70 4e 6f 64 65 20 69 73 20   which pNode is 
9060: 61 20 70 61 72 74 20 2a 2f 0a 20 20 46 74 73 35  a part */.  Fts5
9070: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  ExprNode *pNode 
9080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9090: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74  xpression node t
90a0: 6f 20 74 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69  o test */.){.  i
90b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
90c0: 4b 3b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  K;.  if( pNode->
90d0: 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  bEof==0 ){.    s
90e0: 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54  witch( pNode->eT
90f0: 79 70 65 20 29 7b 0a 0a 20 20 20 20 20 20 63 61  ype ){..      ca
9100: 73 65 20 46 54 53 35 5f 53 54 52 49 4e 47 3a 20  se FTS5_STRING: 
9110: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
9120: 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f  ts5ExprNodeTest_
9130: 53 54 52 49 4e 47 28 70 45 78 70 72 2c 20 70 4e  STRING(pExpr, pN
9140: 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ode);.        br
9150: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
9160: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 54 45      case FTS5_TE
9170: 52 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 72 63  RM: {.        rc
9180: 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54   = fts5ExprNodeT
9190: 65 73 74 5f 54 45 52 4d 28 70 45 78 70 72 2c 20  est_TERM(pExpr, 
91a0: 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  pNode);.        
91b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
91c0: 20 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f        case FTS5_
91d0: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 72  AND: {.        r
91e0: 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
91f0: 54 65 73 74 5f 41 4e 44 28 70 45 78 70 72 2c 20  Test_AND(pExpr, 
9200: 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  pNode);.        
9210: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9220: 20 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f        case FTS5_
9230: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 74  OR: {.        ft
9240: 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f  s5ExprNodeTest_O
9250: 52 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b  R(pExpr, pNode);
9260: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9270: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
9280: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
9290: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
92a0: 53 35 5f 4e 4f 54 20 29 3b 20 7b 0a 20 20 20 20  S5_NOT ); {.    
92b0: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
92c0: 72 4e 6f 64 65 54 65 73 74 5f 4e 4f 54 28 70 45  rNodeTest_NOT(pE
92d0: 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  xpr, pNode);.   
92e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
92f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9300: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 20 0a  return rc;.}.. .
9310: 2f 2a 0a 2a 2a 20 53 65 74 20 6e 6f 64 65 20 70  /*.** Set node p
9320: 4e 6f 64 65 2c 20 77 68 69 63 68 20 69 73 20 70  Node, which is p
9330: 61 72 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  art of expressio
9340: 6e 20 70 45 78 70 72 2c 20 74 6f 20 70 6f 69 6e  n pExpr, to poin
9350: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
9360: 2a 20 6d 61 74 63 68 2e 20 49 66 20 74 68 65 72  * match. If ther
9370: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
9380: 2c 20 73 65 74 20 74 68 65 20 4e 6f 64 65 2e 62  , set the Node.b
9390: 45 6f 66 20 66 6c 61 67 20 74 6f 20 69 6e 64 69  Eof flag to indi
93a0: 63 61 74 65 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  cate EOF..**.** 
93b0: 52 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  Return an SQLite
93c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
93d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
93e0: 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 74 68  or SQLITE_OK oth
93f0: 65 72 77 69 73 65 2e 0a 2a 2a 20 49 74 20 69 73  erwise..** It is
9400: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 66   not an error if
9410: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61   there are no ma
9420: 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tches..*/.static
9430: 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64   int fts5ExprNod
9440: 65 46 69 72 73 74 28 46 74 73 35 45 78 70 72 20  eFirst(Fts5Expr 
9450: 2a 70 45 78 70 72 2c 20 46 74 73 35 45 78 70 72  *pExpr, Fts5Expr
9460: 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20  Node *pNode){.  
9470: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9480: 4f 4b 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f  OK;.  pNode->bEo
9490: 66 20 3d 20 30 3b 0a 20 20 70 4e 6f 64 65 2d 3e  f = 0;.  pNode->
94a0: 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 0a 20  bNomatch = 0;.. 
94b0: 20 69 66 28 20 46 74 73 35 4e 6f 64 65 49 73 53   if( Fts5NodeIsS
94c0: 74 72 69 6e 67 28 70 4e 6f 64 65 29 20 29 7b 0a  tring(pNode) ){.
94d0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
94e0: 65 20 61 6c 6c 20 74 65 72 6d 20 69 74 65 72 61  e all term itera
94f0: 74 6f 72 73 20 69 6e 20 74 68 65 20 4e 45 41 52  tors in the NEAR
9500: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
9510: 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 65 61  rc = fts5ExprNea
9520: 72 49 6e 69 74 41 6c 6c 28 70 45 78 70 72 2c 20  rInitAll(pExpr, 
9530: 70 4e 6f 64 65 29 3b 0a 20 20 7d 65 6c 73 65 20  pNode);.  }else 
9540: 69 66 28 20 70 4e 6f 64 65 2d 3e 78 4e 65 78 74  if( pNode->xNext
9550: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65  ==0 ){.    pNode
9560: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65  ->bEof = 1;.  }e
9570: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
9580: 20 20 20 20 69 6e 74 20 6e 45 6f 66 20 3d 20 30      int nEof = 0
9590: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
95a0: 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 20 26  <pNode->nChild &
95b0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
95c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   i++){.      Fts
95d0: 35 45 78 70 72 4e 6f 64 65 20 2a 70 43 68 69 6c  5ExprNode *pChil
95e0: 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69  d = pNode->apChi
95f0: 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 72 63 20  ld[i];.      rc 
9600: 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69  = fts5ExprNodeFi
9610: 72 73 74 28 70 45 78 70 72 2c 20 70 4e 6f 64 65  rst(pExpr, pNode
9620: 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20  ->apChild[i]);. 
9630: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68       assert( pCh
9640: 69 6c 64 2d 3e 62 45 6f 66 3d 3d 30 20 7c 7c 20  ild->bEof==0 || 
9650: 70 43 68 69 6c 64 2d 3e 62 45 6f 66 3d 3d 31 20  pChild->bEof==1 
9660: 29 3b 0a 20 20 20 20 20 20 6e 45 6f 66 20 2b 3d  );.      nEof +=
9670: 20 70 43 68 69 6c 64 2d 3e 62 45 6f 66 3b 0a 20   pChild->bEof;. 
9680: 20 20 20 7d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e     }.    pNode->
9690: 69 52 6f 77 69 64 20 3d 20 70 4e 6f 64 65 2d 3e  iRowid = pNode->
96a0: 61 70 43 68 69 6c 64 5b 30 5d 2d 3e 69 52 6f 77  apChild[0]->iRow
96b0: 69 64 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28  id;..    switch(
96c0: 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b   pNode->eType ){
96d0: 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53 35  .      case FTS5
96e0: 5f 41 4e 44 3a 0a 20 20 20 20 20 20 20 20 69 66  _AND:.        if
96f0: 28 20 6e 45 6f 66 3e 30 20 29 20 66 74 73 35 45  ( nEof>0 ) fts5E
9700: 78 70 72 53 65 74 45 6f 66 28 70 4e 6f 64 65 29  xprSetEof(pNode)
9710: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9720: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53  ..      case FTS
9730: 35 5f 4f 52 3a 0a 20 20 20 20 20 20 20 20 69 66  5_OR:.        if
9740: 28 20 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d  ( pNode->nChild=
9750: 3d 6e 45 6f 66 20 29 20 66 74 73 35 45 78 70 72  =nEof ) fts5Expr
9760: 53 65 74 45 6f 66 28 70 4e 6f 64 65 29 3b 0a 20  SetEof(pNode);. 
9770: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
9780: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
9790: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
97a0: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ode->eType==FTS5
97b0: 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20  _NOT );.        
97c0: 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 70 4e  pNode->bEof = pN
97d0: 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2d  ode->apChild[0]-
97e0: 3e 62 45 6f 66 3b 0a 20 20 20 20 20 20 20 20 62  >bEof;.        b
97f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9800: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9810: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
9820: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73   fts5ExprNodeTes
9830: 74 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b  t(pExpr, pNode);
9840: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9850: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  ;.}.../*.** Begi
9860: 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  n iterating thro
9870: 75 67 68 20 74 68 65 20 73 65 74 20 6f 66 20 64  ugh the set of d
9880: 6f 63 75 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65  ocuments in inde
9890: 78 20 70 49 64 78 20 6d 61 74 63 68 65 64 20 62  x pIdx matched b
98a0: 79 0a 2a 2a 20 74 68 65 20 4d 41 54 43 48 20 65  y.** the MATCH e
98b0: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
98c0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
98d0: 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 22  gument. If the "
98e0: 62 44 65 73 63 22 20 0a 2a 2a 20 70 61 72 61 6d  bDesc" .** param
98f0: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 61  eter is passed a
9900: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
9910: 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 69 6e   iteration is in
9920: 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
9930: 64 20 0a 2a 2a 20 6f 72 64 65 72 2e 20 4f 72 2c  d .** order. Or,
9940: 20 69 66 20 69 74 20 69 73 20 7a 65 72 6f 2c 20   if it is zero, 
9950: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
9960: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 65  er..**.** If ite
9970: 72 61 74 69 6e 67 20 69 6e 20 61 73 63 65 6e 64  rating in ascend
9980: 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20  ing rowid order 
9990: 28 62 44 65 73 63 3d 3d 30 29 2c 20 74 68 65 20  (bDesc==0), the 
99a0: 66 69 72 73 74 20 64 6f 63 75 6d 65 6e 74 0a 2a  first document.*
99b0: 2a 20 76 69 73 69 74 65 64 20 69 73 20 74 68 61  * visited is tha
99c0: 74 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  t with the small
99d0: 65 73 74 20 72 6f 77 69 64 20 74 68 61 74 20 69  est rowid that i
99e0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72  s larger than or
99f0: 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 70 61 72   equal.** to par
9a00: 61 6d 65 74 65 72 20 69 46 69 72 73 74 2e 20 4f  ameter iFirst. O
9a10: 72 2c 20 69 66 20 69 74 65 72 61 74 69 6e 67 20  r, if iterating 
9a20: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
9a30: 65 72 20 28 62 44 65 73 63 3d 3d 31 29 2c 0a 2a  er (bDesc==1),.*
9a40: 2a 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  * then the first
9a50: 20 64 6f 63 75 6d 65 6e 74 20 76 69 73 69 74 65   document visite
9a60: 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 72 6f  d must have a ro
9a70: 77 69 64 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  wid smaller than
9a80: 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20   or.** equal to 
9a90: 69 46 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  iFirst..**.** Re
9aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
9ab0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
9ac0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
9ad0: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
9ae0: 20 49 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f   It.** is not co
9af0: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
9b00: 72 20 69 66 20 74 68 65 20 71 75 65 72 79 20 64  r if the query d
9b10: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
9b20: 79 20 64 6f 63 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  y documents..*/.
9b30: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
9b40: 78 70 72 46 69 72 73 74 28 46 74 73 35 45 78 70  xprFirst(Fts5Exp
9b50: 72 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 20  r *p, Fts5Index 
9b60: 2a 70 49 64 78 2c 20 69 36 34 20 69 46 69 72 73  *pIdx, i64 iFirs
9b70: 74 2c 20 69 6e 74 20 62 44 65 73 63 29 7b 0a 20  t, int bDesc){. 
9b80: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
9b90: 52 6f 6f 74 20 3d 20 70 2d 3e 70 52 6f 6f 74 3b  Root = p->pRoot;
9ba0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bc0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
9bd0: 65 20 2a 2f 0a 0a 20 20 70 2d 3e 70 49 6e 64 65  e */..  p->pInde
9be0: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 2d 3e 62  x = pIdx;.  p->b
9bf0: 44 65 73 63 20 3d 20 62 44 65 73 63 3b 0a 20 20  Desc = bDesc;.  
9c00: 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
9c10: 65 46 69 72 73 74 28 70 2c 20 70 52 6f 6f 74 29  eFirst(p, pRoot)
9c20: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 61  ;..  /* If not a
9c30: 74 20 45 4f 46 20 62 75 74 20 74 68 65 20 63 75  t EOF but the cu
9c40: 72 72 65 6e 74 20 72 6f 77 69 64 20 6f 63 63 75  rrent rowid occu
9c50: 72 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20  rs earlier than 
9c60: 69 46 69 72 73 74 20 69 6e 0a 20 20 2a 2a 20 74  iFirst in.  ** t
9c70: 68 65 20 69 74 65 72 61 74 69 6f 6e 20 6f 72 64  he iteration ord
9c80: 65 72 2c 20 6d 6f 76 65 20 74 6f 20 64 6f 63 75  er, move to docu
9c90: 6d 65 6e 74 20 69 46 69 72 73 74 20 6f 72 20 6c  ment iFirst or l
9ca0: 61 74 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ater. */.  if( r
9cb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
9cc0: 20 26 26 20 30 3d 3d 70 52 6f 6f 74 2d 3e 62 45   && 0==pRoot->bE
9cd0: 6f 66 20 0a 20 20 20 26 26 20 66 74 73 35 52 6f  of .   && fts5Ro
9ce0: 77 69 64 43 6d 70 28 70 2c 20 70 52 6f 6f 74 2d  widCmp(p, pRoot-
9cf0: 3e 69 52 6f 77 69 64 2c 20 69 46 69 72 73 74 29  >iRowid, iFirst)
9d00: 3c 30 20 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  <0 .  ){.    rc 
9d10: 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  = fts5ExprNodeNe
9d20: 78 74 28 70 2c 20 70 52 6f 6f 74 2c 20 31 2c 20  xt(p, pRoot, 1, 
9d30: 69 46 69 72 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  iFirst);.  }..  
9d40: 2f 2a 20 49 66 20 74 68 65 20 69 74 65 72 61 74  /* If the iterat
9d50: 6f 72 20 69 73 20 6e 6f 74 20 61 74 20 61 20 72  or is not at a r
9d60: 65 61 6c 20 6d 61 74 63 68 2c 20 73 6b 69 70 20  eal match, skip 
9d70: 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 69 74  forward until it
9d80: 20 69 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28   is. */.  while(
9d90: 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68   pRoot->bNomatch
9da0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9db0: 70 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26  pRoot->bEof==0 &
9dc0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
9dd0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  );.    rc = fts5
9de0: 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70 2c 20  ExprNodeNext(p, 
9df0: 70 52 6f 6f 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pRoot, 0, 0);.  
9e00: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9e10: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
9e20: 74 68 65 20 6e 65 78 74 20 64 6f 63 75 6d 65 6e  the next documen
9e30: 74 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t .**.** Return 
9e40: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
9e50: 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
9e60: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
9e70: 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 0a 2a   otherwise. It.*
9e80: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
9e90: 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
9ea0: 74 68 65 20 71 75 65 72 79 20 64 6f 65 73 20 6e  the query does n
9eb0: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 64 6f 63  ot match any doc
9ec0: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  uments..*/.int s
9ed0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e 65  qlite3Fts5ExprNe
9ee0: 78 74 28 46 74 73 35 45 78 70 72 20 2a 70 2c 20  xt(Fts5Expr *p, 
9ef0: 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e  i64 iLast){.  in
9f00: 74 20 72 63 3b 0a 20 20 46 74 73 35 45 78 70 72  t rc;.  Fts5Expr
9f10: 4e 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 70 2d  Node *pRoot = p-
9f20: 3e 70 52 6f 6f 74 3b 0a 20 20 61 73 73 65 72 74  >pRoot;.  assert
9f30: 28 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30  ( pRoot->bEof==0
9f40: 20 26 26 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61   && pRoot->bNoma
9f50: 74 63 68 3d 3d 30 20 29 3b 0a 20 20 64 6f 20 7b  tch==0 );.  do {
9f60: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78  .    rc = fts5Ex
9f70: 70 72 4e 6f 64 65 4e 65 78 74 28 70 2c 20 70 52  prNodeNext(p, pR
9f80: 6f 6f 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oot, 0, 0);.    
9f90: 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62  assert( pRoot->b
9fa0: 4e 6f 6d 61 74 63 68 3d 3d 30 20 7c 7c 20 28 72  Nomatch==0 || (r
9fb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
9fc0: 70 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 29 20  pRoot->bEof==0) 
9fd0: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 52 6f  );.  }while( pRo
9fe0: 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 3b 0a  ot->bNomatch );.
9ff0: 20 20 69 66 28 20 66 74 73 35 52 6f 77 69 64 43    if( fts5RowidC
a000: 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69 52 6f  mp(p, pRoot->iRo
a010: 77 69 64 2c 20 69 4c 61 73 74 29 3e 30 20 29 7b  wid, iLast)>0 ){
a020: 0a 20 20 20 20 70 52 6f 6f 74 2d 3e 62 45 6f 66  .    pRoot->bEof
a030: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
a040: 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
a050: 6c 69 74 65 33 46 74 73 35 45 78 70 72 45 6f 66  lite3Fts5ExprEof
a060: 28 46 74 73 35 45 78 70 72 20 2a 70 29 7b 0a 20  (Fts5Expr *p){. 
a070: 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74   return p->pRoot
a080: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 69 36 34 20 73  ->bEof;.}..i64 s
a090: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 52 6f  qlite3Fts5ExprRo
a0a0: 77 69 64 28 46 74 73 35 45 78 70 72 20 2a 70 29  wid(Fts5Expr *p)
a0b0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52  {.  return p->pR
a0c0: 6f 6f 74 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a  oot->iRowid;.}..
a0d0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
a0e0: 61 72 73 65 53 74 72 69 6e 67 46 72 6f 6d 54 6f  arseStringFromTo
a0f0: 6b 65 6e 28 46 74 73 35 54 6f 6b 65 6e 20 2a 70  ken(Fts5Token *p
a100: 54 6f 6b 65 6e 2c 20 63 68 61 72 20 2a 2a 70 7a  Token, char **pz
a110: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
a120: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 2a 70 7a 20 3d  LITE_OK;.  *pz =
a130: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e   sqlite3Fts5Strn
a140: 64 75 70 28 26 72 63 2c 20 70 54 6f 6b 65 6e 2d  dup(&rc, pToken-
a150: 3e 70 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a  >p, pToken->n);.
a160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a170: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
a180: 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70 61 73  hrase object pas
a190: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
a1a0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
a1b0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 45 78 70  tic void fts5Exp
a1c0: 72 50 68 72 61 73 65 46 72 65 65 28 46 74 73 35  rPhraseFree(Fts5
a1d0: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
a1e0: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 50 68 72  ase){.  if( pPhr
a1f0: 61 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ase ){.    int i
a200: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a210: 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b  <pPhrase->nTerm;
a220: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   i++){.      Fts
a230: 35 45 78 70 72 54 65 72 6d 20 2a 70 53 79 6e 3b  5ExprTerm *pSyn;
a240: 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72 54  .      Fts5ExprT
a250: 65 72 6d 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  erm *pNext;.    
a260: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
a270: 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
a280: 2d 3e 61 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20  ->aTerm[i];.    
a290: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a2a0: 54 65 72 6d 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20  Term->zTerm);.  
a2b0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
a2c0: 74 65 72 43 6c 6f 73 65 28 70 54 65 72 6d 2d 3e  terClose(pTerm->
a2d0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 6f  pIter);.      fo
a2e0: 72 28 70 53 79 6e 3d 70 54 65 72 6d 2d 3e 70 53  r(pSyn=pTerm->pS
a2f0: 79 6e 6f 6e 79 6d 3b 20 70 53 79 6e 3b 20 70 53  ynonym; pSyn; pS
a300: 79 6e 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  yn=pNext){.     
a310: 20 20 20 70 4e 65 78 74 20 3d 20 70 53 79 6e 2d     pNext = pSyn-
a320: 3e 70 53 79 6e 6f 6e 79 6d 3b 0a 20 20 20 20 20  >pSynonym;.     
a330: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74     sqlite3Fts5It
a340: 65 72 43 6c 6f 73 65 28 70 53 79 6e 2d 3e 70 49  erClose(pSyn->pI
a350: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ter);.        ft
a360: 73 35 42 75 66 66 65 72 46 72 65 65 28 28 46 74  s5BufferFree((Ft
a370: 73 35 42 75 66 66 65 72 2a 29 26 70 53 79 6e 5b  s5Buffer*)&pSyn[
a380: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1]);.        sql
a390: 69 74 65 33 5f 66 72 65 65 28 70 53 79 6e 29 3b  ite3_free(pSyn);
a3a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a3b0: 20 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e     if( pPhrase->
a3c0: 70 6f 73 6c 69 73 74 2e 6e 53 70 61 63 65 3e 30  poslist.nSpace>0
a3d0: 20 29 20 66 74 73 35 42 75 66 66 65 72 46 72 65   ) fts5BufferFre
a3e0: 65 28 26 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  e(&pPhrase->posl
a3f0: 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
a400: 33 5f 66 72 65 65 28 70 50 68 72 61 73 65 29 3b  3_free(pPhrase);
a410: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
a420: 74 20 74 68 65 20 22 62 46 69 72 73 74 22 20 66  t the "bFirst" f
a430: 6c 61 67 20 6f 6e 20 74 68 65 20 66 69 72 73 74  lag on the first
a440: 20 74 6f 6b 65 6e 20 6f 66 20 74 68 65 20 70 68   token of the ph
a450: 72 61 73 65 20 70 61 73 73 65 64 20 61 73 20 74  rase passed as t
a460: 68 65 0a 2a 2a 20 6f 6e 6c 79 20 61 72 67 75 6d  he.** only argum
a470: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
a480: 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74  ite3Fts5ParseSet
a490: 43 61 72 65 74 28 46 74 73 35 45 78 70 72 50 68  Caret(Fts5ExprPh
a4a0: 72 61 73 65 20 2a 70 50 68 72 61 73 65 29 7b 0a  rase *pPhrase){.
a4b0: 20 20 69 66 28 20 70 50 68 72 61 73 65 20 26 26    if( pPhrase &&
a4c0: 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20   pPhrase->nTerm 
a4d0: 29 7b 0a 20 20 20 20 70 50 68 72 61 73 65 2d 3e  ){.    pPhrase->
a4e0: 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 20  aTerm[0].bFirst 
a4f0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
a500: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 4e  * If argument pN
a510: 65 61 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ear is NULL, the
a520: 6e 20 61 20 6e 65 77 20 46 74 73 35 45 78 70 72  n a new Fts5Expr
a530: 4e 65 61 72 73 65 74 20 6f 62 6a 65 63 74 20 69  Nearset object i
a540: 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  s allocated.** a
a550: 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
a560: 68 20 70 50 68 72 61 73 65 2e 20 4f 72 2c 20 69  h pPhrase. Or, i
a570: 66 20 70 4e 65 61 72 20 69 73 20 6e 6f 74 20 4e  f pNear is not N
a580: 55 4c 4c 2c 20 70 68 72 61 73 65 20 70 50 68 72  ULL, phrase pPhr
a590: 61 73 65 20 69 73 0a 2a 2a 20 61 70 70 65 6e 64  ase is.** append
a5a0: 65 64 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65  ed to it and the
a5b0: 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
a5c0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  d..**.** If an O
a5d0: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
a5e0: 20 62 6f 74 68 20 74 68 65 20 70 4e 65 61 72 20   both the pNear 
a5f0: 61 6e 64 20 70 50 68 72 61 73 65 20 6f 62 6a 65  and pPhrase obje
a600: 63 74 73 20 61 72 65 20 66 72 65 65 64 20 61 6e  cts are freed an
a610: 64 0a 2a 2a 20 4e 55 4c 4c 20 72 65 74 75 72 6e  d.** NULL return
a620: 65 64 2e 0a 2a 2f 0a 46 74 73 35 45 78 70 72 4e  ed..*/.Fts5ExprN
a630: 65 61 72 73 65 74 20 2a 73 71 6c 69 74 65 33 46  earset *sqlite3F
a640: 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 28  ts5ParseNearset(
a650: 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
a660: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
a670: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
a680: 65 78 74 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  ext */.  Fts5Exp
a690: 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 2c  rNearset *pNear,
a6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
a6b0: 74 69 6e 67 20 6e 65 61 72 73 65 74 2c 20 6f 72  ting nearset, or
a6c0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 46 74 73 35 45   NULL */.  Fts5E
a6d0: 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61  xprPhrase *pPhra
a6e0: 73 65 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  se         /* Re
a6f0: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 70 68  cently parsed ph
a700: 72 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  rase */.){.  con
a710: 73 74 20 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d  st int SZALLOC =
a720: 20 38 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 65   8;.  Fts5ExprNe
a730: 61 72 73 65 74 20 2a 70 52 65 74 20 3d 20 30 3b  arset *pRet = 0;
a740: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
a750: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a760: 0a 20 20 20 20 69 66 28 20 70 50 68 72 61 73 65  .    if( pPhrase
a770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
a780: 75 72 6e 20 70 4e 65 61 72 3b 0a 20 20 20 20 7d  urn pNear;.    }
a790: 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72 3d 3d  .    if( pNear==
a7a0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
a7b0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
a7c0: 73 35 45 78 70 72 4e 65 61 72 73 65 74 29 20 2b  s5ExprNearset) +
a7d0: 20 53 5a 41 4c 4c 4f 43 20 2a 20 73 69 7a 65 6f   SZALLOC * sizeo
a7e0: 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65  f(Fts5ExprPhrase
a7f0: 2a 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  *);.      pRet =
a800: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
a810: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
a820: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
a830: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
a840: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
a850: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a860: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74       memset(pRet
a870: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
a880: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
a890: 66 28 20 28 70 4e 65 61 72 2d 3e 6e 50 68 72 61  f( (pNear->nPhra
a8a0: 73 65 20 25 20 53 5a 41 4c 4c 4f 43 29 3d 3d 30  se % SZALLOC)==0
a8b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
a8c0: 65 77 20 3d 20 70 4e 65 61 72 2d 3e 6e 50 68 72  ew = pNear->nPhr
a8d0: 61 73 65 20 2b 20 53 5a 41 4c 4c 4f 43 3b 0a 20  ase + SZALLOC;. 
a8e0: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
a8f0: 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
a900: 4e 65 61 72 73 65 74 29 20 2b 20 6e 4e 65 77 20  Nearset) + nNew 
a910: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  * sizeof(Fts5Exp
a920: 72 50 68 72 61 73 65 2a 29 3b 0a 0a 20 20 20 20  rPhrase*);..    
a930: 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 45 78    pRet = (Fts5Ex
a940: 70 72 4e 65 61 72 73 65 74 2a 29 73 71 6c 69 74  prNearset*)sqlit
a950: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4e 65 61 72  e3_realloc(pNear
a960: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
a970: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
a980: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
a990: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a9a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
a9b0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 74 20  lse{.      pRet 
a9c0: 3d 20 70 4e 65 61 72 3b 0a 20 20 20 20 7d 0a 20  = pNear;.    }. 
a9d0: 20 7d 0a 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   }..  if( pRet==
a9e0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
a9f0: 20 70 50 61 72 73 65 2d 3e 72 63 21 3d 53 51 4c   pParse->rc!=SQL
aa00: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71  ITE_OK );.    sq
aa10: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
aa20: 61 72 73 65 74 46 72 65 65 28 70 4e 65 61 72 29  arsetFree(pNear)
aa30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
aa40: 35 50 61 72 73 65 50 68 72 61 73 65 46 72 65 65  5ParsePhraseFree
aa50: 28 70 50 68 72 61 73 65 29 3b 0a 20 20 7d 65 6c  (pPhrase);.  }el
aa60: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 65 74  se{.    if( pRet
aa70: 2d 3e 6e 50 68 72 61 73 65 3e 30 20 29 7b 0a 20  ->nPhrase>0 ){. 
aa80: 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72       Fts5ExprPhr
aa90: 61 73 65 20 2a 70 4c 61 73 74 20 3d 20 70 52 65  ase *pLast = pRe
aaa0: 74 2d 3e 61 70 50 68 72 61 73 65 5b 70 52 65 74  t->apPhrase[pRet
aab0: 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 3b 0a 20 20  ->nPhrase-1];.  
aac0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 61 73      assert( pLas
aad0: 74 3d 3d 70 50 61 72 73 65 2d 3e 61 70 50 68 72  t==pParse->apPhr
aae0: 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72  ase[pParse->nPhr
aaf0: 61 73 65 2d 32 5d 20 29 3b 0a 20 20 20 20 20 20  ase-2] );.      
ab00: 69 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54 65  if( pPhrase->nTe
ab10: 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rm==0 ){.       
ab20: 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65 46   fts5ExprPhraseF
ab30: 72 65 65 28 70 50 68 72 61 73 65 29 3b 0a 20 20  ree(pPhrase);.  
ab40: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68 72        pRet->nPhr
ab50: 61 73 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70  ase--;.        p
ab60: 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d 2d  Parse->nPhrase--
ab70: 3b 0a 20 20 20 20 20 20 20 20 70 50 68 72 61 73  ;.        pPhras
ab80: 65 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 20  e = pLast;.     
ab90: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 61 73 74   }else if( pLast
aba0: 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20  ->nTerm==0 ){.  
abb0: 20 20 20 20 20 20 66 74 73 35 45 78 70 72 50 68        fts5ExprPh
abc0: 72 61 73 65 46 72 65 65 28 70 4c 61 73 74 29 3b  raseFree(pLast);
abd0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
abe0: 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65  >apPhrase[pParse
abf0: 2d 3e 6e 50 68 72 61 73 65 2d 32 5d 20 3d 20 70  ->nPhrase-2] = p
ac00: 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20  Phrase;.        
ac10: 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d  pParse->nPhrase-
ac20: 2d 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  -;.        pRet-
ac30: 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a 20 20 20 20  >nPhrase--;.    
ac40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 52    }.    }.    pR
ac50: 65 74 2d 3e 61 70 50 68 72 61 73 65 5b 70 52 65  et->apPhrase[pRe
ac60: 74 2d 3e 6e 50 68 72 61 73 65 2b 2b 5d 20 3d 20  t->nPhrase++] = 
ac70: 70 50 68 72 61 73 65 3b 0a 20 20 7d 0a 20 20 72  pPhrase;.  }.  r
ac80: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 74  eturn pRet;.}..t
ac90: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 6f  ypedef struct To
aca0: 6b 65 6e 43 74 78 20 54 6f 6b 65 6e 43 74 78 3b  kenCtx TokenCtx;
acb0: 0a 73 74 72 75 63 74 20 54 6f 6b 65 6e 43 74 78  .struct TokenCtx
acc0: 20 7b 0a 20 20 46 74 73 35 45 78 70 72 50 68 72   {.  Fts5ExprPhr
acd0: 61 73 65 20 2a 70 50 68 72 61 73 65 3b 0a 20 20  ase *pPhrase;.  
ace0: 69 6e 74 20 72 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  int rc;.};../*.*
acf0: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  * Callback for t
ad00: 6f 6b 65 6e 69 7a 69 6e 67 20 74 65 72 6d 73 20  okenizing terms 
ad10: 75 73 65 64 20 62 79 20 50 61 72 73 65 54 65 72  used by ParseTer
ad20: 6d 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  m()..*/.static i
ad30: 6e 74 20 66 74 73 35 50 61 72 73 65 54 6f 6b 65  nt fts5ParseToke
ad40: 6e 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 70 43  nize(.  void *pC
ad50: 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 20 20 20  ontext,         
ad60: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
ad70: 65 72 20 74 6f 20 46 74 73 35 49 6e 73 65 72 74  er to Fts5Insert
ad80: 43 74 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Ctx object */.  
ad90: 69 6e 74 20 74 66 6c 61 67 73 2c 20 20 20 20 20  int tflags,     
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f  /* Mask of FTS5_
adc0: 54 4f 4b 45 4e 5f 2a 20 66 6c 61 67 73 20 2a 2f  TOKEN_* flags */
add0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
ade0: 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
adf0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
ae00: 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f  taining token */
ae10: 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20  .  int nToken,  
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 6f     /* Size of to
ae40: 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ken in bytes */.
ae50: 20 20 69 6e 74 20 69 55 6e 75 73 65 64 31 2c 20    int iUnused1, 
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 66 73 65    /* Start offse
ae80: 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  t of token */.  
ae90: 69 6e 74 20 69 55 6e 75 73 65 64 32 20 20 20 20  int iUnused2    
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 2f 2a 20 45 6e 64 20 6f 66 66 73 65 74 20 6f 66  /* End offset of
aec0: 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69   token */.){.  i
aed0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
aee0: 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 53  K;.  const int S
aef0: 5a 41 4c 4c 4f 43 20 3d 20 38 3b 0a 20 20 54 6f  ZALLOC = 8;.  To
af00: 6b 65 6e 43 74 78 20 2a 70 43 74 78 20 3d 20 28  kenCtx *pCtx = (
af10: 54 6f 6b 65 6e 43 74 78 2a 29 70 43 6f 6e 74 65  TokenCtx*)pConte
af20: 78 74 3b 0a 20 20 46 74 73 35 45 78 70 72 50 68  xt;.  Fts5ExprPh
af30: 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20  rase *pPhrase = 
af40: 70 43 74 78 2d 3e 70 50 68 72 61 73 65 3b 0a 0a  pCtx->pPhrase;..
af50: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28    UNUSED_PARAM2(
af60: 69 55 6e 75 73 65 64 31 2c 20 69 55 6e 75 73 65  iUnused1, iUnuse
af70: 64 32 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  d2);..  /* If an
af80: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
af90: 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
afa0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a  s is a no-op */.
afb0: 20 20 69 66 28 20 70 43 74 78 2d 3e 72 63 21 3d    if( pCtx->rc!=
afc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
afd0: 72 6e 20 70 43 74 78 2d 3e 72 63 3b 0a 20 20 69  rn pCtx->rc;.  i
afe0: 66 28 20 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d  f( nToken>FTS5_M
aff0: 41 58 5f 54 4f 4b 45 4e 5f 53 49 5a 45 20 29 20  AX_TOKEN_SIZE ) 
b000: 6e 54 6f 6b 65 6e 20 3d 20 46 54 53 35 5f 4d 41  nToken = FTS5_MA
b010: 58 5f 54 4f 4b 45 4e 5f 53 49 5a 45 3b 0a 0a 20  X_TOKEN_SIZE;.. 
b020: 20 69 66 28 20 70 50 68 72 61 73 65 20 26 26 20   if( pPhrase && 
b030: 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 30  pPhrase->nTerm>0
b040: 20 26 26 20 28 74 66 6c 61 67 73 20 26 20 46 54   && (tflags & FT
b050: 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54  S5_TOKEN_COLOCAT
b060: 45 44 29 20 29 7b 0a 20 20 20 20 46 74 73 35 45  ED) ){.    Fts5E
b070: 78 70 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0a 20  xprTerm *pSyn;. 
b080: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
b090: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54 65  izeof(Fts5ExprTe
b0a0: 72 6d 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  rm) + sizeof(Fts
b0b0: 35 42 75 66 66 65 72 29 20 2b 20 6e 54 6f 6b 65  5Buffer) + nToke
b0c0: 6e 2b 31 3b 0a 20 20 20 20 70 53 79 6e 20 3d 20  n+1;.    pSyn = 
b0d0: 28 46 74 73 35 45 78 70 72 54 65 72 6d 2a 29 73  (Fts5ExprTerm*)s
b0e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
b0f0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53  yte);.    if( pS
b100: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  yn==0 ){.      r
b110: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
b120: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b130: 20 20 20 6d 65 6d 73 65 74 28 70 53 79 6e 2c 20     memset(pSyn, 
b140: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
b150: 20 70 53 79 6e 2d 3e 7a 54 65 72 6d 20 3d 20 28   pSyn->zTerm = (
b160: 28 63 68 61 72 2a 29 70 53 79 6e 29 20 2b 20 73  (char*)pSyn) + s
b170: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54 65  izeof(Fts5ExprTe
b180: 72 6d 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  rm) + sizeof(Fts
b190: 35 42 75 66 66 65 72 29 3b 0a 20 20 20 20 20 20  5Buffer);.      
b1a0: 6d 65 6d 63 70 79 28 70 53 79 6e 2d 3e 7a 54 65  memcpy(pSyn->zTe
b1b0: 72 6d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  rm, pToken, nTok
b1c0: 65 6e 29 3b 0a 20 20 20 20 20 20 70 53 79 6e 2d  en);.      pSyn-
b1d0: 3e 70 53 79 6e 6f 6e 79 6d 20 3d 20 70 50 68 72  >pSynonym = pPhr
b1e0: 61 73 65 2d 3e 61 54 65 72 6d 5b 70 50 68 72 61  ase->aTerm[pPhra
b1f0: 73 65 2d 3e 6e 54 65 72 6d 2d 31 5d 2e 70 53 79  se->nTerm-1].pSy
b200: 6e 6f 6e 79 6d 3b 0a 20 20 20 20 20 20 70 50 68  nonym;.      pPh
b210: 72 61 73 65 2d 3e 61 54 65 72 6d 5b 70 50 68 72  rase->aTerm[pPhr
b220: 61 73 65 2d 3e 6e 54 65 72 6d 2d 31 5d 2e 70 53  ase->nTerm-1].pS
b230: 79 6e 6f 6e 79 6d 20 3d 20 70 53 79 6e 3b 0a 20  ynonym = pSyn;. 
b240: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
b250: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
b260: 70 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 70  pTerm;.    if( p
b270: 50 68 72 61 73 65 3d 3d 30 20 7c 7c 20 28 70 50  Phrase==0 || (pP
b280: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20 25 20 53  hrase->nTerm % S
b290: 5a 41 4c 4c 4f 43 29 3d 3d 30 20 29 7b 0a 20 20  ZALLOC)==0 ){.  
b2a0: 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
b2b0: 73 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  se *pNew;.      
b2c0: 69 6e 74 20 6e 4e 65 77 20 3d 20 53 5a 41 4c 4c  int nNew = SZALL
b2d0: 4f 43 20 2b 20 28 70 50 68 72 61 73 65 20 3f 20  OC + (pPhrase ? 
b2e0: 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20 3a  pPhrase->nTerm :
b2f0: 20 30 29 3b 0a 0a 20 20 20 20 20 20 70 4e 65 77   0);..      pNew
b300: 20 3d 20 28 46 74 73 35 45 78 70 72 50 68 72 61   = (Fts5ExprPhra
b310: 73 65 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  se*)sqlite3_real
b320: 6c 6f 63 28 70 50 68 72 61 73 65 2c 20 0a 20 20  loc(pPhrase, .  
b330: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46          sizeof(F
b340: 74 73 35 45 78 70 72 50 68 72 61 73 65 29 20 2b  ts5ExprPhrase) +
b350: 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
b360: 54 65 72 6d 29 20 2a 20 6e 4e 65 77 0a 20 20 20  Term) * nNew.   
b370: 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
b380: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
b390: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
b3a0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
b3b0: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e{.        if( p
b3c0: 50 68 72 61 73 65 3d 3d 30 20 29 20 6d 65 6d 73  Phrase==0 ) mems
b3d0: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
b3e0: 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73  of(Fts5ExprPhras
b3f0: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 74  e));.        pCt
b400: 78 2d 3e 70 50 68 72 61 73 65 20 3d 20 70 50 68  x->pPhrase = pPh
b410: 72 61 73 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rase = pNew;.   
b420: 20 20 20 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d       pNew->nTerm
b430: 20 3d 20 6e 4e 65 77 20 2d 20 53 5a 41 4c 4c 4f   = nNew - SZALLO
b440: 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  C;.      }.    }
b450: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
b460: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b470: 20 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73   pTerm = &pPhras
b480: 65 2d 3e 61 54 65 72 6d 5b 70 50 68 72 61 73 65  e->aTerm[pPhrase
b490: 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 20 20  ->nTerm++];.    
b4a0: 20 20 6d 65 6d 73 65 74 28 70 54 65 72 6d 2c 20    memset(pTerm, 
b4b0: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78  0, sizeof(Fts5Ex
b4c0: 70 72 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20  prTerm));.      
b4d0: 70 54 65 72 6d 2d 3e 7a 54 65 72 6d 20 3d 20 73  pTerm->zTerm = s
b4e0: 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75  qlite3Fts5Strndu
b4f0: 70 28 26 72 63 2c 20 70 54 6f 6b 65 6e 2c 20 6e  p(&rc, pToken, n
b500: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  Token);.    }.  
b510: 7d 0a 0a 20 20 70 43 74 78 2d 3e 72 63 20 3d 20  }..  pCtx->rc = 
b520: 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rc;.  return rc;
b530: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  .}.../*.** Free 
b540: 74 68 65 20 70 68 72 61 73 65 20 6f 62 6a 65 63  the phrase objec
b550: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
b560: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
b570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
b580: 73 35 50 61 72 73 65 50 68 72 61 73 65 46 72 65  s5ParsePhraseFre
b590: 65 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65  e(Fts5ExprPhrase
b5a0: 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 66 74   *pPhrase){.  ft
b5b0: 73 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65  s5ExprPhraseFree
b5c0: 28 70 50 68 72 61 73 65 29 3b 0a 7d 0a 0a 2f 2a  (pPhrase);.}../*
b5d0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 68 72  .** Free the phr
b5e0: 61 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ase object passe
b5f0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
b600: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
b610: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72  d sqlite3Fts5Par
b620: 73 65 4e 65 61 72 73 65 74 46 72 65 65 28 46 74  seNearsetFree(Ft
b630: 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70  s5ExprNearset *p
b640: 4e 65 61 72 29 7b 0a 20 20 69 66 28 20 70 4e 65  Near){.  if( pNe
b650: 61 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ar ){.    int i;
b660: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b670: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20  pNear->nPhrase; 
b680: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
b690: 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28 70  ExprPhraseFree(p
b6a0: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69  Near->apPhrase[i
b6b0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ]);.    }.    sq
b6c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 61 72  lite3_free(pNear
b6d0: 2d 3e 70 43 6f 6c 73 65 74 29 3b 0a 20 20 20 20  ->pColset);.    
b6e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
b6f0: 61 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64  ar);.  }.}..void
b700: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
b710: 65 46 69 6e 69 73 68 65 64 28 46 74 73 35 50 61  eFinished(Fts5Pa
b720: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73  rse *pParse, Fts
b730: 35 45 78 70 72 4e 6f 64 65 20 2a 70 29 7b 0a 20  5ExprNode *p){. 
b740: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
b750: 3e 70 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 70  >pExpr==0 );.  p
b760: 50 61 72 73 65 2d 3e 70 45 78 70 72 20 3d 20 70  Parse->pExpr = p
b770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b780: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
b790: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
b7a0: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 74   to process a st
b7b0: 72 69 6e 67 20 74 6f 6b 65 6e 2e 20 54 68 65 0a  ring token. The.
b7c0: 2a 2a 20 73 74 72 69 6e 67 20 6d 61 79 20 6f 72  ** string may or
b7d0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 6f 74   may not be quot
b7e0: 65 64 2e 20 49 6e 20 61 6e 79 20 63 61 73 65 20  ed. In any case 
b7f0: 69 74 20 69 73 20 74 6f 6b 65 6e 69 7a 65 64 20  it is tokenized 
b800: 61 6e 64 20 61 0a 2a 2a 20 70 68 72 61 73 65 20  and a.** phrase 
b810: 6f 62 6a 65 63 74 20 63 6f 6e 73 69 73 74 69 6e  object consistin
b820: 67 20 6f 66 20 61 6c 6c 20 74 6f 6b 65 6e 73 20  g of all tokens 
b830: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 46 74 73  returned..*/.Fts
b840: 35 45 78 70 72 50 68 72 61 73 65 20 2a 73 71 6c  5ExprPhrase *sql
b850: 69 74 65 33 46 74 73 35 50 61 72 73 65 54 65 72  ite3Fts5ParseTer
b860: 6d 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a  m(.  Fts5Parse *
b870: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
b880: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
b890: 6e 74 65 78 74 20 2a 2f 0a 20 20 46 74 73 35 45  ntext */.  Fts5E
b8a0: 78 70 72 50 68 72 61 73 65 20 2a 70 41 70 70 65  xprPhrase *pAppe
b8b0: 6e 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 68  nd,        /* Ph
b8c0: 72 61 73 65 20 74 6f 20 61 70 70 65 6e 64 20 74  rase to append t
b8d0: 6f 20 2a 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e  o */.  Fts5Token
b8e0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20   *pToken,       
b8f0: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
b900: 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a   to tokenize */.
b910: 20 20 69 6e 74 20 62 50 72 65 66 69 78 20 20 20    int bPrefix   
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
b940: 72 65 20 69 73 20 61 20 74 72 61 69 6c 69 6e 67  re is a trailing
b950: 20 22 2a 22 20 2a 2f 0a 29 7b 0a 20 20 46 74 73   "*" */.){.  Fts
b960: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
b970: 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66   = pParse->pConf
b980: 69 67 3b 0a 20 20 54 6f 6b 65 6e 43 74 78 20 73  ig;.  TokenCtx s
b990: 43 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ctx;            
b9a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
b9b0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 74   object passed t
b9c0: 6f 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  o callback */.  
b9d0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 2f 2a 20 54 6f 6b 65 6e 69 7a 65 20 72 65 74 75  /* Tokenize retu
ba00: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
ba10: 72 20 2a 7a 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d  r *z = 0;..  mem
ba20: 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69  set(&sCtx, 0, si
ba30: 7a 65 6f 66 28 54 6f 6b 65 6e 43 74 78 29 29 3b  zeof(TokenCtx));
ba40: 0a 20 20 73 43 74 78 2e 70 50 68 72 61 73 65 20  .  sCtx.pPhrase 
ba50: 3d 20 70 41 70 70 65 6e 64 3b 0a 0a 20 20 72 63  = pAppend;..  rc
ba60: 20 3d 20 66 74 73 35 50 61 72 73 65 53 74 72 69   = fts5ParseStri
ba70: 6e 67 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  ngFromToken(pTok
ba80: 65 6e 2c 20 26 7a 29 3b 0a 20 20 69 66 28 20 72  en, &z);.  if( r
ba90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
baa0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
bab0: 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 51 55  FTS5_TOKENIZE_QU
bac0: 45 52 59 20 7c 20 28 62 50 72 65 66 69 78 20 3f  ERY | (bPrefix ?
bad0: 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 50   FTS5_TOKENIZE_P
bae0: 52 45 46 49 58 20 3a 20 30 29 3b 0a 20 20 20 20  REFIX : 0);.    
baf0: 69 6e 74 20 6e 3b 0a 20 20 20 20 73 71 6c 69 74  int n;.    sqlit
bb00: 65 33 46 74 73 35 44 65 71 75 6f 74 65 28 7a 29  e3Fts5Dequote(z)
bb10: 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 73  ;.    n = (int)s
bb20: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 72 63  trlen(z);.    rc
bb30: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f   = sqlite3Fts5To
bb40: 6b 65 6e 69 7a 65 28 70 43 6f 6e 66 69 67 2c 20  kenize(pConfig, 
bb50: 66 6c 61 67 73 2c 20 7a 2c 20 6e 2c 20 26 73 43  flags, z, n, &sC
bb60: 74 78 2c 20 66 74 73 35 50 61 72 73 65 54 6f 6b  tx, fts5ParseTok
bb70: 65 6e 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71  enize);.  }.  sq
bb80: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
bb90: 20 69 66 28 20 72 63 20 7c 7c 20 28 72 63 20 3d   if( rc || (rc =
bba0: 20 73 43 74 78 2e 72 63 29 20 29 7b 0a 20 20 20   sCtx.rc) ){.   
bbb0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
bbc0: 3b 0a 20 20 20 20 66 74 73 35 45 78 70 72 50 68  ;.    fts5ExprPh
bbd0: 72 61 73 65 46 72 65 65 28 73 43 74 78 2e 70 50  raseFree(sCtx.pP
bbe0: 68 72 61 73 65 29 3b 0a 20 20 20 20 73 43 74 78  hrase);.    sCtx
bbf0: 2e 70 50 68 72 61 73 65 20 3d 20 30 3b 0a 20 20  .pPhrase = 0;.  
bc00: 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 69 66 28 20  }else{..    if( 
bc10: 70 41 70 70 65 6e 64 3d 3d 30 20 29 7b 0a 20 20  pAppend==0 ){.  
bc20: 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d      if( (pParse-
bc30: 3e 6e 50 68 72 61 73 65 20 25 20 38 29 3d 3d 30  >nPhrase % 8)==0
bc40: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
bc50: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
bc60: 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 20  ts5ExprPhrase*) 
bc70: 2a 20 28 70 50 61 72 73 65 2d 3e 6e 50 68 72 61  * (pParse->nPhra
bc80: 73 65 20 2b 20 38 29 3b 0a 20 20 20 20 20 20 20  se + 8);.       
bc90: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
bca0: 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 20  **apNew;.       
bcb0: 20 61 70 4e 65 77 20 3d 20 28 46 74 73 35 45 78   apNew = (Fts5Ex
bcc0: 70 72 50 68 72 61 73 65 2a 2a 29 73 71 6c 69 74  prPhrase**)sqlit
bcd0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 50 61 72 73  e3_realloc(pPars
bce0: 65 2d 3e 61 70 50 68 72 61 73 65 2c 20 6e 42 79  e->apPhrase, nBy
bcf0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
bd00: 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20   apNew==0 ){.   
bd10: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
bd20: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
bd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
bd40: 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28 73  ExprPhraseFree(s
bd50: 43 74 78 2e 70 50 68 72 61 73 65 29 3b 0a 20 20  Ctx.pPhrase);.  
bd60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
bd70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bd80: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 50 68      pParse->apPh
bd90: 72 61 73 65 20 3d 20 61 70 4e 65 77 3b 0a 20 20  rase = apNew;.  
bda0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72      }.      pPar
bdb0: 73 65 2d 3e 6e 50 68 72 61 73 65 2b 2b 3b 0a 20  se->nPhrase++;. 
bdc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 43     }..    if( sC
bdd0: 74 78 2e 70 50 68 72 61 73 65 3d 3d 30 20 29 7b  tx.pPhrase==0 ){
bde0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68  .      /* This h
bdf0: 61 70 70 65 6e 73 20 77 68 65 6e 20 70 61 72 73  appens when pars
be00: 69 6e 67 20 61 20 74 6f 6b 65 6e 20 6f 72 20 71  ing a token or q
be10: 75 6f 74 65 64 20 70 68 72 61 73 65 20 74 68 61  uoted phrase tha
be20: 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
be30: 20 2a 2a 20 6e 6f 20 74 6f 6b 65 6e 20 63 68 61   ** no token cha
be40: 72 61 63 74 65 72 73 20 61 74 20 61 6c 6c 2e 20  racters at all. 
be50: 28 65 2e 67 20 2e 2e 2e 20 4d 41 54 43 48 20 27  (e.g ... MATCH '
be60: 22 22 27 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ""'). */.      s
be70: 43 74 78 2e 70 50 68 72 61 73 65 20 3d 20 73 71  Ctx.pPhrase = sq
be80: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
be90: 65 72 6f 28 26 70 50 61 72 73 65 2d 3e 72 63 2c  ero(&pParse->rc,
bea0: 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
beb0: 50 68 72 61 73 65 29 29 3b 0a 20 20 20 20 7d 65  Phrase));.    }e
bec0: 6c 73 65 20 69 66 28 20 73 43 74 78 2e 70 50 68  lse if( sCtx.pPh
bed0: 72 61 73 65 2d 3e 6e 54 65 72 6d 20 29 7b 0a 20  rase->nTerm ){. 
bee0: 20 20 20 20 20 73 43 74 78 2e 70 50 68 72 61 73       sCtx.pPhras
bef0: 65 2d 3e 61 54 65 72 6d 5b 73 43 74 78 2e 70 50  e->aTerm[sCtx.pP
bf00: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 2d 31 5d 2e  hrase->nTerm-1].
bf10: 62 50 72 65 66 69 78 20 3d 20 28 75 38 29 62 50  bPrefix = (u8)bP
bf20: 72 65 66 69 78 3b 0a 20 20 20 20 7d 0a 20 20 20  refix;.    }.   
bf30: 20 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73   pParse->apPhras
bf40: 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73  e[pParse->nPhras
bf50: 65 2d 31 5d 20 3d 20 73 43 74 78 2e 70 50 68 72  e-1] = sCtx.pPhr
bf60: 61 73 65 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ase;.  }..  retu
bf70: 72 6e 20 73 43 74 78 2e 70 50 68 72 61 73 65 3b  rn sCtx.pPhrase;
bf80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
bf90: 20 61 20 6e 65 77 20 46 54 53 35 20 65 78 70 72   a new FTS5 expr
bfa0: 65 73 73 69 6f 6e 20 62 79 20 63 6c 6f 6e 69 6e  ession by clonin
bfb0: 67 20 70 68 72 61 73 65 20 69 50 68 72 61 73 65  g phrase iPhrase
bfc0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
bfd0: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
bfe0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
bff0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
c000: 74 65 33 46 74 73 35 45 78 70 72 43 6c 6f 6e 65  te3Fts5ExprClone
c010: 50 68 72 61 73 65 28 0a 20 20 46 74 73 35 45 78  Phrase(.  Fts5Ex
c020: 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e  pr *pExpr, .  in
c030: 74 20 69 50 68 72 61 73 65 2c 20 0a 20 20 46 74  t iPhrase, .  Ft
c040: 73 35 45 78 70 72 20 2a 2a 70 70 4e 65 77 0a 29  s5Expr **ppNew.)
c050: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c060: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
c070: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
c080: 64 65 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  de */.  Fts5Expr
c090: 50 68 72 61 73 65 20 2a 70 4f 72 69 67 3b 20 20  Phrase *pOrig;  
c0a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
c0b0: 68 72 61 73 65 20 65 78 74 72 61 63 74 65 64 20  hrase extracted 
c0c0: 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20  from pExpr */.  
c0d0: 46 74 73 35 45 78 70 72 20 2a 70 4e 65 77 20 3d  Fts5Expr *pNew =
c0e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c0f0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
c100: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 70 4e   return via *ppN
c110: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 43 74 78  ew */.  TokenCtx
c120: 20 73 43 74 78 20 3d 20 7b 30 2c 30 7d 3b 20 20   sCtx = {0,0};  
c130: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
c140: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 66 74  xt object for ft
c150: 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65 20  s5ParseTokenize 
c160: 2a 2f 0a 0a 20 20 70 4f 72 69 67 20 3d 20 70 45  */..  pOrig = pE
c170: 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73  xpr->apExprPhras
c180: 65 5b 69 50 68 72 61 73 65 5d 3b 0a 20 20 70 4e  e[iPhrase];.  pN
c190: 65 77 20 3d 20 28 46 74 73 35 45 78 70 72 2a 29  ew = (Fts5Expr*)
c1a0: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
c1b0: 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f  cZero(&rc, sizeo
c1c0: 66 28 46 74 73 35 45 78 70 72 29 29 3b 0a 20 20  f(Fts5Expr));.  
c1d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c1e0: 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  K ){.    pNew->a
c1f0: 70 45 78 70 72 50 68 72 61 73 65 20 3d 20 28 46  pExprPhrase = (F
c200: 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 2a 29  ts5ExprPhrase**)
c210: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
c220: 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20 20 20  cZero(&rc, .    
c230: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 45      sizeof(Fts5E
c240: 78 70 72 50 68 72 61 73 65 2a 29 29 3b 0a 20 20  xprPhrase*));.  
c250: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
c260: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65  TE_OK ){.    pNe
c270: 77 2d 3e 70 52 6f 6f 74 20 3d 20 28 46 74 73 35  w->pRoot = (Fts5
c280: 45 78 70 72 4e 6f 64 65 2a 29 73 71 6c 69 74 65  ExprNode*)sqlite
c290: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
c2a0: 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20 73 69  &rc, .        si
c2b0: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e 6f 64  zeof(Fts5ExprNod
c2c0: 65 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  e));.  }.  if( r
c2d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c2e0: 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d      pNew->pRoot-
c2f0: 3e 70 4e 65 61 72 20 3d 20 28 46 74 73 35 45 78  >pNear = (Fts5Ex
c300: 70 72 4e 65 61 72 73 65 74 2a 29 73 71 6c 69 74  prNearset*)sqlit
c310: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
c320: 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20 73  (&rc, .        s
c330: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e 65  izeof(Fts5ExprNe
c340: 61 72 73 65 74 29 20 2b 20 73 69 7a 65 6f 66 28  arset) + sizeof(
c350: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29  Fts5ExprPhrase*)
c360: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
c370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c380: 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
c390: 6f 6c 73 65 74 4f 72 69 67 20 3d 20 70 4f 72 69  olsetOrig = pOri
c3a0: 67 2d 3e 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d  g->pNode->pNear-
c3b0: 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 69 66  >pColset;.    if
c3c0: 28 20 70 43 6f 6c 73 65 74 4f 72 69 67 20 29 7b  ( pColsetOrig ){
c3d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
c3e0: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f   = sizeof(Fts5Co
c3f0: 6c 73 65 74 29 20 2b 20 28 70 43 6f 6c 73 65 74  lset) + (pColset
c400: 4f 72 69 67 2d 3e 6e 43 6f 6c 2d 31 29 20 2a 20  Orig->nCol-1) * 
c410: 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 20  sizeof(int);.   
c420: 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70     Fts5Colset *p
c430: 43 6f 6c 73 65 74 20 3d 20 28 46 74 73 35 43 6f  Colset = (Fts5Co
c440: 6c 73 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73  lset*)sqlite3Fts
c450: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
c460: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
c470: 66 28 20 70 43 6f 6c 73 65 74 20 29 7b 20 0a 20  f( pColset ){ . 
c480: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43         memcpy(pC
c490: 6f 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74 4f 72  olset, pColsetOr
c4a0: 69 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  ig, nByte);.    
c4b0: 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
c4c0: 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 2d 3e 70 43  pRoot->pNear->pC
c4d0: 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b  olset = pColset;
c4e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
c4f0: 28 20 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 20 29  ( pOrig->nTerm )
c500: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
c530: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
c540: 20 70 68 72 61 73 65 20 74 65 72 6d 73 20 2a 2f   phrase terms */
c550: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
c560: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
c570: 3c 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 3b 20 69  <pOrig->nTerm; i
c580: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ++){.      int t
c590: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20  flags = 0;.     
c5a0: 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
c5b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70  ;.      for(p=&p
c5c0: 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 69 5d 3b 20  Orig->aTerm[i]; 
c5d0: 70 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  p && rc==SQLITE_
c5e0: 4f 4b 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79  OK; p=p->pSynony
c5f0: 6d 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  m){.        cons
c600: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20  t char *zTerm = 
c610: 70 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20  p->zTerm;.      
c620: 20 20 72 63 20 3d 20 66 74 73 35 50 61 72 73 65    rc = fts5Parse
c630: 54 6f 6b 65 6e 69 7a 65 28 28 76 6f 69 64 2a 29  Tokenize((void*)
c640: 26 73 43 74 78 2c 20 74 66 6c 61 67 73 2c 20 7a  &sCtx, tflags, z
c650: 54 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65  Term, (int)strle
c660: 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20 20 20 20  n(zTerm),.      
c670: 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 20        0, 0);.   
c680: 20 20 20 20 20 74 66 6c 61 67 73 20 3d 20 46 54       tflags = FT
c690: 53 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54  S5_TOKEN_COLOCAT
c6a0: 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
c6b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c6c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
c6d0: 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 61 54 65  Ctx.pPhrase->aTe
c6e0: 72 6d 5b 69 5d 2e 62 50 72 65 66 69 78 20 3d 20  rm[i].bPrefix = 
c6f0: 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 69 5d 2e  pOrig->aTerm[i].
c700: 62 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20  bPrefix;.       
c710: 20 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 61   sCtx.pPhrase->a
c720: 54 65 72 6d 5b 69 5d 2e 62 46 69 72 73 74 20 3d  Term[i].bFirst =
c730: 20 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 69 5d   pOrig->aTerm[i]
c740: 2e 62 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d  .bFirst;.      }
c750: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
c760: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
c770: 65 6e 73 20 77 68 65 6e 20 70 61 72 73 69 6e 67  ens when parsing
c780: 20 61 20 74 6f 6b 65 6e 20 6f 72 20 71 75 6f 74   a token or quot
c790: 65 64 20 70 68 72 61 73 65 20 74 68 61 74 20 63  ed phrase that c
c7a0: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6e  ontains.    ** n
c7b0: 6f 20 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65  o token characte
c7c0: 72 73 20 61 74 20 61 6c 6c 2e 20 28 65 2e 67 20  rs at all. (e.g 
c7d0: 2e 2e 2e 20 4d 41 54 43 48 20 27 22 22 27 29 2e  ... MATCH '""').
c7e0: 20 2a 2f 0a 20 20 20 20 73 43 74 78 2e 70 50 68   */.    sCtx.pPh
c7f0: 72 61 73 65 20 3d 20 73 71 6c 69 74 65 33 46 74  rase = sqlite3Ft
c800: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
c810: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  , sizeof(Fts5Exp
c820: 72 50 68 72 61 73 65 29 29 3b 0a 20 20 7d 0a 0a  rPhrase));.  }..
c830: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c840: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  _OK ){.    /* Al
c850: 6c 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  l the allocation
c860: 73 20 73 75 63 63 65 65 64 65 64 2e 20 50 75 74  s succeeded. Put
c870: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c880: 6f 62 6a 65 63 74 20 74 6f 67 65 74 68 65 72 2e  object together.
c890: 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49   */.    pNew->pI
c8a0: 6e 64 65 78 20 3d 20 70 45 78 70 72 2d 3e 70 49  ndex = pExpr->pI
c8b0: 6e 64 65 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ndex;.    pNew->
c8c0: 70 43 6f 6e 66 69 67 20 3d 20 70 45 78 70 72 2d  pConfig = pExpr-
c8d0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 4e  >pConfig;.    pN
c8e0: 65 77 2d 3e 6e 50 68 72 61 73 65 20 3d 20 31 3b  ew->nPhrase = 1;
c8f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 70 45 78 70  .    pNew->apExp
c900: 72 50 68 72 61 73 65 5b 30 5d 20 3d 20 73 43 74  rPhrase[0] = sCt
c910: 78 2e 70 50 68 72 61 73 65 3b 0a 20 20 20 20 70  x.pPhrase;.    p
c920: 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61  New->pRoot->pNea
c930: 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 20 3d  r->apPhrase[0] =
c940: 20 73 43 74 78 2e 70 50 68 72 61 73 65 3b 0a 20   sCtx.pPhrase;. 
c950: 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e     pNew->pRoot->
c960: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20 3d  pNear->nPhrase =
c970: 20 31 3b 0a 20 20 20 20 73 43 74 78 2e 70 50 68   1;.    sCtx.pPh
c980: 72 61 73 65 2d 3e 70 4e 6f 64 65 20 3d 20 70 4e  rase->pNode = pN
c990: 65 77 2d 3e 70 52 6f 6f 74 3b 0a 0a 20 20 20 20  ew->pRoot;..    
c9a0: 69 66 28 20 70 4f 72 69 67 2d 3e 6e 54 65 72 6d  if( pOrig->nTerm
c9b0: 3d 3d 31 20 0a 20 20 20 20 20 26 26 20 70 4f 72  ==1 .     && pOr
c9c0: 69 67 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79  ig->aTerm[0].pSy
c9d0: 6e 6f 6e 79 6d 3d 3d 30 20 0a 20 20 20 20 20 26  nonym==0 .     &
c9e0: 26 20 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 30  & pOrig->aTerm[0
c9f0: 5d 2e 62 46 69 72 73 74 3d 3d 30 20 0a 20 20 20  ].bFirst==0 .   
ca00: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
ca10: 70 52 6f 6f 74 2d 3e 65 54 79 70 65 20 3d 20 46  pRoot->eType = F
ca20: 54 53 35 5f 54 45 52 4d 3b 0a 20 20 20 20 20 20  TS5_TERM;.      
ca30: 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 78 4e 65  pNew->pRoot->xNe
ca40: 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  xt = fts5ExprNod
ca50: 65 4e 65 78 74 5f 54 45 52 4d 3b 0a 20 20 20 20  eNext_TERM;.    
ca60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
ca70: 77 2d 3e 70 52 6f 6f 74 2d 3e 65 54 79 70 65 20  w->pRoot->eType 
ca80: 3d 20 46 54 53 35 5f 53 54 52 49 4e 47 3b 0a 20  = FTS5_STRING;. 
ca90: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74       pNew->pRoot
caa0: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78  ->xNext = fts5Ex
cab0: 70 72 4e 6f 64 65 4e 65 78 74 5f 53 54 52 49 4e  prNodeNext_STRIN
cac0: 47 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  G;.    }.  }else
cad0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
cae0: 35 45 78 70 72 46 72 65 65 28 70 4e 65 77 29 3b  5ExprFree(pNew);
caf0: 0a 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72  .    fts5ExprPhr
cb00: 61 73 65 46 72 65 65 28 73 43 74 78 2e 70 50 68  aseFree(sCtx.pPh
cb10: 72 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  rase);.    pNew 
cb20: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4e  = 0;.  }..  *ppN
cb30: 65 77 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74  ew = pNew;.  ret
cb40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
cb50: 2a 20 54 6f 6b 65 6e 20 70 54 6f 6b 20 68 61 73  * Token pTok has
cb60: 20 61 70 70 65 61 72 65 64 20 69 6e 20 61 20 4d   appeared in a M
cb70: 41 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 20  ATCH expression 
cb80: 77 68 65 72 65 20 74 68 65 20 4e 45 41 52 20 6f  where the NEAR o
cb90: 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 65 78  perator.** is ex
cba0: 70 65 63 74 65 64 2e 20 49 66 20 74 6f 6b 65 6e  pected. If token
cbb0: 20 70 54 6f 6b 20 64 6f 65 73 20 6e 6f 74 20 63   pTok does not c
cbc0: 6f 6e 74 61 69 6e 20 22 4e 45 41 52 22 2c 20 73  ontain "NEAR", s
cbd0: 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  tore an error.**
cbe0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 6f   in the pParse o
cbf0: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
cc00: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
cc10: 65 61 72 28 46 74 73 35 50 61 72 73 65 20 2a 70  ear(Fts5Parse *p
cc20: 50 61 72 73 65 2c 20 46 74 73 35 54 6f 6b 65 6e  Parse, Fts5Token
cc30: 20 2a 70 54 6f 6b 29 7b 0a 20 20 69 66 28 20 70   *pTok){.  if( p
cc40: 54 6f 6b 2d 3e 6e 21 3d 34 20 7c 7c 20 6d 65 6d  Tok->n!=4 || mem
cc50: 63 6d 70 28 22 4e 45 41 52 22 2c 20 70 54 6f 6b  cmp("NEAR", pTok
cc60: 2d 3e 70 2c 20 34 29 20 29 7b 0a 20 20 20 20 73  ->p, 4) ){.    s
cc70: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 45  qlite3Fts5ParseE
cc80: 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 70 50  rror(.        pP
cc90: 61 72 73 65 2c 20 22 66 74 73 35 3a 20 73 79 6e  arse, "fts5: syn
cca0: 74 61 78 20 65 72 72 6f 72 20 6e 65 61 72 20 5c  tax error near \
ccb0: 22 25 2e 2a 73 5c 22 22 2c 20 70 54 6f 6b 2d 3e  "%.*s\"", pTok->
ccc0: 6e 2c 20 70 54 6f 6b 2d 3e 70 0a 20 20 20 20 29  n, pTok->p.    )
ccd0: 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 73 71  ;.  }.}..void sq
cce0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65  lite3Fts5ParseSe
ccf0: 74 44 69 73 74 61 6e 63 65 28 0a 20 20 46 74 73  tDistance(.  Fts
cd00: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
cd10: 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  .  Fts5ExprNears
cd20: 65 74 20 2a 70 4e 65 61 72 2c 0a 20 20 46 74 73  et *pNear,.  Fts
cd30: 35 54 6f 6b 65 6e 20 2a 70 0a 29 7b 0a 20 20 69  5Token *p.){.  i
cd40: 66 28 20 70 4e 65 61 72 20 29 7b 0a 20 20 20 20  f( pNear ){.    
cd50: 69 6e 74 20 6e 4e 65 61 72 20 3d 20 30 3b 0a 20  int nNear = 0;. 
cd60: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
cd70: 28 20 70 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  ( p->n ){.      
cd80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 3b  for(i=0; i<p->n;
cd90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
cda0: 68 61 72 20 63 20 3d 20 28 63 68 61 72 29 70 2d  har c = (char)p-
cdb0: 3e 70 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >p[i];.        i
cdc0: 66 28 20 63 3c 27 30 27 20 7c 7c 20 63 3e 27 39  f( c<'0' || c>'9
cdd0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
cde0: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 45  qlite3Fts5ParseE
cdf0: 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20  rror(.          
ce00: 20 20 20 20 70 50 61 72 73 65 2c 20 22 65 78 70      pParse, "exp
ce10: 65 63 74 65 64 20 69 6e 74 65 67 65 72 2c 20 67  ected integer, g
ce20: 6f 74 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 70 2d  ot \"%.*s\"", p-
ce30: 3e 6e 2c 20 70 2d 3e 70 0a 20 20 20 20 20 20 20  >n, p->p.       
ce40: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
ce50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
ce60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4e      }.        nN
ce70: 65 61 72 20 3d 20 6e 4e 65 61 72 20 2a 20 31 30  ear = nNear * 10
ce80: 20 2b 20 28 70 2d 3e 70 5b 69 5d 20 2d 20 27 30   + (p->p[i] - '0
ce90: 27 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ');.      }.    
cea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4e 65  }else{.      nNe
ceb0: 61 72 20 3d 20 46 54 53 35 5f 44 45 46 41 55 4c  ar = FTS5_DEFAUL
cec0: 54 5f 4e 45 41 52 44 49 53 54 3b 0a 20 20 20 20  T_NEARDIST;.    
ced0: 7d 0a 20 20 20 20 70 4e 65 61 72 2d 3e 6e 4e 65  }.    pNear->nNe
cee0: 61 72 20 3d 20 6e 4e 65 61 72 3b 0a 20 20 7d 0a  ar = nNear;.  }.
cef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
cf00: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73  ond argument pas
cf10: 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
cf20: 74 69 6f 6e 20 6d 61 79 20 62 65 20 4e 55 4c 4c  tion may be NULL
cf30: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 0a 2a  , or it may be.*
cf40: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 46 74  * an existing Ft
cf50: 73 35 43 6f 6c 73 65 74 20 6f 62 6a 65 63 74 2e  s5Colset object.
cf60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
cf70: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
cf80: 20 74 6f 0a 2a 2a 20 61 20 6e 65 77 20 63 6f 6c   to.** a new col
cf90: 73 65 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  set object conta
cfa0: 69 6e 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ining the conten
cfb0: 74 73 20 6f 66 20 28 70 29 20 77 69 74 68 20 6e  ts of (p) with n
cfc0: 65 77 20 76 61 6c 75 65 20 63 6f 6c 75 6d 6e 0a  ew value column.
cfd0: 2a 2a 20 6e 75 6d 62 65 72 20 69 43 6f 6c 20 61  ** number iCol a
cfe0: 70 70 65 6e 64 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ppended. .**.** 
cff0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
d000: 6f 63 63 75 72 73 2c 20 73 74 6f 72 65 20 61 6e  occurs, store an
d010: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 70   error code in p
d020: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
d030: 20 4e 55 4c 4c 2e 0a 2a 2a 20 54 68 65 20 6f 6c   NULL..** The ol
d040: 64 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20  d colset object 
d050: 28 69 66 20 61 6e 79 29 20 69 73 20 6e 6f 74 20  (if any) is not 
d060: 66 72 65 65 64 20 69 6e 20 74 68 69 73 20 63 61  freed in this ca
d070: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  se..*/.static Ft
d080: 73 35 43 6f 6c 73 65 74 20 2a 66 74 73 35 50 61  s5Colset *fts5Pa
d090: 72 73 65 43 6f 6c 73 65 74 28 0a 20 20 46 74 73  rseColset(.  Fts
d0a0: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0c0: 53 74 6f 72 65 20 53 51 4c 49 54 45 5f 4e 4f 4d  Store SQLITE_NOM
d0d0: 45 4d 20 68 65 72 65 20 69 66 20 72 65 71 75 69  EM here if requi
d0e0: 72 65 64 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  red */.  Fts5Col
d0f0: 73 65 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  set *p,         
d100: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
d110: 74 69 6e 67 20 63 6f 6c 73 65 74 20 6f 62 6a 65  ting colset obje
d120: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ct */.  int iCol
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
d150: 6f 6c 75 6d 6e 20 74 6f 20 61 64 64 20 74 6f 20  olumn to add to 
d160: 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 2a 2f  colset object */
d170: 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  .){.  int nCol =
d180: 20 70 20 3f 20 70 2d 3e 6e 43 6f 6c 20 3a 20 30   p ? p->nCol : 0
d190: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 63 6f  ;     /* Num. co
d1a0: 6c 75 6d 6e 73 20 61 6c 72 65 61 64 79 20 69 6e  lumns already in
d1b0: 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 2a   colset object *
d1c0: 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
d1d0: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
d1e0: 20 20 20 20 2f 2a 20 4e 65 77 20 63 6f 6c 73 65      /* New colse
d1f0: 74 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75  t object to retu
d200: 72 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rn */..  assert(
d210: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
d220: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
d230: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  rt( iCol>=0 && i
d240: 43 6f 6c 3c 70 50 61 72 73 65 2d 3e 70 43 6f 6e  Col<pParse->pCon
d250: 66 69 67 2d 3e 6e 43 6f 6c 20 29 3b 0a 0a 20 20  fig->nCol );..  
d260: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
d270: 65 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  ealloc(p, sizeof
d280: 28 46 74 73 35 43 6f 6c 73 65 74 29 20 2b 20 73  (Fts5Colset) + s
d290: 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 29  izeof(int)*nCol)
d2a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
d2b0: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  ){.    pParse->r
d2c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
d2d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
d2e0: 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 70 4e 65 77  nt *aiCol = pNew
d2f0: 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  ->aiCol;.    int
d300: 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69   i, j;.    for(i
d310: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
d320: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 69 43 6f  {.      if( aiCo
d330: 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74  l[i]==iCol ) ret
d340: 75 72 6e 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  urn pNew;.      
d350: 69 66 28 20 61 69 43 6f 6c 5b 69 5d 3e 69 43 6f  if( aiCol[i]>iCo
d360: 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  l ) break;.    }
d370: 0a 20 20 20 20 66 6f 72 28 6a 3d 6e 43 6f 6c 3b  .    for(j=nCol;
d380: 20 6a 3e 69 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20   j>i; j--){.    
d390: 20 20 61 69 43 6f 6c 5b 6a 5d 20 3d 20 61 69 43    aiCol[j] = aiC
d3a0: 6f 6c 5b 6a 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  ol[j-1];.    }. 
d3b0: 20 20 20 61 69 43 6f 6c 5b 69 5d 20 3d 20 69 43     aiCol[i] = iC
d3c0: 6f 6c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43  ol;.    pNew->nC
d3d0: 6f 6c 20 3d 20 6e 43 6f 6c 2b 31 3b 0a 0a 23 69  ol = nCol+1;..#i
d3e0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
d3f0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
d400: 68 65 20 61 72 72 61 79 20 69 73 20 69 6e 20 6f  he array is in o
d410: 72 64 65 72 20 61 6e 64 20 63 6f 6e 74 61 69 6e  rder and contain
d420: 73 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 65  s no duplicate e
d430: 6e 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 66  ntries. */.    f
d440: 6f 72 28 69 3d 31 3b 20 69 3c 70 4e 65 77 2d 3e  or(i=1; i<pNew->
d450: 6e 43 6f 6c 3b 20 69 2b 2b 29 20 61 73 73 65 72  nCol; i++) asser
d460: 74 28 20 70 4e 65 77 2d 3e 61 69 43 6f 6c 5b 69  t( pNew->aiCol[i
d470: 5d 3e 70 4e 65 77 2d 3e 61 69 43 6f 6c 5b 69 2d  ]>pNew->aiCol[i-
d480: 31 5d 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1] );.#endif.  }
d490: 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ..  return pNew;
d4a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
d4b0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  te and return an
d4c0: 20 46 74 73 35 43 6f 6c 73 65 74 20 6f 62 6a 65   Fts5Colset obje
d4d0: 63 74 20 73 70 65 63 69 66 79 69 6e 67 20 74 68  ct specifying th
d4e0: 65 20 69 6e 76 65 72 73 65 20 6f 66 0a 2a 2a 20  e inverse of.** 
d4f0: 74 68 65 20 63 6f 6c 73 65 74 20 70 61 73 73 65  the colset passe
d500: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
d510: 61 72 67 75 6d 65 6e 74 2e 20 46 72 65 65 20 74  argument. Free t
d520: 68 65 20 63 6f 6c 73 65 74 20 70 61 73 73 65 64  he colset passed
d530: 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
d540: 64 20 61 72 67 75 6d 65 6e 74 20 62 65 66 6f 72  d argument befor
d550: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
d560: 46 74 73 35 43 6f 6c 73 65 74 20 2a 73 71 6c 69  Fts5Colset *sqli
d570: 74 65 33 46 74 73 35 50 61 72 73 65 43 6f 6c 73  te3Fts5ParseCols
d580: 65 74 49 6e 76 65 72 74 28 46 74 73 35 50 61 72  etInvert(Fts5Par
d590: 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35  se *pParse, Fts5
d5a0: 43 6f 6c 73 65 74 20 2a 70 29 7b 0a 20 20 46 74  Colset *p){.  Ft
d5b0: 73 35 43 6f 6c 73 65 74 20 2a 70 52 65 74 3b 0a  s5Colset *pRet;.
d5c0: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 50 61    int nCol = pPa
d5d0: 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43  rse->pConfig->nC
d5e0: 6f 6c 3b 0a 0a 20 20 70 52 65 74 20 3d 20 28 46  ol;..  pRet = (F
d5f0: 74 73 35 43 6f 6c 73 65 74 2a 29 73 71 6c 69 74  ts5Colset*)sqlit
d600: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
d610: 28 26 70 50 61 72 73 65 2d 3e 72 63 2c 20 0a 20  (&pParse->rc, . 
d620: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
d630: 43 6f 6c 73 65 74 29 20 2b 20 73 69 7a 65 6f 66  Colset) + sizeof
d640: 28 69 6e 74 29 2a 6e 43 6f 6c 0a 20 20 29 3b 0a  (int)*nCol.  );.
d650: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
d660: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
d670: 20 69 4f 6c 64 20 3d 20 30 3b 0a 20 20 20 20 66   iOld = 0;.    f
d680: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
d690: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
d6a0: 69 4f 6c 64 3e 3d 70 2d 3e 6e 43 6f 6c 20 7c 7c  iOld>=p->nCol ||
d6b0: 20 70 2d 3e 61 69 43 6f 6c 5b 69 4f 6c 64 5d 21   p->aiCol[iOld]!
d6c0: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  =i ){.        pR
d6d0: 65 74 2d 3e 61 69 43 6f 6c 5b 70 52 65 74 2d 3e  et->aiCol[pRet->
d6e0: 6e 43 6f 6c 2b 2b 5d 20 3d 20 69 3b 0a 20 20 20  nCol++] = i;.   
d6f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d700: 20 20 69 4f 6c 64 2b 2b 3b 0a 20 20 20 20 20 20    iOld++;.      
d710: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
d720: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
d730: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
d740: 0a 0a 46 74 73 35 43 6f 6c 73 65 74 20 2a 73 71  ..Fts5Colset *sq
d750: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43 6f  lite3Fts5ParseCo
d760: 6c 73 65 74 28 0a 20 20 46 74 73 35 50 61 72 73  lset(.  Fts5Pars
d770: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d780: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
d790: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 68 65   SQLITE_NOMEM he
d7a0: 72 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  re if required *
d7b0: 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
d7c0: 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
d7d0: 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20      /* Existing 
d7e0: 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 2a 2f  colset object */
d7f0: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 0a  .  Fts5Token *p.
d800: 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  ){.  Fts5Colset 
d810: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74  *pRet = 0;.  int
d820: 20 69 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   iCol;.  char *z
d830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d840: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
d850: 6f 74 65 64 20 63 6f 70 79 20 6f 66 20 74 6f 6b  oted copy of tok
d860: 65 6e 20 70 20 2a 2f 0a 0a 20 20 7a 20 3d 20 73  en p */..  z = s
d870: 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75  qlite3Fts5Strndu
d880: 70 28 26 70 50 61 72 73 65 2d 3e 72 63 2c 20 70  p(&pParse->rc, p
d890: 2d 3e 70 2c 20 70 2d 3e 6e 29 3b 0a 20 20 69 66  ->p, p->n);.  if
d8a0: 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ( pParse->rc==SQ
d8b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
d8c0: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
d8d0: 69 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f  ig = pParse->pCo
d8e0: 6e 66 69 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  nfig;.    sqlite
d8f0: 33 46 74 73 35 44 65 71 75 6f 74 65 28 7a 29 3b  3Fts5Dequote(z);
d900: 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
d910: 20 69 43 6f 6c 3c 70 43 6f 6e 66 69 67 2d 3e 6e   iCol<pConfig->n
d920: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
d930: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
d940: 65 33 5f 73 74 72 69 63 6d 70 28 70 43 6f 6e 66  e3_stricmp(pConf
d950: 69 67 2d 3e 61 7a 43 6f 6c 5b 69 43 6f 6c 5d 2c  ig->azCol[iCol],
d960: 20 7a 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   z) ) break;.   
d970: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
d980: 3d 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20 29  =pConfig->nCol )
d990: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
d9a0: 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 70 50  ts5ParseError(pP
d9b0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
d9c0: 6f 6c 75 6d 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a  olumn: %s", z);.
d9d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d9e0: 20 70 52 65 74 20 3d 20 66 74 73 35 50 61 72 73   pRet = fts5Pars
d9f0: 65 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c 20  eColset(pParse, 
da00: 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a  pColset, iCol);.
da10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
da20: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 0a  3_free(z);.  }..
da30: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
da40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
da50: 72 73 65 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  rse->rc!=SQLITE_
da60: 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OK );.    sqlite
da70: 33 5f 66 72 65 65 28 70 43 6f 6c 73 65 74 29 3b  3_free(pColset);
da80: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
da90: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Ret;.}../*.** If
daa0: 20 61 72 67 75 6d 65 6e 74 20 70 4f 72 69 67 20   argument pOrig 
dab0: 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 28  is NULL, or if (
dac0: 2a 70 52 63 29 20 69 73 20 73 65 74 20 74 6f 20  *pRc) is set to 
dad0: 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
dae0: 68 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  han.** SQLITE_OK
daf0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
db00: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e  ion is called, N
db10: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
db20: 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73   .**.** Otherwis
db30: 65 2c 20 61 20 63 6f 70 79 20 6f 66 20 28 2a 70  e, a copy of (*p
db40: 4f 72 69 67 29 20 69 73 20 6d 61 64 65 20 69 6e  Orig) is made in
db50: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
db60: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
db70: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
db80: 28 29 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  () and a pointer
db90: 20 74 6f 20 69 74 20 72 65 74 75 72 6e 65 64 2e   to it returned.
dba0: 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   If the allocati
dbb0: 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 28 2a 70  on.** fails, (*p
dbc0: 52 63 29 20 69 73 20 73 65 74 20 74 6f 20 53 51  Rc) is set to SQ
dbd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 4e  LITE_NOMEM and N
dbe0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
dbf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 43  .*/.static Fts5C
dc00: 6f 6c 73 65 74 20 2a 66 74 73 35 43 6c 6f 6e 65  olset *fts5Clone
dc10: 43 6f 6c 73 65 74 28 69 6e 74 20 2a 70 52 63 2c  Colset(int *pRc,
dc20: 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 4f 72   Fts5Colset *pOr
dc30: 69 67 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65  ig){.  Fts5Colse
dc40: 74 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  t *pRet;.  if( p
dc50: 4f 72 69 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  Orig ){.    int 
dc60: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
dc70: 74 73 35 43 6f 6c 73 65 74 29 20 2b 20 28 70 4f  ts5Colset) + (pO
dc80: 72 69 67 2d 3e 6e 43 6f 6c 2d 31 29 20 2a 20 73  rig->nCol-1) * s
dc90: 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 20 20  izeof(int);.    
dca0: 70 52 65 74 20 3d 20 28 46 74 73 35 43 6f 6c 73  pRet = (Fts5Cols
dcb0: 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  et*)sqlite3Fts5M
dcc0: 61 6c 6c 6f 63 5a 65 72 6f 28 70 52 63 2c 20 6e  allocZero(pRc, n
dcd0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
dce0: 52 65 74 20 29 7b 20 0a 20 20 20 20 20 20 6d 65  Ret ){ .      me
dcf0: 6d 63 70 79 28 70 52 65 74 2c 20 70 4f 72 69 67  mcpy(pRet, pOrig
dd00: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
dd10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
dd20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
dd30: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
dd40: 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 63  ** Remove from c
dd50: 6f 6c 73 65 74 20 70 43 6f 6c 73 65 74 20 61 6e  olset pColset an
dd60: 79 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  y columns that a
dd70: 72 65 20 6e 6f 74 20 61 6c 73 6f 20 69 6e 20 63  re not also in c
dd80: 6f 6c 73 65 74 20 70 4d 65 72 67 65 2e 0a 2a 2f  olset pMerge..*/
dd90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
dda0: 35 4d 65 72 67 65 43 6f 6c 73 65 74 28 46 74 73  5MergeColset(Fts
ddb0: 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
ddc0: 2c 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 4d  , Fts5Colset *pM
ddd0: 65 72 67 65 29 7b 0a 20 20 69 6e 74 20 69 49 6e  erge){.  int iIn
dde0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
ddf0: 2a 20 4e 65 78 74 20 69 6e 70 75 74 20 69 6e 20  * Next input in 
de00: 70 43 6f 6c 73 65 74 20 2a 2f 0a 20 20 69 6e 74  pColset */.  int
de10: 20 69 4d 65 72 67 65 20 3d 20 30 3b 20 20 20 20   iMerge = 0;    
de20: 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 70 75 74     /* Next input
de30: 20 69 6e 20 70 4d 65 72 67 65 20 2a 2f 0a 20 20   in pMerge */.  
de40: 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
de50: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 75        /* Next ou
de60: 74 70 75 74 20 73 6c 6f 74 20 69 6e 20 70 43 6f  tput slot in pCo
de70: 6c 73 65 74 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  lset */..  while
de80: 28 20 69 49 6e 3c 70 43 6f 6c 73 65 74 2d 3e 6e  ( iIn<pColset->n
de90: 43 6f 6c 20 26 26 20 69 4d 65 72 67 65 3c 70 4d  Col && iMerge<pM
dea0: 65 72 67 65 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  erge->nCol ){.  
deb0: 20 20 69 6e 74 20 69 44 69 66 66 20 3d 20 70 43    int iDiff = pC
dec0: 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 49 6e  olset->aiCol[iIn
ded0: 5d 20 2d 20 70 4d 65 72 67 65 2d 3e 61 69 43 6f  ] - pMerge->aiCo
dee0: 6c 5b 69 4d 65 72 67 65 5d 3b 0a 20 20 20 20 69  l[iMerge];.    i
def0: 66 28 20 69 44 69 66 66 3d 3d 30 20 29 7b 0a 20  f( iDiff==0 ){. 
df00: 20 20 20 20 20 70 43 6f 6c 73 65 74 2d 3e 61 69       pColset->ai
df10: 43 6f 6c 5b 69 4f 75 74 2b 2b 5d 20 3d 20 70 4d  Col[iOut++] = pM
df20: 65 72 67 65 2d 3e 61 69 43 6f 6c 5b 69 4d 65 72  erge->aiCol[iMer
df30: 67 65 5d 3b 0a 20 20 20 20 20 20 69 4d 65 72 67  ge];.      iMerg
df40: 65 2b 2b 3b 0a 20 20 20 20 20 20 69 49 6e 2b 2b  e++;.      iIn++
df50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
df60: 69 44 69 66 66 3e 30 20 29 7b 0a 20 20 20 20 20  iDiff>0 ){.     
df70: 20 69 4d 65 72 67 65 2b 2b 3b 0a 20 20 20 20 7d   iMerge++;.    }
df80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 49 6e 2b  else{.      iIn+
df90: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  +;.    }.  }.  p
dfa0: 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 20 3d 20 69  Colset->nCol = i
dfb0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
dfc0: 63 75 72 73 69 76 65 6c 79 20 61 70 70 6c 79 20  cursively apply 
dfd0: 63 6f 6c 73 65 74 20 70 43 6f 6c 73 65 74 20 74  colset pColset t
dfe0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  o expression nod
dff0: 65 20 70 4e 6f 64 65 20 61 6e 64 20 61 6c 6c 20  e pNode and all 
e000: 6f 66 0a 2a 2a 20 69 74 73 20 64 65 63 65 6e 64  of.** its decend
e010: 65 6e 74 73 2e 20 49 66 20 28 2a 70 70 46 72 65  ents. If (*ppFre
e020: 65 29 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  e) is not NULL, 
e030: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 70  it contains a sp
e040: 61 72 65 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70  are copy.** of p
e050: 43 6f 6c 73 65 74 2e 20 54 68 69 73 20 66 75 6e  Colset. This fun
e060: 63 74 69 6f 6e 20 6d 61 79 20 75 73 65 20 74 68  ction may use th
e070: 65 20 73 70 61 72 65 20 63 6f 70 79 20 61 6e 64  e spare copy and
e080: 20 73 65 74 20 28 2a 70 70 46 72 65 65 29 20 74   set (*ppFree) t
e090: 6f 0a 2a 2a 20 7a 65 72 6f 2c 20 6f 72 20 69 74  o.** zero, or it
e0a0: 20 6d 61 79 20 63 72 65 61 74 65 20 63 6f 70 69   may create copi
e0b0: 65 73 20 6f 66 20 70 43 6f 6c 73 65 74 20 75 73  es of pColset us
e0c0: 69 6e 67 20 66 74 73 35 43 6c 6f 6e 65 43 6f 6c  ing fts5CloneCol
e0d0: 73 65 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  set()..*/.static
e0e0: 20 76 6f 69 64 20 66 74 73 35 50 61 72 73 65 53   void fts5ParseS
e0f0: 65 74 43 6f 6c 73 65 74 28 0a 20 20 46 74 73 35  etColset(.  Fts5
e100: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
e110: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
e120: 70 4e 6f 64 65 2c 20 0a 20 20 46 74 73 35 43 6f  pNode, .  Fts5Co
e130: 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20  lset *pColset,. 
e140: 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 2a 70 70   Fts5Colset **pp
e150: 46 72 65 65 0a 29 7b 0a 20 20 69 66 28 20 70 50  Free.){.  if( pP
e160: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
e170: 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
e180: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  t( pNode->eType=
e190: 3d 46 54 53 35 5f 54 45 52 4d 20 7c 7c 20 70 4e  =FTS5_TERM || pN
e1a0: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ode->eType==FTS5
e1b0: 5f 53 54 52 49 4e 47 20 0a 20 20 20 20 20 20 20  _STRING .       
e1c0: 20 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70    || pNode->eTyp
e1d0: 65 3d 3d 46 54 53 35 5f 41 4e 44 20 20 7c 7c 20  e==FTS5_AND  || 
e1e0: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
e1f0: 53 35 5f 4f 52 0a 20 20 20 20 20 20 20 20 20 7c  S5_OR.         |
e200: 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d  | pNode->eType==
e210: 46 54 53 35 5f 4e 4f 54 20 20 7c 7c 20 70 4e 6f  FTS5_NOT  || pNo
e220: 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  de->eType==FTS5_
e230: 45 4f 46 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  EOF.    );.    i
e240: 66 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  f( pNode->eType=
e250: 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 7c 7c 20  =FTS5_STRING || 
e260: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
e270: 53 35 5f 54 45 52 4d 20 29 7b 0a 20 20 20 20 20  S5_TERM ){.     
e280: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
e290: 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d   *pNear = pNode-
e2a0: 3e 70 4e 65 61 72 3b 0a 20 20 20 20 20 20 69 66  >pNear;.      if
e2b0: 28 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  ( pNear->pColset
e2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
e2d0: 4d 65 72 67 65 43 6f 6c 73 65 74 28 70 4e 65 61  MergeColset(pNea
e2e0: 72 2d 3e 70 43 6f 6c 73 65 74 2c 20 70 43 6f 6c  r->pColset, pCol
e2f0: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
e300: 28 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  ( pNear->pColset
e310: 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ->nCol==0 ){.   
e320: 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 65 54         pNode->eT
e330: 79 70 65 20 3d 20 46 54 53 35 5f 45 4f 46 3b 0a  ype = FTS5_EOF;.
e340: 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d            pNode-
e350: 3e 78 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >xNext = 0;.    
e360: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
e370: 65 20 69 66 28 20 2a 70 70 46 72 65 65 20 29 7b  e if( *ppFree ){
e380: 0a 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d 3e  .        pNear->
e390: 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
e3a0: 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 46 72  t;.        *ppFr
e3b0: 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  ee = 0;.      }e
e3c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
e3d0: 61 72 2d 3e 70 43 6f 6c 73 65 74 20 3d 20 66 74  ar->pColset = ft
e3e0: 73 35 43 6c 6f 6e 65 43 6f 6c 73 65 74 28 26 70  s5CloneColset(&p
e3f0: 50 61 72 73 65 2d 3e 72 63 2c 20 70 43 6f 6c 73  Parse->rc, pCols
e400: 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
e410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
e420: 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t i;.      asser
e430: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 21  t( pNode->eType!
e440: 3d 46 54 53 35 5f 45 4f 46 20 7c 7c 20 70 4e 6f  =FTS5_EOF || pNo
e450: 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 30 20 29 3b  de->nChild==0 );
e460: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e470: 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b  i<pNode->nChild;
e480: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
e490: 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65  ts5ParseSetColse
e4a0: 74 28 70 50 61 72 73 65 2c 20 70 4e 6f 64 65 2d  t(pParse, pNode-
e4b0: 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 70 43 6f  >apChild[i], pCo
e4c0: 6c 73 65 74 2c 20 70 70 46 72 65 65 29 3b 0a 20  lset, ppFree);. 
e4d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e4e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  .}../*.** Apply 
e4f0: 63 6f 6c 73 65 74 20 70 43 6f 6c 73 65 74 20 74  colset pColset t
e500: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  o expression nod
e510: 65 20 70 45 78 70 72 20 61 6e 64 20 61 6c 6c 20  e pExpr and all 
e520: 6f 66 20 69 74 73 20 64 65 73 63 65 6e 64 65 6e  of its descenden
e530: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
e540: 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74 43  te3Fts5ParseSetC
e550: 6f 6c 73 65 74 28 0a 20 20 46 74 73 35 50 61 72  olset(.  Fts5Par
e560: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 46  se *pParse, .  F
e570: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 45 78  ts5ExprNode *pEx
e580: 70 72 2c 20 0a 20 20 46 74 73 35 43 6f 6c 73 65  pr, .  Fts5Colse
e590: 74 20 2a 70 43 6f 6c 73 65 74 20 0a 29 7b 0a 20  t *pColset .){. 
e5a0: 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 46 72   Fts5Colset *pFr
e5b0: 65 65 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  ee = pColset;.  
e5c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  if( pParse->pCon
e5d0: 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
e5e0: 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
e5f0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
e600: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e610: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 45 72  .    pParse->zEr
e620: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
e630: 6e 74 66 28 0a 20 20 20 20 20 20 22 66 74 73 35  ntf(.      "fts5
e640: 3a 20 63 6f 6c 75 6d 6e 20 71 75 65 72 69 65 73  : column queries
e650: 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
e660: 65 64 20 28 64 65 74 61 69 6c 3d 6e 6f 6e 65 29  ed (detail=none)
e670: 22 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  ".    );.  }else
e680: 7b 0a 20 20 20 20 66 74 73 35 50 61 72 73 65 53  {.    fts5ParseS
e690: 65 74 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c  etColset(pParse,
e6a0: 20 70 45 78 70 72 2c 20 70 43 6f 6c 73 65 74 2c   pExpr, pColset,
e6b0: 20 26 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20   &pFree);.  }.  
e6c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 72  sqlite3_free(pFr
e6d0: 65 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ee);.}..static v
e6e0: 6f 69 64 20 66 74 73 35 45 78 70 72 41 73 73 69  oid fts5ExprAssi
e6f0: 67 6e 58 4e 65 78 74 28 46 74 73 35 45 78 70 72  gnXNext(Fts5Expr
e700: 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20  Node *pNode){.  
e710: 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65  switch( pNode->e
e720: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
e730: 20 46 54 53 35 5f 53 54 52 49 4e 47 3a 20 7b 0a   FTS5_STRING: {.
e740: 20 20 20 20 20 20 46 74 73 35 45 78 70 72 4e 65        Fts5ExprNe
e750: 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70  arset *pNear = p
e760: 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 20  Node->pNear;.   
e770: 20 20 20 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50     if( pNear->nP
e780: 68 72 61 73 65 3d 3d 31 20 26 26 20 70 4e 65 61  hrase==1 && pNea
e790: 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e  r->apPhrase[0]->
e7a0: 6e 54 65 72 6d 3d 3d 31 20 0a 20 20 20 20 20 20  nTerm==1 .      
e7b0: 20 26 26 20 70 4e 65 61 72 2d 3e 61 70 50 68 72   && pNear->apPhr
e7c0: 61 73 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d  ase[0]->aTerm[0]
e7d0: 2e 70 53 79 6e 6f 6e 79 6d 3d 3d 30 0a 20 20 20  .pSynonym==0.   
e7e0: 20 20 20 20 26 26 20 70 4e 65 61 72 2d 3e 61 70      && pNear->ap
e7f0: 50 68 72 61 73 65 5b 30 5d 2d 3e 61 54 65 72 6d  Phrase[0]->aTerm
e800: 5b 30 5d 2e 62 46 69 72 73 74 3d 3d 30 0a 20 20  [0].bFirst==0.  
e810: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
e820: 4e 6f 64 65 2d 3e 65 54 79 70 65 20 3d 20 46 54  Node->eType = FT
e830: 53 35 5f 54 45 52 4d 3b 0a 20 20 20 20 20 20 20  S5_TERM;.       
e840: 20 70 4e 6f 64 65 2d 3e 78 4e 65 78 74 20 3d 20   pNode->xNext = 
e850: 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
e860: 5f 54 45 52 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  _TERM;.      }el
e870: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64  se{.        pNod
e880: 65 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45  e->xNext = fts5E
e890: 78 70 72 4e 6f 64 65 4e 65 78 74 5f 53 54 52 49  xprNodeNext_STRI
e8a0: 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NG;.      }.    
e8b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a    break;.    };.
e8c0: 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f  .    case FTS5_O
e8d0: 52 3a 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65  R: {.      pNode
e8e0: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78  ->xNext = fts5Ex
e8f0: 70 72 4e 6f 64 65 4e 65 78 74 5f 4f 52 3b 0a 20  prNodeNext_OR;. 
e900: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e910: 7d 3b 0a 0a 20 20 20 20 63 61 73 65 20 46 54 53  };..    case FTS
e920: 35 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 70  5_AND: {.      p
e930: 4e 6f 64 65 2d 3e 78 4e 65 78 74 20 3d 20 66 74  Node->xNext = ft
e940: 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 41  s5ExprNodeNext_A
e950: 4e 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ND;.      break;
e960: 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64 65 66  .    };..    def
e970: 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 4e  ault: assert( pN
e980: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ode->eType==FTS5
e990: 5f 4e 4f 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  _NOT ); {.      
e9a0: 70 4e 6f 64 65 2d 3e 78 4e 65 78 74 20 3d 20 66  pNode->xNext = f
e9b0: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f  ts5ExprNodeNext_
e9c0: 4e 4f 54 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NOT;.      break
e9d0: 3b 0a 20 20 20 20 7d 3b 0a 20 20 7d 0a 7d 0a 0a  ;.    };.  }.}..
e9e0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e9f0: 45 78 70 72 41 64 64 43 68 69 6c 64 72 65 6e 28  ExprAddChildren(
ea00: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 2c  Fts5ExprNode *p,
ea10: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
ea20: 53 75 62 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65  Sub){.  if( p->e
ea30: 54 79 70 65 21 3d 46 54 53 35 5f 4e 4f 54 20 26  Type!=FTS5_NOT &
ea40: 26 20 70 53 75 62 2d 3e 65 54 79 70 65 3d 3d 70  & pSub->eType==p
ea50: 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 69  ->eType ){.    i
ea60: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
ea70: 66 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29  f(Fts5ExprNode*)
ea80: 20 2a 20 70 53 75 62 2d 3e 6e 43 68 69 6c 64 3b   * pSub->nChild;
ea90: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e  .    memcpy(&p->
eaa0: 61 70 43 68 69 6c 64 5b 70 2d 3e 6e 43 68 69 6c  apChild[p->nChil
eab0: 64 5d 2c 20 70 53 75 62 2d 3e 61 70 43 68 69 6c  d], pSub->apChil
eac0: 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  d, nByte);.    p
ead0: 2d 3e 6e 43 68 69 6c 64 20 2b 3d 20 70 53 75 62  ->nChild += pSub
eae0: 2d 3e 6e 43 68 69 6c 64 3b 0a 20 20 20 20 73 71  ->nChild;.    sq
eaf0: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 29  lite3_free(pSub)
eb00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
eb10: 2d 3e 61 70 43 68 69 6c 64 5b 70 2d 3e 6e 43 68  ->apChild[p->nCh
eb20: 69 6c 64 2b 2b 5d 20 3d 20 70 53 75 62 3b 0a 20  ild++] = pSub;. 
eb30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
eb40: 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
eb50: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
eb60: 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 79 74   object. If anyt
eb70: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
eb80: 28 69 2e 65 2e 0a 2a 2a 20 4f 4f 4d 20 65 72 72  (i.e..** OOM err
eb90: 6f 72 29 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  or), leave an er
eba0: 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 50 61 72  ror code in pPar
ebb0: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
ebc0: 4c 4c 2e 0a 2a 2f 0a 46 74 73 35 45 78 70 72 4e  LL..*/.Fts5ExprN
ebd0: 6f 64 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35  ode *sqlite3Fts5
ebe0: 50 61 72 73 65 4e 6f 64 65 28 0a 20 20 46 74 73  ParseNode(.  Fts
ebf0: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec10: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
ec20: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 52 49 4e     /* FTS5_STRIN
ec50: 47 2c 20 41 4e 44 2c 20 4f 52 20 6f 72 20 4e 4f  G, AND, OR or NO
ec60: 54 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e  T */.  Fts5ExprN
ec70: 6f 64 65 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  ode *pLeft,     
ec80: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68         /* Left h
ec90: 61 6e 64 20 63 68 69 6c 64 20 65 78 70 72 65 73  and child expres
eca0: 73 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78  sion */.  Fts5Ex
ecb0: 70 72 4e 6f 64 65 20 2a 70 52 69 67 68 74 2c 20  prNode *pRight, 
ecc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
ecd0: 68 74 20 68 61 6e 64 20 63 68 69 6c 64 20 65 78  ht hand child ex
ece0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 46 74  pression */.  Ft
ecf0: 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70  s5ExprNearset *p
ed00: 4e 65 61 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Near          /*
ed10: 20 46 6f 72 20 53 54 52 49 4e 47 20 65 78 70 72   For STRING expr
ed20: 65 73 73 69 6f 6e 73 2c 20 74 68 65 20 6e 65 61  essions, the nea
ed30: 72 20 63 6c 75 73 74 65 72 20 2a 2f 0a 29 7b 0a  r cluster */.){.
ed40: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
ed50: 70 52 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  pRet = 0;..  if(
ed60: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
ed70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
ed80: 74 20 6e 43 68 69 6c 64 20 3d 20 30 3b 20 20 20  t nChild = 0;   
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
eda0: 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65  umber of childre
edb0: 6e 20 6f 66 20 72 65 74 75 72 6e 65 64 20 6e 6f  n of returned no
edc0: 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  de */.    int nB
edd0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
ede0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
edf0: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
ee00: 6f 63 61 74 65 20 66 6f 72 20 74 68 69 73 20 6e  ocate for this n
ee10: 6f 64 65 20 2a 2f 0a 20 0a 20 20 20 20 61 73 73  ode */. .    ass
ee20: 65 72 74 28 20 28 65 54 79 70 65 21 3d 46 54 53  ert( (eType!=FTS
ee30: 35 5f 53 54 52 49 4e 47 20 26 26 20 21 70 4e 65  5_STRING && !pNe
ee40: 61 72 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ar).         || 
ee50: 28 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52  (eType==FTS5_STR
ee60: 49 4e 47 20 26 26 20 21 70 4c 65 66 74 20 26 26  ING && !pLeft &&
ee70: 20 21 70 52 69 67 68 74 29 0a 20 20 20 20 29 3b   !pRight).    );
ee80: 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
ee90: 46 54 53 35 5f 53 54 52 49 4e 47 20 26 26 20 70  FTS5_STRING && p
eea0: 4e 65 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Near==0 ) return
eeb0: 20 30 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70   0;.    if( eTyp
eec0: 65 21 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 26  e!=FTS5_STRING &
eed0: 26 20 70 4c 65 66 74 3d 3d 30 20 29 20 72 65 74  & pLeft==0 ) ret
eee0: 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 20 20  urn pRight;.    
eef0: 69 66 28 20 65 54 79 70 65 21 3d 46 54 53 35 5f  if( eType!=FTS5_
ef00: 53 54 52 49 4e 47 20 26 26 20 70 52 69 67 68 74  STRING && pRight
ef10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70 4c 65  ==0 ) return pLe
ef20: 66 74 3b 0a 0a 20 20 20 20 69 66 28 20 65 54 79  ft;..    if( eTy
ef30: 70 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29 7b 0a  pe==FTS5_NOT ){.
ef40: 20 20 20 20 20 20 6e 43 68 69 6c 64 20 3d 20 32        nChild = 2
ef50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ef60: 65 54 79 70 65 3d 3d 46 54 53 35 5f 41 4e 44 20  eType==FTS5_AND 
ef70: 7c 7c 20 65 54 79 70 65 3d 3d 46 54 53 35 5f 4f  || eType==FTS5_O
ef80: 52 20 29 7b 0a 20 20 20 20 20 20 6e 43 68 69 6c  R ){.      nChil
ef90: 64 20 3d 20 32 3b 0a 20 20 20 20 20 20 69 66 28  d = 2;.      if(
efa0: 20 70 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 65   pLeft->eType==e
efb0: 54 79 70 65 20 29 20 6e 43 68 69 6c 64 20 2b 3d  Type ) nChild +=
efc0: 20 70 4c 65 66 74 2d 3e 6e 43 68 69 6c 64 2d 31   pLeft->nChild-1
efd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  ;.      if( pRig
efe0: 68 74 2d 3e 65 54 79 70 65 3d 3d 65 54 79 70 65  ht->eType==eType
eff0: 20 29 20 6e 43 68 69 6c 64 20 2b 3d 20 70 52 69   ) nChild += pRi
f000: 67 68 74 2d 3e 6e 43 68 69 6c 64 2d 31 3b 0a 20  ght->nChild-1;. 
f010: 20 20 20 7d 0a 0a 20 20 20 20 6e 42 79 74 65 20     }..    nByte 
f020: 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  = sizeof(Fts5Exp
f030: 72 4e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  rNode) + sizeof(
f040: 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 2a 28  Fts5ExprNode*)*(
f050: 6e 43 68 69 6c 64 2d 31 29 3b 0a 20 20 20 20 70  nChild-1);.    p
f060: 52 65 74 20 3d 20 28 46 74 73 35 45 78 70 72 4e  Ret = (Fts5ExprN
f070: 6f 64 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ode*)sqlite3Fts5
f080: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 50 61 72  MallocZero(&pPar
f090: 73 65 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  se->rc, nByte);.
f0a0: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
f0b0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 65 54 79  .      pRet->eTy
f0c0: 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  pe = eType;.    
f0d0: 20 20 70 52 65 74 2d 3e 70 4e 65 61 72 20 3d 20    pRet->pNear = 
f0e0: 70 4e 65 61 72 3b 0a 20 20 20 20 20 20 66 74 73  pNear;.      fts
f0f0: 35 45 78 70 72 41 73 73 69 67 6e 58 4e 65 78 74  5ExprAssignXNext
f100: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 69 66  (pRet);.      if
f110: 28 20 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54  ( eType==FTS5_ST
f120: 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20  RING ){.        
f130: 69 6e 74 20 69 50 68 72 61 73 65 3b 0a 20 20 20  int iPhrase;.   
f140: 20 20 20 20 20 66 6f 72 28 69 50 68 72 61 73 65       for(iPhrase
f150: 3d 30 3b 20 69 50 68 72 61 73 65 3c 70 4e 65 61  =0; iPhrase<pNea
f160: 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 50 68 72  r->nPhrase; iPhr
f170: 61 73 65 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ase++){.        
f180: 20 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73    pNear->apPhras
f190: 65 5b 69 50 68 72 61 73 65 5d 2d 3e 70 4e 6f 64  e[iPhrase]->pNod
f1a0: 65 20 3d 20 70 52 65 74 3b 0a 20 20 20 20 20 20  e = pRet;.      
f1b0: 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d 3e 61      if( pNear->a
f1c0: 70 50 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d  pPhrase[iPhrase]
f1d0: 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20  ->nTerm==0 ){.  
f1e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e            pRet->
f1f0: 78 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  xNext = 0;.     
f200: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 65 54 79         pRet->eTy
f210: 70 65 20 3d 20 46 54 53 35 5f 45 4f 46 3b 0a 20  pe = FTS5_EOF;. 
f220: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f230: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
f240: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69  ( pParse->pConfi
f250: 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
f260: 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a  _DETAIL_FULL ){.
f270: 20 20 20 20 20 20 20 20 20 20 46 74 73 35 45 78            Fts5Ex
f280: 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
f290: 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72  e = pNear->apPhr
f2a0: 61 73 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ase[0];.        
f2b0: 20 20 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68    if( pNear->nPh
f2c0: 72 61 73 65 21 3d 31 20 0a 20 20 20 20 20 20 20  rase!=1 .       
f2d0: 20 20 20 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e      || pPhrase->
f2e0: 6e 54 65 72 6d 3e 31 0a 20 20 20 20 20 20 20 20  nTerm>1.        
f2f0: 20 20 20 7c 7c 20 28 70 50 68 72 61 73 65 2d 3e     || (pPhrase->
f300: 6e 54 65 72 6d 3e 30 20 26 26 20 70 50 68 72 61  nTerm>0 && pPhra
f310: 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46 69  se->aTerm[0].bFi
f320: 72 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 29  rst).          )
f330: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
f340: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63  sert( pParse->rc
f350: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
f360: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
f370: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
f380: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
f390: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
f3a0: 2d 3e 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20  ->zErr==0 );.   
f3b0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
f3c0: 3e 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  >zErr = sqlite3_
f3d0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
f3e0: 20 20 20 20 20 20 20 20 20 22 66 74 73 35 3a 20           "fts5: 
f3f0: 25 73 20 71 75 65 72 69 65 73 20 61 72 65 20 6e  %s queries are n
f400: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 28 64 65  ot supported (de
f410: 74 61 69 6c 21 3d 66 75 6c 6c 29 22 2c 20 0a 20  tail!=full)", . 
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f430: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3d 3d 31  Near->nPhrase==1
f440: 20 3f 20 22 70 68 72 61 73 65 22 3a 20 22 4e 45   ? "phrase": "NE
f450: 41 52 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  AR".            
f460: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
f470: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f480: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  pRet);.         
f490: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
f4a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f4b0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
f4c0: 20 20 20 20 20 20 20 20 66 74 73 35 45 78 70 72          fts5Expr
f4d0: 41 64 64 43 68 69 6c 64 72 65 6e 28 70 52 65 74  AddChildren(pRet
f4e0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
f4f0: 20 20 66 74 73 35 45 78 70 72 41 64 64 43 68 69    fts5ExprAddChi
f500: 6c 64 72 65 6e 28 70 52 65 74 2c 20 70 52 69 67  ldren(pRet, pRig
f510: 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ht);.      }.   
f520: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 52   }.  }..  if( pR
f530: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  et==0 ){.    ass
f540: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 21  ert( pParse->rc!
f550: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
f560: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
f570: 73 65 4e 6f 64 65 46 72 65 65 28 70 4c 65 66 74  seNodeFree(pLeft
f580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
f590: 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
f5a0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c  pRight);.    sql
f5b0: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61  ite3Fts5ParseNea
f5c0: 72 73 65 74 46 72 65 65 28 70 4e 65 61 72 29 3b  rsetFree(pNear);
f5d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
f5e0: 65 74 3b 0a 7d 0a 0a 46 74 73 35 45 78 70 72 4e  et;.}..Fts5ExprN
f5f0: 6f 64 65 20 2a 73 71 6c 69 74 65 33 46 74 73 35  ode *sqlite3Fts5
f600: 50 61 72 73 65 49 6d 70 6c 69 63 69 74 41 6e 64  ParseImplicitAnd
f610: 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70  (.  Fts5Parse *p
f620: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
f630: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
f640: 74 65 78 74 20 2a 2f 0a 20 20 46 74 73 35 45 78  text */.  Fts5Ex
f650: 70 72 4e 6f 64 65 20 2a 70 4c 65 66 74 2c 20 20  prNode *pLeft,  
f660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
f670: 74 20 68 61 6e 64 20 63 68 69 6c 64 20 65 78 70  t hand child exp
f680: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 46 74 73  ression */.  Fts
f690: 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 69 67 68  5ExprNode *pRigh
f6a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
f6b0: 52 69 67 68 74 20 68 61 6e 64 20 63 68 69 6c 64  Right hand child
f6c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
f6d0: 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  {.  Fts5ExprNode
f6e0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74   *pRet = 0;.  Ft
f6f0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 50 72 65  s5ExprNode *pPre
f700: 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
f710: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->rc ){.    sqli
f720: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
f730: 46 72 65 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  Free(pLeft);.   
f740: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
f750: 65 4e 6f 64 65 46 72 65 65 28 70 52 69 67 68 74  eNodeFree(pRight
f760: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  );.  }else{..   
f770: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
f780: 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49  eType==FTS5_STRI
f790: 4e 47 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 70  NG .        || p
f7a0: 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Left->eType==FTS
f7b0: 35 5f 54 45 52 4d 0a 20 20 20 20 20 20 20 20 7c  5_TERM.        |
f7c0: 7c 20 70 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d  | pLeft->eType==
f7d0: 46 54 53 35 5f 45 4f 46 0a 20 20 20 20 20 20 20  FTS5_EOF.       
f7e0: 20 7c 7c 20 70 4c 65 66 74 2d 3e 65 54 79 70 65   || pLeft->eType
f7f0: 3d 3d 46 54 53 35 5f 41 4e 44 0a 20 20 20 20 29  ==FTS5_AND.    )
f800: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
f810: 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53  ight->eType==FTS
f820: 35 5f 53 54 52 49 4e 47 20 0a 20 20 20 20 20 20  5_STRING .      
f830: 20 20 7c 7c 20 70 52 69 67 68 74 2d 3e 65 54 79    || pRight->eTy
f840: 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 0a 20  pe==FTS5_TERM . 
f850: 20 20 20 20 20 20 20 7c 7c 20 70 52 69 67 68 74         || pRight
f860: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 45 4f  ->eType==FTS5_EO
f870: 46 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  F .    );..    i
f880: 66 28 20 70 4c 65 66 74 2d 3e 65 54 79 70 65 3d  f( pLeft->eType=
f890: 3d 46 54 53 35 5f 41 4e 44 20 29 7b 0a 20 20 20  =FTS5_AND ){.   
f8a0: 20 20 20 70 50 72 65 76 20 3d 20 70 4c 65 66 74     pPrev = pLeft
f8b0: 2d 3e 61 70 43 68 69 6c 64 5b 70 4c 65 66 74 2d  ->apChild[pLeft-
f8c0: 3e 6e 43 68 69 6c 64 2d 31 5d 3b 0a 20 20 20 20  >nChild-1];.    
f8d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 72  }else{.      pPr
f8e0: 65 76 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  ev = pLeft;.    
f8f0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
f900: 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  rev->eType==FTS5
f910: 5f 53 54 52 49 4e 47 20 0a 20 20 20 20 20 20 20  _STRING .       
f920: 20 7c 7c 20 70 50 72 65 76 2d 3e 65 54 79 70 65   || pPrev->eType
f930: 3d 3d 46 54 53 35 5f 54 45 52 4d 20 0a 20 20 20  ==FTS5_TERM .   
f940: 20 20 20 20 20 7c 7c 20 70 50 72 65 76 2d 3e 65       || pPrev->e
f950: 54 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46 20 0a  Type==FTS5_EOF .
f960: 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20          );..    
f970: 69 66 28 20 70 52 69 67 68 74 2d 3e 65 54 79 70  if( pRight->eTyp
f980: 65 3d 3d 46 54 53 35 5f 45 4f 46 20 29 7b 0a 20  e==FTS5_EOF ){. 
f990: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
f9a0: 72 73 65 2d 3e 61 70 50 68 72 61 73 65 5b 70 50  rse->apPhrase[pP
f9b0: 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d 31 5d  arse->nPhrase-1]
f9c0: 3d 3d 70 52 69 67 68 74 2d 3e 70 4e 65 61 72 2d  ==pRight->pNear-
f9d0: 3e 61 70 50 68 72 61 73 65 5b 30 5d 20 29 3b 0a  >apPhrase[0] );.
f9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
f9f0: 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28 70  5ParseNodeFree(p
fa00: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 52  Right);.      pR
fa10: 65 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  et = pLeft;.    
fa20: 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73    pParse->nPhras
fa30: 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  e--;.    }.    e
fa40: 6c 73 65 20 69 66 28 20 70 50 72 65 76 2d 3e 65  lse if( pPrev->e
fa50: 54 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46 20 29  Type==FTS5_EOF )
fa60: 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72  {.      Fts5Expr
fa70: 50 68 72 61 73 65 20 2a 2a 61 70 3b 0a 0a 20 20  Phrase **ap;..  
fa80: 20 20 20 20 69 66 28 20 70 50 72 65 76 3d 3d 70      if( pPrev==p
fa90: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
faa0: 70 52 65 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  pRet = pRight;. 
fab0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fac0: 20 20 20 20 70 4c 65 66 74 2d 3e 61 70 43 68 69      pLeft->apChi
fad0: 6c 64 5b 70 4c 65 66 74 2d 3e 6e 43 68 69 6c 64  ld[pLeft->nChild
fae0: 2d 31 5d 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  -1] = pRight;.  
faf0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 4c 65        pRet = pLe
fb00: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ft;.      }..   
fb10: 20 20 20 61 70 20 3d 20 26 70 50 61 72 73 65 2d     ap = &pParse-
fb20: 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65  >apPhrase[pParse
fb30: 2d 3e 6e 50 68 72 61 73 65 2d 31 2d 70 52 69 67  ->nPhrase-1-pRig
fb40: 68 74 2d 3e 70 4e 65 61 72 2d 3e 6e 50 68 72 61  ht->pNear->nPhra
fb50: 73 65 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  se];.      asser
fb60: 74 28 20 61 70 5b 30 5d 3d 3d 70 50 72 65 76 2d  t( ap[0]==pPrev-
fb70: 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65  >pNear->apPhrase
fb80: 5b 30 5d 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  [0] );.      mem
fb90: 6d 6f 76 65 28 61 70 2c 20 26 61 70 5b 31 5d 2c  move(ap, &ap[1],
fba0: 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
fbb0: 50 68 72 61 73 65 2a 29 2a 70 52 69 67 68 74 2d  Phrase*)*pRight-
fbc0: 3e 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 29  >pNear->nPhrase)
fbd0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
fbe0: 6e 50 68 72 61 73 65 2d 2d 3b 0a 0a 20 20 20 20  nPhrase--;..    
fbf0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
fc00: 73 65 4e 6f 64 65 46 72 65 65 28 70 50 72 65 76  seNodeFree(pPrev
fc10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
fc20: 65 7b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  e{.      pRet = 
fc30: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
fc40: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 46 54 53  Node(pParse, FTS
fc50: 35 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52  5_AND, pLeft, pR
fc60: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ight, 0);.    }.
fc70: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
fc80: 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  et;.}..static ch
fc90: 61 72 20 2a 66 74 73 35 45 78 70 72 54 65 72 6d  ar *fts5ExprTerm
fca0: 50 72 69 6e 74 28 46 74 73 35 45 78 70 72 54 65  Print(Fts5ExprTe
fcb0: 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 6e  rm *pTerm){.  in
fcc0: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 46  t nByte = 0;.  F
fcd0: 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 3b 0a  ts5ExprTerm *p;.
fce0: 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 3b    char *zQuoted;
fcf0: 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
fd00: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
fd10: 75 6e 74 20 6f 66 20 73 70 61 63 65 20 72 65 71  unt of space req
fd20: 75 69 72 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  uired. */.  for(
fd30: 70 3d 70 54 65 72 6d 3b 20 70 3b 20 70 3d 70 2d  p=pTerm; p; p=p-
fd40: 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20  >pSynonym){.    
fd50: 6e 42 79 74 65 20 2b 3d 20 28 69 6e 74 29 73 74  nByte += (int)st
fd60: 72 6c 65 6e 28 70 54 65 72 6d 2d 3e 7a 54 65 72  rlen(pTerm->zTer
fd70: 6d 29 20 2a 20 32 20 2b 20 33 20 2b 20 32 3b 0a  m) * 2 + 3 + 2;.
fd80: 20 20 7d 0a 20 20 7a 51 75 6f 74 65 64 20 3d 20    }.  zQuoted = 
fd90: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
fda0: 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 7a 51  Byte);..  if( zQ
fdb0: 75 6f 74 65 64 20 29 7b 0a 20 20 20 20 69 6e 74  uoted ){.    int
fdc0: 20 69 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28   i = 0;.    for(
fdd0: 70 3d 70 54 65 72 6d 3b 20 70 3b 20 70 3d 70 2d  p=pTerm; p; p=p-
fde0: 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20  >pSynonym){.    
fdf0: 20 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 2d    char *zIn = p-
fe00: 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 7a 51  >zTerm;.      zQ
fe10: 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 22 27  uoted[i++] = '"'
fe20: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  ;.      while( *
fe30: 7a 49 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  zIn ){.        i
fe40: 66 28 20 2a 7a 49 6e 3d 3d 27 22 27 20 29 20 7a  f( *zIn=='"' ) z
fe50: 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 22  Quoted[i++] = '"
fe60: 27 3b 0a 20 20 20 20 20 20 20 20 7a 51 75 6f 74  ';.        zQuot
fe70: 65 64 5b 69 2b 2b 5d 20 3d 20 2a 7a 49 6e 2b 2b  ed[i++] = *zIn++
fe80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fe90: 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27  zQuoted[i++] = '
fea0: 22 27 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  "';.      if( p-
feb0: 3e 70 53 79 6e 6f 6e 79 6d 20 29 20 7a 51 75 6f  >pSynonym ) zQuo
fec0: 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 7c 27 3b 0a  ted[i++] = '|';.
fed0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
fee0: 65 72 6d 2d 3e 62 50 72 65 66 69 78 20 29 7b 0a  erm->bPrefix ){.
fef0: 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b        zQuoted[i+
ff00: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
ff10: 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27  zQuoted[i++] = '
ff20: 2a 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51  *';.    }.    zQ
ff30: 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 5c 30  uoted[i++] = '\0
ff40: 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ';.  }.  return 
ff50: 7a 51 75 6f 74 65 64 3b 0a 7d 0a 0a 73 74 61 74  zQuoted;.}..stat
ff60: 69 63 20 63 68 61 72 20 2a 66 74 73 35 50 72 69  ic char *fts5Pri
ff70: 6e 74 66 41 70 70 65 6e 64 28 63 68 61 72 20 2a  ntfAppend(char *
ff80: 7a 41 70 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  zApp, const char
ff90: 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
ffa0: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 76 61  char *zNew;.  va
ffb0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
ffc0: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
ffd0: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    zNew = sqlite3
ffe0: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
fff0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
10000 29 3b 0a 20 20 69 66 28 20 7a 41 70 70 20 26 26  );.  if( zApp &&
10010 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 63 68 61   zNew ){.    cha
10020 72 20 2a 7a 4e 65 77 32 20 3d 20 73 71 6c 69 74  r *zNew2 = sqlit
10030 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 25 73  e3_mprintf("%s%s
10040 22 2c 20 7a 41 70 70 2c 20 7a 4e 65 77 29 3b 0a  ", zApp, zNew);.
10050 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10060 28 7a 4e 65 77 29 3b 0a 20 20 20 20 7a 4e 65 77  (zNew);.    zNew
10070 20 3d 20 7a 4e 65 77 32 3b 0a 20 20 7d 0a 20 20   = zNew2;.  }.  
10080 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 41 70  sqlite3_free(zAp
10090 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 65  p);.  return zNe
100a0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  w;.}../*.** Comp
100b0 6f 73 65 20 61 20 74 63 6c 2d 72 65 61 64 61 62  ose a tcl-readab
100c0 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
100d0 6e 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  n of expression 
100e0 70 45 78 70 72 2e 20 52 65 74 75 72 6e 20 61 20  pExpr. Return a 
100f0 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  .** pointer to a
10100 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
10110 6e 67 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  ng that represen
10120 74 61 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68  tation. It is th
10130 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
10140 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
10150 65 72 20 74 6f 20 61 74 20 73 6f 6d 65 20 70 6f  er to at some po
10160 69 6e 74 20 66 72 65 65 20 74 68 65 20 62 75 66  int free the buf
10170 66 65 72 20 75 73 69 6e 67 20 0a 2a 2a 20 73 71  fer using .** sq
10180 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
10190 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66 74  .static char *ft
101a0 73 35 45 78 70 72 50 72 69 6e 74 54 63 6c 28 0a  s5ExprPrintTcl(.
101b0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
101c0 6f 6e 66 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20  onfig, .  const 
101d0 63 68 61 72 20 2a 7a 4e 65 61 72 73 65 74 43 6d  char *zNearsetCm
101e0 64 2c 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  d,.  Fts5ExprNod
101f0 65 20 2a 70 45 78 70 72 0a 29 7b 0a 20 20 63 68  e *pExpr.){.  ch
10200 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20  ar *zRet = 0;.  
10210 69 66 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65  if( pExpr->eType
10220 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 7c 7c  ==FTS5_STRING ||
10230 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46   pExpr->eType==F
10240 54 53 35 5f 54 45 52 4d 20 29 7b 0a 20 20 20 20  TS5_TERM ){.    
10250 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
10260 2a 70 4e 65 61 72 20 3d 20 70 45 78 70 72 2d 3e  *pNear = pExpr->
10270 70 4e 65 61 72 3b 0a 20 20 20 20 69 6e 74 20 69  pNear;.    int i
10280 3b 20 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d  ; .    int iTerm
10290 3b 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 66 74  ;..    zRet = ft
102a0 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a  s5PrintfAppend(z
102b0 52 65 74 2c 20 22 25 73 20 22 2c 20 7a 4e 65 61  Ret, "%s ", zNea
102c0 72 73 65 74 43 6d 64 29 3b 0a 20 20 20 20 69 66  rsetCmd);.    if
102d0 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65 74 75  ( zRet==0 ) retu
102e0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e  rn 0;.    if( pN
102f0 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 29 7b 0a  ear->pColset ){.
10300 20 20 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c        int *aiCol
10310 20 3d 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65   = pNear->pColse
10320 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 20 20  t->aiCol;.      
10330 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 4e 65 61 72  int nCol = pNear
10340 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b  ->pColset->nCol;
10350 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  .      if( nCol=
10360 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  =1 ){.        zR
10370 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
10380 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2d 63 6f  ppend(zRet, "-co
10390 6c 20 25 64 20 22 2c 20 61 69 43 6f 6c 5b 30 5d  l %d ", aiCol[0]
103a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
103b0 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66          zRet = f
103c0 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
103d0 7a 52 65 74 2c 20 22 2d 63 6f 6c 20 7b 25 64 22  zRet, "-col {%d"
103e0 2c 20 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20  , aiCol[0]);.   
103f0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
10400 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e  pNear->pColset->
10410 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
10420 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
10430 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
10440 65 74 2c 20 22 20 25 64 22 2c 20 61 69 43 6f 6c  et, " %d", aiCol
10450 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
10460 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66          zRet = f
10470 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
10480 7a 52 65 74 2c 20 22 7d 20 22 29 3b 0a 20 20 20  zRet, "} ");.   
10490 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
104a0 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ret==0 ) return 
104b0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
104c0 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  ( pNear->nPhrase
104d0 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74  >1 ){.      zRet
104e0 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
104f0 65 6e 64 28 7a 52 65 74 2c 20 22 2d 6e 65 61 72  end(zRet, "-near
10500 20 25 64 20 22 2c 20 70 4e 65 61 72 2d 3e 6e 4e   %d ", pNear->nN
10510 65 61 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ear);.      if( 
10520 7a 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  zRet==0 ) return
10530 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a   0;.    }..    z
10540 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66  Ret = fts5Printf
10550 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2d 2d  Append(zRet, "--
10560 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74  ");.    if( zRet
10570 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10580 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10590 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20  pNear->nPhrase; 
105a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i++){.      Fts5
105b0 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
105c0 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50  ase = pNear->apP
105d0 68 72 61 73 65 5b 69 5d 3b 0a 0a 20 20 20 20 20  hrase[i];..     
105e0 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e   zRet = fts5Prin
105f0 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22  tfAppend(zRet, "
10600 20 7b 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28   {");.      for(
10610 69 54 65 72 6d 3d 30 3b 20 7a 52 65 74 20 26 26  iTerm=0; zRet &&
10620 20 69 54 65 72 6d 3c 70 50 68 72 61 73 65 2d 3e   iTerm<pPhrase->
10630 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b  nTerm; iTerm++){
10640 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
10650 54 65 72 6d 20 3d 20 70 50 68 72 61 73 65 2d 3e  Term = pPhrase->
10660 61 54 65 72 6d 5b 69 54 65 72 6d 5d 2e 7a 54 65  aTerm[iTerm].zTe
10670 72 6d 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  rm;.        zRet
10680 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
10690 65 6e 64 28 7a 52 65 74 2c 20 22 25 73 25 73 22  end(zRet, "%s%s"
106a0 2c 20 69 54 65 72 6d 3d 3d 30 3f 22 22 3a 22 20  , iTerm==0?"":" 
106b0 22 2c 20 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  ", zTerm);.     
106c0 20 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e     if( pPhrase->
106d0 61 54 65 72 6d 5b 69 54 65 72 6d 5d 2e 62 50 72  aTerm[iTerm].bPr
106e0 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 20 20  efix ){.        
106f0 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69    zRet = fts5Pri
10700 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20  ntfAppend(zRet, 
10710 22 2a 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  "*");.        }.
10720 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
10730 66 28 20 7a 52 65 74 20 29 20 7a 52 65 74 20 3d  f( zRet ) zRet =
10740 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e   fts5PrintfAppen
10750 64 28 7a 52 65 74 2c 20 22 7d 22 29 3b 0a 20 20  d(zRet, "}");.  
10760 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20      if( zRet==0 
10770 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
10780 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
10790 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 70 20  char const *zOp 
107a0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
107b0 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70      switch( pExp
107c0 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20  r->eType ){.    
107d0 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a    case FTS5_AND:
107e0 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 62 72   zOp = "AND"; br
107f0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
10800 46 54 53 35 5f 4e 4f 54 3a 20 7a 4f 70 20 3d 20  FTS5_NOT: zOp = 
10810 22 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  "NOT"; break;.  
10820 20 20 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20      default: .  
10830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
10840 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  xpr->eType==FTS5
10850 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  _OR );.        z
10860 4f 70 20 3d 20 22 4f 52 22 3b 20 0a 20 20 20 20  Op = "OR"; .    
10870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10880 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 71 6c  ..    zRet = sql
10890 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
108a0 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 66 6f 72  ", zOp);.    for
108b0 28 69 3d 30 3b 20 7a 52 65 74 20 26 26 20 69 3c  (i=0; zRet && i<
108c0 70 45 78 70 72 2d 3e 6e 43 68 69 6c 64 3b 20 69  pExpr->nChild; i
108d0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
108e0 2a 7a 20 3d 20 66 74 73 35 45 78 70 72 50 72 69  *z = fts5ExprPri
108f0 6e 74 54 63 6c 28 70 43 6f 6e 66 69 67 2c 20 7a  ntTcl(pConfig, z
10900 4e 65 61 72 73 65 74 43 6d 64 2c 20 70 45 78 70  NearsetCmd, pExp
10910 72 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0a  r->apChild[i]);.
10920 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a        if( !z ){.
10930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10940 66 72 65 65 28 7a 52 65 74 29 3b 0a 20 20 20 20  free(zRet);.    
10950 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20      zRet = 0;.  
10960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10970 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72     zRet = fts5Pr
10980 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c  intfAppend(zRet,
10990 20 22 20 5b 25 7a 5d 22 2c 20 7a 29 3b 0a 20 20   " [%z]", z);.  
109a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
109b0 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
109c0 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
109d0 66 74 73 35 45 78 70 72 50 72 69 6e 74 28 46 74  fts5ExprPrint(Ft
109e0 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
109f0 67 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  g, Fts5ExprNode 
10a00 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
10a10 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *zRet = 0;.  if(
10a20 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 30   pExpr->eType==0
10a30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
10a40 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10a50 5c 22 5c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 0a  \"\"");.  }else.
10a60 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65 54 79    if( pExpr->eTy
10a70 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20  pe==FTS5_STRING 
10a80 7c 7c 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d  || pExpr->eType=
10a90 3d 46 54 53 35 5f 54 45 52 4d 20 29 7b 0a 20 20  =FTS5_TERM ){.  
10aa0 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
10ab0 74 20 2a 70 4e 65 61 72 20 3d 20 70 45 78 70 72  t *pNear = pExpr
10ac0 2d 3e 70 4e 65 61 72 3b 0a 20 20 20 20 69 6e 74  ->pNear;.    int
10ad0 20 69 3b 20 0a 20 20 20 20 69 6e 74 20 69 54 65   i; .    int iTe
10ae0 72 6d 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  rm;..    if( pNe
10af0 61 72 2d 3e 70 43 6f 6c 73 65 74 20 29 7b 0a 20  ar->pColset ){. 
10b00 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
10b10 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e  pNear->pColset->
10b20 61 69 43 6f 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  aiCol[0];.      
10b30 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74  zRet = fts5Print
10b40 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 25  fAppend(zRet, "%
10b50 73 20 3a 20 22 2c 20 70 43 6f 6e 66 69 67 2d 3e  s : ", pConfig->
10b60 61 7a 43 6f 6c 5b 69 43 6f 6c 5d 29 3b 0a 20 20  azCol[iCol]);.  
10b70 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20      if( zRet==0 
10b80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
10b90 7d 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72  }..    if( pNear
10ba0 2d 3e 6e 50 68 72 61 73 65 3e 31 20 29 7b 0a 20  ->nPhrase>1 ){. 
10bb0 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35       zRet = fts5
10bc0 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65  PrintfAppend(zRe
10bd0 74 2c 20 22 4e 45 41 52 28 22 29 3b 0a 20 20 20  t, "NEAR(");.   
10be0 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29     if( zRet==0 )
10bf0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10c00 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
10c10 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b  <pNear->nPhrase;
10c20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   i++){.      Fts
10c30 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
10c40 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70  rase = pNear->ap
10c50 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20  Phrase[i];.     
10c60 20 69 66 28 20 69 21 3d 30 20 29 7b 0a 20 20 20   if( i!=0 ){.   
10c70 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35       zRet = fts5
10c80 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65  PrintfAppend(zRe
10c90 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20 20  t, " ");.       
10ca0 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72   if( zRet==0 ) r
10cb0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
10cc0 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d  .      for(iTerm
10cd0 3d 30 3b 20 69 54 65 72 6d 3c 70 50 68 72 61 73  =0; iTerm<pPhras
10ce0 65 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  e->nTerm; iTerm+
10cf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
10d00 20 2a 7a 54 65 72 6d 20 3d 20 66 74 73 35 45 78   *zTerm = fts5Ex
10d10 70 72 54 65 72 6d 50 72 69 6e 74 28 26 70 50 68  prTermPrint(&pPh
10d20 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54 65 72  rase->aTerm[iTer
10d30 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m]);.        if(
10d40 20 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   zTerm ){.      
10d50 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50      zRet = fts5P
10d60 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74  rintfAppend(zRet
10d70 2c 20 22 25 73 25 73 22 2c 20 69 54 65 72 6d 3d  , "%s%s", iTerm=
10d80 3d 30 3f 22 22 3a 22 20 2b 20 22 2c 20 7a 54 65  =0?"":" + ", zTe
10d90 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  rm);.          s
10da0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 72  qlite3_free(zTer
10db0 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  m);.        }.  
10dc0 20 20 20 20 20 20 69 66 28 20 7a 54 65 72 6d 3d        if( zTerm=
10dd0 3d 30 20 7c 7c 20 7a 52 65 74 3d 3d 30 20 29 7b  =0 || zRet==0 ){
10de0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10df0 65 33 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a 20  e3_free(zRet);. 
10e00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10e10 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
10e20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
10e30 69 66 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61  if( pNear->nPhra
10e40 73 65 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 52  se>1 ){.      zR
10e50 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
10e60 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2c 20 25  ppend(zRet, ", %
10e70 64 29 22 2c 20 70 4e 65 61 72 2d 3e 6e 4e 65 61  d)", pNear->nNea
10e80 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  r);.      if( zR
10e90 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  et==0 ) return 0
10ea0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
10eb0 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
10ec0 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69   *zOp = 0;.    i
10ed0 6e 74 20 69 3b 0a 0a 20 20 20 20 73 77 69 74 63  nt i;..    switc
10ee0 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 20  h( pExpr->eType 
10ef0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 46 54  ){.      case FT
10f00 53 35 5f 41 4e 44 3a 20 7a 4f 70 20 3d 20 22 20  S5_AND: zOp = " 
10f10 41 4e 44 20 22 3b 20 62 72 65 61 6b 3b 0a 20 20  AND "; break;.  
10f20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 4e 4f      case FTS5_NO
10f30 54 3a 20 7a 4f 70 20 3d 20 22 20 4e 4f 54 20 22  T: zOp = " NOT "
10f40 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64  ; break;.      d
10f50 65 66 61 75 6c 74 3a 20 20 0a 20 20 20 20 20 20  efault:  .      
10f60 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
10f70 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4f 52 20  >eType==FTS5_OR 
10f80 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 70 20 3d  );.        zOp =
10f90 20 22 20 4f 52 20 22 3b 20 0a 20 20 20 20 20 20   " OR "; .      
10fa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
10fb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
10fc0 45 78 70 72 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b  Expr->nChild; i+
10fd0 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
10fe0 7a 20 3d 20 66 74 73 35 45 78 70 72 50 72 69 6e  z = fts5ExprPrin
10ff0 74 28 70 43 6f 6e 66 69 67 2c 20 70 45 78 70 72  t(pConfig, pExpr
11000 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20  ->apChild[i]);. 
11010 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
11020 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11030 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a 20 20 20  _free(zRet);.   
11040 20 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20       zRet = 0;. 
11050 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11060 20 20 20 20 69 6e 74 20 65 20 3d 20 70 45 78 70      int e = pExp
11070 72 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 2d 3e 65  r->apChild[i]->e
11080 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Type;.        in
11090 74 20 62 20 3d 20 28 65 21 3d 46 54 53 35 5f 53  t b = (e!=FTS5_S
110a0 54 52 49 4e 47 20 26 26 20 65 21 3d 46 54 53 35  TRING && e!=FTS5
110b0 5f 54 45 52 4d 20 26 26 20 65 21 3d 46 54 53 35  _TERM && e!=FTS5
110c0 5f 45 4f 46 29 3b 0a 20 20 20 20 20 20 20 20 7a  _EOF);.        z
110d0 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66  Ret = fts5Printf
110e0 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 25 73  Append(zRet, "%s
110f0 25 73 25 7a 25 73 22 2c 20 0a 20 20 20 20 20 20  %s%z%s", .      
11100 20 20 20 20 20 20 28 69 3d 3d 30 20 3f 20 22 22        (i==0 ? ""
11110 20 3a 20 7a 4f 70 29 2c 0a 20 20 20 20 20 20 20   : zOp),.       
11120 20 20 20 20 20 28 62 3f 22 28 22 3a 22 22 29 2c       (b?"(":""),
11130 20 7a 2c 20 28 62 3f 22 29 22 3a 22 22 29 0a 20   z, (b?")":""). 
11140 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
11150 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65 74  }.      if( zRet
11160 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
11170 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
11180 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
11190 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
111a0 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  on of user-defin
111b0 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
111c0 6f 6e 73 20 66 74 73 35 5f 65 78 70 72 28 29 20  ons fts5_expr() 
111d0 28 62 54 63 6c 3d 3d 30 29 0a 2a 2a 20 61 6e 64  (bTcl==0).** and
111e0 20 66 74 73 35 5f 65 78 70 72 5f 74 63 6c 28 29   fts5_expr_tcl()
111f0 20 28 62 54 63 6c 21 3d 30 29 2e 0a 2a 2f 0a 73   (bTcl!=0)..*/.s
11200 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 45  tatic void fts5E
11210 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  xprFunction(.  s
11220 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
11230 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
11240 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
11250 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
11260 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11280 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 2a  Number of args *
11290 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
112a0 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20  e **apVal,      
112b0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
112c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
112d0 6e 74 20 62 54 63 6c 0a 29 7b 0a 20 20 46 74 73  nt bTcl.){.  Fts
112e0 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c  5Global *pGlobal
112f0 20 3d 20 28 46 74 73 35 47 6c 6f 62 61 6c 2a 29   = (Fts5Global*)
11300 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
11310 61 28 70 43 74 78 29 3b 0a 20 20 73 71 6c 69 74  a(pCtx);.  sqlit
11320 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
11330 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
11340 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73  le(pCtx);.  cons
11350 74 20 63 68 61 72 20 2a 7a 45 78 70 72 20 3d 20  t char *zExpr = 
11360 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
11370 3d 20 30 3b 0a 20 20 46 74 73 35 45 78 70 72 20  = 0;.  Fts5Expr 
11380 2a 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 69 6e  *pExpr = 0;.  in
11390 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  t rc;.  int i;..
113a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
113b0 7a 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20  zConfig;        
113c0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
113d0 67 75 6d 65 6e 74 73 20 66 6f 72 20 46 74 73 35  guments for Fts5
113e0 43 6f 6e 66 69 67 20 2a 2f 0a 20 20 63 6f 6e 73  Config */.  cons
113f0 74 20 63 68 61 72 20 2a 7a 4e 65 61 72 73 65 74  t char *zNearset
11400 43 6d 64 20 3d 20 22 6e 65 61 72 73 65 74 22 3b  Cmd = "nearset";
11410 0a 20 20 69 6e 74 20 6e 43 6f 6e 66 69 67 3b 20  .  int nConfig; 
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 7a     /* Size of az
11440 43 6f 6e 66 69 67 5b 5d 20 2a 2f 0a 20 20 46 74  Config[] */.  Ft
11450 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
11460 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 41 72  g = 0;.  int iAr
11470 67 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 41  g = 1;..  if( nA
11480 72 67 3c 31 20 29 7b 0a 20 20 20 20 7a 45 72 72  rg<1 ){.    zErr
11490 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
114a0 74 66 28 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  tf("wrong number
114b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
114c0 20 66 75 6e 63 74 69 6f 6e 20 25 73 22 2c 0a 20   function %s",. 
114d0 20 20 20 20 20 20 20 62 54 63 6c 20 3f 20 22 66         bTcl ? "f
114e0 74 73 35 5f 65 78 70 72 5f 74 63 6c 22 20 3a 20  ts5_expr_tcl" : 
114f0 22 66 74 73 35 5f 65 78 70 72 22 0a 20 20 20 20  "fts5_expr".    
11500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
11510 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
11520 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 20  , zErr, -1);.   
11530 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
11540 72 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  rr);.    return;
11550 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 54 63 6c  .  }..  if( bTcl
11560 20 26 26 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20   && nArg>1 ){.  
11570 20 20 7a 4e 65 61 72 73 65 74 43 6d 64 20 3d 20    zNearsetCmd = 
11580 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
11590 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
115a0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 69  apVal[1]);.    i
115b0 41 72 67 20 3d 20 32 3b 0a 20 20 7d 0a 0a 20 20  Arg = 2;.  }..  
115c0 6e 43 6f 6e 66 69 67 20 3d 20 33 20 2b 20 28 6e  nConfig = 3 + (n
115d0 41 72 67 2d 69 41 72 67 29 3b 0a 20 20 61 7a 43  Arg-iArg);.  azC
115e0 6f 6e 66 69 67 20 3d 20 28 63 6f 6e 73 74 20 63  onfig = (const c
115f0 68 61 72 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har**)sqlite3_ma
11600 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 63 68 61 72  lloc(sizeof(char
11610 2a 29 20 2a 20 6e 43 6f 6e 66 69 67 29 3b 0a 20  *) * nConfig);. 
11620 20 69 66 28 20 61 7a 43 6f 6e 66 69 67 3d 3d 30   if( azConfig==0
11630 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
11640 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
11650 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65  em(pCtx);.    re
11660 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 7a 43 6f  turn;.  }.  azCo
11670 6e 66 69 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 61  nfig[0] = 0;.  a
11680 7a 43 6f 6e 66 69 67 5b 31 5d 20 3d 20 22 6d 61  zConfig[1] = "ma
11690 69 6e 22 3b 0a 20 20 61 7a 43 6f 6e 66 69 67 5b  in";.  azConfig[
116a0 32 5d 20 3d 20 22 74 62 6c 22 3b 0a 20 20 66 6f  2] = "tbl";.  fo
116b0 72 28 69 3d 33 3b 20 69 41 72 67 3c 6e 41 72 67  r(i=3; iArg<nArg
116c0 3b 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 61  ; iArg++){.    a
116d0 7a 43 6f 6e 66 69 67 5b 69 2b 2b 5d 20 3d 20 28  zConfig[i++] = (
116e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
116f0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
11700 70 56 61 6c 5b 69 41 72 67 5d 29 3b 0a 20 20 7d  pVal[iArg]);.  }
11710 0a 0a 20 20 7a 45 78 70 72 20 3d 20 28 63 6f 6e  ..  zExpr = (con
11720 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
11730 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
11740 6c 5b 30 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73  l[0]);..  rc = s
11750 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
11760 50 61 72 73 65 28 70 47 6c 6f 62 61 6c 2c 20 64  Parse(pGlobal, d
11770 62 2c 20 6e 43 6f 6e 66 69 67 2c 20 61 7a 43 6f  b, nConfig, azCo
11780 6e 66 69 67 2c 20 26 70 43 6f 6e 66 69 67 2c 20  nfig, &pConfig, 
11790 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63  &zErr);.  if( rc
117a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
117b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
117c0 74 73 35 45 78 70 72 4e 65 77 28 70 43 6f 6e 66  ts5ExprNew(pConf
117d0 69 67 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  ig, pConfig->nCo
117e0 6c 2c 20 7a 45 78 70 72 2c 20 26 70 45 78 70 72  l, zExpr, &pExpr
117f0 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  , &zErr);.  }.  
11800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11810 4b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  K ){.    char *z
11820 54 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 45  Text;.    if( pE
11830 78 70 72 2d 3e 70 52 6f 6f 74 2d 3e 78 4e 65 78  xpr->pRoot->xNex
11840 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 54  t==0 ){.      zT
11850 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ext = sqlite3_mp
11860 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d  rintf("");.    }
11870 65 6c 73 65 20 69 66 28 20 62 54 63 6c 20 29 7b  else if( bTcl ){
11880 0a 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 66  .      zText = f
11890 74 73 35 45 78 70 72 50 72 69 6e 74 54 63 6c 28  ts5ExprPrintTcl(
118a0 70 43 6f 6e 66 69 67 2c 20 7a 4e 65 61 72 73 65  pConfig, zNearse
118b0 74 43 6d 64 2c 20 70 45 78 70 72 2d 3e 70 52 6f  tCmd, pExpr->pRo
118c0 6f 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ot);.    }else{.
118d0 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 66 74        zText = ft
118e0 73 35 45 78 70 72 50 72 69 6e 74 28 70 43 6f 6e  s5ExprPrint(pCon
118f0 66 69 67 2c 20 70 45 78 70 72 2d 3e 70 52 6f 6f  fig, pExpr->pRoo
11900 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
11910 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
11920 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11930 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
11940 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11950 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
11960 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 53 51 4c  , zText, -1, SQL
11970 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11980 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11990 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 7d  ee(zText);.    }
119a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
119b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
119c0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
119d0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
119e0 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 45  t_error(pCtx, zE
119f0 72 72 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  rr, -1);.      s
11a00 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
11a10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11a20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
11a30 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
11a40 74 78 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  tx, rc);.    }. 
11a50 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
11a60 65 28 28 76 6f 69 64 20 2a 29 61 7a 43 6f 6e 66  e((void *)azConf
11a70 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  ig);.  sqlite3Ft
11a80 73 35 43 6f 6e 66 69 67 46 72 65 65 28 70 43 6f  s5ConfigFree(pCo
11a90 6e 66 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  nfig);.  sqlite3
11aa0 46 74 73 35 45 78 70 72 46 72 65 65 28 70 45 78  Fts5ExprFree(pEx
11ab0 70 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  pr);.}..static v
11ac0 6f 69 64 20 66 74 73 35 45 78 70 72 46 75 6e 63  oid fts5ExprFunc
11ad0 74 69 6f 6e 48 72 28 0a 20 20 73 71 6c 69 74 65  tionHr(.  sqlite
11ae0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
11af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
11b00 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
11b10 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
11b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11b30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11b40 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20 20 73  r of args */.  s
11b50 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
11b60 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
11b70 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
11b80 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 66 74 73  ents */.){.  fts
11b90 35 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 43  5ExprFunction(pC
11ba0 74 78 2c 20 6e 41 72 67 2c 20 61 70 56 61 6c 2c  tx, nArg, apVal,
11bb0 20 30 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   0);.}.static vo
11bc0 69 64 20 66 74 73 35 45 78 70 72 46 75 6e 63 74  id fts5ExprFunct
11bd0 69 6f 6e 54 63 6c 28 0a 20 20 73 71 6c 69 74 65  ionTcl(.  sqlite
11be0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
11bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
11c00 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
11c10 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
11c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11c30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11c40 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20 20 73  r of args */.  s
11c50 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
11c60 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
11c70 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
11c80 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 66 74 73  ents */.){.  fts
11c90 35 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 43  5ExprFunction(pC
11ca0 74 78 2c 20 6e 41 72 67 2c 20 61 70 56 61 6c 2c  tx, nArg, apVal,
11cb0 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   1);.}../*.** Th
11cc0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
11cd0 20 6f 66 20 61 6e 20 53 51 4c 69 74 65 20 75 73   of an SQLite us
11ce0 65 72 2d 64 65 66 69 6e 65 64 2d 66 75 6e 63 74  er-defined-funct
11cf0 69 6f 6e 20 74 68 61 74 20 61 63 63 65 70 74 73  ion that accepts
11d00 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 69 6e 74   a.** single int
11d10 65 67 65 72 20 61 73 20 61 6e 20 61 72 67 75 6d  eger as an argum
11d20 65 6e 74 2e 20 49 66 20 74 68 65 20 69 6e 74 65  ent. If the inte
11d30 67 65 72 20 69 73 20 61 6e 20 61 6c 70 68 61 2d  ger is an alpha-
11d40 6e 75 6d 65 72 69 63 20 0a 2a 2a 20 75 6e 69 63  numeric .** unic
11d50 6f 64 65 20 63 6f 64 65 20 70 6f 69 6e 74 2c 20  ode code point, 
11d60 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
11d70 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 73  therwise 0..*/.s
11d80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 45  tatic void fts5E
11d90 78 70 72 49 73 41 6c 6e 75 6d 28 0a 20 20 73 71  xprIsAlnum(.  sq
11da0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
11db0 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
11dc0 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
11dd0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
11de0 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
11df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11e00 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 2a 2f  umber of args */
11e10 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
11e20 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
11e30 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
11e40 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
11e50 20 69 6e 74 20 69 43 6f 64 65 3b 0a 20 20 75 38   int iCode;.  u8
11e60 20 61 41 72 72 5b 33 32 5d 3b 0a 20 20 69 66 28   aArr[32];.  if(
11e70 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20 20 20   nArg!=1 ){.    
11e80 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
11e90 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
11ea0 20 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65      "wrong numbe
11eb0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
11ec0 6f 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f  o function fts5_
11ed0 69 73 61 6c 6e 75 6d 22 2c 20 2d 31 0a 20 20 20  isalnum", -1.   
11ee0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
11ef0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 61 41 72    }.  memset(aAr
11f00 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 41 72  r, 0, sizeof(aAr
11f10 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  r));.  sqlite3Ft
11f20 73 35 55 6e 69 63 6f 64 65 43 61 74 50 61 72 73  s5UnicodeCatPars
11f30 65 28 22 4c 2a 22 2c 20 61 41 72 72 29 3b 0a 20  e("L*", aArr);. 
11f40 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63   sqlite3Fts5Unic
11f50 6f 64 65 43 61 74 50 61 72 73 65 28 22 4e 2a 22  odeCatParse("N*"
11f60 2c 20 61 41 72 72 29 3b 0a 20 20 73 71 6c 69 74  , aArr);.  sqlit
11f70 65 33 46 74 73 35 55 6e 69 63 6f 64 65 43 61 74  e3Fts5UnicodeCat
11f80 50 61 72 73 65 28 22 43 6f 22 2c 20 61 41 72 72  Parse("Co", aArr
11f90 29 3b 0a 20 20 69 43 6f 64 65 20 3d 20 73 71 6c  );.  iCode = sql
11fa0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
11fb0 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 73 71 6c 69  pVal[0]);.  sqli
11fc0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70  te3_result_int(p
11fd0 43 74 78 2c 20 61 41 72 72 5b 73 71 6c 69 74 65  Ctx, aArr[sqlite
11fe0 33 46 74 73 35 55 6e 69 63 6f 64 65 43 61 74 65  3Fts5UnicodeCate
11ff0 67 6f 72 79 28 69 43 6f 64 65 29 5d 29 3b 0a 7d  gory(iCode)]);.}
12000 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
12010 73 35 45 78 70 72 46 6f 6c 64 28 0a 20 20 73 71  s5ExprFold(.  sq
12020 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
12030 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
12040 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
12050 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
12060 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
12070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12080 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 2a 2f  umber of args */
12090 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
120a0 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
120b0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
120c0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
120d0 20 69 66 28 20 6e 41 72 67 21 3d 31 20 26 26 20   if( nArg!=1 && 
120e0 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 73  nArg!=2 ){.    s
120f0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
12100 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
12110 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72     "wrong number
12120 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
12130 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 66   function fts5_f
12140 6f 6c 64 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a  old", -1.    );.
12150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
12160 20 69 43 6f 64 65 3b 0a 20 20 20 20 69 6e 74 20   iCode;.    int 
12170 62 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63  bRemoveDiacritic
12180 73 20 3d 20 30 3b 0a 20 20 20 20 69 43 6f 64 65  s = 0;.    iCode
12190 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
121a0 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  _int(apVal[0]);.
121b0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
121c0 29 20 62 52 65 6d 6f 76 65 44 69 61 63 72 69 74  ) bRemoveDiacrit
121d0 69 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ics = sqlite3_va
121e0 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d  lue_int(apVal[1]
121f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
12200 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20  esult_int(pCtx, 
12210 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f  sqlite3Fts5Unico
12220 64 65 46 6f 6c 64 28 69 43 6f 64 65 2c 20 62 52  deFold(iCode, bR
12230 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 73 29  emoveDiacritics)
12240 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12250 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 64  This is called d
12260 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
12270 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 72  tion to register
12280 20 74 68 65 20 66 74 73 35 5f 65 78 70 72 28 29   the fts5_expr()
12290 20 73 63 61 6c 61 72 0a 2a 2a 20 55 44 46 20 77   scalar.** UDF w
122a0 69 74 68 20 74 68 65 20 53 51 4c 69 74 65 20 68  ith the SQLite h
122b0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
122c0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
122d0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
122e0 33 46 74 73 35 45 78 70 72 49 6e 69 74 28 46 74  3Fts5ExprInit(Ft
122f0 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61  s5Global *pGloba
12300 6c 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  l, sqlite3 *db){
12310 0a 20 20 73 74 72 75 63 74 20 46 74 73 35 45 78  .  struct Fts5Ex
12320 70 72 46 75 6e 63 20 7b 0a 20 20 20 20 63 6f 6e  prFunc {.    con
12330 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
12340 76 6f 69 64 20 28 2a 78 29 28 73 71 6c 69 74 65  void (*x)(sqlite
12350 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
12360 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b  qlite3_value**);
12370 0a 20 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b  .  } aFunc[] = {
12380 0a 20 20 20 20 7b 20 22 66 74 73 35 5f 65 78 70  .    { "fts5_exp
12390 72 22 2c 20 20 20 20 20 66 74 73 35 45 78 70 72  r",     fts5Expr
123a0 46 75 6e 63 74 69 6f 6e 48 72 20 7d 2c 0a 20 20  FunctionHr },.  
123b0 20 20 7b 20 22 66 74 73 35 5f 65 78 70 72 5f 74    { "fts5_expr_t
123c0 63 6c 22 2c 20 66 74 73 35 45 78 70 72 46 75 6e  cl", fts5ExprFun
123d0 63 74 69 6f 6e 54 63 6c 20 7d 2c 0a 20 20 20 20  ctionTcl },.    
123e0 7b 20 22 66 74 73 35 5f 69 73 61 6c 6e 75 6d 22  { "fts5_isalnum"
123f0 2c 20 20 66 74 73 35 45 78 70 72 49 73 41 6c 6e  ,  fts5ExprIsAln
12400 75 6d 20 7d 2c 0a 20 20 20 20 7b 20 22 66 74 73  um },.    { "fts
12410 35 5f 66 6f 6c 64 22 2c 20 20 20 20 20 66 74 73  5_fold",     fts
12420 35 45 78 70 72 46 6f 6c 64 20 7d 2c 0a 20 20 7d  5ExprFold },.  }
12430 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
12440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12450 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 20 3d 20  .  void *pCtx = 
12460 28 76 6f 69 64 2a 29 70 47 6c 6f 62 61 6c 3b 0a  (void*)pGlobal;.
12470 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
12480 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 41  SQLITE_OK && i<A
12490 72 72 61 79 53 69 7a 65 28 61 46 75 6e 63 29 3b  rraySize(aFunc);
124a0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
124b0 74 20 46 74 73 35 45 78 70 72 46 75 6e 63 20 2a  t Fts5ExprFunc *
124c0 70 20 3d 20 26 61 46 75 6e 63 5b 69 5d 3b 0a 20  p = &aFunc[i];. 
124d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
124e0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
124f0 64 62 2c 20 70 2d 3e 7a 2c 20 2d 31 2c 20 53 51  db, p->z, -1, SQ
12500 4c 49 54 45 5f 55 54 46 38 2c 20 70 43 74 78 2c  LITE_UTF8, pCtx,
12510 20 70 2d 3e 78 2c 20 30 2c 20 30 29 3b 0a 20 20   p->x, 0, 0);.  
12520 7d 0a 0a 20 20 2f 2a 20 41 76 6f 69 64 20 77 61  }..  /* Avoid wa
12530 72 6e 69 6e 67 73 20 69 6e 64 69 63 61 74 69 6e  rnings indicatin
12540 67 20 74 68 61 74 20 73 71 6c 69 74 65 33 46 74  g that sqlite3Ft
12550 73 35 50 61 72 73 65 72 54 72 61 63 65 28 29 20  s5ParserTrace() 
12560 61 6e 64 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  and.  ** sqlite3
12570 46 74 73 35 50 61 72 73 65 72 46 61 6c 6c 62 61  Fts5ParserFallba
12580 63 6b 28 29 20 61 72 65 20 75 6e 75 73 65 64 20  ck() are unused 
12590 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
125a0 47 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  G.  (void)sqlite
125b0 33 46 74 73 35 50 61 72 73 65 72 54 72 61 63 65  3Fts5ParserTrace
125c0 3b 0a 23 65 6e 64 69 66 0a 20 20 28 76 6f 69 64  ;.#endif.  (void
125d0 29 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73  )sqlite3Fts5Pars
125e0 65 72 46 61 6c 6c 62 61 63 6b 3b 0a 0a 20 20 72  erFallback;..  r
125f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12600 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
12610 6d 62 65 72 20 6f 66 20 70 68 72 61 73 65 73 20  mber of phrases 
12620 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  in expression pE
12630 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  xpr..*/.int sqli
12640 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73  te3Fts5ExprPhras
12650 65 43 6f 75 6e 74 28 46 74 73 35 45 78 70 72 20  eCount(Fts5Expr 
12660 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72  *pExpr){.  retur
12670 6e 20 28 70 45 78 70 72 20 3f 20 70 45 78 70 72  n (pExpr ? pExpr
12680 2d 3e 6e 50 68 72 61 73 65 20 3a 20 30 29 3b 0a  ->nPhrase : 0);.
12690 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
126a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  the number of te
126b0 72 6d 73 20 69 6e 20 74 68 65 20 69 50 68 72 61  rms in the iPhra
126c0 73 65 27 74 68 20 70 68 72 61 73 65 20 69 6e 20  se'th phrase in 
126d0 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
126e0 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72  lite3Fts5ExprPhr
126f0 61 73 65 53 69 7a 65 28 46 74 73 35 45 78 70 72  aseSize(Fts5Expr
12700 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 50 68   *pExpr, int iPh
12710 72 61 73 65 29 7b 0a 20 20 69 66 28 20 69 50 68  rase){.  if( iPh
12720 72 61 73 65 3c 30 20 7c 7c 20 69 50 68 72 61 73  rase<0 || iPhras
12730 65 3e 3d 70 45 78 70 72 2d 3e 6e 50 68 72 61 73  e>=pExpr->nPhras
12740 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
12750 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 70  return pExpr->ap
12760 45 78 70 72 50 68 72 61 73 65 5b 69 50 68 72 61  ExprPhrase[iPhra
12770 73 65 5d 2d 3e 6e 54 65 72 6d 3b 0a 7d 0a 0a 2f  se]->nTerm;.}../
12780 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12790 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 63  on is used to ac
127a0 63 65 73 73 20 74 68 65 20 63 75 72 72 65 6e 74  cess the current
127b0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
127c0 6f 72 20 70 68 72 61 73 65 0a 2a 2a 20 69 50 68  or phrase.** iPh
127d0 72 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rase..*/.int sql
127e0 69 74 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c  ite3Fts5ExprPosl
127f0 69 73 74 28 46 74 73 35 45 78 70 72 20 2a 70 45  ist(Fts5Expr *pE
12800 78 70 72 2c 20 69 6e 74 20 69 50 68 72 61 73 65  xpr, int iPhrase
12810 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 29  , const u8 **pa)
12820 7b 0a 20 20 69 6e 74 20 6e 52 65 74 3b 0a 20 20  {.  int nRet;.  
12830 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
12840 70 50 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d  pPhrase = pExpr-
12850 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 50  >apExprPhrase[iP
12860 68 72 61 73 65 5d 3b 0a 20 20 46 74 73 35 45 78  hrase];.  Fts5Ex
12870 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20  prNode *pNode = 
12880 70 50 68 72 61 73 65 2d 3e 70 4e 6f 64 65 3b 0a  pPhrase->pNode;.
12890 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f    if( pNode->bEo
128a0 66 3d 3d 30 20 26 26 20 70 4e 6f 64 65 2d 3e 69  f==0 && pNode->i
128b0 52 6f 77 69 64 3d 3d 70 45 78 70 72 2d 3e 70 52  Rowid==pExpr->pR
128c0 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20  oot->iRowid ){. 
128d0 20 20 20 2a 70 61 20 3d 20 70 50 68 72 61 73 65     *pa = pPhrase
128e0 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
128f0 20 6e 52 65 74 20 3d 20 70 50 68 72 61 73 65 2d   nRet = pPhrase-
12900 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 65  >poslist.n;.  }e
12910 6c 73 65 7b 0a 20 20 20 20 2a 70 61 20 3d 20 30  lse{.    *pa = 0
12920 3b 0a 20 20 20 20 6e 52 65 74 20 3d 20 30 3b 0a  ;.    nRet = 0;.
12930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65    }.  return nRe
12940 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 46 74 73  t;.}..struct Fts
12950 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f  5PoslistPopulato
12960 72 20 7b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73  r {.  Fts5Poslis
12970 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  tWriter writer;.
12980 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20    int bOk;      
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6b 20    /* True if ok 
129b0 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20  to populate */. 
129c0 20 69 6e 74 20 62 4d 69 73 73 3b 0a 7d 3b 0a 0a   int bMiss;.};..
129d0 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
129e0 61 74 6f 72 20 2a 73 71 6c 69 74 65 33 46 74 73  ator *sqlite3Fts
129f0 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73  5ExprClearPoslis
12a00 74 73 28 46 74 73 35 45 78 70 72 20 2a 70 45 78  ts(Fts5Expr *pEx
12a10 70 72 2c 20 69 6e 74 20 62 4c 69 76 65 29 7b 0a  pr, int bLive){.
12a20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70    Fts5PoslistPop
12a30 75 6c 61 74 6f 72 20 2a 70 52 65 74 3b 0a 20 20  ulator *pRet;.  
12a40 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pRet = sqlite3_m
12a50 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73  alloc(sizeof(Fts
12a60 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f  5PoslistPopulato
12a70 72 29 2a 70 45 78 70 72 2d 3e 6e 50 68 72 61 73  r)*pExpr->nPhras
12a80 65 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  e);.  if( pRet )
12a90 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
12aa0 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c   memset(pRet, 0,
12ab0 20 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c   sizeof(Fts5Posl
12ac0 69 73 74 50 6f 70 75 6c 61 74 6f 72 29 2a 70 45  istPopulator)*pE
12ad0 78 70 72 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20  xpr->nPhrase);. 
12ae0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
12af0 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  xpr->nPhrase; i+
12b00 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 42 75  +){.      Fts5Bu
12b10 66 66 65 72 20 2a 70 42 75 66 20 3d 20 26 70 45  ffer *pBuf = &pE
12b20 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73  xpr->apExprPhras
12b30 65 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74 3b 0a 20  e[i]->poslist;. 
12b40 20 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64       Fts5ExprNod
12b50 65 20 2a 70 4e 6f 64 65 20 3d 20 70 45 78 70 72  e *pNode = pExpr
12b60 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b 69  ->apExprPhrase[i
12b70 5d 2d 3e 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20  ]->pNode;.      
12b80 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
12b90 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e  pExprPhrase[i]->
12ba0 6e 54 65 72 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  nTerm==1 );.    
12bb0 20 20 69 66 28 20 62 4c 69 76 65 20 26 26 20 0a    if( bLive && .
12bc0 20 20 20 20 20 20 20 20 20 20 28 70 42 75 66 2d            (pBuf-
12bd0 3e 6e 3d 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e  >n==0 || pNode->
12be0 69 52 6f 77 69 64 21 3d 70 45 78 70 72 2d 3e 70  iRowid!=pExpr->p
12bf0 52 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 7c 7c 20  Root->iRowid || 
12c00 70 4e 6f 64 65 2d 3e 62 45 6f 66 29 0a 20 20 20  pNode->bEof).   
12c10 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52     ){.        pR
12c20 65 74 5b 69 5d 2e 62 4d 69 73 73 20 3d 20 31 3b  et[i].bMiss = 1;
12c30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12c40 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20        pBuf->n = 
12c50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
12c60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
12c70 65 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 46 74  et;.}..struct Ft
12c80 73 35 45 78 70 72 43 74 78 20 7b 0a 20 20 46 74  s5ExprCtx {.  Ft
12c90 73 35 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20  s5Expr *pExpr;. 
12ca0 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75   Fts5PoslistPopu
12cb0 6c 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f  lator *aPopulato
12cc0 72 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a 7d  r;.  i64 iOff;.}
12cd0 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
12ce0 20 46 74 73 35 45 78 70 72 43 74 78 20 46 74 73   Fts5ExprCtx Fts
12cf0 35 45 78 70 72 43 74 78 3b 0a 0a 2f 2a 0a 2a 2a  5ExprCtx;../*.**
12d00 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73   TODO: Make this
12d10 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21   more efficient!
12d20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12d30 74 73 35 45 78 70 72 43 6f 6c 73 65 74 54 65 73  ts5ExprColsetTes
12d40 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43  t(Fts5Colset *pC
12d50 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29  olset, int iCol)
12d60 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
12d70 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
12d80 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
12d90 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69   if( pColset->ai
12da0 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72  Col[i]==iCol ) r
12db0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
12dc0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
12dd0 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 50  ic int fts5ExprP
12de0 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74 73 43  opulatePoslistsC
12df0 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b(.  void *pCtx,
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 2f 2a 20 43 6f 70 79 20 6f 66 20 32 6e 64 20 61  /* Copy of 2nd a
12e20 72 67 75 6d 65 6e 74 20 74 6f 20 78 54 6f 6b 65  rgument to xToke
12e30 6e 69 7a 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20  nize() */.  int 
12e40 74 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  tflags,         
12e50 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
12e60 66 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66  f FTS5_TOKEN_* f
12e70 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
12e80 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  char *pToken,   
12e90 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
12ea0 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
12eb0 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ning token */.  
12ec0 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
12ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
12ee0 7a 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62  ze of token in b
12ef0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 55  ytes */.  int iU
12f00 6e 75 73 65 64 31 2c 20 20 20 20 20 20 20 20 20  nused1,         
12f10 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
12f20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  set of token wit
12f30 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20 2a  hin input text *
12f40 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64 32  /.  int iUnused2
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12f60 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66  * Byte offset of
12f70 20 65 6e 64 20 6f 66 20 74 6f 6b 65 6e 20 77 69   end of token wi
12f80 74 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20  thin input text 
12f90 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72  */.){.  Fts5Expr
12fa0 43 74 78 20 2a 70 20 3d 20 28 46 74 73 35 45 78  Ctx *p = (Fts5Ex
12fb0 70 72 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 46  prCtx*)pCtx;.  F
12fc0 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d  ts5Expr *pExpr =
12fd0 20 70 2d 3e 70 45 78 70 72 3b 0a 20 20 69 6e 74   p->pExpr;.  int
12fe0 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
12ff0 52 41 4d 32 28 69 55 6e 75 73 65 64 31 2c 20 69  RAM2(iUnused1, i
13000 55 6e 75 73 65 64 32 29 3b 0a 0a 20 20 69 66 28  Unused2);..  if(
13010 20 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58   nToken>FTS5_MAX
13020 5f 54 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54  _TOKEN_SIZE ) nT
13030 6f 6b 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f  oken = FTS5_MAX_
13040 54 4f 4b 45 4e 5f 53 49 5a 45 3b 0a 20 20 69 66  TOKEN_SIZE;.  if
13050 28 20 28 74 66 6c 61 67 73 20 26 20 46 54 53 35  ( (tflags & FTS5
13060 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44  _TOKEN_COLOCATED
13070 29 3d 3d 30 20 29 20 70 2d 3e 69 4f 66 66 2b 2b  )==0 ) p->iOff++
13080 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13090 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69  Expr->nPhrase; i
130a0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70  ++){.    Fts5Exp
130b0 72 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  rTerm *pTerm;.  
130c0 20 20 69 66 28 20 70 2d 3e 61 50 6f 70 75 6c 61    if( p->aPopula
130d0 74 6f 72 5b 69 5d 2e 62 4f 6b 3d 3d 30 20 29 20  tor[i].bOk==0 ) 
130e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
130f0 72 28 70 54 65 72 6d 3d 26 70 45 78 70 72 2d 3e  r(pTerm=&pExpr->
13100 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d  apExprPhrase[i]-
13110 3e 61 54 65 72 6d 5b 30 5d 3b 20 70 54 65 72 6d  >aTerm[0]; pTerm
13120 3b 20 70 54 65 72 6d 3d 70 54 65 72 6d 2d 3e 70  ; pTerm=pTerm->p
13130 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20  Synonym){.      
13140 69 6e 74 20 6e 54 65 72 6d 20 3d 20 28 69 6e 74  int nTerm = (int
13150 29 73 74 72 6c 65 6e 28 70 54 65 72 6d 2d 3e 7a  )strlen(pTerm->z
13160 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Term);.      if(
13170 20 28 6e 54 65 72 6d 3d 3d 6e 54 6f 6b 65 6e 20   (nTerm==nToken 
13180 7c 7c 20 28 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  || (nTerm<nToken
13190 20 26 26 20 70 54 65 72 6d 2d 3e 62 50 72 65 66   && pTerm->bPref
131a0 69 78 29 29 0a 20 20 20 20 20 20 20 26 26 20 6d  ix)).       && m
131b0 65 6d 63 6d 70 28 70 54 65 72 6d 2d 3e 7a 54 65  emcmp(pTerm->zTe
131c0 72 6d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 65 72  rm, pToken, nTer
131d0 6d 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  m)==0.      ){. 
131e0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
131f0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
13200 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 0a  stWriterAppend(.
13210 20 20 20 20 20 20 20 20 20 20 20 20 26 70 45 78              &pEx
13220 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  pr->apExprPhrase
13230 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74 2c 20 26 70  [i]->poslist, &p
13240 2d 3e 61 50 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e  ->aPopulator[i].
13250 77 72 69 74 65 72 2c 20 70 2d 3e 69 4f 66 66 0a  writer, p->iOff.
13260 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
13270 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13280 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 62  rn rc;.        b
13290 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
132a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
132b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69   SQLITE_OK;.}..i
132c0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
132d0 70 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73  prPopulatePoslis
132e0 74 73 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  ts(.  Fts5Config
132f0 20 2a 70 43 6f 6e 66 69 67 2c 0a 20 20 46 74 73   *pConfig,.  Fts
13300 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20  5Expr *pExpr, . 
13310 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75   Fts5PoslistPopu
13320 6c 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f  lator *aPopulato
13330 72 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a  r,.  int iCol, .
13340 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
13350 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 6e 74 20   int n.){.  int 
13360 69 3b 0a 20 20 46 74 73 35 45 78 70 72 43 74 78  i;.  Fts5ExprCtx
13370 20 73 43 74 78 3b 0a 20 20 73 43 74 78 2e 70 45   sCtx;.  sCtx.pE
13380 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73  xpr = pExpr;.  s
13390 43 74 78 2e 61 50 6f 70 75 6c 61 74 6f 72 20 3d  Ctx.aPopulator =
133a0 20 61 50 6f 70 75 6c 61 74 6f 72 3b 0a 20 20 73   aPopulator;.  s
133b0 43 74 78 2e 69 4f 66 66 20 3d 20 28 28 28 69 36  Ctx.iOff = (((i6
133c0 34 29 69 43 6f 6c 29 20 3c 3c 20 33 32 29 20 2d  4)iCol) << 32) -
133d0 20 31 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   1;..  for(i=0; 
133e0 69 3c 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65  i<pExpr->nPhrase
133f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
13400 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  ExprNode *pNode 
13410 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50  = pExpr->apExprP
13420 68 72 61 73 65 5b 69 5d 2d 3e 70 4e 6f 64 65 3b  hrase[i]->pNode;
13430 0a 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20  .    Fts5Colset 
13440 2a 70 43 6f 6c 73 65 74 20 3d 20 70 4e 6f 64 65  *pColset = pNode
13450 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  ->pNear->pColset
13460 3b 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 73  ;.    if( (pCols
13470 65 74 20 26 26 20 30 3d 3d 66 74 73 35 45 78 70  et && 0==fts5Exp
13480 72 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c  rColsetTest(pCol
13490 73 65 74 2c 20 69 43 6f 6c 29 29 20 0a 20 20 20  set, iCol)) .   
134a0 20 20 7c 7c 20 61 50 6f 70 75 6c 61 74 6f 72 5b    || aPopulator[
134b0 69 5d 2e 62 4d 69 73 73 0a 20 20 20 20 29 7b 0a  i].bMiss.    ){.
134c0 20 20 20 20 20 20 61 50 6f 70 75 6c 61 74 6f 72        aPopulator
134d0 5b 69 5d 2e 62 4f 6b 20 3d 20 30 3b 0a 20 20 20  [i].bOk = 0;.   
134e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 50   }else{.      aP
134f0 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e 62 4f 6b 20  opulator[i].bOk 
13500 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
13510 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
13520 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f  Fts5Tokenize(pCo
13530 6e 66 69 67 2c 20 0a 20 20 20 20 20 20 46 54 53  nfig, .      FTS
13540 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d  5_TOKENIZE_DOCUM
13550 45 4e 54 2c 20 7a 2c 20 6e 2c 20 28 76 6f 69 64  ENT, z, n, (void
13560 2a 29 26 73 43 74 78 2c 20 66 74 73 35 45 78 70  *)&sCtx, fts5Exp
13570 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74  rPopulatePoslist
13580 73 43 62 0a 20 20 29 3b 0a 7d 0a 0a 73 74 61 74  sCb.  );.}..stat
13590 69 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72  ic void fts5Expr
135a0 43 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 46 74  ClearPoslists(Ft
135b0 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
135c0 65 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  e){.  if( pNode-
135d0 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
135e0 4d 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70  M || pNode->eTyp
135f0 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 29  e==FTS5_STRING )
13600 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65  {.    pNode->pNe
13610 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
13620 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a  >poslist.n = 0;.
13630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
13640 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13650 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
13660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
13670 73 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69  s5ExprClearPosli
13680 73 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69  sts(pNode->apChi
13690 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ld[i]);.    }.  
136a0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
136b0 66 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73  fts5ExprCheckPos
136c0 6c 69 73 74 73 28 46 74 73 35 45 78 70 72 4e 6f  lists(Fts5ExprNo
136d0 64 65 20 2a 70 4e 6f 64 65 2c 20 69 36 34 20 69  de *pNode, i64 i
136e0 52 6f 77 69 64 29 7b 0a 20 20 70 4e 6f 64 65 2d  Rowid){.  pNode-
136f0 3e 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  >iRowid = iRowid
13700 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20  ;.  pNode->bEof 
13710 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  = 0;.  switch( p
13720 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20  Node->eType ){. 
13730 20 20 20 63 61 73 65 20 46 54 53 35 5f 54 45 52     case FTS5_TER
13740 4d 3a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35  M:.    case FTS5
13750 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 72  _STRING:.      r
13760 65 74 75 72 6e 20 28 70 4e 6f 64 65 2d 3e 70 4e  eturn (pNode->pN
13770 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
13780 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3e 30 29 3b 0a  ->poslist.n>0);.
13790 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41  .    case FTS5_A
137a0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
137b0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
137c0 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
137d0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; i++){.       
137e0 20 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65   if( fts5ExprChe
137f0 63 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65  ckPoslists(pNode
13800 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52  ->apChild[i], iR
13810 6f 77 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  owid)==0 ){.    
13820 20 20 20 20 20 20 66 74 73 35 45 78 70 72 43 6c        fts5ExprCl
13830 65 61 72 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64  earPoslists(pNod
13840 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
13850 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
13860 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13870 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
13880 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20    case FTS5_OR: 
13890 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
138a0 20 20 20 20 20 69 6e 74 20 62 52 65 74 20 3d 20       int bRet = 
138b0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  0;.      for(i=0
138c0 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
138d0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; i++){.       
138e0 20 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65   if( fts5ExprChe
138f0 63 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65  ckPoslists(pNode
13900 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52  ->apChild[i], iR
13910 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20  owid) ){.       
13920 20 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20     bRet = 1;.   
13930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13940 20 20 20 20 20 72 65 74 75 72 6e 20 62 52 65 74       return bRet
13950 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66  ;.    }..    def
13960 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
13970 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79  sert( pNode->eTy
13980 70 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29 3b 0a  pe==FTS5_NOT );.
13990 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73        if( 0==fts
139a0 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73  5ExprCheckPoslis
139b0 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c  ts(pNode->apChil
139c0 64 5b 30 5d 2c 20 69 52 6f 77 69 64 29 0a 20 20  d[0], iRowid).  
139d0 20 20 20 20 20 20 20 20 7c 7c 20 30 21 3d 66 74          || 0!=ft
139e0 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69  s5ExprCheckPosli
139f0 73 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69  sts(pNode->apChi
13a00 6c 64 5b 31 5d 2c 20 69 52 6f 77 69 64 29 0a 20  ld[1], iRowid). 
13a10 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
13a20 20 20 66 74 73 35 45 78 70 72 43 6c 65 61 72 50    fts5ExprClearP
13a30 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 29 3b 0a  oslists(pNode);.
13a40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
13a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13a60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
13a70 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13a80 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
13a90 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74  ExprCheckPoslist
13aa0 73 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70  s(Fts5Expr *pExp
13ab0 72 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  r, i64 iRowid){.
13ac0 20 20 66 74 73 35 45 78 70 72 43 68 65 63 6b 50    fts5ExprCheckP
13ad0 6f 73 6c 69 73 74 73 28 70 45 78 70 72 2d 3e 70  oslists(pExpr->p
13ae0 52 6f 6f 74 2c 20 69 52 6f 77 69 64 29 3b 0a 7d  Root, iRowid);.}
13af0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
13b00 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
13b10 6c 6c 65 64 20 66 6f 72 20 64 65 74 61 69 6c 3d  lled for detail=
13b20 63 6f 6c 75 6d 6e 73 20 74 61 62 6c 65 73 2e 20  columns tables. 
13b30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
13b40 74 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 6c  ts5ExprPhraseCol
13b50 6c 69 73 74 28 0a 20 20 46 74 73 35 45 78 70 72  list(.  Fts5Expr
13b60 20 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e 74 20   *pExpr, .  int 
13b70 69 50 68 72 61 73 65 2c 20 0a 20 20 63 6f 6e 73  iPhrase, .  cons
13b80 74 20 75 38 20 2a 2a 70 70 43 6f 6c 6c 69 73 74  t u8 **ppCollist
13b90 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 6c  , .  int *pnColl
13ba0 69 73 74 0a 29 7b 0a 20 20 46 74 73 35 45 78 70  ist.){.  Fts5Exp
13bb0 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
13bc0 20 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72   = pExpr->apExpr
13bd0 50 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d 3b  Phrase[iPhrase];
13be0 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
13bf0 2a 70 4e 6f 64 65 20 3d 20 70 50 68 72 61 73 65  *pNode = pPhrase
13c00 2d 3e 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ->pNode;.  int r
13c10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
13c20 20 20 61 73 73 65 72 74 28 20 69 50 68 72 61 73    assert( iPhras
13c30 65 3e 3d 30 20 26 26 20 69 50 68 72 61 73 65 3c  e>=0 && iPhrase<
13c40 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 20 29  pExpr->nPhrase )
13c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
13c60 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  r->pConfig->eDet
13c70 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
13c80 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 0a 20 20 69  _COLUMNS );..  i
13c90 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d  f( pNode->bEof==
13ca0 30 20 0a 20 20 20 26 26 20 70 4e 6f 64 65 2d 3e  0 .   && pNode->
13cb0 69 52 6f 77 69 64 3d 3d 70 45 78 70 72 2d 3e 70  iRowid==pExpr->p
13cc0 52 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 0a 20 20  Root->iRowid .  
13cd0 20 26 26 20 70 50 68 72 61 73 65 2d 3e 70 6f 73   && pPhrase->pos
13ce0 6c 69 73 74 2e 6e 3e 30 0a 20 20 29 7b 0a 20 20  list.n>0.  ){.  
13cf0 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
13d00 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
13d10 2d 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  ->aTerm[0];.    
13d20 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  if( pTerm->pSyno
13d30 6e 79 6d 20 29 7b 0a 20 20 20 20 20 20 46 74 73  nym ){.      Fts
13d40 35 42 75 66 66 65 72 20 2a 70 42 75 66 20 3d 20  5Buffer *pBuf = 
13d50 28 46 74 73 35 42 75 66 66 65 72 2a 29 26 70 54  (Fts5Buffer*)&pT
13d60 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 5b 31 5d  erm->pSynonym[1]
13d70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
13d80 35 45 78 70 72 53 79 6e 6f 6e 79 6d 4c 69 73 74  5ExprSynonymList
13d90 28 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  (.          pTer
13da0 6d 2c 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64  m, pNode->iRowid
13db0 2c 20 70 42 75 66 2c 20 28 75 38 2a 2a 29 70 70  , pBuf, (u8**)pp
13dc0 43 6f 6c 6c 69 73 74 2c 20 70 6e 43 6f 6c 6c 69  Collist, pnColli
13dd0 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
13de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
13df0 43 6f 6c 6c 69 73 74 20 3d 20 70 50 68 72 61 73  Collist = pPhras
13e00 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65  e->aTerm[0].pIte
13e10 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  r->pData;.      
13e20 2a 70 6e 43 6f 6c 6c 69 73 74 20 3d 20 70 50 68  *pnCollist = pPh
13e30 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70  rase->aTerm[0].p
13e40 49 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 20 20 20  Iter->nData;.   
13e50 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13e60 2a 70 70 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a  *ppCollist = 0;.
13e70 20 20 20 20 2a 70 6e 43 6f 6c 6c 69 73 74 20 3d      *pnCollist =
13e80 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
13e90 6e 20 72 63 3b 0a 7d 0a 0a                       n rc;.}..