/ Hex Artifact Content
Login

Artifact 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65:


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 36 34 28 28 73 71 6c  e3_malloc64((sql
18e0: 69 74 65 33 5f 69 6e 74 36 34 29 74 29 3b 7d 0a  ite3_int64)t);}.
18f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1900: 50 61 72 73 65 46 72 65 65 28 76 6f 69 64 20 2a  ParseFree(void *
1910: 70 29 7b 20 73 71 6c 69 74 65 33 5f 66 72 65 65  p){ sqlite3_free
1920: 28 70 29 3b 20 7d 0a 0a 69 6e 74 20 73 71 6c 69  (p); }..int sqli
1930: 74 65 33 46 74 73 35 45 78 70 72 4e 65 77 28 0a  te3Fts5ExprNew(.
1940: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
1950: 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20  onfig,          
1960: 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69 67    /* FTS5 Config
1970: 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  uration */.  int
1980: 20 69 43 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20 63   iCol,.  const c
1990: 68 61 72 20 2a 7a 45 78 70 72 2c 20 20 20 20 20  har *zExpr,     
19a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
19b0: 65 73 73 69 6f 6e 20 74 65 78 74 20 2a 2f 0a 20  ession text */. 
19c0: 20 46 74 73 35 45 78 70 72 20 2a 2a 70 70 4e 65   Fts5Expr **ppNe
19d0: 77 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  w, .  char **pzE
19e0: 72 72 0a 29 7b 0a 20 20 46 74 73 35 50 61 72 73  rr.){.  Fts5Pars
19f0: 65 20 73 50 61 72 73 65 3b 0a 20 20 46 74 73 35  e sParse;.  Fts5
1a00: 54 6f 6b 65 6e 20 74 6f 6b 65 6e 3b 0a 20 20 63  Token token;.  c
1a10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
1a20: 45 78 70 72 3b 0a 20 20 69 6e 74 20 74 3b 20 20  Expr;.  int t;  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1a50: 74 6f 6b 65 6e 20 74 79 70 65 20 2a 2f 0a 20 20  token type */.  
1a60: 76 6f 69 64 20 2a 70 45 6e 67 69 6e 65 3b 0a 20  void *pEngine;. 
1a70: 20 46 74 73 35 45 78 70 72 20 2a 70 4e 65 77 3b   Fts5Expr *pNew;
1a80: 0a 0a 20 20 2a 70 70 4e 65 77 20 3d 20 30 3b 0a  ..  *ppNew = 0;.
1a90: 20 20 2a 70 7a 45 72 72 20 3d 20 30 3b 0a 20 20    *pzErr = 0;.  
1aa0: 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20  memset(&sParse, 
1ab0: 30 2c 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65  0, sizeof(sParse
1ac0: 29 29 3b 0a 20 20 70 45 6e 67 69 6e 65 20 3d 20  ));.  pEngine = 
1ad0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
1ae0: 72 41 6c 6c 6f 63 28 66 74 73 35 50 61 72 73 65  rAlloc(fts5Parse
1af0: 41 6c 6c 6f 63 29 3b 0a 20 20 69 66 28 20 70 45  Alloc);.  if( pE
1b00: 6e 67 69 6e 65 3d 3d 30 20 29 7b 20 72 65 74 75  ngine==0 ){ retu
1b10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1b20: 20 7d 0a 20 20 73 50 61 72 73 65 2e 70 43 6f 6e   }.  sParse.pCon
1b30: 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 0a  fig = pConfig;..
1b40: 20 20 64 6f 20 7b 0a 20 20 20 20 74 20 3d 20 66    do {.    t = f
1b50: 74 73 35 45 78 70 72 47 65 74 54 6f 6b 65 6e 28  ts5ExprGetToken(
1b60: 26 73 50 61 72 73 65 2c 20 26 7a 2c 20 26 74 6f  &sParse, &z, &to
1b70: 6b 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ken);.    sqlite
1b80: 33 46 74 73 35 50 61 72 73 65 72 28 70 45 6e 67  3Fts5Parser(pEng
1b90: 69 6e 65 2c 20 74 2c 20 74 6f 6b 65 6e 2c 20 26  ine, t, token, &
1ba0: 73 50 61 72 73 65 29 3b 0a 20 20 7d 77 68 69 6c  sParse);.  }whil
1bb0: 65 28 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51  e( sParse.rc==SQ
1bc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 74 21 3d 46 54  LITE_OK && t!=FT
1bd0: 53 35 5f 45 4f 46 20 29 3b 0a 20 20 73 71 6c 69  S5_EOF );.  sqli
1be0: 74 65 33 46 74 73 35 50 61 72 73 65 72 46 72 65  te3Fts5ParserFre
1bf0: 65 28 70 45 6e 67 69 6e 65 2c 20 66 74 73 35 50  e(pEngine, fts5P
1c00: 61 72 73 65 46 72 65 65 29 3b 0a 0a 20 20 2f 2a  arseFree);..  /*
1c10: 20 49 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   If the LHS of t
1c20: 68 65 20 4d 41 54 43 48 20 65 78 70 72 65 73 73  he MATCH express
1c30: 69 6f 6e 20 77 61 73 20 61 20 75 73 65 72 20 63  ion was a user c
1c40: 6f 6c 75 6d 6e 2c 20 61 70 70 6c 79 20 74 68 65  olumn, apply the
1c50: 0a 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 63  .  ** implicit c
1c60: 6f 6c 75 6d 6e 2d 66 69 6c 74 65 72 2e 20 20 2a  olumn-filter.  *
1c70: 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 70 43 6f  /.  if( iCol<pCo
1c80: 6e 66 69 67 2d 3e 6e 43 6f 6c 20 26 26 20 73 50  nfig->nCol && sP
1c90: 61 72 73 65 2e 70 45 78 70 72 20 26 26 20 73 50  arse.pExpr && sP
1ca0: 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f  arse.rc==SQLITE_
1cb0: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  OK ){.    int n 
1cc0: 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c  = sizeof(Fts5Col
1cd0: 73 65 74 29 3b 0a 20 20 20 20 46 74 73 35 43 6f  set);.    Fts5Co
1ce0: 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20  lset *pColset = 
1cf0: 28 46 74 73 35 43 6f 6c 73 65 74 2a 29 73 71 6c  (Fts5Colset*)sql
1d00: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
1d10: 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c 20 6e  ro(&sParse.rc, n
1d20: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  );.    if( pCols
1d30: 65 74 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  et ){.      pCol
1d40: 73 65 74 2d 3e 6e 43 6f 6c 20 3d 20 31 3b 0a 20  set->nCol = 1;. 
1d50: 20 20 20 20 20 70 43 6f 6c 73 65 74 2d 3e 61 69       pColset->ai
1d60: 43 6f 6c 5b 30 5d 20 3d 20 69 43 6f 6c 3b 0a 20  Col[0] = iCol;. 
1d70: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d80: 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28 26  ParseSetColset(&
1d90: 73 50 61 72 73 65 2c 20 73 50 61 72 73 65 2e 70  sParse, sParse.p
1da0: 45 78 70 72 2c 20 70 43 6f 6c 73 65 74 29 3b 0a  Expr, pColset);.
1db0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1dc0: 65 72 74 28 20 73 50 61 72 73 65 2e 72 63 21 3d  ert( sParse.rc!=
1dd0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 50 61  SQLITE_OK || sPa
1de0: 72 73 65 2e 7a 45 72 72 3d 3d 30 20 29 3b 0a 20  rse.zErr==0 );. 
1df0: 20 69 66 28 20 73 50 61 72 73 65 2e 72 63 3d 3d   if( sParse.rc==
1e00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e10: 20 2a 70 70 4e 65 77 20 3d 20 70 4e 65 77 20 3d   *ppNew = pNew =
1e20: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1e30: 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 29  sizeof(Fts5Expr)
1e40: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1e50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 50 61 72  =0 ){.      sPar
1e60: 73 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  se.rc = SQLITE_N
1e70: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 73 71 6c 69  OMEM;.      sqli
1e80: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
1e90: 46 72 65 65 28 73 50 61 72 73 65 2e 70 45 78 70  Free(sParse.pExp
1ea0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
1eb0: 20 20 20 20 20 69 66 28 20 21 73 50 61 72 73 65       if( !sParse
1ec0: 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  .pExpr ){.      
1ed0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79 74    const int nByt
1ee0: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45  e = sizeof(Fts5E
1ef0: 78 70 72 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  xprNode);.      
1f00: 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20 3d 20    pNew->pRoot = 
1f10: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 73  (Fts5ExprNode*)s
1f20: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
1f30: 5a 65 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c  Zero(&sParse.rc,
1f40: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
1f50: 20 69 66 28 20 70 4e 65 77 2d 3e 70 52 6f 6f 74   if( pNew->pRoot
1f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
1f70: 65 77 2d 3e 70 52 6f 6f 74 2d 3e 62 45 6f 66 20  ew->pRoot->bEof 
1f80: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
1f90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fa0: 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20      pNew->pRoot 
1fb0: 3d 20 73 50 61 72 73 65 2e 70 45 78 70 72 3b 0a  = sParse.pExpr;.
1fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
1fd0: 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ew->pIndex = 0;.
1fe0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6e        pNew->pCon
1ff0: 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20  fig = pConfig;. 
2000: 20 20 20 20 20 70 4e 65 77 2d 3e 61 70 45 78 70       pNew->apExp
2010: 72 50 68 72 61 73 65 20 3d 20 73 50 61 72 73 65  rPhrase = sParse
2020: 2e 61 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20  .apPhrase;.     
2030: 20 70 4e 65 77 2d 3e 6e 50 68 72 61 73 65 20 3d   pNew->nPhrase =
2040: 20 73 50 61 72 73 65 2e 6e 50 68 72 61 73 65 3b   sParse.nPhrase;
2050: 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e 61 70  .      sParse.ap
2060: 50 68 72 61 73 65 20 3d 20 30 3b 0a 20 20 20 20  Phrase = 0;.    
2070: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
2080: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
2090: 6f 64 65 46 72 65 65 28 73 50 61 72 73 65 2e 70  odeFree(sParse.p
20a0: 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  Expr);.  }..  sq
20b0: 6c 69 74 65 33 5f 66 72 65 65 28 73 50 61 72 73  lite3_free(sPars
20c0: 65 2e 61 70 50 68 72 61 73 65 29 3b 0a 20 20 2a  e.apPhrase);.  *
20d0: 70 7a 45 72 72 20 3d 20 73 50 61 72 73 65 2e 7a  pzErr = sParse.z
20e0: 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 50  Err;.  return sP
20f0: 61 72 73 65 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  arse.rc;.}../*.*
2100: 2a 20 46 72 65 65 20 74 68 65 20 65 78 70 72 65  * Free the expre
2110: 73 73 69 6f 6e 20 6e 6f 64 65 20 6f 62 6a 65 63  ssion node objec
2120: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2130: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
2140: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
2150: 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
2160: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 29  Fts5ExprNode *p)
2170: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
2180: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
2190: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64  i=0; i<p->nChild
21a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
21b0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
21c0: 64 65 46 72 65 65 28 70 2d 3e 61 70 43 68 69 6c  deFree(p->apChil
21d0: 64 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  d[i]);.    }.   
21e0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
21f0: 65 4e 65 61 72 73 65 74 46 72 65 65 28 70 2d 3e  eNearsetFree(p->
2200: 70 4e 65 61 72 29 3b 0a 20 20 20 20 73 71 6c 69  pNear);.    sqli
2210: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
2220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
2230: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62  he expression ob
2240: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
2250: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
2260: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2270: 33 46 74 73 35 45 78 70 72 46 72 65 65 28 46 74  3Fts5ExprFree(Ft
2280: 73 35 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  s5Expr *p){.  if
2290: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
22a0: 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46  e3Fts5ParseNodeF
22b0: 72 65 65 28 70 2d 3e 70 52 6f 6f 74 29 3b 0a 20  ree(p->pRoot);. 
22c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22d0: 70 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 29  p->apExprPhrase)
22e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22f0: 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
2300: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 54 65  .** Argument pTe
2310: 72 6d 20 6d 75 73 74 20 62 65 20 61 20 73 79 6e  rm must be a syn
2320: 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e 20 52  onym iterator. R
2330: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
2340: 74 20 72 6f 77 69 64 0a 2a 2a 20 74 68 61 74 20  t rowid.** that 
2350: 69 74 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  it points to..*/
2360: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
2370: 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64  ExprSynonymRowid
2380: 28 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70  (Fts5ExprTerm *p
2390: 54 65 72 6d 2c 20 69 6e 74 20 62 44 65 73 63 2c  Term, int bDesc,
23a0: 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20 20   int *pbEof){.  
23b0: 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a 20 20  i64 iRet = 0;.  
23c0: 69 6e 74 20 62 52 65 74 56 61 6c 69 64 20 3d 20  int bRetValid = 
23d0: 30 3b 0a 20 20 46 74 73 35 45 78 70 72 54 65 72  0;.  Fts5ExprTer
23e0: 6d 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *p;..  assert(
23f0: 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d   pTerm->pSynonym
2400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 44   );.  assert( bD
2410: 65 73 63 3d 3d 30 20 7c 7c 20 62 44 65 73 63 3d  esc==0 || bDesc=
2420: 3d 31 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54  =1 );.  for(p=pT
2430: 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
2440: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 69 66 28 20  nonym){.    if( 
2450: 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74  0==sqlite3Fts5It
2460: 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 20  erEof(p->pIter) 
2470: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
2480: 77 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e  wid = p->pIter->
2490: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 66  iRowid;.      if
24a0: 28 20 62 52 65 74 56 61 6c 69 64 3d 3d 30 20 7c  ( bRetValid==0 |
24b0: 7c 20 28 62 44 65 73 63 21 3d 28 69 52 6f 77 69  | (bDesc!=(iRowi
24c0: 64 3c 69 52 65 74 29 29 20 29 7b 0a 20 20 20 20  d<iRet)) ){.    
24d0: 20 20 20 20 69 52 65 74 20 3d 20 69 52 6f 77 69      iRet = iRowi
24e0: 64 3b 0a 20 20 20 20 20 20 20 20 62 52 65 74 56  d;.        bRetV
24f0: 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
2500: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
2510: 66 28 20 70 62 45 6f 66 20 26 26 20 62 52 65 74  f( pbEof && bRet
2520: 56 61 6c 69 64 3d 3d 30 20 29 20 2a 70 62 45 6f  Valid==0 ) *pbEo
2530: 66 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  f = 1;.  return 
2540: 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  iRet;.}../*.** A
2550: 72 67 75 6d 65 6e 74 20 70 54 65 72 6d 20 6d 75  rgument pTerm mu
2560: 73 74 20 62 65 20 61 20 73 79 6e 6f 6e 79 6d 20  st be a synonym 
2570: 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  iterator..*/.sta
2580: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
2590: 53 79 6e 6f 6e 79 6d 4c 69 73 74 28 0a 20 20 46  SynonymList(.  F
25a0: 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
25b0: 72 6d 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  rm, .  i64 iRowi
25c0: 64 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  d,.  Fts5Buffer 
25d0: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
25e0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73       /* Use this
25f0: 20 62 75 66 66 65 72 20 66 6f 72 20 73 70 61 63   buffer for spac
2600: 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
2610: 0a 20 20 75 38 20 2a 2a 70 61 2c 20 69 6e 74 20  .  u8 **pa, int 
2620: 2a 70 6e 0a 29 7b 0a 20 20 46 74 73 35 50 6f 73  *pn.){.  Fts5Pos
2630: 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61 74  listReader aStat
2640: 69 63 5b 34 5d 3b 0a 20 20 46 74 73 35 50 6f 73  ic[4];.  Fts5Pos
2650: 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49 74 65  listReader *aIte
2660: 72 20 3d 20 61 53 74 61 74 69 63 3b 0a 20 20 69  r = aStatic;.  i
2670: 6e 74 20 6e 49 74 65 72 20 3d 20 30 3b 0a 20 20  nt nIter = 0;.  
2680: 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 34 3b 0a  int nAlloc = 4;.
2690: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26a0: 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 45 78 70 72  E_OK;.  Fts5Expr
26b0: 54 65 72 6d 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Term *p;..  asse
26c0: 72 74 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  rt( pTerm->pSyno
26d0: 6e 79 6d 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  nym );.  for(p=p
26e0: 54 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53  Term; p; p=p->pS
26f0: 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 46 74 73  ynonym){.    Fts
2700: 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
2710: 72 20 3d 20 70 2d 3e 70 49 74 65 72 3b 0a 20 20  r = p->pIter;.  
2720: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73    if( sqlite3Fts
2730: 35 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 3d  5IterEof(pIter)=
2740: 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
2750: 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 7b 0a 20  wid==iRowid ){. 
2760: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
2770: 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69  nData==0 ) conti
2780: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  nue;.      if( n
2790: 49 74 65 72 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a  Iter==nAlloc ){.
27a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27b0: 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69  int64 nByte = si
27c0: 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74  zeof(Fts5Poslist
27d0: 52 65 61 64 65 72 29 20 2a 20 6e 41 6c 6c 6f 63  Reader) * nAlloc
27e0: 20 2a 20 32 3b 0a 20 20 20 20 20 20 20 20 46 74   * 2;.        Ft
27f0: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
2800: 2a 61 4e 65 77 20 3d 20 28 46 74 73 35 50 6f 73  *aNew = (Fts5Pos
2810: 6c 69 73 74 52 65 61 64 65 72 2a 29 73 71 6c 69  listReader*)sqli
2820: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
2830: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
2840: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
2850: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2860: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2870: 20 20 20 67 6f 74 6f 20 73 79 6e 6f 6e 79 6d 5f     goto synonym_
2880: 70 6f 73 6c 69 73 74 5f 6f 75 74 3b 0a 20 20 20  poslist_out;.   
2890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
28a0: 65 6d 63 70 79 28 61 4e 65 77 2c 20 61 49 74 65  emcpy(aNew, aIte
28b0: 72 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 6f  r, sizeof(Fts5Po
28c0: 73 6c 69 73 74 52 65 61 64 65 72 29 20 2a 20 6e  slistReader) * n
28d0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  Iter);.        n
28e0: 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
28f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 49  ;.        if( aI
2900: 74 65 72 21 3d 61 53 74 61 74 69 63 20 29 20 73  ter!=aStatic ) s
2910: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49 74 65  qlite3_free(aIte
2920: 72 29 3b 0a 20 20 20 20 20 20 20 20 61 49 74 65  r);.        aIte
2930: 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  r = aNew;.      
2940: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  }.      sqlite3F
2950: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2960: 49 6e 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74  Init(pIter->pDat
2970: 61 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c  a, pIter->nData,
2980: 20 26 61 49 74 65 72 5b 6e 49 74 65 72 5d 29 3b   &aIter[nIter]);
2990: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
29a0: 49 74 65 72 5b 6e 49 74 65 72 5d 2e 62 45 6f 66  Iter[nIter].bEof
29b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 49 74  ==0 );.      nIt
29c0: 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
29d0: 0a 20 20 69 66 28 20 6e 49 74 65 72 3d 3d 31 20  .  if( nIter==1 
29e0: 29 7b 0a 20 20 20 20 2a 70 61 20 3d 20 28 75 38  ){.    *pa = (u8
29f0: 2a 29 61 49 74 65 72 5b 30 5d 2e 61 3b 0a 20 20  *)aIter[0].a;.  
2a00: 20 20 2a 70 6e 20 3d 20 61 49 74 65 72 5b 30 5d    *pn = aIter[0]
2a10: 2e 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  .n;.  }else{.   
2a20: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
2a30: 65 72 20 77 72 69 74 65 72 20 3d 20 7b 30 7d 3b  er writer = {0};
2a40: 0a 20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d  .    i64 iPrev =
2a50: 20 2d 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66   -1;.    fts5Buf
2a60: 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
2a70: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
2a80: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2a90: 20 20 69 36 34 20 69 4d 69 6e 20 3d 20 46 54 53    i64 iMin = FTS
2aa0: 35 5f 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  5_LARGEST_INT64;
2ab0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2ac0: 69 3c 6e 49 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  i<nIter; i++){. 
2ad0: 20 20 20 20 20 20 20 69 66 28 20 61 49 74 65 72         if( aIter
2ae0: 5b 69 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20  [i].bEof==0 ){. 
2af0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 49 74           if( aIt
2b00: 65 72 5b 69 5d 2e 69 50 6f 73 3d 3d 69 50 72 65  er[i].iPos==iPre
2b10: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
2b20: 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
2b30: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
2b40: 74 28 26 61 49 74 65 72 5b 69 5d 29 20 29 20 63  t(&aIter[i]) ) c
2b50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2b60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2b70: 66 28 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73  f( aIter[i].iPos
2b80: 3c 69 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  <iMin ){.       
2b90: 20 20 20 20 20 69 4d 69 6e 20 3d 20 61 49 74 65       iMin = aIte
2ba0: 72 5b 69 5d 2e 69 50 6f 73 3b 0a 20 20 20 20 20  r[i].iPos;.     
2bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2bd0: 66 28 20 69 4d 69 6e 3d 3d 46 54 53 35 5f 4c 41  f( iMin==FTS5_LA
2be0: 52 47 45 53 54 5f 49 4e 54 36 34 20 7c 7c 20 72  RGEST_INT64 || r
2bf0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
2c00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d  reak;.      rc =
2c10: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2c20: 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28  istWriterAppend(
2c30: 70 42 75 66 2c 20 26 77 72 69 74 65 72 2c 20 69  pBuf, &writer, i
2c40: 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 50 72 65  Min);.      iPre
2c50: 76 20 3d 20 69 4d 69 6e 3b 0a 20 20 20 20 7d 0a  v = iMin;.    }.
2c60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
2c80: 70 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20  pa = pBuf->p;.  
2c90: 20 20 20 20 2a 70 6e 20 3d 20 70 42 75 66 2d 3e      *pn = pBuf->
2ca0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 73  n;.    }.  }.. s
2cb0: 79 6e 6f 6e 79 6d 5f 70 6f 73 6c 69 73 74 5f 6f  ynonym_poslist_o
2cc0: 75 74 3a 0a 20 20 69 66 28 20 61 49 74 65 72 21  ut:.  if( aIter!
2cd0: 3d 61 53 74 61 74 69 63 20 29 20 73 71 6c 69 74  =aStatic ) sqlit
2ce0: 65 33 5f 66 72 65 65 28 61 49 74 65 72 29 3b 0a  e3_free(aIter);.
2cf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d00: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 69 6e 64 69 76  ./*.** All indiv
2d10: 69 64 75 61 6c 20 74 65 72 6d 20 69 74 65 72 61  idual term itera
2d20: 74 6f 72 73 20 69 6e 20 70 50 68 72 61 73 65 20  tors in pPhrase 
2d30: 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2d40: 6f 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 2a  o be valid and.*
2d50: 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  * pointing to th
2d60: 65 20 73 61 6d 65 20 72 6f 77 69 64 20 77 68 65  e same rowid whe
2d70: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2d80: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20  is called. This 
2d90: 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 63 68 65  function .** che
2da0: 63 6b 73 20 69 66 20 74 68 65 20 63 75 72 72 65  cks if the curre
2db0: 6e 74 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20  nt rowid really 
2dc0: 69 73 20 61 20 6d 61 74 63 68 2c 20 61 6e 64 20  is a match, and 
2dd0: 69 66 20 73 6f 20 70 6f 70 75 6c 61 74 65 73 0a  if so populates.
2de0: 2a 2a 20 74 68 65 20 70 50 68 72 61 73 65 2d 3e  ** the pPhrase->
2df0: 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 61  poslist buffer a
2e00: 63 63 6f 72 64 69 6e 67 6c 79 2e 20 4f 75 74 70  ccordingly. Outp
2e10: 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62  ut parameter *pb
2e20: 4d 61 74 63 68 0a 2a 2a 20 69 73 20 73 65 74 20  Match.** is set 
2e30: 74 6f 20 74 72 75 65 20 69 66 20 74 68 69 73 20  to true if this 
2e40: 69 73 20 72 65 61 6c 6c 79 20 61 20 6d 61 74 63  is really a matc
2e50: 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  h, or false othe
2e60: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  rwise..**.** SQL
2e70: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2e80: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
2e90: 63 63 75 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c  ccurs, or an SQL
2ea0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 0a  ite error code .
2eb0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74  ** otherwise. It
2ec0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
2ed0: 65 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ed an error code
2ee0: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
2ef0: 72 6f 77 69 64 20 69 73 20 0a 2a 2a 20 6e 6f 74  rowid is .** not
2f00: 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61   a match..*/.sta
2f10: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
2f20: 50 68 72 61 73 65 49 73 4d 61 74 63 68 28 0a 20  PhraseIsMatch(. 
2f30: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
2f40: 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
2f50: 20 2f 2a 20 4e 6f 64 65 20 70 50 68 72 61 73 65   /* Node pPhrase
2f60: 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20   belongs to */. 
2f70: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
2f80: 2a 70 50 68 72 61 73 65 2c 20 20 20 20 20 20 20  *pPhrase,       
2f90: 20 2f 2a 20 50 68 72 61 73 65 20 6f 62 6a 65 63   /* Phrase objec
2fa0: 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  t to initialize 
2fb0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4d 61 74 63  */.  int *pbMatc
2fc0: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
2fd0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
2fe0: 20 74 6f 20 74 72 75 65 20 69 66 20 72 65 61 6c   to true if real
2ff0: 6c 79 20 61 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  ly a match */.){
3000: 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72  .  Fts5PoslistWr
3010: 69 74 65 72 20 77 72 69 74 65 72 20 3d 20 7b 30  iter writer = {0
3020: 7d 3b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74  };.  Fts5Poslist
3030: 52 65 61 64 65 72 20 61 53 74 61 74 69 63 5b 34  Reader aStatic[4
3040: 5d 3b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74  ];.  Fts5Poslist
3050: 52 65 61 64 65 72 20 2a 61 49 74 65 72 20 3d 20  Reader *aIter = 
3060: 61 53 74 61 74 69 63 3b 0a 20 20 69 6e 74 20 69  aStatic;.  int i
3070: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3080: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 46  ITE_OK;.  int bF
3090: 69 72 73 74 20 3d 20 70 50 68 72 61 73 65 2d 3e  irst = pPhrase->
30a0: 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 3b  aTerm[0].bFirst;
30b0: 0a 20 20 0a 20 20 66 74 73 35 42 75 66 66 65 72  .  .  fts5Buffer
30c0: 5a 65 72 6f 28 26 70 50 68 72 61 73 65 2d 3e 70  Zero(&pPhrase->p
30d0: 6f 73 6c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 49  oslist);..  /* I
30e0: 66 20 74 68 65 20 61 53 74 61 74 69 63 5b 5d 20  f the aStatic[] 
30f0: 61 72 72 61 79 20 69 73 20 6e 6f 74 20 6c 61 72  array is not lar
3100: 67 65 20 65 6e 6f 75 67 68 2c 20 61 6c 6c 6f 63  ge enough, alloc
3110: 61 74 65 20 61 20 6c 61 72 67 65 20 61 72 72 61  ate a large arra
3120: 79 0a 20 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c  y.  ** using sql
3130: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54  ite3_malloc(). T
3140: 68 69 73 20 61 70 70 72 6f 61 63 68 20 63 6f 75  his approach cou
3150: 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 75  ld be improved u
3160: 70 6f 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  pon. */.  if( pP
3170: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 41 72 72  hrase->nTerm>Arr
3180: 61 79 53 69 7a 65 28 61 53 74 61 74 69 63 29 20  aySize(aStatic) 
3190: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
31a0: 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a  nt64 nByte = siz
31b0: 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52  eof(Fts5PoslistR
31c0: 65 61 64 65 72 29 20 2a 20 70 50 68 72 61 73 65  eader) * pPhrase
31d0: 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 61 49 74  ->nTerm;.    aIt
31e0: 65 72 20 3d 20 28 46 74 73 35 50 6f 73 6c 69 73  er = (Fts5Poslis
31f0: 74 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33  tReader*)sqlite3
3200: 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
3210: 3b 0a 20 20 20 20 69 66 28 20 21 61 49 74 65 72  ;.    if( !aIter
3220: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
3230: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
3240: 6d 73 65 74 28 61 49 74 65 72 2c 20 30 2c 20 73  mset(aIter, 0, s
3250: 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73  izeof(Fts5Poslis
3260: 74 52 65 61 64 65 72 29 20 2a 20 70 50 68 72 61  tReader) * pPhra
3270: 73 65 2d 3e 6e 54 65 72 6d 29 3b 0a 0a 20 20 2f  se->nTerm);..  /
3280: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 74  * Initialize a t
3290: 65 72 6d 20 69 74 65 72 61 74 6f 72 20 66 6f 72  erm iterator for
32a0: 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
32b0: 65 20 70 68 72 61 73 65 20 2a 2f 0a 20 20 66 6f  e phrase */.  fo
32c0: 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65  r(i=0; i<pPhrase
32d0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
32e0: 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
32f0: 2a 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73  *pTerm = &pPhras
3300: 65 2d 3e 61 54 65 72 6d 5b 69 5d 3b 0a 20 20 20  e->aTerm[i];.   
3310: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
3320: 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20  int bFlag = 0;. 
3330: 20 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20     u8 *a = 0;.  
3340: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79    if( pTerm->pSy
3350: 6e 6f 6e 79 6d 20 29 7b 0a 20 20 20 20 20 20 46  nonym ){.      F
3360: 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
3370: 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20  {0, 0, 0};.     
3380: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 53 79   rc = fts5ExprSy
3390: 6e 6f 6e 79 6d 4c 69 73 74 28 70 54 65 72 6d 2c  nonymList(pTerm,
33a0: 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 2c 20   pNode->iRowid, 
33b0: 26 62 75 66 2c 20 26 61 2c 20 26 6e 29 3b 0a 20  &buf, &a, &n);. 
33c0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
33d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
33e0: 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20 20 20  ree(a);.        
33f0: 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74  goto ismatch_out
3400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3410: 69 66 28 20 61 3d 3d 62 75 66 2e 70 20 29 20 62  if( a==buf.p ) b
3420: 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 65  Flag = 1;.    }e
3430: 6c 73 65 7b 0a 20 20 20 20 20 20 61 20 3d 20 28  lse{.      a = (
3440: 75 38 2a 29 70 54 65 72 6d 2d 3e 70 49 74 65 72  u8*)pTerm->pIter
3450: 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 6e  ->pData;.      n
3460: 20 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 2d   = pTerm->pIter-
3470: 3e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  >nData;.    }.  
3480: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
3490: 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 61  listReaderInit(a
34a0: 2c 20 6e 2c 20 26 61 49 74 65 72 5b 69 5d 29 3b  , n, &aIter[i]);
34b0: 0a 20 20 20 20 61 49 74 65 72 5b 69 5d 2e 62 46  .    aIter[i].bF
34c0: 6c 61 67 20 3d 20 28 75 38 29 62 46 6c 61 67 3b  lag = (u8)bFlag;
34d0: 0a 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69  .    if( aIter[i
34e0: 5d 2e 62 45 6f 66 20 29 20 67 6f 74 6f 20 69 73  ].bEof ) goto is
34f0: 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  match_out;.  }..
3500: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
3510: 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 20 20    int bMatch;.  
3520: 20 20 69 36 34 20 69 50 6f 73 20 3d 20 61 49 74    i64 iPos = aIt
3530: 65 72 5b 30 5d 2e 69 50 6f 73 3b 0a 20 20 20 20  er[0].iPos;.    
3540: 64 6f 20 7b 0a 20 20 20 20 20 20 62 4d 61 74 63  do {.      bMatc
3550: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  h = 1;.      for
3560: 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d  (i=0; i<pPhrase-
3570: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
3580: 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
3590: 74 52 65 61 64 65 72 20 2a 70 50 6f 73 20 3d 20  tReader *pPos = 
35a0: 26 61 49 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20  &aIter[i];.     
35b0: 20 20 20 69 36 34 20 69 41 64 6a 20 3d 20 69 50     i64 iAdj = iP
35c0: 6f 73 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20  os + i;.        
35d0: 69 66 28 20 70 50 6f 73 2d 3e 69 50 6f 73 21 3d  if( pPos->iPos!=
35e0: 69 41 64 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  iAdj ){.        
35f0: 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20    bMatch = 0;.  
3600: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
3610: 50 6f 73 2d 3e 69 50 6f 73 3c 69 41 64 6a 20 29  Pos->iPos<iAdj )
3620: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
3630: 28 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  ( sqlite3Fts5Pos
3640: 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 70  listReaderNext(p
3650: 50 6f 73 29 20 29 20 67 6f 74 6f 20 69 73 6d 61  Pos) ) goto isma
3660: 74 63 68 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  tch_out;.       
3670: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
3680: 66 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69 41  f( pPos->iPos>iA
3690: 64 6a 20 29 20 69 50 6f 73 20 3d 20 70 50 6f 73  dj ) iPos = pPos
36a0: 2d 3e 69 50 6f 73 2d 69 3b 0a 20 20 20 20 20 20  ->iPos-i;.      
36b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36c0: 7d 77 68 69 6c 65 28 20 62 4d 61 74 63 68 3d 3d  }while( bMatch==
36d0: 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  0 );..    /* App
36e0: 65 6e 64 20 70 6f 73 69 74 69 6f 6e 20 69 50 6f  end position iPo
36f0: 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  s to the output 
3700: 2a 2f 0a 20 20 20 20 69 66 28 20 62 46 69 72 73  */.    if( bFirs
3710: 74 3d 3d 30 20 7c 7c 20 46 54 53 35 5f 50 4f 53  t==0 || FTS5_POS
3720: 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3d 3d 30  2OFFSET(iPos)==0
3730: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
3740: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
3750: 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 70  tWriterAppend(&p
3760: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2c  Phrase->poslist,
3770: 20 26 77 72 69 74 65 72 2c 20 69 50 6f 73 29 3b   &writer, iPos);
3780: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
3790: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
37a0: 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20 20  ismatch_out;.   
37b0: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
37c0: 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72   i<pPhrase->nTer
37d0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
37e0: 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  f( sqlite3Fts5Po
37f0: 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
3800: 26 61 49 74 65 72 5b 69 5d 29 20 29 20 67 6f 74  &aIter[i]) ) got
3810: 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20  o ismatch_out;. 
3820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 69 73 6d 61 74     }.  }.. ismat
3830: 63 68 5f 6f 75 74 3a 0a 20 20 2a 70 62 4d 61 74  ch_out:.  *pbMat
3840: 63 68 20 3d 20 28 70 50 68 72 61 73 65 2d 3e 70  ch = (pPhrase->p
3850: 6f 73 6c 69 73 74 2e 6e 3e 30 29 3b 0a 20 20 66  oslist.n>0);.  f
3860: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73  or(i=0; i<pPhras
3870: 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  e->nTerm; i++){.
3880: 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d      if( aIter[i]
3890: 2e 62 46 6c 61 67 20 29 20 73 71 6c 69 74 65 33  .bFlag ) sqlite3
38a0: 5f 66 72 65 65 28 28 75 38 2a 29 61 49 74 65 72  _free((u8*)aIter
38b0: 5b 69 5d 2e 61 29 3b 0a 20 20 7d 0a 20 20 69 66  [i].a);.  }.  if
38c0: 28 20 61 49 74 65 72 21 3d 61 53 74 61 74 69 63  ( aIter!=aStatic
38d0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
38e0: 61 49 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aIter);.  return
38f0: 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
3900: 73 74 72 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61  struct Fts5Looka
3910: 68 65 61 64 52 65 61 64 65 72 20 46 74 73 35 4c  headReader Fts5L
3920: 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 3b 0a  ookaheadReader;.
3930: 73 74 72 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61  struct Fts5Looka
3940: 68 65 61 64 52 65 61 64 65 72 20 7b 0a 20 20 63  headReader {.  c
3950: 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20 20 20 20  onst u8 *a;     
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3970: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3980: 69 6e 67 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ing position lis
3990: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  t */.  int n;   
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
39c0: 66 20 62 75 66 66 65 72 20 61 5b 5d 20 69 6e 20  f buffer a[] in 
39d0: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
39e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
39f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3a00: 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 20  rrent offset in 
3a10: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
3a20: 0a 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20 20  .  i64 iPos;    
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 6f     /* Current po
3a50: 73 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36 34 20  sition */.  i64 
3a60: 69 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20  iLookahead;     
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3a80: 65 78 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a  ext position */.
3a90: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  };..#define FTS5
3aa0: 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46 20 28  _LOOKAHEAD_EOF (
3ab0: 28 28 69 36 34 29 31 29 20 3c 3c 20 36 32 29 0a  ((i64)1) << 62).
3ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
3ad0: 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 4e  LookaheadReaderN
3ae0: 65 78 74 28 46 74 73 35 4c 6f 6f 6b 61 68 65 61  ext(Fts5Lookahea
3af0: 64 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 70  dReader *p){.  p
3b00: 2d 3e 69 50 6f 73 20 3d 20 70 2d 3e 69 4c 6f 6f  ->iPos = p->iLoo
3b10: 6b 61 68 65 61 64 3b 0a 20 20 69 66 28 20 73 71  kahead;.  if( sq
3b20: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
3b30: 4e 65 78 74 36 34 28 70 2d 3e 61 2c 20 70 2d 3e  Next64(p->a, p->
3b40: 6e 2c 20 26 70 2d 3e 69 2c 20 26 70 2d 3e 69 4c  n, &p->i, &p->iL
3b50: 6f 6f 6b 61 68 65 61 64 29 20 29 7b 0a 20 20 20  ookahead) ){.   
3b60: 20 70 2d 3e 69 4c 6f 6f 6b 61 68 65 61 64 20 3d   p->iLookahead =
3b70: 20 46 54 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f   FTS5_LOOKAHEAD_
3b80: 45 4f 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  EOF;.  }.  retur
3b90: 6e 20 28 70 2d 3e 69 50 6f 73 3d 3d 46 54 53 35  n (p->iPos==FTS5
3ba0: 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46 29 3b  _LOOKAHEAD_EOF);
3bb0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
3bc0: 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64  ts5LookaheadRead
3bd0: 65 72 49 6e 69 74 28 0a 20 20 63 6f 6e 73 74 20  erInit(.  const 
3be0: 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20  u8 *a, int n,   
3bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3c00: 66 65 72 20 74 6f 20 72 65 61 64 20 70 6f 73 69  fer to read posi
3c10: 74 69 6f 6e 20 6c 69 73 74 20 66 72 6f 6d 20 2a  tion list from *
3c20: 2f 0a 20 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61  /.  Fts5Lookahea
3c30: 64 52 65 61 64 65 72 20 2a 70 20 20 20 20 20 20  dReader *p      
3c40: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
3c50: 6f 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61  object to initia
3c60: 6c 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d  lize */.){.  mem
3c70: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
3c80: 28 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65  (Fts5LookaheadRe
3c90: 61 64 65 72 29 29 3b 0a 20 20 70 2d 3e 61 20 3d  ader));.  p->a =
3ca0: 20 61 3b 0a 20 20 70 2d 3e 6e 20 3d 20 6e 3b 0a   a;.  p->n = n;.
3cb0: 20 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52    fts5LookaheadR
3cc0: 65 61 64 65 72 4e 65 78 74 28 70 29 3b 0a 20 20  eaderNext(p);.  
3cd0: 72 65 74 75 72 6e 20 66 74 73 35 4c 6f 6f 6b 61  return fts5Looka
3ce0: 68 65 61 64 52 65 61 64 65 72 4e 65 78 74 28 70  headReaderNext(p
3cf0: 29 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  );.}..typedef st
3d00: 72 75 63 74 20 46 74 73 35 4e 65 61 72 54 72 69  ruct Fts5NearTri
3d10: 6d 6d 65 72 20 46 74 73 35 4e 65 61 72 54 72 69  mmer Fts5NearTri
3d20: 6d 6d 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73  mmer;.struct Fts
3d30: 35 4e 65 61 72 54 72 69 6d 6d 65 72 20 7b 0a 20  5NearTrimmer {. 
3d40: 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   Fts5LookaheadRe
3d50: 61 64 65 72 20 72 65 61 64 65 72 3b 20 20 20 20  ader reader;    
3d60: 20 2f 2a 20 49 6e 70 75 74 20 69 74 65 72 61 74   /* Input iterat
3d70: 6f 72 20 2a 2f 0a 20 20 46 74 73 35 50 6f 73 6c  or */.  Fts5Posl
3d80: 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
3d90: 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ;       /* Write
3da0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 46  r context */.  F
3db0: 74 73 35 42 75 66 66 65 72 20 2a 70 4f 75 74 3b  ts5Buffer *pOut;
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3dd0: 2a 20 4f 75 74 70 75 74 20 70 6f 73 6c 69 73 74  * Output poslist
3de0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
3df0: 65 20 6e 65 61 72 2d 73 65 74 20 6f 62 6a 65 63  e near-set objec
3e00: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
3e10: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63  first argument c
3e20: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
3e30: 6e 0a 2a 2a 20 6f 6e 65 20 70 68 72 61 73 65 2e  n.** one phrase.
3e40: 20 41 6c 6c 20 70 68 72 61 73 65 73 20 63 75 72   All phrases cur
3e50: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20  rently point to 
3e60: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 54 68  the same row. Th
3e70: 65 0a 2a 2a 20 46 74 73 35 45 78 70 72 50 68 72  e.** Fts5ExprPhr
3e80: 61 73 65 2e 70 6f 73 6c 69 73 74 20 62 75 66 66  ase.poslist buff
3e90: 65 72 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  ers are populate
3ea0: 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
3eb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
3ec0: 74 65 73 74 73 20 69 66 20 74 68 65 20 63 75 72  tests if the cur
3ed0: 72 65 6e 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e  rent row contain
3ee0: 73 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 65  s instances of e
3ef0: 61 63 68 20 70 68 72 61 73 65 20 73 75 66 66 69  ach phrase suffi
3f00: 63 69 65 6e 74 6c 79 0a 2a 2a 20 63 6c 6f 73 65  ciently.** close
3f10: 20 74 6f 67 65 74 68 65 72 20 74 6f 20 6d 65 65   together to mee
3f20: 74 20 74 68 65 20 4e 45 41 52 20 63 6f 6e 73 74  t the NEAR const
3f30: 72 61 69 6e 74 2e 20 4e 6f 6e 2d 7a 65 72 6f 20  raint. Non-zero 
3f40: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  is returned if i
3f50: 74 0a 2a 2a 20 64 6f 65 73 2c 20 6f 72 20 7a 65  t.** does, or ze
3f60: 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ro otherwise..**
3f70: 0a 2a 2a 20 49 66 20 69 6e 2f 6f 75 74 20 70 61  .** If in/out pa
3f80: 72 61 6d 65 74 65 72 20 28 2a 70 52 63 29 20 69  rameter (*pRc) i
3f90: 73 20 73 65 74 20 74 6f 20 6f 74 68 65 72 20 74  s set to other t
3fa0: 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  han SQLITE_OK wh
3fb0: 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
3fc0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
3fd0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 72  t is a no-op. Or
3fe0: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65  , if an error (e
3ff0: 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .g. SQLITE_NOMEM
4000: 29 0a 2a 2a 20 6f 63 63 75 72 73 20 77 69 74 68  ).** occurs with
4010: 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
4020: 20 28 2a 70 52 63 29 20 69 73 20 73 65 74 20 61   (*pRc) is set a
4030: 63 63 6f 72 64 69 6e 67 6c 79 20 62 65 66 6f 72  ccordingly befor
4040: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
4050: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
4060: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
4070: 20 62 6f 74 68 20 74 68 65 73 65 20 63 61 73 65   both these case
4080: 73 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 6e 6f 20  s..** .** If no 
4090: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
40a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 61 20 6d 61 74   non-zero (a mat
40b0: 63 68 29 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ch) is returned,
40c0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
40d0: 73 74 0a 2a 2a 20 6f 66 20 65 61 63 68 20 70 68  st.** of each ph
40e0: 72 61 73 65 20 6f 62 6a 65 63 74 20 69 73 20 65  rase object is e
40f0: 64 69 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dited to contain
4100: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 65 6e 74 72   only those entr
4110: 69 65 73 20 74 68 61 74 0a 2a 2a 20 6d 65 65 74  ies that.** meet
4120: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
4130: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
4140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4150: 66 74 73 35 45 78 70 72 4e 65 61 72 49 73 4d 61  fts5ExprNearIsMa
4160: 74 63 68 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  tch(int *pRc, Ft
4170: 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70  s5ExprNearset *p
4180: 4e 65 61 72 29 7b 0a 20 20 46 74 73 35 4e 65 61  Near){.  Fts5Nea
4190: 72 54 72 69 6d 6d 65 72 20 61 53 74 61 74 69 63  rTrimmer aStatic
41a0: 5b 34 5d 3b 0a 20 20 46 74 73 35 4e 65 61 72 54  [4];.  Fts5NearT
41b0: 72 69 6d 6d 65 72 20 2a 61 20 3d 20 61 53 74 61  rimmer *a = aSta
41c0: 74 69 63 3b 0a 20 20 46 74 73 35 45 78 70 72 50  tic;.  Fts5ExprP
41d0: 68 72 61 73 65 20 2a 2a 61 70 50 68 72 61 73 65  hrase **apPhrase
41e0: 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
41f0: 73 65 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a 20 20  se;..  int i;.  
4200: 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20  int rc = *pRc;. 
4210: 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 0a 20 20   int bMatch;..  
4220: 61 73 73 65 72 74 28 20 70 4e 65 61 72 2d 3e 6e  assert( pNear->n
4230: 50 68 72 61 73 65 3e 31 20 29 3b 0a 0a 20 20 2f  Phrase>1 );..  /
4240: 2a 20 49 66 20 74 68 65 20 61 53 74 61 74 69 63  * If the aStatic
4250: 5b 5d 20 61 72 72 61 79 20 69 73 20 6e 6f 74 20  [] array is not 
4260: 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20 61 6c  large enough, al
4270: 6c 6f 63 61 74 65 20 61 20 6c 61 72 67 65 20 61  locate a large a
4280: 72 72 61 79 0a 20 20 2a 2a 20 75 73 69 6e 67 20  rray.  ** using 
4290: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
42a0: 2e 20 54 68 69 73 20 61 70 70 72 6f 61 63 68 20  . This approach 
42b0: 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65  could be improve
42c0: 64 20 75 70 6f 6e 2e 20 2a 2f 0a 20 20 69 66 28  d upon. */.  if(
42d0: 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e   pNear->nPhrase>
42e0: 41 72 72 61 79 53 69 7a 65 28 61 53 74 61 74 69  ArraySize(aStati
42f0: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
4300: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
4310: 73 69 7a 65 6f 66 28 46 74 73 35 4e 65 61 72 54  sizeof(Fts5NearT
4320: 72 69 6d 6d 65 72 29 20 2a 20 70 4e 65 61 72 2d  rimmer) * pNear-
4330: 3e 6e 50 68 72 61 73 65 3b 0a 20 20 20 20 61 20  >nPhrase;.    a 
4340: 3d 20 28 46 74 73 35 4e 65 61 72 54 72 69 6d 6d  = (Fts5NearTrimm
4350: 65 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  er*)sqlite3Fts5M
4360: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
4370: 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
4380: 20 20 20 20 6d 65 6d 73 65 74 28 61 53 74 61 74      memset(aStat
4390: 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53  ic, 0, sizeof(aS
43a0: 74 61 74 69 63 29 29 3b 0a 20 20 7d 0a 20 20 69  tatic));.  }.  i
43b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
43c0: 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
43d0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  c;.    return 0;
43e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
43f0: 61 6c 69 7a 65 20 61 20 6c 6f 6f 6b 61 68 65 61  alize a lookahea
4400: 64 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 65  d iterator for e
4410: 61 63 68 20 70 68 72 61 73 65 2e 20 41 66 74 65  ach phrase. Afte
4420: 72 20 70 61 73 73 69 6e 67 20 74 68 65 0a 20 20  r passing the.  
4430: 2a 2a 20 62 75 66 66 65 72 20 61 6e 64 20 62 75  ** buffer and bu
4440: 66 66 65 72 20 73 69 7a 65 20 74 6f 20 74 68 65  ffer size to the
4450: 20 6c 6f 6f 6b 61 73 69 64 65 2d 72 65 61 64 65   lookaside-reade
4460: 72 20 69 6e 69 74 20 66 75 6e 63 74 69 6f 6e 2c  r init function,
4470: 20 7a 65 72 6f 0a 20 20 2a 2a 20 74 68 65 20 70   zero.  ** the p
4480: 68 72 61 73 65 20 70 6f 73 6c 69 73 74 20 62 75  hrase poslist bu
4490: 66 66 65 72 2e 20 54 68 65 20 6e 65 77 20 70 6f  ffer. The new po
44a0: 73 6c 69 73 74 20 66 6f 72 20 74 68 65 20 70 68  slist for the ph
44b0: 72 61 73 65 20 28 63 6f 6e 74 61 69 6e 69 6e 67  rase (containing
44c0: 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 65  .  ** the same e
44d0: 6e 74 72 69 65 73 20 61 73 20 74 68 65 20 6f 72  ntries as the or
44e0: 69 67 69 6e 61 6c 20 77 69 74 68 20 73 6f 6d 65  iginal with some
44f0: 20 65 6e 74 72 69 65 73 20 72 65 6d 6f 76 65 64   entries removed
4500: 20 6f 6e 20 61 63 63 6f 75 6e 74 20 0a 20 20 2a   on account .  *
4510: 2a 20 6f 66 20 74 68 65 20 4e 45 41 52 20 63 6f  * of the NEAR co
4520: 6e 73 74 72 61 69 6e 74 29 20 69 73 20 77 72 69  nstraint) is wri
4530: 74 74 65 6e 20 6f 76 65 72 20 74 68 65 20 6f 72  tten over the or
4540: 69 67 69 6e 61 6c 20 65 76 65 6e 20 61 73 20 69  iginal even as i
4550: 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20  t is.  ** being 
4560: 72 65 61 64 2e 20 54 68 69 73 20 69 73 20 73 61  read. This is sa
4570: 66 65 20 61 73 20 74 68 65 20 65 6e 74 72 69 65  fe as the entrie
4580: 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 6f  s for the new po
4590: 73 6c 69 73 74 20 61 72 65 20 61 0a 20 20 2a 2a  slist are a.  **
45a0: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 6f   subset of the o
45b0: 6c 64 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  ld, so it is not
45c0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 64 61   possible for da
45d0: 74 61 20 79 65 74 20 74 6f 20 62 65 20 72 65 61  ta yet to be rea
45e0: 64 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 76 65  d to.  ** be ove
45f0: 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
4600: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72  for(i=0; i<pNear
4610: 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b  ->nPhrase; i++){
4620: 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
4630: 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 61 70 50  *pPoslist = &apP
4640: 68 72 61 73 65 5b 69 5d 2d 3e 70 6f 73 6c 69 73  hrase[i]->poslis
4650: 74 3b 0a 20 20 20 20 66 74 73 35 4c 6f 6f 6b 61  t;.    fts5Looka
4660: 68 65 61 64 52 65 61 64 65 72 49 6e 69 74 28 70  headReaderInit(p
4670: 50 6f 73 6c 69 73 74 2d 3e 70 2c 20 70 50 6f 73  Poslist->p, pPos
4680: 6c 69 73 74 2d 3e 6e 2c 20 26 61 5b 69 5d 2e 72  list->n, &a[i].r
4690: 65 61 64 65 72 29 3b 0a 20 20 20 20 70 50 6f 73  eader);.    pPos
46a0: 6c 69 73 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20  list->n = 0;.   
46b0: 20 61 5b 69 5d 2e 70 4f 75 74 20 3d 20 70 50 6f   a[i].pOut = pPo
46c0: 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 77 68  slist;.  }..  wh
46d0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e  ile( 1 ){.    in
46e0: 74 20 69 41 64 76 3b 0a 20 20 20 20 69 36 34 20  t iAdv;.    i64 
46f0: 69 4d 69 6e 3b 0a 20 20 20 20 69 36 34 20 69 4d  iMin;.    i64 iM
4700: 61 78 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ax;..    /* This
4710: 20 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73 20   block advances 
4720: 74 68 65 20 70 68 72 61 73 65 20 69 74 65 72 61  the phrase itera
4730: 74 6f 72 73 20 75 6e 74 69 6c 20 74 68 65 79 20  tors until they 
4740: 70 6f 69 6e 74 20 74 6f 20 61 20 73 65 74 20 6f  point to a set o
4750: 66 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73  f.    ** entries
4760: 20 74 68 61 74 20 74 6f 67 65 74 68 65 72 20 63   that together c
4770: 6f 6d 70 72 69 73 65 20 61 20 6d 61 74 63 68 2e  omprise a match.
4780: 20 20 2a 2f 0a 20 20 20 20 69 4d 61 78 20 3d 20    */.    iMax = 
4790: 61 5b 30 5d 2e 72 65 61 64 65 72 2e 69 50 6f 73  a[0].reader.iPos
47a0: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
47b0: 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20   bMatch = 1;.   
47c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
47d0: 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  ear->nPhrase; i+
47e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  +){.        Fts5
47f0: 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20  LookaheadReader 
4800: 2a 70 50 6f 73 20 3d 20 26 61 5b 69 5d 2e 72 65  *pPos = &a[i].re
4810: 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 69 4d  ader;.        iM
4820: 69 6e 20 3d 20 69 4d 61 78 20 2d 20 70 4e 65 61  in = iMax - pNea
4830: 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 2d 3e  r->apPhrase[i]->
4840: 6e 54 65 72 6d 20 2d 20 70 4e 65 61 72 2d 3e 6e  nTerm - pNear->n
4850: 4e 65 61 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Near;.        if
4860: 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69  ( pPos->iPos<iMi
4870: 6e 20 7c 7c 20 70 50 6f 73 2d 3e 69 50 6f 73 3e  n || pPos->iPos>
4880: 69 4d 61 78 20 29 7b 0a 20 20 20 20 20 20 20 20  iMax ){.        
4890: 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20    bMatch = 0;.  
48a0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
48b0: 50 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e 20 29  Pos->iPos<iMin )
48c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
48d0: 28 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52  ( fts5LookaheadR
48e0: 65 61 64 65 72 4e 65 78 74 28 70 50 6f 73 29 20  eaderNext(pPos) 
48f0: 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f  ) goto ismatch_o
4900: 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
4910: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
4920: 6f 73 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29 20  os->iPos>iMax ) 
4930: 69 4d 61 78 20 3d 20 70 50 6f 73 2d 3e 69 50 6f  iMax = pPos->iPo
4940: 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  s;.        }.   
4950: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
4960: 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20   bMatch==0 );.. 
4970: 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
4980: 72 79 20 74 6f 20 65 61 63 68 20 6f 75 74 70 75  ry to each outpu
4990: 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  t position list 
49a0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
49b0: 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  i<pNear->nPhrase
49c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 36  ; i++){.      i6
49d0: 34 20 69 50 6f 73 20 3d 20 61 5b 69 5d 2e 72 65  4 iPos = a[i].re
49e0: 61 64 65 72 2e 69 50 6f 73 3b 0a 20 20 20 20 20  ader.iPos;.     
49f0: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
4a00: 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 26 61  er *pWriter = &a
4a10: 5b 69 5d 2e 77 72 69 74 65 72 3b 0a 20 20 20 20  [i].writer;.    
4a20: 20 20 69 66 28 20 61 5b 69 5d 2e 70 4f 75 74 2d    if( a[i].pOut-
4a30: 3e 6e 3d 3d 30 20 7c 7c 20 69 50 6f 73 21 3d 70  >n==0 || iPos!=p
4a40: 57 72 69 74 65 72 2d 3e 69 50 72 65 76 20 29 7b  Writer->iPrev ){
4a50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4a60: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
4a70: 72 41 70 70 65 6e 64 28 61 5b 69 5d 2e 70 4f 75  rAppend(a[i].pOu
4a80: 74 2c 20 70 57 72 69 74 65 72 2c 20 69 50 6f 73  t, pWriter, iPos
4a90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4aa0: 0a 0a 20 20 20 20 69 41 64 76 20 3d 20 30 3b 0a  ..    iAdv = 0;.
4ab0: 20 20 20 20 69 4d 69 6e 20 3d 20 61 5b 30 5d 2e      iMin = a[0].
4ac0: 72 65 61 64 65 72 2e 69 4c 6f 6f 6b 61 68 65 61  reader.iLookahea
4ad0: 64 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  d;.    for(i=0; 
4ae0: 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  i<pNear->nPhrase
4af0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4b00: 28 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c  ( a[i].reader.iL
4b10: 6f 6f 6b 61 68 65 61 64 20 3c 20 69 4d 69 6e 20  ookahead < iMin 
4b20: 29 7b 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20  ){.        iMin 
4b30: 3d 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c  = a[i].reader.iL
4b40: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20  ookahead;.      
4b50: 20 20 69 41 64 76 20 3d 20 69 3b 0a 20 20 20 20    iAdv = i;.    
4b60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
4b70: 28 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52  ( fts5LookaheadR
4b80: 65 61 64 65 72 4e 65 78 74 28 26 61 5b 69 41 64  eaderNext(&a[iAd
4b90: 76 5d 2e 72 65 61 64 65 72 29 20 29 20 67 6f 74  v].reader) ) got
4ba0: 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20  o ismatch_out;. 
4bb0: 20 7d 0a 0a 20 20 69 73 6d 61 74 63 68 5f 6f 75   }..  ismatch_ou
4bc0: 74 3a 20 7b 0a 20 20 20 20 69 6e 74 20 62 52 65  t: {.    int bRe
4bd0: 74 20 3d 20 61 5b 30 5d 2e 70 4f 75 74 2d 3e 6e  t = a[0].pOut->n
4be0: 3e 30 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72  >0;.    *pRc = r
4bf0: 63 3b 0a 20 20 20 20 69 66 28 20 61 21 3d 61 53  c;.    if( a!=aS
4c00: 74 61 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f  tatic ) sqlite3_
4c10: 66 72 65 65 28 61 29 3b 0a 20 20 20 20 72 65 74  free(a);.    ret
4c20: 75 72 6e 20 62 52 65 74 3b 0a 20 20 7d 0a 7d 0a  urn bRet;.  }.}.
4c30: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69  ./*.** Advance i
4c40: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 75 6e  terator pIter un
4c50: 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
4c60: 20 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74   a value equal t
4c70: 6f 20 6f 72 20 6c 61 73 74 65 72 0a 2a 2a 20 74  o or laster.** t
4c80: 68 61 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 20  han the initial 
4c90: 76 61 6c 75 65 20 6f 66 20 2a 70 69 4c 61 73 74  value of *piLast
4ca0: 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  . If this means 
4cb0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
4cc0: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 75  nts.** to a valu
4cd0: 65 20 6c 61 73 74 65 72 20 74 68 61 6e 20 2a 70  e laster than *p
4ce0: 69 4c 61 73 74 2c 20 75 70 64 61 74 65 20 2a 70  iLast, update *p
4cf0: 69 4c 61 73 74 20 74 6f 20 74 68 65 20 6e 65 77  iLast to the new
4d00: 20 6c 61 73 74 65 73 74 20 76 61 6c 75 65 2e 0a   lastest value..
4d10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 74 65  **.** If the ite
4d20: 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f  rator reaches EO
4d30: 46 2c 20 73 65 74 20 2a 70 62 45 6f 66 20 74 6f  F, set *pbEof to
4d40: 20 74 72 75 65 20 62 65 66 6f 72 65 20 72 65 74   true before ret
4d50: 75 72 6e 69 6e 67 2e 20 49 66 0a 2a 2a 20 61 6e  urning. If.** an
4d60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
4d70: 65 74 20 2a 70 52 63 20 74 6f 20 61 6e 20 65 72  et *pRc to an er
4d80: 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 65 69 74  ror code. If eit
4d90: 68 65 72 20 2a 70 62 45 6f 66 20 6f 72 20 2a 70  her *pbEof or *p
4da0: 52 63 0a 2a 2a 20 61 72 65 20 73 65 74 2c 20 72  Rc.** are set, r
4db0: 65 74 75 72 6e 20 61 20 6e 6f 6e 2d 7a 65 72 6f  eturn a non-zero
4dc0: 20 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73   value. Otherwis
4dd0: 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a  e, return zero..
4de0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
4df0: 73 35 45 78 70 72 41 64 76 61 6e 63 65 74 6f 28  s5ExprAdvanceto(
4e00: 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
4e10: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
4e20: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
4e30: 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
4e40: 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20  nt bDesc,       
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4e60: 2a 20 54 72 75 65 20 69 66 20 69 74 65 72 61 74  * True if iterat
4e70: 6f 72 20 69 73 20 22 72 6f 77 69 64 20 44 45 53  or is "rowid DES
4e80: 43 22 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c  C" */.  i64 *piL
4e90: 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
4ea0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
4eb0: 54 3a 20 4c 61 73 74 65 73 74 20 72 6f 77 69 64  T: Lastest rowid
4ec0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
4ed0: 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
4f00: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  code */.  int *p
4f10: 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  bEof            
4f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
4f30: 3a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  : Set to true if
4f40: 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 36 34   EOF */.){.  i64
4f50: 20 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74   iLast = *piLast
4f60: 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  ;.  i64 iRowid;.
4f70: 0a 20 20 69 52 6f 77 69 64 20 3d 20 70 49 74 65  .  iRowid = pIte
4f80: 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28  r->iRowid;.  if(
4f90: 20 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69 4c   (bDesc==0 && iL
4fa0: 61 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20 28  ast>iRowid) || (
4fb0: 62 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c 69  bDesc && iLast<i
4fc0: 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 69 6e  Rowid) ){.    in
4fd0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
4fe0: 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  s5IterNextFrom(p
4ff0: 49 74 65 72 2c 20 69 4c 61 73 74 29 3b 0a 20 20  Iter, iLast);.  
5000: 20 20 69 66 28 20 72 63 20 7c 7c 20 73 71 6c 69    if( rc || sqli
5010: 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
5020: 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2a  Iter) ){.      *
5030: 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRc = rc;.      
5040: 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  *pbEof = 1;.    
5050: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5060: 7d 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 70  }.    iRowid = p
5070: 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  Iter->iRowid;.  
5080: 20 20 61 73 73 65 72 74 28 20 28 62 44 65 73 63    assert( (bDesc
5090: 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  ==0 && iRowid>=i
50a0: 4c 61 73 74 29 20 7c 7c 20 28 62 44 65 73 63 3d  Last) || (bDesc=
50b0: 3d 31 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c  =1 && iRowid<=iL
50c0: 61 73 74 29 20 29 3b 0a 20 20 7d 0a 20 20 2a 70  ast) );.  }.  *p
50d0: 69 4c 61 73 74 20 3d 20 69 52 6f 77 69 64 3b 0a  iLast = iRowid;.
50e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
50f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45  static int fts5E
5100: 78 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e 63  xprSynonymAdvanc
5110: 65 74 6f 28 0a 20 20 46 74 73 35 45 78 70 72 54  eto(.  Fts5ExprT
5120: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
5130: 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 69         /* Term i
5140: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
5150: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  ce */.  int bDes
5160: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5170: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5180: 69 66 20 69 74 65 72 61 74 6f 72 20 69 73 20 22  if iterator is "
5190: 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20  rowid DESC" */. 
51a0: 20 69 36 34 20 2a 70 69 4c 61 73 74 2c 20 20 20   i64 *piLast,   
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 61 73 74   /* IN/OUT: Last
51d0: 65 73 74 20 72 6f 77 69 64 20 73 65 65 6e 20 73  est rowid seen s
51e0: 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  o far */.  int *
51f0: 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20  pRc             
5200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
5210: 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
5220: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
5230: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 36 34 20  QLITE_OK;.  i64 
5240: 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74 3b  iLast = *piLast;
5250: 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20  .  Fts5ExprTerm 
5260: 2a 70 3b 0a 20 20 69 6e 74 20 62 45 6f 66 20 3d  *p;.  int bEof =
5270: 20 30 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 54 65   0;..  for(p=pTe
5280: 72 6d 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rm; rc==SQLITE_O
5290: 4b 20 26 26 20 70 3b 20 70 3d 70 2d 3e 70 53 79  K && p; p=p->pSy
52a0: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 69 66 28 20  nonym){.    if( 
52b0: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
52c0: 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20  of(p->pIter)==0 
52d0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
52e0: 77 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e  wid = p->pIter->
52f0: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 66  iRowid;.      if
5300: 28 20 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69  ( (bDesc==0 && i
5310: 4c 61 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20  Last>iRowid) || 
5320: 28 62 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c  (bDesc && iLast<
5330: 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20  iRowid) ){.     
5340: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
5350: 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ts5IterNextFrom(
5360: 70 2d 3e 70 49 74 65 72 2c 20 69 4c 61 73 74 29  p->pIter, iLast)
5370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5380: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
5390: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
53a0: 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 62  *pRc = rc;.    b
53b0: 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
53c0: 7b 0a 20 20 20 20 2a 70 69 4c 61 73 74 20 3d 20  {.    *piLast = 
53d0: 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52  fts5ExprSynonymR
53e0: 6f 77 69 64 28 70 54 65 72 6d 2c 20 62 44 65 73  owid(pTerm, bDes
53f0: 63 2c 20 26 62 45 6f 66 29 3b 0a 20 20 7d 0a 20  c, &bEof);.  }. 
5400: 20 72 65 74 75 72 6e 20 62 45 6f 66 3b 0a 7d 0a   return bEof;.}.
5410: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
5420: 35 45 78 70 72 4e 65 61 72 54 65 73 74 28 0a 20  5ExprNearTest(. 
5430: 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73   int *pRc,.  Fts
5440: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  5Expr *pExpr,   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5460: 45 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  Expression that 
5470: 70 4e 65 61 72 20 69 73 20 61 20 70 61 72 74 20  pNear is a part 
5480: 6f 66 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  of */.  Fts5Expr
5490: 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20  Node *pNode     
54a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
54b0: 4e 45 41 52 22 20 6e 6f 64 65 20 28 46 54 53 35  NEAR" node (FTS5
54c0: 5f 53 54 52 49 4e 47 29 20 2a 2f 0a 29 7b 0a 20  _STRING) */.){. 
54d0: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
54e0: 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d   *pNear = pNode-
54f0: 3e 70 4e 65 61 72 3b 0a 20 20 69 6e 74 20 72 63  >pNear;.  int rc
5500: 20 3d 20 2a 70 52 63 3b 0a 0a 20 20 69 66 28 20   = *pRc;..  if( 
5510: 70 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e  pExpr->pConfig->
5520: 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45  eDetail!=FTS5_DE
5530: 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  TAIL_FULL ){.   
5540: 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
5550: 54 65 72 6d 3b 0a 20 20 20 20 46 74 73 35 45 78  Term;.    Fts5Ex
5560: 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
5570: 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72  e = pNear->apPhr
5580: 61 73 65 5b 30 5d 3b 0a 20 20 20 20 70 50 68 72  ase[0];.    pPhr
5590: 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d  ase->poslist.n =
55a0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72   0;.    for(pTer
55b0: 6d 3d 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72  m=&pPhrase->aTer
55c0: 6d 5b 30 5d 3b 20 70 54 65 72 6d 3b 20 70 54 65  m[0]; pTerm; pTe
55d0: 72 6d 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  rm=pTerm->pSynon
55e0: 79 6d 29 7b 0a 20 20 20 20 20 20 46 74 73 35 49  ym){.      Fts5I
55f0: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
5600: 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0a  = pTerm->pIter;.
5610: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5620: 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74  3Fts5IterEof(pIt
5630: 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  er)==0 ){.      
5640: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f    if( pIter->iRo
5650: 77 69 64 3d 3d 70 4e 6f 64 65 2d 3e 69 52 6f 77  wid==pNode->iRow
5660: 69 64 20 26 26 20 70 49 74 65 72 2d 3e 6e 44 61  id && pIter->nDa
5670: 74 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ta>0 ){.        
5680: 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69    pPhrase->posli
5690: 73 74 2e 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  st.n = 1;.      
56a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
56b0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 68  }.    return pPh
56c0: 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b  rase->poslist.n;
56d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
56e0: 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t i;..    /* Che
56f0: 63 6b 20 74 68 61 74 20 65 61 63 68 20 70 68 72  ck that each phr
5700: 61 73 65 20 69 6e 20 74 68 65 20 6e 65 61 72 73  ase in the nears
5710: 65 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  et matches the c
5720: 75 72 72 65 6e 74 20 72 6f 77 2e 0a 20 20 20 20  urrent row..    
5730: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
5740: 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
5750: 20 62 75 66 66 65 72 73 20 61 74 20 74 68 65 20   buffers at the 
5760: 73 61 6d 65 20 74 69 6d 65 2e 20 49 66 20 61 6e  same time. If an
5770: 79 0a 20 20 20 20 2a 2a 20 70 68 72 61 73 65 20  y.    ** phrase 
5780: 69 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20  is not a match, 
5790: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
57a0: 20 6c 6f 6f 70 20 65 61 72 6c 79 2e 20 20 2a 2f   loop early.  */
57b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
57c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
57d0: 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b  <pNear->nPhrase;
57e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   i++){.      Fts
57f0: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
5800: 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70  rase = pNear->ap
5810: 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20  Phrase[i];.     
5820: 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54   if( pPhrase->nT
5830: 65 72 6d 3e 31 20 7c 7c 20 70 50 68 72 61 73 65  erm>1 || pPhrase
5840: 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f  ->aTerm[0].pSyno
5850: 6e 79 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  nym .       || p
5860: 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 7c 7c  Near->pColset ||
5870: 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b   pPhrase->aTerm[
5880: 30 5d 2e 62 46 69 72 73 74 0a 20 20 20 20 20 20  0].bFirst.      
5890: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ){.        int b
58a0: 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
58b0: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
58c0: 50 68 72 61 73 65 49 73 4d 61 74 63 68 28 70 4e  PhraseIsMatch(pN
58d0: 6f 64 65 2c 20 70 50 68 72 61 73 65 2c 20 26 62  ode, pPhrase, &b
58e0: 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 20 20  Match);.        
58f0: 69 66 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 20  if( bMatch==0 ) 
5900: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
5910: 73 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  se{.        Fts5
5920: 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
5930: 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72   = pPhrase->aTer
5940: 6d 5b 30 5d 2e 70 49 74 65 72 3b 0a 20 20 20 20  m[0].pIter;.    
5950: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
5960: 74 28 26 72 63 2c 20 26 70 50 68 72 61 73 65 2d  t(&rc, &pPhrase-
5970: 3e 70 6f 73 6c 69 73 74 2c 20 70 49 74 65 72 2d  >poslist, pIter-
5980: 3e 6e 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 70  >nData, pIter->p
5990: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
59a0: 20 20 20 7d 0a 0a 20 20 20 20 2a 70 52 63 20 3d     }..    *pRc =
59b0: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d   rc;.    if( i==
59c0: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20 26  pNear->nPhrase &
59d0: 26 20 28 69 3d 3d 31 20 7c 7c 20 66 74 73 35 45  & (i==1 || fts5E
59e0: 78 70 72 4e 65 61 72 49 73 4d 61 74 63 68 28 70  xprNearIsMatch(p
59f0: 52 63 2c 20 70 4e 65 61 72 29 29 20 29 7b 0a 20  Rc, pNear)) ){. 
5a00: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5a10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
5a20: 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  0;.  }.}.../*.**
5a30: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   Initialize all 
5a40: 74 65 72 6d 20 69 74 65 72 61 74 6f 72 73 20 69  term iterators i
5a50: 6e 20 74 68 65 20 70 4e 65 61 72 20 6f 62 6a 65  n the pNear obje
5a60: 63 74 2e 20 49 66 20 61 6e 79 20 74 65 72 6d 20  ct. If any term 
5a70: 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 74 6f 20 6d  is found.** to m
5a80: 61 74 63 68 20 6e 6f 20 64 6f 63 75 6d 65 6e 74  atch no document
5a90: 73 20 61 74 20 61 6c 6c 2c 20 72 65 74 75 72 6e  s at all, return
5aa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
5ab0: 68 6f 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e  hout initializin
5ac0: 67 20 61 6e 79 0a 2a 2a 20 66 75 72 74 68 65 72  g any.** further
5ad0: 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   iterators..**.*
5ae0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
5af0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
5b00: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
5b10: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
5b20: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
5b30: 4b 2e 20 49 74 20 69 73 20 6e 6f 74 20 63 6f 6e  K. It is not con
5b40: 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72  sidered an error
5b50: 20 69 66 20 73 6f 6d 65 20 74 65 72 6d 20 6d 61   if some term ma
5b60: 74 63 68 65 73 20 7a 65 72 6f 0a 2a 2a 20 64 6f  tches zero.** do
5b70: 63 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  cuments..*/.stat
5b80: 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e  ic int fts5ExprN
5b90: 65 61 72 49 6e 69 74 41 6c 6c 28 0a 20 20 46 74  earInitAll(.  Ft
5ba0: 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20  s5Expr *pExpr,. 
5bb0: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
5bc0: 4e 6f 64 65 0a 29 7b 0a 20 20 46 74 73 35 45 78  Node.){.  Fts5Ex
5bd0: 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
5be0: 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b   = pNode->pNear;
5bf0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
5c00: 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  ert( pNode->bNom
5c10: 61 74 63 68 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  atch==0 );.  for
5c20: 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e  (i=0; i<pNear->n
5c30: 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20  Phrase; i++){.  
5c40: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
5c50: 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61   *pPhrase = pNea
5c60: 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a  r->apPhrase[i];.
5c70: 20 20 20 20 69 66 28 20 70 50 68 72 61 73 65 2d      if( pPhrase-
5c80: 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20  >nTerm==0 ){.   
5c90: 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d     pNode->bEof =
5ca0: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
5cb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5cc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5cd0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
5ce0: 30 3b 20 6a 3c 70 50 68 72 61 73 65 2d 3e 6e 54  0; j<pPhrase->nT
5cf0: 65 72 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  erm; j++){.     
5d00: 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
5d10: 2a 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73  *pTerm = &pPhras
5d20: 65 2d 3e 61 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  e->aTerm[j];.   
5d30: 20 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72       Fts5ExprTer
5d40: 6d 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  m *p;.        in
5d50: 74 20 62 48 69 74 20 3d 20 30 3b 0a 0a 20 20 20  t bHit = 0;..   
5d60: 20 20 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d       for(p=pTerm
5d70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e  ; p; p=p->pSynon
5d80: 79 6d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ym){.          i
5d90: 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  nt rc;.         
5da0: 20 69 66 28 20 70 2d 3e 70 49 74 65 72 20 29 7b   if( p->pIter ){
5db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
5dc0: 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
5dd0: 65 28 70 2d 3e 70 49 74 65 72 29 3b 0a 20 20 20  e(p->pIter);.   
5de0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 49 74 65           p->pIte
5df0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
5e00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
5e10: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
5e20: 65 78 51 75 65 72 79 28 0a 20 20 20 20 20 20 20  exQuery(.       
5e30: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 49         pExpr->pI
5e40: 6e 64 65 78 2c 20 70 2d 3e 7a 54 65 72 6d 2c 20  ndex, p->zTerm, 
5e50: 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a  (int)strlen(p->z
5e60: 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20  Term),.         
5e70: 20 20 20 20 20 28 70 54 65 72 6d 2d 3e 62 50 72       (pTerm->bPr
5e80: 65 66 69 78 20 3f 20 46 54 53 35 49 4e 44 45 58  efix ? FTS5INDEX
5e90: 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 3a 20  _QUERY_PREFIX : 
5ea0: 30 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  0) |.           
5eb0: 20 20 20 28 70 45 78 70 72 2d 3e 62 44 65 73 63     (pExpr->bDesc
5ec0: 20 3f 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   ? FTS5INDEX_QUE
5ed0: 52 59 5f 44 45 53 43 20 3a 20 30 29 2c 0a 20 20  RY_DESC : 0),.  
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 61              pNea
5ef0: 72 2d 3e 70 43 6f 6c 73 65 74 2c 0a 20 20 20 20  r->pColset,.    
5f00: 20 20 20 20 20 20 20 20 20 20 26 70 2d 3e 70 49            &p->pI
5f10: 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ter.          );
5f20: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
5f30: 74 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t( (rc==SQLITE_O
5f40: 4b 29 3d 3d 28 70 2d 3e 70 49 74 65 72 21 3d 30  K)==(p->pIter!=0
5f50: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
5f60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5f70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
5f80: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
5f90: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
5fa0: 66 28 70 2d 3e 70 49 74 65 72 29 20 29 7b 0a 20  f(p->pIter) ){. 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 62 48 69 74 20             bHit 
5fc0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
5fd0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
5fe0: 20 20 20 20 69 66 28 20 62 48 69 74 3d 3d 30 20      if( bHit==0 
5ff0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f  ){.          pNo
6000: 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  de->bEof = 1;.  
6010: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
6020: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6030: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6040: 7d 0a 20 20 7d 0a 0a 20 20 70 4e 6f 64 65 2d 3e  }.  }..  pNode->
6050: 62 45 6f 66 20 3d 20 30 3b 0a 20 20 72 65 74 75  bEof = 0;.  retu
6060: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6070: 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  ./*.** If pExpr 
6080: 69 73 20 61 6e 20 41 53 43 20 69 74 65 72 61 74  is an ASC iterat
6090: 6f 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  or, this functio
60a0: 6e 20 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75  n returns a valu
60b0: 65 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 61  e with the.** sa
60c0: 6d 65 20 73 69 67 6e 20 61 73 3a 0a 2a 2a 0a 2a  me sign as:.**.*
60d0: 2a 20 20 20 28 69 4c 68 73 20 2d 20 69 52 68 73  *   (iLhs - iRhs
60e0: 29 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ).**.** Otherwis
60f0: 65 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  e, if this is a 
6100: 44 45 53 43 20 69 74 65 72 61 74 6f 72 2c 20 74  DESC iterator, t
6110: 68 65 20 6f 70 70 6f 73 69 74 65 20 69 73 20 72  he opposite is r
6120: 65 74 75 72 6e 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  eturned:.**.**  
6130: 20 28 69 52 68 73 20 2d 20 69 4c 68 73 29 0a 2a   (iRhs - iLhs).*
6140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
6150: 35 52 6f 77 69 64 43 6d 70 28 0a 20 20 46 74 73  5RowidCmp(.  Fts
6160: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20  5Expr *pExpr,.  
6170: 69 36 34 20 69 4c 68 73 2c 0a 20 20 69 36 34 20  i64 iLhs,.  i64 
6180: 69 52 68 73 0a 29 7b 0a 20 20 61 73 73 65 72 74  iRhs.){.  assert
6190: 28 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d  ( pExpr->bDesc==
61a0: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 62 44 65 73  0 || pExpr->bDes
61b0: 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 45  c==1 );.  if( pE
61c0: 78 70 72 2d 3e 62 44 65 73 63 3d 3d 30 20 29 7b  xpr->bDesc==0 ){
61d0: 0a 20 20 20 20 69 66 28 20 69 4c 68 73 3c 69 52  .    if( iLhs<iR
61e0: 68 73 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  hs ) return -1;.
61f0: 20 20 20 20 72 65 74 75 72 6e 20 28 69 4c 68 73      return (iLhs
6200: 20 3e 20 69 52 68 73 29 3b 0a 20 20 7d 65 6c 73   > iRhs);.  }els
6210: 65 7b 0a 20 20 20 20 69 66 28 20 69 4c 68 73 3e  e{.    if( iLhs>
6220: 69 52 68 73 20 29 20 72 65 74 75 72 6e 20 2d 31  iRhs ) return -1
6230: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 4c  ;.    return (iL
6240: 68 73 20 3c 20 69 52 68 73 29 3b 0a 20 20 7d 0a  hs < iRhs);.  }.
6250: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
6260: 74 73 35 45 78 70 72 53 65 74 45 6f 66 28 46 74  ts5ExprSetEof(Ft
6270: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
6280: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  e){.  int i;.  p
6290: 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Node->bEof = 1;.
62a0: 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63    pNode->bNomatc
62b0: 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  h = 0;.  for(i=0
62c0: 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
62d0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73  d; i++){.    fts
62e0: 35 45 78 70 72 53 65 74 45 6f 66 28 70 4e 6f 64  5ExprSetEof(pNod
62f0: 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0a  e->apChild[i]);.
6300: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
6310: 69 64 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a  id fts5ExprNodeZ
6320: 65 72 6f 50 6f 73 6c 69 73 74 28 46 74 73 35 45  eroPoslist(Fts5E
6330: 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b  xprNode *pNode){
6340: 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54  .  if( pNode->eT
6350: 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47  ype==FTS5_STRING
6360: 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65   || pNode->eType
6370: 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29 7b 0a 20  ==FTS5_TERM ){. 
6380: 20 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73     Fts5ExprNears
6390: 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64  et *pNear = pNod
63a0: 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 20 20 69 6e  e->pNear;.    in
63b0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
63c0: 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61  ; i<pNear->nPhra
63d0: 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  se; i++){.      
63e0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
63f0: 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d  pPhrase = pNear-
6400: 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20  >apPhrase[i];.  
6410: 20 20 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73      pPhrase->pos
6420: 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  list.n = 0;.    
6430: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
6440: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6450: 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69  0; i<pNode->nChi
6460: 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
6470: 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f  fts5ExprNodeZero
6480: 50 6f 73 6c 69 73 74 28 70 4e 6f 64 65 2d 3e 61  Poslist(pNode->a
6490: 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  pChild[i]);.    
64a0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  }.  }.}..../*.**
64b0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
64c0: 75 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ues currently in
64d0: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 74  dicated by the t
64e0: 77 6f 20 6e 6f 64 65 73 20 61 73 20 66 6f 6c 6c  wo nodes as foll
64f0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 72 65  ows:.**.**    re
6500: 73 20 3d 20 28 2a 70 31 29 20 2d 20 28 2a 70 32  s = (*p1) - (*p2
6510: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 64 65 73 20 74 68  ).**.** Nodes th
6520: 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 75  at point to valu
6530: 65 73 20 74 68 61 74 20 63 6f 6d 65 20 6c 61 74  es that come lat
6540: 65 72 20 69 6e 20 74 68 65 20 69 74 65 72 61 74  er in the iterat
6550: 69 6f 6e 20 6f 72 64 65 72 20 61 72 65 0a 2a 2a  ion order are.**
6560: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
6570: 65 20 6c 61 72 67 65 72 2e 20 4e 6f 64 65 73 20  e larger. Nodes 
6580: 61 74 20 45 4f 46 20 61 72 65 20 74 68 65 20 6c  at EOF are the l
6590: 61 72 67 65 73 74 20 6f 66 20 61 6c 6c 2e 0a 2a  argest of all..*
65a0: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
65b0: 74 68 61 74 20 69 66 20 74 68 65 20 69 74 65 72  that if the iter
65c0: 61 74 69 6f 6e 20 6f 72 64 65 72 20 69 73 20 41  ation order is A
65d0: 53 43 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  SC, then numeric
65e0: 61 6c 6c 79 20 6c 61 72 67 65 72 0a 2a 2a 20 72  ally larger.** r
65f0: 6f 77 69 64 73 20 61 72 65 20 63 6f 6e 73 69 64  owids are consid
6600: 65 72 65 64 20 6c 61 72 67 65 72 2e 20 4f 72 20  ered larger. Or 
6610: 69 66 20 69 74 20 69 73 20 74 68 65 20 64 65 66  if it is the def
6620: 61 75 6c 74 20 44 45 53 43 2c 20 6e 75 6d 65 72  ault DESC, numer
6630: 69 63 61 6c 6c 79 0a 2a 2a 20 73 6d 61 6c 6c 65  ically.** smalle
6640: 72 20 72 6f 77 69 64 73 20 61 72 65 20 6c 61 72  r rowids are lar
6650: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
6660: 6e 74 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61  nt fts5NodeCompa
6670: 72 65 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a  re(.  Fts5Expr *
6680: 70 45 78 70 72 2c 0a 20 20 46 74 73 35 45 78 70  pExpr,.  Fts5Exp
6690: 72 4e 6f 64 65 20 2a 70 31 2c 20 0a 20 20 46 74  rNode *p1, .  Ft
66a0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 32 0a 29  s5ExprNode *p2.)
66b0: 7b 0a 20 20 69 66 28 20 70 32 2d 3e 62 45 6f 66  {.  if( p2->bEof
66c0: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
66d0: 69 66 28 20 70 31 2d 3e 62 45 6f 66 20 29 20 72  if( p1->bEof ) r
66e0: 65 74 75 72 6e 20 2b 31 3b 0a 20 20 72 65 74 75  eturn +1;.  retu
66f0: 72 6e 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28  rn fts5RowidCmp(
6700: 70 45 78 70 72 2c 20 70 31 2d 3e 69 52 6f 77 69  pExpr, p1->iRowi
6710: 64 2c 20 70 32 2d 3e 69 52 6f 77 69 64 29 3b 0a  d, p2->iRowid);.
6720: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 69 6e 64  }../*.** All ind
6730: 69 76 69 64 75 61 6c 20 74 65 72 6d 20 69 74 65  ividual term ite
6740: 72 61 74 6f 72 73 20 69 6e 20 70 4e 65 61 72 20  rators in pNear 
6750: 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
6760: 6f 20 62 65 20 76 61 6c 69 64 20 77 68 65 6e 0a  o be valid when.
6770: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
6780: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73   is called. This
6790: 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
67a0: 20 69 66 20 61 6c 6c 20 74 65 72 6d 20 69 74 65   if all term ite
67b0: 72 61 74 6f 72 73 0a 2a 2a 20 70 6f 69 6e 74 20  rators.** point 
67c0: 74 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69  to the same rowi
67d0: 64 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 61  d, and if not, a
67e0: 64 76 61 6e 63 65 73 20 74 68 65 6d 20 75 6e 74  dvances them unt
67f0: 69 6c 20 74 68 65 79 20 64 6f 2e 0a 2a 2a 20 49  il they do..** I
6800: 66 20 61 6e 20 45 4f 46 20 69 73 20 72 65 61 63  f an EOF is reac
6810: 68 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  hed before this 
6820: 68 61 70 70 65 6e 73 2c 20 2a 70 62 45 6f 66 20  happens, *pbEof 
6830: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 62  is set to true b
6840: 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
6850: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ng..**.** SQLITE
6860: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
6870: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
6880: 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  rs, or an SQLite
6890: 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20   error code .** 
68a0: 6f 74 68 65 72 77 69 73 65 2e 20 49 74 20 69 73  otherwise. It is
68b0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
68c0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
68d0: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 72 65 61   an iterator rea
68e0: 63 68 65 73 0a 2a 2a 20 45 4f 46 2e 0a 2a 2f 0a  ches.** EOF..*/.
68f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45  static int fts5E
6900: 78 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52 49  xprNodeTest_STRI
6910: 4e 47 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a  NG(.  Fts5Expr *
6920: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
6930: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6940: 69 6f 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f  ion pPhrase belo
6950: 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35  ngs to */.  Fts5
6960: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 0a  ExprNode *pNode.
6970: 29 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61  ){.  Fts5ExprNea
6980: 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e  rset *pNear = pN
6990: 6f 64 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 46 74  ode->pNear;.  Ft
69a0: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 4c  s5ExprPhrase *pL
69b0: 65 66 74 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50  eft = pNear->apP
69c0: 68 72 61 73 65 5b 30 5d 3b 0a 20 20 69 6e 74 20  hrase[0];.  int 
69d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
69e0: 20 20 69 36 34 20 69 4c 61 73 74 3b 20 20 20 20    i64 iLast;    
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 2f 2a 20 4c 61 73 74 65 73 74 20 72 6f 77    /* Lastest row
6a10: 69 64 20 61 6e 79 20 69 74 65 72 61 74 6f 72 20  id any iterator 
6a20: 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 69  points to */.  i
6a30: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a50: 2a 20 50 68 72 61 73 65 20 61 6e 64 20 74 6f 6b  * Phrase and tok
6a60: 65 6e 20 69 6e 64 65 78 2c 20 72 65 73 70 65 63  en index, respec
6a70: 74 69 76 65 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  tively */.  int 
6a80: 62 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  bMatch;         
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6aa0: 72 75 65 20 69 66 20 61 6c 6c 20 74 65 72 6d 73  rue if all terms
6ab0: 20 61 72 65 20 61 74 20 74 68 65 20 73 61 6d 65   are at the same
6ac0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 6f 6e 73   rowid */.  cons
6ad0: 74 20 69 6e 74 20 62 44 65 73 63 20 3d 20 70 45  t int bDesc = pE
6ae0: 78 70 72 2d 3e 62 44 65 73 63 3b 0a 0a 20 20 2f  xpr->bDesc;..  /
6af0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
6b00: 73 20 6e 6f 64 65 20 73 68 6f 75 6c 64 20 6e 6f  s node should no
6b10: 74 20 62 65 20 46 54 53 35 5f 54 45 52 4d 20 2a  t be FTS5_TERM *
6b20: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 61  /.  assert( pNea
6b30: 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20 0a 20 20  r->nPhrase>1 .  
6b40: 20 20 20 20 20 7c 7c 20 70 4e 65 61 72 2d 3e 61       || pNear->a
6b50: 70 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54 65 72  pPhrase[0]->nTer
6b60: 6d 3e 31 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  m>1 .       || p
6b70: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
6b80: 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e  ]->aTerm[0].pSyn
6b90: 6f 6e 79 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70  onym.       || p
6ba0: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
6bb0: 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72  ]->aTerm[0].bFir
6bc0: 73 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  st.  );..  /* In
6bd0: 69 74 69 61 6c 69 7a 65 20 69 4c 61 73 74 2c 20  itialize iLast, 
6be0: 74 68 65 20 22 6c 61 73 74 65 73 74 22 20 72 6f  the "lastest" ro
6bf0: 77 69 64 20 61 6e 79 20 69 74 65 72 61 74 6f 72  wid any iterator
6c00: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 49 66 20 74   points to. If t
6c10: 68 65 0a 20 20 2a 2a 20 69 74 65 72 61 74 6f 72  he.  ** iterator
6c20: 20 73 6b 69 70 73 20 74 68 72 6f 75 67 68 20 72   skips through r
6c30: 6f 77 69 64 73 20 69 6e 20 74 68 65 20 64 65 66  owids in the def
6c40: 61 75 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f  ault ascending o
6c50: 72 64 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 73  rder, this means
6c60: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75  .  ** the maximu
6c70: 6d 20 72 6f 77 69 64 2e 20 4f 72 2c 20 69 66 20  m rowid. Or, if 
6c80: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
6c90: 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20  "ORDER BY rowid 
6ca0: 44 45 53 43 22 2c 20 74 68 65 6e 20 69 74 0a 20  DESC", then it. 
6cb0: 20 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 6d 69   ** means the mi
6cc0: 6e 69 6d 75 6d 20 72 6f 77 69 64 2e 20 20 2a 2f  nimum rowid.  */
6cd0: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 61 54  .  if( pLeft->aT
6ce0: 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 20  erm[0].pSynonym 
6cf0: 29 7b 0a 20 20 20 20 69 4c 61 73 74 20 3d 20 66  ){.    iLast = f
6d00: 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f  ts5ExprSynonymRo
6d10: 77 69 64 28 26 70 4c 65 66 74 2d 3e 61 54 65 72  wid(&pLeft->aTer
6d20: 6d 5b 30 5d 2c 20 62 44 65 73 63 2c 20 30 29 3b  m[0], bDesc, 0);
6d30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4c  .  }else{.    iL
6d40: 61 73 74 20 3d 20 70 4c 65 66 74 2d 3e 61 54 65  ast = pLeft->aTe
6d50: 72 6d 5b 30 5d 2e 70 49 74 65 72 2d 3e 69 52 6f  rm[0].pIter->iRo
6d60: 77 69 64 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b  wid;.  }..  do {
6d70: 0a 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31 3b  .    bMatch = 1;
6d80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6d90: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20  pNear->nPhrase; 
6da0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i++){.      Fts5
6db0: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
6dc0: 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50  ase = pNear->apP
6dd0: 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20 20  hrase[i];.      
6de0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 68 72 61  for(j=0; j<pPhra
6df0: 73 65 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 29 7b  se->nTerm; j++){
6e00: 0a 20 20 20 20 20 20 20 20 46 74 73 35 45 78 70  .        Fts5Exp
6e10: 72 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  rTerm *pTerm = &
6e20: 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 6a  pPhrase->aTerm[j
6e30: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
6e40: 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29  Term->pSynonym )
6e50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
6e60: 69 52 6f 77 69 64 20 3d 20 66 74 73 35 45 78 70  iRowid = fts5Exp
6e70: 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70 54  rSynonymRowid(pT
6e80: 65 72 6d 2c 20 62 44 65 73 63 2c 20 30 29 3b 0a  erm, bDesc, 0);.
6e90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
6ea0: 6f 77 69 64 3d 3d 69 4c 61 73 74 20 29 20 63 6f  owid==iLast ) co
6eb0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6ec0: 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20    bMatch = 0;.  
6ed0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
6ee0: 45 78 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e  ExprSynonymAdvan
6ef0: 63 65 74 6f 28 70 54 65 72 6d 2c 20 62 44 65 73  ceto(pTerm, bDes
6f00: 63 2c 20 26 69 4c 61 73 74 2c 20 26 72 63 29 20  c, &iLast, &rc) 
6f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
6f20: 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d  Node->bNomatch =
6f30: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
6f40: 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b  pNode->bEof = 1;
6f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
6f60: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
6f70: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
6f80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  e{.          Fts
6f90: 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
6fa0: 72 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65  r = pPhrase->aTe
6fb0: 72 6d 5b 6a 5d 2e 70 49 74 65 72 3b 0a 20 20 20  rm[j].pIter;.   
6fc0: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
6fd0: 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 20  ->iRowid==iLast 
6fe0: 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 29  || pIter->bEof )
6ff0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7000: 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20 30 3b       bMatch = 0;
7010: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
7020: 74 73 35 45 78 70 72 41 64 76 61 6e 63 65 74 6f  ts5ExprAdvanceto
7030: 28 70 49 74 65 72 2c 20 62 44 65 73 63 2c 20 26  (pIter, bDesc, &
7040: 69 4c 61 73 74 2c 20 26 72 63 2c 20 26 70 4e 6f  iLast, &rc, &pNo
7050: 64 65 2d 3e 62 45 6f 66 29 20 29 7b 0a 20 20 20  de->bEof) ){.   
7060: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7070: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
7080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7090: 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
70a0: 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a  ( bMatch==0 );..
70b0: 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20    pNode->iRowid 
70c0: 3d 20 69 4c 61 73 74 3b 0a 20 20 70 4e 6f 64 65  = iLast;.  pNode
70d0: 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28 28 30  ->bNomatch = ((0
70e0: 3d 3d 66 74 73 35 45 78 70 72 4e 65 61 72 54 65  ==fts5ExprNearTe
70f0: 73 74 28 26 72 63 2c 20 70 45 78 70 72 2c 20 70  st(&rc, pExpr, p
7100: 4e 6f 64 65 29 29 20 26 26 20 72 63 3d 3d 53 51  Node)) && rc==SQ
7110: 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 61 73 73 65  LITE_OK);.  asse
7120: 72 74 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d  rt( pNode->bEof=
7130: 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 4e 6f  =0 || pNode->bNo
7140: 6d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20 72  match==0 );..  r
7150: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7160: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 66  ** Advance the f
7170: 69 72 73 74 20 74 65 72 6d 20 69 74 65 72 61 74  irst term iterat
7180: 6f 72 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  or in the first 
7190: 70 68 72 61 73 65 20 6f 66 20 70 4e 65 61 72 2e  phrase of pNear.
71a0: 20 53 65 74 20 6f 75 74 70 75 74 0a 2a 2a 20 76   Set output.** v
71b0: 61 72 69 61 62 6c 65 20 2a 70 62 45 6f 66 20 74  ariable *pbEof t
71c0: 6f 20 74 72 75 65 20 69 66 20 69 74 20 72 65 61  o true if it rea
71d0: 63 68 65 73 20 45 4f 46 20 6f 72 20 69 66 20 61  ches EOF or if a
71e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
71f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
7200: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
7210: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
7220: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
7230: 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
7240: 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
7250: 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e  nt fts5ExprNodeN
7260: 65 78 74 5f 53 54 52 49 4e 47 28 0a 20 20 46 74  ext_STRING(.  Ft
7270: 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s5Expr *pExpr,  
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7290: 20 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72   Expression pPhr
72a0: 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  ase belongs to *
72b0: 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  /.  Fts5ExprNode
72c0: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
72d0: 20 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 52 49      /* FTS5_STRI
72e0: 4e 47 20 6f 72 20 46 54 53 35 5f 54 45 52 4d 20  NG or FTS5_TERM 
72f0: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46  node */.  int bF
7300: 72 6f 6d 56 61 6c 69 64 2c 0a 20 20 69 36 34 20  romValid,.  i64 
7310: 69 46 72 6f 6d 20 0a 29 7b 0a 20 20 46 74 73 35  iFrom .){.  Fts5
7320: 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20  ExprTerm *pTerm 
7330: 3d 20 26 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d  = &pNode->pNear-
7340: 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 61 54  >apPhrase[0]->aT
7350: 65 72 6d 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63  erm[0];.  int rc
7360: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
7370: 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68   pNode->bNomatch
7380: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72   = 0;.  if( pTer
7390: 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 7b 0a 20  m->pSynonym ){. 
73a0: 20 20 20 69 6e 74 20 62 45 6f 66 20 3d 20 31 3b     int bEof = 1;
73b0: 0a 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72  .    Fts5ExprTer
73c0: 6d 20 2a 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  m *p;..    /* Fi
73d0: 6e 64 20 74 68 65 20 66 69 72 73 74 65 73 74 20  nd the firstest 
73e0: 72 6f 77 69 64 20 61 6e 79 20 73 79 6e 6f 6e 79  rowid any synony
73f0: 6d 20 70 6f 69 6e 74 73 20 74 6f 2e 20 2a 2f 0a  m points to. */.
7400: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
7410: 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d   fts5ExprSynonym
7420: 52 6f 77 69 64 28 70 54 65 72 6d 2c 20 70 45 78  Rowid(pTerm, pEx
7430: 70 72 2d 3e 62 44 65 73 63 2c 20 30 29 3b 0a 0a  pr->bDesc, 0);..
7440: 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65      /* Advance e
7450: 61 63 68 20 69 74 65 72 61 74 6f 72 20 74 68 61  ach iterator tha
7460: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
7470: 74 73 20 74 6f 20 69 52 6f 77 69 64 2e 20 4f 72  ts to iRowid. Or
7480: 2c 20 69 66 20 69 46 72 6f 6d 0a 20 20 20 20 2a  , if iFrom.    *
7490: 2a 20 69 73 20 76 61 6c 69 64 20 2d 20 65 61 63  * is valid - eac
74a0: 68 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  h iterator that 
74b0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 72 6f 77 69  points to a rowi
74c0: 64 20 62 65 66 6f 72 65 20 69 46 72 6f 6d 2e 20  d before iFrom. 
74d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54   */.    for(p=pT
74e0: 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
74f0: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20 69 66  nonym){.      if
7500: 28 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ( sqlite3Fts5Ite
7510: 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d  rEof(p->pIter)==
7520: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  0 ){.        i64
7530: 20 69 69 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e   ii = p->pIter->
7540: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
7550: 69 66 28 20 69 69 3d 3d 69 52 6f 77 69 64 20 0a  if( ii==iRowid .
7560: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72           || (bFr
7570: 6f 6d 56 61 6c 69 64 20 26 26 20 69 69 21 3d 69  omValid && ii!=i
7580: 46 72 6f 6d 20 26 26 20 28 69 69 3e 69 46 72 6f  From && (ii>iFro
7590: 6d 29 3d 3d 70 45 78 70 72 2d 3e 62 44 65 73 63  m)==pExpr->bDesc
75a0: 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
75b0: 20 20 20 20 20 20 20 20 69 66 28 20 62 46 72 6f          if( bFro
75c0: 6d 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  mValid ){.      
75d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
75e0: 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
75f0: 6f 6d 28 70 2d 3e 70 49 74 65 72 2c 20 69 46 72  om(p->pIter, iFr
7600: 6f 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  om);.          }
7610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7620: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
7630: 73 35 49 74 65 72 4e 65 78 74 28 70 2d 3e 70 49  s5IterNext(p->pI
7640: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
7650: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
7660: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7680: 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
7690: 49 74 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72  IterEof(p->pIter
76a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
76b0: 20 20 20 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20      bEof = 0;.  
76c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
76d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
76e0: 20 20 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20     bEof = 0;.   
76f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7700: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
7710: 20 74 68 65 20 45 4f 46 20 66 6c 61 67 20 69 66   the EOF flag if
7720: 20 65 69 74 68 65 72 20 61 6c 6c 20 73 79 6e 6f   either all syno
7730: 6e 79 6d 20 69 74 65 72 61 74 6f 72 73 20 61 72  nym iterators ar
7740: 65 20 61 74 20 45 4f 46 20 6f 72 20 61 6e 0a 20  e at EOF or an. 
7750: 20 20 20 2a 2a 20 65 72 72 6f 72 20 68 61 73 20     ** error has 
7760: 6f 63 63 75 72 72 65 64 2e 20 20 2a 2f 0a 20 20  occurred.  */.  
7770: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
7780: 28 72 63 20 7c 7c 20 62 45 6f 66 29 3b 0a 20 20  (rc || bEof);.  
7790: 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 49  }else{.    Fts5I
77a0: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
77b0: 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0a  = pTerm->pIter;.
77c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 46 74 73  .    assert( Fts
77d0: 35 4e 6f 64 65 49 73 53 74 72 69 6e 67 28 70 4e  5NodeIsString(pN
77e0: 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ode) );.    if( 
77f0: 62 46 72 6f 6d 56 61 6c 69 64 20 29 7b 0a 20 20  bFromValid ){.  
7800: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7810: 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d  Fts5IterNextFrom
7820: 28 70 49 74 65 72 2c 20 69 46 72 6f 6d 29 3b 0a  (pIter, iFrom);.
7830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7840: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
7850: 35 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29  5IterNext(pIter)
7860: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 6f  ;.    }..    pNo
7870: 64 65 2d 3e 62 45 6f 66 20 3d 20 28 72 63 20 7c  de->bEof = (rc |
7880: 7c 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  | sqlite3Fts5Ite
7890: 72 45 6f 66 28 70 49 74 65 72 29 29 3b 0a 20 20  rEof(pIter));.  
78a0: 7d 0a 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  }..  if( pNode->
78b0: 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  bEof==0 ){.    a
78c0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
78d0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
78e0: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73   fts5ExprNodeTes
78f0: 74 5f 53 54 52 49 4e 47 28 70 45 78 70 72 2c 20  t_STRING(pExpr, 
7900: 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  pNode);.  }..  r
7910: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
7920: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
7930: 72 4e 6f 64 65 54 65 73 74 5f 54 45 52 4d 28 0a  rNodeTest_TERM(.
7940: 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70    Fts5Expr *pExp
7950: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
7960: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
7970: 74 68 61 74 20 70 4e 65 61 72 20 69 73 20 61 20  that pNear is a 
7980: 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73  part of */.  Fts
7990: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
79b0: 54 68 65 20 22 4e 45 41 52 22 20 6e 6f 64 65 20  The "NEAR" node 
79c0: 28 46 54 53 35 5f 54 45 52 4d 29 20 2a 2f 0a 29  (FTS5_TERM) */.)
79d0: 7b 0a 20 20 2f 2a 20 41 73 20 74 68 69 73 20 22  {.  /* As this "
79e0: 4e 45 41 52 22 20 6f 62 6a 65 63 74 20 69 73 20  NEAR" object is 
79f0: 61 63 74 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c  actually a singl
7a00: 65 20 70 68 72 61 73 65 20 74 68 61 74 20 63 6f  e phrase that co
7a10: 6e 73 69 73 74 73 20 0a 20 20 2a 2a 20 6f 66 20  nsists .  ** of 
7a20: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 6e  a single term on
7a30: 6c 79 2c 20 67 72 61 62 20 70 6f 69 6e 74 65 72  ly, grab pointer
7a40: 73 20 69 6e 74 6f 20 74 68 65 20 70 6f 73 6c 69  s into the posli
7a50: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
7a60: 65 0a 20 20 2a 2a 20 66 74 73 35 5f 69 6e 64 65  e.  ** fts5_inde
7a70: 78 2e 63 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  x.c iterator obj
7a80: 65 63 74 2e 20 54 68 69 73 20 69 73 20 6d 75 63  ect. This is muc
7a90: 68 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 79  h faster than sy
7aa0: 6e 74 68 65 73 69 7a 69 6e 67 20 0a 20 20 2a 2a  nthesizing .  **
7ab0: 20 61 20 6e 65 77 20 70 6f 73 6c 69 73 74 20 74   a new poslist t
7ac0: 68 65 20 77 61 79 20 77 65 20 68 61 76 65 20 74  he way we have t
7ad0: 6f 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6c  o for more compl
7ae0: 69 63 61 74 65 64 20 70 68 72 61 73 65 20 6f 72  icated phrase or
7af0: 20 4e 45 41 52 0a 20 20 2a 2a 20 65 78 70 72 65   NEAR.  ** expre
7b00: 73 73 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 46 74  ssions.  */.  Ft
7b10: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
7b20: 68 72 61 73 65 20 3d 20 70 4e 6f 64 65 2d 3e 70  hrase = pNode->p
7b30: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
7b40: 5d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  ];.  Fts5IndexIt
7b50: 65 72 20 2a 70 49 74 65 72 20 3d 20 70 50 68 72  er *pIter = pPhr
7b60: 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49  ase->aTerm[0].pI
7b70: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
7b80: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
7b90: 53 35 5f 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  S5_TERM );.  ass
7ba0: 65 72 74 28 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  ert( pNode->pNea
7bb0: 72 2d 3e 6e 50 68 72 61 73 65 3d 3d 31 20 26 26  r->nPhrase==1 &&
7bc0: 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3d   pPhrase->nTerm=
7bd0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
7be0: 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30  pPhrase->aTerm[0
7bf0: 5d 2e 70 53 79 6e 6f 6e 79 6d 3d 3d 30 20 29 3b  ].pSynonym==0 );
7c00: 0a 0a 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73  ..  pPhrase->pos
7c10: 6c 69 73 74 2e 6e 20 3d 20 70 49 74 65 72 2d 3e  list.n = pIter->
7c20: 6e 44 61 74 61 3b 0a 20 20 69 66 28 20 70 45 78  nData;.  if( pEx
7c30: 70 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  pr->pConfig->eDe
7c40: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
7c50: 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 70 50  L_FULL ){.    pP
7c60: 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 70  hrase->poslist.p
7c70: 20 3d 20 28 75 38 2a 29 70 49 74 65 72 2d 3e 70   = (u8*)pIter->p
7c80: 44 61 74 61 3b 0a 20 20 7d 0a 20 20 70 4e 6f 64  Data;.  }.  pNod
7c90: 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 49 74 65  e->iRowid = pIte
7ca0: 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 4e 6f  r->iRowid;.  pNo
7cb0: 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28  de->bNomatch = (
7cc0: 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
7cd0: 2e 6e 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e  .n==0);.  return
7ce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7cf0: 2a 0a 2a 2a 20 78 4e 65 78 74 28 29 20 6d 65 74  *.** xNext() met
7d00: 68 6f 64 20 66 6f 72 20 61 20 6e 6f 64 65 20 6f  hod for a node o
7d10: 66 20 74 79 70 65 20 46 54 53 35 5f 54 45 52 4d  f type FTS5_TERM
7d20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7d30: 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
7d40: 5f 54 45 52 4d 28 0a 20 20 46 74 73 35 45 78 70  _TERM(.  Fts5Exp
7d50: 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74 73  r *pExpr, .  Fts
7d60: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
7d70: 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c  ,.  int bFromVal
7d80: 69 64 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d 0a  id,.  i64 iFrom.
7d90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  ){.  int rc;.  F
7da0: 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
7db0: 74 65 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65  ter = pNode->pNe
7dc0: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
7dd0: 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 3b  >aTerm[0].pIter;
7de0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64  ..  assert( pNod
7df0: 65 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  e->bEof==0 );.  
7e00: 69 66 28 20 62 46 72 6f 6d 56 61 6c 69 64 20 29  if( bFromValid )
7e10: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7e20: 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
7e30: 6f 6d 28 70 49 74 65 72 2c 20 69 46 72 6f 6d 29  om(pIter, iFrom)
7e40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7e50: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
7e60: 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
7e70: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
7e80: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
7e90: 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
7ea0: 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ter)==0 ){.    r
7eb0: 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
7ec0: 54 65 73 74 5f 54 45 52 4d 28 70 45 78 70 72 2c  Test_TERM(pExpr,
7ed0: 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 65 6c 73 65   pNode);.  }else
7ee0: 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f  {.    pNode->bEo
7ef0: 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 6f 64 65  f = 1;.    pNode
7f00: 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a  ->bNomatch = 0;.
7f10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7f20: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7f30: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
7f40: 5f 4f 52 28 0a 20 20 46 74 73 35 45 78 70 72 20  _OR(.  Fts5Expr 
7f50: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
7f60: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
7f70: 73 69 6f 6e 20 6f 66 20 77 68 69 63 68 20 70 4e  sion of which pN
7f80: 6f 64 65 20 69 73 20 61 20 70 61 72 74 20 2a 2f  ode is a part */
7f90: 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
7fa0: 2a 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20  *pNode          
7fb0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
7fc0: 20 6e 6f 64 65 20 74 6f 20 74 65 73 74 20 2a 2f   node to test */
7fd0: 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  .){.  Fts5ExprNo
7fe0: 64 65 20 2a 70 4e 65 78 74 20 3d 20 70 4e 6f 64  de *pNext = pNod
7ff0: 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 3b 0a 20  e->apChild[0];. 
8000: 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69   int i;..  for(i
8010: 3d 31 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68  =1; i<pNode->nCh
8020: 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ild; i++){.    F
8030: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 43 68  ts5ExprNode *pCh
8040: 69 6c 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43  ild = pNode->apC
8050: 68 69 6c 64 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  hild[i];.    int
8060: 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f 64 65 43   cmp = fts5NodeC
8070: 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 20 70 4e  ompare(pExpr, pN
8080: 65 78 74 2c 20 70 43 68 69 6c 64 29 3b 0a 20 20  ext, pChild);.  
8090: 20 20 69 66 28 20 63 6d 70 3e 30 20 7c 7c 20 28    if( cmp>0 || (
80a0: 63 6d 70 3d 3d 30 20 26 26 20 70 43 68 69 6c 64  cmp==0 && pChild
80b0: 2d 3e 62 4e 6f 6d 61 74 63 68 3d 3d 30 29 20 29  ->bNomatch==0) )
80c0: 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
80d0: 70 43 68 69 6c 64 3b 0a 20 20 20 20 7d 0a 20 20  pChild;.    }.  
80e0: 7d 0a 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69  }.  pNode->iRowi
80f0: 64 20 3d 20 70 4e 65 78 74 2d 3e 69 52 6f 77 69  d = pNext->iRowi
8100: 64 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66  d;.  pNode->bEof
8110: 20 3d 20 70 4e 65 78 74 2d 3e 62 45 6f 66 3b 0a   = pNext->bEof;.
8120: 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63    pNode->bNomatc
8130: 68 20 3d 20 70 4e 65 78 74 2d 3e 62 4e 6f 6d 61  h = pNext->bNoma
8140: 74 63 68 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  tch;.}..static i
8150: 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e  nt fts5ExprNodeN
8160: 65 78 74 5f 4f 52 28 0a 20 20 46 74 73 35 45 78  ext_OR(.  Fts5Ex
8170: 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74  pr *pExpr, .  Ft
8180: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
8190: 65 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61  e,.  int bFromVa
81a0: 6c 69 64 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d  lid,.  i64 iFrom
81b0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
81c0: 36 34 20 69 4c 61 73 74 20 3d 20 70 4e 6f 64 65  64 iLast = pNode
81d0: 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 66 6f 72  ->iRowid;..  for
81e0: 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e  (i=0; i<pNode->n
81f0: 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Child; i++){.   
8200: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
8210: 31 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69  1 = pNode->apChi
8220: 6c 64 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ld[i];.    asser
8230: 74 28 20 70 31 2d 3e 62 45 6f 66 20 7c 7c 20 66  t( p1->bEof || f
8240: 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70  ts5RowidCmp(pExp
8250: 72 2c 20 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69  r, p1->iRowid, i
8260: 4c 61 73 74 29 3e 3d 30 20 29 3b 0a 20 20 20 20  Last)>=0 );.    
8270: 69 66 28 20 70 31 2d 3e 62 45 6f 66 3d 3d 30 20  if( p1->bEof==0 
8280: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 31  ){.      if( (p1
8290: 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 29  ->iRowid==iLast)
82a0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72   .       || (bFr
82b0: 6f 6d 56 61 6c 69 64 20 26 26 20 66 74 73 35 52  omValid && fts5R
82c0: 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 70  owidCmp(pExpr, p
82d0: 31 2d 3e 69 52 6f 77 69 64 2c 20 69 46 72 6f 6d  1->iRowid, iFrom
82e0: 29 3c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  )<0).      ){.  
82f0: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66        int rc = f
8300: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28  ts5ExprNodeNext(
8310: 70 45 78 70 72 2c 20 70 31 2c 20 62 46 72 6f 6d  pExpr, p1, bFrom
8320: 56 61 6c 69 64 2c 20 69 46 72 6f 6d 29 3b 0a 20  Valid, iFrom);. 
8330: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
8340: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8350: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f        pNode->bNo
8360: 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  match = 0;.     
8370: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8380: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8390: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66  }.    }.  }..  f
83a0: 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f  ts5ExprNodeTest_
83b0: 4f 52 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29  OR(pExpr, pNode)
83c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
83d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
83e0: 72 67 75 6d 65 6e 74 20 70 4e 6f 64 65 20 69 73  rgument pNode is
83f0: 20 61 6e 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64   an FTS5_AND nod
8400: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8410: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73   fts5ExprNodeTes
8420: 74 5f 41 4e 44 28 0a 20 20 46 74 73 35 45 78 70  t_AND(.  Fts5Exp
8430: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
8440: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
8450: 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65 20 62  ession pPhrase b
8460: 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46  elongs to */.  F
8470: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 41 6e  ts5ExprNode *pAn
8480: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d              /
8490: 2a 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64 65 20  * FTS5_AND node 
84a0: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b  to advance */.){
84b0: 0a 20 20 69 6e 74 20 69 43 68 69 6c 64 3b 0a 20  .  int iChild;. 
84c0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 70 41 6e   i64 iLast = pAn
84d0: 64 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74  d->iRowid;.  int
84e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
84f0: 0a 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 0a  .  int bMatch;..
8500: 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 2d 3e    assert( pAnd->
8510: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 64 6f 20  bEof==0 );.  do 
8520: 7b 0a 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d  {.    pAnd->bNom
8530: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 62 4d  atch = 0;.    bM
8540: 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 66 6f  atch = 1;.    fo
8550: 72 28 69 43 68 69 6c 64 3d 30 3b 20 69 43 68 69  r(iChild=0; iChi
8560: 6c 64 3c 70 41 6e 64 2d 3e 6e 43 68 69 6c 64 3b  ld<pAnd->nChild;
8570: 20 69 43 68 69 6c 64 2b 2b 29 7b 0a 20 20 20 20   iChild++){.    
8580: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
8590: 70 43 68 69 6c 64 20 3d 20 70 41 6e 64 2d 3e 61  pChild = pAnd->a
85a0: 70 43 68 69 6c 64 5b 69 43 68 69 6c 64 5d 3b 0a  pChild[iChild];.
85b0: 20 20 20 20 20 20 69 6e 74 20 63 6d 70 20 3d 20        int cmp = 
85c0: 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78  fts5RowidCmp(pEx
85d0: 70 72 2c 20 69 4c 61 73 74 2c 20 70 43 68 69 6c  pr, iLast, pChil
85e0: 64 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  d->iRowid);.    
85f0: 20 20 69 66 28 20 63 6d 70 3e 30 20 29 7b 0a 20    if( cmp>0 ){. 
8600: 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
8610: 65 20 70 43 68 69 6c 64 20 75 6e 74 69 6c 20 69  e pChild until i
8620: 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 4c 61 73  t points to iLas
8630: 74 20 6f 72 20 6c 61 73 74 65 72 20 2a 2f 0a 20  t or laster */. 
8640: 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
8650: 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78  ExprNodeNext(pEx
8660: 70 72 2c 20 70 43 68 69 6c 64 2c 20 31 2c 20 69  pr, pChild, 1, i
8670: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Last);.        i
8680: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
86a0: 6e 64 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30  nd->bNomatch = 0
86b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
86c0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
86d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
86e0: 2f 2a 20 49 66 20 74 68 65 20 63 68 69 6c 64 20  /* If the child 
86f0: 6e 6f 64 65 20 69 73 20 6e 6f 77 20 61 74 20 45  node is now at E
8700: 4f 46 2c 20 73 6f 20 69 73 20 74 68 65 20 70 61  OF, so is the pa
8710: 72 65 6e 74 20 41 4e 44 20 6e 6f 64 65 2e 20 4f  rent AND node. O
8720: 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
8730: 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64  ** the child nod
8740: 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
8750: 74 6f 20 68 61 76 65 20 61 64 76 61 6e 63 65 64  to have advanced
8760: 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72   at least as far
8770: 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77   as.      ** row
8780: 69 64 20 69 4c 61 73 74 2e 20 53 6f 20 69 66 20  id iLast. So if 
8790: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 65 78 61  it is not at exa
87a0: 63 74 6c 79 20 69 4c 61 73 74 2c 20 70 43 68 69  ctly iLast, pChi
87b0: 6c 64 2d 3e 69 52 6f 77 69 64 20 69 73 20 74 68  ld->iRowid is th
87c0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 6c  e.      ** new l
87d0: 61 73 74 65 73 74 20 72 6f 77 69 64 20 73 65 65  astest rowid see
87e0: 6e 20 73 6f 20 66 61 72 2e 20 20 2a 2f 0a 20 20  n so far.  */.  
87f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69      assert( pChi
8800: 6c 64 2d 3e 62 45 6f 66 20 7c 7c 20 66 74 73 35  ld->bEof || fts5
8810: 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20  RowidCmp(pExpr, 
8820: 69 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d 3e 69  iLast, pChild->i
8830: 52 6f 77 69 64 29 3c 3d 30 20 29 3b 0a 20 20 20  Rowid)<=0 );.   
8840: 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 62     if( pChild->b
8850: 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Eof ){.        f
8860: 74 73 35 45 78 70 72 53 65 74 45 6f 66 28 70 41  ts5ExprSetEof(pA
8870: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 62 4d 61  nd);.        bMa
8880: 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
8890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
88a0: 6c 73 65 20 69 66 28 20 69 4c 61 73 74 21 3d 70  lse if( iLast!=p
88b0: 43 68 69 6c 64 2d 3e 69 52 6f 77 69 64 20 29 7b  Child->iRowid ){
88c0: 0a 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20  .        bMatch 
88d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 4c 61  = 0;.        iLa
88e0: 73 74 20 3d 20 70 43 68 69 6c 64 2d 3e 69 52 6f  st = pChild->iRo
88f0: 77 69 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  wid;.      }..  
8900: 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
8910: 62 4e 6f 6d 61 74 63 68 20 29 7b 0a 20 20 20 20  bNomatch ){.    
8920: 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74      pAnd->bNomat
8930: 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ch = 1;.      }.
8940: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
8950: 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20  bMatch==0 );..  
8960: 69 66 28 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74  if( pAnd->bNomat
8970: 63 68 20 26 26 20 70 41 6e 64 21 3d 70 45 78 70  ch && pAnd!=pExp
8980: 72 2d 3e 70 52 6f 6f 74 20 29 7b 0a 20 20 20 20  r->pRoot ){.    
8990: 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f  fts5ExprNodeZero
89a0: 50 6f 73 6c 69 73 74 28 70 41 6e 64 29 3b 0a 20  Poslist(pAnd);. 
89b0: 20 7d 0a 20 20 70 41 6e 64 2d 3e 69 52 6f 77 69   }.  pAnd->iRowi
89c0: 64 20 3d 20 69 4c 61 73 74 3b 0a 20 20 72 65 74  d = iLast;.  ret
89d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
89e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
89f0: 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 41 4e  5ExprNodeNext_AN
8a00: 44 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  D(.  Fts5Expr *p
8a10: 45 78 70 72 2c 20 0a 20 20 46 74 73 35 45 78 70  Expr, .  Fts5Exp
8a20: 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20  rNode *pNode,.  
8a30: 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a  int bFromValid,.
8a40: 20 20 69 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20    i64 iFrom.){. 
8a50: 20 69 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78   int rc = fts5Ex
8a60: 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72  prNodeNext(pExpr
8a70: 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  , pNode->apChild
8a80: 5b 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c  [0], bFromValid,
8a90: 20 69 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72   iFrom);.  if( r
8aa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8ab0: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
8ac0: 72 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28 70 45  rNodeTest_AND(pE
8ad0: 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d  xpr, pNode);.  }
8ae0: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64 65 2d  else{.    pNode-
8af0: 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20  >bNomatch = 0;. 
8b00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8b10: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
8b20: 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4e  s5ExprNodeTest_N
8b30: 4f 54 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a  OT(.  Fts5Expr *
8b40: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
8b50: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
8b60: 69 6f 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f  ion pPhrase belo
8b70: 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35  ngs to */.  Fts5
8b80: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  ExprNode *pNode 
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8ba0: 54 53 35 5f 4e 4f 54 20 6e 6f 64 65 20 74 6f 20  TS5_NOT node to 
8bb0: 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20  advance */.){.  
8bc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8bd0: 4f 4b 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  OK;.  Fts5ExprNo
8be0: 64 65 20 2a 70 31 20 3d 20 70 4e 6f 64 65 2d 3e  de *p1 = pNode->
8bf0: 61 70 43 68 69 6c 64 5b 30 5d 3b 0a 20 20 46 74  apChild[0];.  Ft
8c00: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 32 20 3d  s5ExprNode *p2 =
8c10: 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
8c20: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  1];.  assert( pN
8c30: 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 32 20 29  ode->nChild==2 )
8c40: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  ;..  while( rc==
8c50: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 2d  SQLITE_OK && p1-
8c60: 3e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >bEof==0 ){.    
8c70: 69 6e 74 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f  int cmp = fts5No
8c80: 64 65 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c  deCompare(pExpr,
8c90: 20 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 69 66   p1, p2);.    if
8ca0: 28 20 63 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20  ( cmp>0 ){.     
8cb0: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
8cc0: 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70 32  deNext(pExpr, p2
8cd0: 2c 20 31 2c 20 70 31 2d 3e 69 52 6f 77 69 64 29  , 1, p1->iRowid)
8ce0: 3b 0a 20 20 20 20 20 20 63 6d 70 20 3d 20 66 74  ;.      cmp = ft
8cf0: 73 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45  s5NodeCompare(pE
8d00: 78 70 72 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20  xpr, p1, p2);.  
8d10: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
8d20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
8d30: 20 63 6d 70 3c 3d 30 20 29 3b 0a 20 20 20 20 69   cmp<=0 );.    i
8d40: 66 28 20 63 6d 70 20 7c 7c 20 70 32 2d 3e 62 4e  f( cmp || p2->bN
8d50: 6f 6d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  omatch ) break;.
8d60: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
8d70: 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c  rNodeNext(pExpr,
8d80: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a   p1, 0, 0);.  }.
8d90: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
8da0: 70 31 2d 3e 62 45 6f 66 3b 0a 20 20 70 4e 6f 64  p1->bEof;.  pNod
8db0: 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 70 31  e->bNomatch = p1
8dc0: 2d 3e 62 4e 6f 6d 61 74 63 68 3b 0a 20 20 70 4e  ->bNomatch;.  pN
8dd0: 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 31  ode->iRowid = p1
8de0: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28 20  ->iRowid;.  if( 
8df0: 70 31 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20  p1->bEof ){.    
8e00: 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f  fts5ExprNodeZero
8e10: 50 6f 73 6c 69 73 74 28 70 32 29 3b 0a 20 20 7d  Poslist(p2);.  }
8e20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8e40: 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54  ExprNodeNext_NOT
8e50: 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  (.  Fts5Expr *pE
8e60: 78 70 72 2c 20 0a 20 20 46 74 73 35 45 78 70 72  xpr, .  Fts5Expr
8e70: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 69  Node *pNode,.  i
8e80: 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a 20  nt bFromValid,. 
8e90: 20 69 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20 20   i64 iFrom.){.  
8ea0: 69 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78 70  int rc = fts5Exp
8eb0: 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c  rNodeNext(pExpr,
8ec0: 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
8ed0: 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20  0], bFromValid, 
8ee0: 69 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72 63  iFrom);.  if( rc
8ef0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8f00: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
8f10: 4e 6f 64 65 54 65 73 74 5f 4e 4f 54 28 70 45 78  NodeTest_NOT(pEx
8f20: 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a  pr, pNode);.  }.
8f30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8f40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65  _OK ){.    pNode
8f50: 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a  ->bNomatch = 0;.
8f60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 4e 6f  .}../*.** If pNo
8f80: 64 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  de currently poi
8f90: 6e 74 73 20 74 6f 20 61 20 6d 61 74 63 68 2c 20  nts to a match, 
8fa0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
8fb0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0a  turns SQLITE_OK.
8fc0: 2a 2a 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66  ** without modif
8fd0: 79 69 6e 67 20 69 74 2e 20 4f 74 68 65 72 77 69  ying it. Otherwi
8fe0: 73 65 2c 20 70 4e 6f 64 65 20 69 73 20 61 64 76  se, pNode is adv
8ff0: 61 6e 63 65 64 20 75 6e 74 69 6c 20 69 74 20 64  anced until it d
9000: 6f 65 73 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20  oes point.** to 
9010: 61 20 6d 61 74 63 68 20 6f 72 20 45 4f 46 20 69  a match or EOF i
9020: 73 20 72 65 61 63 68 65 64 2e 0a 2a 2f 0a 73 74  s reached..*/.st
9030: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
9040: 72 4e 6f 64 65 54 65 73 74 28 0a 20 20 46 74 73  rNodeTest(.  Fts
9050: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  5Expr *pExpr,   
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9070: 45 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 77 68  Expression of wh
9080: 69 63 68 20 70 4e 6f 64 65 20 69 73 20 61 20 70  ich pNode is a p
9090: 61 72 74 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  art */.  Fts5Exp
90a0: 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20  rNode *pNode    
90b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
90c0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 74  ession node to t
90d0: 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  est */.){.  int 
90e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
90f0: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f    if( pNode->bEo
9100: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 77 69 74  f==0 ){.    swit
9110: 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65  ch( pNode->eType
9120: 20 29 7b 0a 0a 20 20 20 20 20 20 63 61 73 65 20   ){..      case 
9130: 46 54 53 35 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  FTS5_STRING: {. 
9140: 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
9150: 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52  ExprNodeTest_STR
9160: 49 4e 47 28 70 45 78 70 72 2c 20 70 4e 6f 64 65  ING(pExpr, pNode
9170: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9180: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
9190: 20 63 61 73 65 20 46 54 53 35 5f 54 45 52 4d 3a   case FTS5_TERM:
91a0: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
91b0: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
91c0: 5f 54 45 52 4d 28 70 45 78 70 72 2c 20 70 4e 6f  _TERM(pExpr, pNo
91d0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  de);.        bre
91e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
91f0: 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44     case FTS5_AND
9200: 3a 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  : {.        rc =
9210: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73   fts5ExprNodeTes
9220: 74 5f 41 4e 44 28 70 45 78 70 72 2c 20 70 4e 6f  t_AND(pExpr, pNo
9230: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  de);.        bre
9240: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
9250: 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a     case FTS5_OR:
9260: 20 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 45   {.        fts5E
9270: 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f 52 28 70  xprNodeTest_OR(p
9280: 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20  Expr, pNode);.  
9290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
92a0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
92b0: 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 4e 6f  ult: assert( pNo
92c0: 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  de->eType==FTS5_
92d0: 4e 4f 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20  NOT ); {.       
92e0: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
92f0: 64 65 54 65 73 74 5f 4e 4f 54 28 70 45 78 70 72  deTest_NOT(pExpr
9300: 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  , pNode);.      
9310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9330: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 20 0a 2f 2a 0a  urn rc;.}.. ./*.
9340: 2a 2a 20 53 65 74 20 6e 6f 64 65 20 70 4e 6f 64  ** Set node pNod
9350: 65 2c 20 77 68 69 63 68 20 69 73 20 70 61 72 74  e, which is part
9360: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
9370: 45 78 70 72 2c 20 74 6f 20 70 6f 69 6e 74 20 74  Expr, to point t
9380: 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6d  o the first.** m
9390: 61 74 63 68 2e 20 49 66 20 74 68 65 72 65 20 61  atch. If there a
93a0: 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 73  re no matches, s
93b0: 65 74 20 74 68 65 20 4e 6f 64 65 2e 62 45 6f 66  et the Node.bEof
93c0: 20 66 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   flag to indicat
93d0: 65 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  e EOF..**.** Ret
93e0: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
93f0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
9400: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20  rror occurs, or 
9410: 53 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77  SQLITE_OK otherw
9420: 69 73 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  ise..** It is no
9430: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  t an error if th
9440: 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68  ere are no match
9450: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
9460: 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69  t fts5ExprNodeFi
9470: 72 73 74 28 46 74 73 35 45 78 70 72 20 2a 70 45  rst(Fts5Expr *pE
9480: 78 70 72 2c 20 46 74 73 35 45 78 70 72 4e 6f 64  xpr, Fts5ExprNod
9490: 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74  e *pNode){.  int
94a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
94b0: 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d  .  pNode->bEof =
94c0: 20 30 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f   0;.  pNode->bNo
94d0: 6d 61 74 63 68 20 3d 20 30 3b 0a 0a 20 20 69 66  match = 0;..  if
94e0: 28 20 46 74 73 35 4e 6f 64 65 49 73 53 74 72 69  ( Fts5NodeIsStri
94f0: 6e 67 28 70 4e 6f 64 65 29 20 29 7b 0a 20 20 20  ng(pNode) ){.   
9500: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61   /* Initialize a
9510: 6c 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72  ll term iterator
9520: 73 20 69 6e 20 74 68 65 20 4e 45 41 52 20 6f 62  s in the NEAR ob
9530: 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ject. */.    rc 
9540: 3d 20 66 74 73 35 45 78 70 72 4e 65 61 72 49 6e  = fts5ExprNearIn
9550: 69 74 41 6c 6c 28 70 45 78 70 72 2c 20 70 4e 6f  itAll(pExpr, pNo
9560: 64 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  de);.  }else if(
9570: 20 70 4e 6f 64 65 2d 3e 78 4e 65 78 74 3d 3d 30   pNode->xNext==0
9580: 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62   ){.    pNode->b
9590: 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
95a0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
95b0: 20 69 6e 74 20 6e 45 6f 66 20 3d 20 30 3b 0a 20   int nEof = 0;. 
95c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
95d0: 6f 64 65 2d 3e 6e 43 68 69 6c 64 20 26 26 20 72  ode->nChild && r
95e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
95f0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78  +){.      Fts5Ex
9600: 70 72 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d  prNode *pChild =
9610: 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
9620: 69 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  i];.      rc = f
9630: 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72 73 74  ts5ExprNodeFirst
9640: 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 2d 3e 61  (pExpr, pNode->a
9650: 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  pChild[i]);.    
9660: 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
9670: 2d 3e 62 45 6f 66 3d 3d 30 20 7c 7c 20 70 43 68  ->bEof==0 || pCh
9680: 69 6c 64 2d 3e 62 45 6f 66 3d 3d 31 20 29 3b 0a  ild->bEof==1 );.
9690: 20 20 20 20 20 20 6e 45 6f 66 20 2b 3d 20 70 43        nEof += pC
96a0: 68 69 6c 64 2d 3e 62 45 6f 66 3b 0a 20 20 20 20  hild->bEof;.    
96b0: 7d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 52 6f  }.    pNode->iRo
96c0: 77 69 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43  wid = pNode->apC
96d0: 68 69 6c 64 5b 30 5d 2d 3e 69 52 6f 77 69 64 3b  hild[0]->iRowid;
96e0: 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4e  ..    switch( pN
96f0: 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  ode->eType ){.  
9700: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e      case FTS5_AN
9710: 44 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  D:.        if( n
9720: 45 6f 66 3e 30 20 29 20 66 74 73 35 45 78 70 72  Eof>0 ) fts5Expr
9730: 53 65 74 45 6f 66 28 70 4e 6f 64 65 29 3b 0a 20  SetEof(pNode);. 
9740: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
9750: 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f       case FTS5_O
9760: 52 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  R:.        if( p
9770: 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 6e 45  Node->nChild==nE
9780: 6f 66 20 29 20 66 74 73 35 45 78 70 72 53 65 74  of ) fts5ExprSet
9790: 45 6f 66 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20  Eof(pNode);.    
97a0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
97b0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
97c0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65     assert( pNode
97d0: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f  ->eType==FTS5_NO
97e0: 54 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  T );.        pNo
97f0: 64 65 2d 3e 62 45 6f 66 20 3d 20 70 4e 6f 64 65  de->bEof = pNode
9800: 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2d 3e 62 45  ->apChild[0]->bE
9810: 6f 66 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  of;.        brea
9820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
9830: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9840: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
9850: 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 28 70  s5ExprNodeTest(p
9860: 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20  Expr, pNode);.  
9870: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9880: 0a 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 69  .../*.** Begin i
9890: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
98a0: 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
98b0: 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 70  ments in index p
98c0: 49 64 78 20 6d 61 74 63 68 65 64 20 62 79 0a 2a  Idx matched by.*
98d0: 2a 20 74 68 65 20 4d 41 54 43 48 20 65 78 70 72  * the MATCH expr
98e0: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
98f0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
9900: 65 6e 74 2e 20 49 66 20 74 68 65 20 22 62 44 65  ent. If the "bDe
9910: 73 63 22 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  sc" .** paramete
9920: 72 20 69 73 20 70 61 73 73 65 64 20 61 20 6e 6f  r is passed a no
9930: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 74  n-zero value, it
9940: 65 72 61 74 69 6f 6e 20 69 73 20 69 6e 20 64 65  eration is in de
9950: 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 0a  scending rowid .
9960: 2a 2a 20 6f 72 64 65 72 2e 20 4f 72 2c 20 69 66  ** order. Or, if
9970: 20 69 74 20 69 73 20 7a 65 72 6f 2c 20 69 6e 20   it is zero, in 
9980: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
9990: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 65 72 61 74  .**.** If iterat
99a0: 69 6e 67 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ing in ascending
99b0: 20 72 6f 77 69 64 20 6f 72 64 65 72 20 28 62 44   rowid order (bD
99c0: 65 73 63 3d 3d 30 29 2c 20 74 68 65 20 66 69 72  esc==0), the fir
99d0: 73 74 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 76  st document.** v
99e0: 69 73 69 74 65 64 20 69 73 20 74 68 61 74 20 77  isited is that w
99f0: 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
9a00: 20 72 6f 77 69 64 20 74 68 61 74 20 69 73 20 6c   rowid that is l
9a10: 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
9a20: 75 61 6c 0a 2a 2a 20 74 6f 20 70 61 72 61 6d 65  ual.** to parame
9a30: 74 65 72 20 69 46 69 72 73 74 2e 20 4f 72 2c 20  ter iFirst. Or, 
9a40: 69 66 20 69 74 65 72 61 74 69 6e 67 20 69 6e 20  if iterating in 
9a50: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
9a60: 28 62 44 65 73 63 3d 3d 31 29 2c 0a 2a 2a 20 74  (bDesc==1),.** t
9a70: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 64 6f  hen the first do
9a80: 63 75 6d 65 6e 74 20 76 69 73 69 74 65 64 20 6d  cument visited m
9a90: 75 73 74 20 68 61 76 65 20 61 20 72 6f 77 69 64  ust have a rowid
9aa0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
9ab0: 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 69 46 69  .** equal to iFi
9ac0: 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  rst..**.** Retur
9ad0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
9ae0: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
9af0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
9b00: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74  de otherwise. It
9b10: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
9b20: 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
9b30: 66 20 74 68 65 20 71 75 65 72 79 20 64 6f 65 73  f the query does
9b40: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 64   not match any d
9b50: 6f 63 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  ocuments..*/.int
9b60: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
9b70: 46 69 72 73 74 28 46 74 73 35 45 78 70 72 20 2a  First(Fts5Expr *
9b80: 70 2c 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  p, Fts5Index *pI
9b90: 64 78 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20  dx, i64 iFirst, 
9ba0: 69 6e 74 20 62 44 65 73 63 29 7b 0a 20 20 46 74  int bDesc){.  Ft
9bb0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 6f 6f  s5ExprNode *pRoo
9bc0: 74 20 3d 20 70 2d 3e 70 52 6f 6f 74 3b 0a 20 20  t = p->pRoot;.  
9bd0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
9c00: 2f 0a 0a 20 20 70 2d 3e 70 49 6e 64 65 78 20 3d  /..  p->pIndex =
9c10: 20 70 49 64 78 3b 0a 20 20 70 2d 3e 62 44 65 73   pIdx;.  p->bDes
9c20: 63 20 3d 20 62 44 65 73 63 3b 0a 20 20 72 63 20  c = bDesc;.  rc 
9c30: 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69  = fts5ExprNodeFi
9c40: 72 73 74 28 70 2c 20 70 52 6f 6f 74 29 3b 0a 0a  rst(p, pRoot);..
9c50: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 61 74 20 45    /* If not at E
9c60: 4f 46 20 62 75 74 20 74 68 65 20 63 75 72 72 65  OF but the curre
9c70: 6e 74 20 72 6f 77 69 64 20 6f 63 63 75 72 73 20  nt rowid occurs 
9c80: 65 61 72 6c 69 65 72 20 74 68 61 6e 20 69 46 69  earlier than iFi
9c90: 72 73 74 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  rst in.  ** the 
9ca0: 69 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72 2c  iteration order,
9cb0: 20 6d 6f 76 65 20 74 6f 20 64 6f 63 75 6d 65 6e   move to documen
9cc0: 74 20 69 46 69 72 73 74 20 6f 72 20 6c 61 74 65  t iFirst or late
9cd0: 72 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  r. */.  if( rc==
9ce0: 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
9cf0: 20 30 3d 3d 70 52 6f 6f 74 2d 3e 62 45 6f 66 20   0==pRoot->bEof 
9d00: 0a 20 20 20 26 26 20 66 74 73 35 52 6f 77 69 64  .   && fts5Rowid
9d10: 43 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69 52  Cmp(p, pRoot->iR
9d20: 6f 77 69 64 2c 20 69 46 69 72 73 74 29 3c 30 20  owid, iFirst)<0 
9d30: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  .  ){.    rc = f
9d40: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28  ts5ExprNodeNext(
9d50: 70 2c 20 70 52 6f 6f 74 2c 20 31 2c 20 69 46 69  p, pRoot, 1, iFi
9d60: 72 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rst);.  }..  /* 
9d70: 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
9d80: 69 73 20 6e 6f 74 20 61 74 20 61 20 72 65 61 6c  is not at a real
9d90: 20 6d 61 74 63 68 2c 20 73 6b 69 70 20 66 6f 72   match, skip for
9da0: 77 61 72 64 20 75 6e 74 69 6c 20 69 74 20 69 73  ward until it is
9db0: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 52  . */.  while( pR
9dc0: 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 7b  oot->bNomatch ){
9dd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
9de0: 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 72  ot->bEof==0 && r
9df0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
9e00: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
9e10: 72 4e 6f 64 65 4e 65 78 74 28 70 2c 20 70 52 6f  rNodeNext(p, pRo
9e20: 6f 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ot, 0, 0);.  }. 
9e30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9e40: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
9e50: 20 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 0a   next document .
9e60: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
9e70: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
9e80: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
9e90: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
9ea0: 68 65 72 77 69 73 65 2e 20 49 74 0a 2a 2a 20 69  herwise. It.** i
9eb0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
9ec0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
9ed0: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
9ee0: 6d 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d 65  match any docume
9ef0: 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
9f00: 74 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28  te3Fts5ExprNext(
9f10: 46 74 73 35 45 78 70 72 20 2a 70 2c 20 69 36 34  Fts5Expr *p, i64
9f20: 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 72   iLast){.  int r
9f30: 63 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  c;.  Fts5ExprNod
9f40: 65 20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52  e *pRoot = p->pR
9f50: 6f 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  oot;.  assert( p
9f60: 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26  Root->bEof==0 &&
9f70: 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68   pRoot->bNomatch
9f80: 3d 3d 30 20 29 3b 0a 20 20 64 6f 20 7b 0a 20 20  ==0 );.  do {.  
9f90: 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
9fa0: 6f 64 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74  odeNext(p, pRoot
9fb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  , 0, 0);.    ass
9fc0: 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d  ert( pRoot->bNom
9fd0: 61 74 63 68 3d 3d 30 20 7c 7c 20 28 72 63 3d 3d  atch==0 || (rc==
9fe0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 6f  SQLITE_OK && pRo
9ff0: 6f 74 2d 3e 62 45 6f 66 3d 3d 30 29 20 29 3b 0a  ot->bEof==0) );.
a000: 20 20 7d 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d    }while( pRoot-
a010: 3e 62 4e 6f 6d 61 74 63 68 20 29 3b 0a 20 20 69  >bNomatch );.  i
a020: 66 28 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28  f( fts5RowidCmp(
a030: 70 2c 20 70 52 6f 6f 74 2d 3e 69 52 6f 77 69 64  p, pRoot->iRowid
a040: 2c 20 69 4c 61 73 74 29 3e 30 20 29 7b 0a 20 20  , iLast)>0 ){.  
a050: 20 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 20 3d 20    pRoot->bEof = 
a060: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
a070: 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
a080: 65 33 46 74 73 35 45 78 70 72 45 6f 66 28 46 74  e3Fts5ExprEof(Ft
a090: 73 35 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  s5Expr *p){.  re
a0a0: 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e 62  turn p->pRoot->b
a0b0: 45 6f 66 3b 0a 7d 0a 0a 69 36 34 20 73 71 6c 69  Eof;.}..i64 sqli
a0c0: 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69 64  te3Fts5ExprRowid
a0d0: 28 46 74 73 35 45 78 70 72 20 2a 70 29 7b 0a 20  (Fts5Expr *p){. 
a0e0: 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74   return p->pRoot
a0f0: 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61  ->iRowid;.}..sta
a100: 74 69 63 20 69 6e 74 20 66 74 73 35 50 61 72 73  tic int fts5Pars
a110: 65 53 74 72 69 6e 67 46 72 6f 6d 54 6f 6b 65 6e  eStringFromToken
a120: 28 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b  (Fts5Token *pTok
a130: 65 6e 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a  en, char **pz){.
a140: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a150: 45 5f 4f 4b 3b 0a 20 20 2a 70 7a 20 3d 20 73 71  E_OK;.  *pz = sq
a160: 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70  lite3Fts5Strndup
a170: 28 26 72 63 2c 20 70 54 6f 6b 65 6e 2d 3e 70 2c  (&rc, pToken->p,
a180: 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 72   pToken->n);.  r
a190: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a1a0: 2a 2a 20 46 72 65 65 20 74 68 65 20 70 68 72 61  ** Free the phra
a1b0: 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  se object passed
a1c0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
a1d0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a1e0: 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 50 68   void fts5ExprPh
a1f0: 72 61 73 65 46 72 65 65 28 46 74 73 35 45 78 70  raseFree(Fts5Exp
a200: 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
a210: 29 7b 0a 20 20 69 66 28 20 70 50 68 72 61 73 65  ){.  if( pPhrase
a220: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
a230: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
a240: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b  hrase->nTerm; i+
a250: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78  +){.      Fts5Ex
a260: 70 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0a 20 20  prTerm *pSyn;.  
a270: 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
a280: 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 46   *pNext;.      F
a290: 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
a2a0: 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61  rm = &pPhrase->a
a2b0: 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 73  Term[i];.      s
a2c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 65 72  qlite3_free(pTer
a2d0: 6d 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  m->zTerm);.     
a2e0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
a2f0: 43 6c 6f 73 65 28 70 54 65 72 6d 2d 3e 70 49 74  Close(pTerm->pIt
a300: 65 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  er);.      for(p
a310: 53 79 6e 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  Syn=pTerm->pSyno
a320: 6e 79 6d 3b 20 70 53 79 6e 3b 20 70 53 79 6e 3d  nym; pSyn; pSyn=
a330: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
a340: 70 4e 65 78 74 20 3d 20 70 53 79 6e 2d 3e 70 53  pNext = pSyn->pS
a350: 79 6e 6f 6e 79 6d 3b 0a 20 20 20 20 20 20 20 20  ynonym;.        
a360: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
a370: 6c 6f 73 65 28 70 53 79 6e 2d 3e 70 49 74 65 72  lose(pSyn->pIter
a380: 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
a390: 75 66 66 65 72 46 72 65 65 28 28 46 74 73 35 42  ufferFree((Fts5B
a3a0: 75 66 66 65 72 2a 29 26 70 53 79 6e 5b 31 5d 29  uffer*)&pSyn[1])
a3b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a3c0: 33 5f 66 72 65 65 28 70 53 79 6e 29 3b 0a 20 20  3_free(pSyn);.  
a3d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a3e0: 69 66 28 20 70 50 68 72 61 73 65 2d 3e 70 6f 73  if( pPhrase->pos
a3f0: 6c 69 73 74 2e 6e 53 70 61 63 65 3e 30 20 29 20  list.nSpace>0 ) 
a400: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
a410: 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
a420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
a430: 72 65 65 28 70 50 68 72 61 73 65 29 3b 0a 20 20  ree(pPhrase);.  
a440: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
a450: 68 65 20 22 62 46 69 72 73 74 22 20 66 6c 61 67  he "bFirst" flag
a460: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 74 6f   on the first to
a470: 6b 65 6e 20 6f 66 20 74 68 65 20 70 68 72 61 73  ken of the phras
a480: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
a490: 2a 2a 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  ** only argument
a4a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a4b0: 33 46 74 73 35 50 61 72 73 65 53 65 74 43 61 72  3Fts5ParseSetCar
a4c0: 65 74 28 46 74 73 35 45 78 70 72 50 68 72 61 73  et(Fts5ExprPhras
a4d0: 65 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69  e *pPhrase){.  i
a4e0: 66 28 20 70 50 68 72 61 73 65 20 26 26 20 70 50  f( pPhrase && pP
a4f0: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20 29 7b 0a  hrase->nTerm ){.
a500: 20 20 20 20 70 50 68 72 61 73 65 2d 3e 61 54 65      pPhrase->aTe
a510: 72 6d 5b 30 5d 2e 62 46 69 72 73 74 20 3d 20 31  rm[0].bFirst = 1
a520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
a530: 66 20 61 72 67 75 6d 65 6e 74 20 70 4e 65 61 72  f argument pNear
a540: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61   is NULL, then a
a550: 20 6e 65 77 20 46 74 73 35 45 78 70 72 4e 65 61   new Fts5ExprNea
a560: 72 73 65 74 20 6f 62 6a 65 63 74 20 69 73 20 61  rset object is a
a570: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20  llocated.** and 
a580: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 70  populated with p
a590: 50 68 72 61 73 65 2e 20 4f 72 2c 20 69 66 20 70  Phrase. Or, if p
a5a0: 4e 65 61 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Near is not NULL
a5b0: 2c 20 70 68 72 61 73 65 20 70 50 68 72 61 73 65  , phrase pPhrase
a5c0: 20 69 73 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20   is.** appended 
a5d0: 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20 72 65  to it and the re
a5e0: 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 2e 0a  sults returned..
a5f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
a600: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 62 6f  error occurs, bo
a610: 74 68 20 74 68 65 20 70 4e 65 61 72 20 61 6e 64  th the pNear and
a620: 20 70 50 68 72 61 73 65 20 6f 62 6a 65 63 74 73   pPhrase objects
a630: 20 61 72 65 20 66 72 65 65 64 20 61 6e 64 0a 2a   are freed and.*
a640: 2a 20 4e 55 4c 4c 20 72 65 74 75 72 6e 65 64 2e  * NULL returned.
a650: 0a 2a 2f 0a 46 74 73 35 45 78 70 72 4e 65 61 72  .*/.Fts5ExprNear
a660: 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35  set *sqlite3Fts5
a670: 50 61 72 73 65 4e 65 61 72 73 65 74 28 0a 20 20  ParseNearset(.  
a680: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
a690: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
a6a0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
a6b0: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 65   */.  Fts5ExprNe
a6c0: 61 72 73 65 74 20 2a 70 4e 65 61 72 2c 20 20 20  arset *pNear,   
a6d0: 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e        /* Existin
a6e0: 67 20 6e 65 61 72 73 65 74 2c 20 6f 72 20 4e 55  g nearset, or NU
a6f0: 4c 4c 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  LL */.  Fts5Expr
a700: 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
a710: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 65 6e          /* Recen
a720: 74 6c 79 20 70 61 72 73 65 64 20 70 68 72 61 73  tly parsed phras
a730: 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
a740: 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20 38 3b  int SZALLOC = 8;
a750: 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  .  Fts5ExprNears
a760: 65 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a 20  et *pRet = 0;.. 
a770: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d   if( pParse->rc=
a780: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a790: 20 20 69 66 28 20 70 50 68 72 61 73 65 3d 3d 30    if( pPhrase==0
a7a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a7b0: 20 70 4e 65 61 72 3b 0a 20 20 20 20 7d 0a 20 20   pNear;.    }.  
a7c0: 20 20 69 66 28 20 70 4e 65 61 72 3d 3d 30 20 29    if( pNear==0 )
a7d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
a7e0: 69 6e 74 36 34 20 6e 42 79 74 65 3b 0a 20 20 20  int64 nByte;.   
a7f0: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
a800: 66 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  f(Fts5ExprNearse
a810: 74 29 20 2b 20 53 5a 41 4c 4c 4f 43 20 2a 20 73  t) + SZALLOC * s
a820: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68  izeof(Fts5ExprPh
a830: 72 61 73 65 2a 29 3b 0a 20 20 20 20 20 20 70 52  rase*);.      pR
a840: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  et = sqlite3_mal
a850: 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20  loc64(nByte);.  
a860: 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
a870: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
a880: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
a890: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
a8a0: 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
a8b0: 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65  t(pRet, 0, nByte
a8c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a8d0: 65 6c 73 65 20 69 66 28 20 28 70 4e 65 61 72 2d  else if( (pNear-
a8e0: 3e 6e 50 68 72 61 73 65 20 25 20 53 5a 41 4c 4c  >nPhrase % SZALL
a8f0: 4f 43 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OC)==0 ){.      
a900: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4e 65 61 72  int nNew = pNear
a910: 2d 3e 6e 50 68 72 61 73 65 20 2b 20 53 5a 41 4c  ->nPhrase + SZAL
a920: 4c 4f 43 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LOC;.      sqlit
a930: 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 3b 0a  e3_int64 nByte;.
a940: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73  .      nByte = s
a950: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 4e 65  izeof(Fts5ExprNe
a960: 61 72 73 65 74 29 20 2b 20 6e 4e 65 77 20 2a 20  arset) + nNew * 
a970: 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50  sizeof(Fts5ExprP
a980: 68 72 61 73 65 2a 29 3b 0a 20 20 20 20 20 20 70  hrase*);.      p
a990: 52 65 74 20 3d 20 28 46 74 73 35 45 78 70 72 4e  Ret = (Fts5ExprN
a9a0: 65 61 72 73 65 74 2a 29 73 71 6c 69 74 65 33 5f  earset*)sqlite3_
a9b0: 72 65 61 6c 6c 6f 63 36 34 28 70 4e 65 61 72 2c  realloc64(pNear,
a9c0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
a9d0: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
a9e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
a9f0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
aa00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
aa10: 73 65 7b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  se{.      pRet =
aa20: 20 70 4e 65 61 72 3b 0a 20 20 20 20 7d 0a 20 20   pNear;.    }.  
aa30: 7d 0a 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  }..  if( pRet==0
aa40: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
aa50: 70 50 61 72 73 65 2d 3e 72 63 21 3d 53 51 4c 49  pParse->rc!=SQLI
aa60: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c  TE_OK );.    sql
aa70: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65 61  ite3Fts5ParseNea
aa80: 72 73 65 74 46 72 65 65 28 70 4e 65 61 72 29 3b  rsetFree(pNear);
aa90: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
aaa0: 50 61 72 73 65 50 68 72 61 73 65 46 72 65 65 28  ParsePhraseFree(
aab0: 70 50 68 72 61 73 65 29 3b 0a 20 20 7d 65 6c 73  pPhrase);.  }els
aac0: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d  e{.    if( pRet-
aad0: 3e 6e 50 68 72 61 73 65 3e 30 20 29 7b 0a 20 20  >nPhrase>0 ){.  
aae0: 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
aaf0: 73 65 20 2a 70 4c 61 73 74 20 3d 20 70 52 65 74  se *pLast = pRet
ab00: 2d 3e 61 70 50 68 72 61 73 65 5b 70 52 65 74 2d  ->apPhrase[pRet-
ab10: 3e 6e 50 68 72 61 73 65 2d 31 5d 3b 0a 20 20 20  >nPhrase-1];.   
ab20: 20 20 20 61 73 73 65 72 74 28 20 70 4c 61 73 74     assert( pLast
ab30: 3d 3d 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61  ==pParse->apPhra
ab40: 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72 61  se[pParse->nPhra
ab50: 73 65 2d 32 5d 20 29 3b 0a 20 20 20 20 20 20 69  se-2] );.      i
ab60: 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72  f( pPhrase->nTer
ab70: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
ab80: 66 74 73 35 45 78 70 72 50 68 72 61 73 65 46 72  fts5ExprPhraseFr
ab90: 65 65 28 70 50 68 72 61 73 65 29 3b 0a 20 20 20  ee(pPhrase);.   
aba0: 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68 72 61       pRet->nPhra
abb0: 73 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 50  se--;.        pP
abc0: 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b  arse->nPhrase--;
abd0: 0a 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65  .        pPhrase
abe0: 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 20 20   = pLast;.      
abf0: 7d 65 6c 73 65 20 69 66 28 20 70 4c 61 73 74 2d  }else if( pLast-
ac00: 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20  >nTerm==0 ){.   
ac10: 20 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72       fts5ExprPhr
ac20: 61 73 65 46 72 65 65 28 70 4c 61 73 74 29 3b 0a  aseFree(pLast);.
ac30: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
ac40: 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65 2d  apPhrase[pParse-
ac50: 3e 6e 50 68 72 61 73 65 2d 32 5d 20 3d 20 70 50  >nPhrase-2] = pP
ac60: 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20 70  hrase;.        p
ac70: 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d 2d  Parse->nPhrase--
ac80: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
ac90: 6e 50 68 72 61 73 65 2d 2d 3b 0a 20 20 20 20 20  nPhrase--;.     
aca0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65   }.    }.    pRe
acb0: 74 2d 3e 61 70 50 68 72 61 73 65 5b 70 52 65 74  t->apPhrase[pRet
acc0: 2d 3e 6e 50 68 72 61 73 65 2b 2b 5d 20 3d 20 70  ->nPhrase++] = p
acd0: 50 68 72 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65  Phrase;.  }.  re
ace0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 74 79  turn pRet;.}..ty
acf0: 70 65 64 65 66 20 73 74 72 75 63 74 20 54 6f 6b  pedef struct Tok
ad00: 65 6e 43 74 78 20 54 6f 6b 65 6e 43 74 78 3b 0a  enCtx TokenCtx;.
ad10: 73 74 72 75 63 74 20 54 6f 6b 65 6e 43 74 78 20  struct TokenCtx 
ad20: 7b 0a 20 20 46 74 73 35 45 78 70 72 50 68 72 61  {.  Fts5ExprPhra
ad30: 73 65 20 2a 70 50 68 72 61 73 65 3b 0a 20 20 69  se *pPhrase;.  i
ad40: 6e 74 20 72 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  nt rc;.};../*.**
ad50: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 6f   Callback for to
ad60: 6b 65 6e 69 7a 69 6e 67 20 74 65 72 6d 73 20 75  kenizing terms u
ad70: 73 65 64 20 62 79 20 50 61 72 73 65 54 65 72 6d  sed by ParseTerm
ad80: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
ad90: 74 20 66 74 73 35 50 61 72 73 65 54 6f 6b 65 6e  t fts5ParseToken
ada0: 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 6f  ize(.  void *pCo
adb0: 6e 74 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  ntext,          
adc0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
add0: 72 20 74 6f 20 46 74 73 35 49 6e 73 65 72 74 43  r to Fts5InsertC
ade0: 74 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  tx object */.  i
adf0: 6e 74 20 74 66 6c 61 67 73 2c 20 20 20 20 20 20  nt tflags,      
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae10: 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 54  * Mask of FTS5_T
ae20: 4f 4b 45 4e 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  OKEN_* flags */.
ae30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
ae40: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
ae50: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
ae60: 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a  aining token */.
ae70: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 6f 6b    /* Size of tok
aea0: 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  en in bytes */. 
aeb0: 20 69 6e 74 20 69 55 6e 75 73 65 64 31 2c 20 20   int iUnused1,  
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 66 73 65 74   /* Start offset
aee0: 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69   of token */.  i
aef0: 6e 74 20 69 55 6e 75 73 65 64 32 20 20 20 20 20  nt iUnused2     
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af10: 2a 20 45 6e 64 20 6f 66 66 73 65 74 20 6f 66 20  * End offset of 
af20: 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  token */.){.  in
af30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
af40: 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 53 5a  ;.  const int SZ
af50: 41 4c 4c 4f 43 20 3d 20 38 3b 0a 20 20 54 6f 6b  ALLOC = 8;.  Tok
af60: 65 6e 43 74 78 20 2a 70 43 74 78 20 3d 20 28 54  enCtx *pCtx = (T
af70: 6f 6b 65 6e 43 74 78 2a 29 70 43 6f 6e 74 65 78  okenCtx*)pContex
af80: 74 3b 0a 20 20 46 74 73 35 45 78 70 72 50 68 72  t;.  Fts5ExprPhr
af90: 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
afa0: 43 74 78 2d 3e 70 50 68 72 61 73 65 3b 0a 0a 20  Ctx->pPhrase;.. 
afb0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28 69   UNUSED_PARAM2(i
afc0: 55 6e 75 73 65 64 31 2c 20 69 55 6e 75 73 65 64  Unused1, iUnused
afd0: 32 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  2);..  /* If an 
afe0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
aff0: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
b000: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 20   is a no-op */. 
b010: 20 69 66 28 20 70 43 74 78 2d 3e 72 63 21 3d 53   if( pCtx->rc!=S
b020: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
b030: 6e 20 70 43 74 78 2d 3e 72 63 3b 0a 20 20 69 66  n pCtx->rc;.  if
b040: 28 20 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41  ( nToken>FTS5_MA
b050: 58 5f 54 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e  X_TOKEN_SIZE ) n
b060: 54 6f 6b 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58  Token = FTS5_MAX
b070: 5f 54 4f 4b 45 4e 5f 53 49 5a 45 3b 0a 0a 20 20  _TOKEN_SIZE;..  
b080: 69 66 28 20 70 50 68 72 61 73 65 20 26 26 20 70  if( pPhrase && p
b090: 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 30 20  Phrase->nTerm>0 
b0a0: 26 26 20 28 74 66 6c 61 67 73 20 26 20 46 54 53  && (tflags & FTS
b0b0: 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45  5_TOKEN_COLOCATE
b0c0: 44 29 20 29 7b 0a 20 20 20 20 46 74 73 35 45 78  D) ){.    Fts5Ex
b0d0: 70 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0a 20 20  prTerm *pSyn;.  
b0e0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
b0f0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
b100: 74 73 35 45 78 70 72 54 65 72 6d 29 20 2b 20 73  ts5ExprTerm) + s
b110: 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
b120: 29 20 2b 20 6e 54 6f 6b 65 6e 2b 31 3b 0a 20 20  ) + nToken+1;.  
b130: 20 20 70 53 79 6e 20 3d 20 28 46 74 73 35 45 78    pSyn = (Fts5Ex
b140: 70 72 54 65 72 6d 2a 29 73 71 6c 69 74 65 33 5f  prTerm*)sqlite3_
b150: 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
b160: 0a 20 20 20 20 69 66 28 20 70 53 79 6e 3d 3d 30  .    if( pSyn==0
b170: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
b180: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b190: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
b1a0: 6d 73 65 74 28 70 53 79 6e 2c 20 30 2c 20 6e 42  mset(pSyn, 0, nB
b1b0: 79 74 65 29 3b 0a 20 20 20 20 20 20 70 53 79 6e  yte);.      pSyn
b1c0: 2d 3e 7a 54 65 72 6d 20 3d 20 28 28 63 68 61 72  ->zTerm = ((char
b1d0: 2a 29 70 53 79 6e 29 20 2b 20 73 69 7a 65 6f 66  *)pSyn) + sizeof
b1e0: 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 20 2b  (Fts5ExprTerm) +
b1f0: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
b200: 65 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  er);.      memcp
b210: 79 28 70 53 79 6e 2d 3e 7a 54 65 72 6d 2c 20 70  y(pSyn->zTerm, p
b220: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
b230: 20 20 20 20 20 20 70 53 79 6e 2d 3e 70 53 79 6e        pSyn->pSyn
b240: 6f 6e 79 6d 20 3d 20 70 50 68 72 61 73 65 2d 3e  onym = pPhrase->
b250: 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e  aTerm[pPhrase->n
b260: 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79 6d  Term-1].pSynonym
b270: 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d  ;.      pPhrase-
b280: 3e 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e  >aTerm[pPhrase->
b290: 6e 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79  nTerm-1].pSynony
b2a0: 6d 20 3d 20 70 53 79 6e 3b 0a 20 20 20 20 7d 0a  m = pSyn;.    }.
b2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73    }else{.    Fts
b2c0: 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
b2d0: 3b 0a 20 20 20 20 69 66 28 20 70 50 68 72 61 73  ;.    if( pPhras
b2e0: 65 3d 3d 30 20 7c 7c 20 28 70 50 68 72 61 73 65  e==0 || (pPhrase
b2f0: 2d 3e 6e 54 65 72 6d 20 25 20 53 5a 41 4c 4c 4f  ->nTerm % SZALLO
b300: 43 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46  C)==0 ){.      F
b310: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
b320: 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  New;.      int n
b330: 4e 65 77 20 3d 20 53 5a 41 4c 4c 4f 43 20 2b 20  New = SZALLOC + 
b340: 28 70 50 68 72 61 73 65 20 3f 20 70 50 68 72 61  (pPhrase ? pPhra
b350: 73 65 2d 3e 6e 54 65 72 6d 20 3a 20 30 29 3b 0a  se->nTerm : 0);.
b360: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 46  .      pNew = (F
b370: 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 73  ts5ExprPhrase*)s
b380: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
b390: 28 70 50 68 72 61 73 65 2c 20 0a 20 20 20 20 20  (pPhrase, .     
b3a0: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
b3b0: 45 78 70 72 50 68 72 61 73 65 29 20 2b 20 73 69  ExprPhrase) + si
b3c0: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54 65 72  zeof(Fts5ExprTer
b3d0: 6d 29 20 2a 20 6e 4e 65 77 0a 20 20 20 20 20 20  m) * nNew.      
b3e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
b3f0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
b400: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
b410: 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
b420: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 68 72          if( pPhr
b430: 61 73 65 3d 3d 30 20 29 20 6d 65 6d 73 65 74 28  ase==0 ) memset(
b440: 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
b450: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 29 29  Fts5ExprPhrase))
b460: 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  ;.        pCtx->
b470: 70 50 68 72 61 73 65 20 3d 20 70 50 68 72 61 73  pPhrase = pPhras
b480: 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
b490: 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20    pNew->nTerm = 
b4a0: 6e 4e 65 77 20 2d 20 53 5a 41 4c 4c 4f 43 3b 0a  nNew - SZALLOC;.
b4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
b4c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b4d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 54  E_OK ){.      pT
b4e0: 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e  erm = &pPhrase->
b4f0: 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e  aTerm[pPhrase->n
b500: 54 65 72 6d 2b 2b 5d 3b 0a 20 20 20 20 20 20 6d  Term++];.      m
b510: 65 6d 73 65 74 28 70 54 65 72 6d 2c 20 30 2c 20  emset(pTerm, 0, 
b520: 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54  sizeof(Fts5ExprT
b530: 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 70 54 65  erm));.      pTe
b540: 72 6d 2d 3e 7a 54 65 72 6d 20 3d 20 73 71 6c 69  rm->zTerm = sqli
b550: 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26  te3Fts5Strndup(&
b560: 72 63 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  rc, pToken, nTok
b570: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  en);.    }.  }..
b580: 20 20 70 43 74 78 2d 3e 72 63 20 3d 20 72 63 3b    pCtx->rc = rc;
b590: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b5a0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
b5b0: 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70   phrase object p
b5c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
b5d0: 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  y argument..*/.v
b5e0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
b5f0: 61 72 73 65 50 68 72 61 73 65 46 72 65 65 28 46  arsePhraseFree(F
b600: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
b610: 50 68 72 61 73 65 29 7b 0a 20 20 66 74 73 35 45  Phrase){.  fts5E
b620: 78 70 72 50 68 72 61 73 65 46 72 65 65 28 70 50  xprPhraseFree(pP
b630: 68 72 61 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hrase);.}../*.**
b640: 20 46 72 65 65 20 74 68 65 20 70 68 72 61 73 65   Free the phrase
b650: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
b660: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
b670: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
b680: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
b690: 65 61 72 73 65 74 46 72 65 65 28 46 74 73 35 45  earsetFree(Fts5E
b6a0: 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61  xprNearset *pNea
b6b0: 72 29 7b 0a 20 20 69 66 28 20 70 4e 65 61 72 20  r){.  if( pNear 
b6c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
b6d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65    for(i=0; i<pNe
b6e0: 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b  ar->nPhrase; i++
b6f0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 45 78 70  ){.      fts5Exp
b700: 72 50 68 72 61 73 65 46 72 65 65 28 70 4e 65 61  rPhraseFree(pNea
b710: 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 29 3b  r->apPhrase[i]);
b720: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b730: 65 33 5f 66 72 65 65 28 70 4e 65 61 72 2d 3e 70  e3_free(pNear->p
b740: 43 6f 6c 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Colset);.    sql
b750: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 61 72 29  ite3_free(pNear)
b760: 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 73 71  ;.  }.}..void sq
b770: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46 69  lite3Fts5ParseFi
b780: 6e 69 73 68 65 64 28 46 74 73 35 50 61 72 73 65  nished(Fts5Parse
b790: 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45 78   *pParse, Fts5Ex
b7a0: 70 72 4e 6f 64 65 20 2a 70 29 7b 0a 20 20 61 73  prNode *p){.  as
b7b0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 45  sert( pParse->pE
b7c0: 78 70 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  xpr==0 );.  pPar
b7d0: 73 65 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 7d  se->pExpr = p;.}
b7e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b7f0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
b800: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
b810: 20 70 72 6f 63 65 73 73 20 61 20 73 74 72 69 6e   process a strin
b820: 67 20 74 6f 6b 65 6e 2e 20 54 68 65 0a 2a 2a 20  g token. The.** 
b830: 73 74 72 69 6e 67 20 6d 61 79 20 6f 72 20 6d 61  string may or ma
b840: 79 20 6e 6f 74 20 62 65 20 71 75 6f 74 65 64 2e  y not be quoted.
b850: 20 49 6e 20 61 6e 79 20 63 61 73 65 20 69 74 20   In any case it 
b860: 69 73 20 74 6f 6b 65 6e 69 7a 65 64 20 61 6e 64  is tokenized and
b870: 20 61 0a 2a 2a 20 70 68 72 61 73 65 20 6f 62 6a   a.** phrase obj
b880: 65 63 74 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  ect consisting o
b890: 66 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 72 65 74  f all tokens ret
b8a0: 75 72 6e 65 64 2e 0a 2a 2f 0a 46 74 73 35 45 78  urned..*/.Fts5Ex
b8b0: 70 72 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65  prPhrase *sqlite
b8c0: 33 46 74 73 35 50 61 72 73 65 54 65 72 6d 28 0a  3Fts5ParseTerm(.
b8d0: 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61    Fts5Parse *pPa
b8e0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
b8f0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
b900: 78 74 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  xt */.  Fts5Expr
b910: 50 68 72 61 73 65 20 2a 70 41 70 70 65 6e 64 2c  Phrase *pAppend,
b920: 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
b930: 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a  e to append to *
b940: 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70  /.  Fts5Token *p
b950: 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
b960: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
b970: 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 20 20 69   tokenize */.  i
b980: 6e 74 20 62 50 72 65 66 69 78 20 20 20 20 20 20  nt bPrefix      
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b9a0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
b9b0: 69 73 20 61 20 74 72 61 69 6c 69 6e 67 20 22 2a  is a trailing "*
b9c0: 22 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f  " */.){.  Fts5Co
b9d0: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
b9e0: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 3b  pParse->pConfig;
b9f0: 0a 20 20 54 6f 6b 65 6e 43 74 78 20 73 43 74 78  .  TokenCtx sCtx
ba00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ba10: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62     /* Context ob
ba20: 6a 65 63 74 20 70 61 73 73 65 64 20 74 6f 20 63  ject passed to c
ba30: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  allback */.  int
ba40: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba60: 54 6f 6b 65 6e 69 7a 65 20 72 65 74 75 72 6e 20  Tokenize return 
ba70: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
ba80: 7a 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74  z = 0;..  memset
ba90: 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
baa0: 66 28 54 6f 6b 65 6e 43 74 78 29 29 3b 0a 20 20  f(TokenCtx));.  
bab0: 73 43 74 78 2e 70 50 68 72 61 73 65 20 3d 20 70  sCtx.pPhrase = p
bac0: 41 70 70 65 6e 64 3b 0a 0a 20 20 72 63 20 3d 20  Append;..  rc = 
bad0: 66 74 73 35 50 61 72 73 65 53 74 72 69 6e 67 46  fts5ParseStringF
bae0: 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 2c  romToken(pToken,
baf0: 20 26 7a 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d   &z);.  if( rc==
bb00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bb10: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
bb20: 35 5f 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59  5_TOKENIZE_QUERY
bb30: 20 7c 20 28 62 50 72 65 66 69 78 20 3f 20 46 54   | (bPrefix ? FT
bb40: 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 50 52 45 46  S5_TOKENIZE_PREF
bb50: 49 58 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  IX : 0);.    int
bb60: 20 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   n;.    sqlite3F
bb70: 74 73 35 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20  ts5Dequote(z);. 
bb80: 20 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c     n = (int)strl
bb90: 65 6e 28 7a 29 3b 0a 20 20 20 20 72 63 20 3d 20  en(z);.    rc = 
bba0: 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e  sqlite3Fts5Token
bbb0: 69 7a 65 28 70 43 6f 6e 66 69 67 2c 20 66 6c 61  ize(pConfig, fla
bbc0: 67 73 2c 20 7a 2c 20 6e 2c 20 26 73 43 74 78 2c  gs, z, n, &sCtx,
bbd0: 20 66 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69   fts5ParseTokeni
bbe0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ze);.  }.  sqlit
bbf0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 69 66  e3_free(z);.  if
bc00: 28 20 72 63 20 7c 7c 20 28 72 63 20 3d 20 73 43  ( rc || (rc = sC
bc10: 74 78 2e 72 63 29 20 29 7b 0a 20 20 20 20 70 50  tx.rc) ){.    pP
bc20: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
bc30: 20 20 20 66 74 73 35 45 78 70 72 50 68 72 61 73     fts5ExprPhras
bc40: 65 46 72 65 65 28 73 43 74 78 2e 70 50 68 72 61  eFree(sCtx.pPhra
bc50: 73 65 29 3b 0a 20 20 20 20 73 43 74 78 2e 70 50  se);.    sCtx.pP
bc60: 68 72 61 73 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  hrase = 0;.  }el
bc70: 73 65 7b 0a 0a 20 20 20 20 69 66 28 20 70 41 70  se{..    if( pAp
bc80: 70 65 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pend==0 ){.     
bc90: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 50   if( (pParse->nP
bca0: 68 72 61 73 65 20 25 20 38 29 3d 3d 30 20 29 7b  hrase % 8)==0 ){
bcb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bcc0: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
bcd0: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68  izeof(Fts5ExprPh
bce0: 72 61 73 65 2a 29 20 2a 20 28 70 50 61 72 73 65  rase*) * (pParse
bcf0: 2d 3e 6e 50 68 72 61 73 65 20 2b 20 38 29 3b 0a  ->nPhrase + 8);.
bd00: 20 20 20 20 20 20 20 20 46 74 73 35 45 78 70 72          Fts5Expr
bd10: 50 68 72 61 73 65 20 2a 2a 61 70 4e 65 77 3b 0a  Phrase **apNew;.
bd20: 20 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20          apNew = 
bd30: 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a  (Fts5ExprPhrase*
bd40: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
bd50: 63 36 34 28 70 50 61 72 73 65 2d 3e 61 70 50 68  c64(pParse->apPh
bd60: 72 61 73 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  rase, nByte);.  
bd70: 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d        if( apNew=
bd80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
bd90: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
bda0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
bdb0: 20 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72       fts5ExprPhr
bdc0: 61 73 65 46 72 65 65 28 73 43 74 78 2e 70 50 68  aseFree(sCtx.pPh
bdd0: 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rase);.         
bde0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
bdf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
be00: 72 73 65 2d 3e 61 70 50 68 72 61 73 65 20 3d 20  rse->apPhrase = 
be10: 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20  apNew;.      }. 
be20: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68       pParse->nPh
be30: 72 61 73 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  rase++;.    }.. 
be40: 20 20 20 69 66 28 20 73 43 74 78 2e 70 50 68 72     if( sCtx.pPhr
be50: 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ase==0 ){.      
be60: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
be70: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 74  when parsing a t
be80: 6f 6b 65 6e 20 6f 72 20 71 75 6f 74 65 64 20 70  oken or quoted p
be90: 68 72 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  hrase that conta
bea0: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  ins.      ** no 
beb0: 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65 72 73  token characters
bec0: 20 61 74 20 61 6c 6c 2e 20 28 65 2e 67 20 2e 2e   at all. (e.g ..
bed0: 2e 20 4d 41 54 43 48 20 27 22 22 27 29 2e 20 2a  . MATCH '""'). *
bee0: 2f 0a 20 20 20 20 20 20 73 43 74 78 2e 70 50 68  /.      sCtx.pPh
bef0: 72 61 73 65 20 3d 20 73 71 6c 69 74 65 33 46 74  rase = sqlite3Ft
bf00: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 50  s5MallocZero(&pP
bf10: 61 72 73 65 2d 3e 72 63 2c 20 73 69 7a 65 6f 66  arse->rc, sizeof
bf20: 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 29  (Fts5ExprPhrase)
bf30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
bf40: 20 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e   sCtx.pPhrase->n
bf50: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 73 43  Term ){.      sC
bf60: 74 78 2e 70 50 68 72 61 73 65 2d 3e 61 54 65 72  tx.pPhrase->aTer
bf70: 6d 5b 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e  m[sCtx.pPhrase->
bf80: 6e 54 65 72 6d 2d 31 5d 2e 62 50 72 65 66 69 78  nTerm-1].bPrefix
bf90: 20 3d 20 28 75 38 29 62 50 72 65 66 69 78 3b 0a   = (u8)bPrefix;.
bfa0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
bfb0: 2d 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73  ->apPhrase[pPars
bfc0: 65 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 20 3d 20  e->nPhrase-1] = 
bfd0: 73 43 74 78 2e 70 50 68 72 61 73 65 3b 0a 20 20  sCtx.pPhrase;.  
bfe0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 43 74 78  }..  return sCtx
bff0: 2e 70 50 68 72 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a  .pPhrase;.}../*.
c000: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
c010: 46 54 53 35 20 65 78 70 72 65 73 73 69 6f 6e 20  FTS5 expression 
c020: 62 79 20 63 6c 6f 6e 69 6e 67 20 70 68 72 61 73  by cloning phras
c030: 65 20 69 50 68 72 61 73 65 20 6f 66 20 74 68 65  e iPhrase of the
c040: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
c050: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
c060: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
c070: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
c080: 45 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65 28  ExprClonePhrase(
c090: 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78  .  Fts5Expr *pEx
c0a0: 70 72 2c 20 0a 20 20 69 6e 74 20 69 50 68 72 61  pr, .  int iPhra
c0b0: 73 65 2c 20 0a 20 20 46 74 73 35 45 78 70 72 20  se, .  Fts5Expr 
c0c0: 2a 2a 70 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74  **ppNew.){.  int
c0d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c0f0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
c100: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
c110: 2a 70 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20  *pOrig;         
c120: 20 2f 2a 20 54 68 65 20 70 68 72 61 73 65 20 65   /* The phrase e
c130: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
c140: 78 70 72 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  xpr */.  Fts5Exp
c150: 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  r *pNew = 0;    
c160: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
c170: 65 73 73 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  ession to return
c180: 20 76 69 61 20 2a 70 70 4e 65 77 20 2a 2f 0a 20   via *ppNew */. 
c190: 20 54 6f 6b 65 6e 43 74 78 20 73 43 74 78 20 3d   TokenCtx sCtx =
c1a0: 20 7b 30 2c 30 7d 3b 20 20 20 20 20 20 20 20 20   {0,0};         
c1b0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65   /* Context obje
c1c0: 63 74 20 66 6f 72 20 66 74 73 35 50 61 72 73 65  ct for fts5Parse
c1d0: 54 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 0a 20 20 70  Tokenize */..  p
c1e0: 4f 72 69 67 20 3d 20 70 45 78 70 72 2d 3e 61 70  Orig = pExpr->ap
c1f0: 45 78 70 72 50 68 72 61 73 65 5b 69 50 68 72 61  ExprPhrase[iPhra
c200: 73 65 5d 3b 0a 20 20 70 4e 65 77 20 3d 20 28 46  se];.  pNew = (F
c210: 74 73 35 45 78 70 72 2a 29 73 71 6c 69 74 65 33  ts5Expr*)sqlite3
c220: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
c230: 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45  rc, sizeof(Fts5E
c240: 78 70 72 29 29 3b 0a 20 20 69 66 28 20 72 63 3d  xpr));.  if( rc=
c250: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c260: 20 20 70 4e 65 77 2d 3e 61 70 45 78 70 72 50 68    pNew->apExprPh
c270: 72 61 73 65 20 3d 20 28 46 74 73 35 45 78 70 72  rase = (Fts5Expr
c280: 50 68 72 61 73 65 2a 2a 29 73 71 6c 69 74 65 33  Phrase**)sqlite3
c290: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
c2a0: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 73 69 7a  rc, .        siz
c2b0: 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61  eof(Fts5ExprPhra
c2c0: 73 65 2a 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  se*));.  }.  if(
c2d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c2e0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f  {.    pNew->pRoo
c2f0: 74 20 3d 20 28 46 74 73 35 45 78 70 72 4e 6f 64  t = (Fts5ExprNod
c300: 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
c310: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20  llocZero(&rc, . 
c320: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
c330: 73 35 45 78 70 72 4e 6f 64 65 29 29 3b 0a 20 20  s5ExprNode));.  
c340: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
c350: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65  TE_OK ){.    pNe
c360: 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 20  w->pRoot->pNear 
c370: 3d 20 28 46 74 73 35 45 78 70 72 4e 65 61 72 73  = (Fts5ExprNears
c380: 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  et*)sqlite3Fts5M
c390: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a  allocZero(&rc, .
c3a0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46          sizeof(F
c3b0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 29 20  ts5ExprNearset) 
c3c0: 2b 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  + sizeof(Fts5Exp
c3d0: 72 50 68 72 61 73 65 2a 29 29 3b 0a 20 20 7d 0a  rPhrase*));.  }.
c3e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c3f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43  _OK ){.    Fts5C
c400: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 4f 72  olset *pColsetOr
c410: 69 67 20 3d 20 70 4f 72 69 67 2d 3e 70 4e 6f 64  ig = pOrig->pNod
c420: 65 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65  e->pNear->pColse
c430: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  t;.    if( pCols
c440: 65 74 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  etOrig ){.      
c450: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
c460: 79 74 65 3b 0a 20 20 20 20 20 20 46 74 73 35 43  yte;.      Fts5C
c470: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 0a  olset *pColset;.
c480: 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69        nByte = si
c490: 7a 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74 29  zeof(Fts5Colset)
c4a0: 20 2b 20 28 70 43 6f 6c 73 65 74 4f 72 69 67 2d   + (pColsetOrig-
c4b0: 3e 6e 43 6f 6c 2d 31 29 20 2a 20 73 69 7a 65 6f  >nCol-1) * sizeo
c4c0: 66 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 43  f(int);.      pC
c4d0: 6f 6c 73 65 74 20 3d 20 28 46 74 73 35 43 6f 6c  olset = (Fts5Col
c4e0: 73 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  set*)sqlite3Fts5
c4f0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
c500: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
c510: 28 20 70 43 6f 6c 73 65 74 20 29 7b 20 0a 20 20  ( pColset ){ .  
c520: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f        memcpy(pCo
c530: 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74 4f 72 69  lset, pColsetOri
c540: 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  g, nByte);.     
c550: 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70   }.      pNew->p
c560: 52 6f 6f 74 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f  Root->pNear->pCo
c570: 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a  lset = pColset;.
c580: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
c590: 20 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 20 29 7b   pOrig->nTerm ){
c5a0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
c5d0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
c5e0: 70 68 72 61 73 65 20 74 65 72 6d 73 20 2a 2f 0a  phrase terms */.
c5f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
c600: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
c610: 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 3b 20 69 2b  pOrig->nTerm; i+
c620: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 66  +){.      int tf
c630: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lags = 0;.      
c640: 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 3b  Fts5ExprTerm *p;
c650: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70 4f  .      for(p=&pO
c660: 72 69 67 2d 3e 61 54 65 72 6d 5b 69 5d 3b 20 70  rig->aTerm[i]; p
c670: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
c680: 4b 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d  K; p=p->pSynonym
c690: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
c6a0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70   char *zTerm = p
c6b0: 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  ->zTerm;.       
c6c0: 20 72 63 20 3d 20 66 74 73 35 50 61 72 73 65 54   rc = fts5ParseT
c6d0: 6f 6b 65 6e 69 7a 65 28 28 76 6f 69 64 2a 29 26  okenize((void*)&
c6e0: 73 43 74 78 2c 20 74 66 6c 61 67 73 2c 20 7a 54  sCtx, tflags, zT
c6f0: 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  erm, (int)strlen
c700: 28 7a 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20  (zTerm),.       
c710: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 20 20       0, 0);.    
c720: 20 20 20 20 74 66 6c 61 67 73 20 3d 20 46 54 53      tflags = FTS
c730: 35 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45  5_TOKEN_COLOCATE
c740: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  D;.      }.     
c750: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c760: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 43  OK ){.        sC
c770: 74 78 2e 70 50 68 72 61 73 65 2d 3e 61 54 65 72  tx.pPhrase->aTer
c780: 6d 5b 69 5d 2e 62 50 72 65 66 69 78 20 3d 20 70  m[i].bPrefix = p
c790: 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62  Orig->aTerm[i].b
c7a0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20 20  Prefix;.        
c7b0: 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 61 54  sCtx.pPhrase->aT
c7c0: 65 72 6d 5b 69 5d 2e 62 46 69 72 73 74 20 3d 20  erm[i].bFirst = 
c7d0: 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 69 5d 2e  pOrig->aTerm[i].
c7e0: 62 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a  bFirst;.      }.
c7f0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c800: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
c810: 6e 73 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ns when parsing 
c820: 61 20 74 6f 6b 65 6e 20 6f 72 20 71 75 6f 74 65  a token or quote
c830: 64 20 70 68 72 61 73 65 20 74 68 61 74 20 63 6f  d phrase that co
c840: 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6e 6f  ntains.    ** no
c850: 20 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65 72   token character
c860: 73 20 61 74 20 61 6c 6c 2e 20 28 65 2e 67 20 2e  s at all. (e.g .
c870: 2e 2e 20 4d 41 54 43 48 20 27 22 22 27 29 2e 20  .. MATCH '""'). 
c880: 2a 2f 0a 20 20 20 20 73 43 74 78 2e 70 50 68 72  */.    sCtx.pPhr
c890: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  ase = sqlite3Fts
c8a0: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
c8b0: 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
c8c0: 50 68 72 61 73 65 29 29 3b 0a 20 20 7d 0a 0a 20  Phrase));.  }.. 
c8d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c8e0: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  OK ){.    /* All
c8f0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   the allocations
c900: 20 73 75 63 63 65 65 64 65 64 2e 20 50 75 74 20   succeeded. Put 
c910: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
c920: 62 6a 65 63 74 20 74 6f 67 65 74 68 65 72 2e 20  bject together. 
c930: 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  */.    pNew->pIn
c940: 64 65 78 20 3d 20 70 45 78 70 72 2d 3e 70 49 6e  dex = pExpr->pIn
c950: 64 65 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  dex;.    pNew->p
c960: 43 6f 6e 66 69 67 20 3d 20 70 45 78 70 72 2d 3e  Config = pExpr->
c970: 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 4e 65  pConfig;.    pNe
c980: 77 2d 3e 6e 50 68 72 61 73 65 20 3d 20 31 3b 0a  w->nPhrase = 1;.
c990: 20 20 20 20 70 4e 65 77 2d 3e 61 70 45 78 70 72      pNew->apExpr
c9a0: 50 68 72 61 73 65 5b 30 5d 20 3d 20 73 43 74 78  Phrase[0] = sCtx
c9b0: 2e 70 50 68 72 61 73 65 3b 0a 20 20 20 20 70 4e  .pPhrase;.    pN
c9c0: 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72  ew->pRoot->pNear
c9d0: 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 20 3d 20  ->apPhrase[0] = 
c9e0: 73 43 74 78 2e 70 50 68 72 61 73 65 3b 0a 20 20  sCtx.pPhrase;.  
c9f0: 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70    pNew->pRoot->p
ca00: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20 3d 20  Near->nPhrase = 
ca10: 31 3b 0a 20 20 20 20 73 43 74 78 2e 70 50 68 72  1;.    sCtx.pPhr
ca20: 61 73 65 2d 3e 70 4e 6f 64 65 20 3d 20 70 4e 65  ase->pNode = pNe
ca30: 77 2d 3e 70 52 6f 6f 74 3b 0a 0a 20 20 20 20 69  w->pRoot;..    i
ca40: 66 28 20 70 4f 72 69 67 2d 3e 6e 54 65 72 6d 3d  f( pOrig->nTerm=
ca50: 3d 31 20 0a 20 20 20 20 20 26 26 20 70 4f 72 69  =1 .     && pOri
ca60: 67 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e  g->aTerm[0].pSyn
ca70: 6f 6e 79 6d 3d 3d 30 20 0a 20 20 20 20 20 26 26  onym==0 .     &&
ca80: 20 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b 30 5d   pOrig->aTerm[0]
ca90: 2e 62 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 20  .bFirst==0 .    
caa0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
cab0: 52 6f 6f 74 2d 3e 65 54 79 70 65 20 3d 20 46 54  Root->eType = FT
cac0: 53 35 5f 54 45 52 4d 3b 0a 20 20 20 20 20 20 70  S5_TERM;.      p
cad0: 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 78 4e 65 78  New->pRoot->xNex
cae0: 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  t = fts5ExprNode
caf0: 4e 65 78 74 5f 54 45 52 4d 3b 0a 20 20 20 20 7d  Next_TERM;.    }
cb00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
cb10: 2d 3e 70 52 6f 6f 74 2d 3e 65 54 79 70 65 20 3d  ->pRoot->eType =
cb20: 20 46 54 53 35 5f 53 54 52 49 4e 47 3b 0a 20 20   FTS5_STRING;.  
cb30: 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d      pNew->pRoot-
cb40: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70  >xNext = fts5Exp
cb50: 72 4e 6f 64 65 4e 65 78 74 5f 53 54 52 49 4e 47  rNodeNext_STRING
cb60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
cb70: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
cb80: 45 78 70 72 46 72 65 65 28 70 4e 65 77 29 3b 0a  ExprFree(pNew);.
cb90: 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72 61      fts5ExprPhra
cba0: 73 65 46 72 65 65 28 73 43 74 78 2e 70 50 68 72  seFree(sCtx.pPhr
cbb0: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  ase);.    pNew =
cbc0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4e 65   0;.  }..  *ppNe
cbd0: 77 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75  w = pNew;.  retu
cbe0: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
cbf0: 20 54 6f 6b 65 6e 20 70 54 6f 6b 20 68 61 73 20   Token pTok has 
cc00: 61 70 70 65 61 72 65 64 20 69 6e 20 61 20 4d 41  appeared in a MA
cc10: 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 20 77  TCH expression w
cc20: 68 65 72 65 20 74 68 65 20 4e 45 41 52 20 6f 70  here the NEAR op
cc30: 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 65 78 70  erator.** is exp
cc40: 65 63 74 65 64 2e 20 49 66 20 74 6f 6b 65 6e 20  ected. If token 
cc50: 70 54 6f 6b 20 64 6f 65 73 20 6e 6f 74 20 63 6f  pTok does not co
cc60: 6e 74 61 69 6e 20 22 4e 45 41 52 22 2c 20 73 74  ntain "NEAR", st
cc70: 6f 72 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  ore an error.** 
cc80: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 6f 62  in the pParse ob
cc90: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
cca0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
ccb0: 61 72 28 46 74 73 35 50 61 72 73 65 20 2a 70 50  ar(Fts5Parse *pP
ccc0: 61 72 73 65 2c 20 46 74 73 35 54 6f 6b 65 6e 20  arse, Fts5Token 
ccd0: 2a 70 54 6f 6b 29 7b 0a 20 20 69 66 28 20 70 54  *pTok){.  if( pT
cce0: 6f 6b 2d 3e 6e 21 3d 34 20 7c 7c 20 6d 65 6d 63  ok->n!=4 || memc
ccf0: 6d 70 28 22 4e 45 41 52 22 2c 20 70 54 6f 6b 2d  mp("NEAR", pTok-
cd00: 3e 70 2c 20 34 29 20 29 7b 0a 20 20 20 20 73 71  >p, 4) ){.    sq
cd10: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 45 72  lite3Fts5ParseEr
cd20: 72 6f 72 28 0a 20 20 20 20 20 20 20 20 70 50 61  ror(.        pPa
cd30: 72 73 65 2c 20 22 66 74 73 35 3a 20 73 79 6e 74  rse, "fts5: synt
cd40: 61 78 20 65 72 72 6f 72 20 6e 65 61 72 20 5c 22  ax error near \"
cd50: 25 2e 2a 73 5c 22 22 2c 20 70 54 6f 6b 2d 3e 6e  %.*s\"", pTok->n
cd60: 2c 20 70 54 6f 6b 2d 3e 70 0a 20 20 20 20 29 3b  , pTok->p.    );
cd70: 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  .  }.}..void sql
cd80: 69 74 65 33 46 74 73 35 50 61 72 73 65 53 65 74  ite3Fts5ParseSet
cd90: 44 69 73 74 61 6e 63 65 28 0a 20 20 46 74 73 35  Distance(.  Fts5
cda0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
cdb0: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
cdc0: 74 20 2a 70 4e 65 61 72 2c 0a 20 20 46 74 73 35  t *pNear,.  Fts5
cdd0: 54 6f 6b 65 6e 20 2a 70 0a 29 7b 0a 20 20 69 66  Token *p.){.  if
cde0: 28 20 70 4e 65 61 72 20 29 7b 0a 20 20 20 20 69  ( pNear ){.    i
cdf0: 6e 74 20 6e 4e 65 61 72 20 3d 20 30 3b 0a 20 20  nt nNear = 0;.  
ce00: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
ce10: 20 70 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 66   p->n ){.      f
ce20: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 3b 20  or(i=0; i<p->n; 
ce30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
ce40: 61 72 20 63 20 3d 20 28 63 68 61 72 29 70 2d 3e  ar c = (char)p->
ce50: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  p[i];.        if
ce60: 28 20 63 3c 27 30 27 20 7c 7c 20 63 3e 27 39 27  ( c<'0' || c>'9'
ce70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ce80: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 45 72  lite3Fts5ParseEr
ce90: 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 20  ror(.           
cea0: 20 20 20 70 50 61 72 73 65 2c 20 22 65 78 70 65     pParse, "expe
ceb0: 63 74 65 64 20 69 6e 74 65 67 65 72 2c 20 67 6f  cted integer, go
cec0: 74 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 70 2d 3e  t \"%.*s\"", p->
ced0: 6e 2c 20 70 2d 3e 70 0a 20 20 20 20 20 20 20 20  n, p->p.        
cee0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
cef0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
cf00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4e 65     }.        nNe
cf10: 61 72 20 3d 20 6e 4e 65 61 72 20 2a 20 31 30 20  ar = nNear * 10 
cf20: 2b 20 28 70 2d 3e 70 5b 69 5d 20 2d 20 27 30 27  + (p->p[i] - '0'
cf30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cf40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4e 65 61  else{.      nNea
cf50: 72 20 3d 20 46 54 53 35 5f 44 45 46 41 55 4c 54  r = FTS5_DEFAULT
cf60: 5f 4e 45 41 52 44 49 53 54 3b 0a 20 20 20 20 7d  _NEARDIST;.    }
cf70: 0a 20 20 20 20 70 4e 65 61 72 2d 3e 6e 4e 65 61  .    pNear->nNea
cf80: 72 20 3d 20 6e 4e 65 61 72 3b 0a 20 20 7d 0a 7d  r = nNear;.  }.}
cf90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
cfa0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  nd argument pass
cfb0: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
cfc0: 69 6f 6e 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ion may be NULL,
cfd0: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a   or it may be.**
cfe0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 46 74 73   an existing Fts
cff0: 35 43 6f 6c 73 65 74 20 6f 62 6a 65 63 74 2e 20  5Colset object. 
d000: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
d010: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
d020: 74 6f 0a 2a 2a 20 61 20 6e 65 77 20 63 6f 6c 73  to.** a new cols
d030: 65 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  et object contai
d040: 6e 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ning the content
d050: 73 20 6f 66 20 28 70 29 20 77 69 74 68 20 6e 65  s of (p) with ne
d060: 77 20 76 61 6c 75 65 20 63 6f 6c 75 6d 6e 0a 2a  w value column.*
d070: 2a 20 6e 75 6d 62 65 72 20 69 43 6f 6c 20 61 70  * number iCol ap
d080: 70 65 6e 64 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49  pended. .**.** I
d090: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
d0a0: 63 63 75 72 73 2c 20 73 74 6f 72 65 20 61 6e 20  ccurs, store an 
d0b0: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 50  error code in pP
d0c0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
d0d0: 4e 55 4c 4c 2e 0a 2a 2a 20 54 68 65 20 6f 6c 64  NULL..** The old
d0e0: 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 28   colset object (
d0f0: 69 66 20 61 6e 79 29 20 69 73 20 6e 6f 74 20 66  if any) is not f
d100: 72 65 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  reed in this cas
d110: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  e..*/.static Fts
d120: 35 43 6f 6c 73 65 74 20 2a 66 74 73 35 50 61 72  5Colset *fts5Par
d130: 73 65 43 6f 6c 73 65 74 28 0a 20 20 46 74 73 35  seColset(.  Fts5
d140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d160: 74 6f 72 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  tore SQLITE_NOME
d170: 4d 20 68 65 72 65 20 69 66 20 72 65 71 75 69 72  M here if requir
d180: 65 64 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  ed */.  Fts5Cols
d190: 65 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  et *p,          
d1a0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74          /* Exist
d1b0: 69 6e 67 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63  ing colset objec
d1c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  t */.  int iCol 
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 6f         /* New co
d1f0: 6c 75 6d 6e 20 74 6f 20 61 64 64 20 74 6f 20 63  lumn to add to c
d200: 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  olset object */.
d210: 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  ){.  int nCol = 
d220: 70 20 3f 20 70 2d 3e 6e 43 6f 6c 20 3a 20 30 3b  p ? p->nCol : 0;
d230: 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 63 6f 6c       /* Num. col
d240: 75 6d 6e 73 20 61 6c 72 65 61 64 79 20 69 6e 20  umns already in 
d250: 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 2a 2f  colset object */
d260: 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
d270: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
d280: 20 20 20 2f 2a 20 4e 65 77 20 63 6f 6c 73 65 74     /* New colset
d290: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
d2a0: 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
d2b0: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
d2c0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
d2d0: 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
d2e0: 6f 6c 3c 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66  ol<pParse->pConf
d2f0: 69 67 2d 3e 6e 43 6f 6c 20 29 3b 0a 0a 20 20 70  ig->nCol );..  p
d300: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
d310: 61 6c 6c 6f 63 36 34 28 70 2c 20 73 69 7a 65 6f  alloc64(p, sizeo
d320: 66 28 46 74 73 35 43 6f 6c 73 65 74 29 20 2b 20  f(Fts5Colset) + 
d330: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c  sizeof(int)*nCol
d340: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
d350: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
d360: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
d370: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
d380: 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 70 4e 65  int *aiCol = pNe
d390: 77 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e  w->aiCol;.    in
d3a0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28  t i, j;.    for(
d3b0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
d3c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 69 43  ){.      if( aiC
d3d0: 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65  ol[i]==iCol ) re
d3e0: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 20 20 20  turn pNew;.     
d3f0: 20 69 66 28 20 61 69 43 6f 6c 5b 69 5d 3e 69 43   if( aiCol[i]>iC
d400: 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ol ) break;.    
d410: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 6e 43 6f 6c  }.    for(j=nCol
d420: 3b 20 6a 3e 69 3b 20 6a 2d 2d 29 7b 0a 20 20 20  ; j>i; j--){.   
d430: 20 20 20 61 69 43 6f 6c 5b 6a 5d 20 3d 20 61 69     aiCol[j] = ai
d440: 43 6f 6c 5b 6a 2d 31 5d 3b 0a 20 20 20 20 7d 0a  Col[j-1];.    }.
d450: 20 20 20 20 61 69 43 6f 6c 5b 69 5d 20 3d 20 69      aiCol[i] = i
d460: 43 6f 6c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  Col;.    pNew->n
d470: 43 6f 6c 20 3d 20 6e 43 6f 6c 2b 31 3b 0a 0a 23  Col = nCol+1;..#
d480: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
d490: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
d4a0: 74 68 65 20 61 72 72 61 79 20 69 73 20 69 6e 20  the array is in 
d4b0: 6f 72 64 65 72 20 61 6e 64 20 63 6f 6e 74 61 69  order and contai
d4c0: 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  ns no duplicate 
d4d0: 65 6e 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20  entries. */.    
d4e0: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 4e 65 77 2d  for(i=1; i<pNew-
d4f0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 61 73 73 65  >nCol; i++) asse
d500: 72 74 28 20 70 4e 65 77 2d 3e 61 69 43 6f 6c 5b  rt( pNew->aiCol[
d510: 69 5d 3e 70 4e 65 77 2d 3e 61 69 43 6f 6c 5b 69  i]>pNew->aiCol[i
d520: 2d 31 5d 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  -1] );.#endif.  
d530: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  }..  return pNew
d540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
d550: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
d560: 6e 20 46 74 73 35 43 6f 6c 73 65 74 20 6f 62 6a  n Fts5Colset obj
d570: 65 63 74 20 73 70 65 63 69 66 79 69 6e 67 20 74  ect specifying t
d580: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 0a 2a 2a  he inverse of.**
d590: 20 74 68 65 20 63 6f 6c 73 65 74 20 70 61 73 73   the colset pass
d5a0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
d5b0: 20 61 72 67 75 6d 65 6e 74 2e 20 46 72 65 65 20   argument. Free 
d5c0: 74 68 65 20 63 6f 6c 73 65 74 20 70 61 73 73 65  the colset passe
d5d0: 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f  d.** as the seco
d5e0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 62 65 66 6f  nd argument befo
d5f0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
d600: 0a 46 74 73 35 43 6f 6c 73 65 74 20 2a 73 71 6c  .Fts5Colset *sql
d610: 69 74 65 33 46 74 73 35 50 61 72 73 65 43 6f 6c  ite3Fts5ParseCol
d620: 73 65 74 49 6e 76 65 72 74 28 46 74 73 35 50 61  setInvert(Fts5Pa
d630: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73  rse *pParse, Fts
d640: 35 43 6f 6c 73 65 74 20 2a 70 29 7b 0a 20 20 46  5Colset *p){.  F
d650: 74 73 35 43 6f 6c 73 65 74 20 2a 70 52 65 74 3b  ts5Colset *pRet;
d660: 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 50  .  int nCol = pP
d670: 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  arse->pConfig->n
d680: 43 6f 6c 3b 0a 0a 20 20 70 52 65 74 20 3d 20 28  Col;..  pRet = (
d690: 46 74 73 35 43 6f 6c 73 65 74 2a 29 73 71 6c 69  Fts5Colset*)sqli
d6a0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
d6b0: 6f 28 26 70 50 61 72 73 65 2d 3e 72 63 2c 20 0a  o(&pParse->rc, .
d6c0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
d6d0: 35 43 6f 6c 73 65 74 29 20 2b 20 73 69 7a 65 6f  5Colset) + sizeo
d6e0: 66 28 69 6e 74 29 2a 6e 43 6f 6c 0a 20 20 29 3b  f(int)*nCol.  );
d6f0: 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20  .  if( pRet ){. 
d700: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
d710: 74 20 69 4f 6c 64 20 3d 20 30 3b 0a 20 20 20 20  t iOld = 0;.    
d720: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
d730: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
d740: 20 69 4f 6c 64 3e 3d 70 2d 3e 6e 43 6f 6c 20 7c   iOld>=p->nCol |
d750: 7c 20 70 2d 3e 61 69 43 6f 6c 5b 69 4f 6c 64 5d  | p->aiCol[iOld]
d760: 21 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=i ){.        p
d770: 52 65 74 2d 3e 61 69 43 6f 6c 5b 70 52 65 74 2d  Ret->aiCol[pRet-
d780: 3e 6e 43 6f 6c 2b 2b 5d 20 3d 20 69 3b 0a 20 20  >nCol++] = i;.  
d790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d7a0: 20 20 20 69 4f 6c 64 2b 2b 3b 0a 20 20 20 20 20     iOld++;.     
d7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
d7c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
d7d0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
d7e0: 7d 0a 0a 46 74 73 35 43 6f 6c 73 65 74 20 2a 73  }..Fts5Colset *s
d7f0: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 43  qlite3Fts5ParseC
d800: 6f 6c 73 65 74 28 0a 20 20 46 74 73 35 50 61 72  olset(.  Fts5Par
d810: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d820: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
d830: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 68  e SQLITE_NOMEM h
d840: 65 72 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ere if required 
d850: 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
d860: 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
d870: 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
d880: 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 2a   colset object *
d890: 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70  /.  Fts5Token *p
d8a0: 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  .){.  Fts5Colset
d8b0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *pRet = 0;.  in
d8c0: 74 20 69 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t iCol;.  char *
d8d0: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
d8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
d8f0: 75 6f 74 65 64 20 63 6f 70 79 20 6f 66 20 74 6f  uoted copy of to
d900: 6b 65 6e 20 70 20 2a 2f 0a 0a 20 20 7a 20 3d 20  ken p */..  z = 
d910: 73 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64  sqlite3Fts5Strnd
d920: 75 70 28 26 70 50 61 72 73 65 2d 3e 72 63 2c 20  up(&pParse->rc, 
d930: 70 2d 3e 70 2c 20 70 2d 3e 6e 29 3b 0a 20 20 69  p->p, p->n);.  i
d940: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
d950: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d960: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
d970: 66 69 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 43  fig = pParse->pC
d980: 6f 6e 66 69 67 3b 0a 20 20 20 20 73 71 6c 69 74  onfig;.    sqlit
d990: 65 33 46 74 73 35 44 65 71 75 6f 74 65 28 7a 29  e3Fts5Dequote(z)
d9a0: 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  ;.    for(iCol=0
d9b0: 3b 20 69 43 6f 6c 3c 70 43 6f 6e 66 69 67 2d 3e  ; iCol<pConfig->
d9c0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
d9d0: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
d9e0: 74 65 33 5f 73 74 72 69 63 6d 70 28 70 43 6f 6e  te3_stricmp(pCon
d9f0: 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 43 6f 6c 5d  fig->azCol[iCol]
da00: 2c 20 7a 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  , z) ) break;.  
da10: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
da20: 3d 3d 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20  ==pConfig->nCol 
da30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
da40: 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 70  Fts5ParseError(p
da50: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
da60: 63 6f 6c 75 6d 6e 3a 20 25 73 22 2c 20 7a 29 3b  column: %s", z);
da70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
da80: 20 20 70 52 65 74 20 3d 20 66 74 73 35 50 61 72    pRet = fts5Par
da90: 73 65 43 6f 6c 73 65 74 28 70 50 61 72 73 65 2c  seColset(pParse,
daa0: 20 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b   pColset, iCol);
dab0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
dac0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
dad0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
dae0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
daf0: 61 72 73 65 2d 3e 72 63 21 3d 53 51 4c 49 54 45  arse->rc!=SQLITE
db00: 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  _OK );.    sqlit
db10: 65 33 5f 66 72 65 65 28 70 43 6f 6c 73 65 74 29  e3_free(pColset)
db20: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
db30: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pRet;.}../*.** I
db40: 66 20 61 72 67 75 6d 65 6e 74 20 70 4f 72 69 67  f argument pOrig
db50: 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20   is NULL, or if 
db60: 28 2a 70 52 63 29 20 69 73 20 73 65 74 20 74 6f  (*pRc) is set to
db70: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
db80: 74 68 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  than.** SQLITE_O
db90: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
dba0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
dbb0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
dbc0: 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  . .**.** Otherwi
dbd0: 73 65 2c 20 61 20 63 6f 70 79 20 6f 66 20 28 2a  se, a copy of (*
dbe0: 70 4f 72 69 67 29 20 69 73 20 6d 61 64 65 20 69  pOrig) is made i
dbf0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
dc00: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
dc10: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
dc20: 6f 28 29 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  o() and a pointe
dc30: 72 20 74 6f 20 69 74 20 72 65 74 75 72 6e 65 64  r to it returned
dc40: 2e 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  . If the allocat
dc50: 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 28 2a  ion.** fails, (*
dc60: 70 52 63 29 20 69 73 20 73 65 74 20 74 6f 20 53  pRc) is set to S
dc70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20  QLITE_NOMEM and 
dc80: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
dc90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
dca0: 43 6f 6c 73 65 74 20 2a 66 74 73 35 43 6c 6f 6e  Colset *fts5Clon
dcb0: 65 43 6f 6c 73 65 74 28 69 6e 74 20 2a 70 52 63  eColset(int *pRc
dcc0: 2c 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 4f  , Fts5Colset *pO
dcd0: 72 69 67 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73  rig){.  Fts5Cols
dce0: 65 74 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  et *pRet;.  if( 
dcf0: 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 73 71 6c  pOrig ){.    sql
dd00: 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
dd10: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f   = sizeof(Fts5Co
dd20: 6c 73 65 74 29 20 2b 20 28 70 4f 72 69 67 2d 3e  lset) + (pOrig->
dd30: 6e 43 6f 6c 2d 31 29 20 2a 20 73 69 7a 65 6f 66  nCol-1) * sizeof
dd40: 28 69 6e 74 29 3b 0a 20 20 20 20 70 52 65 74 20  (int);.    pRet 
dd50: 3d 20 28 46 74 73 35 43 6f 6c 73 65 74 2a 29 73  = (Fts5Colset*)s
dd60: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
dd70: 5a 65 72 6f 28 70 52 63 2c 20 6e 42 79 74 65 29  Zero(pRc, nByte)
dd80: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
dd90: 7b 20 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  { .      memcpy(
dda0: 70 52 65 74 2c 20 70 4f 72 69 67 2c 20 6e 42 79  pRet, pOrig, nBy
ddb0: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  te);.    }.  }el
ddc0: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
ddd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
dde0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
ddf0: 6d 6f 76 65 20 66 72 6f 6d 20 63 6f 6c 73 65 74  move from colset
de00: 20 70 43 6f 6c 73 65 74 20 61 6e 79 20 63 6f 6c   pColset any col
de10: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f  umns that are no
de20: 74 20 61 6c 73 6f 20 69 6e 20 63 6f 6c 73 65 74  t also in colset
de30: 20 70 4d 65 72 67 65 2e 0a 2a 2f 0a 73 74 61 74   pMerge..*/.stat
de40: 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
de50: 65 43 6f 6c 73 65 74 28 46 74 73 35 43 6f 6c 73  eColset(Fts5Cols
de60: 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 46 74 73  et *pColset, Fts
de70: 35 43 6f 6c 73 65 74 20 2a 70 4d 65 72 67 65 29  5Colset *pMerge)
de80: 7b 0a 20 20 69 6e 74 20 69 49 6e 20 3d 20 30 3b  {.  int iIn = 0;
de90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
dea0: 74 20 69 6e 70 75 74 20 69 6e 20 70 43 6f 6c 73  t input in pCols
deb0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 72  et */.  int iMer
dec0: 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ge = 0;       /*
ded0: 20 4e 65 78 74 20 69 6e 70 75 74 20 69 6e 20 70   Next input in p
dee0: 4d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  Merge */.  int i
def0: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
df00: 20 2f 2a 20 4e 65 78 74 20 6f 75 74 70 75 74 20   /* Next output 
df10: 73 6c 6f 74 20 69 6e 20 70 43 6f 6c 73 65 74 20  slot in pColset 
df20: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 49 6e  */..  while( iIn
df30: 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 20 26  <pColset->nCol &
df40: 26 20 69 4d 65 72 67 65 3c 70 4d 65 72 67 65 2d  & iMerge<pMerge-
df50: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74  >nCol ){.    int
df60: 20 69 44 69 66 66 20 3d 20 70 43 6f 6c 73 65 74   iDiff = pColset
df70: 2d 3e 61 69 43 6f 6c 5b 69 49 6e 5d 20 2d 20 70  ->aiCol[iIn] - p
df80: 4d 65 72 67 65 2d 3e 61 69 43 6f 6c 5b 69 4d 65  Merge->aiCol[iMe
df90: 72 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 69 44  rge];.    if( iD
dfa0: 69 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  iff==0 ){.      
dfb0: 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69  pColset->aiCol[i
dfc0: 4f 75 74 2b 2b 5d 20 3d 20 70 4d 65 72 67 65 2d  Out++] = pMerge-
dfd0: 3e 61 69 43 6f 6c 5b 69 4d 65 72 67 65 5d 3b 0a  >aiCol[iMerge];.
dfe0: 20 20 20 20 20 20 69 4d 65 72 67 65 2b 2b 3b 0a        iMerge++;.
dff0: 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
e000: 20 7d 65 6c 73 65 20 69 66 28 20 69 44 69 66 66   }else if( iDiff
e010: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 4d 65 72  >0 ){.      iMer
e020: 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ge++;.    }else{
e030: 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
e040: 20 20 7d 0a 20 20 7d 0a 20 20 70 43 6f 6c 73 65    }.  }.  pColse
e050: 74 2d 3e 6e 43 6f 6c 20 3d 20 69 4f 75 74 3b 0a  t->nCol = iOut;.
e060: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
e070: 76 65 6c 79 20 61 70 70 6c 79 20 63 6f 6c 73 65  vely apply colse
e080: 74 20 70 43 6f 6c 73 65 74 20 74 6f 20 65 78 70  t pColset to exp
e090: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 70 4e 6f  ression node pNo
e0a0: 64 65 20 61 6e 64 20 61 6c 6c 20 6f 66 0a 2a 2a  de and all of.**
e0b0: 20 69 74 73 20 64 65 63 65 6e 64 65 6e 74 73 2e   its decendents.
e0c0: 20 49 66 20 28 2a 70 70 46 72 65 65 29 20 69 73   If (*ppFree) is
e0d0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 63 6f   not NULL, it co
e0e0: 6e 74 61 69 6e 73 20 61 20 73 70 61 72 65 20 63  ntains a spare c
e0f0: 6f 70 79 0a 2a 2a 20 6f 66 20 70 43 6f 6c 73 65  opy.** of pColse
e100: 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
e110: 20 6d 61 79 20 75 73 65 20 74 68 65 20 73 70 61   may use the spa
e120: 72 65 20 63 6f 70 79 20 61 6e 64 20 73 65 74 20  re copy and set 
e130: 28 2a 70 70 46 72 65 65 29 20 74 6f 0a 2a 2a 20  (*ppFree) to.** 
e140: 7a 65 72 6f 2c 20 6f 72 20 69 74 20 6d 61 79 20  zero, or it may 
e150: 63 72 65 61 74 65 20 63 6f 70 69 65 73 20 6f 66  create copies of
e160: 20 70 43 6f 6c 73 65 74 20 75 73 69 6e 67 20 66   pColset using f
e170: 74 73 35 43 6c 6f 6e 65 43 6f 6c 73 65 74 28 29  ts5CloneColset()
e180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e190: 20 66 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c   fts5ParseSetCol
e1a0: 73 65 74 28 0a 20 20 46 74 73 35 50 61 72 73 65  set(.  Fts5Parse
e1b0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 46 74 73   *pParse, .  Fts
e1c0: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
e1d0: 2c 20 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  , .  Fts5Colset 
e1e0: 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35  *pColset,.  Fts5
e1f0: 43 6f 6c 73 65 74 20 2a 2a 70 70 46 72 65 65 0a  Colset **ppFree.
e200: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
e210: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
e220: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
e230: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ode->eType==FTS5
e240: 5f 54 45 52 4d 20 7c 7c 20 70 4e 6f 64 65 2d 3e  _TERM || pNode->
e250: 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49  eType==FTS5_STRI
e260: 4e 47 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  NG .         || 
e270: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
e280: 53 35 5f 41 4e 44 20 20 7c 7c 20 70 4e 6f 64 65  S5_AND  || pNode
e290: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4f 52  ->eType==FTS5_OR
e2a0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 6f  .         || pNo
e2b0: 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  de->eType==FTS5_
e2c0: 4e 4f 54 20 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65  NOT  || pNode->e
e2d0: 54 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46 0a 20  Type==FTS5_EOF. 
e2e0: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e     );.    if( pN
e2f0: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ode->eType==FTS5
e300: 5f 53 54 52 49 4e 47 20 7c 7c 20 70 4e 6f 64 65  _STRING || pNode
e310: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45  ->eType==FTS5_TE
e320: 52 4d 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  RM ){.      Fts5
e330: 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65  ExprNearset *pNe
e340: 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  ar = pNode->pNea
e350: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  r;.      if( pNe
e360: 61 72 2d 3e 70 43 6f 6c 73 65 74 20 29 7b 0a 20  ar->pColset ){. 
e370: 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
e380: 43 6f 6c 73 65 74 28 70 4e 65 61 72 2d 3e 70 43  Colset(pNear->pC
e390: 6f 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74 29 3b  olset, pColset);
e3a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
e3b0: 61 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  ar->pColset->nCo
e3c0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
e3d0: 20 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 3d    pNode->eType =
e3e0: 20 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20   FTS5_EOF;.     
e3f0: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65 78       pNode->xNex
e400: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
e410: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e420: 20 2a 70 70 46 72 65 65 20 29 7b 0a 20 20 20 20   *ppFree ){.    
e430: 20 20 20 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73      pNear->pCols
e440: 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  et = pColset;.  
e450: 20 20 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20        *ppFree = 
e460: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
e470: 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d 3e 70          pNear->p
e480: 43 6f 6c 73 65 74 20 3d 20 66 74 73 35 43 6c 6f  Colset = fts5Clo
e490: 6e 65 43 6f 6c 73 65 74 28 26 70 50 61 72 73 65  neColset(&pParse
e4a0: 2d 3e 72 63 2c 20 70 43 6f 6c 73 65 74 29 3b 0a  ->rc, pColset);.
e4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
e4c0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
e4d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
e4e0: 6f 64 65 2d 3e 65 54 79 70 65 21 3d 46 54 53 35  ode->eType!=FTS5
e4f0: 5f 45 4f 46 20 7c 7c 20 70 4e 6f 64 65 2d 3e 6e  _EOF || pNode->n
e500: 43 68 69 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20  Child==0 );.    
e510: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f    for(i=0; i<pNo
e520: 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29  de->nChild; i++)
e530: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 50 61  {.        fts5Pa
e540: 72 73 65 53 65 74 43 6f 6c 73 65 74 28 70 50 61  rseSetColset(pPa
e550: 72 73 65 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68  rse, pNode->apCh
e560: 69 6c 64 5b 69 5d 2c 20 70 43 6f 6c 73 65 74 2c  ild[i], pColset,
e570: 20 70 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20   ppFree);.      
e580: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
e590: 2a 0a 2a 2a 20 41 70 70 6c 79 20 63 6f 6c 73 65  *.** Apply colse
e5a0: 74 20 70 43 6f 6c 73 65 74 20 74 6f 20 65 78 70  t pColset to exp
e5b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 70 45 78  ression node pEx
e5c0: 70 72 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  pr and all of it
e5d0: 73 20 64 65 73 63 65 6e 64 65 6e 74 73 2e 0a 2a  s descendents..*
e5e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
e5f0: 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74  s5ParseSetColset
e600: 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70  (.  Fts5Parse *p
e610: 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78  Parse, .  Fts5Ex
e620: 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 2c 20 0a  prNode *pExpr, .
e630: 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
e640: 6f 6c 73 65 74 20 0a 29 7b 0a 20 20 46 74 73 35  olset .){.  Fts5
e650: 43 6f 6c 73 65 74 20 2a 70 46 72 65 65 20 3d 20  Colset *pFree = 
e660: 70 43 6f 6c 73 65 74 3b 0a 20 20 69 66 28 20 70  pColset;.  if( p
e670: 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Parse->pConfig->
e680: 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
e690: 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
e6a0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
e6b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
e6c0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 20 3d 20 73  pParse->zErr = s
e6d0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
e6e0: 20 20 20 20 20 20 22 66 74 73 35 3a 20 63 6f 6c        "fts5: col
e6f0: 75 6d 6e 20 71 75 65 72 69 65 73 20 61 72 65 20  umn queries are 
e700: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 28 64  not supported (d
e710: 65 74 61 69 6c 3d 6e 6f 6e 65 29 22 0a 20 20 20  etail=none)".   
e720: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
e730: 20 66 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c   fts5ParseSetCol
e740: 73 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  set(pParse, pExp
e750: 72 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 46 72  r, pColset, &pFr
e760: 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ee);.  }.  sqlit
e770: 65 33 5f 66 72 65 65 28 70 46 72 65 65 29 3b 0a  e3_free(pFree);.
e780: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
e790: 74 73 35 45 78 70 72 41 73 73 69 67 6e 58 4e 65  ts5ExprAssignXNe
e7a0: 78 74 28 46 74 73 35 45 78 70 72 4e 6f 64 65 20  xt(Fts5ExprNode 
e7b0: 2a 70 4e 6f 64 65 29 7b 0a 20 20 73 77 69 74 63  *pNode){.  switc
e7c0: 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20  h( pNode->eType 
e7d0: 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53 35  ){.    case FTS5
e7e0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
e7f0: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
e800: 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d   *pNear = pNode-
e810: 3e 70 4e 65 61 72 3b 0a 20 20 20 20 20 20 69 66  >pNear;.      if
e820: 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  ( pNear->nPhrase
e830: 3d 3d 31 20 26 26 20 70 4e 65 61 72 2d 3e 61 70  ==1 && pNear->ap
e840: 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54 65 72 6d  Phrase[0]->nTerm
e850: 3d 3d 31 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==1 .       && p
e860: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
e870: 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e  ]->aTerm[0].pSyn
e880: 6f 6e 79 6d 3d 3d 30 0a 20 20 20 20 20 20 20 26  onym==0.       &
e890: 26 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  & pNear->apPhras
e8a0: 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62  e[0]->aTerm[0].b
e8b0: 46 69 72 73 74 3d 3d 30 0a 20 20 20 20 20 20 29  First==0.      )
e8c0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d  {.        pNode-
e8d0: 3e 65 54 79 70 65 20 3d 20 46 54 53 35 5f 54 45  >eType = FTS5_TE
e8e0: 52 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64  RM;.        pNod
e8f0: 65 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45  e->xNext = fts5E
e900: 78 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45 52 4d  xprNodeNext_TERM
e910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e920: 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e         pNode->xN
e930: 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f  ext = fts5ExprNo
e940: 64 65 4e 65 78 74 5f 53 54 52 49 4e 47 3b 0a 20  deNext_STRING;. 
e950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
e960: 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20  ak;.    };..    
e970: 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20 7b 0a  case FTS5_OR: {.
e980: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65        pNode->xNe
e990: 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  xt = fts5ExprNod
e9a0: 65 4e 65 78 74 5f 4f 52 3b 0a 20 20 20 20 20 20  eNext_OR;.      
e9b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20  break;.    };.. 
e9c0: 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44     case FTS5_AND
e9d0: 3a 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  : {.      pNode-
e9e0: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70  >xNext = fts5Exp
e9f0: 72 4e 6f 64 65 4e 65 78 74 5f 41 4e 44 3b 0a 20  rNodeNext_AND;. 
ea00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ea10: 7d 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  };..    default:
ea20: 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
ea30: 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f 54 20  eType==FTS5_NOT 
ea40: 29 3b 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65  ); {.      pNode
ea50: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78  ->xNext = fts5Ex
ea60: 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54 3b 0a  prNodeNext_NOT;.
ea70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ea80: 20 7d 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   };.  }.}..stati
ea90: 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 41  c void fts5ExprA
eaa0: 64 64 43 68 69 6c 64 72 65 6e 28 46 74 73 35 45  ddChildren(Fts5E
eab0: 78 70 72 4e 6f 64 65 20 2a 70 2c 20 46 74 73 35  xprNode *p, Fts5
eac0: 45 78 70 72 4e 6f 64 65 20 2a 70 53 75 62 29 7b  ExprNode *pSub){
ead0: 0a 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 21  .  if( p->eType!
eae0: 3d 46 54 53 35 5f 4e 4f 54 20 26 26 20 70 53 75  =FTS5_NOT && pSu
eaf0: 62 2d 3e 65 54 79 70 65 3d 3d 70 2d 3e 65 54 79  b->eType==p->eTy
eb00: 70 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  pe ){.    int nB
eb10: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
eb20: 35 45 78 70 72 4e 6f 64 65 2a 29 20 2a 20 70 53  5ExprNode*) * pS
eb30: 75 62 2d 3e 6e 43 68 69 6c 64 3b 0a 20 20 20 20  ub->nChild;.    
eb40: 6d 65 6d 63 70 79 28 26 70 2d 3e 61 70 43 68 69  memcpy(&p->apChi
eb50: 6c 64 5b 70 2d 3e 6e 43 68 69 6c 64 5d 2c 20 70  ld[p->nChild], p
eb60: 53 75 62 2d 3e 61 70 43 68 69 6c 64 2c 20 6e 42  Sub->apChild, nB
eb70: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 68  yte);.    p->nCh
eb80: 69 6c 64 20 2b 3d 20 70 53 75 62 2d 3e 6e 43 68  ild += pSub->nCh
eb90: 69 6c 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ild;.    sqlite3
eba0: 5f 66 72 65 65 28 70 53 75 62 29 3b 0a 20 20 7d  _free(pSub);.  }
ebb0: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61 70 43  else{.    p->apC
ebc0: 68 69 6c 64 5b 70 2d 3e 6e 43 68 69 6c 64 2b 2b  hild[p->nChild++
ebd0: 5d 20 3d 20 70 53 75 62 3b 0a 20 20 7d 0a 7d 0a  ] = pSub;.  }.}.
ebe0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
ebf0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
ec00: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65   expression obje
ec10: 63 74 2e 20 49 66 20 61 6e 79 74 68 69 6e 67 20  ct. If anything 
ec20: 67 6f 65 73 20 77 72 6f 6e 67 20 28 69 2e 65 2e  goes wrong (i.e.
ec30: 0a 2a 2a 20 4f 4f 4d 20 65 72 72 6f 72 29 2c 20  .** OOM error), 
ec40: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
ec50: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
ec60: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
ec70: 2f 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  /.Fts5ExprNode *
ec80: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
ec90: 4e 6f 64 65 28 0a 20 20 46 74 73 35 50 61 72 73  Node(.  Fts5Pars
eca0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ecb0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
ecc0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
ecd0: 74 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  t eType,        
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ecf0: 20 46 54 53 35 5f 53 54 52 49 4e 47 2c 20 41 4e   FTS5_STRING, AN
ed00: 44 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 2a 2f 0a  D, OR or NOT */.
ed10: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
ed20: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
ed30: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 63    /* Left hand c
ed40: 68 69 6c 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hild expression 
ed50: 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  */.  Fts5ExprNod
ed60: 65 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20  e *pRight,      
ed70: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61       /* Right ha
ed80: 6e 64 20 63 68 69 6c 64 20 65 78 70 72 65 73 73  nd child express
ed90: 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  ion */.  Fts5Exp
eda0: 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
edb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
edc0: 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f  STRING expressio
edd0: 6e 73 2c 20 74 68 65 20 6e 65 61 72 20 63 6c 75  ns, the near clu
ede0: 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ster */.){.  Fts
edf0: 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 65 74 20  5ExprNode *pRet 
ee00: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  = 0;..  if( pPar
ee10: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
ee20: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 68  K ){.    int nCh
ee30: 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
ee40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ee50: 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   of children of 
ee60: 72 65 74 75 72 6e 65 64 20 6e 6f 64 65 20 2a 2f  returned node */
ee70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
ee80: 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  64 nByte;       
ee90: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
eea0: 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
eeb0: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 2a   for this node *
eec0: 2f 0a 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  /. .    assert( 
eed0: 28 65 54 79 70 65 21 3d 46 54 53 35 5f 53 54 52  (eType!=FTS5_STR
eee0: 49 4e 47 20 26 26 20 21 70 4e 65 61 72 29 0a 20  ING && !pNear). 
eef0: 20 20 20 20 20 20 20 20 7c 7c 20 28 65 54 79 70          || (eTyp
ef00: 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 26  e==FTS5_STRING &
ef10: 26 20 21 70 4c 65 66 74 20 26 26 20 21 70 52 69  & !pLeft && !pRi
ef20: 67 68 74 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  ght).    );.    
ef30: 69 66 28 20 65 54 79 70 65 3d 3d 46 54 53 35 5f  if( eType==FTS5_
ef40: 53 54 52 49 4e 47 20 26 26 20 70 4e 65 61 72 3d  STRING && pNear=
ef50: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ef60: 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 46 54     if( eType!=FT
ef70: 53 35 5f 53 54 52 49 4e 47 20 26 26 20 70 4c 65  S5_STRING && pLe
ef80: 66 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70  ft==0 ) return p
ef90: 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 65  Right;.    if( e
efa0: 54 79 70 65 21 3d 46 54 53 35 5f 53 54 52 49 4e  Type!=FTS5_STRIN
efb0: 47 20 26 26 20 70 52 69 67 68 74 3d 3d 30 20 29  G && pRight==0 )
efc0: 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 0a   return pLeft;..
efd0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 46      if( eType==F
efe0: 54 53 35 5f 4e 4f 54 20 29 7b 0a 20 20 20 20 20  TS5_NOT ){.     
eff0: 20 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20   nChild = 2;.   
f000: 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65   }else if( eType
f010: 3d 3d 46 54 53 35 5f 41 4e 44 20 7c 7c 20 65 54  ==FTS5_AND || eT
f020: 79 70 65 3d 3d 46 54 53 35 5f 4f 52 20 29 7b 0a  ype==FTS5_OR ){.
f030: 20 20 20 20 20 20 6e 43 68 69 6c 64 20 3d 20 32        nChild = 2
f040: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
f050: 74 2d 3e 65 54 79 70 65 3d 3d 65 54 79 70 65 20  t->eType==eType 
f060: 29 20 6e 43 68 69 6c 64 20 2b 3d 20 70 4c 65 66  ) nChild += pLef
f070: 74 2d 3e 6e 43 68 69 6c 64 2d 31 3b 0a 20 20 20  t->nChild-1;.   
f080: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 65     if( pRight->e
f090: 54 79 70 65 3d 3d 65 54 79 70 65 20 29 20 6e 43  Type==eType ) nC
f0a0: 68 69 6c 64 20 2b 3d 20 70 52 69 67 68 74 2d 3e  hild += pRight->
f0b0: 6e 43 68 69 6c 64 2d 31 3b 0a 20 20 20 20 7d 0a  nChild-1;.    }.
f0c0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
f0d0: 65 6f 66 28 46 74 73 35 45 78 70 72 4e 6f 64 65  eof(Fts5ExprNode
f0e0: 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 35 45  ) + sizeof(Fts5E
f0f0: 78 70 72 4e 6f 64 65 2a 29 2a 28 6e 43 68 69 6c  xprNode*)*(nChil
f100: 64 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  d-1);.    pRet =
f110: 20 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29   (Fts5ExprNode*)
f120: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
f130: 63 5a 65 72 6f 28 26 70 50 61 72 73 65 2d 3e 72  cZero(&pParse->r
f140: 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20  c, nByte);..    
f150: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
f160: 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d 20    pRet->eType = 
f170: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 52 65  eType;.      pRe
f180: 74 2d 3e 70 4e 65 61 72 20 3d 20 70 4e 65 61 72  t->pNear = pNear
f190: 3b 0a 20 20 20 20 20 20 66 74 73 35 45 78 70 72  ;.      fts5Expr
f1a0: 41 73 73 69 67 6e 58 4e 65 78 74 28 70 52 65 74  AssignXNext(pRet
f1b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
f1c0: 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20  pe==FTS5_STRING 
f1d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
f1e0: 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20  Phrase;.        
f1f0: 66 6f 72 28 69 50 68 72 61 73 65 3d 30 3b 20 69  for(iPhrase=0; i
f200: 50 68 72 61 73 65 3c 70 4e 65 61 72 2d 3e 6e 50  Phrase<pNear->nP
f210: 68 72 61 73 65 3b 20 69 50 68 72 61 73 65 2b 2b  hrase; iPhrase++
f220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
f230: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 50 68  ar->apPhrase[iPh
f240: 72 61 73 65 5d 2d 3e 70 4e 6f 64 65 20 3d 20 70  rase]->pNode = p
f250: 52 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Ret;.          i
f260: 66 28 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61  f( pNear->apPhra
f270: 73 65 5b 69 50 68 72 61 73 65 5d 2d 3e 6e 54 65  se[iPhrase]->nTe
f280: 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rm==0 ){.       
f290: 20 20 20 20 20 70 52 65 74 2d 3e 78 4e 65 78 74       pRet->xNext
f2a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f2b0: 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d 20    pRet->eType = 
f2c0: 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20 20  FTS5_EOF;.      
f2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
f2e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
f2f0: 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  rse->pConfig->eD
f300: 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
f310: 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
f320: 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72       Fts5ExprPhr
f330: 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
f340: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
f350: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
f360: 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 21   pNear->nPhrase!
f370: 3d 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  =1 .           |
f380: 7c 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  | pPhrase->nTerm
f390: 3e 31 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  >1.           ||
f3a0: 20 28 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d   (pPhrase->nTerm
f3b0: 3e 30 20 26 26 20 70 50 68 72 61 73 65 2d 3e 61  >0 && pPhrase->a
f3c0: 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 29 0a  Term[0].bFirst).
f3d0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
f3e0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
f3f0: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
f400: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
f410: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
f420: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
f430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
f440: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 7a 45 72  ert( pParse->zEr
f450: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r==0 );.        
f460: 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72      pParse->zErr
f470: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f480: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
f490: 20 20 20 20 22 66 74 73 35 3a 20 25 73 20 71 75      "fts5: %s qu
f4a0: 65 72 69 65 73 20 61 72 65 20 6e 6f 74 20 73 75  eries are not su
f4b0: 70 70 6f 72 74 65 64 20 28 64 65 74 61 69 6c 21  pported (detail!
f4c0: 3d 66 75 6c 6c 29 22 2c 20 0a 20 20 20 20 20 20  =full)", .      
f4d0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d            pNear-
f4e0: 3e 6e 50 68 72 61 73 65 3d 3d 31 20 3f 20 22 70  >nPhrase==1 ? "p
f4f0: 68 72 61 73 65 22 3a 20 22 4e 45 41 52 22 0a 20  hrase": "NEAR". 
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
f510: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
f520: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
f530: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
f540: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
f550: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
f560: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f570: 20 20 20 66 74 73 35 45 78 70 72 41 64 64 43 68     fts5ExprAddCh
f580: 69 6c 64 72 65 6e 28 70 52 65 74 2c 20 70 4c 65  ildren(pRet, pLe
f590: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ft);.        fts
f5a0: 35 45 78 70 72 41 64 64 43 68 69 6c 64 72 65 6e  5ExprAddChildren
f5b0: 28 70 52 65 74 2c 20 70 52 69 67 68 74 29 3b 0a  (pRet, pRight);.
f5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f5d0: 7d 0a 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  }..  if( pRet==0
f5e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f5f0: 70 50 61 72 73 65 2d 3e 72 63 21 3d 53 51 4c 49  pParse->rc!=SQLI
f600: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c  TE_OK );.    sql
f610: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64  ite3Fts5ParseNod
f620: 65 46 72 65 65 28 70 4c 65 66 74 29 3b 0a 20 20  eFree(pLeft);.  
f630: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
f640: 73 65 4e 6f 64 65 46 72 65 65 28 70 52 69 67 68  seNodeFree(pRigh
f650: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  t);.    sqlite3F
f660: 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46  ts5ParseNearsetF
f670: 72 65 65 28 70 4e 65 61 72 29 3b 0a 20 20 7d 0a  ree(pNear);.  }.
f680: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
f690: 0a 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  ..Fts5ExprNode *
f6a0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
f6b0: 49 6d 70 6c 69 63 69 74 41 6e 64 28 0a 20 20 46  ImplicitAnd(.  F
f6c0: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
f6d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f6e0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
f6f0: 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  */.  Fts5ExprNod
f700: 65 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  e *pLeft,       
f710: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e       /* Left han
f720: 64 20 63 68 69 6c 64 20 65 78 70 72 65 73 73 69  d child expressi
f730: 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  on */.  Fts5Expr
f740: 4e 6f 64 65 20 2a 70 52 69 67 68 74 20 20 20 20  Node *pRight    
f750: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
f760: 20 68 61 6e 64 20 63 68 69 6c 64 20 65 78 70 72   hand child expr
f770: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 46  ession */.){.  F
f780: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 65  ts5ExprNode *pRe
f790: 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 45 78 70  t = 0;.  Fts5Exp
f7a0: 72 4e 6f 64 65 20 2a 70 50 72 65 76 3b 0a 0a 20  rNode *pPrev;.. 
f7b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 20   if( pParse->rc 
f7c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
f7d0: 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
f7e0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
f7f0: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
f800: 46 72 65 65 28 70 52 69 67 68 74 29 3b 0a 20 20  Free(pRight);.  
f810: 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 61 73 73 65  }else{..    asse
f820: 72 74 28 20 70 4c 65 66 74 2d 3e 65 54 79 70 65  rt( pLeft->eType
f830: 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 0a 20  ==FTS5_STRING . 
f840: 20 20 20 20 20 20 20 7c 7c 20 70 4c 65 66 74 2d         || pLeft-
f850: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
f860: 4d 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 65  M.        || pLe
f870: 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  ft->eType==FTS5_
f880: 45 4f 46 0a 20 20 20 20 20 20 20 20 7c 7c 20 70  EOF.        || p
f890: 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Left->eType==FTS
f8a0: 35 5f 41 4e 44 0a 20 20 20 20 29 3b 0a 20 20 20  5_AND.    );.   
f8b0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
f8c0: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52  >eType==FTS5_STR
f8d0: 49 4e 47 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  ING .        || 
f8e0: 70 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46  pRight->eType==F
f8f0: 54 53 35 5f 54 45 52 4d 20 0a 20 20 20 20 20 20  TS5_TERM .      
f900: 20 20 7c 7c 20 70 52 69 67 68 74 2d 3e 65 54 79    || pRight->eTy
f910: 70 65 3d 3d 46 54 53 35 5f 45 4f 46 20 0a 20 20  pe==FTS5_EOF .  
f920: 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c    );..    if( pL
f930: 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  eft->eType==FTS5
f940: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50  _AND ){.      pP
f950: 72 65 76 20 3d 20 70 4c 65 66 74 2d 3e 61 70 43  rev = pLeft->apC
f960: 68 69 6c 64 5b 70 4c 65 66 74 2d 3e 6e 43 68 69  hild[pLeft->nChi
f970: 6c 64 2d 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  ld-1];.    }else
f980: 7b 0a 20 20 20 20 20 20 70 50 72 65 76 20 3d 20  {.      pPrev = 
f990: 70 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pLeft;.    }.   
f9a0: 20 61 73 73 65 72 74 28 20 70 50 72 65 76 2d 3e   assert( pPrev->
f9b0: 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49  eType==FTS5_STRI
f9c0: 4e 47 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 70  NG .        || p
f9d0: 50 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Prev->eType==FTS
f9e0: 35 5f 54 45 52 4d 20 0a 20 20 20 20 20 20 20 20  5_TERM .        
f9f0: 7c 7c 20 70 50 72 65 76 2d 3e 65 54 79 70 65 3d  || pPrev->eType=
fa00: 3d 46 54 53 35 5f 45 4f 46 20 0a 20 20 20 20 20  =FTS5_EOF .     
fa10: 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70     );..    if( p
fa20: 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46 54  Right->eType==FT
fa30: 53 35 5f 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  S5_EOF ){.      
fa40: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
fa50: 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65 2d  apPhrase[pParse-
fa60: 3e 6e 50 68 72 61 73 65 2d 31 5d 3d 3d 70 52 69  >nPhrase-1]==pRi
fa70: 67 68 74 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68  ght->pNear->apPh
fa80: 72 61 73 65 5b 30 5d 20 29 3b 0a 20 20 20 20 20  rase[0] );.     
fa90: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
faa0: 65 4e 6f 64 65 46 72 65 65 28 70 52 69 67 68 74  eNodeFree(pRight
fab0: 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
fac0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 50 61  pLeft;.      pPa
fad0: 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a  rse->nPhrase--;.
fae0: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
faf0: 66 28 20 70 50 72 65 76 2d 3e 65 54 79 70 65 3d  f( pPrev->eType=
fb00: 3d 46 54 53 35 5f 45 4f 46 20 29 7b 0a 20 20 20  =FTS5_EOF ){.   
fb10: 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
fb20: 65 20 2a 2a 61 70 3b 0a 0a 20 20 20 20 20 20 69  e **ap;..      i
fb30: 66 28 20 70 50 72 65 76 3d 3d 70 4c 65 66 74 20  f( pPrev==pLeft 
fb40: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20  ){.        pRet 
fb50: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
fb60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
fb70: 4c 65 66 74 2d 3e 61 70 43 68 69 6c 64 5b 70 4c  Left->apChild[pL
fb80: 65 66 74 2d 3e 6e 43 68 69 6c 64 2d 31 5d 20 3d  eft->nChild-1] =
fb90: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
fba0: 20 70 52 65 74 20 3d 20 70 4c 65 66 74 3b 0a 20   pRet = pLeft;. 
fbb0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 70       }..      ap
fbc0: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 70 50 68   = &pParse->apPh
fbd0: 72 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68  rase[pParse->nPh
fbe0: 72 61 73 65 2d 31 2d 70 52 69 67 68 74 2d 3e 70  rase-1-pRight->p
fbf0: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 5d 3b 0a  Near->nPhrase];.
fc00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
fc10: 5b 30 5d 3d 3d 70 50 72 65 76 2d 3e 70 4e 65 61  [0]==pPrev->pNea
fc20: 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 20 29  r->apPhrase[0] )
fc30: 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
fc40: 61 70 2c 20 26 61 70 5b 31 5d 2c 20 73 69 7a 65  ap, &ap[1], size
fc50: 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73  of(Fts5ExprPhras
fc60: 65 2a 29 2a 70 52 69 67 68 74 2d 3e 70 4e 65 61  e*)*pRight->pNea
fc70: 72 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20 20 20  r->nPhrase);.   
fc80: 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72 61     pParse->nPhra
fc90: 73 65 2d 2d 3b 0a 0a 20 20 20 20 20 20 73 71 6c  se--;..      sql
fca0: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64  ite3Fts5ParseNod
fcb0: 65 46 72 65 65 28 70 50 72 65 76 29 3b 0a 20 20  eFree(pPrev);.  
fcc0: 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
fcd0: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
fce0: 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28  e3Fts5ParseNode(
fcf0: 70 50 61 72 73 65 2c 20 46 54 53 35 5f 41 4e 44  pParse, FTS5_AND
fd00: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
fd10: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
fd20: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
fd30: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66  ..static char *f
fd40: 74 73 35 45 78 70 72 54 65 72 6d 50 72 69 6e 74  ts5ExprTermPrint
fd50: 28 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70  (Fts5ExprTerm *p
fd60: 54 65 72 6d 29 7b 0a 20 20 73 71 6c 69 74 65 33  Term){.  sqlite3
fd70: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 30  _int64 nByte = 0
fd80: 3b 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d  ;.  Fts5ExprTerm
fd90: 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75   *p;.  char *zQu
fda0: 6f 74 65 64 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  oted;..  /* Dete
fdb0: 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75  rmine the maximu
fdc0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  m amount of spac
fdd0: 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  e required. */. 
fde0: 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b   for(p=pTerm; p;
fdf0: 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b   p=p->pSynonym){
fe00: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 28 69  .    nByte += (i
fe10: 6e 74 29 73 74 72 6c 65 6e 28 70 54 65 72 6d 2d  nt)strlen(pTerm-
fe20: 3e 7a 54 65 72 6d 29 20 2a 20 32 20 2b 20 33 20  >zTerm) * 2 + 3 
fe30: 2b 20 32 3b 0a 20 20 7d 0a 20 20 7a 51 75 6f 74  + 2;.  }.  zQuot
fe40: 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
fe50: 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 0a 20  loc64(nByte);.. 
fe60: 20 69 66 28 20 7a 51 75 6f 74 65 64 20 29 7b 0a   if( zQuoted ){.
fe70: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
fe80: 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20     for(p=pTerm; 
fe90: 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d  p; p=p->pSynonym
fea0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
feb0: 49 6e 20 3d 20 70 2d 3e 7a 54 65 72 6d 3b 0a 20  In = p->zTerm;. 
fec0: 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b       zQuoted[i++
fed0: 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 77  ] = '"';.      w
fee0: 68 69 6c 65 28 20 2a 7a 49 6e 20 29 7b 0a 20 20  hile( *zIn ){.  
fef0: 20 20 20 20 20 20 69 66 28 20 2a 7a 49 6e 3d 3d        if( *zIn==
ff00: 27 22 27 20 29 20 7a 51 75 6f 74 65 64 5b 69 2b  '"' ) zQuoted[i+
ff10: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20  +] = '"';.      
ff20: 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d    zQuoted[i++] =
ff30: 20 2a 7a 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d   *zIn++;.      }
ff40: 0a 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69  .      zQuoted[i
ff50: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20  ++] = '"';.     
ff60: 20 69 66 28 20 70 2d 3e 70 53 79 6e 6f 6e 79 6d   if( p->pSynonym
ff70: 20 29 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20   ) zQuoted[i++] 
ff80: 3d 20 27 7c 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '|';.    }.   
ff90: 20 69 66 28 20 70 54 65 72 6d 2d 3e 62 50 72 65   if( pTerm->bPre
ffa0: 66 69 78 20 29 7b 0a 20 20 20 20 20 20 7a 51 75  fix ){.      zQu
ffb0: 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 20 27 3b  oted[i++] = ' ';
ffc0: 0a 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69  .      zQuoted[i
ffd0: 2b 2b 5d 20 3d 20 27 2a 27 3b 0a 20 20 20 20 7d  ++] = '*';.    }
ffe0: 0a 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b  .    zQuoted[i++
fff0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
10000 72 65 74 75 72 6e 20 7a 51 75 6f 74 65 64 3b 0a  return zQuoted;.
10010 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
10020 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64  fts5PrintfAppend
10030 28 63 68 61 72 20 2a 7a 41 70 70 2c 20 63 6f 6e  (char *zApp, con
10040 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
10050 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65  ..){.  char *zNe
10060 77 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  w;.  va_list ap;
10070 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
10080 7a 46 6d 74 29 3b 0a 20 20 7a 4e 65 77 20 3d 20  zFmt);.  zNew = 
10090 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
100a0 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61  (zFmt, ap);.  va
100b0 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
100c0 7a 41 70 70 20 26 26 20 7a 4e 65 77 20 29 7b 0a  zApp && zNew ){.
100d0 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 32 20      char *zNew2 
100e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
100f0 66 28 22 25 73 25 73 22 2c 20 7a 41 70 70 2c 20  f("%s%s", zApp, 
10100 7a 4e 65 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  zNew);.    sqlit
10110 65 33 5f 66 72 65 65 28 7a 4e 65 77 29 3b 0a 20  e3_free(zNew);. 
10120 20 20 20 7a 4e 65 77 20 3d 20 7a 4e 65 77 32 3b     zNew = zNew2;
10130 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
10140 72 65 65 28 7a 41 70 70 29 3b 0a 20 20 72 65 74  ree(zApp);.  ret
10150 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn zNew;.}../*.
10160 2a 2a 20 43 6f 6d 70 6f 73 65 20 61 20 74 63 6c  ** Compose a tcl
10170 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73  -readable repres
10180 65 6e 74 61 74 69 6f 6e 20 6f 66 20 65 78 70 72  entation of expr
10190 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 52 65  ession pExpr. Re
101a0 74 75 72 6e 20 61 20 0a 2a 2a 20 70 6f 69 6e 74  turn a .** point
101b0 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
101c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 61 74 20 72  ontaining that r
101d0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 49  epresentation. I
101e0 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
101f0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
10200 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 74 20  he caller to at 
10210 73 6f 6d 65 20 70 6f 69 6e 74 20 66 72 65 65 20  some point free 
10220 74 68 65 20 62 75 66 66 65 72 20 75 73 69 6e 67  the buffer using
10230 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65   .** sqlite3_fre
10240 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
10250 68 61 72 20 2a 66 74 73 35 45 78 70 72 50 72 69  har *fts5ExprPri
10260 6e 74 54 63 6c 28 0a 20 20 46 74 73 35 43 6f 6e  ntTcl(.  Fts5Con
10270 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20  fig *pConfig, . 
10280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
10290 61 72 73 65 74 43 6d 64 2c 0a 20 20 46 74 73 35  arsetCmd,.  Fts5
102a0 45 78 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 0a  ExprNode *pExpr.
102b0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  ){.  char *zRet 
102c0 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  = 0;.  if( pExpr
102d0 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54  ->eType==FTS5_ST
102e0 52 49 4e 47 20 7c 7c 20 70 45 78 70 72 2d 3e 65  RING || pExpr->e
102f0 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20  Type==FTS5_TERM 
10300 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e  ){.    Fts5ExprN
10310 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20  earset *pNear = 
10320 70 45 78 70 72 2d 3e 70 4e 65 61 72 3b 0a 20 20  pExpr->pNear;.  
10330 20 20 69 6e 74 20 69 3b 20 0a 20 20 20 20 69 6e    int i; .    in
10340 74 20 69 54 65 72 6d 3b 0a 0a 20 20 20 20 7a 52  t iTerm;..    zR
10350 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
10360 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 25 73 20  ppend(zRet, "%s 
10370 22 2c 20 7a 4e 65 61 72 73 65 74 43 6d 64 29 3b  ", zNearsetCmd);
10380 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
10390 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
103a0 20 69 66 28 20 70 4e 65 61 72 2d 3e 70 43 6f 6c   if( pNear->pCol
103b0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  set ){.      int
103c0 20 2a 61 69 43 6f 6c 20 3d 20 70 4e 65 61 72 2d   *aiCol = pNear-
103d0 3e 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b  >pColset->aiCol;
103e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  .      int nCol 
103f0 3d 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  = pNear->pColset
10400 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66  ->nCol;.      if
10410 28 20 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20  ( nCol==1 ){.   
10420 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35       zRet = fts5
10430 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65  PrintfAppend(zRe
10440 74 2c 20 22 2d 63 6f 6c 20 25 64 20 22 2c 20 61  t, "-col %d ", a
10450 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20  iCol[0]);.      
10460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
10470 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66  Ret = fts5Printf
10480 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2d 63  Append(zRet, "-c
10490 6f 6c 20 7b 25 64 22 2c 20 61 69 43 6f 6c 5b 30  ol {%d", aiCol[0
104a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ]);.        for(
104b0 69 3d 31 3b 20 69 3c 70 4e 65 61 72 2d 3e 70 43  i=1; i<pNear->pC
104c0 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  olset->nCol; i++
104d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  ){.          zRe
104e0 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70  t = fts5PrintfAp
104f0 70 65 6e 64 28 7a 52 65 74 2c 20 22 20 25 64 22  pend(zRet, " %d"
10500 2c 20 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , aiCol[i]);.   
10510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
10520 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66  Ret = fts5Printf
10530 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 7d 20  Append(zRet, "} 
10540 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
10550 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20    if( zRet==0 ) 
10560 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
10570 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d 3e  .    if( pNear->
10580 6e 50 68 72 61 73 65 3e 31 20 29 7b 0a 20 20 20  nPhrase>1 ){.   
10590 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72     zRet = fts5Pr
105a0 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c  intfAppend(zRet,
105b0 20 22 2d 6e 65 61 72 20 25 64 20 22 2c 20 70 4e   "-near %d ", pN
105c0 65 61 72 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20 20  ear->nNear);.   
105d0 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29     if( zRet==0 )
105e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
105f0 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73  ..    zRet = fts
10600 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
10610 65 74 2c 20 22 2d 2d 22 29 3b 0a 20 20 20 20 69  et, "--");.    i
10620 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65 74  f( zRet==0 ) ret
10630 75 72 6e 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28  urn 0;..    for(
10640 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
10650 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  hrase; i++){.   
10660 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
10670 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65  e *pPhrase = pNe
10680 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b  ar->apPhrase[i];
10690 0a 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66  ..      zRet = f
106a0 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
106b0 7a 52 65 74 2c 20 22 20 7b 22 29 3b 0a 20 20 20  zRet, " {");.   
106c0 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20     for(iTerm=0; 
106d0 7a 52 65 74 20 26 26 20 69 54 65 72 6d 3c 70 50  zRet && iTerm<pP
106e0 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 54  hrase->nTerm; iT
106f0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
10700 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70 50  char *zTerm = pP
10710 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54 65  hrase->aTerm[iTe
10720 72 6d 5d 2e 7a 54 65 72 6d 3b 0a 20 20 20 20 20  rm].zTerm;.     
10730 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72     zRet = fts5Pr
10740 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c  intfAppend(zRet,
10750 20 22 25 73 25 73 22 2c 20 69 54 65 72 6d 3d 3d   "%s%s", iTerm==
10760 30 3f 22 22 3a 22 20 22 2c 20 7a 54 65 72 6d 29  0?"":" ", zTerm)
10770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
10780 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54 65  hrase->aTerm[iTe
10790 72 6d 5d 2e 62 50 72 65 66 69 78 20 29 7b 0a 20  rm].bPrefix ){. 
107a0 20 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20           zRet = 
107b0 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64  fts5PrintfAppend
107c0 28 7a 52 65 74 2c 20 22 2a 22 29 3b 0a 20 20 20  (zRet, "*");.   
107d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
107e0 20 20 20 20 20 20 69 66 28 20 7a 52 65 74 20 29        if( zRet )
107f0 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e   zRet = fts5Prin
10800 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22  tfAppend(zRet, "
10810 7d 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  }");.      if( z
10820 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ret==0 ) return 
10830 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  0;.    }..  }els
10840 65 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  e{.    char cons
10850 74 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 20 20  t *zOp = 0;.    
10860 69 6e 74 20 69 3b 0a 20 20 20 20 73 77 69 74 63  int i;.    switc
10870 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 20  h( pExpr->eType 
10880 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 46 54  ){.      case FT
10890 53 35 5f 41 4e 44 3a 20 7a 4f 70 20 3d 20 22 41  S5_AND: zOp = "A
108a0 4e 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ND"; break;.    
108b0 20 20 63 61 73 65 20 46 54 53 35 5f 4e 4f 54 3a    case FTS5_NOT:
108c0 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 62 72   zOp = "NOT"; br
108d0 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
108e0 6c 74 3a 20 0a 20 20 20 20 20 20 20 20 61 73 73  lt: .        ass
108f0 65 72 74 28 20 70 45 78 70 72 2d 3e 65 54 79 70  ert( pExpr->eTyp
10900 65 3d 3d 46 54 53 35 5f 4f 52 20 29 3b 0a 20 20  e==FTS5_OR );.  
10910 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22        zOp = "OR"
10920 3b 20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ; .        break
10930 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65  ;.    }..    zRe
10940 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
10950 6e 74 66 28 22 25 73 22 2c 20 7a 4f 70 29 3b 0a  ntf("%s", zOp);.
10960 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 52 65      for(i=0; zRe
10970 74 20 26 26 20 69 3c 70 45 78 70 72 2d 3e 6e 43  t && i<pExpr->nC
10980 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  hild; i++){.    
10990 20 20 63 68 61 72 20 2a 7a 20 3d 20 66 74 73 35    char *z = fts5
109a0 45 78 70 72 50 72 69 6e 74 54 63 6c 28 70 43 6f  ExprPrintTcl(pCo
109b0 6e 66 69 67 2c 20 7a 4e 65 61 72 73 65 74 43 6d  nfig, zNearsetCm
109c0 64 2c 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c  d, pExpr->apChil
109d0 64 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  d[i]);.      if(
109e0 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 73   !z ){.        s
109f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 74  qlite3_free(zRet
10a00 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20  );.        zRet 
10a10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
10a20 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d  {.        zRet =
10a30 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e   fts5PrintfAppen
10a40 64 28 7a 52 65 74 2c 20 22 20 5b 25 7a 5d 22 2c  d(zRet, " [%z]",
10a50 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   z);.      }.   
10a60 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
10a70 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63   zRet;.}..static
10a80 20 63 68 61 72 20 2a 66 74 73 35 45 78 70 72 50   char *fts5ExprP
10a90 72 69 6e 74 28 46 74 73 35 43 6f 6e 66 69 67 20  rint(Fts5Config 
10aa0 2a 70 43 6f 6e 66 69 67 2c 20 46 74 73 35 45 78  *pConfig, Fts5Ex
10ab0 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 29 7b 0a  prNode *pExpr){.
10ac0 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30    char *zRet = 0
10ad0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65  ;.  if( pExpr->e
10ae0 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Type==0 ){.    r
10af0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70  eturn sqlite3_mp
10b00 72 69 6e 74 66 28 22 5c 22 5c 22 22 29 3b 0a 20  rintf("\"\"");. 
10b10 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 45 78   }else.  if( pEx
10b20 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  pr->eType==FTS5_
10b30 53 54 52 49 4e 47 20 7c 7c 20 70 45 78 70 72 2d  STRING || pExpr-
10b40 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
10b50 4d 20 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70  M ){.    Fts5Exp
10b60 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
10b70 3d 20 70 45 78 70 72 2d 3e 70 4e 65 61 72 3b 0a  = pExpr->pNear;.
10b80 20 20 20 20 69 6e 74 20 69 3b 20 0a 20 20 20 20      int i; .    
10b90 69 6e 74 20 69 54 65 72 6d 3b 0a 0a 20 20 20 20  int iTerm;..    
10ba0 69 66 28 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73  if( pNear->pCols
10bb0 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
10bc0 69 43 6f 6c 20 3d 20 70 4e 65 61 72 2d 3e 70 43  iCol = pNear->pC
10bd0 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 3b  olset->aiCol[0];
10be0 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74  .      zRet = ft
10bf0 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a  s5PrintfAppend(z
10c00 52 65 74 2c 20 22 25 73 20 3a 20 22 2c 20 70 43  Ret, "%s : ", pC
10c10 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 43 6f  onfig->azCol[iCo
10c20 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  l]);.      if( z
10c30 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ret==0 ) return 
10c40 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
10c50 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  ( pNear->nPhrase
10c60 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74  >1 ){.      zRet
10c70 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
10c80 65 6e 64 28 7a 52 65 74 2c 20 22 4e 45 41 52 28  end(zRet, "NEAR(
10c90 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ");.      if( zR
10ca0 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  et==0 ) return 0
10cb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
10cc0 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e  (i=0; i<pNear->n
10cd0 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20  Phrase; i++){.  
10ce0 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
10cf0 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e  se *pPhrase = pN
10d00 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d  ear->apPhrase[i]
10d10 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 30  ;.      if( i!=0
10d20 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
10d30 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
10d40 65 6e 64 28 7a 52 65 74 2c 20 22 20 22 29 3b 0a  end(zRet, " ");.
10d50 20 20 20 20 20 20 20 20 69 66 28 20 7a 52 65 74          if( zRet
10d60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
10d80 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
10d90 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b  <pPhrase->nTerm;
10da0 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   iTerm++){.     
10db0 20 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d     char *zTerm =
10dc0 20 66 74 73 35 45 78 70 72 54 65 72 6d 50 72 69   fts5ExprTermPri
10dd0 6e 74 28 26 70 50 68 72 61 73 65 2d 3e 61 54 65  nt(&pPhrase->aTe
10de0 72 6d 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20  rm[iTerm]);.    
10df0 20 20 20 20 69 66 28 20 7a 54 65 72 6d 20 29 7b      if( zTerm ){
10e00 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 74 20  .          zRet 
10e10 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65  = fts5PrintfAppe
10e20 6e 64 28 7a 52 65 74 2c 20 22 25 73 25 73 22 2c  nd(zRet, "%s%s",
10e30 20 69 54 65 72 6d 3d 3d 30 3f 22 22 3a 22 20 2b   iTerm==0?"":" +
10e40 20 22 2c 20 7a 54 65 72 6d 29 3b 0a 20 20 20 20   ", zTerm);.    
10e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10e60 65 65 28 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  ee(zTerm);.     
10e70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10e80 20 7a 54 65 72 6d 3d 3d 30 20 7c 7c 20 7a 52 65   zTerm==0 || zRe
10e90 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
10ea0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10eb0 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ret);.          
10ec0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
10ed0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10ee0 7d 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72  }..    if( pNear
10ef0 2d 3e 6e 50 68 72 61 73 65 3e 31 20 29 7b 0a 20  ->nPhrase>1 ){. 
10f00 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35       zRet = fts5
10f10 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65  PrintfAppend(zRe
10f20 74 2c 20 22 2c 20 25 64 29 22 2c 20 70 4e 65 61  t, ", %d)", pNea
10f30 72 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20 20 20 20  r->nNear);.     
10f40 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72   if( zRet==0 ) r
10f50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
10f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
10f70 72 20 63 6f 6e 73 74 20 2a 7a 4f 70 20 3d 20 30  r const *zOp = 0
10f80 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ;.    int i;..  
10f90 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
10fa0 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  >eType ){.      
10fb0 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a 20 7a  case FTS5_AND: z
10fc0 4f 70 20 3d 20 22 20 41 4e 44 20 22 3b 20 62 72  Op = " AND "; br
10fd0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
10fe0 46 54 53 35 5f 4e 4f 54 3a 20 7a 4f 70 20 3d 20  FTS5_NOT: zOp = 
10ff0 22 20 4e 4f 54 20 22 3b 20 62 72 65 61 6b 3b 0a  " NOT "; break;.
11000 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
11010 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11020 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46   pExpr->eType==F
11030 54 53 35 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  TS5_OR );.      
11040 20 20 7a 4f 70 20 3d 20 22 20 4f 52 20 22 3b 20    zOp = " OR "; 
11050 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
11060 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
11070 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 6e 43 68  =0; i<pExpr->nCh
11080 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ild; i++){.     
11090 20 63 68 61 72 20 2a 7a 20 3d 20 66 74 73 35 45   char *z = fts5E
110a0 78 70 72 50 72 69 6e 74 28 70 43 6f 6e 66 69 67  xprPrint(pConfig
110b0 2c 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c 64  , pExpr->apChild
110c0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
110d0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
110e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65  sqlite3_free(zRe
110f0 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  t);.        zRet
11100 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
11110 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  e{.        int e
11120 20 3d 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c   = pExpr->apChil
11130 64 5b 69 5d 2d 3e 65 54 79 70 65 3b 0a 20 20 20  d[i]->eType;.   
11140 20 20 20 20 20 69 6e 74 20 62 20 3d 20 28 65 21       int b = (e!
11150 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 26 26 20  =FTS5_STRING && 
11160 65 21 3d 46 54 53 35 5f 54 45 52 4d 20 26 26 20  e!=FTS5_TERM && 
11170 65 21 3d 46 54 53 35 5f 45 4f 46 29 3b 0a 20 20  e!=FTS5_EOF);.  
11180 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
11190 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
111a0 65 74 2c 20 22 25 73 25 73 25 7a 25 73 22 2c 20  et, "%s%s%z%s", 
111b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 69 3d  .            (i=
111c0 3d 30 20 3f 20 22 22 20 3a 20 7a 4f 70 29 2c 0a  =0 ? "" : zOp),.
111d0 20 20 20 20 20 20 20 20 20 20 20 20 28 62 3f 22              (b?"
111e0 28 22 3a 22 22 29 2c 20 7a 2c 20 28 62 3f 22 29  (":""), z, (b?")
111f0 22 3a 22 22 29 0a 20 20 20 20 20 20 20 20 29 3b  ":"").        );
11200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11210 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 62 72 65  f( zRet==0 ) bre
11220 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11230 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
11240 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
11250 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65  mentation of use
11260 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
11270 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 35 5f   functions fts5_
11280 65 78 70 72 28 29 20 28 62 54 63 6c 3d 3d 30 29  expr() (bTcl==0)
11290 0a 2a 2a 20 61 6e 64 20 66 74 73 35 5f 65 78 70  .** and fts5_exp
112a0 72 5f 74 63 6c 28 29 20 28 62 54 63 6c 21 3d 30  r_tcl() (bTcl!=0
112b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
112c0 64 20 66 74 73 35 45 78 70 72 46 75 6e 63 74 69  d fts5ExprFuncti
112d0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
112e0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
112f0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
11300 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
11310 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11340 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74   args */.  sqlit
11350 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
11360 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
11370 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
11380 20 2a 2f 0a 20 20 69 6e 74 20 62 54 63 6c 0a 29   */.  int bTcl.)
11390 7b 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a  {.  Fts5Global *
113a0 70 47 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35 47  pGlobal = (Fts5G
113b0 6c 6f 62 61 6c 2a 29 73 71 6c 69 74 65 33 5f 75  lobal*)sqlite3_u
113c0 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
113d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
113e0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
113f0 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b  db_handle(pCtx);
11400 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11410 45 78 70 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  Expr = 0;.  char
11420 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 46 74   *zErr = 0;.  Ft
11430 73 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20  s5Expr *pExpr = 
11440 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  0;.  int rc;.  i
11450 6e 74 20 69 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  nt i;..  const c
11460 68 61 72 20 2a 2a 61 7a 43 6f 6e 66 69 67 3b 20  har **azConfig; 
11470 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
11480 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66  y of arguments f
11490 6f 72 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 2f  or Fts5Config */
114a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
114b0 4e 65 61 72 73 65 74 43 6d 64 20 3d 20 22 6e 65  NearsetCmd = "ne
114c0 61 72 73 65 74 22 3b 0a 20 20 69 6e 74 20 6e 43  arset";.  int nC
114d0 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20  onfig;          
114e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
114f0 65 20 6f 66 20 61 7a 43 6f 6e 66 69 67 5b 5d 20  e of azConfig[] 
11500 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
11510 2a 70 43 6f 6e 66 69 67 20 3d 20 30 3b 0a 20 20  *pConfig = 0;.  
11520 69 6e 74 20 69 41 72 67 20 3d 20 31 3b 0a 0a 20  int iArg = 1;.. 
11530 20 69 66 28 20 6e 41 72 67 3c 31 20 29 7b 0a 20   if( nArg<1 ){. 
11540 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65     zErr = sqlite
11550 33 5f 6d 70 72 69 6e 74 66 28 22 77 72 6f 6e 67  3_mprintf("wrong
11560 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
11570 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
11580 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 62 54   %s",.        bT
11590 63 6c 20 3f 20 22 66 74 73 35 5f 65 78 70 72 5f  cl ? "fts5_expr_
115a0 74 63 6c 22 20 3a 20 22 66 74 73 35 5f 65 78 70  tcl" : "fts5_exp
115b0 72 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  r".    );.    sq
115c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
115d0 6f 72 28 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d  or(pCtx, zErr, -
115e0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
115f0 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
11600 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
11610 66 28 20 62 54 63 6c 20 26 26 20 6e 41 72 67 3e  f( bTcl && nArg>
11620 31 20 29 7b 0a 20 20 20 20 7a 4e 65 61 72 73 65  1 ){.    zNearse
11630 74 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  tCmd = (const ch
11640 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
11650 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
11660 3b 0a 20 20 20 20 69 41 72 67 20 3d 20 32 3b 0a  ;.    iArg = 2;.
11670 20 20 7d 0a 0a 20 20 6e 43 6f 6e 66 69 67 20 3d    }..  nConfig =
11680 20 33 20 2b 20 28 6e 41 72 67 2d 69 41 72 67 29   3 + (nArg-iArg)
11690 3b 0a 20 20 61 7a 43 6f 6e 66 69 67 20 3d 20 28  ;.  azConfig = (
116a0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 73 71 6c  const char**)sql
116b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
116c0 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 43  zeof(char*) * nC
116d0 6f 6e 66 69 67 29 3b 0a 20 20 69 66 28 20 61 7a  onfig);.  if( az
116e0 43 6f 6e 66 69 67 3d 3d 30 20 29 7b 0a 20 20 20  Config==0 ){.   
116f0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11700 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78  error_nomem(pCtx
11710 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
11720 20 7d 0a 20 20 61 7a 43 6f 6e 66 69 67 5b 30 5d   }.  azConfig[0]
11730 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6e 66 69 67   = 0;.  azConfig
11740 5b 31 5d 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  [1] = "main";.  
11750 61 7a 43 6f 6e 66 69 67 5b 32 5d 20 3d 20 22 74  azConfig[2] = "t
11760 62 6c 22 3b 0a 20 20 66 6f 72 28 69 3d 33 3b 20  bl";.  for(i=3; 
11770 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b  iArg<nArg; iArg+
11780 2b 29 7b 0a 20 20 20 20 61 7a 43 6f 6e 66 69 67  +){.    azConfig
11790 5b 69 2b 2b 5d 20 3d 20 28 63 6f 6e 73 74 20 63  [i++] = (const c
117a0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
117b0 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69 41  ue_text(apVal[iA
117c0 72 67 5d 29 3b 0a 20 20 7d 0a 0a 20 20 7a 45 78  rg]);.  }..  zEx
117d0 70 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  pr = (const char
117e0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
117f0 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
11800 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
11810 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28 70  ts5ConfigParse(p
11820 47 6c 6f 62 61 6c 2c 20 64 62 2c 20 6e 43 6f 6e  Global, db, nCon
11830 66 69 67 2c 20 61 7a 43 6f 6e 66 69 67 2c 20 26  fig, azConfig, &
11840 70 43 6f 6e 66 69 67 2c 20 26 7a 45 72 72 29 3b  pConfig, &zErr);
11850 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
11870 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
11880 4e 65 77 28 70 43 6f 6e 66 69 67 2c 20 70 43 6f  New(pConfig, pCo
11890 6e 66 69 67 2d 3e 6e 43 6f 6c 2c 20 7a 45 78 70  nfig->nCol, zExp
118a0 72 2c 20 26 70 45 78 70 72 2c 20 26 7a 45 72 72  r, &pExpr, &zErr
118b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
118c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
118d0 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20    char *zText;. 
118e0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
118f0 6f 6f 74 2d 3e 78 4e 65 78 74 3d 3d 30 20 29 7b  oot->xNext==0 ){
11900 0a 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 73  .      zText = s
11910 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
11920 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
11930 28 20 62 54 63 6c 20 29 7b 0a 20 20 20 20 20 20  ( bTcl ){.      
11940 7a 54 65 78 74 20 3d 20 66 74 73 35 45 78 70 72  zText = fts5Expr
11950 50 72 69 6e 74 54 63 6c 28 70 43 6f 6e 66 69 67  PrintTcl(pConfig
11960 2c 20 7a 4e 65 61 72 73 65 74 43 6d 64 2c 20 70  , zNearsetCmd, p
11970 45 78 70 72 2d 3e 70 52 6f 6f 74 29 3b 0a 20 20  Expr->pRoot);.  
11980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
11990 54 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 50  Text = fts5ExprP
119a0 72 69 6e 74 28 70 43 6f 6e 66 69 67 2c 20 70 45  rint(pConfig, pE
119b0 78 70 72 2d 3e 70 52 6f 6f 74 29 3b 0a 20 20 20  xpr->pRoot);.   
119c0 20 7d 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74   }.    if( zText
119d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
119e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
119f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11a00 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11a10 74 65 78 74 28 70 43 74 78 2c 20 7a 54 65 78 74  text(pCtx, zText
11a20 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
11a30 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73  NSIENT);.      s
11a40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78  qlite3_free(zTex
11a50 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
11a60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11a70 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 45  OK ){.    if( zE
11a80 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
11a90 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
11aa0 28 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29  (pCtx, zErr, -1)
11ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11ac0 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
11ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
11ae0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
11af0 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29  r_code(pCtx, rc)
11b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11b10 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64  lite3_free((void
11b20 20 2a 29 61 7a 43 6f 6e 66 69 67 29 3b 0a 20 20   *)azConfig);.  
11b30 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
11b40 67 46 72 65 65 28 70 43 6f 6e 66 69 67 29 3b 0a  gFree(pConfig);.
11b50 20 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70    sqlite3Fts5Exp
11b60 72 46 72 65 65 28 70 45 78 70 72 29 3b 0a 7d 0a  rFree(pExpr);.}.
11b70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
11b80 35 45 78 70 72 46 75 6e 63 74 69 6f 6e 48 72 28  5ExprFunctionHr(
11b90 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
11ba0 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
11bb0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
11bc0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
11bd0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
11c00 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
11c10 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
11c20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
11c30 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
11c40 0a 29 7b 0a 20 20 66 74 73 35 45 78 70 72 46 75  .){.  fts5ExprFu
11c50 6e 63 74 69 6f 6e 28 70 43 74 78 2c 20 6e 41 72  nction(pCtx, nAr
11c60 67 2c 20 61 70 56 61 6c 2c 20 30 29 3b 0a 7d 0a  g, apVal, 0);.}.
11c70 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11c80 45 78 70 72 46 75 6e 63 74 69 6f 6e 54 63 6c 28  ExprFunctionTcl(
11c90 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
11ca0 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
11cb0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
11cc0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
11cd0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
11d00 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
11d10 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
11d20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
11d30 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
11d40 0a 29 7b 0a 20 20 66 74 73 35 45 78 70 72 46 75  .){.  fts5ExprFu
11d50 6e 63 74 69 6f 6e 28 70 43 74 78 2c 20 6e 41 72  nction(pCtx, nAr
11d60 67 2c 20 61 70 56 61 6c 2c 20 31 29 3b 0a 7d 0a  g, apVal, 1);.}.
11d70 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
11d80 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20  mentation of an 
11d90 53 51 4c 69 74 65 20 75 73 65 72 2d 64 65 66 69  SQLite user-defi
11da0 6e 65 64 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61  ned-function tha
11db0 74 20 61 63 63 65 70 74 73 20 61 0a 2a 2a 20 73  t accepts a.** s
11dc0 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61 73  ingle integer as
11dd0 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
11de0 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20   the integer is 
11df0 61 6e 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63  an alpha-numeric
11e00 20 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 6f 64   .** unicode cod
11e10 65 20 70 6f 69 6e 74 2c 20 31 20 69 73 20 72 65  e point, 1 is re
11e20 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11e30 65 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e 0..*/.static v
11e40 6f 69 64 20 66 74 73 35 45 78 70 72 49 73 41 6c  oid fts5ExprIsAl
11e50 6e 75 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  num(.  sqlite3_c
11e60 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
11e70 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
11e80 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
11e90 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11ec0 66 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69  f args */.  sqli
11ed0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
11ee0 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  l           /* F
11ef0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
11f00 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43  s */.){.  int iC
11f10 6f 64 65 3b 0a 20 20 75 38 20 61 41 72 72 5b 33  ode;.  u8 aArr[3
11f20 32 5d 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  2];.  if( nArg!=
11f30 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
11f40 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
11f50 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 77 72  tx, .        "wr
11f60 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
11f70 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
11f80 69 6f 6e 20 66 74 73 35 5f 69 73 61 6c 6e 75 6d  ion fts5_isalnum
11f90 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20  ", -1.    );.   
11fa0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d   return;.  }.  m
11fb0 65 6d 73 65 74 28 61 41 72 72 2c 20 30 2c 20 73  emset(aArr, 0, s
11fc0 69 7a 65 6f 66 28 61 41 72 72 29 29 3b 0a 20 20  izeof(aArr));.  
11fd0 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f  sqlite3Fts5Unico
11fe0 64 65 43 61 74 50 61 72 73 65 28 22 4c 2a 22 2c  deCatParse("L*",
11ff0 20 61 41 72 72 29 3b 0a 20 20 73 71 6c 69 74 65   aArr);.  sqlite
12000 33 46 74 73 35 55 6e 69 63 6f 64 65 43 61 74 50  3Fts5UnicodeCatP
12010 61 72 73 65 28 22 4e 2a 22 2c 20 61 41 72 72 29  arse("N*", aArr)
12020 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 55  ;.  sqlite3Fts5U
12030 6e 69 63 6f 64 65 43 61 74 50 61 72 73 65 28 22  nicodeCatParse("
12040 43 6f 22 2c 20 61 41 72 72 29 3b 0a 20 20 69 43  Co", aArr);.  iC
12050 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ode = sqlite3_va
12060 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d  lue_int(apVal[0]
12070 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
12080 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 61 41  ult_int(pCtx, aA
12090 72 72 5b 73 71 6c 69 74 65 33 46 74 73 35 55 6e  rr[sqlite3Fts5Un
120a0 69 63 6f 64 65 43 61 74 65 67 6f 72 79 28 28 75  icodeCategory((u
120b0 33 32 29 69 43 6f 64 65 29 5d 29 3b 0a 7d 0a 0a  32)iCode)]);.}..
120c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
120d0 45 78 70 72 46 6f 6c 64 28 0a 20 20 73 71 6c 69  ExprFold(.  sqli
120e0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
120f0 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
12100 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
12110 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
12120 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
12130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12140 62 65 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20  ber of args */. 
12150 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
12160 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
12170 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
12180 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
12190 66 28 20 6e 41 72 67 21 3d 31 20 26 26 20 6e 41  f( nArg!=1 && nA
121a0 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c  rg!=2 ){.    sql
121b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
121c0 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
121d0 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
121e0 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
121f0 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 66 6f 6c  unction fts5_fol
12200 64 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20  d", -1.    );.  
12210 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
12220 43 6f 64 65 3b 0a 20 20 20 20 69 6e 74 20 62 52  Code;.    int bR
12230 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 73 20  emoveDiacritics 
12240 3d 20 30 3b 0a 20 20 20 20 69 43 6f 64 65 20 3d  = 0;.    iCode =
12250 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
12260 6e 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  nt(apVal[0]);.  
12270 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 20    if( nArg==2 ) 
12280 62 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63  bRemoveDiacritic
12290 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
122a0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b  e_int(apVal[1]);
122b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
122c0 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 73 71  ult_int(pCtx, sq
122d0 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
122e0 46 6f 6c 64 28 69 43 6f 64 65 2c 20 62 52 65 6d  Fold(iCode, bRem
122f0 6f 76 65 44 69 61 63 72 69 74 69 63 73 29 29 3b  oveDiacritics));
12300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
12310 69 73 20 69 73 20 63 61 6c 6c 65 64 20 64 75 72  is is called dur
12320 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ing initializati
12330 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20 74  on to register t
12340 68 65 20 66 74 73 35 5f 65 78 70 72 28 29 20 73  he fts5_expr() s
12350 63 61 6c 61 72 0a 2a 2a 20 55 44 46 20 77 69 74  calar.** UDF wit
12360 68 20 74 68 65 20 53 51 4c 69 74 65 20 68 61 6e  h the SQLite han
12370 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
12380 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
12390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
123a0 74 73 35 45 78 70 72 49 6e 69 74 28 46 74 73 35  ts5ExprInit(Fts5
123b0 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c  Global *pGlobal,
123c0 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20   sqlite3 *db){. 
123d0 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72   struct Fts5Expr
123e0 46 75 6e 63 20 7b 0a 20 20 20 20 63 6f 6e 73 74  Func {.    const
123f0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 6f   char *z;.    vo
12400 69 64 20 28 2a 78 29 28 73 71 6c 69 74 65 33 5f  id (*x)(sqlite3_
12410 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
12420 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20  ite3_value**);. 
12430 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20   } aFunc[] = {. 
12440 20 20 20 7b 20 22 66 74 73 35 5f 65 78 70 72 22     { "fts5_expr"
12450 2c 20 20 20 20 20 66 74 73 35 45 78 70 72 46 75  ,     fts5ExprFu
12460 6e 63 74 69 6f 6e 48 72 20 7d 2c 0a 20 20 20 20  nctionHr },.    
12470 7b 20 22 66 74 73 35 5f 65 78 70 72 5f 74 63 6c  { "fts5_expr_tcl
12480 22 2c 20 66 74 73 35 45 78 70 72 46 75 6e 63 74  ", fts5ExprFunct
12490 69 6f 6e 54 63 6c 20 7d 2c 0a 20 20 20 20 7b 20  ionTcl },.    { 
124a0 22 66 74 73 35 5f 69 73 61 6c 6e 75 6d 22 2c 20  "fts5_isalnum", 
124b0 20 66 74 73 35 45 78 70 72 49 73 41 6c 6e 75 6d   fts5ExprIsAlnum
124c0 20 7d 2c 0a 20 20 20 20 7b 20 22 66 74 73 35 5f   },.    { "fts5_
124d0 66 6f 6c 64 22 2c 20 20 20 20 20 66 74 73 35 45  fold",     fts5E
124e0 78 70 72 46 6f 6c 64 20 7d 2c 0a 20 20 7d 3b 0a  xprFold },.  };.
124f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
12500 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12510 20 76 6f 69 64 20 2a 70 43 74 78 20 3d 20 28 76   void *pCtx = (v
12520 6f 69 64 2a 29 70 47 6c 6f 62 61 6c 3b 0a 0a 20  oid*)pGlobal;.. 
12530 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
12540 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 41 72 72  LITE_OK && i<Arr
12550 61 79 53 69 7a 65 28 61 46 75 6e 63 29 3b 20 69  aySize(aFunc); i
12560 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
12570 46 74 73 35 45 78 70 72 46 75 6e 63 20 2a 70 20  Fts5ExprFunc *p 
12580 3d 20 26 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  = &aFunc[i];.   
12590 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
125a0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
125b0 2c 20 70 2d 3e 7a 2c 20 2d 31 2c 20 53 51 4c 49  , p->z, -1, SQLI
125c0 54 45 5f 55 54 46 38 2c 20 70 43 74 78 2c 20 70  TE_UTF8, pCtx, p
125d0 2d 3e 78 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ->x, 0, 0);.  }.
125e0 0a 20 20 2f 2a 20 41 76 6f 69 64 20 77 61 72 6e  .  /* Avoid warn
125f0 69 6e 67 73 20 69 6e 64 69 63 61 74 69 6e 67 20  ings indicating 
12600 74 68 61 74 20 73 71 6c 69 74 65 33 46 74 73 35  that sqlite3Fts5
12610 50 61 72 73 65 72 54 72 61 63 65 28 29 20 61 6e  ParserTrace() an
12620 64 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 74  d.  ** sqlite3Ft
12630 73 35 50 61 72 73 65 72 46 61 6c 6c 62 61 63 6b  s5ParserFallback
12640 28 29 20 61 72 65 20 75 6e 75 73 65 64 20 2a 2f  () are unused */
12650 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
12660 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 46    (void)sqlite3F
12670 74 73 35 50 61 72 73 65 72 54 72 61 63 65 3b 0a  ts5ParserTrace;.
12680 23 65 6e 64 69 66 0a 20 20 28 76 6f 69 64 29 73  #endif.  (void)s
12690 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
126a0 46 61 6c 6c 62 61 63 6b 3b 0a 0a 20 20 72 65 74  Fallback;..  ret
126b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
126c0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
126d0 65 72 20 6f 66 20 70 68 72 61 73 65 73 20 69 6e  er of phrases in
126e0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
126f0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
12700 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43  3Fts5ExprPhraseC
12710 6f 75 6e 74 28 46 74 73 35 45 78 70 72 20 2a 70  ount(Fts5Expr *p
12720 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
12730 28 70 45 78 70 72 20 3f 20 70 45 78 70 72 2d 3e  (pExpr ? pExpr->
12740 6e 50 68 72 61 73 65 20 3a 20 30 29 3b 0a 7d 0a  nPhrase : 0);.}.
12750 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12760 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
12770 73 20 69 6e 20 74 68 65 20 69 50 68 72 61 73 65  s in the iPhrase
12780 27 74 68 20 70 68 72 61 73 65 20 69 6e 20 70 45  'th phrase in pE
12790 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  xpr..*/.int sqli
127a0 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73  te3Fts5ExprPhras
127b0 65 53 69 7a 65 28 46 74 73 35 45 78 70 72 20 2a  eSize(Fts5Expr *
127c0 70 45 78 70 72 2c 20 69 6e 74 20 69 50 68 72 61  pExpr, int iPhra
127d0 73 65 29 7b 0a 20 20 69 66 28 20 69 50 68 72 61  se){.  if( iPhra
127e0 73 65 3c 30 20 7c 7c 20 69 50 68 72 61 73 65 3e  se<0 || iPhrase>
127f0 3d 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 20  =pExpr->nPhrase 
12800 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
12810 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 70 45 78  turn pExpr->apEx
12820 70 72 50 68 72 61 73 65 5b 69 50 68 72 61 73 65  prPhrase[iPhrase
12830 5d 2d 3e 6e 54 65 72 6d 3b 0a 7d 0a 0a 2f 2a 0a  ]->nTerm;.}../*.
12840 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12850 20 69 73 20 75 73 65 64 20 74 6f 20 61 63 63 65   is used to acce
12860 73 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ss the current p
12870 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72  osition list for
12880 20 70 68 72 61 73 65 0a 2a 2a 20 69 50 68 72 61   phrase.** iPhra
12890 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
128a0 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73  e3Fts5ExprPoslis
128b0 74 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70  t(Fts5Expr *pExp
128c0 72 2c 20 69 6e 74 20 69 50 68 72 61 73 65 2c 20  r, int iPhrase, 
128d0 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 29 7b 0a  const u8 **pa){.
128e0 20 20 69 6e 74 20 6e 52 65 74 3b 0a 20 20 46 74    int nRet;.  Ft
128f0 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
12900 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 61  hrase = pExpr->a
12910 70 45 78 70 72 50 68 72 61 73 65 5b 69 50 68 72  pExprPhrase[iPhr
12920 61 73 65 5d 3b 0a 20 20 46 74 73 35 45 78 70 72  ase];.  Fts5Expr
12930 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 70 50  Node *pNode = pP
12940 68 72 61 73 65 2d 3e 70 4e 6f 64 65 3b 0a 20 20  hrase->pNode;.  
12950 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d  if( pNode->bEof=
12960 3d 30 20 26 26 20 70 4e 6f 64 65 2d 3e 69 52 6f  =0 && pNode->iRo
12970 77 69 64 3d 3d 70 45 78 70 72 2d 3e 70 52 6f 6f  wid==pExpr->pRoo
12980 74 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  t->iRowid ){.   
12990 20 2a 70 61 20 3d 20 70 50 68 72 61 73 65 2d 3e   *pa = pPhrase->
129a0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 6e  poslist.p;.    n
129b0 52 65 74 20 3d 20 70 50 68 72 61 73 65 2d 3e 70  Ret = pPhrase->p
129c0 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 65 6c 73  oslist.n;.  }els
129d0 65 7b 0a 20 20 20 20 2a 70 61 20 3d 20 30 3b 0a  e{.    *pa = 0;.
129e0 20 20 20 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20      nRet = 0;.  
129f0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  }.  return nRet;
12a00 0a 7d 0a 0a 73 74 72 75 63 74 20 46 74 73 35 50  .}..struct Fts5P
12a10 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 20  oslistPopulator 
12a20 7b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57  {.  Fts5PoslistW
12a30 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20  riter writer;.  
12a40 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20  int bOk;        
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a60 2f 2a 20 54 72 75 65 20 69 66 20 6f 6b 20 74 6f  /* True if ok to
12a70 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20 69   populate */.  i
12a80 6e 74 20 62 4d 69 73 73 3b 0a 7d 3b 0a 0a 46 74  nt bMiss;.};..Ft
12a90 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74  s5PoslistPopulat
12aa0 6f 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 45  or *sqlite3Fts5E
12ab0 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73 74 73  xprClearPoslists
12ac0 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72  (Fts5Expr *pExpr
12ad0 2c 20 69 6e 74 20 62 4c 69 76 65 29 7b 0a 20 20  , int bLive){.  
12ae0 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
12af0 61 74 6f 72 20 2a 70 52 65 74 3b 0a 20 20 70 52  ator *pRet;.  pR
12b00 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  et = sqlite3_mal
12b10 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 46 74 73  loc64(sizeof(Fts
12b20 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f  5PoslistPopulato
12b30 72 29 2a 70 45 78 70 72 2d 3e 6e 50 68 72 61 73  r)*pExpr->nPhras
12b40 65 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  e);.  if( pRet )
12b50 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
12b60 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c   memset(pRet, 0,
12b70 20 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c   sizeof(Fts5Posl
12b80 69 73 74 50 6f 70 75 6c 61 74 6f 72 29 2a 70 45  istPopulator)*pE
12b90 78 70 72 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20  xpr->nPhrase);. 
12ba0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
12bb0 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  xpr->nPhrase; i+
12bc0 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 42 75  +){.      Fts5Bu
12bd0 66 66 65 72 20 2a 70 42 75 66 20 3d 20 26 70 45  ffer *pBuf = &pE
12be0 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73  xpr->apExprPhras
12bf0 65 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74 3b 0a 20  e[i]->poslist;. 
12c00 20 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64       Fts5ExprNod
12c10 65 20 2a 70 4e 6f 64 65 20 3d 20 70 45 78 70 72  e *pNode = pExpr
12c20 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b 69  ->apExprPhrase[i
12c30 5d 2d 3e 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20  ]->pNode;.      
12c40 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
12c50 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e  pExprPhrase[i]->
12c60 6e 54 65 72 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  nTerm==1 );.    
12c70 20 20 69 66 28 20 62 4c 69 76 65 20 26 26 20 0a    if( bLive && .
12c80 20 20 20 20 20 20 20 20 20 20 28 70 42 75 66 2d            (pBuf-
12c90 3e 6e 3d 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e  >n==0 || pNode->
12ca0 69 52 6f 77 69 64 21 3d 70 45 78 70 72 2d 3e 70  iRowid!=pExpr->p
12cb0 52 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 7c 7c 20  Root->iRowid || 
12cc0 70 4e 6f 64 65 2d 3e 62 45 6f 66 29 0a 20 20 20  pNode->bEof).   
12cd0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52     ){.        pR
12ce0 65 74 5b 69 5d 2e 62 4d 69 73 73 20 3d 20 31 3b  et[i].bMiss = 1;
12cf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12d00 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20        pBuf->n = 
12d10 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
12d20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
12d30 65 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 46 74  et;.}..struct Ft
12d40 73 35 45 78 70 72 43 74 78 20 7b 0a 20 20 46 74  s5ExprCtx {.  Ft
12d50 73 35 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20  s5Expr *pExpr;. 
12d60 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75   Fts5PoslistPopu
12d70 6c 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f  lator *aPopulato
12d80 72 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a 7d  r;.  i64 iOff;.}
12d90 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
12da0 20 46 74 73 35 45 78 70 72 43 74 78 20 46 74 73   Fts5ExprCtx Fts
12db0 35 45 78 70 72 43 74 78 3b 0a 0a 2f 2a 0a 2a 2a  5ExprCtx;../*.**
12dc0 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73   TODO: Make this
12dd0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21   more efficient!
12de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12df0 74 73 35 45 78 70 72 43 6f 6c 73 65 74 54 65 73  ts5ExprColsetTes
12e00 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43  t(Fts5Colset *pC
12e10 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29  olset, int iCol)
12e20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
12e30 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
12e40 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
12e50 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69   if( pColset->ai
12e60 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72  Col[i]==iCol ) r
12e70 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
12e80 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
12e90 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 50  ic int fts5ExprP
12ea0 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74 73 43  opulatePoslistsC
12eb0 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b(.  void *pCtx,
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 2f 2a 20 43 6f 70 79 20 6f 66 20 32 6e 64 20 61  /* Copy of 2nd a
12ee0 72 67 75 6d 65 6e 74 20 74 6f 20 78 54 6f 6b 65  rgument to xToke
12ef0 6e 69 7a 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20  nize() */.  int 
12f00 74 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  tflags,         
12f10 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
12f20 66 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66  f FTS5_TOKEN_* f
12f30 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
12f40 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  char *pToken,   
12f50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
12f60 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
12f70 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ning token */.  
12f80 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
12f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
12fa0 7a 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62  ze of token in b
12fb0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 55  ytes */.  int iU
12fc0 6e 75 73 65 64 31 2c 20 20 20 20 20 20 20 20 20  nused1,         
12fd0 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
12fe0 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  set of token wit
12ff0 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20 2a  hin input text *
13000 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64 32  /.  int iUnused2
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13020 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66  * Byte offset of
13030 20 65 6e 64 20 6f 66 20 74 6f 6b 65 6e 20 77 69   end of token wi
13040 74 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20  thin input text 
13050 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72  */.){.  Fts5Expr
13060 43 74 78 20 2a 70 20 3d 20 28 46 74 73 35 45 78  Ctx *p = (Fts5Ex
13070 70 72 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 46  prCtx*)pCtx;.  F
13080 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d  ts5Expr *pExpr =
13090 20 70 2d 3e 70 45 78 70 72 3b 0a 20 20 69 6e 74   p->pExpr;.  int
130a0 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
130b0 52 41 4d 32 28 69 55 6e 75 73 65 64 31 2c 20 69  RAM2(iUnused1, i
130c0 55 6e 75 73 65 64 32 29 3b 0a 0a 20 20 69 66 28  Unused2);..  if(
130d0 20 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58   nToken>FTS5_MAX
130e0 5f 54 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54  _TOKEN_SIZE ) nT
130f0 6f 6b 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f  oken = FTS5_MAX_
13100 54 4f 4b 45 4e 5f 53 49 5a 45 3b 0a 20 20 69 66  TOKEN_SIZE;.  if
13110 28 20 28 74 66 6c 61 67 73 20 26 20 46 54 53 35  ( (tflags & FTS5
13120 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44  _TOKEN_COLOCATED
13130 29 3d 3d 30 20 29 20 70 2d 3e 69 4f 66 66 2b 2b  )==0 ) p->iOff++
13140 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13150 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69  Expr->nPhrase; i
13160 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70  ++){.    Fts5Exp
13170 72 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  rTerm *pTerm;.  
13180 20 20 69 66 28 20 70 2d 3e 61 50 6f 70 75 6c 61    if( p->aPopula
13190 74 6f 72 5b 69 5d 2e 62 4f 6b 3d 3d 30 20 29 20  tor[i].bOk==0 ) 
131a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
131b0 72 28 70 54 65 72 6d 3d 26 70 45 78 70 72 2d 3e  r(pTerm=&pExpr->
131c0 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d  apExprPhrase[i]-
131d0 3e 61 54 65 72 6d 5b 30 5d 3b 20 70 54 65 72 6d  >aTerm[0]; pTerm
131e0 3b 20 70 54 65 72 6d 3d 70 54 65 72 6d 2d 3e 70  ; pTerm=pTerm->p
131f0 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20  Synonym){.      
13200 69 6e 74 20 6e 54 65 72 6d 20 3d 20 28 69 6e 74  int nTerm = (int
13210 29 73 74 72 6c 65 6e 28 70 54 65 72 6d 2d 3e 7a  )strlen(pTerm->z
13220 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Term);.      if(
13230 20 28 6e 54 65 72 6d 3d 3d 6e 54 6f 6b 65 6e 20   (nTerm==nToken 
13240 7c 7c 20 28 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  || (nTerm<nToken
13250 20 26 26 20 70 54 65 72 6d 2d 3e 62 50 72 65 66   && pTerm->bPref
13260 69 78 29 29 0a 20 20 20 20 20 20 20 26 26 20 6d  ix)).       && m
13270 65 6d 63 6d 70 28 70 54 65 72 6d 2d 3e 7a 54 65  emcmp(pTerm->zTe
13280 72 6d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 65 72  rm, pToken, nTer
13290 6d 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  m)==0.      ){. 
132a0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
132b0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
132c0 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 0a  stWriterAppend(.
132d0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 45 78              &pEx
132e0 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  pr->apExprPhrase
132f0 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74 2c 20 26 70  [i]->poslist, &p
13300 2d 3e 61 50 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e  ->aPopulator[i].
13310 77 72 69 74 65 72 2c 20 70 2d 3e 69 4f 66 66 0a  writer, p->iOff.
13320 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
13330 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13340 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 62  rn rc;.        b
13350 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13360 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69   SQLITE_OK;.}..i
13380 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
13390 70 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73  prPopulatePoslis
133a0 74 73 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  ts(.  Fts5Config
133b0 20 2a 70 43 6f 6e 66 69 67 2c 0a 20 20 46 74 73   *pConfig,.  Fts
133c0 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20  5Expr *pExpr, . 
133d0 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75   Fts5PoslistPopu
133e0 6c 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f  lator *aPopulato
133f0 72 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a  r,.  int iCol, .
13400 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
13410 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 6e 74 20   int n.){.  int 
13420 69 3b 0a 20 20 46 74 73 35 45 78 70 72 43 74 78  i;.  Fts5ExprCtx
13430 20 73 43 74 78 3b 0a 20 20 73 43 74 78 2e 70 45   sCtx;.  sCtx.pE
13440 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73  xpr = pExpr;.  s
13450 43 74 78 2e 61 50 6f 70 75 6c 61 74 6f 72 20 3d  Ctx.aPopulator =
13460 20 61 50 6f 70 75 6c 61 74 6f 72 3b 0a 20 20 73   aPopulator;.  s
13470 43 74 78 2e 69 4f 66 66 20 3d 20 28 28 28 69 36  Ctx.iOff = (((i6
13480 34 29 69 43 6f 6c 29 20 3c 3c 20 33 32 29 20 2d  4)iCol) << 32) -
13490 20 31 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   1;..  for(i=0; 
134a0 69 3c 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65  i<pExpr->nPhrase
134b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
134c0 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  ExprNode *pNode 
134d0 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50  = pExpr->apExprP
134e0 68 72 61 73 65 5b 69 5d 2d 3e 70 4e 6f 64 65 3b  hrase[i]->pNode;
134f0 0a 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20  .    Fts5Colset 
13500 2a 70 43 6f 6c 73 65 74 20 3d 20 70 4e 6f 64 65  *pColset = pNode
13510 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  ->pNear->pColset
13520 3b 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 73  ;.    if( (pCols
13530 65 74 20 26 26 20 30 3d 3d 66 74 73 35 45 78 70  et && 0==fts5Exp
13540 72 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c  rColsetTest(pCol
13550 73 65 74 2c 20 69 43 6f 6c 29 29 20 0a 20 20 20  set, iCol)) .   
13560 20 20 7c 7c 20 61 50 6f 70 75 6c 61 74 6f 72 5b    || aPopulator[
13570 69 5d 2e 62 4d 69 73 73 0a 20 20 20 20 29 7b 0a  i].bMiss.    ){.
13580 20 20 20 20 20 20 61 50 6f 70 75 6c 61 74 6f 72        aPopulator
13590 5b 69 5d 2e 62 4f 6b 20 3d 20 30 3b 0a 20 20 20  [i].bOk = 0;.   
135a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 50   }else{.      aP
135b0 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e 62 4f 6b 20  opulator[i].bOk 
135c0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
135d0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
135e0 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f  Fts5Tokenize(pCo
135f0 6e 66 69 67 2c 20 0a 20 20 20 20 20 20 46 54 53  nfig, .      FTS
13600 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d  5_TOKENIZE_DOCUM
13610 45 4e 54 2c 20 7a 2c 20 6e 2c 20 28 76 6f 69 64  ENT, z, n, (void
13620 2a 29 26 73 43 74 78 2c 20 66 74 73 35 45 78 70  *)&sCtx, fts5Exp
13630 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74  rPopulatePoslist
13640 73 43 62 0a 20 20 29 3b 0a 7d 0a 0a 73 74 61 74  sCb.  );.}..stat
13650 69 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72  ic void fts5Expr
13660 43 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 46 74  ClearPoslists(Ft
13670 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
13680 65 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  e){.  if( pNode-
13690 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
136a0 4d 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70  M || pNode->eTyp
136b0 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 29  e==FTS5_STRING )
136c0 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65  {.    pNode->pNe
136d0 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
136e0 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a  >poslist.n = 0;.
136f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
13700 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13710 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
13720 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
13730 73 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69  s5ExprClearPosli
13740 73 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69  sts(pNode->apChi
13750 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ld[i]);.    }.  
13760 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
13770 66 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73  fts5ExprCheckPos
13780 6c 69 73 74 73 28 46 74 73 35 45 78 70 72 4e 6f  lists(Fts5ExprNo
13790 64 65 20 2a 70 4e 6f 64 65 2c 20 69 36 34 20 69  de *pNode, i64 i
137a0 52 6f 77 69 64 29 7b 0a 20 20 70 4e 6f 64 65 2d  Rowid){.  pNode-
137b0 3e 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  >iRowid = iRowid
137c0 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20  ;.  pNode->bEof 
137d0 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  = 0;.  switch( p
137e0 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20  Node->eType ){. 
137f0 20 20 20 63 61 73 65 20 46 54 53 35 5f 54 45 52     case FTS5_TER
13800 4d 3a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35  M:.    case FTS5
13810 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 72  _STRING:.      r
13820 65 74 75 72 6e 20 28 70 4e 6f 64 65 2d 3e 70 4e  eturn (pNode->pN
13830 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
13840 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3e 30 29 3b 0a  ->poslist.n>0);.
13850 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41  .    case FTS5_A
13860 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
13870 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
13880 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
13890 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; i++){.       
138a0 20 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65   if( fts5ExprChe
138b0 63 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65  ckPoslists(pNode
138c0 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52  ->apChild[i], iR
138d0 6f 77 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  owid)==0 ){.    
138e0 20 20 20 20 20 20 66 74 73 35 45 78 70 72 43 6c        fts5ExprCl
138f0 65 61 72 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64  earPoslists(pNod
13900 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
13910 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
13920 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13930 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
13940 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20    case FTS5_OR: 
13950 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
13960 20 20 20 20 20 69 6e 74 20 62 52 65 74 20 3d 20       int bRet = 
13970 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  0;.      for(i=0
13980 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
13990 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; i++){.       
139a0 20 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65   if( fts5ExprChe
139b0 63 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65  ckPoslists(pNode
139c0 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52  ->apChild[i], iR
139d0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20  owid) ){.       
139e0 20 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20     bRet = 1;.   
139f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13a00 20 20 20 20 20 72 65 74 75 72 6e 20 62 52 65 74       return bRet
13a10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66  ;.    }..    def
13a20 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
13a30 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79  sert( pNode->eTy
13a40 70 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29 3b 0a  pe==FTS5_NOT );.
13a50 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73        if( 0==fts
13a60 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73  5ExprCheckPoslis
13a70 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c  ts(pNode->apChil
13a80 64 5b 30 5d 2c 20 69 52 6f 77 69 64 29 0a 20 20  d[0], iRowid).  
13a90 20 20 20 20 20 20 20 20 7c 7c 20 30 21 3d 66 74          || 0!=ft
13aa0 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69  s5ExprCheckPosli
13ab0 73 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69  sts(pNode->apChi
13ac0 6c 64 5b 31 5d 2c 20 69 52 6f 77 69 64 29 0a 20  ld[1], iRowid). 
13ad0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
13ae0 20 20 66 74 73 35 45 78 70 72 43 6c 65 61 72 50    fts5ExprClearP
13af0 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 29 3b 0a  oslists(pNode);.
13b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
13b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13b20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
13b30 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13b40 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
13b50 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74  ExprCheckPoslist
13b60 73 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70  s(Fts5Expr *pExp
13b70 72 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  r, i64 iRowid){.
13b80 20 20 66 74 73 35 45 78 70 72 43 68 65 63 6b 50    fts5ExprCheckP
13b90 6f 73 6c 69 73 74 73 28 70 45 78 70 72 2d 3e 70  oslists(pExpr->p
13ba0 52 6f 6f 74 2c 20 69 52 6f 77 69 64 29 3b 0a 7d  Root, iRowid);.}
13bb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
13bc0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
13bd0 6c 6c 65 64 20 66 6f 72 20 64 65 74 61 69 6c 3d  lled for detail=
13be0 63 6f 6c 75 6d 6e 73 20 74 61 62 6c 65 73 2e 20  columns tables. 
13bf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
13c00 74 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 6c  ts5ExprPhraseCol
13c10 6c 69 73 74 28 0a 20 20 46 74 73 35 45 78 70 72  list(.  Fts5Expr
13c20 20 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e 74 20   *pExpr, .  int 
13c30 69 50 68 72 61 73 65 2c 20 0a 20 20 63 6f 6e 73  iPhrase, .  cons
13c40 74 20 75 38 20 2a 2a 70 70 43 6f 6c 6c 69 73 74  t u8 **ppCollist
13c50 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 6c  , .  int *pnColl
13c60 69 73 74 0a 29 7b 0a 20 20 46 74 73 35 45 78 70  ist.){.  Fts5Exp
13c70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
13c80 20 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72   = pExpr->apExpr
13c90 50 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d 3b  Phrase[iPhrase];
13ca0 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
13cb0 2a 70 4e 6f 64 65 20 3d 20 70 50 68 72 61 73 65  *pNode = pPhrase
13cc0 2d 3e 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ->pNode;.  int r
13cd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
13ce0 20 20 61 73 73 65 72 74 28 20 69 50 68 72 61 73    assert( iPhras
13cf0 65 3e 3d 30 20 26 26 20 69 50 68 72 61 73 65 3c  e>=0 && iPhrase<
13d00 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 20 29  pExpr->nPhrase )
13d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
13d20 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  r->pConfig->eDet
13d30 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
13d40 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 0a 20 20 69  _COLUMNS );..  i
13d50 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d  f( pNode->bEof==
13d60 30 20 0a 20 20 20 26 26 20 70 4e 6f 64 65 2d 3e  0 .   && pNode->
13d70 69 52 6f 77 69 64 3d 3d 70 45 78 70 72 2d 3e 70  iRowid==pExpr->p
13d80 52 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 0a 20 20  Root->iRowid .  
13d90 20 26 26 20 70 50 68 72 61 73 65 2d 3e 70 6f 73   && pPhrase->pos
13da0 6c 69 73 74 2e 6e 3e 30 0a 20 20 29 7b 0a 20 20  list.n>0.  ){.  
13db0 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
13dc0 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
13dd0 2d 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  ->aTerm[0];.    
13de0 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  if( pTerm->pSyno
13df0 6e 79 6d 20 29 7b 0a 20 20 20 20 20 20 46 74 73  nym ){.      Fts
13e00 35 42 75 66 66 65 72 20 2a 70 42 75 66 20 3d 20  5Buffer *pBuf = 
13e10 28 46 74 73 35 42 75 66 66 65 72 2a 29 26 70 54  (Fts5Buffer*)&pT
13e20 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 5b 31 5d  erm->pSynonym[1]
13e30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
13e40 35 45 78 70 72 53 79 6e 6f 6e 79 6d 4c 69 73 74  5ExprSynonymList
13e50 28 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  (.          pTer
13e60 6d 2c 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64  m, pNode->iRowid
13e70 2c 20 70 42 75 66 2c 20 28 75 38 2a 2a 29 70 70  , pBuf, (u8**)pp
13e80 43 6f 6c 6c 69 73 74 2c 20 70 6e 43 6f 6c 6c 69  Collist, pnColli
13e90 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
13ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
13eb0 43 6f 6c 6c 69 73 74 20 3d 20 70 50 68 72 61 73  Collist = pPhras
13ec0 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65  e->aTerm[0].pIte
13ed0 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  r->pData;.      
13ee0 2a 70 6e 43 6f 6c 6c 69 73 74 20 3d 20 70 50 68  *pnCollist = pPh
13ef0 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70  rase->aTerm[0].p
13f00 49 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 20 20 20  Iter->nData;.   
13f10 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13f20 2a 70 70 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a  *ppCollist = 0;.
13f30 20 20 20 20 2a 70 6e 43 6f 6c 6c 69 73 74 20 3d      *pnCollist =
13f40 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
13f50 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.