/ Hex Artifact Content
Login

Artifact 5661fe64f4f5a499710df9561075de84b743f01e808af46df4130a9ec343a0fd:


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 69 6e  ee(p);.  }.}..in
2300: 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
2310: 72 41 6e 64 28 46 74 73 35 45 78 70 72 20 2a 2a  rAnd(Fts5Expr **
2320: 70 70 31 2c 20 46 74 73 35 45 78 70 72 20 2a 70  pp1, Fts5Expr *p
2330: 32 29 7b 0a 20 20 46 74 73 35 50 61 72 73 65 20  2){.  Fts5Parse 
2340: 73 50 61 72 73 65 3b 0a 20 20 6d 65 6d 73 65 74  sParse;.  memset
2350: 28 26 73 50 61 72 73 65 2c 20 30 2c 20 73 69 7a  (&sParse, 0, siz
2360: 65 6f 66 28 73 50 61 72 73 65 29 29 3b 0a 0a 20  eof(sParse));.. 
2370: 20 69 66 28 20 2a 70 70 31 20 29 7b 0a 20 20 20   if( *pp1 ){.   
2380: 20 46 74 73 35 45 78 70 72 20 2a 70 31 20 3d 20   Fts5Expr *p1 = 
2390: 2a 70 70 31 3b 0a 20 20 20 20 69 6e 74 20 6e 50  *pp1;.    int nP
23a0: 68 72 61 73 65 20 3d 20 70 31 2d 3e 6e 50 68 72  hrase = p1->nPhr
23b0: 61 73 65 20 2b 20 70 32 2d 3e 6e 50 68 72 61 73  ase + p2->nPhras
23c0: 65 3b 0a 0a 20 20 20 20 70 31 2d 3e 70 52 6f 6f  e;..    p1->pRoo
23d0: 74 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50  t = sqlite3Fts5P
23e0: 61 72 73 65 4e 6f 64 65 28 26 73 50 61 72 73 65  arseNode(&sParse
23f0: 2c 20 46 54 53 35 5f 41 4e 44 2c 20 70 31 2d 3e  , FTS5_AND, p1->
2400: 70 52 6f 6f 74 2c 20 70 32 2d 3e 70 52 6f 6f 74  pRoot, p2->pRoot
2410: 2c 30 29 3b 0a 20 20 20 20 70 32 2d 3e 70 52 6f  ,0);.    p2->pRo
2420: 6f 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ot = 0;..    if(
2430: 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49   sParse.rc==SQLI
2440: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46  TE_OK ){.      F
2450: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 2a  ts5ExprPhrase **
2460: 61 70 20 3d 20 28 46 74 73 35 45 78 70 72 50 68  ap = (Fts5ExprPh
2470: 72 61 73 65 2a 2a 29 73 71 6c 69 74 65 33 5f 72  rase**)sqlite3_r
2480: 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
2490: 20 20 70 31 2d 3e 61 70 45 78 70 72 50 68 72 61    p1->apExprPhra
24a0: 73 65 2c 20 6e 50 68 72 61 73 65 20 2a 20 73 69  se, nPhrase * si
24b0: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72  zeof(Fts5ExprPhr
24c0: 61 73 65 2a 29 0a 20 20 20 20 20 20 29 3b 0a 20  ase*).      );. 
24d0: 20 20 20 20 20 69 66 28 20 61 70 3d 3d 30 20 29       if( ap==0 )
24e0: 7b 0a 20 20 20 20 20 20 20 20 73 50 61 72 73 65  {.        sParse
24f0: 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  .rc = SQLITE_NOM
2500: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
2510: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
2520: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
2530: 26 61 70 5b 70 32 2d 3e 6e 50 68 72 61 73 65 5d  &ap[p2->nPhrase]
2540: 2c 20 61 70 2c 20 70 31 2d 3e 6e 50 68 72 61 73  , ap, p1->nPhras
2550: 65 2a 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  e*sizeof(Fts5Exp
2560: 72 50 68 72 61 73 65 2a 29 29 3b 0a 20 20 20 20  rPhrase*));.    
2570: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2580: 32 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29  2->nPhrase; i++)
2590: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 5b 69  {.          ap[i
25a0: 5d 20 3d 20 70 32 2d 3e 61 70 45 78 70 72 50 68  ] = p2->apExprPh
25b0: 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20 20 20  rase[i];.       
25c0: 20 7d 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 6e   }.        p1->n
25d0: 50 68 72 61 73 65 20 3d 20 6e 50 68 72 61 73 65  Phrase = nPhrase
25e0: 3b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 61 70  ;.        p1->ap
25f0: 45 78 70 72 50 68 72 61 73 65 20 3d 20 61 70 3b  ExprPhrase = ap;
2600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2610: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2620: 70 32 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  p2->apExprPhrase
2630: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2640: 72 65 65 28 70 32 29 3b 0a 20 20 7d 65 6c 73 65  ree(p2);.  }else
2650: 7b 0a 20 20 20 20 2a 70 70 31 20 3d 20 70 32 3b  {.    *pp1 = p2;
2660: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
2670: 50 61 72 73 65 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  Parse.rc;.}../*.
2680: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 54 65 72  ** Argument pTer
2690: 6d 20 6d 75 73 74 20 62 65 20 61 20 73 79 6e 6f  m must be a syno
26a0: 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e 20 52 65  nym iterator. Re
26b0: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
26c0: 20 72 6f 77 69 64 0a 2a 2a 20 74 68 61 74 20 69   rowid.** that i
26d0: 74 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a  t points to..*/.
26e0: 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 45  static i64 fts5E
26f0: 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28  xprSynonymRowid(
2700: 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
2710: 65 72 6d 2c 20 69 6e 74 20 62 44 65 73 63 2c 20  erm, int bDesc, 
2720: 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20 20 69  int *pbEof){.  i
2730: 36 34 20 69 52 65 74 20 3d 20 30 3b 0a 20 20 69  64 iRet = 0;.  i
2740: 6e 74 20 62 52 65 74 56 61 6c 69 64 20 3d 20 30  nt bRetValid = 0
2750: 3b 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d  ;.  Fts5ExprTerm
2760: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
2770: 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20  pTerm->pSynonym 
2780: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 44 65  );.  assert( bDe
2790: 73 63 3d 3d 30 20 7c 7c 20 62 44 65 73 63 3d 3d  sc==0 || bDesc==
27a0: 31 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54 65  1 );.  for(p=pTe
27b0: 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e  rm; p; p=p->pSyn
27c0: 6f 6e 79 6d 29 7b 0a 20 20 20 20 69 66 28 20 30  onym){.    if( 0
27d0: 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ==sqlite3Fts5Ite
27e0: 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 20 29  rEof(p->pIter) )
27f0: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
2800: 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69  id = p->pIter->i
2810: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 66 28  Rowid;.      if(
2820: 20 62 52 65 74 56 61 6c 69 64 3d 3d 30 20 7c 7c   bRetValid==0 ||
2830: 20 28 62 44 65 73 63 21 3d 28 69 52 6f 77 69 64   (bDesc!=(iRowid
2840: 3c 69 52 65 74 29 29 20 29 7b 0a 20 20 20 20 20  <iRet)) ){.     
2850: 20 20 20 69 52 65 74 20 3d 20 69 52 6f 77 69 64     iRet = iRowid
2860: 3b 0a 20 20 20 20 20 20 20 20 62 52 65 74 56 61  ;.        bRetVa
2870: 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  lid = 1;.      }
2880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2890: 28 20 70 62 45 6f 66 20 26 26 20 62 52 65 74 56  ( pbEof && bRetV
28a0: 61 6c 69 64 3d 3d 30 20 29 20 2a 70 62 45 6f 66  alid==0 ) *pbEof
28b0: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 69   = 1;.  return i
28c0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  Ret;.}../*.** Ar
28d0: 67 75 6d 65 6e 74 20 70 54 65 72 6d 20 6d 75 73  gument pTerm mus
28e0: 74 20 62 65 20 61 20 73 79 6e 6f 6e 79 6d 20 69  t be a synonym i
28f0: 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  terator..*/.stat
2900: 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 53  ic int fts5ExprS
2910: 79 6e 6f 6e 79 6d 4c 69 73 74 28 0a 20 20 46 74  ynonymList(.  Ft
2920: 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72  s5ExprTerm *pTer
2930: 6d 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  m, .  i64 iRowid
2940: 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
2950: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
2960: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20      /* Use this 
2970: 62 75 66 66 65 72 20 66 6f 72 20 73 70 61 63 65  buffer for space
2980: 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
2990: 20 20 75 38 20 2a 2a 70 61 2c 20 69 6e 74 20 2a    u8 **pa, int *
29a0: 70 6e 0a 29 7b 0a 20 20 46 74 73 35 50 6f 73 6c  pn.){.  Fts5Posl
29b0: 69 73 74 52 65 61 64 65 72 20 61 53 74 61 74 69  istReader aStati
29c0: 63 5b 34 5d 3b 0a 20 20 46 74 73 35 50 6f 73 6c  c[4];.  Fts5Posl
29d0: 69 73 74 52 65 61 64 65 72 20 2a 61 49 74 65 72  istReader *aIter
29e0: 20 3d 20 61 53 74 61 74 69 63 3b 0a 20 20 69 6e   = aStatic;.  in
29f0: 74 20 6e 49 74 65 72 20 3d 20 30 3b 0a 20 20 69  t nIter = 0;.  i
2a00: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 34 3b 0a 20  nt nAlloc = 4;. 
2a10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a20: 5f 4f 4b 3b 0a 20 20 46 74 73 35 45 78 70 72 54  _OK;.  Fts5ExprT
2a30: 65 72 6d 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72  erm *p;..  asser
2a40: 74 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  t( pTerm->pSynon
2a50: 79 6d 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54  ym );.  for(p=pT
2a60: 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
2a70: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 46 74 73 35  nonym){.    Fts5
2a80: 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
2a90: 20 3d 20 70 2d 3e 70 49 74 65 72 3b 0a 20 20 20   = p->pIter;.   
2aa0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
2ab0: 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 3d 3d  IterEof(pIter)==
2ac0: 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77  0 && pIter->iRow
2ad0: 69 64 3d 3d 69 52 6f 77 69 64 20 29 7b 0a 20 20  id==iRowid ){.  
2ae0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e      if( pIter->n
2af0: 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Data==0 ) contin
2b00: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 49  ue;.      if( nI
2b10: 74 65 72 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ter==nAlloc ){. 
2b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
2b30: 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a  nt64 nByte = siz
2b40: 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52  eof(Fts5PoslistR
2b50: 65 61 64 65 72 29 20 2a 20 6e 41 6c 6c 6f 63 20  eader) * nAlloc 
2b60: 2a 20 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73  * 2;.        Fts
2b70: 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a  5PoslistReader *
2b80: 61 4e 65 77 20 3d 20 28 46 74 73 35 50 6f 73 6c  aNew = (Fts5Posl
2b90: 69 73 74 52 65 61 64 65 72 2a 29 73 71 6c 69 74  istReader*)sqlit
2ba0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
2bb0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2bc0: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
2bd0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2be0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2bf0: 20 20 67 6f 74 6f 20 73 79 6e 6f 6e 79 6d 5f 70    goto synonym_p
2c00: 6f 73 6c 69 73 74 5f 6f 75 74 3b 0a 20 20 20 20  oslist_out;.    
2c10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
2c20: 6d 63 70 79 28 61 4e 65 77 2c 20 61 49 74 65 72  mcpy(aNew, aIter
2c30: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73  , sizeof(Fts5Pos
2c40: 6c 69 73 74 52 65 61 64 65 72 29 20 2a 20 6e 49  listReader) * nI
2c50: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 41  ter);.        nA
2c60: 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 3b  lloc = nAlloc*2;
2c70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 49 74  .        if( aIt
2c80: 65 72 21 3d 61 53 74 61 74 69 63 20 29 20 73 71  er!=aStatic ) sq
2c90: 6c 69 74 65 33 5f 66 72 65 65 28 61 49 74 65 72  lite3_free(aIter
2ca0: 29 3b 0a 20 20 20 20 20 20 20 20 61 49 74 65 72  );.        aIter
2cb0: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = aNew;.      }
2cc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2cd0: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49  s5PoslistReaderI
2ce0: 6e 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74 61  nit(pIter->pData
2cf0: 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20  , pIter->nData, 
2d00: 26 61 49 74 65 72 5b 6e 49 74 65 72 5d 29 3b 0a  &aIter[nIter]);.
2d10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 49        assert( aI
2d20: 74 65 72 5b 6e 49 74 65 72 5d 2e 62 45 6f 66 3d  ter[nIter].bEof=
2d30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 49 74 65  =0 );.      nIte
2d40: 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r++;.    }.  }..
2d50: 20 20 69 66 28 20 6e 49 74 65 72 3d 3d 31 20 29    if( nIter==1 )
2d60: 7b 0a 20 20 20 20 2a 70 61 20 3d 20 28 75 38 2a  {.    *pa = (u8*
2d70: 29 61 49 74 65 72 5b 30 5d 2e 61 3b 0a 20 20 20  )aIter[0].a;.   
2d80: 20 2a 70 6e 20 3d 20 61 49 74 65 72 5b 30 5d 2e   *pn = aIter[0].
2d90: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
2da0: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
2db0: 72 20 77 72 69 74 65 72 20 3d 20 7b 30 7d 3b 0a  r writer = {0};.
2dc0: 20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d 20      i64 iPrev = 
2dd0: 2d 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  -1;.    fts5Buff
2de0: 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
2df0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
2e00: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2e10: 20 69 36 34 20 69 4d 69 6e 20 3d 20 46 54 53 35   i64 iMin = FTS5
2e20: 5f 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a  _LARGEST_INT64;.
2e30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2e40: 3c 6e 49 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nIter; i++){.  
2e50: 20 20 20 20 20 20 69 66 28 20 61 49 74 65 72 5b        if( aIter[
2e60: 69 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  i].bEof==0 ){.  
2e70: 20 20 20 20 20 20 20 20 69 66 28 20 61 49 74 65          if( aIte
2e80: 72 5b 69 5d 2e 69 50 6f 73 3d 3d 69 50 72 65 76  r[i].iPos==iPrev
2e90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ea0: 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 50  if( sqlite3Fts5P
2eb0: 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
2ec0: 28 26 61 49 74 65 72 5b 69 5d 29 20 29 20 63 6f  (&aIter[i]) ) co
2ed0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ee0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2ef0: 28 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73 3c  ( aIter[i].iPos<
2f00: 69 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  iMin ){.        
2f10: 20 20 20 20 69 4d 69 6e 20 3d 20 61 49 74 65 72      iMin = aIter
2f20: 5b 69 5d 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20  [i].iPos;.      
2f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2f40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2f50: 28 20 69 4d 69 6e 3d 3d 46 54 53 35 5f 4c 41 52  ( iMin==FTS5_LAR
2f60: 47 45 53 54 5f 49 4e 54 36 34 20 7c 7c 20 72 63  GEST_INT64 || rc
2f70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
2f80: 65 61 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  eak;.      rc = 
2f90: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
2fa0: 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 70  stWriterAppend(p
2fb0: 42 75 66 2c 20 26 77 72 69 74 65 72 2c 20 69 4d  Buf, &writer, iM
2fc0: 69 6e 29 3b 0a 20 20 20 20 20 20 69 50 72 65 76  in);.      iPrev
2fd0: 20 3d 20 69 4d 69 6e 3b 0a 20 20 20 20 7d 0a 20   = iMin;.    }. 
2fe0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ff0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
3000: 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 20  a = pBuf->p;.   
3010: 20 20 20 2a 70 6e 20 3d 20 70 42 75 66 2d 3e 6e     *pn = pBuf->n
3020: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 73 79  ;.    }.  }.. sy
3030: 6e 6f 6e 79 6d 5f 70 6f 73 6c 69 73 74 5f 6f 75  nonym_poslist_ou
3040: 74 3a 0a 20 20 69 66 28 20 61 49 74 65 72 21 3d  t:.  if( aIter!=
3050: 61 53 74 61 74 69 63 20 29 20 73 71 6c 69 74 65  aStatic ) sqlite
3060: 33 5f 66 72 65 65 28 61 49 74 65 72 29 3b 0a 20  3_free(aIter);. 
3070: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
3080: 2f 2a 0a 2a 2a 20 41 6c 6c 20 69 6e 64 69 76 69  /*.** All indivi
3090: 64 75 61 6c 20 74 65 72 6d 20 69 74 65 72 61 74  dual term iterat
30a0: 6f 72 73 20 69 6e 20 70 50 68 72 61 73 65 20 61  ors in pPhrase a
30b0: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
30c0: 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 2a 2a   be valid and.**
30d0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
30e0: 20 73 61 6d 65 20 72 6f 77 69 64 20 77 68 65 6e   same rowid when
30f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
3100: 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 66  s called. This f
3110: 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 63 68 65 63  unction .** chec
3120: 6b 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ks if the curren
3130: 74 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 69  t rowid really i
3140: 73 20 61 20 6d 61 74 63 68 2c 20 61 6e 64 20 69  s a match, and i
3150: 66 20 73 6f 20 70 6f 70 75 6c 61 74 65 73 0a 2a  f so populates.*
3160: 2a 20 74 68 65 20 70 50 68 72 61 73 65 2d 3e 70  * the pPhrase->p
3170: 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 61 63  oslist buffer ac
3180: 63 6f 72 64 69 6e 67 6c 79 2e 20 4f 75 74 70 75  cordingly. Outpu
3190: 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62 4d  t parameter *pbM
31a0: 61 74 63 68 0a 2a 2a 20 69 73 20 73 65 74 20 74  atch.** is set t
31b0: 6f 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  o true if this i
31c0: 73 20 72 65 61 6c 6c 79 20 61 20 6d 61 74 63 68  s really a match
31d0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
31e0: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  wise..**.** SQLI
31f0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
3200: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
3210: 63 75 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69  curs, or an SQLi
3220: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a  te error code .*
3230: 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 20  * otherwise. It 
3240: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
3250: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
3260: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  if the current r
3270: 6f 77 69 64 20 69 73 20 0a 2a 2a 20 6e 6f 74 20  owid is .** not 
3280: 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74  a match..*/.stat
3290: 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 50  ic int fts5ExprP
32a0: 68 72 61 73 65 49 73 4d 61 74 63 68 28 0a 20 20  hraseIsMatch(.  
32b0: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
32c0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
32d0: 2f 2a 20 4e 6f 64 65 20 70 50 68 72 61 73 65 20  /* Node pPhrase 
32e0: 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20  belongs to */.  
32f0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
3300: 70 50 68 72 61 73 65 2c 20 20 20 20 20 20 20 20  pPhrase,        
3310: 2f 2a 20 50 68 72 61 73 65 20 6f 62 6a 65 63 74  /* Phrase object
3320: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a   to initialize *
3330: 2f 0a 20 20 69 6e 74 20 2a 70 62 4d 61 74 63 68  /.  int *pbMatch
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
3360: 74 6f 20 74 72 75 65 20 69 66 20 72 65 61 6c 6c  to true if reall
3370: 79 20 61 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a  y a match */.){.
3380: 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69    Fts5PoslistWri
3390: 74 65 72 20 77 72 69 74 65 72 20 3d 20 7b 30 7d  ter writer = {0}
33a0: 3b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52  ;.  Fts5PoslistR
33b0: 65 61 64 65 72 20 61 53 74 61 74 69 63 5b 34 5d  eader aStatic[4]
33c0: 3b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52  ;.  Fts5PoslistR
33d0: 65 61 64 65 72 20 2a 61 49 74 65 72 20 3d 20 61  eader *aIter = a
33e0: 53 74 61 74 69 63 3b 0a 20 20 69 6e 74 20 69 3b  Static;.  int i;
33f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
3400: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 46 69  TE_OK;.  int bFi
3410: 72 73 74 20 3d 20 70 50 68 72 61 73 65 2d 3e 61  rst = pPhrase->a
3420: 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 3b 0a  Term[0].bFirst;.
3430: 20 20 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a    .  fts5BufferZ
3440: 65 72 6f 28 26 70 50 68 72 61 73 65 2d 3e 70 6f  ero(&pPhrase->po
3450: 73 6c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 49 66  slist);..  /* If
3460: 20 74 68 65 20 61 53 74 61 74 69 63 5b 5d 20 61   the aStatic[] a
3470: 72 72 61 79 20 69 73 20 6e 6f 74 20 6c 61 72 67  rray is not larg
3480: 65 20 65 6e 6f 75 67 68 2c 20 61 6c 6c 6f 63 61  e enough, alloca
3490: 74 65 20 61 20 6c 61 72 67 65 20 61 72 72 61 79  te a large array
34a0: 0a 20 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  .  ** using sqli
34b0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54 68  te3_malloc(). Th
34c0: 69 73 20 61 70 70 72 6f 61 63 68 20 63 6f 75 6c  is approach coul
34d0: 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 75 70  d be improved up
34e0: 6f 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 68  on. */.  if( pPh
34f0: 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 41 72 72 61  rase->nTerm>Arra
3500: 79 53 69 7a 65 28 61 53 74 61 74 69 63 29 20 29  ySize(aStatic) )
3510: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
3520: 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
3530: 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65  of(Fts5PoslistRe
3540: 61 64 65 72 29 20 2a 20 70 50 68 72 61 73 65 2d  ader) * pPhrase-
3550: 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 61 49 74 65  >nTerm;.    aIte
3560: 72 20 3d 20 28 46 74 73 35 50 6f 73 6c 69 73 74  r = (Fts5Poslist
3570: 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33 5f  Reader*)sqlite3_
3580: 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
3590: 0a 20 20 20 20 69 66 28 20 21 61 49 74 65 72 20  .    if( !aIter 
35a0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
35b0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
35c0: 73 65 74 28 61 49 74 65 72 2c 20 30 2c 20 73 69  set(aIter, 0, si
35d0: 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74  zeof(Fts5Poslist
35e0: 52 65 61 64 65 72 29 20 2a 20 70 50 68 72 61 73  Reader) * pPhras
35f0: 65 2d 3e 6e 54 65 72 6d 29 3b 0a 0a 20 20 2f 2a  e->nTerm);..  /*
3600: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 74 65   Initialize a te
3610: 72 6d 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20  rm iterator for 
3620: 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
3630: 20 70 68 72 61 73 65 20 2a 2f 0a 20 20 66 6f 72   phrase */.  for
3640: 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d  (i=0; i<pPhrase-
3650: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
3660: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
3670: 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
3680: 2d 3e 61 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20  ->aTerm[i];.    
3690: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 69  int n = 0;.    i
36a0: 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20  nt bFlag = 0;.  
36b0: 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 20    u8 *a = 0;.   
36c0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e   if( pTerm->pSyn
36d0: 6f 6e 79 6d 20 29 7b 0a 20 20 20 20 20 20 46 74  onym ){.      Ft
36e0: 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b  s5Buffer buf = {
36f0: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20  0, 0, 0};.      
3700: 72 63 20 3d 20 66 74 73 35 45 78 70 72 53 79 6e  rc = fts5ExprSyn
3710: 6f 6e 79 6d 4c 69 73 74 28 70 54 65 72 6d 2c 20  onymList(pTerm, 
3720: 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 2c 20 26  pNode->iRowid, &
3730: 62 75 66 2c 20 26 61 2c 20 26 6e 29 3b 0a 20 20  buf, &a, &n);.  
3740: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
3750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
3760: 65 65 28 61 29 3b 0a 20 20 20 20 20 20 20 20 67  ee(a);.        g
3770: 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b  oto ismatch_out;
3780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3790: 66 28 20 61 3d 3d 62 75 66 2e 70 20 29 20 62 46  f( a==buf.p ) bF
37a0: 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  lag = 1;.    }el
37b0: 73 65 7b 0a 20 20 20 20 20 20 61 20 3d 20 28 75  se{.      a = (u
37c0: 38 2a 29 70 54 65 72 6d 2d 3e 70 49 74 65 72 2d  8*)pTerm->pIter-
37d0: 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 6e 20  >pData;.      n 
37e0: 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 2d 3e  = pTerm->pIter->
37f0: 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  nData;.    }.   
3800: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
3810: 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 61 2c  istReaderInit(a,
3820: 20 6e 2c 20 26 61 49 74 65 72 5b 69 5d 29 3b 0a   n, &aIter[i]);.
3830: 20 20 20 20 61 49 74 65 72 5b 69 5d 2e 62 46 6c      aIter[i].bFl
3840: 61 67 20 3d 20 28 75 38 29 62 46 6c 61 67 3b 0a  ag = (u8)bFlag;.
3850: 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d      if( aIter[i]
3860: 2e 62 45 6f 66 20 29 20 67 6f 74 6f 20 69 73 6d  .bEof ) goto ism
3870: 61 74 63 68 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  atch_out;.  }.. 
3880: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
3890: 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 20 20 20   int bMatch;.   
38a0: 20 69 36 34 20 69 50 6f 73 20 3d 20 61 49 74 65   i64 iPos = aIte
38b0: 72 5b 30 5d 2e 69 50 6f 73 3b 0a 20 20 20 20 64  r[0].iPos;.    d
38c0: 6f 20 7b 0a 20 20 20 20 20 20 62 4d 61 74 63 68  o {.      bMatch
38d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
38e0: 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e  i=0; i<pPhrase->
38f0: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
3900: 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
3910: 52 65 61 64 65 72 20 2a 70 50 6f 73 20 3d 20 26  Reader *pPos = &
3920: 61 49 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  aIter[i];.      
3930: 20 20 69 36 34 20 69 41 64 6a 20 3d 20 69 50 6f    i64 iAdj = iPo
3940: 73 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69  s + i;.        i
3950: 66 28 20 70 50 6f 73 2d 3e 69 50 6f 73 21 3d 69  f( pPos->iPos!=i
3960: 41 64 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Adj ){.         
3970: 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20   bMatch = 0;.   
3980: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50         while( pP
3990: 6f 73 2d 3e 69 50 6f 73 3c 69 41 64 6a 20 29 7b  os->iPos<iAdj ){
39a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
39b0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
39c0: 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 70 50  istReaderNext(pP
39d0: 6f 73 29 20 29 20 67 6f 74 6f 20 69 73 6d 61 74  os) ) goto ismat
39e0: 63 68 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ch_out;.        
39f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
3a00: 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69 41 64  ( pPos->iPos>iAd
3a10: 6a 20 29 20 69 50 6f 73 20 3d 20 70 50 6f 73 2d  j ) iPos = pPos-
3a20: 3e 69 50 6f 73 2d 69 3b 0a 20 20 20 20 20 20 20  >iPos-i;.       
3a30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3a40: 77 68 69 6c 65 28 20 62 4d 61 74 63 68 3d 3d 30  while( bMatch==0
3a50: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65   );..    /* Appe
3a60: 6e 64 20 70 6f 73 69 74 69 6f 6e 20 69 50 6f 73  nd position iPos
3a70: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a   to the output *
3a80: 2f 0a 20 20 20 20 69 66 28 20 62 46 69 72 73 74  /.    if( bFirst
3a90: 3d 3d 30 20 7c 7c 20 46 54 53 35 5f 50 4f 53 32  ==0 || FTS5_POS2
3aa0: 4f 46 46 53 45 54 28 69 50 6f 73 29 3d 3d 30 20  OFFSET(iPos)==0 
3ab0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
3ac0: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
3ad0: 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 70 50  WriterAppend(&pP
3ae0: 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2c 20  hrase->poslist, 
3af0: 26 77 72 69 74 65 72 2c 20 69 50 6f 73 29 3b 0a  &writer, iPos);.
3b00: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
3b10: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 69  LITE_OK ) goto i
3b20: 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20 20 20  smatch_out;.    
3b30: 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
3b40: 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  i<pPhrase->nTerm
3b50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
3b60: 28 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  ( sqlite3Fts5Pos
3b70: 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26  listReaderNext(&
3b80: 61 49 74 65 72 5b 69 5d 29 20 29 20 67 6f 74 6f  aIter[i]) ) goto
3b90: 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20   ismatch_out;.  
3ba0: 20 20 7d 0a 20 20 7d 0a 0a 20 69 73 6d 61 74 63    }.  }.. ismatc
3bb0: 68 5f 6f 75 74 3a 0a 20 20 2a 70 62 4d 61 74 63  h_out:.  *pbMatc
3bc0: 68 20 3d 20 28 70 50 68 72 61 73 65 2d 3e 70 6f  h = (pPhrase->po
3bd0: 73 6c 69 73 74 2e 6e 3e 30 29 3b 0a 20 20 66 6f  slist.n>0);.  fo
3be0: 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65  r(i=0; i<pPhrase
3bf0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
3c00: 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d 2e     if( aIter[i].
3c10: 62 46 6c 61 67 20 29 20 73 71 6c 69 74 65 33 5f  bFlag ) sqlite3_
3c20: 66 72 65 65 28 28 75 38 2a 29 61 49 74 65 72 5b  free((u8*)aIter[
3c30: 69 5d 2e 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28  i].a);.  }.  if(
3c40: 20 61 49 74 65 72 21 3d 61 53 74 61 74 69 63 20   aIter!=aStatic 
3c50: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61  ) sqlite3_free(a
3c60: 49 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  Iter);.  return 
3c70: 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73  rc;.}..typedef s
3c80: 74 72 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61 68  truct Fts5Lookah
3c90: 65 61 64 52 65 61 64 65 72 20 46 74 73 35 4c 6f  eadReader Fts5Lo
3ca0: 6f 6b 61 68 65 61 64 52 65 61 64 65 72 3b 0a 73  okaheadReader;.s
3cb0: 74 72 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61 68  truct Fts5Lookah
3cc0: 65 61 64 52 65 61 64 65 72 20 7b 0a 20 20 63 6f  eadReader {.  co
3cd0: 6e 73 74 20 75 38 20 2a 61 3b 20 20 20 20 20 20  nst u8 *a;      
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3cf0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3d00: 6e 67 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ng position list
3d10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
3d40: 20 62 75 66 66 65 72 20 61 5b 5d 20 69 6e 20 62   buffer a[] in b
3d50: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ytes */.  int i;
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3d80: 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 70  rent offset in p
3d90: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
3da0: 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20 20 20    i64 iPos;     
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 6f 73    /* Current pos
3dd0: 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36 34 20 69  ition */.  i64 i
3de0: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
3e00: 78 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 7d  xt position */.}
3e10: 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  ;..#define FTS5_
3e20: 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46 20 28 28  LOOKAHEAD_EOF ((
3e30: 28 69 36 34 29 31 29 20 3c 3c 20 36 32 29 0a 0a  (i64)1) << 62)..
3e40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c  static int fts5L
3e50: 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 4e 65  ookaheadReaderNe
3e60: 78 74 28 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64  xt(Fts5Lookahead
3e70: 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 70 2d  Reader *p){.  p-
3e80: 3e 69 50 6f 73 20 3d 20 70 2d 3e 69 4c 6f 6f 6b  >iPos = p->iLook
3e90: 61 68 65 61 64 3b 0a 20 20 69 66 28 20 73 71 6c  ahead;.  if( sql
3ea0: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
3eb0: 65 78 74 36 34 28 70 2d 3e 61 2c 20 70 2d 3e 6e  ext64(p->a, p->n
3ec0: 2c 20 26 70 2d 3e 69 2c 20 26 70 2d 3e 69 4c 6f  , &p->i, &p->iLo
3ed0: 6f 6b 61 68 65 61 64 29 20 29 7b 0a 20 20 20 20  okahead) ){.    
3ee0: 70 2d 3e 69 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  p->iLookahead = 
3ef0: 46 54 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45  FTS5_LOOKAHEAD_E
3f00: 4f 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OF;.  }.  return
3f10: 20 28 70 2d 3e 69 50 6f 73 3d 3d 46 54 53 35 5f   (p->iPos==FTS5_
3f20: 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46 29 3b 0a  LOOKAHEAD_EOF);.
3f30: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
3f40: 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65  s5LookaheadReade
3f50: 72 49 6e 69 74 28 0a 20 20 63 6f 6e 73 74 20 75  rInit(.  const u
3f60: 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20  8 *a, int n,    
3f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
3f80: 65 72 20 74 6f 20 72 65 61 64 20 70 6f 73 69 74  er to read posit
3f90: 69 6f 6e 20 6c 69 73 74 20 66 72 6f 6d 20 2a 2f  ion list from */
3fa0: 0a 20 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64  .  Fts5Lookahead
3fb0: 52 65 61 64 65 72 20 2a 70 20 20 20 20 20 20 20  Reader *p       
3fc0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f     /* Iterator o
3fd0: 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c  bject to initial
3fe0: 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73  ize */.){.  mems
3ff0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
4000: 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61  Fts5LookaheadRea
4010: 64 65 72 29 29 3b 0a 20 20 70 2d 3e 61 20 3d 20  der));.  p->a = 
4020: 61 3b 0a 20 20 70 2d 3e 6e 20 3d 20 6e 3b 0a 20  a;.  p->n = n;. 
4030: 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
4040: 61 64 65 72 4e 65 78 74 28 70 29 3b 0a 20 20 72  aderNext(p);.  r
4050: 65 74 75 72 6e 20 66 74 73 35 4c 6f 6f 6b 61 68  eturn fts5Lookah
4060: 65 61 64 52 65 61 64 65 72 4e 65 78 74 28 70 29  eadReaderNext(p)
4070: 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
4080: 75 63 74 20 46 74 73 35 4e 65 61 72 54 72 69 6d  uct Fts5NearTrim
4090: 6d 65 72 20 46 74 73 35 4e 65 61 72 54 72 69 6d  mer Fts5NearTrim
40a0: 6d 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73 35  mer;.struct Fts5
40b0: 4e 65 61 72 54 72 69 6d 6d 65 72 20 7b 0a 20 20  NearTrimmer {.  
40c0: 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61  Fts5LookaheadRea
40d0: 64 65 72 20 72 65 61 64 65 72 3b 20 20 20 20 20  der reader;     
40e0: 2f 2a 20 49 6e 70 75 74 20 69 74 65 72 61 74 6f  /* Input iterato
40f0: 72 20 2a 2f 0a 20 20 46 74 73 35 50 6f 73 6c 69  r */.  Fts5Posli
4100: 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  stWriter writer;
4110: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
4120: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 46 74   context */.  Ft
4130: 73 35 42 75 66 66 65 72 20 2a 70 4f 75 74 3b 20  s5Buffer *pOut; 
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4150: 20 4f 75 74 70 75 74 20 70 6f 73 6c 69 73 74 20   Output poslist 
4160: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
4170: 20 6e 65 61 72 2d 73 65 74 20 6f 62 6a 65 63 74   near-set object
4180: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
4190: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63 6f  irst argument co
41a0: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
41b0: 0a 2a 2a 20 6f 6e 65 20 70 68 72 61 73 65 2e 20  .** one phrase. 
41c0: 41 6c 6c 20 70 68 72 61 73 65 73 20 63 75 72 72  All phrases curr
41d0: 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20 74  ently point to t
41e0: 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 54 68 65  he same row. The
41f0: 0a 2a 2a 20 46 74 73 35 45 78 70 72 50 68 72 61  .** Fts5ExprPhra
4200: 73 65 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65  se.poslist buffe
4210: 72 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64  rs are populated
4220: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68   accordingly. Th
4230: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74  is function.** t
4240: 65 73 74 73 20 69 66 20 74 68 65 20 63 75 72 72  ests if the curr
4250: 65 6e 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e 73  ent row contains
4260: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 65 61   instances of ea
4270: 63 68 20 70 68 72 61 73 65 20 73 75 66 66 69 63  ch phrase suffic
4280: 69 65 6e 74 6c 79 0a 2a 2a 20 63 6c 6f 73 65 20  iently.** close 
4290: 74 6f 67 65 74 68 65 72 20 74 6f 20 6d 65 65 74  together to meet
42a0: 20 74 68 65 20 4e 45 41 52 20 63 6f 6e 73 74 72   the NEAR constr
42b0: 61 69 6e 74 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69  aint. Non-zero i
42c0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74  s returned if it
42d0: 0a 2a 2a 20 64 6f 65 73 2c 20 6f 72 20 7a 65 72  .** does, or zer
42e0: 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  o otherwise..**.
42f0: 2a 2a 20 49 66 20 69 6e 2f 6f 75 74 20 70 61 72  ** If in/out par
4300: 61 6d 65 74 65 72 20 28 2a 70 52 63 29 20 69 73  ameter (*pRc) is
4310: 20 73 65 74 20 74 6f 20 6f 74 68 65 72 20 74 68   set to other th
4320: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  an SQLITE_OK whe
4330: 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
4340: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
4350: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 72 2c   is a no-op. Or,
4360: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65 2e   if an error (e.
4370: 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  g. SQLITE_NOMEM)
4380: 0a 2a 2a 20 6f 63 63 75 72 73 20 77 69 74 68 69  .** occurs withi
4390: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
43a0: 28 2a 70 52 63 29 20 69 73 20 73 65 74 20 61 63  (*pRc) is set ac
43b0: 63 6f 72 64 69 6e 67 6c 79 20 62 65 66 6f 72 65  cordingly before
43c0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54   returning..** T
43d0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
43e0: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
43f0: 62 6f 74 68 20 74 68 65 73 65 20 63 61 73 65 73  both these cases
4400: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 6e 6f 20 65  ..** .** If no e
4410: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
4420: 6e 6f 6e 2d 7a 65 72 6f 20 28 61 20 6d 61 74 63  non-zero (a matc
4430: 68 29 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  h) is returned, 
4440: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
4450: 74 0a 2a 2a 20 6f 66 20 65 61 63 68 20 70 68 72  t.** of each phr
4460: 61 73 65 20 6f 62 6a 65 63 74 20 69 73 20 65 64  ase object is ed
4470: 69 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ited to contain 
4480: 6f 6e 6c 79 20 74 68 6f 73 65 20 65 6e 74 72 69  only those entri
4490: 65 73 20 74 68 61 74 0a 2a 2a 20 6d 65 65 74 20  es that.** meet 
44a0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 62  the constraint b
44b0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
44c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
44d0: 74 73 35 45 78 70 72 4e 65 61 72 49 73 4d 61 74  ts5ExprNearIsMat
44e0: 63 68 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  ch(int *pRc, Fts
44f0: 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e  5ExprNearset *pN
4500: 65 61 72 29 7b 0a 20 20 46 74 73 35 4e 65 61 72  ear){.  Fts5Near
4510: 54 72 69 6d 6d 65 72 20 61 53 74 61 74 69 63 5b  Trimmer aStatic[
4520: 34 5d 3b 0a 20 20 46 74 73 35 4e 65 61 72 54 72  4];.  Fts5NearTr
4530: 69 6d 6d 65 72 20 2a 61 20 3d 20 61 53 74 61 74  immer *a = aStat
4540: 69 63 3b 0a 20 20 46 74 73 35 45 78 70 72 50 68  ic;.  Fts5ExprPh
4550: 72 61 73 65 20 2a 2a 61 70 50 68 72 61 73 65 20  rase **apPhrase 
4560: 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  = pNear->apPhras
4570: 65 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e;..  int i;.  i
4580: 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20  nt rc = *pRc;.  
4590: 69 6e 74 20 62 4d 61 74 63 68 3b 0a 0a 20 20 61  int bMatch;..  a
45a0: 73 73 65 72 74 28 20 70 4e 65 61 72 2d 3e 6e 50  ssert( pNear->nP
45b0: 68 72 61 73 65 3e 31 20 29 3b 0a 0a 20 20 2f 2a  hrase>1 );..  /*
45c0: 20 49 66 20 74 68 65 20 61 53 74 61 74 69 63 5b   If the aStatic[
45d0: 5d 20 61 72 72 61 79 20 69 73 20 6e 6f 74 20 6c  ] array is not l
45e0: 61 72 67 65 20 65 6e 6f 75 67 68 2c 20 61 6c 6c  arge enough, all
45f0: 6f 63 61 74 65 20 61 20 6c 61 72 67 65 20 61 72  ocate a large ar
4600: 72 61 79 0a 20 20 2a 2a 20 75 73 69 6e 67 20 73  ray.  ** using s
4610: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
4620: 20 54 68 69 73 20 61 70 70 72 6f 61 63 68 20 63   This approach c
4630: 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64  ould be improved
4640: 20 75 70 6f 6e 2e 20 2a 2f 0a 20 20 69 66 28 20   upon. */.  if( 
4650: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e 41  pNear->nPhrase>A
4660: 72 72 61 79 53 69 7a 65 28 61 53 74 61 74 69 63  rraySize(aStatic
4670: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4680: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
4690: 69 7a 65 6f 66 28 46 74 73 35 4e 65 61 72 54 72  izeof(Fts5NearTr
46a0: 69 6d 6d 65 72 29 20 2a 20 70 4e 65 61 72 2d 3e  immer) * pNear->
46b0: 6e 50 68 72 61 73 65 3b 0a 20 20 20 20 61 20 3d  nPhrase;.    a =
46c0: 20 28 46 74 73 35 4e 65 61 72 54 72 69 6d 6d 65   (Fts5NearTrimme
46d0: 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  r*)sqlite3Fts5Ma
46e0: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
46f0: 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
4700: 20 20 20 6d 65 6d 73 65 74 28 61 53 74 61 74 69     memset(aStati
4710: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 74  c, 0, sizeof(aSt
4720: 61 74 69 63 29 29 3b 0a 20 20 7d 0a 20 20 69 66  atic));.  }.  if
4730: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4740: 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  ){.    *pRc = rc
4750: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
4760: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
4770: 6c 69 7a 65 20 61 20 6c 6f 6f 6b 61 68 65 61 64  lize a lookahead
4780: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 65 61   iterator for ea
4790: 63 68 20 70 68 72 61 73 65 2e 20 41 66 74 65 72  ch phrase. After
47a0: 20 70 61 73 73 69 6e 67 20 74 68 65 0a 20 20 2a   passing the.  *
47b0: 2a 20 62 75 66 66 65 72 20 61 6e 64 20 62 75 66  * buffer and buf
47c0: 66 65 72 20 73 69 7a 65 20 74 6f 20 74 68 65 20  fer size to the 
47d0: 6c 6f 6f 6b 61 73 69 64 65 2d 72 65 61 64 65 72  lookaside-reader
47e0: 20 69 6e 69 74 20 66 75 6e 63 74 69 6f 6e 2c 20   init function, 
47f0: 7a 65 72 6f 0a 20 20 2a 2a 20 74 68 65 20 70 68  zero.  ** the ph
4800: 72 61 73 65 20 70 6f 73 6c 69 73 74 20 62 75 66  rase poslist buf
4810: 66 65 72 2e 20 54 68 65 20 6e 65 77 20 70 6f 73  fer. The new pos
4820: 6c 69 73 74 20 66 6f 72 20 74 68 65 20 70 68 72  list for the phr
4830: 61 73 65 20 28 63 6f 6e 74 61 69 6e 69 6e 67 0a  ase (containing.
4840: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 65 6e    ** the same en
4850: 74 72 69 65 73 20 61 73 20 74 68 65 20 6f 72 69  tries as the ori
4860: 67 69 6e 61 6c 20 77 69 74 68 20 73 6f 6d 65 20  ginal with some 
4870: 65 6e 74 72 69 65 73 20 72 65 6d 6f 76 65 64 20  entries removed 
4880: 6f 6e 20 61 63 63 6f 75 6e 74 20 0a 20 20 2a 2a  on account .  **
4890: 20 6f 66 20 74 68 65 20 4e 45 41 52 20 63 6f 6e   of the NEAR con
48a0: 73 74 72 61 69 6e 74 29 20 69 73 20 77 72 69 74  straint) is writ
48b0: 74 65 6e 20 6f 76 65 72 20 74 68 65 20 6f 72 69  ten over the ori
48c0: 67 69 6e 61 6c 20 65 76 65 6e 20 61 73 20 69 74  ginal even as it
48d0: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72   is.  ** being r
48e0: 65 61 64 2e 20 54 68 69 73 20 69 73 20 73 61 66  ead. This is saf
48f0: 65 20 61 73 20 74 68 65 20 65 6e 74 72 69 65 73  e as the entries
4900: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 6f 73   for the new pos
4910: 6c 69 73 74 20 61 72 65 20 61 0a 20 20 2a 2a 20  list are a.  ** 
4920: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 6f 6c  subset of the ol
4930: 64 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20  d, so it is not 
4940: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 64 61 74  possible for dat
4950: 61 20 79 65 74 20 74 6f 20 62 65 20 72 65 61 64  a yet to be read
4960: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 76 65 72   to.  ** be over
4970: 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 66  written.  */.  f
4980: 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d  or(i=0; i<pNear-
4990: 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a  >nPhrase; i++){.
49a0: 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a      Fts5Buffer *
49b0: 70 50 6f 73 6c 69 73 74 20 3d 20 26 61 70 50 68  pPoslist = &apPh
49c0: 72 61 73 65 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74  rase[i]->poslist
49d0: 3b 0a 20 20 20 20 66 74 73 35 4c 6f 6f 6b 61 68  ;.    fts5Lookah
49e0: 65 61 64 52 65 61 64 65 72 49 6e 69 74 28 70 50  eadReaderInit(pP
49f0: 6f 73 6c 69 73 74 2d 3e 70 2c 20 70 50 6f 73 6c  oslist->p, pPosl
4a00: 69 73 74 2d 3e 6e 2c 20 26 61 5b 69 5d 2e 72 65  ist->n, &a[i].re
4a10: 61 64 65 72 29 3b 0a 20 20 20 20 70 50 6f 73 6c  ader);.    pPosl
4a20: 69 73 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20  ist->n = 0;.    
4a30: 61 5b 69 5d 2e 70 4f 75 74 20 3d 20 70 50 6f 73  a[i].pOut = pPos
4a40: 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  list;.  }..  whi
4a50: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74  le( 1 ){.    int
4a60: 20 69 41 64 76 3b 0a 20 20 20 20 69 36 34 20 69   iAdv;.    i64 i
4a70: 4d 69 6e 3b 0a 20 20 20 20 69 36 34 20 69 4d 61  Min;.    i64 iMa
4a80: 78 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  x;..    /* This 
4a90: 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73 20 74  block advances t
4aa0: 68 65 20 70 68 72 61 73 65 20 69 74 65 72 61 74  he phrase iterat
4ab0: 6f 72 73 20 75 6e 74 69 6c 20 74 68 65 79 20 70  ors until they p
4ac0: 6f 69 6e 74 20 74 6f 20 61 20 73 65 74 20 6f 66  oint to a set of
4ad0: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20  .    ** entries 
4ae0: 74 68 61 74 20 74 6f 67 65 74 68 65 72 20 63 6f  that together co
4af0: 6d 70 72 69 73 65 20 61 20 6d 61 74 63 68 2e 20  mprise a match. 
4b00: 20 2a 2f 0a 20 20 20 20 69 4d 61 78 20 3d 20 61   */.    iMax = a
4b10: 5b 30 5d 2e 72 65 61 64 65 72 2e 69 50 6f 73 3b  [0].reader.iPos;
4b20: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
4b30: 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  bMatch = 1;.    
4b40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65    for(i=0; i<pNe
4b50: 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b  ar->nPhrase; i++
4b60: 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 4c  ){.        Fts5L
4b70: 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20 2a  ookaheadReader *
4b80: 70 50 6f 73 20 3d 20 26 61 5b 69 5d 2e 72 65 61  pPos = &a[i].rea
4b90: 64 65 72 3b 0a 20 20 20 20 20 20 20 20 69 4d 69  der;.        iMi
4ba0: 6e 20 3d 20 69 4d 61 78 20 2d 20 70 4e 65 61 72  n = iMax - pNear
4bb0: 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 2d 3e 6e  ->apPhrase[i]->n
4bc0: 54 65 72 6d 20 2d 20 70 4e 65 61 72 2d 3e 6e 4e  Term - pNear->nN
4bd0: 65 61 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ear;.        if(
4be0: 20 70 50 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e   pPos->iPos<iMin
4bf0: 20 7c 7c 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69   || pPos->iPos>i
4c00: 4d 61 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Max ){.         
4c10: 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20   bMatch = 0;.   
4c20: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50         while( pP
4c30: 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e 20 29 7b  os->iPos<iMin ){
4c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
4c50: 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
4c60: 61 64 65 72 4e 65 78 74 28 70 50 6f 73 29 20 29  aderNext(pPos) )
4c70: 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75   goto ismatch_ou
4c80: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
4c90: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 6f           if( pPo
4ca0: 73 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29 20 69  s->iPos>iMax ) i
4cb0: 4d 61 78 20 3d 20 70 50 6f 73 2d 3e 69 50 6f 73  Max = pPos->iPos
4cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4cd0: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
4ce0: 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20  bMatch==0 );..  
4cf0: 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
4d00: 79 20 74 6f 20 65 61 63 68 20 6f 75 74 70 75 74  y to each output
4d10: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
4d20: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
4d30: 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b  <pNear->nPhrase;
4d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 36 34   i++){.      i64
4d50: 20 69 50 6f 73 20 3d 20 61 5b 69 5d 2e 72 65 61   iPos = a[i].rea
4d60: 64 65 72 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20  der.iPos;.      
4d70: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
4d80: 72 20 2a 70 57 72 69 74 65 72 20 3d 20 26 61 5b  r *pWriter = &a[
4d90: 69 5d 2e 77 72 69 74 65 72 3b 0a 20 20 20 20 20  i].writer;.     
4da0: 20 69 66 28 20 61 5b 69 5d 2e 70 4f 75 74 2d 3e   if( a[i].pOut->
4db0: 6e 3d 3d 30 20 7c 7c 20 69 50 6f 73 21 3d 70 57  n==0 || iPos!=pW
4dc0: 72 69 74 65 72 2d 3e 69 50 72 65 76 20 29 7b 0a  riter->iPrev ){.
4dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
4de0: 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
4df0: 41 70 70 65 6e 64 28 61 5b 69 5d 2e 70 4f 75 74  Append(a[i].pOut
4e00: 2c 20 70 57 72 69 74 65 72 2c 20 69 50 6f 73 29  , pWriter, iPos)
4e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4e20: 0a 20 20 20 20 69 41 64 76 20 3d 20 30 3b 0a 20  .    iAdv = 0;. 
4e30: 20 20 20 69 4d 69 6e 20 3d 20 61 5b 30 5d 2e 72     iMin = a[0].r
4e40: 65 61 64 65 72 2e 69 4c 6f 6f 6b 61 68 65 61 64  eader.iLookahead
4e50: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4e60: 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b  <pNear->nPhrase;
4e70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4e80: 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c 6f   a[i].reader.iLo
4e90: 6f 6b 61 68 65 61 64 20 3c 20 69 4d 69 6e 20 29  okahead < iMin )
4ea0: 7b 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d  {.        iMin =
4eb0: 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c 6f   a[i].reader.iLo
4ec0: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20 20  okahead;.       
4ed0: 20 69 41 64 76 20 3d 20 69 3b 0a 20 20 20 20 20   iAdv = i;.     
4ee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4ef0: 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   fts5LookaheadRe
4f00: 61 64 65 72 4e 65 78 74 28 26 61 5b 69 41 64 76  aderNext(&a[iAdv
4f10: 5d 2e 72 65 61 64 65 72 29 20 29 20 67 6f 74 6f  ].reader) ) goto
4f20: 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20   ismatch_out;.  
4f30: 7d 0a 0a 20 20 69 73 6d 61 74 63 68 5f 6f 75 74  }..  ismatch_out
4f40: 3a 20 7b 0a 20 20 20 20 69 6e 74 20 62 52 65 74  : {.    int bRet
4f50: 20 3d 20 61 5b 30 5d 2e 70 4f 75 74 2d 3e 6e 3e   = a[0].pOut->n>
4f60: 30 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  0;.    *pRc = rc
4f70: 3b 0a 20 20 20 20 69 66 28 20 61 21 3d 61 53 74  ;.    if( a!=aSt
4f80: 61 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66  atic ) sqlite3_f
4f90: 72 65 65 28 61 29 3b 0a 20 20 20 20 72 65 74 75  ree(a);.    retu
4fa0: 72 6e 20 62 52 65 74 3b 0a 20 20 7d 0a 7d 0a 0a  rn bRet;.  }.}..
4fb0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
4fc0: 65 72 61 74 6f 72 20 70 49 74 65 72 20 75 6e 74  erator pIter unt
4fd0: 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
4fe0: 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74 6f  a value equal to
4ff0: 20 6f 72 20 6c 61 73 74 65 72 0a 2a 2a 20 74 68   or laster.** th
5000: 61 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  an the initial v
5010: 61 6c 75 65 20 6f 66 20 2a 70 69 4c 61 73 74 2e  alue of *piLast.
5020: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
5030: 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
5040: 74 73 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 75 65  ts.** to a value
5050: 20 6c 61 73 74 65 72 20 74 68 61 6e 20 2a 70 69   laster than *pi
5060: 4c 61 73 74 2c 20 75 70 64 61 74 65 20 2a 70 69  Last, update *pi
5070: 4c 61 73 74 20 74 6f 20 74 68 65 20 6e 65 77 20  Last to the new 
5080: 6c 61 73 74 65 73 74 20 76 61 6c 75 65 2e 0a 2a  lastest value..*
5090: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 74 65 72  *.** If the iter
50a0: 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
50b0: 2c 20 73 65 74 20 2a 70 62 45 6f 66 20 74 6f 20  , set *pbEof to 
50c0: 74 72 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  true before retu
50d0: 72 6e 69 6e 67 2e 20 49 66 0a 2a 2a 20 61 6e 20  rning. If.** an 
50e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
50f0: 74 20 2a 70 52 63 20 74 6f 20 61 6e 20 65 72 72  t *pRc to an err
5100: 6f 72 20 63 6f 64 65 2e 20 49 66 20 65 69 74 68  or code. If eith
5110: 65 72 20 2a 70 62 45 6f 66 20 6f 72 20 2a 70 52  er *pbEof or *pR
5120: 63 0a 2a 2a 20 61 72 65 20 73 65 74 2c 20 72 65  c.** are set, re
5130: 74 75 72 6e 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  turn a non-zero 
5140: 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65  value. Otherwise
5150: 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a  , return zero..*
5160: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
5170: 35 45 78 70 72 41 64 76 61 6e 63 65 74 6f 28 0a  5ExprAdvanceto(.
5180: 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
5190: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
51a0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
51b0: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
51c0: 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51e0: 20 54 72 75 65 20 69 66 20 69 74 65 72 61 74 6f   True if iterato
51f0: 72 20 69 73 20 22 72 6f 77 69 64 20 44 45 53 43  r is "rowid DESC
5200: 22 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61  " */.  i64 *piLa
5210: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
5220: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
5230: 3a 20 4c 61 73 74 65 73 74 20 72 6f 77 69 64 20  : Lastest rowid 
5240: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
5250: 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5270: 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 63   /* OUT: Error c
5280: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  ode */.  int *pb
5290: 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Eof             
52a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
52b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
52c0: 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  EOF */.){.  i64 
52d0: 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74 3b  iLast = *piLast;
52e0: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a  .  i64 iRowid;..
52f0: 20 20 69 52 6f 77 69 64 20 3d 20 70 49 74 65 72    iRowid = pIter
5300: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28 20  ->iRowid;.  if( 
5310: 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69 4c 61  (bDesc==0 && iLa
5320: 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20 28 62  st>iRowid) || (b
5330: 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c 69 52  Desc && iLast<iR
5340: 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 69 6e 74  owid) ){.    int
5350: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
5360: 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49  5IterNextFrom(pI
5370: 74 65 72 2c 20 69 4c 61 73 74 29 3b 0a 20 20 20  ter, iLast);.   
5380: 20 69 66 28 20 72 63 20 7c 7c 20 73 71 6c 69 74   if( rc || sqlit
5390: 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
53a0: 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  ter) ){.      *p
53b0: 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 2a  Rc = rc;.      *
53c0: 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20  pbEof = 1;.     
53d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
53e0: 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 70 49  .    iRowid = pI
53f0: 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20  ter->iRowid;.   
5400: 20 61 73 73 65 72 74 28 20 28 62 44 65 73 63 3d   assert( (bDesc=
5410: 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c  =0 && iRowid>=iL
5420: 61 73 74 29 20 7c 7c 20 28 62 44 65 73 63 3d 3d  ast) || (bDesc==
5430: 31 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61  1 && iRowid<=iLa
5440: 73 74 29 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 69  st) );.  }.  *pi
5450: 4c 61 73 74 20 3d 20 69 52 6f 77 69 64 3b 0a 0a  Last = iRowid;..
5460: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
5470: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
5480: 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e 63 65  prSynonymAdvance
5490: 74 6f 28 0a 20 20 46 74 73 35 45 78 70 72 54 65  to(.  Fts5ExprTe
54a0: 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
54b0: 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 69 74        /* Term it
54c0: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
54d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  e */.  int bDesc
54e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
54f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5500: 66 20 69 74 65 72 61 74 6f 72 20 69 73 20 22 72  f iterator is "r
5510: 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20  owid DESC" */.  
5520: 69 36 34 20 2a 70 69 4c 61 73 74 2c 20 20 20 20  i64 *piLast,    
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 61 73 74 65  /* IN/OUT: Laste
5550: 73 74 20 72 6f 77 69 64 20 73 65 65 6e 20 73 6f  st rowid seen so
5560: 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   far */.  int *p
5570: 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
5580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
5590: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
55a0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
55b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 36 34 20 69  LITE_OK;.  i64 i
55c0: 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74 3b 0a  Last = *piLast;.
55d0: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
55e0: 70 3b 0a 20 20 69 6e 74 20 62 45 6f 66 20 3d 20  p;.  int bEof = 
55f0: 30 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 54 65 72  0;..  for(p=pTer
5600: 6d 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  m; rc==SQLITE_OK
5610: 20 26 26 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e   && p; p=p->pSyn
5620: 6f 6e 79 6d 29 7b 0a 20 20 20 20 69 66 28 20 73  onym){.    if( s
5630: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
5640: 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20 29  f(p->pIter)==0 )
5650: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
5660: 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69  id = p->pIter->i
5670: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 66 28  Rowid;.      if(
5680: 20 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69 4c   (bDesc==0 && iL
5690: 61 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20 28  ast>iRowid) || (
56a0: 62 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c 69  bDesc && iLast<i
56b0: 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20  Rowid) ){.      
56c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
56d0: 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  s5IterNextFrom(p
56e0: 2d 3e 70 49 74 65 72 2c 20 69 4c 61 73 74 29 3b  ->pIter, iLast);
56f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5700: 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
5710: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
5720: 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 62 45  pRc = rc;.    bE
5730: 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
5740: 0a 20 20 20 20 2a 70 69 4c 61 73 74 20 3d 20 66  .    *piLast = f
5750: 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f  ts5ExprSynonymRo
5760: 77 69 64 28 70 54 65 72 6d 2c 20 62 44 65 73 63  wid(pTerm, bDesc
5770: 2c 20 26 62 45 6f 66 29 3b 0a 20 20 7d 0a 20 20  , &bEof);.  }.  
5780: 72 65 74 75 72 6e 20 62 45 6f 66 3b 0a 7d 0a 0a  return bEof;.}..
5790: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
57a0: 45 78 70 72 4e 65 61 72 54 65 73 74 28 0a 20 20  ExprNearTest(.  
57b0: 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35  int *pRc,.  Fts5
57c0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
57e0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 70  xpression that p
57f0: 4e 65 61 72 20 69 73 20 61 20 70 61 72 74 20 6f  Near is a part o
5800: 66 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e  f */.  Fts5ExprN
5810: 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20 20  ode *pNode      
5820: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 4e         /* The "N
5830: 45 41 52 22 20 6e 6f 64 65 20 28 46 54 53 35 5f  EAR" node (FTS5_
5840: 53 54 52 49 4e 47 29 20 2a 2f 0a 29 7b 0a 20 20  STRING) */.){.  
5850: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
5860: 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e  *pNear = pNode->
5870: 70 4e 65 61 72 3b 0a 20 20 69 6e 74 20 72 63 20  pNear;.  int rc 
5880: 3d 20 2a 70 52 63 3b 0a 0a 20 20 69 66 28 20 70  = *pRc;..  if( p
5890: 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  Expr->pConfig->e
58a0: 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54  Detail!=FTS5_DET
58b0: 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
58c0: 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
58d0: 65 72 6d 3b 0a 20 20 20 20 46 74 73 35 45 78 70  erm;.    Fts5Exp
58e0: 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
58f0: 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
5900: 73 65 5b 30 5d 3b 0a 20 20 20 20 70 50 68 72 61  se[0];.    pPhra
5910: 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20  se->poslist.n = 
5920: 30 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  0;.    for(pTerm
5930: 3d 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  =&pPhrase->aTerm
5940: 5b 30 5d 3b 20 70 54 65 72 6d 3b 20 70 54 65 72  [0]; pTerm; pTer
5950: 6d 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79  m=pTerm->pSynony
5960: 6d 29 7b 0a 20 20 20 20 20 20 46 74 73 35 49 6e  m){.      Fts5In
5970: 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  dexIter *pIter =
5980: 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0a 20   pTerm->pIter;. 
5990: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
59a0: 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65  Fts5IterEof(pIte
59b0: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
59c0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77   if( pIter->iRow
59d0: 69 64 3d 3d 70 4e 6f 64 65 2d 3e 69 52 6f 77 69  id==pNode->iRowi
59e0: 64 20 26 26 20 70 49 74 65 72 2d 3e 6e 44 61 74  d && pIter->nDat
59f0: 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  a>0 ){.         
5a00: 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73   pPhrase->poslis
5a10: 74 2e 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  t.n = 1;.       
5a20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5a30: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 68 72  .    return pPhr
5a40: 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a  ase->poslist.n;.
5a50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
5a60: 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   i;..    /* Chec
5a70: 6b 20 74 68 61 74 20 65 61 63 68 20 70 68 72 61  k that each phra
5a80: 73 65 20 69 6e 20 74 68 65 20 6e 65 61 72 73 65  se in the nearse
5a90: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 75  t matches the cu
5aa0: 72 72 65 6e 74 20 72 6f 77 2e 0a 20 20 20 20 2a  rrent row..    *
5ab0: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
5ac0: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 20  Phrase->poslist 
5ad0: 62 75 66 66 65 72 73 20 61 74 20 74 68 65 20 73  buffers at the s
5ae0: 61 6d 65 20 74 69 6d 65 2e 20 49 66 20 61 6e 79  ame time. If any
5af0: 0a 20 20 20 20 2a 2a 20 70 68 72 61 73 65 20 69  .    ** phrase i
5b00: 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 62  s not a match, b
5b10: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
5b20: 6c 6f 6f 70 20 65 61 72 6c 79 2e 20 20 2a 2f 0a  loop early.  */.
5b30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
5b40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
5b50: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20  pNear->nPhrase; 
5b60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i++){.      Fts5
5b70: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
5b80: 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50  ase = pNear->apP
5b90: 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20 20  hrase[i];.      
5ba0: 69 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54 65  if( pPhrase->nTe
5bb0: 72 6d 3e 31 20 7c 7c 20 70 50 68 72 61 73 65 2d  rm>1 || pPhrase-
5bc0: 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e  >aTerm[0].pSynon
5bd0: 79 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  ym .       || pN
5be0: 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 7c 7c 20  ear->pColset || 
5bf0: 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30  pPhrase->aTerm[0
5c00: 5d 2e 62 46 69 72 73 74 0a 20 20 20 20 20 20 29  ].bFirst.      )
5c10: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4d  {.        int bM
5c20: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
5c30: 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 50    rc = fts5ExprP
5c40: 68 72 61 73 65 49 73 4d 61 74 63 68 28 70 4e 6f  hraseIsMatch(pNo
5c50: 64 65 2c 20 70 50 68 72 61 73 65 2c 20 26 62 4d  de, pPhrase, &bM
5c60: 61 74 63 68 29 3b 0a 20 20 20 20 20 20 20 20 69  atch);.        i
5c70: 66 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 20 62  f( bMatch==0 ) b
5c80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
5c90: 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 49  e{.        Fts5I
5ca0: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
5cb0: 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  = pPhrase->aTerm
5cc0: 5b 30 5d 2e 70 49 74 65 72 3b 0a 20 20 20 20 20  [0].pIter;.     
5cd0: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
5ce0: 28 26 72 63 2c 20 26 70 50 68 72 61 73 65 2d 3e  (&rc, &pPhrase->
5cf0: 70 6f 73 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e  poslist, pIter->
5d00: 6e 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 70 44  nData, pIter->pD
5d10: 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata);.      }.  
5d20: 20 20 7d 0a 0a 20 20 20 20 2a 70 52 63 20 3d 20    }..    *pRc = 
5d30: 72 63 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70  rc;.    if( i==p
5d40: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20 26 26  Near->nPhrase &&
5d50: 20 28 69 3d 3d 31 20 7c 7c 20 66 74 73 35 45 78   (i==1 || fts5Ex
5d60: 70 72 4e 65 61 72 49 73 4d 61 74 63 68 28 70 52  prNearIsMatch(pR
5d70: 63 2c 20 70 4e 65 61 72 29 29 20 29 7b 0a 20 20  c, pNear)) ){.  
5d80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5d90: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
5da0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
5db0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 74  Initialize all t
5dc0: 65 72 6d 20 69 74 65 72 61 74 6f 72 73 20 69 6e  erm iterators in
5dd0: 20 74 68 65 20 70 4e 65 61 72 20 6f 62 6a 65 63   the pNear objec
5de0: 74 2e 20 49 66 20 61 6e 79 20 74 65 72 6d 20 69  t. If any term i
5df0: 73 20 66 6f 75 6e 64 0a 2a 2a 20 74 6f 20 6d 61  s found.** to ma
5e00: 74 63 68 20 6e 6f 20 64 6f 63 75 6d 65 6e 74 73  tch no documents
5e10: 20 61 74 20 61 6c 6c 2c 20 72 65 74 75 72 6e 20   at all, return 
5e20: 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68  immediately with
5e30: 6f 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  out initializing
5e40: 20 61 6e 79 0a 2a 2a 20 66 75 72 74 68 65 72 20   any.** further 
5e50: 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a  iterators..**.**
5e60: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
5e70: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  urs, return an S
5e80: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
5e90: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
5ea0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
5eb0: 2e 20 49 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73  . It is not cons
5ec0: 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
5ed0: 69 66 20 73 6f 6d 65 20 74 65 72 6d 20 6d 61 74  if some term mat
5ee0: 63 68 65 73 20 7a 65 72 6f 0a 2a 2a 20 64 6f 63  ches zero.** doc
5ef0: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  uments..*/.stati
5f00: 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e 65  c int fts5ExprNe
5f10: 61 72 49 6e 69 74 41 6c 6c 28 0a 20 20 46 74 73  arInitAll(.  Fts
5f20: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20  5Expr *pExpr,.  
5f30: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e  Fts5ExprNode *pN
5f40: 6f 64 65 0a 29 7b 0a 20 20 46 74 73 35 45 78 70  ode.){.  Fts5Exp
5f50: 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
5f60: 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b 0a  = pNode->pNear;.
5f70: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
5f80: 72 74 28 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61  rt( pNode->bNoma
5f90: 74 63 68 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  tch==0 );.  for(
5fa0: 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
5fb0: 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  hrase; i++){.   
5fc0: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
5fd0: 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72  *pPhrase = pNear
5fe0: 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20  ->apPhrase[i];. 
5ff0: 20 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e     if( pPhrase->
6000: 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nTerm==0 ){.    
6010: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
6020: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
6030: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
6040: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
6050: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
6060: 3b 20 6a 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65  ; j<pPhrase->nTe
6070: 72 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; j++){.      
6080: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
6090: 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
60a0: 2d 3e 61 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  ->aTerm[j];.    
60b0: 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
60c0: 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   *p;.        int
60d0: 20 62 48 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20   bHit = 0;..    
60e0: 20 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b      for(p=pTerm;
60f0: 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79   p; p=p->pSynony
6100: 6d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  m){.          in
6110: 74 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  t rc;.          
6120: 69 66 28 20 70 2d 3e 70 49 74 65 72 20 29 7b 0a  if( p->pIter ){.
6130: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6140: 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
6150: 28 70 2d 3e 70 49 74 65 72 29 3b 0a 20 20 20 20  (p->pIter);.    
6160: 20 20 20 20 20 20 20 20 70 2d 3e 70 49 74 65 72          p->pIter
6170: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
6180: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
6190: 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
61a0: 78 51 75 65 72 79 28 0a 20 20 20 20 20 20 20 20  xQuery(.        
61b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 49 6e        pExpr->pIn
61c0: 64 65 78 2c 20 70 2d 3e 7a 54 65 72 6d 2c 20 28  dex, p->zTerm, (
61d0: 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 54  int)strlen(p->zT
61e0: 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  erm),.          
61f0: 20 20 20 20 28 70 54 65 72 6d 2d 3e 62 50 72 65      (pTerm->bPre
6200: 66 69 78 20 3f 20 46 54 53 35 49 4e 44 45 58 5f  fix ? FTS5INDEX_
6210: 51 55 45 52 59 5f 50 52 45 46 49 58 20 3a 20 30  QUERY_PREFIX : 0
6220: 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) |.            
6230: 20 20 28 70 45 78 70 72 2d 3e 62 44 65 73 63 20    (pExpr->bDesc 
6240: 3f 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  ? FTS5INDEX_QUER
6250: 59 5f 44 45 53 43 20 3a 20 30 29 2c 0a 20 20 20  Y_DESC : 0),.   
6260: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 61 72             pNear
6270: 2d 3e 70 43 6f 6c 73 65 74 2c 0a 20 20 20 20 20  ->pColset,.     
6280: 20 20 20 20 20 20 20 20 20 26 70 2d 3e 70 49 74           &p->pIt
6290: 65 72 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  er.          );.
62a0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
62b0: 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
62c0: 29 3d 3d 28 70 2d 3e 70 49 74 65 72 21 3d 30 29  )==(p->pIter!=0)
62d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
62e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
62f0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
6300: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71         if( 0==sq
6310: 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
6320: 28 70 2d 3e 70 49 74 65 72 29 20 29 7b 0a 20 20  (p->pIter) ){.  
6330: 20 20 20 20 20 20 20 20 20 20 62 48 69 74 20 3d            bHit =
6340: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
6350: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
6360: 20 20 20 69 66 28 20 62 48 69 74 3d 3d 30 20 29     if( bHit==0 )
6370: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64  {.          pNod
6380: 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  e->bEof = 1;.   
6390: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
63a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
63b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
63c0: 0a 20 20 7d 0a 0a 20 20 70 4e 6f 64 65 2d 3e 62  .  }..  pNode->b
63d0: 45 6f 66 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Eof = 0;.  retur
63e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
63f0: 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  /*.** If pExpr i
6400: 73 20 61 6e 20 41 53 43 20 69 74 65 72 61 74 6f  s an ASC iterato
6410: 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
6420: 20 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65   returns a value
6430: 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 61 6d   with the.** sam
6440: 65 20 73 69 67 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  e sign as:.**.**
6450: 20 20 20 28 69 4c 68 73 20 2d 20 69 52 68 73 29     (iLhs - iRhs)
6460: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
6470: 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 44  , if this is a D
6480: 45 53 43 20 69 74 65 72 61 74 6f 72 2c 20 74 68  ESC iterator, th
6490: 65 20 6f 70 70 6f 73 69 74 65 20 69 73 20 72 65  e opposite is re
64a0: 74 75 72 6e 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  turned:.**.**   
64b0: 28 69 52 68 73 20 2d 20 69 4c 68 73 29 0a 2a 2f  (iRhs - iLhs).*/
64c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
64d0: 52 6f 77 69 64 43 6d 70 28 0a 20 20 46 74 73 35  RowidCmp(.  Fts5
64e0: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 69  Expr *pExpr,.  i
64f0: 36 34 20 69 4c 68 73 2c 0a 20 20 69 36 34 20 69  64 iLhs,.  i64 i
6500: 52 68 73 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  Rhs.){.  assert(
6510: 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d 30   pExpr->bDesc==0
6520: 20 7c 7c 20 70 45 78 70 72 2d 3e 62 44 65 73 63   || pExpr->bDesc
6530: 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 45 78  ==1 );.  if( pEx
6540: 70 72 2d 3e 62 44 65 73 63 3d 3d 30 20 29 7b 0a  pr->bDesc==0 ){.
6550: 20 20 20 20 69 66 28 20 69 4c 68 73 3c 69 52 68      if( iLhs<iRh
6560: 73 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  s ) return -1;. 
6570: 20 20 20 72 65 74 75 72 6e 20 28 69 4c 68 73 20     return (iLhs 
6580: 3e 20 69 52 68 73 29 3b 0a 20 20 7d 65 6c 73 65  > iRhs);.  }else
6590: 7b 0a 20 20 20 20 69 66 28 20 69 4c 68 73 3e 69  {.    if( iLhs>i
65a0: 52 68 73 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  Rhs ) return -1;
65b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 4c 68  .    return (iLh
65c0: 73 20 3c 20 69 52 68 73 29 3b 0a 20 20 7d 0a 7d  s < iRhs);.  }.}
65d0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
65e0: 73 35 45 78 70 72 53 65 74 45 6f 66 28 46 74 73  s5ExprSetEof(Fts
65f0: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
6600: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  ){.  int i;.  pN
6610: 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  ode->bEof = 1;. 
6620: 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68   pNode->bNomatch
6630: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
6640: 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
6650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35  ; i++){.    fts5
6660: 45 78 70 72 53 65 74 45 6f 66 28 70 4e 6f 64 65  ExprSetEof(pNode
6670: 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20  ->apChild[i]);. 
6680: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
6690: 64 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65  d fts5ExprNodeZe
66a0: 72 6f 50 6f 73 6c 69 73 74 28 46 74 73 35 45 78  roPoslist(Fts5Ex
66b0: 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  prNode *pNode){.
66c0: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54 79    if( pNode->eTy
66d0: 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20  pe==FTS5_STRING 
66e0: 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  || pNode->eType=
66f0: 3d 46 54 53 35 5f 54 45 52 4d 20 29 7b 0a 20 20  =FTS5_TERM ){.  
6700: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
6710: 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65  t *pNear = pNode
6720: 2d 3e 70 4e 65 61 72 3b 0a 20 20 20 20 69 6e 74  ->pNear;.    int
6730: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
6740: 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   i<pNear->nPhras
6750: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  e; i++){.      F
6760: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
6770: 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e  Phrase = pNear->
6780: 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20  apPhrase[i];.   
6790: 20 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c     pPhrase->posl
67a0: 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ist.n = 0;.    }
67b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
67c0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
67d0: 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
67e0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  d; i++){.      f
67f0: 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
6800: 6f 73 6c 69 73 74 28 70 4e 6f 64 65 2d 3e 61 70  oslist(pNode->ap
6810: 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 7d  Child[i]);.    }
6820: 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  .  }.}..../*.** 
6830: 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
6840: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64  es currently ind
6850: 69 63 61 74 65 64 20 62 79 20 74 68 65 20 74 77  icated by the tw
6860: 6f 20 6e 6f 64 65 73 20 61 73 20 66 6f 6c 6c 6f  o nodes as follo
6870: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 72 65 73  ws:.**.**    res
6880: 20 3d 20 28 2a 70 31 29 20 2d 20 28 2a 70 32 29   = (*p1) - (*p2)
6890: 0a 2a 2a 0a 2a 2a 20 4e 6f 64 65 73 20 74 68 61  .**.** Nodes tha
68a0: 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 75 65  t point to value
68b0: 73 20 74 68 61 74 20 63 6f 6d 65 20 6c 61 74 65  s that come late
68c0: 72 20 69 6e 20 74 68 65 20 69 74 65 72 61 74 69  r in the iterati
68d0: 6f 6e 20 6f 72 64 65 72 20 61 72 65 0a 2a 2a 20  on order are.** 
68e0: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
68f0: 20 6c 61 72 67 65 72 2e 20 4e 6f 64 65 73 20 61   larger. Nodes a
6900: 74 20 45 4f 46 20 61 72 65 20 74 68 65 20 6c 61  t EOF are the la
6910: 72 67 65 73 74 20 6f 66 20 61 6c 6c 2e 0a 2a 2a  rgest of all..**
6920: 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74  .** This means t
6930: 68 61 74 20 69 66 20 74 68 65 20 69 74 65 72 61  hat if the itera
6940: 74 69 6f 6e 20 6f 72 64 65 72 20 69 73 20 41 53  tion order is AS
6950: 43 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 61  C, then numerica
6960: 6c 6c 79 20 6c 61 72 67 65 72 0a 2a 2a 20 72 6f  lly larger.** ro
6970: 77 69 64 73 20 61 72 65 20 63 6f 6e 73 69 64 65  wids are conside
6980: 72 65 64 20 6c 61 72 67 65 72 2e 20 4f 72 20 69  red larger. Or i
6990: 66 20 69 74 20 69 73 20 74 68 65 20 64 65 66 61  f it is the defa
69a0: 75 6c 74 20 44 45 53 43 2c 20 6e 75 6d 65 72 69  ult DESC, numeri
69b0: 63 61 6c 6c 79 0a 2a 2a 20 73 6d 61 6c 6c 65 72  cally.** smaller
69c0: 20 72 6f 77 69 64 73 20 61 72 65 20 6c 61 72 67   rowids are larg
69d0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
69e0: 74 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61 72  t fts5NodeCompar
69f0: 65 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  e(.  Fts5Expr *p
6a00: 45 78 70 72 2c 0a 20 20 46 74 73 35 45 78 70 72  Expr,.  Fts5Expr
6a10: 4e 6f 64 65 20 2a 70 31 2c 20 0a 20 20 46 74 73  Node *p1, .  Fts
6a20: 35 45 78 70 72 4e 6f 64 65 20 2a 70 32 0a 29 7b  5ExprNode *p2.){
6a30: 0a 20 20 69 66 28 20 70 32 2d 3e 62 45 6f 66 20  .  if( p2->bEof 
6a40: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69  ) return -1;.  i
6a50: 66 28 20 70 31 2d 3e 62 45 6f 66 20 29 20 72 65  f( p1->bEof ) re
6a60: 74 75 72 6e 20 2b 31 3b 0a 20 20 72 65 74 75 72  turn +1;.  retur
6a70: 6e 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70  n fts5RowidCmp(p
6a80: 45 78 70 72 2c 20 70 31 2d 3e 69 52 6f 77 69 64  Expr, p1->iRowid
6a90: 2c 20 70 32 2d 3e 69 52 6f 77 69 64 29 3b 0a 7d  , p2->iRowid);.}
6aa0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 69 6e 64 69  ../*.** All indi
6ab0: 76 69 64 75 61 6c 20 74 65 72 6d 20 69 74 65 72  vidual term iter
6ac0: 61 74 6f 72 73 20 69 6e 20 70 4e 65 61 72 20 61  ators in pNear a
6ad0: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
6ae0: 20 62 65 20 76 61 6c 69 64 20 77 68 65 6e 0a 2a   be valid when.*
6af0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
6b00: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20  is called. This 
6b10: 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
6b20: 69 66 20 61 6c 6c 20 74 65 72 6d 20 69 74 65 72  if all term iter
6b30: 61 74 6f 72 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  ators.** point t
6b40: 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69 64  o the same rowid
6b50: 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 61 64  , and if not, ad
6b60: 76 61 6e 63 65 73 20 74 68 65 6d 20 75 6e 74 69  vances them unti
6b70: 6c 20 74 68 65 79 20 64 6f 2e 0a 2a 2a 20 49 66  l they do..** If
6b80: 20 61 6e 20 45 4f 46 20 69 73 20 72 65 61 63 68   an EOF is reach
6b90: 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 68  ed before this h
6ba0: 61 70 70 65 6e 73 2c 20 2a 70 62 45 6f 66 20 69  appens, *pbEof i
6bb0: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 62 65  s set to true be
6bc0: 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
6bd0: 67 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  g..**.** SQLITE_
6be0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
6bf0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6c00: 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s, or an SQLite 
6c10: 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 6f  error code .** o
6c20: 74 68 65 72 77 69 73 65 2e 20 49 74 20 69 73 20  therwise. It is 
6c30: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
6c40: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
6c50: 61 6e 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  an iterator reac
6c60: 68 65 73 0a 2a 2a 20 45 4f 46 2e 0a 2a 2f 0a 73  hes.** EOF..*/.s
6c70: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78  tatic int fts5Ex
6c80: 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52 49 4e  prNodeTest_STRIN
6c90: 47 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  G(.  Fts5Expr *p
6ca0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
6cb0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6cc0: 6f 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f 6e  on pPhrase belon
6cd0: 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 45  gs to */.  Fts5E
6ce0: 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 0a 29  xprNode *pNode.)
6cf0: 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72  {.  Fts5ExprNear
6d00: 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f  set *pNear = pNo
6d10: 64 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 46 74 73  de->pNear;.  Fts
6d20: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 4c 65  5ExprPhrase *pLe
6d30: 66 74 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68  ft = pNear->apPh
6d40: 72 61 73 65 5b 30 5d 3b 0a 20 20 69 6e 74 20 72  rase[0];.  int r
6d50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6d60: 20 69 36 34 20 69 4c 61 73 74 3b 20 20 20 20 20   i64 iLast;     
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d80: 20 2f 2a 20 4c 61 73 74 65 73 74 20 72 6f 77 69   /* Lastest rowi
6d90: 64 20 61 6e 79 20 69 74 65 72 61 74 6f 72 20 70  d any iterator p
6da0: 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  oints to */.  in
6db0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6dd0: 20 50 68 72 61 73 65 20 61 6e 64 20 74 6f 6b 65   Phrase and toke
6de0: 6e 20 69 6e 64 65 78 2c 20 72 65 73 70 65 63 74  n index, respect
6df0: 69 76 65 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62  ively */.  int b
6e00: 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  Match;          
6e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
6e20: 75 65 20 69 66 20 61 6c 6c 20 74 65 72 6d 73 20  ue if all terms 
6e30: 61 72 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  are at the same 
6e40: 72 6f 77 69 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rowid */.  const
6e50: 20 69 6e 74 20 62 44 65 73 63 20 3d 20 70 45 78   int bDesc = pEx
6e60: 70 72 2d 3e 62 44 65 73 63 3b 0a 0a 20 20 2f 2a  pr->bDesc;..  /*
6e70: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
6e80: 20 6e 6f 64 65 20 73 68 6f 75 6c 64 20 6e 6f 74   node should not
6e90: 20 62 65 20 46 54 53 35 5f 54 45 52 4d 20 2a 2f   be FTS5_TERM */
6ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 61 72  .  assert( pNear
6eb0: 2d 3e 6e 50 68 72 61 73 65 3e 31 20 0a 20 20 20  ->nPhrase>1 .   
6ec0: 20 20 20 20 7c 7c 20 70 4e 65 61 72 2d 3e 61 70      || pNear->ap
6ed0: 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54 65 72 6d  Phrase[0]->nTerm
6ee0: 3e 31 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  >1 .       || pN
6ef0: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
6f00: 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f  ->aTerm[0].pSyno
6f10: 6e 79 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e  nym.       || pN
6f20: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
6f30: 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73  ->aTerm[0].bFirs
6f40: 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  t.  );..  /* Ini
6f50: 74 69 61 6c 69 7a 65 20 69 4c 61 73 74 2c 20 74  tialize iLast, t
6f60: 68 65 20 22 6c 61 73 74 65 73 74 22 20 72 6f 77  he "lastest" row
6f70: 69 64 20 61 6e 79 20 69 74 65 72 61 74 6f 72 20  id any iterator 
6f80: 70 6f 69 6e 74 73 20 74 6f 2e 20 49 66 20 74 68  points to. If th
6f90: 65 0a 20 20 2a 2a 20 69 74 65 72 61 74 6f 72 20  e.  ** iterator 
6fa0: 73 6b 69 70 73 20 74 68 72 6f 75 67 68 20 72 6f  skips through ro
6fb0: 77 69 64 73 20 69 6e 20 74 68 65 20 64 65 66 61  wids in the defa
6fc0: 75 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72  ult ascending or
6fd0: 64 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a  der, this means.
6fe0: 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
6ff0: 20 72 6f 77 69 64 2e 20 4f 72 2c 20 69 66 20 74   rowid. Or, if t
7000: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 22  he iterator is "
7010: 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
7020: 45 53 43 22 2c 20 74 68 65 6e 20 69 74 0a 20 20  ESC", then it.  
7030: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 6d 69 6e  ** means the min
7040: 69 6d 75 6d 20 72 6f 77 69 64 2e 20 20 2a 2f 0a  imum rowid.  */.
7050: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 61 54 65    if( pLeft->aTe
7060: 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 20 29  rm[0].pSynonym )
7070: 7b 0a 20 20 20 20 69 4c 61 73 74 20 3d 20 66 74  {.    iLast = ft
7080: 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77  s5ExprSynonymRow
7090: 69 64 28 26 70 4c 65 66 74 2d 3e 61 54 65 72 6d  id(&pLeft->aTerm
70a0: 5b 30 5d 2c 20 62 44 65 73 63 2c 20 30 29 3b 0a  [0], bDesc, 0);.
70b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4c 61    }else{.    iLa
70c0: 73 74 20 3d 20 70 4c 65 66 74 2d 3e 61 54 65 72  st = pLeft->aTer
70d0: 6d 5b 30 5d 2e 70 49 74 65 72 2d 3e 69 52 6f 77  m[0].pIter->iRow
70e0: 69 64 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a  id;.  }..  do {.
70f0: 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a      bMatch = 1;.
7100: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7110: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69  Near->nPhrase; i
7120: 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45  ++){.      Fts5E
7130: 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61  xprPhrase *pPhra
7140: 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68  se = pNear->apPh
7150: 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20 20 66  rase[i];.      f
7160: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 68 72 61 73  or(j=0; j<pPhras
7170: 65 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 29 7b 0a  e->nTerm; j++){.
7180: 20 20 20 20 20 20 20 20 46 74 73 35 45 78 70 72          Fts5Expr
7190: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
71a0: 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 6a 5d  Phrase->aTerm[j]
71b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
71c0: 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 7b  erm->pSynonym ){
71d0: 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
71e0: 52 6f 77 69 64 20 3d 20 66 74 73 35 45 78 70 72  Rowid = fts5Expr
71f0: 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70 54 65  SynonymRowid(pTe
7200: 72 6d 2c 20 62 44 65 73 63 2c 20 30 29 3b 0a 20  rm, bDesc, 0);. 
7210: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
7220: 77 69 64 3d 3d 69 4c 61 73 74 20 29 20 63 6f 6e  wid==iLast ) con
7230: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7240: 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20   bMatch = 0;.   
7250: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 45         if( fts5E
7260: 78 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e 63  xprSynonymAdvanc
7270: 65 74 6f 28 70 54 65 72 6d 2c 20 62 44 65 73 63  eto(pTerm, bDesc
7280: 2c 20 26 69 4c 61 73 74 2c 20 26 72 63 29 20 29  , &iLast, &rc) )
7290: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  {.            pN
72a0: 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20  ode->bNomatch = 
72b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
72c0: 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Node->bEof = 1;.
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
72e0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
72f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
7300: 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35  {.          Fts5
7310: 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
7320: 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72   = pPhrase->aTer
7330: 6d 5b 6a 5d 2e 70 49 74 65 72 3b 0a 20 20 20 20  m[j].pIter;.    
7340: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
7350: 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 20 7c  >iRowid==iLast |
7360: 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 29 20  | pIter->bEof ) 
7370: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7380: 20 20 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a      bMatch = 0;.
7390: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74            if( ft
73a0: 73 35 45 78 70 72 41 64 76 61 6e 63 65 74 6f 28  s5ExprAdvanceto(
73b0: 70 49 74 65 72 2c 20 62 44 65 73 63 2c 20 26 69  pIter, bDesc, &i
73c0: 4c 61 73 74 2c 20 26 72 63 2c 20 26 70 4e 6f 64  Last, &rc, &pNod
73d0: 65 2d 3e 62 45 6f 66 29 20 29 7b 0a 20 20 20 20  e->bEof) ){.    
73e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
73f0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
7400: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7410: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
7420: 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20   bMatch==0 );.. 
7430: 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d   pNode->iRowid =
7440: 20 69 4c 61 73 74 3b 0a 20 20 70 4e 6f 64 65 2d   iLast;.  pNode-
7450: 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28 28 30 3d  >bNomatch = ((0=
7460: 3d 66 74 73 35 45 78 70 72 4e 65 61 72 54 65 73  =fts5ExprNearTes
7470: 74 28 26 72 63 2c 20 70 45 78 70 72 2c 20 70 4e  t(&rc, pExpr, pN
7480: 6f 64 65 29 29 20 26 26 20 72 63 3d 3d 53 51 4c  ode)) && rc==SQL
7490: 49 54 45 5f 4f 4b 29 3b 0a 20 20 61 73 73 65 72  ITE_OK);.  asser
74a0: 74 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d  t( pNode->bEof==
74b0: 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  0 || pNode->bNom
74c0: 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  atch==0 );..  re
74d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
74e0: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 66 69  * Advance the fi
74f0: 72 73 74 20 74 65 72 6d 20 69 74 65 72 61 74 6f  rst term iterato
7500: 72 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 70  r in the first p
7510: 68 72 61 73 65 20 6f 66 20 70 4e 65 61 72 2e 20  hrase of pNear. 
7520: 53 65 74 20 6f 75 74 70 75 74 0a 2a 2a 20 76 61  Set output.** va
7530: 72 69 61 62 6c 65 20 2a 70 62 45 6f 66 20 74 6f  riable *pbEof to
7540: 20 74 72 75 65 20 69 66 20 69 74 20 72 65 61 63   true if it reac
7550: 68 65 73 20 45 4f 46 20 6f 72 20 69 66 20 61 6e  hes EOF or if an
7560: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
7570: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
7580: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
7590: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
75a0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
75b0: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
75c0: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
75d0: 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  t fts5ExprNodeNe
75e0: 78 74 5f 53 54 52 49 4e 47 28 0a 20 20 46 74 73  xt_STRING(.  Fts
75f0: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  5Expr *pExpr,   
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7610: 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72 61  Expression pPhra
7620: 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  se belongs to */
7630: 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
7640: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
7650: 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 52 49 4e     /* FTS5_STRIN
7660: 47 20 6f 72 20 46 54 53 35 5f 54 45 52 4d 20 6e  G or FTS5_TERM n
7670: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46 72  ode */.  int bFr
7680: 6f 6d 56 61 6c 69 64 2c 0a 20 20 69 36 34 20 69  omValid,.  i64 i
7690: 46 72 6f 6d 20 0a 29 7b 0a 20 20 46 74 73 35 45  From .){.  Fts5E
76a0: 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  xprTerm *pTerm =
76b0: 20 26 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d 3e   &pNode->pNear->
76c0: 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 61 54 65  apPhrase[0]->aTe
76d0: 72 6d 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20  rm[0];.  int rc 
76e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
76f0: 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20  pNode->bNomatch 
7700: 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d  = 0;.  if( pTerm
7710: 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 7b 0a 20 20  ->pSynonym ){.  
7720: 20 20 69 6e 74 20 62 45 6f 66 20 3d 20 31 3b 0a    int bEof = 1;.
7730: 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
7740: 20 2a 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e   *p;..    /* Fin
7750: 64 20 74 68 65 20 66 69 72 73 74 65 73 74 20 72  d the firstest r
7760: 6f 77 69 64 20 61 6e 79 20 73 79 6e 6f 6e 79 6d  owid any synonym
7770: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 2a 2f 0a 20   points to. */. 
7780: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
7790: 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52  fts5ExprSynonymR
77a0: 6f 77 69 64 28 70 54 65 72 6d 2c 20 70 45 78 70  owid(pTerm, pExp
77b0: 72 2d 3e 62 44 65 73 63 2c 20 30 29 3b 0a 0a 20  r->bDesc, 0);.. 
77c0: 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61     /* Advance ea
77d0: 63 68 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  ch iterator that
77e0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
77f0: 73 20 74 6f 20 69 52 6f 77 69 64 2e 20 4f 72 2c  s to iRowid. Or,
7800: 20 69 66 20 69 46 72 6f 6d 0a 20 20 20 20 2a 2a   if iFrom.    **
7810: 20 69 73 20 76 61 6c 69 64 20 2d 20 65 61 63 68   is valid - each
7820: 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 70   iterator that p
7830: 6f 69 6e 74 73 20 74 6f 20 61 20 72 6f 77 69 64  oints to a rowid
7840: 20 62 65 66 6f 72 65 20 69 46 72 6f 6d 2e 20 20   before iFrom.  
7850: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 65  */.    for(p=pTe
7860: 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e  rm; p; p=p->pSyn
7870: 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20 69 66 28  onym){.      if(
7880: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
7890: 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30  Eof(p->pIter)==0
78a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
78b0: 69 69 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e 69  ii = p->pIter->i
78c0: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 69  Rowid;.        i
78d0: 66 28 20 69 69 3d 3d 69 52 6f 77 69 64 20 0a 20  f( ii==iRowid . 
78e0: 20 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72 6f          || (bFro
78f0: 6d 56 61 6c 69 64 20 26 26 20 69 69 21 3d 69 46  mValid && ii!=iF
7900: 72 6f 6d 20 26 26 20 28 69 69 3e 69 46 72 6f 6d  rom && (ii>iFrom
7910: 29 3d 3d 70 45 78 70 72 2d 3e 62 44 65 73 63 29  )==pExpr->bDesc)
7920: 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
7930: 20 20 20 20 20 20 20 69 66 28 20 62 46 72 6f 6d         if( bFrom
7940: 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Valid ){.       
7950: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7960: 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f  3Fts5IterNextFro
7970: 6d 28 70 2d 3e 70 49 74 65 72 2c 20 69 46 72 6f  m(p->pIter, iFro
7980: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  m);.          }e
7990: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
79a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
79b0: 35 49 74 65 72 4e 65 78 74 28 70 2d 3e 70 49 74  5IterNext(p->pIt
79c0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
79d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
79e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
79f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
7a00: 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 49  if( sqlite3Fts5I
7a10: 74 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29  terEof(p->pIter)
7a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7a30: 20 20 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20     bEof = 0;.   
7a40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7a60: 20 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20    bEof = 0;.    
7a70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7a80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
7a90: 74 68 65 20 45 4f 46 20 66 6c 61 67 20 69 66 20  the EOF flag if 
7aa0: 65 69 74 68 65 72 20 61 6c 6c 20 73 79 6e 6f 6e  either all synon
7ab0: 79 6d 20 69 74 65 72 61 74 6f 72 73 20 61 72 65  ym iterators are
7ac0: 20 61 74 20 45 4f 46 20 6f 72 20 61 6e 0a 20 20   at EOF or an.  
7ad0: 20 20 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 6f    ** error has o
7ae0: 63 63 75 72 72 65 64 2e 20 20 2a 2f 0a 20 20 20  ccurred.  */.   
7af0: 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 28   pNode->bEof = (
7b00: 72 63 20 7c 7c 20 62 45 6f 66 29 3b 0a 20 20 7d  rc || bEof);.  }
7b10: 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 49 6e  else{.    Fts5In
7b20: 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  dexIter *pIter =
7b30: 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0a 0a   pTerm->pIter;..
7b40: 20 20 20 20 61 73 73 65 72 74 28 20 46 74 73 35      assert( Fts5
7b50: 4e 6f 64 65 49 73 53 74 72 69 6e 67 28 70 4e 6f  NodeIsString(pNo
7b60: 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 62  de) );.    if( b
7b70: 46 72 6f 6d 56 61 6c 69 64 20 29 7b 0a 20 20 20  FromValid ){.   
7b80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
7b90: 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ts5IterNextFrom(
7ba0: 70 49 74 65 72 2c 20 69 46 72 6f 6d 29 3b 0a 20  pIter, iFrom);. 
7bb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7bc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
7bd0: 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b  IterNext(pIter);
7be0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 6f 64  .    }..    pNod
7bf0: 65 2d 3e 62 45 6f 66 20 3d 20 28 72 63 20 7c 7c  e->bEof = (rc ||
7c00: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
7c10: 45 6f 66 28 70 49 74 65 72 29 29 3b 0a 20 20 7d  Eof(pIter));.  }
7c20: 0a 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62  ..  if( pNode->b
7c30: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Eof==0 ){.    as
7c40: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
7c50: 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
7c60: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
7c70: 5f 53 54 52 49 4e 47 28 70 45 78 70 72 2c 20 70  _STRING(pExpr, p
7c80: 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Node);.  }..  re
7c90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
7ca0: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
7cb0: 4e 6f 64 65 54 65 73 74 5f 54 45 52 4d 28 0a 20  NodeTest_TERM(. 
7cc0: 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
7cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7ce0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
7cf0: 68 61 74 20 70 4e 65 61 72 20 69 73 20 61 20 70  hat pNear is a p
7d00: 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35  art of */.  Fts5
7d10: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  ExprNode *pNode 
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7d30: 68 65 20 22 4e 45 41 52 22 20 6e 6f 64 65 20 28  he "NEAR" node (
7d40: 46 54 53 35 5f 54 45 52 4d 29 20 2a 2f 0a 29 7b  FTS5_TERM) */.){
7d50: 0a 20 20 2f 2a 20 41 73 20 74 68 69 73 20 22 4e  .  /* As this "N
7d60: 45 41 52 22 20 6f 62 6a 65 63 74 20 69 73 20 61  EAR" object is a
7d70: 63 74 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  ctually a single
7d80: 20 70 68 72 61 73 65 20 74 68 61 74 20 63 6f 6e   phrase that con
7d90: 73 69 73 74 73 20 0a 20 20 2a 2a 20 6f 66 20 61  sists .  ** of a
7da0: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 6e 6c   single term onl
7db0: 79 2c 20 67 72 61 62 20 70 6f 69 6e 74 65 72 73  y, grab pointers
7dc0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 73 6c 69 73   into the poslis
7dd0: 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65  t managed by the
7de0: 0a 20 20 2a 2a 20 66 74 73 35 5f 69 6e 64 65 78  .  ** fts5_index
7df0: 2e 63 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  .c iterator obje
7e00: 63 74 2e 20 54 68 69 73 20 69 73 20 6d 75 63 68  ct. This is much
7e10: 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 79 6e   faster than syn
7e20: 74 68 65 73 69 7a 69 6e 67 20 0a 20 20 2a 2a 20  thesizing .  ** 
7e30: 61 20 6e 65 77 20 70 6f 73 6c 69 73 74 20 74 68  a new poslist th
7e40: 65 20 77 61 79 20 77 65 20 68 61 76 65 20 74 6f  e way we have to
7e50: 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6c 69   for more compli
7e60: 63 61 74 65 64 20 70 68 72 61 73 65 20 6f 72 20  cated phrase or 
7e70: 4e 45 41 52 0a 20 20 2a 2a 20 65 78 70 72 65 73  NEAR.  ** expres
7e80: 73 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 46 74 73  sions.  */.  Fts
7e90: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
7ea0: 72 61 73 65 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e  rase = pNode->pN
7eb0: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
7ec0: 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ;.  Fts5IndexIte
7ed0: 72 20 2a 70 49 74 65 72 20 3d 20 70 50 68 72 61  r *pIter = pPhra
7ee0: 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74  se->aTerm[0].pIt
7ef0: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  er;..  assert( p
7f00: 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Node->eType==FTS
7f10: 35 5f 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  5_TERM );.  asse
7f20: 72 74 28 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72  rt( pNode->pNear
7f30: 2d 3e 6e 50 68 72 61 73 65 3d 3d 31 20 26 26 20  ->nPhrase==1 && 
7f40: 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3d 3d  pPhrase->nTerm==
7f50: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
7f60: 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d  Phrase->aTerm[0]
7f70: 2e 70 53 79 6e 6f 6e 79 6d 3d 3d 30 20 29 3b 0a  .pSynonym==0 );.
7f80: 0a 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  .  pPhrase->posl
7f90: 69 73 74 2e 6e 20 3d 20 70 49 74 65 72 2d 3e 6e  ist.n = pIter->n
7fa0: 44 61 74 61 3b 0a 20 20 69 66 28 20 70 45 78 70  Data;.  if( pExp
7fb0: 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  r->pConfig->eDet
7fc0: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
7fd0: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 70 50 68  _FULL ){.    pPh
7fe0: 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 70 20  rase->poslist.p 
7ff0: 3d 20 28 75 38 2a 29 70 49 74 65 72 2d 3e 70 44  = (u8*)pIter->pD
8000: 61 74 61 3b 0a 20 20 7d 0a 20 20 70 4e 6f 64 65  ata;.  }.  pNode
8010: 2d 3e 69 52 6f 77 69 64 20 3d 20 70 49 74 65 72  ->iRowid = pIter
8020: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 4e 6f 64  ->iRowid;.  pNod
8030: 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28 70  e->bNomatch = (p
8040: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e  Phrase->poslist.
8050: 6e 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  n==0);.  return 
8060: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8070: 0a 2a 2a 20 78 4e 65 78 74 28 29 20 6d 65 74 68  .** xNext() meth
8080: 6f 64 20 66 6f 72 20 61 20 6e 6f 64 65 20 6f 66  od for a node of
8090: 20 74 79 70 65 20 46 54 53 35 5f 54 45 52 4d 2e   type FTS5_TERM.
80a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
80b0: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f  ts5ExprNodeNext_
80c0: 54 45 52 4d 28 0a 20 20 46 74 73 35 45 78 70 72  TERM(.  Fts5Expr
80d0: 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74 73 35   *pExpr, .  Fts5
80e0: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  ExprNode *pNode,
80f0: 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69  .  int bFromVali
8100: 64 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d 0a 29  d,.  i64 iFrom.)
8110: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 74  {.  int rc;.  Ft
8120: 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
8130: 65 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  er = pNode->pNea
8140: 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e  r->apPhrase[0]->
8150: 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 3b 0a  aTerm[0].pIter;.
8160: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  .  assert( pNode
8170: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69  ->bEof==0 );.  i
8180: 66 28 20 62 46 72 6f 6d 56 61 6c 69 64 20 29 7b  f( bFromValid ){
8190: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
81a0: 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f  3Fts5IterNextFro
81b0: 6d 28 70 49 74 65 72 2c 20 69 46 72 6f 6d 29 3b  m(pIter, iFrom);
81c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
81d0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74   = sqlite3Fts5It
81e0: 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20  erNext(pIter);. 
81f0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
8200: 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
8210: 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74  3Fts5IterEof(pIt
8220: 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  er)==0 ){.    rc
8230: 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54   = fts5ExprNodeT
8240: 65 73 74 5f 54 45 52 4d 28 70 45 78 70 72 2c 20  est_TERM(pExpr, 
8250: 70 4e 6f 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  pNode);.  }else{
8260: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66  .    pNode->bEof
8270: 20 3d 20 31 3b 0a 20 20 20 20 70 4e 6f 64 65 2d   = 1;.    pNode-
8280: 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20  >bNomatch = 0;. 
8290: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
82a0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
82b0: 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f  ts5ExprNodeTest_
82c0: 4f 52 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a  OR(.  Fts5Expr *
82d0: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
82e0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
82f0: 69 6f 6e 20 6f 66 20 77 68 69 63 68 20 70 4e 6f  ion of which pNo
8300: 64 65 20 69 73 20 61 20 70 61 72 74 20 2a 2f 0a  de is a part */.
8310: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
8320: 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  pNode           
8330: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
8340: 6e 6f 64 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a  node to test */.
8350: 29 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  ){.  Fts5ExprNod
8360: 65 20 2a 70 4e 65 78 74 20 3d 20 70 4e 6f 64 65  e *pNext = pNode
8370: 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 3b 0a 20 20  ->apChild[0];.  
8380: 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d  int i;..  for(i=
8390: 31 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69  1; i<pNode->nChi
83a0: 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  ld; i++){.    Ft
83b0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 43 68 69  s5ExprNode *pChi
83c0: 6c 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68  ld = pNode->apCh
83d0: 69 6c 64 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ild[i];.    int 
83e0: 63 6d 70 20 3d 20 66 74 73 35 4e 6f 64 65 43 6f  cmp = fts5NodeCo
83f0: 6d 70 61 72 65 28 70 45 78 70 72 2c 20 70 4e 65  mpare(pExpr, pNe
8400: 78 74 2c 20 70 43 68 69 6c 64 29 3b 0a 20 20 20  xt, pChild);.   
8410: 20 69 66 28 20 63 6d 70 3e 30 20 7c 7c 20 28 63   if( cmp>0 || (c
8420: 6d 70 3d 3d 30 20 26 26 20 70 43 68 69 6c 64 2d  mp==0 && pChild-
8430: 3e 62 4e 6f 6d 61 74 63 68 3d 3d 30 29 20 29 7b  >bNomatch==0) ){
8440: 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
8450: 43 68 69 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  Child;.    }.  }
8460: 0a 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64  .  pNode->iRowid
8470: 20 3d 20 70 4e 65 78 74 2d 3e 69 52 6f 77 69 64   = pNext->iRowid
8480: 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20  ;.  pNode->bEof 
8490: 3d 20 70 4e 65 78 74 2d 3e 62 45 6f 66 3b 0a 20  = pNext->bEof;. 
84a0: 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68   pNode->bNomatch
84b0: 20 3d 20 70 4e 65 78 74 2d 3e 62 4e 6f 6d 61 74   = pNext->bNomat
84c0: 63 68 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ch;.}..static in
84d0: 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65  t fts5ExprNodeNe
84e0: 78 74 5f 4f 52 28 0a 20 20 46 74 73 35 45 78 70  xt_OR(.  Fts5Exp
84f0: 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74 73  r *pExpr, .  Fts
8500: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
8510: 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c  ,.  int bFromVal
8520: 69 64 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d 0a  id,.  i64 iFrom.
8530: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 36  ){.  int i;.  i6
8540: 34 20 69 4c 61 73 74 20 3d 20 70 4e 6f 64 65 2d  4 iLast = pNode-
8550: 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 66 6f 72 28  >iRowid;..  for(
8560: 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43  i=0; i<pNode->nC
8570: 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  hild; i++){.    
8580: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 31  Fts5ExprNode *p1
8590: 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c   = pNode->apChil
85a0: 64 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  d[i];.    assert
85b0: 28 20 70 31 2d 3e 62 45 6f 66 20 7c 7c 20 66 74  ( p1->bEof || ft
85c0: 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72  s5RowidCmp(pExpr
85d0: 2c 20 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69 4c  , p1->iRowid, iL
85e0: 61 73 74 29 3e 3d 30 20 29 3b 0a 20 20 20 20 69  ast)>=0 );.    i
85f0: 66 28 20 70 31 2d 3e 62 45 6f 66 3d 3d 30 20 29  f( p1->bEof==0 )
8600: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 31 2d  {.      if( (p1-
8610: 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 29 20  >iRowid==iLast) 
8620: 0a 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72 6f  .       || (bFro
8630: 6d 56 61 6c 69 64 20 26 26 20 66 74 73 35 52 6f  mValid && fts5Ro
8640: 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 70 31  widCmp(pExpr, p1
8650: 2d 3e 69 52 6f 77 69 64 2c 20 69 46 72 6f 6d 29  ->iRowid, iFrom)
8660: 3c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  <0).      ){.   
8670: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74       int rc = ft
8680: 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70  s5ExprNodeNext(p
8690: 45 78 70 72 2c 20 70 31 2c 20 62 46 72 6f 6d 56  Expr, p1, bFromV
86a0: 61 6c 69 64 2c 20 69 46 72 6f 6d 29 3b 0a 20 20  alid, iFrom);.  
86b0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
86c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
86d0: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d       pNode->bNom
86e0: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
86f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
8720: 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f  s5ExprNodeTest_O
8730: 52 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b  R(pExpr, pNode);
8740: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8750: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  _OK;.}../*.** Ar
8760: 67 75 6d 65 6e 74 20 70 4e 6f 64 65 20 69 73 20  gument pNode is 
8770: 61 6e 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64 65  an FTS5_AND node
8780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8790: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
87a0: 5f 41 4e 44 28 0a 20 20 46 74 73 35 45 78 70 72  _AND(.  Fts5Expr
87b0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
87c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
87d0: 73 73 69 6f 6e 20 70 50 68 72 61 73 65 20 62 65  ssion pPhrase be
87e0: 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74  longs to */.  Ft
87f0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 41 6e 64  s5ExprNode *pAnd
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8810: 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64 65 20 74   FTS5_AND node t
8820: 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a  o advance */.){.
8830: 20 20 69 6e 74 20 69 43 68 69 6c 64 3b 0a 20 20    int iChild;.  
8840: 69 36 34 20 69 4c 61 73 74 20 3d 20 70 41 6e 64  i64 iLast = pAnd
8850: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  ->iRowid;.  int 
8860: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8870: 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 0a 20    int bMatch;.. 
8880: 20 61 73 73 65 72 74 28 20 70 41 6e 64 2d 3e 62   assert( pAnd->b
8890: 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 64 6f 20 7b  Eof==0 );.  do {
88a0: 0a 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61  .    pAnd->bNoma
88b0: 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 62 4d 61  tch = 0;.    bMa
88c0: 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  tch = 1;.    for
88d0: 28 69 43 68 69 6c 64 3d 30 3b 20 69 43 68 69 6c  (iChild=0; iChil
88e0: 64 3c 70 41 6e 64 2d 3e 6e 43 68 69 6c 64 3b 20  d<pAnd->nChild; 
88f0: 69 43 68 69 6c 64 2b 2b 29 7b 0a 20 20 20 20 20  iChild++){.     
8900: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
8910: 43 68 69 6c 64 20 3d 20 70 41 6e 64 2d 3e 61 70  Child = pAnd->ap
8920: 43 68 69 6c 64 5b 69 43 68 69 6c 64 5d 3b 0a 20  Child[iChild];. 
8930: 20 20 20 20 20 69 6e 74 20 63 6d 70 20 3d 20 66       int cmp = f
8940: 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70  ts5RowidCmp(pExp
8950: 72 2c 20 69 4c 61 73 74 2c 20 70 43 68 69 6c 64  r, iLast, pChild
8960: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
8970: 20 69 66 28 20 63 6d 70 3e 30 20 29 7b 0a 20 20   if( cmp>0 ){.  
8980: 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
8990: 20 70 43 68 69 6c 64 20 75 6e 74 69 6c 20 69 74   pChild until it
89a0: 20 70 6f 69 6e 74 73 20 74 6f 20 69 4c 61 73 74   points to iLast
89b0: 20 6f 72 20 6c 61 73 74 65 72 20 2a 2f 0a 20 20   or laster */.  
89c0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45        rc = fts5E
89d0: 78 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70  xprNodeNext(pExp
89e0: 72 2c 20 70 43 68 69 6c 64 2c 20 31 2c 20 69 4c  r, pChild, 1, iL
89f0: 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ast);.        if
8a00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8a10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  ){.          pAn
8a20: 64 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b  d->bNomatch = 0;
8a30: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8a40: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
8a50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
8a60: 2a 20 49 66 20 74 68 65 20 63 68 69 6c 64 20 6e  * If the child n
8a70: 6f 64 65 20 69 73 20 6e 6f 77 20 61 74 20 45 4f  ode is now at EO
8a80: 46 2c 20 73 6f 20 69 73 20 74 68 65 20 70 61 72  F, so is the par
8a90: 65 6e 74 20 41 4e 44 20 6e 6f 64 65 2e 20 4f 74  ent AND node. Ot
8aa0: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
8ab0: 2a 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65  * the child node
8ac0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
8ad0: 6f 20 68 61 76 65 20 61 64 76 61 6e 63 65 64 20  o have advanced 
8ae0: 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20  at least as far 
8af0: 61 73 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69  as.      ** rowi
8b00: 64 20 69 4c 61 73 74 2e 20 53 6f 20 69 66 20 69  d iLast. So if i
8b10: 74 20 69 73 20 6e 6f 74 20 61 74 20 65 78 61 63  t is not at exac
8b20: 74 6c 79 20 69 4c 61 73 74 2c 20 70 43 68 69 6c  tly iLast, pChil
8b30: 64 2d 3e 69 52 6f 77 69 64 20 69 73 20 74 68 65  d->iRowid is the
8b40: 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 6c 61  .      ** new la
8b50: 73 74 65 73 74 20 72 6f 77 69 64 20 73 65 65 6e  stest rowid seen
8b60: 20 73 6f 20 66 61 72 2e 20 20 2a 2f 0a 20 20 20   so far.  */.   
8b70: 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
8b80: 64 2d 3e 62 45 6f 66 20 7c 7c 20 66 74 73 35 52  d->bEof || fts5R
8b90: 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 69  owidCmp(pExpr, i
8ba0: 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d 3e 69 52  Last, pChild->iR
8bb0: 6f 77 69 64 29 3c 3d 30 20 29 3b 0a 20 20 20 20  owid)<=0 );.    
8bc0: 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 62 45    if( pChild->bE
8bd0: 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  of ){.        ft
8be0: 73 35 45 78 70 72 53 65 74 45 6f 66 28 70 41 6e  s5ExprSetEof(pAn
8bf0: 64 29 3b 0a 20 20 20 20 20 20 20 20 62 4d 61 74  d);.        bMat
8c00: 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
8c10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
8c20: 73 65 20 69 66 28 20 69 4c 61 73 74 21 3d 70 43  se if( iLast!=pC
8c30: 68 69 6c 64 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  hild->iRowid ){.
8c40: 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d          bMatch =
8c50: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 4c 61 73   0;.        iLas
8c60: 74 20 3d 20 70 43 68 69 6c 64 2d 3e 69 52 6f 77  t = pChild->iRow
8c70: 69 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  id;.      }..   
8c80: 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 62     if( pChild->b
8c90: 4e 6f 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  Nomatch ){.     
8ca0: 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63     pAnd->bNomatc
8cb0: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 1;.      }. 
8cc0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 62     }.  }while( b
8cd0: 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20 69  Match==0 );..  i
8ce0: 66 28 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74 63  f( pAnd->bNomatc
8cf0: 68 20 26 26 20 70 41 6e 64 21 3d 70 45 78 70 72  h && pAnd!=pExpr
8d00: 2d 3e 70 52 6f 6f 74 20 29 7b 0a 20 20 20 20 66  ->pRoot ){.    f
8d10: 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
8d20: 6f 73 6c 69 73 74 28 70 41 6e 64 29 3b 0a 20 20  oslist(pAnd);.  
8d30: 7d 0a 20 20 70 41 6e 64 2d 3e 69 52 6f 77 69 64  }.  pAnd->iRowid
8d40: 20 3d 20 69 4c 61 73 74 3b 0a 20 20 72 65 74 75   = iLast;.  retu
8d50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8d70: 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 41 4e 44  ExprNodeNext_AND
8d80: 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  (.  Fts5Expr *pE
8d90: 78 70 72 2c 20 0a 20 20 46 74 73 35 45 78 70 72  xpr, .  Fts5Expr
8da0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 69  Node *pNode,.  i
8db0: 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a 20  nt bFromValid,. 
8dc0: 20 69 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20 20   i64 iFrom.){.  
8dd0: 69 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78 70  int rc = fts5Exp
8de0: 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c  rNodeNext(pExpr,
8df0: 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
8e00: 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20  0], bFromValid, 
8e10: 69 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72 63  iFrom);.  if( rc
8e20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8e30: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
8e40: 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28 70 45 78  NodeTest_AND(pEx
8e50: 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 65  pr, pNode);.  }e
8e60: 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  lse{.    pNode->
8e70: 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20  bNomatch = 0;.  
8e80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8e90: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
8ea0: 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4e 4f  5ExprNodeTest_NO
8eb0: 54 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  T(.  Fts5Expr *p
8ec0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
8ed0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
8ee0: 6f 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f 6e  on pPhrase belon
8ef0: 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 45  gs to */.  Fts5E
8f00: 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20  xprNode *pNode  
8f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
8f20: 53 35 5f 4e 4f 54 20 6e 6f 64 65 20 74 6f 20 61  S5_NOT node to a
8f30: 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20 69  dvance */.){.  i
8f40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8f50: 4b 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  K;.  Fts5ExprNod
8f60: 65 20 2a 70 31 20 3d 20 70 4e 6f 64 65 2d 3e 61  e *p1 = pNode->a
8f70: 70 43 68 69 6c 64 5b 30 5d 3b 0a 20 20 46 74 73  pChild[0];.  Fts
8f80: 35 45 78 70 72 4e 6f 64 65 20 2a 70 32 20 3d 20  5ExprNode *p2 = 
8f90: 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 31  pNode->apChild[1
8fa0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f  ];.  assert( pNo
8fb0: 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 32 20 29 3b  de->nChild==2 );
8fc0: 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
8fd0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 2d 3e  QLITE_OK && p1->
8fe0: 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  bEof==0 ){.    i
8ff0: 6e 74 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f 64  nt cmp = fts5Nod
9000: 65 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 20  eCompare(pExpr, 
9010: 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 69 66 28  p1, p2);.    if(
9020: 20 63 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20 20   cmp>0 ){.      
9030: 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
9040: 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70 32 2c  eNext(pExpr, p2,
9050: 20 31 2c 20 70 31 2d 3e 69 52 6f 77 69 64 29 3b   1, p1->iRowid);
9060: 0a 20 20 20 20 20 20 63 6d 70 20 3d 20 66 74 73  .      cmp = fts
9070: 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45 78  5NodeCompare(pEx
9080: 70 72 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 20  pr, p1, p2);.   
9090: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
90a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
90b0: 63 6d 70 3c 3d 30 20 29 3b 0a 20 20 20 20 69 66  cmp<=0 );.    if
90c0: 28 20 63 6d 70 20 7c 7c 20 70 32 2d 3e 62 4e 6f  ( cmp || p2->bNo
90d0: 6d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  match ) break;. 
90e0: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
90f0: 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20  NodeNext(pExpr, 
9100: 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  p1, 0, 0);.  }. 
9110: 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 70   pNode->bEof = p
9120: 31 2d 3e 62 45 6f 66 3b 0a 20 20 70 4e 6f 64 65  1->bEof;.  pNode
9130: 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 70 31 2d  ->bNomatch = p1-
9140: 3e 62 4e 6f 6d 61 74 63 68 3b 0a 20 20 70 4e 6f  >bNomatch;.  pNo
9150: 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 31 2d  de->iRowid = p1-
9160: 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28 20 70  >iRowid;.  if( p
9170: 31 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20 66  1->bEof ){.    f
9180: 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f 50  ts5ExprNodeZeroP
9190: 6f 73 6c 69 73 74 28 70 32 29 3b 0a 20 20 7d 0a  oslist(p2);.  }.
91a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
91b0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45  static int fts5E
91c0: 78 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54 28  xprNodeNext_NOT(
91d0: 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78  .  Fts5Expr *pEx
91e0: 70 72 2c 20 0a 20 20 46 74 73 35 45 78 70 72 4e  pr, .  Fts5ExprN
91f0: 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 69 6e  ode *pNode,.  in
9200: 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a 20 20  t bFromValid,.  
9210: 69 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20 20 69  i64 iFrom.){.  i
9220: 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78 70 72  nt rc = fts5Expr
9230: 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20  NodeNext(pExpr, 
9240: 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 30  pNode->apChild[0
9250: 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20 69  ], bFromValid, i
9260: 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72 63 3d  From);.  if( rc=
9270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9280: 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
9290: 6f 64 65 54 65 73 74 5f 4e 4f 54 28 70 45 78 70  odeTest_NOT(pExp
92a0: 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 20  r, pNode);.  }. 
92b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
92c0: 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d  OK ){.    pNode-
92d0: 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20  >bNomatch = 0;. 
92e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
92f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 4e 6f 64  }../*.** If pNod
9300: 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  e currently poin
9310: 74 73 20 74 6f 20 61 20 6d 61 74 63 68 2c 20 74  ts to a match, t
9320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
9330: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  urns SQLITE_OK.*
9340: 2a 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66 79  * without modify
9350: 69 6e 67 20 69 74 2e 20 4f 74 68 65 72 77 69 73  ing it. Otherwis
9360: 65 2c 20 70 4e 6f 64 65 20 69 73 20 61 64 76 61  e, pNode is adva
9370: 6e 63 65 64 20 75 6e 74 69 6c 20 69 74 20 64 6f  nced until it do
9380: 65 73 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 61  es point.** to a
9390: 20 6d 61 74 63 68 20 6f 72 20 45 4f 46 20 69 73   match or EOF is
93a0: 20 72 65 61 63 68 65 64 2e 0a 2a 2f 0a 73 74 61   reached..*/.sta
93b0: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
93c0: 4e 6f 64 65 54 65 73 74 28 0a 20 20 46 74 73 35  NodeTest(.  Fts5
93d0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
93f0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 77 68 69  xpression of whi
9400: 63 68 20 70 4e 6f 64 65 20 69 73 20 61 20 70 61  ch pNode is a pa
9410: 72 74 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  rt */.  Fts5Expr
9420: 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20  Node *pNode     
9430: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
9440: 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 74 65  ssion node to te
9450: 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  st */.){.  int r
9460: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9470: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66   if( pNode->bEof
9480: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 77 69 74 63  ==0 ){.    switc
9490: 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20  h( pNode->eType 
94a0: 29 7b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 46  ){..      case F
94b0: 54 53 35 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20  TS5_STRING: {.  
94c0: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 45        rc = fts5E
94d0: 78 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52 49  xprNodeTest_STRI
94e0: 4e 47 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29  NG(pExpr, pNode)
94f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9500: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9510: 63 61 73 65 20 46 54 53 35 5f 54 45 52 4d 3a 20  case FTS5_TERM: 
9520: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
9530: 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f  ts5ExprNodeTest_
9540: 54 45 52 4d 28 70 45 78 70 72 2c 20 70 4e 6f 64  TERM(pExpr, pNod
9550: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
9560: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
9570: 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a    case FTS5_AND:
9580: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
9590: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
95a0: 5f 41 4e 44 28 70 45 78 70 72 2c 20 70 4e 6f 64  _AND(pExpr, pNod
95b0: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
95c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
95d0: 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20    case FTS5_OR: 
95e0: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 45 78  {.        fts5Ex
95f0: 70 72 4e 6f 64 65 54 65 73 74 5f 4f 52 28 70 45  prNodeTest_OR(pE
9600: 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20  xpr, pNode);.   
9610: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9620: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
9630: 6c 74 3a 20 61 73 73 65 72 74 28 20 70 4e 6f 64  lt: assert( pNod
9640: 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e  e->eType==FTS5_N
9650: 4f 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20  OT ); {.        
9660: 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  rc = fts5ExprNod
9670: 65 54 65 73 74 5f 4e 4f 54 28 70 45 78 70 72 2c  eTest_NOT(pExpr,
9680: 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   pNode);.       
9690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
96a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
96b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 20 0a 2f 2a 0a 2a  rn rc;.}.. ./*.*
96c0: 2a 20 53 65 74 20 6e 6f 64 65 20 70 4e 6f 64 65  * Set node pNode
96d0: 2c 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20  , which is part 
96e0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
96f0: 78 70 72 2c 20 74 6f 20 70 6f 69 6e 74 20 74 6f  xpr, to point to
9700: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6d 61   the first.** ma
9710: 74 63 68 2e 20 49 66 20 74 68 65 72 65 20 61 72  tch. If there ar
9720: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 73 65  e no matches, se
9730: 74 20 74 68 65 20 4e 6f 64 65 2e 62 45 6f 66 20  t the Node.bEof 
9740: 66 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  flag to indicate
9750: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75   EOF..**.** Retu
9760: 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
9770: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
9780: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 53  ror occurs, or S
9790: 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77 69  QLITE_OK otherwi
97a0: 73 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  se..** It is not
97b0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
97c0: 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65  re are no matche
97d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
97e0: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72   fts5ExprNodeFir
97f0: 73 74 28 46 74 73 35 45 78 70 72 20 2a 70 45 78  st(Fts5Expr *pEx
9800: 70 72 2c 20 46 74 73 35 45 78 70 72 4e 6f 64 65  pr, Fts5ExprNode
9810: 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20   *pNode){.  int 
9820: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9830: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
9840: 30 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  0;.  pNode->bNom
9850: 61 74 63 68 20 3d 20 30 3b 0a 0a 20 20 69 66 28  atch = 0;..  if(
9860: 20 46 74 73 35 4e 6f 64 65 49 73 53 74 72 69 6e   Fts5NodeIsStrin
9870: 67 28 70 4e 6f 64 65 29 20 29 7b 0a 20 20 20 20  g(pNode) ){.    
9880: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c  /* Initialize al
9890: 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72 73  l term iterators
98a0: 20 69 6e 20 74 68 65 20 4e 45 41 52 20 6f 62 6a   in the NEAR obj
98b0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ect. */.    rc =
98c0: 20 66 74 73 35 45 78 70 72 4e 65 61 72 49 6e 69   fts5ExprNearIni
98d0: 74 41 6c 6c 28 70 45 78 70 72 2c 20 70 4e 6f 64  tAll(pExpr, pNod
98e0: 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e);.  }else if( 
98f0: 70 4e 6f 64 65 2d 3e 78 4e 65 78 74 3d 3d 30 20  pNode->xNext==0 
9900: 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45  ){.    pNode->bE
9910: 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
9920: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9930: 69 6e 74 20 6e 45 6f 66 20 3d 20 30 3b 0a 20 20  int nEof = 0;.  
9940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f    for(i=0; i<pNo
9950: 64 65 2d 3e 6e 43 68 69 6c 64 20 26 26 20 72 63  de->nChild && rc
9960: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
9970: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  ){.      Fts5Exp
9980: 72 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d 20  rNode *pChild = 
9990: 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b 69  pNode->apChild[i
99a0: 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ];.      rc = ft
99b0: 73 35 45 78 70 72 4e 6f 64 65 46 69 72 73 74 28  s5ExprNodeFirst(
99c0: 70 45 78 70 72 2c 20 70 4e 6f 64 65 2d 3e 61 70  pExpr, pNode->ap
99d0: 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 20  Child[i]);.     
99e0: 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
99f0: 3e 62 45 6f 66 3d 3d 30 20 7c 7c 20 70 43 68 69  >bEof==0 || pChi
9a00: 6c 64 2d 3e 62 45 6f 66 3d 3d 31 20 29 3b 0a 20  ld->bEof==1 );. 
9a10: 20 20 20 20 20 6e 45 6f 66 20 2b 3d 20 70 43 68       nEof += pCh
9a20: 69 6c 64 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 7d  ild->bEof;.    }
9a30: 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77  .    pNode->iRow
9a40: 69 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68  id = pNode->apCh
9a50: 69 6c 64 5b 30 5d 2d 3e 69 52 6f 77 69 64 3b 0a  ild[0]->iRowid;.
9a60: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4e 6f  .    switch( pNo
9a70: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  de->eType ){.   
9a80: 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44     case FTS5_AND
9a90: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 45  :.        if( nE
9aa0: 6f 66 3e 30 20 29 20 66 74 73 35 45 78 70 72 53  of>0 ) fts5ExprS
9ab0: 65 74 45 6f 66 28 70 4e 6f 64 65 29 3b 0a 20 20  etEof(pNode);.  
9ac0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
9ad0: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52      case FTS5_OR
9ae0: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  :.        if( pN
9af0: 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 6e 45 6f  ode->nChild==nEo
9b00: 66 20 29 20 66 74 73 35 45 78 70 72 53 65 74 45  f ) fts5ExprSetE
9b10: 6f 66 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20  of(pNode);.     
9b20: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
9b30: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
9b40: 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
9b50: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f 54  >eType==FTS5_NOT
9b60: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64   );.        pNod
9b70: 65 2d 3e 62 45 6f 66 20 3d 20 70 4e 6f 64 65 2d  e->bEof = pNode-
9b80: 3e 61 70 43 68 69 6c 64 5b 30 5d 2d 3e 62 45 6f  >apChild[0]->bEo
9b90: 66 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  f;.        break
9ba0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
9bb0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9bc0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
9bd0: 35 45 78 70 72 4e 6f 64 65 54 65 73 74 28 70 45  5ExprNodeTest(pE
9be0: 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d  xpr, pNode);.  }
9bf0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9c00: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 69 74  ../*.** Begin it
9c10: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
9c20: 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75 6d  the set of docum
9c30: 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 70 49  ents in index pI
9c40: 64 78 20 6d 61 74 63 68 65 64 20 62 79 0a 2a 2a  dx matched by.**
9c50: 20 74 68 65 20 4d 41 54 43 48 20 65 78 70 72 65   the MATCH expre
9c60: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
9c70: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
9c80: 6e 74 2e 20 49 66 20 74 68 65 20 22 62 44 65 73  nt. If the "bDes
9c90: 63 22 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  c" .** parameter
9ca0: 20 69 73 20 70 61 73 73 65 64 20 61 20 6e 6f 6e   is passed a non
9cb0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 74 65  -zero value, ite
9cc0: 72 61 74 69 6f 6e 20 69 73 20 69 6e 20 64 65 73  ration is in des
9cd0: 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 0a 2a  cending rowid .*
9ce0: 2a 20 6f 72 64 65 72 2e 20 4f 72 2c 20 69 66 20  * order. Or, if 
9cf0: 69 74 20 69 73 20 7a 65 72 6f 2c 20 69 6e 20 61  it is zero, in a
9d00: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
9d10: 2a 2a 0a 2a 2a 20 49 66 20 69 74 65 72 61 74 69  **.** If iterati
9d20: 6e 67 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ng in ascending 
9d30: 72 6f 77 69 64 20 6f 72 64 65 72 20 28 62 44 65  rowid order (bDe
9d40: 73 63 3d 3d 30 29 2c 20 74 68 65 20 66 69 72 73  sc==0), the firs
9d50: 74 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 76 69  t document.** vi
9d60: 73 69 74 65 64 20 69 73 20 74 68 61 74 20 77 69  sited is that wi
9d70: 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
9d80: 72 6f 77 69 64 20 74 68 61 74 20 69 73 20 6c 61  rowid that is la
9d90: 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
9da0: 61 6c 0a 2a 2a 20 74 6f 20 70 61 72 61 6d 65 74  al.** to paramet
9db0: 65 72 20 69 46 69 72 73 74 2e 20 4f 72 2c 20 69  er iFirst. Or, i
9dc0: 66 20 69 74 65 72 61 74 69 6e 67 20 69 6e 20 61  f iterating in a
9dd0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 28  scending order (
9de0: 62 44 65 73 63 3d 3d 31 29 2c 0a 2a 2a 20 74 68  bDesc==1),.** th
9df0: 65 6e 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  en the first doc
9e00: 75 6d 65 6e 74 20 76 69 73 69 74 65 64 20 6d 75  ument visited mu
9e10: 73 74 20 68 61 76 65 20 61 20 72 6f 77 69 64 20  st have a rowid 
9e20: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 0a  smaller than or.
9e30: 2a 2a 20 65 71 75 61 6c 20 74 6f 20 69 46 69 72  ** equal to iFir
9e40: 73 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  st..**.** Return
9e50: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
9e60: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
9e70: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
9e80: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74 0a  e otherwise. It.
9e90: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
9ea0: 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
9eb0: 20 74 68 65 20 71 75 65 72 79 20 64 6f 65 73 20   the query does 
9ec0: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 64 6f  not match any do
9ed0: 63 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  cuments..*/.int 
9ee0: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 46  sqlite3Fts5ExprF
9ef0: 69 72 73 74 28 46 74 73 35 45 78 70 72 20 2a 70  irst(Fts5Expr *p
9f00: 2c 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64  , Fts5Index *pId
9f10: 78 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69  x, i64 iFirst, i
9f20: 6e 74 20 62 44 65 73 63 29 7b 0a 20 20 46 74 73  nt bDesc){.  Fts
9f30: 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 6f 6f 74  5ExprNode *pRoot
9f40: 20 3d 20 70 2d 3e 70 52 6f 6f 74 3b 0a 20 20 69   = p->pRoot;.  i
9f50: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f70: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
9f80: 0a 0a 20 20 70 2d 3e 70 49 6e 64 65 78 20 3d 20  ..  p->pIndex = 
9f90: 70 49 64 78 3b 0a 20 20 70 2d 3e 62 44 65 73 63  pIdx;.  p->bDesc
9fa0: 20 3d 20 62 44 65 73 63 3b 0a 20 20 72 63 20 3d   = bDesc;.  rc =
9fb0: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72   fts5ExprNodeFir
9fc0: 73 74 28 70 2c 20 70 52 6f 6f 74 29 3b 0a 0a 20  st(p, pRoot);.. 
9fd0: 20 2f 2a 20 49 66 20 6e 6f 74 20 61 74 20 45 4f   /* If not at EO
9fe0: 46 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  F but the curren
9ff0: 74 20 72 6f 77 69 64 20 6f 63 63 75 72 73 20 65  t rowid occurs e
a000: 61 72 6c 69 65 72 20 74 68 61 6e 20 69 46 69 72  arlier than iFir
a010: 73 74 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 69  st in.  ** the i
a020: 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72 2c 20  teration order, 
a030: 6d 6f 76 65 20 74 6f 20 64 6f 63 75 6d 65 6e 74  move to document
a040: 20 69 46 69 72 73 74 20 6f 72 20 6c 61 74 65 72   iFirst or later
a050: 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
a060: 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
a070: 30 3d 3d 70 52 6f 6f 74 2d 3e 62 45 6f 66 20 0a  0==pRoot->bEof .
a080: 20 20 20 26 26 20 66 74 73 35 52 6f 77 69 64 43     && fts5RowidC
a090: 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69 52 6f  mp(p, pRoot->iRo
a0a0: 77 69 64 2c 20 69 46 69 72 73 74 29 3c 30 20 0a  wid, iFirst)<0 .
a0b0: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74    ){.    rc = ft
a0c0: 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70  s5ExprNodeNext(p
a0d0: 2c 20 70 52 6f 6f 74 2c 20 31 2c 20 69 46 69 72  , pRoot, 1, iFir
a0e0: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  st);.  }..  /* I
a0f0: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
a100: 73 20 6e 6f 74 20 61 74 20 61 20 72 65 61 6c 20  s not at a real 
a110: 6d 61 74 63 68 2c 20 73 6b 69 70 20 66 6f 72 77  match, skip forw
a120: 61 72 64 20 75 6e 74 69 6c 20 69 74 20 69 73 2e  ard until it is.
a130: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 52 6f   */.  while( pRo
a140: 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 7b 0a  ot->bNomatch ){.
a150: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
a160: 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 72 63  t->bEof==0 && rc
a170: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a180: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
a190: 4e 6f 64 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f  NodeNext(p, pRoo
a1a0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  t, 0, 0);.  }.  
a1b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a1c0: 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
a1d0: 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 0a 2a  next document .*
a1e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
a1f0: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
a200: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
a210: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
a220: 65 72 77 69 73 65 2e 20 49 74 0a 2a 2a 20 69 73  erwise. It.** is
a230: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
a240: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
a250: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 6d  query does not m
a260: 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d 65 6e  atch any documen
a270: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
a280: 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 46  e3Fts5ExprNext(F
a290: 74 73 35 45 78 70 72 20 2a 70 2c 20 69 36 34 20  ts5Expr *p, i64 
a2a0: 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  iLast){.  int rc
a2b0: 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  ;.  Fts5ExprNode
a2c0: 20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52 6f   *pRoot = p->pRo
a2d0: 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  ot;.  assert( pR
a2e0: 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20  oot->bEof==0 && 
a2f0: 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 3d  pRoot->bNomatch=
a300: 3d 30 20 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  =0 );.  do {.   
a310: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
a320: 64 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74 2c  deNext(p, pRoot,
a330: 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65   0, 0);.    asse
a340: 72 74 28 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61  rt( pRoot->bNoma
a350: 74 63 68 3d 3d 30 20 7c 7c 20 28 72 63 3d 3d 53  tch==0 || (rc==S
a360: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 6f 6f  QLITE_OK && pRoo
a370: 74 2d 3e 62 45 6f 66 3d 3d 30 29 20 29 3b 0a 20  t->bEof==0) );. 
a380: 20 7d 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e   }while( pRoot->
a390: 62 4e 6f 6d 61 74 63 68 20 29 3b 0a 20 20 69 66  bNomatch );.  if
a3a0: 28 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70  ( fts5RowidCmp(p
a3b0: 2c 20 70 52 6f 6f 74 2d 3e 69 52 6f 77 69 64 2c  , pRoot->iRowid,
a3c0: 20 69 4c 61 73 74 29 3e 30 20 29 7b 0a 20 20 20   iLast)>0 ){.   
a3d0: 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 20 3d 20 31   pRoot->bEof = 1
a3e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a3f0: 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
a400: 33 46 74 73 35 45 78 70 72 45 6f 66 28 46 74 73  3Fts5ExprEof(Fts
a410: 35 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  5Expr *p){.  ret
a420: 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e 62 45  urn p->pRoot->bE
a430: 6f 66 3b 0a 7d 0a 0a 69 36 34 20 73 71 6c 69 74  of;.}..i64 sqlit
a440: 65 33 46 74 73 35 45 78 70 72 52 6f 77 69 64 28  e3Fts5ExprRowid(
a450: 46 74 73 35 45 78 70 72 20 2a 70 29 7b 0a 20 20  Fts5Expr *p){.  
a460: 72 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d  return p->pRoot-
a470: 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74  >iRowid;.}..stat
a480: 69 63 20 69 6e 74 20 66 74 73 35 50 61 72 73 65  ic int fts5Parse
a490: 53 74 72 69 6e 67 46 72 6f 6d 54 6f 6b 65 6e 28  StringFromToken(
a4a0: 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  Fts5Token *pToke
a4b0: 6e 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a 20  n, char **pz){. 
a4c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a4d0: 5f 4f 4b 3b 0a 20 20 2a 70 7a 20 3d 20 73 71 6c  _OK;.  *pz = sql
a4e0: 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28  ite3Fts5Strndup(
a4f0: 26 72 63 2c 20 70 54 6f 6b 65 6e 2d 3e 70 2c 20  &rc, pToken->p, 
a500: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 72 65  pToken->n);.  re
a510: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a520: 2a 20 46 72 65 65 20 74 68 65 20 70 68 72 61 73  * Free the phras
a530: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
a540: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
a550: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
a560: 76 6f 69 64 20 66 74 73 35 45 78 70 72 50 68 72  void fts5ExprPhr
a570: 61 73 65 46 72 65 65 28 46 74 73 35 45 78 70 72  aseFree(Fts5Expr
a580: 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 29  Phrase *pPhrase)
a590: 7b 0a 20 20 69 66 28 20 70 50 68 72 61 73 65 20  {.  if( pPhrase 
a5a0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
a5b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68    for(i=0; i<pPh
a5c0: 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  rase->nTerm; i++
a5d0: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70  ){.      Fts5Exp
a5e0: 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0a 20 20 20  rTerm *pSyn;.   
a5f0: 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
a600: 2a 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 46 74  *pNext;.      Ft
a610: 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72  s5ExprTerm *pTer
a620: 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54  m = &pPhrase->aT
a630: 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  erm[i];.      sq
a640: 6c 69 74 65 33 5f 66 72 65 65 28 70 54 65 72 6d  lite3_free(pTerm
a650: 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  ->zTerm);.      
a660: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
a670: 6c 6f 73 65 28 70 54 65 72 6d 2d 3e 70 49 74 65  lose(pTerm->pIte
a680: 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 53  r);.      for(pS
a690: 79 6e 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  yn=pTerm->pSynon
a6a0: 79 6d 3b 20 70 53 79 6e 3b 20 70 53 79 6e 3d 70  ym; pSyn; pSyn=p
a6b0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 70  Next){.        p
a6c0: 4e 65 78 74 20 3d 20 70 53 79 6e 2d 3e 70 53 79  Next = pSyn->pSy
a6d0: 6e 6f 6e 79 6d 3b 0a 20 20 20 20 20 20 20 20 73  nonym;.        s
a6e0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
a6f0: 6f 73 65 28 70 53 79 6e 2d 3e 70 49 74 65 72 29  ose(pSyn->pIter)
a700: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
a710: 66 66 65 72 46 72 65 65 28 28 46 74 73 35 42 75  fferFree((Fts5Bu
a720: 66 66 65 72 2a 29 26 70 53 79 6e 5b 31 5d 29 3b  ffer*)&pSyn[1]);
a730: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a740: 5f 66 72 65 65 28 70 53 79 6e 29 3b 0a 20 20 20  _free(pSyn);.   
a750: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
a760: 66 28 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  f( pPhrase->posl
a770: 69 73 74 2e 6e 53 70 61 63 65 3e 30 20 29 20 66  ist.nSpace>0 ) f
a780: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
a790: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 29  Phrase->poslist)
a7a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
a7b0: 65 65 28 70 50 68 72 61 73 65 29 3b 0a 20 20 7d  ee(pPhrase);.  }
a7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a7d0: 65 20 22 62 46 69 72 73 74 22 20 66 6c 61 67 20  e "bFirst" flag 
a7e0: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b  on the first tok
a7f0: 65 6e 20 6f 66 20 74 68 65 20 70 68 72 61 73 65  en of the phrase
a800: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
a810: 2a 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  * only argument.
a820: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a830: 46 74 73 35 50 61 72 73 65 53 65 74 43 61 72 65  Fts5ParseSetCare
a840: 74 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65  t(Fts5ExprPhrase
a850: 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69 66   *pPhrase){.  if
a860: 28 20 70 50 68 72 61 73 65 20 26 26 20 70 50 68  ( pPhrase && pPh
a870: 72 61 73 65 2d 3e 6e 54 65 72 6d 20 29 7b 0a 20  rase->nTerm ){. 
a880: 20 20 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72     pPhrase->aTer
a890: 6d 5b 30 5d 2e 62 46 69 72 73 74 20 3d 20 31 3b  m[0].bFirst = 1;
a8a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
a8b0: 20 61 72 67 75 6d 65 6e 74 20 70 4e 65 61 72 20   argument pNear 
a8c0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20  is NULL, then a 
a8d0: 6e 65 77 20 46 74 73 35 45 78 70 72 4e 65 61 72  new Fts5ExprNear
a8e0: 73 65 74 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  set object is al
a8f0: 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20 70  located.** and p
a900: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 70 50  opulated with pP
a910: 68 72 61 73 65 2e 20 4f 72 2c 20 69 66 20 70 4e  hrase. Or, if pN
a920: 65 61 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ear is not NULL,
a930: 20 70 68 72 61 73 65 20 70 50 68 72 61 73 65 20   phrase pPhrase 
a940: 69 73 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20 74  is.** appended t
a950: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 72 65 73  o it and the res
a960: 75 6c 74 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  ults returned..*
a970: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
a980: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 62 6f 74  rror occurs, bot
a990: 68 20 74 68 65 20 70 4e 65 61 72 20 61 6e 64 20  h the pNear and 
a9a0: 70 50 68 72 61 73 65 20 6f 62 6a 65 63 74 73 20  pPhrase objects 
a9b0: 61 72 65 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a  are freed and.**
a9c0: 20 4e 55 4c 4c 20 72 65 74 75 72 6e 65 64 2e 0a   NULL returned..
a9d0: 2a 2f 0a 46 74 73 35 45 78 70 72 4e 65 61 72 73  */.Fts5ExprNears
a9e0: 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  et *sqlite3Fts5P
a9f0: 61 72 73 65 4e 65 61 72 73 65 74 28 0a 20 20 46  arseNearset(.  F
aa00: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
aa10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
aa20: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
aa30: 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61  */.  Fts5ExprNea
aa40: 72 73 65 74 20 2a 70 4e 65 61 72 2c 20 20 20 20  rset *pNear,    
aa50: 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
aa60: 20 6e 65 61 72 73 65 74 2c 20 6f 72 20 4e 55 4c   nearset, or NUL
aa70: 4c 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 50  L */.  Fts5ExprP
aa80: 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 20  hrase *pPhrase  
aa90: 20 20 20 20 20 20 20 2f 2a 20 52 65 63 65 6e 74         /* Recent
aaa0: 6c 79 20 70 61 72 73 65 64 20 70 68 72 61 73 65  ly parsed phrase
aab0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
aac0: 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20 38 3b 0a  nt SZALLOC = 8;.
aad0: 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65    Fts5ExprNearse
aae0: 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a 20 20  t *pRet = 0;..  
aaf0: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
ab00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ab10: 20 69 66 28 20 70 50 68 72 61 73 65 3d 3d 30 20   if( pPhrase==0 
ab20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ab30: 70 4e 65 61 72 3b 0a 20 20 20 20 7d 0a 20 20 20  pNear;.    }.   
ab40: 20 69 66 28 20 70 4e 65 61 72 3d 3d 30 20 29 7b   if( pNear==0 ){
ab50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
ab60: 6e 74 36 34 20 6e 42 79 74 65 3b 0a 20 20 20 20  nt64 nByte;.    
ab70: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
ab80: 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74  (Fts5ExprNearset
ab90: 29 20 2b 20 53 5a 41 4c 4c 4f 43 20 2a 20 73 69  ) + SZALLOC * si
aba0: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72  zeof(Fts5ExprPhr
abb0: 61 73 65 2a 29 3b 0a 20 20 20 20 20 20 70 52 65  ase*);.      pRe
abc0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
abd0: 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20  oc64(nByte);.   
abe0: 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29     if( pRet==0 )
abf0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  {.        pParse
ac00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
ac10: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
ac20: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
ac30: 28 70 52 65 74 2c 20 30 2c 20 28 73 69 7a 65 5f  (pRet, 0, (size_
ac40: 74 29 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  t)nByte);.      
ac50: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
ac60: 28 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20  (pNear->nPhrase 
ac70: 25 20 53 5a 41 4c 4c 4f 43 29 3d 3d 30 20 29 7b  % SZALLOC)==0 ){
ac80: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  .      int nNew 
ac90: 3d 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  = pNear->nPhrase
aca0: 20 2b 20 53 5a 41 4c 4c 4f 43 3b 0a 20 20 20 20   + SZALLOC;.    
acb0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
acc0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 6e 42  nByte;..      nB
acd0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
ace0: 35 45 78 70 72 4e 65 61 72 73 65 74 29 20 2b 20  5ExprNearset) + 
acf0: 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66 28 46 74  nNew * sizeof(Ft
ad00: 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b 0a  s5ExprPhrase*);.
ad10: 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46 74        pRet = (Ft
ad20: 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 29 73  s5ExprNearset*)s
ad30: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
ad40: 28 70 4e 65 61 72 2c 20 6e 42 79 74 65 29 3b 0a  (pNear, nByte);.
ad50: 20 20 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d        if( pRet==
ad60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  0 ){.        pPa
ad70: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
ad80: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
ad90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ada0: 20 70 52 65 74 20 3d 20 70 4e 65 61 72 3b 0a 20   pRet = pNear;. 
adb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
adc0: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pRet==0 ){.    a
add0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72  ssert( pParse->r
ade0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
adf0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
ae00: 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65 28  arseNearsetFree(
ae10: 70 4e 65 61 72 29 3b 0a 20 20 20 20 73 71 6c 69  pNear);.    sqli
ae20: 74 65 33 46 74 73 35 50 61 72 73 65 50 68 72 61  te3Fts5ParsePhra
ae30: 73 65 46 72 65 65 28 70 50 68 72 61 73 65 29 3b  seFree(pPhrase);
ae40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
ae50: 28 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65 3e  ( pRet->nPhrase>
ae60: 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45  0 ){.      Fts5E
ae70: 78 70 72 50 68 72 61 73 65 20 2a 70 4c 61 73 74  xprPhrase *pLast
ae80: 20 3d 20 70 52 65 74 2d 3e 61 70 50 68 72 61 73   = pRet->apPhras
ae90: 65 5b 70 52 65 74 2d 3e 6e 50 68 72 61 73 65 2d  e[pRet->nPhrase-
aea0: 31 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1];.      assert
aeb0: 28 20 70 4c 61 73 74 3d 3d 70 50 61 72 73 65 2d  ( pLast==pParse-
aec0: 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65  >apPhrase[pParse
aed0: 2d 3e 6e 50 68 72 61 73 65 2d 32 5d 20 29 3b 0a  ->nPhrase-2] );.
aee0: 20 20 20 20 20 20 69 66 28 20 70 50 68 72 61 73        if( pPhras
aef0: 65 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  e->nTerm==0 ){. 
af00: 20 20 20 20 20 20 20 66 74 73 35 45 78 70 72 50         fts5ExprP
af10: 68 72 61 73 65 46 72 65 65 28 70 50 68 72 61 73  hraseFree(pPhras
af20: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  e);.        pRet
af30: 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a 20 20 20  ->nPhrase--;.   
af40: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68       pParse->nPh
af50: 72 61 73 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20  rase--;.        
af60: 70 50 68 72 61 73 65 20 3d 20 70 4c 61 73 74 3b  pPhrase = pLast;
af70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
af80: 20 70 4c 61 73 74 2d 3e 6e 54 65 72 6d 3d 3d 30   pLast->nTerm==0
af90: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
afa0: 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28 70  ExprPhraseFree(p
afb0: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Last);.        p
afc0: 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65 5b  Parse->apPhrase[
afd0: 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d  pParse->nPhrase-
afe0: 32 5d 20 3d 20 70 50 68 72 61 73 65 3b 0a 20 20  2] = pPhrase;.  
aff0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50        pParse->nP
b000: 68 72 61 73 65 2d 2d 3b 0a 20 20 20 20 20 20 20  hrase--;.       
b010: 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65 2d 2d   pRet->nPhrase--
b020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b030: 20 20 20 20 70 52 65 74 2d 3e 61 70 50 68 72 61      pRet->apPhra
b040: 73 65 5b 70 52 65 74 2d 3e 6e 50 68 72 61 73 65  se[pRet->nPhrase
b050: 2b 2b 5d 20 3d 20 70 50 68 72 61 73 65 3b 0a 20  ++] = pPhrase;. 
b060: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
b070: 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
b080: 75 63 74 20 54 6f 6b 65 6e 43 74 78 20 54 6f 6b  uct TokenCtx Tok
b090: 65 6e 43 74 78 3b 0a 73 74 72 75 63 74 20 54 6f  enCtx;.struct To
b0a0: 6b 65 6e 43 74 78 20 7b 0a 20 20 46 74 73 35 45  kenCtx {.  Fts5E
b0b0: 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61  xprPhrase *pPhra
b0c0: 73 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 7d 3b  se;.  int rc;.};
b0d0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b  ../*.** Callback
b0e0: 20 66 6f 72 20 74 6f 6b 65 6e 69 7a 69 6e 67 20   for tokenizing 
b0f0: 74 65 72 6d 73 20 75 73 65 64 20 62 79 20 50 61  terms used by Pa
b100: 72 73 65 54 65 72 6d 28 29 2e 0a 2a 2f 0a 73 74  rseTerm()..*/.st
b110: 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 61 72  atic int fts5Par
b120: 73 65 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 76 6f  seTokenize(.  vo
b130: 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20  id *pContext,   
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b150: 20 50 6f 69 6e 74 65 72 20 74 6f 20 46 74 73 35   Pointer to Fts5
b160: 49 6e 73 65 72 74 43 74 78 20 6f 62 6a 65 63 74  InsertCtx object
b170: 20 2a 2f 0a 20 20 69 6e 74 20 74 66 6c 61 67 73   */.  int tflags
b180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b190: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
b1a0: 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66 6c   FTS5_TOKEN_* fl
b1b0: 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
b1c0: 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  har *pToken,    
b1d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
b1e0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f  er containing to
b1f0: 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  ken */.  int nTo
b200: 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
b210: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b220: 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79 74   of token in byt
b230: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e 75  es */.  int iUnu
b240: 73 65 64 31 2c 20 20 20 20 20 20 20 20 20 20 20  sed1,           
b250: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
b260: 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e   offset of token
b270: 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73 65   */.  int iUnuse
b280: 64 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d2              
b290: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 66        /* End off
b2a0: 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0a  set of token */.
b2b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
b2c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74  LITE_OK;.  const
b2d0: 20 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20 38   int SZALLOC = 8
b2e0: 3b 0a 20 20 54 6f 6b 65 6e 43 74 78 20 2a 70 43  ;.  TokenCtx *pC
b2f0: 74 78 20 3d 20 28 54 6f 6b 65 6e 43 74 78 2a 29  tx = (TokenCtx*)
b300: 70 43 6f 6e 74 65 78 74 3b 0a 20 20 46 74 73 35  pContext;.  Fts5
b310: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
b320: 61 73 65 20 3d 20 70 43 74 78 2d 3e 70 50 68 72  ase = pCtx->pPhr
b330: 61 73 65 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  ase;..  UNUSED_P
b340: 41 52 41 4d 32 28 69 55 6e 75 73 65 64 31 2c 20  ARAM2(iUnused1, 
b350: 69 55 6e 75 73 65 64 32 29 3b 0a 0a 20 20 2f 2a  iUnused2);..  /*
b360: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
b370: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
b380: 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
b390: 6f 70 20 2a 2f 0a 20 20 69 66 28 20 70 43 74 78  op */.  if( pCtx
b3a0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
b3b0: 29 20 72 65 74 75 72 6e 20 70 43 74 78 2d 3e 72  ) return pCtx->r
b3c0: 63 3b 0a 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3e  c;.  if( nToken>
b3d0: 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53  FTS5_MAX_TOKEN_S
b3e0: 49 5a 45 20 29 20 6e 54 6f 6b 65 6e 20 3d 20 46  IZE ) nToken = F
b3f0: 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53 49  TS5_MAX_TOKEN_SI
b400: 5a 45 3b 0a 0a 20 20 69 66 28 20 70 50 68 72 61  ZE;..  if( pPhra
b410: 73 65 20 26 26 20 70 50 68 72 61 73 65 2d 3e 6e  se && pPhrase->n
b420: 54 65 72 6d 3e 30 20 26 26 20 28 74 66 6c 61 67  Term>0 && (tflag
b430: 73 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43  s & FTS5_TOKEN_C
b440: 4f 4c 4f 43 41 54 45 44 29 20 29 7b 0a 20 20 20  OLOCATED) ){.   
b450: 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
b460: 53 79 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Syn;.    sqlite3
b470: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
b480: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54 65  izeof(Fts5ExprTe
b490: 72 6d 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  rm) + sizeof(Fts
b4a0: 35 42 75 66 66 65 72 29 20 2b 20 6e 54 6f 6b 65  5Buffer) + nToke
b4b0: 6e 2b 31 3b 0a 20 20 20 20 70 53 79 6e 20 3d 20  n+1;.    pSyn = 
b4c0: 28 46 74 73 35 45 78 70 72 54 65 72 6d 2a 29 73  (Fts5ExprTerm*)s
b4d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
b4e0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
b4f0: 70 53 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSyn==0 ){.     
b500: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
b510: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
b520: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 53 79 6e       memset(pSyn
b530: 2c 20 30 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79  , 0, (size_t)nBy
b540: 74 65 29 3b 0a 20 20 20 20 20 20 70 53 79 6e 2d  te);.      pSyn-
b550: 3e 7a 54 65 72 6d 20 3d 20 28 28 63 68 61 72 2a  >zTerm = ((char*
b560: 29 70 53 79 6e 29 20 2b 20 73 69 7a 65 6f 66 28  )pSyn) + sizeof(
b570: 46 74 73 35 45 78 70 72 54 65 72 6d 29 20 2b 20  Fts5ExprTerm) + 
b580: 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
b590: 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  r);.      memcpy
b5a0: 28 70 53 79 6e 2d 3e 7a 54 65 72 6d 2c 20 70 54  (pSyn->zTerm, pT
b5b0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
b5c0: 20 20 20 20 20 70 53 79 6e 2d 3e 70 53 79 6e 6f       pSyn->pSyno
b5d0: 6e 79 6d 20 3d 20 70 50 68 72 61 73 65 2d 3e 61  nym = pPhrase->a
b5e0: 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e 54  Term[pPhrase->nT
b5f0: 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79 6d 3b  erm-1].pSynonym;
b600: 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
b610: 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e  aTerm[pPhrase->n
b620: 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79 6d  Term-1].pSynonym
b630: 20 3d 20 70 53 79 6e 3b 0a 20 20 20 20 7d 0a 20   = pSyn;.    }. 
b640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35   }else{.    Fts5
b650: 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 3b  ExprTerm *pTerm;
b660: 0a 20 20 20 20 69 66 28 20 70 50 68 72 61 73 65  .    if( pPhrase
b670: 3d 3d 30 20 7c 7c 20 28 70 50 68 72 61 73 65 2d  ==0 || (pPhrase-
b680: 3e 6e 54 65 72 6d 20 25 20 53 5a 41 4c 4c 4f 43  >nTerm % SZALLOC
b690: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 74  )==0 ){.      Ft
b6a0: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 4e  s5ExprPhrase *pN
b6b0: 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  ew;.      int nN
b6c0: 65 77 20 3d 20 53 5a 41 4c 4c 4f 43 20 2b 20 28  ew = SZALLOC + (
b6d0: 70 50 68 72 61 73 65 20 3f 20 70 50 68 72 61 73  pPhrase ? pPhras
b6e0: 65 2d 3e 6e 54 65 72 6d 20 3a 20 30 29 3b 0a 0a  e->nTerm : 0);..
b6f0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74        pNew = (Ft
b700: 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 73 71  s5ExprPhrase*)sq
b710: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
b720: 70 50 68 72 61 73 65 2c 20 0a 20 20 20 20 20 20  pPhrase, .      
b730: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 45      sizeof(Fts5E
b740: 78 70 72 50 68 72 61 73 65 29 20 2b 20 73 69 7a  xprPhrase) + siz
b750: 65 6f 66 28 46 74 73 35 45 78 70 72 54 65 72 6d  eof(Fts5ExprTerm
b760: 29 20 2a 20 6e 4e 65 77 0a 20 20 20 20 20 20 29  ) * nNew.      )
b770: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
b780: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
b790: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
b7a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b7b0: 20 20 20 20 20 20 20 69 66 28 20 70 50 68 72 61         if( pPhra
b7c0: 73 65 3d 3d 30 20 29 20 6d 65 6d 73 65 74 28 70  se==0 ) memset(p
b7d0: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  New, 0, sizeof(F
b7e0: 74 73 35 45 78 70 72 50 68 72 61 73 65 29 29 3b  ts5ExprPhrase));
b7f0: 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 70  .        pCtx->p
b800: 50 68 72 61 73 65 20 3d 20 70 50 68 72 61 73 65  Phrase = pPhrase
b810: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
b820: 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20 6e   pNew->nTerm = n
b830: 4e 65 77 20 2d 20 53 5a 41 4c 4c 4f 43 3b 0a 20  New - SZALLOC;. 
b840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
b850: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b860: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 54 65  _OK ){.      pTe
b870: 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61  rm = &pPhrase->a
b880: 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e 54  Term[pPhrase->nT
b890: 65 72 6d 2b 2b 5d 3b 0a 20 20 20 20 20 20 6d 65  erm++];.      me
b8a0: 6d 73 65 74 28 70 54 65 72 6d 2c 20 30 2c 20 73  mset(pTerm, 0, s
b8b0: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54 65  izeof(Fts5ExprTe
b8c0: 72 6d 29 29 3b 0a 20 20 20 20 20 20 70 54 65 72  rm));.      pTer
b8d0: 6d 2d 3e 7a 54 65 72 6d 20 3d 20 73 71 6c 69 74  m->zTerm = sqlit
b8e0: 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26 72  e3Fts5Strndup(&r
b8f0: 63 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  c, pToken, nToke
b900: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
b910: 20 70 43 74 78 2d 3e 72 63 20 3d 20 72 63 3b 0a   pCtx->rc = rc;.
b920: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b930: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
b940: 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70 61  phrase object pa
b950: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
b960: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
b970: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 61  id sqlite3Fts5Pa
b980: 72 73 65 50 68 72 61 73 65 46 72 65 65 28 46 74  rsePhraseFree(Ft
b990: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
b9a0: 68 72 61 73 65 29 7b 0a 20 20 66 74 73 35 45 78  hrase){.  fts5Ex
b9b0: 70 72 50 68 72 61 73 65 46 72 65 65 28 70 50 68  prPhraseFree(pPh
b9c0: 72 61 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rase);.}../*.** 
b9d0: 46 72 65 65 20 74 68 65 20 70 68 72 61 73 65 20  Free the phrase 
b9e0: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
b9f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
ba00: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
ba10: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 65  lite3Fts5ParseNe
ba20: 61 72 73 65 74 46 72 65 65 28 46 74 73 35 45 78  arsetFree(Fts5Ex
ba30: 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
ba40: 29 7b 0a 20 20 69 66 28 20 70 4e 65 61 72 20 29  ){.  if( pNear )
ba50: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ba60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61   for(i=0; i<pNea
ba70: 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29  r->nPhrase; i++)
ba80: 7b 0a 20 20 20 20 20 20 66 74 73 35 45 78 70 72  {.      fts5Expr
ba90: 50 68 72 61 73 65 46 72 65 65 28 70 4e 65 61 72  PhraseFree(pNear
baa0: 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 29 3b 0a  ->apPhrase[i]);.
bab0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bac0: 33 5f 66 72 65 65 28 70 4e 65 61 72 2d 3e 70 43  3_free(pNear->pC
bad0: 6f 6c 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  olset);.    sqli
bae0: 74 65 33 5f 66 72 65 65 28 70 4e 65 61 72 29 3b  te3_free(pNear);
baf0: 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  .  }.}..void sql
bb00: 69 74 65 33 46 74 73 35 50 61 72 73 65 46 69 6e  ite3Fts5ParseFin
bb10: 69 73 68 65 64 28 46 74 73 35 50 61 72 73 65 20  ished(Fts5Parse 
bb20: 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45 78 70  *pParse, Fts5Exp
bb30: 72 4e 6f 64 65 20 2a 70 29 7b 0a 20 20 61 73 73  rNode *p){.  ass
bb40: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 45 78  ert( pParse->pEx
bb50: 70 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  pr==0 );.  pPars
bb60: 65 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 7d 0a  e->pExpr = p;.}.
bb70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
bb80: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
bb90: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
bba0: 70 72 6f 63 65 73 73 20 61 20 73 74 72 69 6e 67  process a string
bbb0: 20 74 6f 6b 65 6e 2e 20 54 68 65 0a 2a 2a 20 73   token. The.** s
bbc0: 74 72 69 6e 67 20 6d 61 79 20 6f 72 20 6d 61 79  tring may or may
bbd0: 20 6e 6f 74 20 62 65 20 71 75 6f 74 65 64 2e 20   not be quoted. 
bbe0: 49 6e 20 61 6e 79 20 63 61 73 65 20 69 74 20 69  In any case it i
bbf0: 73 20 74 6f 6b 65 6e 69 7a 65 64 20 61 6e 64 20  s tokenized and 
bc00: 61 0a 2a 2a 20 70 68 72 61 73 65 20 6f 62 6a 65  a.** phrase obje
bc10: 63 74 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ct consisting of
bc20: 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 72 65 74 75   all tokens retu
bc30: 72 6e 65 64 2e 0a 2a 2f 0a 46 74 73 35 45 78 70  rned..*/.Fts5Exp
bc40: 72 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65 33  rPhrase *sqlite3
bc50: 46 74 73 35 50 61 72 73 65 54 65 72 6d 28 0a 20  Fts5ParseTerm(. 
bc60: 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
bc70: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
bc80: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
bc90: 74 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 50  t */.  Fts5ExprP
bca0: 68 72 61 73 65 20 2a 70 41 70 70 65 6e 64 2c 20  hrase *pAppend, 
bcb0: 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65         /* Phrase
bcc0: 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f   to append to */
bcd0: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54  .  Fts5Token *pT
bce0: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
bcf0: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20     /* String to 
bd00: 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 20 20 69 6e  tokenize */.  in
bd10: 74 20 62 50 72 65 66 69 78 20 20 20 20 20 20 20  t bPrefix       
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd30: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69   True if there i
bd40: 73 20 61 20 74 72 61 69 6c 69 6e 67 20 22 2a 22  s a trailing "*"
bd50: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
bd60: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
bd70: 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 3b 0a  Parse->pConfig;.
bd80: 20 20 54 6f 6b 65 6e 43 74 78 20 73 43 74 78 3b    TokenCtx sCtx;
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a    /* Context obj
bdb0: 65 63 74 20 70 61 73 73 65 64 20 74 6f 20 63 61  ect passed to ca
bdc0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
bdd0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bdf0: 6f 6b 65 6e 69 7a 65 20 72 65 74 75 72 6e 20 63  okenize return c
be00: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
be10: 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28   = 0;..  memset(
be20: 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  &sCtx, 0, sizeof
be30: 28 54 6f 6b 65 6e 43 74 78 29 29 3b 0a 20 20 73  (TokenCtx));.  s
be40: 43 74 78 2e 70 50 68 72 61 73 65 20 3d 20 70 41  Ctx.pPhrase = pA
be50: 70 70 65 6e 64 3b 0a 0a 20 20 72 63 20 3d 20 66  ppend;..  rc = f
be60: 74 73 35 50 61 72 73 65 53 74 72 69 6e 67 46 72  ts5ParseStringFr
be70: 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 2c 20  omToken(pToken, 
be80: 26 7a 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  &z);.  if( rc==S
be90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bea0: 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
beb0: 5f 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59 20  _TOKENIZE_QUERY 
bec0: 7c 20 28 62 50 72 65 66 69 78 20 3f 20 46 54 53  | (bPrefix ? FTS
bed0: 35 5f 54 4f 4b 45 4e 49 5a 45 5f 50 52 45 46 49  5_TOKENIZE_PREFI
bee0: 58 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  X : 0);.    int 
bef0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  n;.    sqlite3Ft
bf00: 73 35 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  s5Dequote(z);.  
bf10: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
bf20: 6e 28 7a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  n(z);.    rc = s
bf30: 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69  qlite3Fts5Tokeni
bf40: 7a 65 28 70 43 6f 6e 66 69 67 2c 20 66 6c 61 67  ze(pConfig, flag
bf50: 73 2c 20 7a 2c 20 6e 2c 20 26 73 43 74 78 2c 20  s, z, n, &sCtx, 
bf60: 66 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a  fts5ParseTokeniz
bf70: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
bf80: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 69 66 28  3_free(z);.  if(
bf90: 20 72 63 20 7c 7c 20 28 72 63 20 3d 20 73 43 74   rc || (rc = sCt
bfa0: 78 2e 72 63 29 20 29 7b 0a 20 20 20 20 70 50 61  x.rc) ){.    pPa
bfb0: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
bfc0: 20 20 66 74 73 35 45 78 70 72 50 68 72 61 73 65    fts5ExprPhrase
bfd0: 46 72 65 65 28 73 43 74 78 2e 70 50 68 72 61 73  Free(sCtx.pPhras
bfe0: 65 29 3b 0a 20 20 20 20 73 43 74 78 2e 70 50 68  e);.    sCtx.pPh
bff0: 72 61 73 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rase = 0;.  }els
c000: 65 7b 0a 0a 20 20 20 20 69 66 28 20 70 41 70 70  e{..    if( pApp
c010: 65 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  end==0 ){.      
c020: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 50 68  if( (pParse->nPh
c030: 72 61 73 65 20 25 20 38 29 3d 3d 30 20 29 7b 0a  rase % 8)==0 ){.
c040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c050: 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69  int64 nByte = si
c060: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72  zeof(Fts5ExprPhr
c070: 61 73 65 2a 29 20 2a 20 28 70 50 61 72 73 65 2d  ase*) * (pParse-
c080: 3e 6e 50 68 72 61 73 65 20 2b 20 38 29 3b 0a 20  >nPhrase + 8);. 
c090: 20 20 20 20 20 20 20 46 74 73 35 45 78 70 72 50         Fts5ExprP
c0a0: 68 72 61 73 65 20 2a 2a 61 70 4e 65 77 3b 0a 20  hrase **apNew;. 
c0b0: 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 28         apNew = (
c0c0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 2a  Fts5ExprPhrase**
c0d0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
c0e0: 36 34 28 70 50 61 72 73 65 2d 3e 61 70 50 68 72  64(pParse->apPhr
c0f0: 61 73 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ase, nByte);.   
c100: 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d       if( apNew==
c110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
c120: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
c130: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
c140: 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72 61      fts5ExprPhra
c150: 73 65 46 72 65 65 28 73 43 74 78 2e 70 50 68 72  seFree(sCtx.pPhr
c160: 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ase);.          
c170: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
c180: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72    }.        pPar
c190: 73 65 2d 3e 61 70 50 68 72 61 73 65 20 3d 20 61  se->apPhrase = a
c1a0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNew;.      }.  
c1b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72      pParse->nPhr
c1c0: 61 73 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ase++;.    }..  
c1d0: 20 20 69 66 28 20 73 43 74 78 2e 70 50 68 72 61    if( sCtx.pPhra
c1e0: 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  se==0 ){.      /
c1f0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
c200: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 74 6f  hen parsing a to
c210: 6b 65 6e 20 6f 72 20 71 75 6f 74 65 64 20 70 68  ken or quoted ph
c220: 72 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  rase that contai
c230: 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 74  ns.      ** no t
c240: 6f 6b 65 6e 20 63 68 61 72 61 63 74 65 72 73 20  oken characters 
c250: 61 74 20 61 6c 6c 2e 20 28 65 2e 67 20 2e 2e 2e  at all. (e.g ...
c260: 20 4d 41 54 43 48 20 27 22 22 27 29 2e 20 2a 2f   MATCH '""'). */
c270: 0a 20 20 20 20 20 20 73 43 74 78 2e 70 50 68 72  .      sCtx.pPhr
c280: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  ase = sqlite3Fts
c290: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 50 61  5MallocZero(&pPa
c2a0: 72 73 65 2d 3e 72 63 2c 20 73 69 7a 65 6f 66 28  rse->rc, sizeof(
c2b0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 29 29  Fts5ExprPhrase))
c2c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c2d0: 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e 54  sCtx.pPhrase->nT
c2e0: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 73 43 74  erm ){.      sCt
c2f0: 78 2e 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d  x.pPhrase->aTerm
c300: 5b 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e  [sCtx.pPhrase->n
c310: 54 65 72 6d 2d 31 5d 2e 62 50 72 65 66 69 78 20  Term-1].bPrefix 
c320: 3d 20 28 75 38 29 62 50 72 65 66 69 78 3b 0a 20  = (u8)bPrefix;. 
c330: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
c340: 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65  >apPhrase[pParse
c350: 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 20 3d 20 73  ->nPhrase-1] = s
c360: 43 74 78 2e 70 50 68 72 61 73 65 3b 0a 20 20 7d  Ctx.pPhrase;.  }
c370: 0a 0a 20 20 72 65 74 75 72 6e 20 73 43 74 78 2e  ..  return sCtx.
c380: 70 50 68 72 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPhrase;.}../*.*
c390: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 46  * Create a new F
c3a0: 54 53 35 20 65 78 70 72 65 73 73 69 6f 6e 20 62  TS5 expression b
c3b0: 79 20 63 6c 6f 6e 69 6e 67 20 70 68 72 61 73 65  y cloning phrase
c3c0: 20 69 50 68 72 61 73 65 20 6f 66 20 74 68 65 0a   iPhrase of the.
c3d0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
c3e0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
c3f0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
c400: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45  int sqlite3Fts5E
c410: 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65 28 0a  xprClonePhrase(.
c420: 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70    Fts5Expr *pExp
c430: 72 2c 20 0a 20 20 69 6e 74 20 69 50 68 72 61 73  r, .  int iPhras
c440: 65 2c 20 0a 20 20 46 74 73 35 45 78 70 72 20 2a  e, .  Fts5Expr *
c450: 2a 70 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20  *ppNew.){.  int 
c460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c480: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c490: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
c4a0: 70 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  pOrig;          
c4b0: 2f 2a 20 54 68 65 20 70 68 72 61 73 65 20 65 78  /* The phrase ex
c4c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
c4d0: 70 72 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  pr */.  Fts5Expr
c4e0: 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
c4f0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
c500: 73 73 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20  ssion to return 
c510: 76 69 61 20 2a 70 70 4e 65 77 20 2a 2f 0a 20 20  via *ppNew */.  
c520: 54 6f 6b 65 6e 43 74 78 20 73 43 74 78 20 3d 20  TokenCtx sCtx = 
c530: 7b 30 2c 30 7d 3b 20 20 20 20 20 20 20 20 20 20  {0,0};          
c540: 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  /* Context objec
c550: 74 20 66 6f 72 20 66 74 73 35 50 61 72 73 65 54  t for fts5ParseT
c560: 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 0a 20 20 70 4f  okenize */..  pO
c570: 72 69 67 20 3d 20 70 45 78 70 72 2d 3e 61 70 45  rig = pExpr->apE
c580: 78 70 72 50 68 72 61 73 65 5b 69 50 68 72 61 73  xprPhrase[iPhras
c590: 65 5d 3b 0a 20 20 70 4e 65 77 20 3d 20 28 46 74  e];.  pNew = (Ft
c5a0: 73 35 45 78 70 72 2a 29 73 71 6c 69 74 65 33 46  s5Expr*)sqlite3F
c5b0: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
c5c0: 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78  c, sizeof(Fts5Ex
c5d0: 70 72 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pr));.  if( rc==
c5e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c5f0: 20 70 4e 65 77 2d 3e 61 70 45 78 70 72 50 68 72   pNew->apExprPhr
c600: 61 73 65 20 3d 20 28 46 74 73 35 45 78 70 72 50  ase = (Fts5ExprP
c610: 68 72 61 73 65 2a 2a 29 73 71 6c 69 74 65 33 46  hrase**)sqlite3F
c620: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
c630: 63 2c 20 0a 20 20 20 20 20 20 20 20 73 69 7a 65  c, .        size
c640: 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73  of(Fts5ExprPhras
c650: 65 2a 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e*));.  }.  if( 
c660: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c670: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74  .    pNew->pRoot
c680: 20 3d 20 28 46 74 73 35 45 78 70 72 4e 6f 64 65   = (Fts5ExprNode
c690: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
c6a0: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20  locZero(&rc, .  
c6b0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
c6c0: 35 45 78 70 72 4e 6f 64 65 29 29 3b 0a 20 20 7d  5ExprNode));.  }
c6d0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c6e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77  E_OK ){.    pNew
c6f0: 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 20 3d  ->pRoot->pNear =
c700: 20 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65   (Fts5ExprNearse
c710: 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
c720: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20  llocZero(&rc, . 
c730: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
c740: 73 35 45 78 70 72 4e 65 61 72 73 65 74 29 20 2b  s5ExprNearset) +
c750: 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72   sizeof(Fts5Expr
c760: 50 68 72 61 73 65 2a 29 29 3b 0a 20 20 7d 0a 20  Phrase*));.  }. 
c770: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c780: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  OK ){.    Fts5Co
c790: 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 4f 72 69  lset *pColsetOri
c7a0: 67 20 3d 20 70 4f 72 69 67 2d 3e 70 4e 6f 64 65  g = pOrig->pNode
c7b0: 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  ->pNear->pColset
c7c0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  ;.    if( pColse
c7d0: 74 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 73  tOrig ){.      s
c7e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
c7f0: 74 65 3b 0a 20 20 20 20 20 20 46 74 73 35 43 6f  te;.      Fts5Co
c800: 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 0a 20  lset *pColset;. 
c810: 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a       nByte = siz
c820: 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74 29 20  eof(Fts5Colset) 
c830: 2b 20 28 70 43 6f 6c 73 65 74 4f 72 69 67 2d 3e  + (pColsetOrig->
c840: 6e 43 6f 6c 2d 31 29 20 2a 20 73 69 7a 65 6f 66  nCol-1) * sizeof
c850: 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 43 6f  (int);.      pCo
c860: 6c 73 65 74 20 3d 20 28 46 74 73 35 43 6f 6c 73  lset = (Fts5Cols
c870: 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  et*)sqlite3Fts5M
c880: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
c890: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
c8a0: 20 70 43 6f 6c 73 65 74 20 29 7b 20 0a 20 20 20   pColset ){ .   
c8b0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c       memcpy(pCol
c8c0: 73 65 74 2c 20 70 43 6f 6c 73 65 74 4f 72 69 67  set, pColsetOrig
c8d0: 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79 74 65 29  , (size_t)nByte)
c8e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c8f0: 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65  pNew->pRoot->pNe
c900: 61 72 2d 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43  ar->pColset = pC
c910: 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  olset;.    }.  }
c920: 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 2d 3e 6e  ..  if( pOrig->n
c930: 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20  Term ){.    int 
c940: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
c960: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
c970: 68 72 6f 75 67 68 20 70 68 72 61 73 65 20 74 65  hrough phrase te
c980: 72 6d 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  rms */.    for(i
c990: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
c9a0: 4b 20 26 26 20 69 3c 70 4f 72 69 67 2d 3e 6e 54  K && i<pOrig->nT
c9b0: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
c9c0: 20 69 6e 74 20 74 66 6c 61 67 73 20 3d 20 30 3b   int tflags = 0;
c9d0: 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72 54  .      Fts5ExprT
c9e0: 65 72 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  erm *p;.      fo
c9f0: 72 28 70 3d 26 70 4f 72 69 67 2d 3e 61 54 65 72  r(p=&pOrig->aTer
ca00: 6d 5b 69 5d 3b 20 70 20 26 26 20 72 63 3d 3d 53  m[i]; p && rc==S
ca10: 51 4c 49 54 45 5f 4f 4b 3b 20 70 3d 70 2d 3e 70  QLITE_OK; p=p->p
ca20: 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20  Synonym){.      
ca30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ca40: 65 72 6d 20 3d 20 70 2d 3e 7a 54 65 72 6d 3b 0a  erm = p->zTerm;.
ca50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
ca60: 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65 28 28  5ParseTokenize((
ca70: 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 74 66 6c  void*)&sCtx, tfl
ca80: 61 67 73 2c 20 7a 54 65 72 6d 2c 20 28 69 6e 74  ags, zTerm, (int
ca90: 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a  )strlen(zTerm),.
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
cab0: 29 3b 0a 20 20 20 20 20 20 20 20 74 66 6c 61 67  );.        tflag
cac0: 73 20 3d 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 43  s = FTS5_TOKEN_C
cad0: 4f 4c 4f 43 41 54 45 44 3b 0a 20 20 20 20 20 20  OLOCATED;.      
cae0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
caf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cb00: 20 20 20 20 20 73 43 74 78 2e 70 50 68 72 61 73       sCtx.pPhras
cb10: 65 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 50 72 65  e->aTerm[i].bPre
cb20: 66 69 78 20 3d 20 70 4f 72 69 67 2d 3e 61 54 65  fix = pOrig->aTe
cb30: 72 6d 5b 69 5d 2e 62 50 72 65 66 69 78 3b 0a 20  rm[i].bPrefix;. 
cb40: 20 20 20 20 20 20 20 73 43 74 78 2e 70 50 68 72         sCtx.pPhr
cb50: 61 73 65 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 46  ase->aTerm[i].bF
cb60: 69 72 73 74 20 3d 20 70 4f 72 69 67 2d 3e 61 54  irst = pOrig->aT
cb70: 65 72 6d 5b 69 5d 2e 62 46 69 72 73 74 3b 0a 20  erm[i].bFirst;. 
cb80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
cb90: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
cba0: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70  s happens when p
cbb0: 61 72 73 69 6e 67 20 61 20 74 6f 6b 65 6e 20 6f  arsing a token o
cbc0: 72 20 71 75 6f 74 65 64 20 70 68 72 61 73 65 20  r quoted phrase 
cbd0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  that contains.  
cbe0: 20 20 2a 2a 20 6e 6f 20 74 6f 6b 65 6e 20 63 68    ** no token ch
cbf0: 61 72 61 63 74 65 72 73 20 61 74 20 61 6c 6c 2e  aracters at all.
cc00: 20 28 65 2e 67 20 2e 2e 2e 20 4d 41 54 43 48 20   (e.g ... MATCH 
cc10: 27 22 22 27 29 2e 20 2a 2f 0a 20 20 20 20 73 43  '""'). */.    sC
cc20: 74 78 2e 70 50 68 72 61 73 65 20 3d 20 73 71 6c  tx.pPhrase = sql
cc30: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
cc40: 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46  ro(&rc, sizeof(F
cc50: 74 73 35 45 78 70 72 50 68 72 61 73 65 29 29 3b  ts5ExprPhrase));
cc60: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
cc70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cc80: 20 2f 2a 20 41 6c 6c 20 74 68 65 20 61 6c 6c 6f   /* All the allo
cc90: 63 61 74 69 6f 6e 73 20 73 75 63 63 65 65 64 65  cations succeede
cca0: 64 2e 20 50 75 74 20 74 68 65 20 65 78 70 72 65  d. Put the expre
ccb0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74 6f 67  ssion object tog
ccc0: 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4e  ether. */.    pN
ccd0: 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 45 78  ew->pIndex = pEx
cce0: 70 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  pr->pIndex;.    
ccf0: 70 4e 65 77 2d 3e 70 43 6f 6e 66 69 67 20 3d 20  pNew->pConfig = 
cd00: 70 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67 3b 0a  pExpr->pConfig;.
cd10: 20 20 20 20 70 4e 65 77 2d 3e 6e 50 68 72 61 73      pNew->nPhras
cd20: 65 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d  e = 1;.    pNew-
cd30: 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b 30 5d  >apExprPhrase[0]
cd40: 20 3d 20 73 43 74 78 2e 70 50 68 72 61 73 65 3b   = sCtx.pPhrase;
cd50: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74  .    pNew->pRoot
cd60: 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  ->pNear->apPhras
cd70: 65 5b 30 5d 20 3d 20 73 43 74 78 2e 70 50 68 72  e[0] = sCtx.pPhr
cd80: 61 73 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ase;.    pNew->p
cd90: 52 6f 6f 74 2d 3e 70 4e 65 61 72 2d 3e 6e 50 68  Root->pNear->nPh
cda0: 72 61 73 65 20 3d 20 31 3b 0a 20 20 20 20 73 43  rase = 1;.    sC
cdb0: 74 78 2e 70 50 68 72 61 73 65 2d 3e 70 4e 6f 64  tx.pPhrase->pNod
cdc0: 65 20 3d 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 3b  e = pNew->pRoot;
cdd0: 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 69 67 2d  ..    if( pOrig-
cde0: 3e 6e 54 65 72 6d 3d 3d 31 20 0a 20 20 20 20 20  >nTerm==1 .     
cdf0: 26 26 20 70 4f 72 69 67 2d 3e 61 54 65 72 6d 5b  && pOrig->aTerm[
ce00: 30 5d 2e 70 53 79 6e 6f 6e 79 6d 3d 3d 30 20 0a  0].pSynonym==0 .
ce10: 20 20 20 20 20 26 26 20 70 4f 72 69 67 2d 3e 61       && pOrig->a
ce20: 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 3d 3d  Term[0].bFirst==
ce30: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
ce40: 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 65 54 79  pNew->pRoot->eTy
ce50: 70 65 20 3d 20 46 54 53 35 5f 54 45 52 4d 3b 0a  pe = FTS5_TERM;.
ce60: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f        pNew->pRoo
ce70: 74 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45  t->xNext = fts5E
ce80: 78 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45 52 4d  xprNodeNext_TERM
ce90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cea0: 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e     pNew->pRoot->
ceb0: 65 54 79 70 65 20 3d 20 46 54 53 35 5f 53 54 52  eType = FTS5_STR
cec0: 49 4e 47 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ING;.      pNew-
ced0: 3e 70 52 6f 6f 74 2d 3e 78 4e 65 78 74 20 3d 20  >pRoot->xNext = 
cee0: 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
cef0: 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 7d 0a 20  _STRING;.    }. 
cf00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
cf10: 74 65 33 46 74 73 35 45 78 70 72 46 72 65 65 28  te3Fts5ExprFree(
cf20: 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 45  pNew);.    fts5E
cf30: 78 70 72 50 68 72 61 73 65 46 72 65 65 28 73 43  xprPhraseFree(sC
cf40: 74 78 2e 70 50 68 72 61 73 65 29 3b 0a 20 20 20  tx.pPhrase);.   
cf50: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 0a   pNew = 0;.  }..
cf60: 20 20 2a 70 70 4e 65 77 20 3d 20 70 4e 65 77 3b    *ppNew = pNew;
cf70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cf80: 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 20 70 54  ../*.** Token pT
cf90: 6f 6b 20 68 61 73 20 61 70 70 65 61 72 65 64 20  ok has appeared 
cfa0: 69 6e 20 61 20 4d 41 54 43 48 20 65 78 70 72 65  in a MATCH expre
cfb0: 73 73 69 6f 6e 20 77 68 65 72 65 20 74 68 65 20  ssion where the 
cfc0: 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  NEAR operator.**
cfd0: 20 69 73 20 65 78 70 65 63 74 65 64 2e 20 49 66   is expected. If
cfe0: 20 74 6f 6b 65 6e 20 70 54 6f 6b 20 64 6f 65 73   token pTok does
cff0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 22 4e 45   not contain "NE
d000: 41 52 22 2c 20 73 74 6f 72 65 20 61 6e 20 65 72  AR", store an er
d010: 72 6f 72 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  ror.** in the pP
d020: 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  arse object..*/.
d030: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
d040: 50 61 72 73 65 4e 65 61 72 28 46 74 73 35 50 61  ParseNear(Fts5Pa
d050: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74 73  rse *pParse, Fts
d060: 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20  5Token *pTok){. 
d070: 20 69 66 28 20 70 54 6f 6b 2d 3e 6e 21 3d 34 20   if( pTok->n!=4 
d080: 7c 7c 20 6d 65 6d 63 6d 70 28 22 4e 45 41 52 22  || memcmp("NEAR"
d090: 2c 20 70 54 6f 6b 2d 3e 70 2c 20 34 29 20 29 7b  , pTok->p, 4) ){
d0a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
d0b0: 50 61 72 73 65 45 72 72 6f 72 28 0a 20 20 20 20  ParseError(.    
d0c0: 20 20 20 20 70 50 61 72 73 65 2c 20 22 66 74 73      pParse, "fts
d0d0: 35 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20  5: syntax error 
d0e0: 6e 65 61 72 20 5c 22 25 2e 2a 73 5c 22 22 2c 20  near \"%.*s\"", 
d0f0: 70 54 6f 6b 2d 3e 6e 2c 20 70 54 6f 6b 2d 3e 70  pTok->n, pTok->p
d100: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 76  .    );.  }.}..v
d110: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
d120: 61 72 73 65 53 65 74 44 69 73 74 61 6e 63 65 28  arseSetDistance(
d130: 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
d140: 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78 70  arse, .  Fts5Exp
d150: 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 2c  rNearset *pNear,
d160: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70 0a  .  Fts5Token *p.
d170: 29 7b 0a 20 20 69 66 28 20 70 4e 65 61 72 20 29  ){.  if( pNear )
d180: 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 61 72 20  {.    int nNear 
d190: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
d1a0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 20 29 7b 0a      if( p->n ){.
d1b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d1c0: 3c 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  <p->n; i++){.   
d1d0: 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 28 63       char c = (c
d1e0: 68 61 72 29 70 2d 3e 70 5b 69 5d 3b 0a 20 20 20  har)p->p[i];.   
d1f0: 20 20 20 20 20 69 66 28 20 63 3c 27 30 27 20 7c       if( c<'0' |
d200: 7c 20 63 3e 27 39 27 20 29 7b 0a 20 20 20 20 20  | c>'9' ){.     
d210: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
d220: 50 61 72 73 65 45 72 72 6f 72 28 0a 20 20 20 20  ParseError(.    
d230: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
d240: 2c 20 22 65 78 70 65 63 74 65 64 20 69 6e 74 65  , "expected inte
d250: 67 65 72 2c 20 67 6f 74 20 5c 22 25 2e 2a 73 5c  ger, got \"%.*s\
d260: 22 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 70 0a 20  "", p->n, p->p. 
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
d280: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d290: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d2a0: 20 20 20 20 6e 4e 65 61 72 20 3d 20 6e 4e 65 61      nNear = nNea
d2b0: 72 20 2a 20 31 30 20 2b 20 28 70 2d 3e 70 5b 69  r * 10 + (p->p[i
d2c0: 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 20 20  ] - '0');.      
d2d0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d2e0: 20 20 20 6e 4e 65 61 72 20 3d 20 46 54 53 35 5f     nNear = FTS5_
d2f0: 44 45 46 41 55 4c 54 5f 4e 45 41 52 44 49 53 54  DEFAULT_NEARDIST
d300: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 61  ;.    }.    pNea
d310: 72 2d 3e 6e 4e 65 61 72 20 3d 20 6e 4e 65 61 72  r->nNear = nNear
d320: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
d330: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
d340: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
d350: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
d360: 65 20 4e 55 4c 4c 2c 20 6f 72 20 69 74 20 6d 61  e NULL, or it ma
d370: 79 20 62 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74  y be.** an exist
d380: 69 6e 67 20 46 74 73 35 43 6f 6c 73 65 74 20 6f  ing Fts5Colset o
d390: 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75 6e 63  bject. This func
d3a0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
d3b0: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 6e  ointer to.** a n
d3c0: 65 77 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74  ew colset object
d3d0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d3e0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 28 70 29 20  contents of (p) 
d3f0: 77 69 74 68 20 6e 65 77 20 76 61 6c 75 65 20 63  with new value c
d400: 6f 6c 75 6d 6e 0a 2a 2a 20 6e 75 6d 62 65 72 20  olumn.** number 
d410: 69 43 6f 6c 20 61 70 70 65 6e 64 65 64 2e 20 0a  iCol appended. .
d420: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
d430: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 74  error occurs, st
d440: 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ore an error cod
d450: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
d460: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20  return NULL..** 
d470: 54 68 65 20 6f 6c 64 20 63 6f 6c 73 65 74 20 6f  The old colset o
d480: 62 6a 65 63 74 20 28 69 66 20 61 6e 79 29 20 69  bject (if any) i
d490: 73 20 6e 6f 74 20 66 72 65 65 64 20 69 6e 20 74  s not freed in t
d4a0: 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
d4b0: 74 69 63 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  tic Fts5Colset *
d4c0: 66 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28  fts5ParseColset(
d4d0: 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
d4e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
d4f0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 53 51 4c 49     /* Store SQLI
d500: 54 45 5f 4e 4f 4d 45 4d 20 68 65 72 65 20 69 66  TE_NOMEM here if
d510: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 46   required */.  F
d520: 74 73 35 43 6f 6c 73 65 74 20 2a 70 2c 20 20 20  ts5Colset *p,   
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d540: 2a 20 45 78 69 73 74 69 6e 67 20 63 6f 6c 73 65  * Existing colse
d550: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  t object */.  in
d560: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d580: 20 4e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 61   New column to a
d590: 64 64 20 74 6f 20 63 6f 6c 73 65 74 20 6f 62 6a  dd to colset obj
d5a0: 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
d5b0: 6e 43 6f 6c 20 3d 20 70 20 3f 20 70 2d 3e 6e 43  nCol = p ? p->nC
d5c0: 6f 6c 20 3a 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ol : 0;     /* N
d5d0: 75 6d 2e 20 63 6f 6c 75 6d 6e 73 20 61 6c 72 65  um. columns alre
d5e0: 61 64 79 20 69 6e 20 63 6f 6c 73 65 74 20 6f 62  ady in colset ob
d5f0: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ject */.  Fts5Co
d600: 6c 73 65 74 20 2a 70 4e 65 77 3b 20 20 20 20 20  lset *pNew;     
d610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
d620: 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 74   colset object t
d630: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 61  o return */..  a
d640: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72  ssert( pParse->r
d650: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
d660: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
d670: 30 20 26 26 20 69 43 6f 6c 3c 70 50 61 72 73 65  0 && iCol<pParse
d680: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20  ->pConfig->nCol 
d690: 29 3b 0a 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  );..  pNew = sql
d6a0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
d6b0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c  , sizeof(Fts5Col
d6c0: 73 65 74 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e  set) + sizeof(in
d6d0: 74 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  t)*nCol);.  if( 
d6e0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
d6f0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
d700: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
d710: 65 7b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f  e{.    int *aiCo
d720: 6c 20 3d 20 70 4e 65 77 2d 3e 61 69 43 6f 6c 3b  l = pNew->aiCol;
d730: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
d740: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
d750: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
d760: 69 66 28 20 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43  if( aiCol[i]==iC
d770: 6f 6c 20 29 20 72 65 74 75 72 6e 20 70 4e 65 77  ol ) return pNew
d780: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 69 43 6f  ;.      if( aiCo
d790: 6c 5b 69 5d 3e 69 43 6f 6c 20 29 20 62 72 65 61  l[i]>iCol ) brea
d7a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  k;.    }.    for
d7b0: 28 6a 3d 6e 43 6f 6c 3b 20 6a 3e 69 3b 20 6a 2d  (j=nCol; j>i; j-
d7c0: 2d 29 7b 0a 20 20 20 20 20 20 61 69 43 6f 6c 5b  -){.      aiCol[
d7d0: 6a 5d 20 3d 20 61 69 43 6f 6c 5b 6a 2d 31 5d 3b  j] = aiCol[j-1];
d7e0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 69 43 6f 6c  .    }.    aiCol
d7f0: 5b 69 5d 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  [i] = iCol;.    
d800: 70 4e 65 77 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pNew->nCol = nCo
d810: 6c 2b 31 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  l+1;..#ifndef ND
d820: 45 42 55 47 0a 20 20 20 20 2f 2a 20 43 68 65 63  EBUG.    /* Chec
d830: 6b 20 74 68 61 74 20 74 68 65 20 61 72 72 61 79  k that the array
d840: 20 69 73 20 69 6e 20 6f 72 64 65 72 20 61 6e 64   is in order and
d850: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75 70   contains no dup
d860: 6c 69 63 61 74 65 20 65 6e 74 72 69 65 73 2e 20  licate entries. 
d870: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  */.    for(i=1; 
d880: 69 3c 70 4e 65 77 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pNew->nCol; i+
d890: 2b 29 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  +) assert( pNew-
d8a0: 3e 61 69 43 6f 6c 5b 69 5d 3e 70 4e 65 77 2d 3e  >aiCol[i]>pNew->
d8b0: 61 69 43 6f 6c 5b 69 2d 31 5d 20 29 3b 0a 23 65  aiCol[i-1] );.#e
d8c0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
d8d0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
d8e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
d8f0: 65 74 75 72 6e 20 61 6e 20 46 74 73 35 43 6f 6c  eturn an Fts5Col
d900: 73 65 74 20 6f 62 6a 65 63 74 20 73 70 65 63 69  set object speci
d910: 66 79 69 6e 67 20 74 68 65 20 69 6e 76 65 72 73  fying the invers
d920: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 73  e of.** the cols
d930: 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  et passed as the
d940: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
d950: 2e 20 46 72 65 65 20 74 68 65 20 63 6f 6c 73 65  . Free the colse
d960: 74 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  t passed.** as t
d970: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
d980: 6e 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  nt before return
d990: 69 6e 67 2e 0a 2a 2f 0a 46 74 73 35 43 6f 6c 73  ing..*/.Fts5Cols
d9a0: 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35 50  et *sqlite3Fts5P
d9b0: 61 72 73 65 43 6f 6c 73 65 74 49 6e 76 65 72 74  arseColsetInvert
d9c0: 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72  (Fts5Parse *pPar
d9d0: 73 65 2c 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  se, Fts5Colset *
d9e0: 70 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  p){.  Fts5Colset
d9f0: 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 6e 43   *pRet;.  int nC
da00: 6f 6c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f  ol = pParse->pCo
da10: 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 0a 20 20 70  nfig->nCol;..  p
da20: 52 65 74 20 3d 20 28 46 74 73 35 43 6f 6c 73 65  Ret = (Fts5Colse
da30: 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
da40: 6c 6c 6f 63 5a 65 72 6f 28 26 70 50 61 72 73 65  llocZero(&pParse
da50: 2d 3e 72 63 2c 20 0a 20 20 20 20 20 20 73 69 7a  ->rc, .      siz
da60: 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74 29 20  eof(Fts5Colset) 
da70: 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43  + sizeof(int)*nC
da80: 6f 6c 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 52  ol.  );.  if( pR
da90: 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
daa0: 0a 20 20 20 20 69 6e 74 20 69 4f 6c 64 20 3d 20  .    int iOld = 
dab0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
dac0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
dad0: 20 20 20 20 69 66 28 20 69 4f 6c 64 3e 3d 70 2d      if( iOld>=p-
dae0: 3e 6e 43 6f 6c 20 7c 7c 20 70 2d 3e 61 69 43 6f  >nCol || p->aiCo
daf0: 6c 5b 69 4f 6c 64 5d 21 3d 69 20 29 7b 0a 20 20  l[iOld]!=i ){.  
db00: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 69 43 6f        pRet->aiCo
db10: 6c 5b 70 52 65 74 2d 3e 6e 43 6f 6c 2b 2b 5d 20  l[pRet->nCol++] 
db20: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = i;.      }else
db30: 7b 0a 20 20 20 20 20 20 20 20 69 4f 6c 64 2b 2b  {.        iOld++
db40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
db50: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
db60: 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
db70: 20 70 52 65 74 3b 0a 7d 0a 0a 46 74 73 35 43 6f   pRet;.}..Fts5Co
db80: 6c 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73  lset *sqlite3Fts
db90: 35 50 61 72 73 65 43 6f 6c 73 65 74 28 0a 20 20  5ParseColset(.  
dba0: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
dbb0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dbc0: 2f 2a 20 53 74 6f 72 65 20 53 51 4c 49 54 45 5f  /* Store SQLITE_
dbd0: 4e 4f 4d 45 4d 20 68 65 72 65 20 69 66 20 72 65  NOMEM here if re
dbe0: 71 75 69 72 65 64 20 2a 2f 0a 20 20 46 74 73 35  quired */.  Fts5
dbf0: 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
dc10: 78 69 73 74 69 6e 67 20 63 6f 6c 73 65 74 20 6f  xisting colset o
dc20: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 54  bject */.  Fts5T
dc30: 6f 6b 65 6e 20 2a 70 0a 29 7b 0a 20 20 46 74 73  oken *p.){.  Fts
dc40: 35 43 6f 6c 73 65 74 20 2a 70 52 65 74 20 3d 20  5Colset *pRet = 
dc50: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  0;.  int iCol;. 
dc60: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 63 6f 70   /* Dequoted cop
dc90: 79 20 6f 66 20 74 6f 6b 65 6e 20 70 20 2a 2f 0a  y of token p */.
dca0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 46 74  .  z = sqlite3Ft
dcb0: 73 35 53 74 72 6e 64 75 70 28 26 70 50 61 72 73  s5Strndup(&pPars
dcc0: 65 2d 3e 72 63 2c 20 70 2d 3e 70 2c 20 70 2d 3e  e->rc, p->p, p->
dcd0: 6e 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  n);.  if( pParse
dce0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
dcf0: 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
dd00: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 50 61  g *pConfig = pPa
dd10: 72 73 65 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  rse->pConfig;.  
dd20: 20 20 73 71 6c 69 74 65 33 46 74 73 35 44 65 71    sqlite3Fts5Deq
dd30: 75 6f 74 65 28 7a 29 3b 0a 20 20 20 20 66 6f 72  uote(z);.    for
dd40: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 43  (iCol=0; iCol<pC
dd50: 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  onfig->nCol; iCo
dd60: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
dd70: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
dd80: 6d 70 28 70 43 6f 6e 66 69 67 2d 3e 61 7a 43 6f  mp(pConfig->azCo
dd90: 6c 5b 69 43 6f 6c 5d 2c 20 7a 29 20 29 20 62 72  l[iCol], z) ) br
dda0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
ddb0: 66 28 20 69 43 6f 6c 3d 3d 70 43 6f 6e 66 69 67  f( iCol==pConfig
ddc0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
ddd0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
dde0: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 22 6e  Error(pParse, "n
ddf0: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25  o such column: %
de00: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  s", z);.    }els
de10: 65 7b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  e{.      pRet = 
de20: 66 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28  fts5ParseColset(
de30: 70 50 61 72 73 65 2c 20 70 43 6f 6c 73 65 74 2c  pParse, pColset,
de40: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
de50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
de60: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 52  );.  }..  if( pR
de70: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  et==0 ){.    ass
de80: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 21  ert( pParse->rc!
de90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
dea0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
deb0: 43 6f 6c 73 65 74 29 3b 0a 20 20 7d 0a 0a 20 20  Colset);.  }..  
dec0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
ded0: 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  /*.** If argumen
dee0: 74 20 70 4f 72 69 67 20 69 73 20 4e 55 4c 4c 2c  t pOrig is NULL,
def0: 20 6f 72 20 69 66 20 28 2a 70 52 63 29 20 69 73   or if (*pRc) is
df00: 20 73 65 74 20 74 6f 20 61 6e 79 74 68 69 6e 67   set to anything
df10: 20 6f 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 53   other than.** S
df20: 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68  QLITE_OK when th
df30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
df40: 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  alled, NULL is r
df50: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
df60: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 63 6f 70  Otherwise, a cop
df70: 79 20 6f 66 20 28 2a 70 4f 72 69 67 29 20 69 73  y of (*pOrig) is
df80: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
df90: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
dfa0: 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61  ** sqlite3Fts5Ma
dfb0: 6c 6c 6f 63 5a 65 72 6f 28 29 20 61 6e 64 20 61  llocZero() and a
dfc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 72   pointer to it r
dfd0: 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
dfe0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
dff0: 69 6c 73 2c 20 28 2a 70 52 63 29 20 69 73 20 73  ils, (*pRc) is s
e000: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
e010: 45 4d 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  EM and NULL is r
e020: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
e030: 69 63 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 66  ic Fts5Colset *f
e040: 74 73 35 43 6c 6f 6e 65 43 6f 6c 73 65 74 28 69  ts5CloneColset(i
e050: 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 43 6f 6c  nt *pRc, Fts5Col
e060: 73 65 74 20 2a 70 4f 72 69 67 29 7b 0a 20 20 46  set *pOrig){.  F
e070: 74 73 35 43 6f 6c 73 65 74 20 2a 70 52 65 74 3b  ts5Colset *pRet;
e080: 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a  .  if( pOrig ){.
e090: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
e0a0: 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  4 nByte = sizeof
e0b0: 28 46 74 73 35 43 6f 6c 73 65 74 29 20 2b 20 28  (Fts5Colset) + (
e0c0: 70 4f 72 69 67 2d 3e 6e 43 6f 6c 2d 31 29 20 2a  pOrig->nCol-1) *
e0d0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20   sizeof(int);.  
e0e0: 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 43 6f    pRet = (Fts5Co
e0f0: 6c 73 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73  lset*)sqlite3Fts
e100: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 52 63 2c  5MallocZero(pRc,
e110: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
e120: 20 70 52 65 74 20 29 7b 20 0a 20 20 20 20 20 20   pRet ){ .      
e130: 6d 65 6d 63 70 79 28 70 52 65 74 2c 20 70 4f 72  memcpy(pRet, pOr
e140: 69 67 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79 74  ig, (size_t)nByt
e150: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
e160: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
e170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
e180: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  et;.}../*.** Rem
e190: 6f 76 65 20 66 72 6f 6d 20 63 6f 6c 73 65 74 20  ove from colset 
e1a0: 70 43 6f 6c 73 65 74 20 61 6e 79 20 63 6f 6c 75  pColset any colu
e1b0: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  mns that are not
e1c0: 20 61 6c 73 6f 20 69 6e 20 63 6f 6c 73 65 74 20   also in colset 
e1d0: 70 4d 65 72 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  pMerge..*/.stati
e1e0: 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
e1f0: 43 6f 6c 73 65 74 28 46 74 73 35 43 6f 6c 73 65  Colset(Fts5Colse
e200: 74 20 2a 70 43 6f 6c 73 65 74 2c 20 46 74 73 35  t *pColset, Fts5
e210: 43 6f 6c 73 65 74 20 2a 70 4d 65 72 67 65 29 7b  Colset *pMerge){
e220: 0a 20 20 69 6e 74 20 69 49 6e 20 3d 20 30 3b 20  .  int iIn = 0; 
e230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
e240: 20 69 6e 70 75 74 20 69 6e 20 70 43 6f 6c 73 65   input in pColse
e250: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 72 67  t */.  int iMerg
e260: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
e270: 4e 65 78 74 20 69 6e 70 75 74 20 69 6e 20 70 4d  Next input in pM
e280: 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  erge */.  int iO
e290: 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
e2a0: 2f 2a 20 4e 65 78 74 20 6f 75 74 70 75 74 20 73  /* Next output s
e2b0: 6c 6f 74 20 69 6e 20 70 43 6f 6c 73 65 74 20 2a  lot in pColset *
e2c0: 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 49 6e 3c  /..  while( iIn<
e2d0: 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 20 26 26  pColset->nCol &&
e2e0: 20 69 4d 65 72 67 65 3c 70 4d 65 72 67 65 2d 3e   iMerge<pMerge->
e2f0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  nCol ){.    int 
e300: 69 44 69 66 66 20 3d 20 70 43 6f 6c 73 65 74 2d  iDiff = pColset-
e310: 3e 61 69 43 6f 6c 5b 69 49 6e 5d 20 2d 20 70 4d  >aiCol[iIn] - pM
e320: 65 72 67 65 2d 3e 61 69 43 6f 6c 5b 69 4d 65 72  erge->aiCol[iMer
e330: 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 69 44 69  ge];.    if( iDi
e340: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ff==0 ){.      p
e350: 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 4f  Colset->aiCol[iO
e360: 75 74 2b 2b 5d 20 3d 20 70 4d 65 72 67 65 2d 3e  ut++] = pMerge->
e370: 61 69 43 6f 6c 5b 69 4d 65 72 67 65 5d 3b 0a 20  aiCol[iMerge];. 
e380: 20 20 20 20 20 69 4d 65 72 67 65 2b 2b 3b 0a 20       iMerge++;. 
e390: 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
e3a0: 7d 65 6c 73 65 20 69 66 28 20 69 44 69 66 66 3e  }else if( iDiff>
e3b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 4d 65 72 67  0 ){.      iMerg
e3c0: 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e++;.    }else{.
e3d0: 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
e3e0: 20 7d 0a 20 20 7d 0a 20 20 70 43 6f 6c 73 65 74   }.  }.  pColset
e3f0: 2d 3e 6e 43 6f 6c 20 3d 20 69 4f 75 74 3b 0a 7d  ->nCol = iOut;.}
e400: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
e410: 65 6c 79 20 61 70 70 6c 79 20 63 6f 6c 73 65 74  ely apply colset
e420: 20 70 43 6f 6c 73 65 74 20 74 6f 20 65 78 70 72   pColset to expr
e430: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 70 4e 6f 64  ession node pNod
e440: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 0a 2a 2a 20  e and all of.** 
e450: 69 74 73 20 64 65 63 65 6e 64 65 6e 74 73 2e 20  its decendents. 
e460: 49 66 20 28 2a 70 70 46 72 65 65 29 20 69 73 20  If (*ppFree) is 
e470: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 63 6f 6e  not NULL, it con
e480: 74 61 69 6e 73 20 61 20 73 70 61 72 65 20 63 6f  tains a spare co
e490: 70 79 0a 2a 2a 20 6f 66 20 70 43 6f 6c 73 65 74  py.** of pColset
e4a0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
e4b0: 6d 61 79 20 75 73 65 20 74 68 65 20 73 70 61 72  may use the spar
e4c0: 65 20 63 6f 70 79 20 61 6e 64 20 73 65 74 20 28  e copy and set (
e4d0: 2a 70 70 46 72 65 65 29 20 74 6f 0a 2a 2a 20 7a  *ppFree) to.** z
e4e0: 65 72 6f 2c 20 6f 72 20 69 74 20 6d 61 79 20 63  ero, or it may c
e4f0: 72 65 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  reate copies of 
e500: 70 43 6f 6c 73 65 74 20 75 73 69 6e 67 20 66 74  pColset using ft
e510: 73 35 43 6c 6f 6e 65 43 6f 6c 73 65 74 28 29 2e  s5CloneColset().
e520: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e530: 66 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73  fts5ParseSetCols
e540: 65 74 28 0a 20 20 46 74 73 35 50 61 72 73 65 20  et(.  Fts5Parse 
e550: 2a 70 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35  *pParse, .  Fts5
e560: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  ExprNode *pNode,
e570: 20 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a   .  Fts5Colset *
e580: 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 43  pColset,.  Fts5C
e590: 6f 6c 73 65 74 20 2a 2a 70 70 46 72 65 65 0a 29  olset **ppFree.)
e5a0: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
e5b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e5c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f  .    assert( pNo
e5d0: 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  de->eType==FTS5_
e5e0: 54 45 52 4d 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65  TERM || pNode->e
e5f0: 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e  Type==FTS5_STRIN
e600: 47 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  G .         || p
e610: 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Node->eType==FTS
e620: 35 5f 41 4e 44 20 20 7c 7c 20 70 4e 6f 64 65 2d  5_AND  || pNode-
e630: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4f 52 0a  >eType==FTS5_OR.
e640: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 6f 64           || pNod
e650: 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e  e->eType==FTS5_N
e660: 4f 54 20 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54  OT  || pNode->eT
e670: 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46 0a 20 20  ype==FTS5_EOF.  
e680: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f    );.    if( pNo
e690: 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  de->eType==FTS5_
e6a0: 53 54 52 49 4e 47 20 7c 7c 20 70 4e 6f 64 65 2d  STRING || pNode-
e6b0: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
e6c0: 4d 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45  M ){.      Fts5E
e6d0: 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61  xprNearset *pNea
e6e0: 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72  r = pNode->pNear
e6f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 61  ;.      if( pNea
e700: 72 2d 3e 70 43 6f 6c 73 65 74 20 29 7b 0a 20 20  r->pColset ){.  
e710: 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 43        fts5MergeC
e720: 6f 6c 73 65 74 28 70 4e 65 61 72 2d 3e 70 43 6f  olset(pNear->pCo
e730: 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74 29 3b 0a  lset, pColset);.
e740: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 61          if( pNea
e750: 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c  r->pColset->nCol
e760: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e770: 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 3d 20   pNode->eType = 
e780: 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20 20  FTS5_EOF;.      
e790: 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65 78 74      pNode->xNext
e7a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
e7b0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e7c0: 2a 70 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20  *ppFree ){.     
e7d0: 20 20 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65     pNear->pColse
e7e0: 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20  t = pColset;.   
e7f0: 20 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30       *ppFree = 0
e800: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e810: 20 20 20 20 20 20 20 70 4e 65 61 72 2d 3e 70 43         pNear->pC
e820: 6f 6c 73 65 74 20 3d 20 66 74 73 35 43 6c 6f 6e  olset = fts5Clon
e830: 65 43 6f 6c 73 65 74 28 26 70 50 61 72 73 65 2d  eColset(&pParse-
e840: 3e 72 63 2c 20 70 43 6f 6c 73 65 74 29 3b 0a 20  >rc, pColset);. 
e850: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e860: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
e870: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f       assert( pNo
e880: 64 65 2d 3e 65 54 79 70 65 21 3d 46 54 53 35 5f  de->eType!=FTS5_
e890: 45 4f 46 20 7c 7c 20 70 4e 6f 64 65 2d 3e 6e 43  EOF || pNode->nC
e8a0: 68 69 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20  hild==0 );.     
e8b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f 64   for(i=0; i<pNod
e8c0: 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29 7b  e->nChild; i++){
e8d0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 50 61 72  .        fts5Par
e8e0: 73 65 53 65 74 43 6f 6c 73 65 74 28 70 50 61 72  seSetColset(pPar
e8f0: 73 65 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69  se, pNode->apChi
e900: 6c 64 5b 69 5d 2c 20 70 43 6f 6c 73 65 74 2c 20  ld[i], pColset, 
e910: 70 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 7d  ppFree);.      }
e920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
e930: 0a 2a 2a 20 41 70 70 6c 79 20 63 6f 6c 73 65 74  .** Apply colset
e940: 20 70 43 6f 6c 73 65 74 20 74 6f 20 65 78 70 72   pColset to expr
e950: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 70 45 78 70  ession node pExp
e960: 72 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  r and all of its
e970: 20 64 65 73 63 65 6e 64 65 6e 74 73 2e 0a 2a 2f   descendents..*/
e980: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
e990: 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28  5ParseSetColset(
e9a0: 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50  .  Fts5Parse *pP
e9b0: 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78 70  arse, .  Fts5Exp
e9c0: 72 4e 6f 64 65 20 2a 70 45 78 70 72 2c 20 0a 20  rNode *pExpr, . 
e9d0: 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
e9e0: 6c 73 65 74 20 0a 29 7b 0a 20 20 46 74 73 35 43  lset .){.  Fts5C
e9f0: 6f 6c 73 65 74 20 2a 70 46 72 65 65 20 3d 20 70  olset *pFree = p
ea00: 43 6f 6c 73 65 74 3b 0a 20 20 69 66 28 20 70 50  Colset;.  if( pP
ea10: 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  arse->pConfig->e
ea20: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
ea30: 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
ea40: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
ea50: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70  ITE_ERROR;.    p
ea60: 50 61 72 73 65 2d 3e 7a 45 72 72 20 3d 20 73 71  Parse->zErr = sq
ea70: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
ea80: 20 20 20 20 20 22 66 74 73 35 3a 20 63 6f 6c 75       "fts5: colu
ea90: 6d 6e 20 71 75 65 72 69 65 73 20 61 72 65 20 6e  mn queries are n
eaa0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 28 64 65  ot supported (de
eab0: 74 61 69 6c 3d 6e 6f 6e 65 29 22 0a 20 20 20 20  tail=none)".    
eac0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ead0: 66 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73  fts5ParseSetCols
eae0: 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
eaf0: 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 46 72 65  , pColset, &pFre
eb00: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
eb10: 33 5f 66 72 65 65 28 70 46 72 65 65 29 3b 0a 7d  3_free(pFree);.}
eb20: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
eb30: 73 35 45 78 70 72 41 73 73 69 67 6e 58 4e 65 78  s5ExprAssignXNex
eb40: 74 28 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  t(Fts5ExprNode *
eb50: 70 4e 6f 64 65 29 7b 0a 20 20 73 77 69 74 63 68  pNode){.  switch
eb60: 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29  ( pNode->eType )
eb70: 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f  {.    case FTS5_
eb80: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
eb90: 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 20  Fts5ExprNearset 
eba0: 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d 3e  *pNear = pNode->
ebb0: 70 4e 65 61 72 3b 0a 20 20 20 20 20 20 69 66 28  pNear;.      if(
ebc0: 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3d   pNear->nPhrase=
ebd0: 3d 31 20 26 26 20 70 4e 65 61 72 2d 3e 61 70 50  =1 && pNear->apP
ebe0: 68 72 61 73 65 5b 30 5d 2d 3e 6e 54 65 72 6d 3d  hrase[0]->nTerm=
ebf0: 3d 31 20 0a 20 20 20 20 20 20 20 26 26 20 70 4e  =1 .       && pN
ec00: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
ec10: 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f  ->aTerm[0].pSyno
ec20: 6e 79 6d 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nym==0.       &&
ec30: 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65   pNear->apPhrase
ec40: 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46  [0]->aTerm[0].bF
ec50: 69 72 73 74 3d 3d 30 0a 20 20 20 20 20 20 29 7b  irst==0.      ){
ec60: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  .        pNode->
ec70: 65 54 79 70 65 20 3d 20 46 54 53 35 5f 54 45 52  eType = FTS5_TER
ec80: 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65  M;.        pNode
ec90: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78  ->xNext = fts5Ex
eca0: 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45 52 4d 3b  prNodeNext_TERM;
ecb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ecc0: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65        pNode->xNe
ecd0: 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  xt = fts5ExprNod
ece0: 65 4e 65 78 74 5f 53 54 52 49 4e 47 3b 0a 20 20  eNext_STRING;.  
ecf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ed00: 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 63  k;.    };..    c
ed10: 61 73 65 20 46 54 53 35 5f 4f 52 3a 20 7b 0a 20  ase FTS5_OR: {. 
ed20: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65 78       pNode->xNex
ed30: 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  t = fts5ExprNode
ed40: 4e 65 78 74 5f 4f 52 3b 0a 20 20 20 20 20 20 62  Next_OR;.      b
ed50: 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20  reak;.    };..  
ed60: 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a    case FTS5_AND:
ed70: 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e   {.      pNode->
ed80: 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70 72  xNext = fts5Expr
ed90: 4e 6f 64 65 4e 65 78 74 5f 41 4e 44 3b 0a 20 20  NodeNext_AND;.  
eda0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
edb0: 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  ;..    default: 
edc0: 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65  assert( pNode->e
edd0: 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29  Type==FTS5_NOT )
ede0: 3b 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  ; {.      pNode-
edf0: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70  >xNext = fts5Exp
ee00: 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54 3b 0a 20  rNodeNext_NOT;. 
ee10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ee20: 7d 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  };.  }.}..static
ee30: 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 41 64   void fts5ExprAd
ee40: 64 43 68 69 6c 64 72 65 6e 28 46 74 73 35 45 78  dChildren(Fts5Ex
ee50: 70 72 4e 6f 64 65 20 2a 70 2c 20 46 74 73 35 45  prNode *p, Fts5E
ee60: 78 70 72 4e 6f 64 65 20 2a 70 53 75 62 29 7b 0a  xprNode *pSub){.
ee70: 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 21 3d    if( p->eType!=
ee80: 46 54 53 35 5f 4e 4f 54 20 26 26 20 70 53 75 62  FTS5_NOT && pSub
ee90: 2d 3e 65 54 79 70 65 3d 3d 70 2d 3e 65 54 79 70  ->eType==p->eTyp
eea0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  e ){.    int nBy
eeb0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
eec0: 45 78 70 72 4e 6f 64 65 2a 29 20 2a 20 70 53 75  ExprNode*) * pSu
eed0: 62 2d 3e 6e 43 68 69 6c 64 3b 0a 20 20 20 20 6d  b->nChild;.    m
eee0: 65 6d 63 70 79 28 26 70 2d 3e 61 70 43 68 69 6c  emcpy(&p->apChil
eef0: 64 5b 70 2d 3e 6e 43 68 69 6c 64 5d 2c 20 70 53  d[p->nChild], pS
ef00: 75 62 2d 3e 61 70 43 68 69 6c 64 2c 20 6e 42 79  ub->apChild, nBy
ef10: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 68 69  te);.    p->nChi
ef20: 6c 64 20 2b 3d 20 70 53 75 62 2d 3e 6e 43 68 69  ld += pSub->nChi
ef30: 6c 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ld;.    sqlite3_
ef40: 66 72 65 65 28 70 53 75 62 29 3b 0a 20 20 7d 65  free(pSub);.  }e
ef50: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61 70 43 68  lse{.    p->apCh
ef60: 69 6c 64 5b 70 2d 3e 6e 43 68 69 6c 64 2b 2b 5d  ild[p->nChild++]
ef70: 20 3d 20 70 53 75 62 3b 0a 20 20 7d 0a 7d 0a 0a   = pSub;.  }.}..
ef80: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
ef90: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
efa0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65 63  expression objec
efb0: 74 2e 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  t. If anything g
efc0: 6f 65 73 20 77 72 6f 6e 67 20 28 69 2e 65 2e 0a  oes wrong (i.e..
efd0: 2a 2a 20 4f 4f 4d 20 65 72 72 6f 72 29 2c 20 6c  ** OOM error), l
efe0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
eff0: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
f000: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
f010: 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 73  .Fts5ExprNode *s
f020: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
f030: 6f 64 65 28 0a 20 20 46 74 73 35 50 61 72 73 65  ode(.  Fts5Parse
f040: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f050: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
f060: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
f070: 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f090: 46 54 53 35 5f 53 54 52 49 4e 47 2c 20 41 4e 44  FTS5_STRING, AND
f0a0: 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 2a 2f 0a 20  , OR or NOT */. 
f0b0: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
f0c0: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
f0d0: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 63 68   /* Left hand ch
f0e0: 69 6c 64 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ild expression *
f0f0: 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  /.  Fts5ExprNode
f100: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
f110: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e      /* Right han
f120: 64 20 63 68 69 6c 64 20 65 78 70 72 65 73 73 69  d child expressi
f130: 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  on */.  Fts5Expr
f140: 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20 20  Nearset *pNear  
f150: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 53          /* For S
f160: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
f170: 73 2c 20 74 68 65 20 6e 65 61 72 20 63 6c 75 73  s, the near clus
f180: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ter */.){.  Fts5
f190: 45 78 70 72 4e 6f 64 65 20 2a 70 52 65 74 20 3d  ExprNode *pRet =
f1a0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73   0;..  if( pPars
f1b0: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
f1c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 68 69   ){.    int nChi
f1d0: 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
f1e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f1f0: 6f 66 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 72  of children of r
f200: 65 74 75 72 6e 65 64 20 6e 6f 64 65 20 2a 2f 0a  eturned node */.
f210: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
f220: 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  4 nByte;        
f230: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
f240: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
f250: 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 2a 2f  for this node */
f260: 0a 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  . .    assert( (
f270: 65 54 79 70 65 21 3d 46 54 53 35 5f 53 54 52 49  eType!=FTS5_STRI
f280: 4e 47 20 26 26 20 21 70 4e 65 61 72 29 0a 20 20  NG && !pNear).  
f290: 20 20 20 20 20 20 20 7c 7c 20 28 65 54 79 70 65         || (eType
f2a0: 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 26 26  ==FTS5_STRING &&
f2b0: 20 21 70 4c 65 66 74 20 26 26 20 21 70 52 69 67   !pLeft && !pRig
f2c0: 68 74 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ht).    );.    i
f2d0: 66 28 20 65 54 79 70 65 3d 3d 46 54 53 35 5f 53  f( eType==FTS5_S
f2e0: 54 52 49 4e 47 20 26 26 20 70 4e 65 61 72 3d 3d  TRING && pNear==
f2f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f300: 20 20 69 66 28 20 65 54 79 70 65 21 3d 46 54 53    if( eType!=FTS
f310: 35 5f 53 54 52 49 4e 47 20 26 26 20 70 4c 65 66  5_STRING && pLef
f320: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70 52  t==0 ) return pR
f330: 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 65 54  ight;.    if( eT
f340: 79 70 65 21 3d 46 54 53 35 5f 53 54 52 49 4e 47  ype!=FTS5_STRING
f350: 20 26 26 20 70 52 69 67 68 74 3d 3d 30 20 29 20   && pRight==0 ) 
f360: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 0a 20  return pLeft;.. 
f370: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 46 54     if( eType==FT
f380: 53 35 5f 4e 4f 54 20 29 7b 0a 20 20 20 20 20 20  S5_NOT ){.      
f390: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20  nChild = 2;.    
f3a0: 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d  }else if( eType=
f3b0: 3d 46 54 53 35 5f 41 4e 44 20 7c 7c 20 65 54 79  =FTS5_AND || eTy
f3c0: 70 65 3d 3d 46 54 53 35 5f 4f 52 20 29 7b 0a 20  pe==FTS5_OR ){. 
f3d0: 20 20 20 20 20 6e 43 68 69 6c 64 20 3d 20 32 3b       nChild = 2;
f3e0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
f3f0: 2d 3e 65 54 79 70 65 3d 3d 65 54 79 70 65 20 29  ->eType==eType )
f400: 20 6e 43 68 69 6c 64 20 2b 3d 20 70 4c 65 66 74   nChild += pLeft
f410: 2d 3e 6e 43 68 69 6c 64 2d 31 3b 0a 20 20 20 20  ->nChild-1;.    
f420: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 65 54    if( pRight->eT
f430: 79 70 65 3d 3d 65 54 79 70 65 20 29 20 6e 43 68  ype==eType ) nCh
f440: 69 6c 64 20 2b 3d 20 70 52 69 67 68 74 2d 3e 6e  ild += pRight->n
f450: 43 68 69 6c 64 2d 31 3b 0a 20 20 20 20 7d 0a 0a  Child-1;.    }..
f460: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
f470: 6f 66 28 46 74 73 35 45 78 70 72 4e 6f 64 65 29  of(Fts5ExprNode)
f480: 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78   + sizeof(Fts5Ex
f490: 70 72 4e 6f 64 65 2a 29 2a 28 6e 43 68 69 6c 64  prNode*)*(nChild
f4a0: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
f4b0: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 73  (Fts5ExprNode*)s
f4c0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
f4d0: 5a 65 72 6f 28 26 70 50 61 72 73 65 2d 3e 72 63  Zero(&pParse->rc
f4e0: 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20 69  , nByte);..    i
f4f0: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
f500: 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d 20 65   pRet->eType = e
f510: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 52 65 74  Type;.      pRet
f520: 2d 3e 70 4e 65 61 72 20 3d 20 70 4e 65 61 72 3b  ->pNear = pNear;
f530: 0a 20 20 20 20 20 20 66 74 73 35 45 78 70 72 41  .      fts5ExprA
f540: 73 73 69 67 6e 58 4e 65 78 74 28 70 52 65 74 29  ssignXNext(pRet)
f550: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
f560: 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 29  e==FTS5_STRING )
f570: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50  {.        int iP
f580: 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20 66  hrase;.        f
f590: 6f 72 28 69 50 68 72 61 73 65 3d 30 3b 20 69 50  or(iPhrase=0; iP
f5a0: 68 72 61 73 65 3c 70 4e 65 61 72 2d 3e 6e 50 68  hrase<pNear->nPh
f5b0: 72 61 73 65 3b 20 69 50 68 72 61 73 65 2b 2b 29  rase; iPhrase++)
f5c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 61  {.          pNea
f5d0: 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 50 68 72  r->apPhrase[iPhr
f5e0: 61 73 65 5d 2d 3e 70 4e 6f 64 65 20 3d 20 70 52  ase]->pNode = pR
f5f0: 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  et;.          if
f600: 28 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  ( pNear->apPhras
f610: 65 5b 69 50 68 72 61 73 65 5d 2d 3e 6e 54 65 72  e[iPhrase]->nTer
f620: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
f630: 20 20 20 20 70 52 65 74 2d 3e 78 4e 65 78 74 20      pRet->xNext 
f640: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
f650: 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d 20 46   pRet->eType = F
f660: 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20 20 20  TS5_EOF;.       
f670: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
f680: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
f690: 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  se->pConfig->eDe
f6a0: 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
f6b0: 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  L_FULL ){.      
f6c0: 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
f6d0: 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e  se *pPhrase = pN
f6e0: 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
f6f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f700: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 21 3d  pNear->nPhrase!=
f710: 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  1 .           ||
f720: 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e   pPhrase->nTerm>
f730: 31 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  1.           || 
f740: 28 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e  (pPhrase->nTerm>
f750: 30 20 26 26 20 70 50 68 72 61 73 65 2d 3e 61 54  0 && pPhrase->aT
f760: 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 29 0a 20  erm[0].bFirst). 
f770: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
f780: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f790: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
f7a0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
f7b0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
f7c0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
f7e0: 72 74 28 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  rt( pParse->zErr
f7f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
f800: 20 20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 20     pParse->zErr 
f810: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
f820: 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
f830: 20 20 20 22 66 74 73 35 3a 20 25 73 20 71 75 65     "fts5: %s que
f840: 72 69 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70  ries are not sup
f850: 70 6f 72 74 65 64 20 28 64 65 74 61 69 6c 21 3d  ported (detail!=
f860: 66 75 6c 6c 29 22 2c 20 0a 20 20 20 20 20 20 20  full)", .       
f870: 20 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d 3e           pNear->
f880: 6e 50 68 72 61 73 65 3d 3d 31 20 3f 20 22 70 68  nPhrase==1 ? "ph
f890: 72 61 73 65 22 3a 20 22 4e 45 41 52 22 0a 20 20  rase": "NEAR".  
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b                );
f8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
f8c0: 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b  ite3_free(pRet);
f8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65  .            pRe
f8e0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
f8f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
f900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f910: 20 20 66 74 73 35 45 78 70 72 41 64 64 43 68 69    fts5ExprAddChi
f920: 6c 64 72 65 6e 28 70 52 65 74 2c 20 70 4c 65 66  ldren(pRet, pLef
f930: 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
f940: 45 78 70 72 41 64 64 43 68 69 6c 64 72 65 6e 28  ExprAddChildren(
f950: 70 52 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  pRet, pRight);. 
f960: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f970: 0a 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ..  if( pRet==0 
f980: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f990: 50 61 72 73 65 2d 3e 72 63 21 3d 53 51 4c 49 54  Parse->rc!=SQLIT
f9a0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69  E_OK );.    sqli
f9b0: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
f9c0: 46 72 65 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  Free(pLeft);.   
f9d0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
f9e0: 65 4e 6f 64 65 46 72 65 65 28 70 52 69 67 68 74  eNodeFree(pRight
f9f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
fa00: 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46 72  s5ParseNearsetFr
fa10: 65 65 28 70 4e 65 61 72 29 3b 0a 20 20 7d 0a 20  ee(pNear);.  }. 
fa20: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
fa30: 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 73  .Fts5ExprNode *s
fa40: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 49  qlite3Fts5ParseI
fa50: 6d 70 6c 69 63 69 74 41 6e 64 28 0a 20 20 46 74  mplicitAnd(.  Ft
fa60: 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s5Parse *pParse,
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa80: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
fa90: 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  /.  Fts5ExprNode
faa0: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20   *pLeft,        
fab0: 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64      /* Left hand
fac0: 20 63 68 69 6c 64 20 65 78 70 72 65 73 73 69 6f   child expressio
fad0: 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e  n */.  Fts5ExprN
fae0: 6f 64 65 20 2a 70 52 69 67 68 74 20 20 20 20 20  ode *pRight     
faf0: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
fb00: 68 61 6e 64 20 63 68 69 6c 64 20 65 78 70 72 65  hand child expre
fb10: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 46 74  ssion */.){.  Ft
fb20: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 65 74  s5ExprNode *pRet
fb30: 20 3d 20 30 3b 0a 20 20 46 74 73 35 45 78 70 72   = 0;.  Fts5Expr
fb40: 4e 6f 64 65 20 2a 70 50 72 65 76 3b 0a 0a 20 20  Node *pPrev;..  
fb50: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 20 29  if( pParse->rc )
fb60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
fb70: 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28 70  5ParseNodeFree(p
fb80: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
fb90: 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46  e3Fts5ParseNodeF
fba0: 72 65 65 28 70 52 69 67 68 74 29 3b 0a 20 20 7d  ree(pRight);.  }
fbb0: 65 6c 73 65 7b 0a 0a 20 20 20 20 61 73 73 65 72  else{..    asser
fbc0: 74 28 20 70 4c 65 66 74 2d 3e 65 54 79 70 65 3d  t( pLeft->eType=
fbd0: 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 0a 20 20  =FTS5_STRING .  
fbe0: 20 20 20 20 20 20 7c 7c 20 70 4c 65 66 74 2d 3e        || pLeft->
fbf0: 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d  eType==FTS5_TERM
fc00: 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 65 66  .        || pLef
fc10: 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 45  t->eType==FTS5_E
fc20: 4f 46 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 4c  OF.        || pL
fc30: 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  eft->eType==FTS5
fc40: 5f 41 4e 44 0a 20 20 20 20 29 3b 0a 20 20 20 20  _AND.    );.    
fc50: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
fc60: 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49  eType==FTS5_STRI
fc70: 4e 47 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 70  NG .        || p
fc80: 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46 54  Right->eType==FT
fc90: 53 35 5f 54 45 52 4d 20 0a 20 20 20 20 20 20 20  S5_TERM .       
fca0: 20 7c 7c 20 70 52 69 67 68 74 2d 3e 65 54 79 70   || pRight->eTyp
fcb0: 65 3d 3d 46 54 53 35 5f 45 4f 46 20 0a 20 20 20  e==FTS5_EOF .   
fcc0: 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65   );..    if( pLe
fcd0: 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  ft->eType==FTS5_
fce0: 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50 72  AND ){.      pPr
fcf0: 65 76 20 3d 20 70 4c 65 66 74 2d 3e 61 70 43 68  ev = pLeft->apCh
fd00: 69 6c 64 5b 70 4c 65 66 74 2d 3e 6e 43 68 69 6c  ild[pLeft->nChil
fd10: 64 2d 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  d-1];.    }else{
fd20: 0a 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70  .      pPrev = p
fd30: 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Left;.    }.    
fd40: 61 73 73 65 72 74 28 20 70 50 72 65 76 2d 3e 65  assert( pPrev->e
fd50: 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e  Type==FTS5_STRIN
fd60: 47 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 50  G .        || pP
fd70: 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  rev->eType==FTS5
fd80: 5f 54 45 52 4d 20 0a 20 20 20 20 20 20 20 20 7c  _TERM .        |
fd90: 7c 20 70 50 72 65 76 2d 3e 65 54 79 70 65 3d 3d  | pPrev->eType==
fda0: 46 54 53 35 5f 45 4f 46 20 0a 20 20 20 20 20 20  FTS5_EOF .      
fdb0: 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 52    );..    if( pR
fdc0: 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53  ight->eType==FTS
fdd0: 35 5f 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 61  5_EOF ){.      a
fde0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
fdf0: 70 50 68 72 61 73 65 5b 70 50 61 72 73 65 2d 3e  pPhrase[pParse->
fe00: 6e 50 68 72 61 73 65 2d 31 5d 3d 3d 70 52 69 67  nPhrase-1]==pRig
fe10: 68 74 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72  ht->pNear->apPhr
fe20: 61 73 65 5b 30 5d 20 29 3b 0a 20 20 20 20 20 20  ase[0] );.      
fe30: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
fe40: 4e 6f 64 65 46 72 65 65 28 70 52 69 67 68 74 29  NodeFree(pRight)
fe50: 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 70  ;.      pRet = p
fe60: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 50 61 72  Left;.      pPar
fe70: 73 65 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a 20  se->nPhrase--;. 
fe80: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
fe90: 28 20 70 50 72 65 76 2d 3e 65 54 79 70 65 3d 3d  ( pPrev->eType==
fea0: 46 54 53 35 5f 45 4f 46 20 29 7b 0a 20 20 20 20  FTS5_EOF ){.    
feb0: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
fec0: 20 2a 2a 61 70 3b 0a 0a 20 20 20 20 20 20 69 66   **ap;..      if
fed0: 28 20 70 50 72 65 76 3d 3d 70 4c 65 66 74 20 29  ( pPrev==pLeft )
fee0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  {.        pRet =
fef0: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d   pRight;.      }
ff00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4c  else{.        pL
ff10: 65 66 74 2d 3e 61 70 43 68 69 6c 64 5b 70 4c 65  eft->apChild[pLe
ff20: 66 74 2d 3e 6e 43 68 69 6c 64 2d 31 5d 20 3d 20  ft->nChild-1] = 
ff30: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
ff40: 70 52 65 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  pRet = pLeft;.  
ff50: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 70 20      }..      ap 
ff60: 3d 20 26 70 50 61 72 73 65 2d 3e 61 70 50 68 72  = &pParse->apPhr
ff70: 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72  ase[pParse->nPhr
ff80: 61 73 65 2d 31 2d 70 52 69 67 68 74 2d 3e 70 4e  ase-1-pRight->pN
ff90: 65 61 72 2d 3e 6e 50 68 72 61 73 65 5d 3b 0a 20  ear->nPhrase];. 
ffa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 5b       assert( ap[
ffb0: 30 5d 3d 3d 70 50 72 65 76 2d 3e 70 4e 65 61 72  0]==pPrev->pNear
ffc0: 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 20 29 3b  ->apPhrase[0] );
ffd0: 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61  .      memmove(a
ffe0: 70 2c 20 26 61 70 5b 31 5d 2c 20 73 69 7a 65 6f  p, &ap[1], sizeo
fff0: 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65  f(Fts5ExprPhrase
10000 2a 29 2a 70 52 69 67 68 74 2d 3e 70 4e 65 61 72  *)*pRight->pNear
10010 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20 20 20 20  ->nPhrase);.    
10020 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73    pParse->nPhras
10030 65 2d 2d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  e--;..      sqli
10040 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
10050 46 72 65 65 28 70 50 72 65 76 29 3b 0a 20 20 20  Free(pPrev);.   
10060 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20   }.    else{.   
10070 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
10080 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28 70  3Fts5ParseNode(p
10090 50 61 72 73 65 2c 20 46 54 53 35 5f 41 4e 44 2c  Parse, FTS5_AND,
100a0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
100b0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
100c0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
100d0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66 74  .static char *ft
100e0 73 35 45 78 70 72 54 65 72 6d 50 72 69 6e 74 28  s5ExprTermPrint(
100f0 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54  Fts5ExprTerm *pT
10100 65 72 6d 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  erm){.  sqlite3_
10110 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 30 3b  int64 nByte = 0;
10120 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20  .  Fts5ExprTerm 
10130 2a 70 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 6f  *p;.  char *zQuo
10140 74 65 64 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72  ted;..  /* Deter
10150 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
10160 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
10170 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
10180 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b 20  for(p=pTerm; p; 
10190 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b 0a  p=p->pSynonym){.
101a0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 28 69 6e      nByte += (in
101b0 74 29 73 74 72 6c 65 6e 28 70 54 65 72 6d 2d 3e  t)strlen(pTerm->
101c0 7a 54 65 72 6d 29 20 2a 20 32 20 2b 20 33 20 2b  zTerm) * 2 + 3 +
101d0 20 32 3b 0a 20 20 7d 0a 20 20 7a 51 75 6f 74 65   2;.  }.  zQuote
101e0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
101f0 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 0a 20 20  oc64(nByte);..  
10200 69 66 28 20 7a 51 75 6f 74 65 64 20 29 7b 0a 20  if( zQuoted ){. 
10210 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
10220 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70    for(p=pTerm; p
10230 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29  ; p=p->pSynonym)
10240 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49  {.      char *zI
10250 6e 20 3d 20 70 2d 3e 7a 54 65 72 6d 3b 0a 20 20  n = p->zTerm;.  
10260 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d      zQuoted[i++]
10270 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 77 68   = '"';.      wh
10280 69 6c 65 28 20 2a 7a 49 6e 20 29 7b 0a 20 20 20  ile( *zIn ){.   
10290 20 20 20 20 20 69 66 28 20 2a 7a 49 6e 3d 3d 27       if( *zIn=='
102a0 22 27 20 29 20 7a 51 75 6f 74 65 64 5b 69 2b 2b  "' ) zQuoted[i++
102b0 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ] = '"';.       
102c0 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20   zQuoted[i++] = 
102d0 2a 7a 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  *zIn++;.      }.
102e0 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b        zQuoted[i+
102f0 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20  +] = '"';.      
10300 69 66 28 20 70 2d 3e 70 53 79 6e 6f 6e 79 6d 20  if( p->pSynonym 
10310 29 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d  ) zQuoted[i++] =
10320 20 27 7c 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   '|';.    }.    
10330 69 66 28 20 70 54 65 72 6d 2d 3e 62 50 72 65 66  if( pTerm->bPref
10340 69 78 20 29 7b 0a 20 20 20 20 20 20 7a 51 75 6f  ix ){.      zQuo
10350 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 20 27 3b 0a  ted[i++] = ' ';.
10360 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b        zQuoted[i+
10370 2b 5d 20 3d 20 27 2a 27 3b 0a 20 20 20 20 7d 0a  +] = '*';.    }.
10380 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d      zQuoted[i++]
10390 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72   = '\0';.  }.  r
103a0 65 74 75 72 6e 20 7a 51 75 6f 74 65 64 3b 0a 7d  eturn zQuoted;.}
103b0 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66  ..static char *f
103c0 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
103d0 63 68 61 72 20 2a 7a 41 70 70 2c 20 63 6f 6e 73  char *zApp, cons
103e0 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  t char *zFmt, ..
103f0 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77  .){.  char *zNew
10400 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  ;.  va_list ap;.
10410 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
10420 46 6d 74 29 3b 0a 20 20 7a 4e 65 77 20 3d 20 73  Fmt);.  zNew = s
10430 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
10440 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  zFmt, ap);.  va_
10450 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
10460 41 70 70 20 26 26 20 7a 4e 65 77 20 29 7b 0a 20  App && zNew ){. 
10470 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 32 20 3d     char *zNew2 =
10480 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10490 28 22 25 73 25 73 22 2c 20 7a 41 70 70 2c 20 7a  ("%s%s", zApp, z
104a0 4e 65 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  New);.    sqlite
104b0 33 5f 66 72 65 65 28 7a 4e 65 77 29 3b 0a 20 20  3_free(zNew);.  
104c0 20 20 7a 4e 65 77 20 3d 20 7a 4e 65 77 32 3b 0a    zNew = zNew2;.
104d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
104e0 65 65 28 7a 41 70 70 29 3b 0a 20 20 72 65 74 75  ee(zApp);.  retu
104f0 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zNew;.}../*.*
10500 2a 20 43 6f 6d 70 6f 73 65 20 61 20 74 63 6c 2d  * Compose a tcl-
10510 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65  readable represe
10520 6e 74 61 74 69 6f 6e 20 6f 66 20 65 78 70 72 65  ntation of expre
10530 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 52 65 74  ssion pExpr. Ret
10540 75 72 6e 20 61 20 0a 2a 2a 20 70 6f 69 6e 74 65  urn a .** pointe
10550 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
10560 6e 74 61 69 6e 69 6e 67 20 74 68 61 74 20 72 65  ntaining that re
10570 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 49 74  presentation. It
10580 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
10590 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
105a0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 74 20 73  e caller to at s
105b0 6f 6d 65 20 70 6f 69 6e 74 20 66 72 65 65 20 74  ome point free t
105c0 68 65 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  he buffer using 
105d0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65  .** sqlite3_free
105e0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
105f0 61 72 20 2a 66 74 73 35 45 78 70 72 50 72 69 6e  ar *fts5ExprPrin
10600 74 54 63 6c 28 0a 20 20 46 74 73 35 43 6f 6e 66  tTcl(.  Fts5Conf
10610 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
10620 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 61  const char *zNea
10630 72 73 65 74 43 6d 64 2c 0a 20 20 46 74 73 35 45  rsetCmd,.  Fts5E
10640 78 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 0a 29  xprNode *pExpr.)
10650 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  {.  char *zRet =
10660 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
10670 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52  >eType==FTS5_STR
10680 49 4e 47 20 7c 7c 20 70 45 78 70 72 2d 3e 65 54  ING || pExpr->eT
10690 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29  ype==FTS5_TERM )
106a0 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e 65  {.    Fts5ExprNe
106b0 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70  arset *pNear = p
106c0 45 78 70 72 2d 3e 70 4e 65 61 72 3b 0a 20 20 20  Expr->pNear;.   
106d0 20 69 6e 74 20 69 3b 20 0a 20 20 20 20 69 6e 74   int i; .    int
106e0 20 69 54 65 72 6d 3b 0a 0a 20 20 20 20 7a 52 65   iTerm;..    zRe
106f0 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70  t = fts5PrintfAp
10700 70 65 6e 64 28 7a 52 65 74 2c 20 22 25 73 20 22  pend(zRet, "%s "
10710 2c 20 7a 4e 65 61 72 73 65 74 43 6d 64 29 3b 0a  , zNearsetCmd);.
10720 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20      if( zRet==0 
10730 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
10740 69 66 28 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73  if( pNear->pCols
10750 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
10760 2a 61 69 43 6f 6c 20 3d 20 70 4e 65 61 72 2d 3e  *aiCol = pNear->
10770 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a  pColset->aiCol;.
10780 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
10790 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 2d   pNear->pColset-
107a0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28  >nCol;.      if(
107b0 20 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20   nCol==1 ){.    
107c0 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50      zRet = fts5P
107d0 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74  rintfAppend(zRet
107e0 2c 20 22 2d 63 6f 6c 20 25 64 20 22 2c 20 61 69  , "-col %d ", ai
107f0 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  Col[0]);.      }
10800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52  else{.        zR
10810 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
10820 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2d 63 6f  ppend(zRet, "-co
10830 6c 20 7b 25 64 22 2c 20 61 69 43 6f 6c 5b 30 5d  l {%d", aiCol[0]
10840 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
10850 3d 31 3b 20 69 3c 70 4e 65 61 72 2d 3e 70 43 6f  =1; i<pNear->pCo
10860 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
10870 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 74  {.          zRet
10880 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
10890 65 6e 64 28 7a 52 65 74 2c 20 22 20 25 64 22 2c  end(zRet, " %d",
108a0 20 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   aiCol[i]);.    
108b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 52      }.        zR
108c0 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
108d0 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 7d 20 22  ppend(zRet, "} "
108e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
108f0 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72   if( zRet==0 ) r
10900 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
10910 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d 3e 6e      if( pNear->n
10920 50 68 72 61 73 65 3e 31 20 29 7b 0a 20 20 20 20  Phrase>1 ){.    
10930 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69    zRet = fts5Pri
10940 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20  ntfAppend(zRet, 
10950 22 2d 6e 65 61 72 20 25 64 20 22 2c 20 70 4e 65  "-near %d ", pNe
10960 61 72 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20 20 20  ar->nNear);.    
10970 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20    if( zRet==0 ) 
10980 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
10990 0a 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35  .    zRet = fts5
109a0 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65  PrintfAppend(zRe
109b0 74 2c 20 22 2d 2d 22 29 3b 0a 20 20 20 20 69 66  t, "--");.    if
109c0 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65 74 75  ( zRet==0 ) retu
109d0 72 6e 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 69  rn 0;..    for(i
109e0 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68  =0; i<pNear->nPh
109f0 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rase; i++){.    
10a00 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
10a10 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61   *pPhrase = pNea
10a20 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a  r->apPhrase[i];.
10a30 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74  .      zRet = ft
10a40 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a  s5PrintfAppend(z
10a50 52 65 74 2c 20 22 20 7b 22 29 3b 0a 20 20 20 20  Ret, " {");.    
10a60 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 7a    for(iTerm=0; z
10a70 52 65 74 20 26 26 20 69 54 65 72 6d 3c 70 50 68  Ret && iTerm<pPh
10a80 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 54 65  rase->nTerm; iTe
10a90 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63  rm++){.        c
10aa0 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70 50 68  har *zTerm = pPh
10ab0 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54 65 72  rase->aTerm[iTer
10ac0 6d 5d 2e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20  m].zTerm;.      
10ad0 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69    zRet = fts5Pri
10ae0 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20  ntfAppend(zRet, 
10af0 22 25 73 25 73 22 2c 20 69 54 65 72 6d 3d 3d 30  "%s%s", iTerm==0
10b00 3f 22 22 3a 22 20 22 2c 20 7a 54 65 72 6d 29 3b  ?"":" ", zTerm);
10b10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 68  .        if( pPh
10b20 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54 65 72  rase->aTerm[iTer
10b30 6d 5d 2e 62 50 72 65 66 69 78 20 29 7b 0a 20 20  m].bPrefix ){.  
10b40 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66          zRet = f
10b50 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
10b60 7a 52 65 74 2c 20 22 2a 22 29 3b 0a 20 20 20 20  zRet, "*");.    
10b70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
10b80 20 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 20       if( zRet ) 
10b90 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74  zRet = fts5Print
10ba0 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 7d  fAppend(zRet, "}
10bb0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ");.      if( zR
10bc0 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  et==0 ) return 0
10bd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
10be0 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
10bf0 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69   *zOp = 0;.    i
10c00 6e 74 20 69 3b 0a 20 20 20 20 73 77 69 74 63 68  nt i;.    switch
10c10 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 20 29  ( pExpr->eType )
10c20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53  {.      case FTS
10c30 35 5f 41 4e 44 3a 20 7a 4f 70 20 3d 20 22 41 4e  5_AND: zOp = "AN
10c40 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  D"; break;.     
10c50 20 63 61 73 65 20 46 54 53 35 5f 4e 4f 54 3a 20   case FTS5_NOT: 
10c60 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 62 72 65  zOp = "NOT"; bre
10c70 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
10c80 74 3a 20 0a 20 20 20 20 20 20 20 20 61 73 73 65  t: .        asse
10c90 72 74 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65  rt( pExpr->eType
10ca0 3d 3d 46 54 53 35 5f 4f 52 20 29 3b 0a 20 20 20  ==FTS5_OR );.   
10cb0 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b       zOp = "OR";
10cc0 20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b   .        break;
10cd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65 74  .    }..    zRet
10ce0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10cf0 74 66 28 22 25 73 22 2c 20 7a 4f 70 29 3b 0a 20  tf("%s", zOp);. 
10d00 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 52 65 74     for(i=0; zRet
10d10 20 26 26 20 69 3c 70 45 78 70 72 2d 3e 6e 43 68   && i<pExpr->nCh
10d20 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ild; i++){.     
10d30 20 63 68 61 72 20 2a 7a 20 3d 20 66 74 73 35 45   char *z = fts5E
10d40 78 70 72 50 72 69 6e 74 54 63 6c 28 70 43 6f 6e  xprPrintTcl(pCon
10d50 66 69 67 2c 20 7a 4e 65 61 72 73 65 74 43 6d 64  fig, zNearsetCmd
10d60 2c 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c 64  , pExpr->apChild
10d70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
10d80 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  !z ){.        sq
10d90 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 74 29  lite3_free(zRet)
10da0 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d  ;.        zRet =
10db0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
10dc0 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20  .        zRet = 
10dd0 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64  fts5PrintfAppend
10de0 28 7a 52 65 74 2c 20 22 20 5b 25 7a 5d 22 2c 20  (zRet, " [%z]", 
10df0 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
10e00 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
10e10 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  zRet;.}..static 
10e20 63 68 61 72 20 2a 66 74 73 35 45 78 70 72 50 72  char *fts5ExprPr
10e30 69 6e 74 28 46 74 73 35 43 6f 6e 66 69 67 20 2a  int(Fts5Config *
10e40 70 43 6f 6e 66 69 67 2c 20 46 74 73 35 45 78 70  pConfig, Fts5Exp
10e50 72 4e 6f 64 65 20 2a 70 45 78 70 72 29 7b 0a 20  rNode *pExpr){. 
10e60 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
10e70 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65 54  .  if( pExpr->eT
10e80 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ype==0 ){.    re
10e90 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72  turn sqlite3_mpr
10ea0 69 6e 74 66 28 22 5c 22 5c 22 22 29 3b 0a 20 20  intf("\"\"");.  
10eb0 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 45 78 70  }else.  if( pExp
10ec0 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53  r->eType==FTS5_S
10ed0 54 52 49 4e 47 20 7c 7c 20 70 45 78 70 72 2d 3e  TRING || pExpr->
10ee0 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d  eType==FTS5_TERM
10ef0 20 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72   ){.    Fts5Expr
10f00 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d  Nearset *pNear =
10f10 20 70 45 78 70 72 2d 3e 70 4e 65 61 72 3b 0a 20   pExpr->pNear;. 
10f20 20 20 20 69 6e 74 20 69 3b 20 0a 20 20 20 20 69     int i; .    i
10f30 6e 74 20 69 54 65 72 6d 3b 0a 0a 20 20 20 20 69  nt iTerm;..    i
10f40 66 28 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65  f( pNear->pColse
10f50 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
10f60 43 6f 6c 20 3d 20 70 4e 65 61 72 2d 3e 70 43 6f  Col = pNear->pCo
10f70 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 3b 0a  lset->aiCol[0];.
10f80 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
10f90 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
10fa0 65 74 2c 20 22 25 73 20 3a 20 22 2c 20 70 43 6f  et, "%s : ", pCo
10fb0 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 43 6f 6c  nfig->azCol[iCol
10fc0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ]);.      if( zR
10fd0 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  et==0 ) return 0
10fe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
10ff0 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e   pNear->nPhrase>
11000 31 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74 20  1 ){.      zRet 
11010 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65  = fts5PrintfAppe
11020 6e 64 28 7a 52 65 74 2c 20 22 4e 45 41 52 28 22  nd(zRet, "NEAR("
11030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65  );.      if( zRe
11040 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
11050 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
11060 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
11070 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  hrase; i++){.   
11080 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
11090 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65  e *pPhrase = pNe
110a0 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b  ar->apPhrase[i];
110b0 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 30 20  .      if( i!=0 
110c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20  ){.        zRet 
110d0 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65  = fts5PrintfAppe
110e0 6e 64 28 7a 52 65 74 2c 20 22 20 22 29 3b 0a 20  nd(zRet, " ");. 
110f0 20 20 20 20 20 20 20 69 66 28 20 7a 52 65 74 3d         if( zRet=
11100 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
11110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
11120 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c  (iTerm=0; iTerm<
11130 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20  pPhrase->nTerm; 
11140 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
11150 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20    char *zTerm = 
11160 66 74 73 35 45 78 70 72 54 65 72 6d 50 72 69 6e  fts5ExprTermPrin
11170 74 28 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72  t(&pPhrase->aTer
11180 6d 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20  m[iTerm]);.     
11190 20 20 20 69 66 28 20 7a 54 65 72 6d 20 29 7b 0a     if( zTerm ){.
111a0 20 20 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d            zRet =
111b0 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e   fts5PrintfAppen
111c0 64 28 7a 52 65 74 2c 20 22 25 73 25 73 22 2c 20  d(zRet, "%s%s", 
111d0 69 54 65 72 6d 3d 3d 30 3f 22 22 3a 22 20 2b 20  iTerm==0?"":" + 
111e0 22 2c 20 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  ", zTerm);.     
111f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11200 65 28 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  e(zTerm);.      
11210 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
11220 7a 54 65 72 6d 3d 3d 30 20 7c 7c 20 7a 52 65 74  zTerm==0 || zRet
11230 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11240 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
11250 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  et);.          r
11260 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
11270 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11280 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d  ..    if( pNear-
11290 3e 6e 50 68 72 61 73 65 3e 31 20 29 7b 0a 20 20  >nPhrase>1 ){.  
112a0 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50      zRet = fts5P
112b0 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74  rintfAppend(zRet
112c0 2c 20 22 2c 20 25 64 29 22 2c 20 70 4e 65 61 72  , ", %d)", pNear
112d0 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20 20 20 20 20  ->nNear);.      
112e0 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65  if( zRet==0 ) re
112f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
11300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
11310 20 63 6f 6e 73 74 20 2a 7a 4f 70 20 3d 20 30 3b   const *zOp = 0;
11320 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
11330 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
11340 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
11350 61 73 65 20 46 54 53 35 5f 41 4e 44 3a 20 7a 4f  ase FTS5_AND: zO
11360 70 20 3d 20 22 20 41 4e 44 20 22 3b 20 62 72 65  p = " AND "; bre
11370 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 46  ak;.      case F
11380 54 53 35 5f 4e 4f 54 3a 20 7a 4f 70 20 3d 20 22  TS5_NOT: zOp = "
11390 20 4e 4f 54 20 22 3b 20 62 72 65 61 6b 3b 0a 20   NOT "; break;. 
113a0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 0a       default:  .
113b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
113c0 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
113d0 53 35 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 20  S5_OR );.       
113e0 20 7a 4f 70 20 3d 20 22 20 4f 52 20 22 3b 20 0a   zOp = " OR "; .
113f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11400 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
11410 30 3b 20 69 3c 70 45 78 70 72 2d 3e 6e 43 68 69  0; i<pExpr->nChi
11420 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
11430 63 68 61 72 20 2a 7a 20 3d 20 66 74 73 35 45 78  char *z = fts5Ex
11440 70 72 50 72 69 6e 74 28 70 43 6f 6e 66 69 67 2c  prPrint(pConfig,
11450 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c 64 5b   pExpr->apChild[
11460 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  i]);.      if( z
11470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
11480 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 74  qlite3_free(zRet
11490 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20  );.        zRet 
114a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
114b0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 20  {.        int e 
114c0 3d 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c 64  = pExpr->apChild
114d0 5b 69 5d 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20  [i]->eType;.    
114e0 20 20 20 20 69 6e 74 20 62 20 3d 20 28 65 21 3d      int b = (e!=
114f0 46 54 53 35 5f 53 54 52 49 4e 47 20 26 26 20 65  FTS5_STRING && e
11500 21 3d 46 54 53 35 5f 54 45 52 4d 20 26 26 20 65  !=FTS5_TERM && e
11510 21 3d 46 54 53 35 5f 45 4f 46 29 3b 0a 20 20 20  !=FTS5_EOF);.   
11520 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35       zRet = fts5
11530 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65  PrintfAppend(zRe
11540 74 2c 20 22 25 73 25 73 25 7a 25 73 22 2c 20 0a  t, "%s%s%z%s", .
11550 20 20 20 20 20 20 20 20 20 20 20 20 28 69 3d 3d              (i==
11560 30 20 3f 20 22 22 20 3a 20 7a 4f 70 29 2c 0a 20  0 ? "" : zOp),. 
11570 20 20 20 20 20 20 20 20 20 20 20 28 62 3f 22 28             (b?"(
11580 22 3a 22 22 29 2c 20 7a 2c 20 28 62 3f 22 29 22  ":""), z, (b?")"
11590 3a 22 22 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  :"").        );.
115a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
115b0 28 20 7a 52 65 74 3d 3d 30 20 29 20 62 72 65 61  ( zRet==0 ) brea
115c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
115d0 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a  return zRet;.}..
115e0 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
115f0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
11600 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
11610 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 35 5f 65  functions fts5_e
11620 78 70 72 28 29 20 28 62 54 63 6c 3d 3d 30 29 0a  xpr() (bTcl==0).
11630 2a 2a 20 61 6e 64 20 66 74 73 35 5f 65 78 70 72  ** and fts5_expr
11640 5f 74 63 6c 28 29 20 28 62 54 63 6c 21 3d 30 29  _tcl() (bTcl!=0)
11650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11660 20 66 74 73 35 45 78 70 72 46 75 6e 63 74 69 6f   fts5ExprFunctio
11670 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
11680 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
11690 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
116a0 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f   call context */
116b0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
116e0 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  args */.  sqlite
116f0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c  3_value **apVal,
11700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
11710 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
11720 2a 2f 0a 20 20 69 6e 74 20 62 54 63 6c 0a 29 7b  */.  int bTcl.){
11730 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  .  Fts5Global *p
11740 47 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35 47 6c  Global = (Fts5Gl
11750 6f 62 61 6c 2a 29 73 71 6c 69 74 65 33 5f 75 73  obal*)sqlite3_us
11760 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
11770 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
11780 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
11790 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a  b_handle(pCtx);.
117a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
117b0 78 70 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  xpr = 0;.  char 
117c0 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 46 74 73  *zErr = 0;.  Fts
117d0 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 30  5Expr *pExpr = 0
117e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
117f0 74 20 69 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  t i;..  const ch
11800 61 72 20 2a 2a 61 7a 43 6f 6e 66 69 67 3b 20 20  ar **azConfig;  
11810 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
11820 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   of arguments fo
11830 72 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 2f 0a  r Fts5Config */.
11840 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
11850 65 61 72 73 65 74 43 6d 64 20 3d 20 22 6e 65 61  earsetCmd = "nea
11860 72 73 65 74 22 3b 0a 20 20 69 6e 74 20 6e 43 6f  rset";.  int nCo
11870 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
11880 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11890 20 6f 66 20 61 7a 43 6f 6e 66 69 67 5b 5d 20 2a   of azConfig[] *
118a0 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
118b0 70 43 6f 6e 66 69 67 20 3d 20 30 3b 0a 20 20 69  pConfig = 0;.  i
118c0 6e 74 20 69 41 72 67 20 3d 20 31 3b 0a 0a 20 20  nt iArg = 1;..  
118d0 69 66 28 20 6e 41 72 67 3c 31 20 29 7b 0a 20 20  if( nArg<1 ){.  
118e0 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
118f0 5f 6d 70 72 69 6e 74 66 28 22 77 72 6f 6e 67 20  _mprintf("wrong 
11900 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
11910 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20  nts to function 
11920 25 73 22 2c 0a 20 20 20 20 20 20 20 20 62 54 63  %s",.        bTc
11930 6c 20 3f 20 22 66 74 73 35 5f 65 78 70 72 5f 74  l ? "fts5_expr_t
11940 63 6c 22 20 3a 20 22 66 74 73 35 5f 65 78 70 72  cl" : "fts5_expr
11950 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ".    );.    sql
11960 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
11970 72 28 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31  r(pCtx, zErr, -1
11980 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11990 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 72  ree(zErr);.    r
119a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
119b0 28 20 62 54 63 6c 20 26 26 20 6e 41 72 67 3e 31  ( bTcl && nArg>1
119c0 20 29 7b 0a 20 20 20 20 7a 4e 65 61 72 73 65 74   ){.    zNearset
119d0 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Cmd = (const cha
119e0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
119f0 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b  _text(apVal[1]);
11a00 0a 20 20 20 20 69 41 72 67 20 3d 20 32 3b 0a 20  .    iArg = 2;. 
11a10 20 7d 0a 0a 20 20 6e 43 6f 6e 66 69 67 20 3d 20   }..  nConfig = 
11a20 33 20 2b 20 28 6e 41 72 67 2d 69 41 72 67 29 3b  3 + (nArg-iArg);
11a30 0a 20 20 61 7a 43 6f 6e 66 69 67 20 3d 20 28 63  .  azConfig = (c
11a40 6f 6e 73 74 20 63 68 61 72 2a 2a 29 73 71 6c 69  onst char**)sqli
11a50 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a  te3_malloc64(siz
11a60 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 43 6f  eof(char*) * nCo
11a70 6e 66 69 67 29 3b 0a 20 20 69 66 28 20 61 7a 43  nfig);.  if( azC
11a80 6f 6e 66 69 67 3d 3d 30 20 29 7b 0a 20 20 20 20  onfig==0 ){.    
11a90 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
11aa0 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
11ab0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
11ac0 7d 0a 20 20 61 7a 43 6f 6e 66 69 67 5b 30 5d 20  }.  azConfig[0] 
11ad0 3d 20 30 3b 0a 20 20 61 7a 43 6f 6e 66 69 67 5b  = 0;.  azConfig[
11ae0 31 5d 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 61  1] = "main";.  a
11af0 7a 43 6f 6e 66 69 67 5b 32 5d 20 3d 20 22 74 62  zConfig[2] = "tb
11b00 6c 22 3b 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69  l";.  for(i=3; i
11b10 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b  Arg<nArg; iArg++
11b20 29 7b 0a 20 20 20 20 61 7a 43 6f 6e 66 69 67 5b  ){.    azConfig[
11b30 69 2b 2b 5d 20 3d 20 28 63 6f 6e 73 74 20 63 68  i++] = (const ch
11b40 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
11b50 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69 41 72  e_text(apVal[iAr
11b60 67 5d 29 3b 0a 20 20 7d 0a 0a 20 20 7a 45 78 70  g]);.  }..  zExp
11b70 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  r = (const char*
11b80 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
11b90 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a  ext(apVal[0]);..
11ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
11bb0 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28 70 47  s5ConfigParse(pG
11bc0 6c 6f 62 61 6c 2c 20 64 62 2c 20 6e 43 6f 6e 66  lobal, db, nConf
11bd0 69 67 2c 20 61 7a 43 6f 6e 66 69 67 2c 20 26 70  ig, azConfig, &p
11be0 43 6f 6e 66 69 67 2c 20 26 7a 45 72 72 29 3b 0a  Config, &zErr);.
11bf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
11c10 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e  sqlite3Fts5ExprN
11c20 65 77 28 70 43 6f 6e 66 69 67 2c 20 70 43 6f 6e  ew(pConfig, pCon
11c30 66 69 67 2d 3e 6e 43 6f 6c 2c 20 7a 45 78 70 72  fig->nCol, zExpr
11c40 2c 20 26 70 45 78 70 72 2c 20 26 7a 45 72 72 29  , &pExpr, &zErr)
11c50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
11c60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11c70 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20   char *zText;.  
11c80 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 6f    if( pExpr->pRo
11c90 6f 74 2d 3e 78 4e 65 78 74 3d 3d 30 20 29 7b 0a  ot->xNext==0 ){.
11ca0 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 73 71        zText = sq
11cb0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22  lite3_mprintf(""
11cc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
11cd0 20 62 54 63 6c 20 29 7b 0a 20 20 20 20 20 20 7a   bTcl ){.      z
11ce0 54 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 50  Text = fts5ExprP
11cf0 72 69 6e 74 54 63 6c 28 70 43 6f 6e 66 69 67 2c  rintTcl(pConfig,
11d00 20 7a 4e 65 61 72 73 65 74 43 6d 64 2c 20 70 45   zNearsetCmd, pE
11d10 78 70 72 2d 3e 70 52 6f 6f 74 29 3b 0a 20 20 20  xpr->pRoot);.   
11d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
11d30 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 50 72  ext = fts5ExprPr
11d40 69 6e 74 28 70 43 6f 6e 66 69 67 2c 20 70 45 78  int(pConfig, pEx
11d50 70 72 2d 3e 70 52 6f 6f 74 29 3b 0a 20 20 20 20  pr->pRoot);.    
11d60 7d 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74 3d  }.    if( zText=
11d70 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
11d80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11d90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11da0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
11db0 65 78 74 28 70 43 74 78 2c 20 7a 54 65 78 74 2c  ext(pCtx, zText,
11dc0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
11dd0 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71  SIENT);.      sq
11de0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74  lite3_free(zText
11df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
11e00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11e10 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 45 72  K ){.    if( zEr
11e20 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
11e30 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
11e40 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29 3b  pCtx, zErr, -1);
11e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11e60 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d  ree(zErr);.    }
11e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
11e80 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
11e90 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b  _code(pCtx, rc);
11ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
11eb0 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20  ite3_free((void 
11ec0 2a 29 61 7a 43 6f 6e 66 69 67 29 3b 0a 20 20 73  *)azConfig);.  s
11ed0 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
11ee0 46 72 65 65 28 70 43 6f 6e 66 69 67 29 3b 0a 20  Free(pConfig);. 
11ef0 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
11f00 46 72 65 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a  Free(pExpr);.}..
11f10 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11f20 45 78 70 72 46 75 6e 63 74 69 6f 6e 48 72 28 0a  ExprFunctionHr(.
11f30 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
11f40 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
11f50 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
11f60 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
11f70 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
11fa0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
11fb0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
11fc0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
11fd0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
11fe0 29 7b 0a 20 20 66 74 73 35 45 78 70 72 46 75 6e  ){.  fts5ExprFun
11ff0 63 74 69 6f 6e 28 70 43 74 78 2c 20 6e 41 72 67  ction(pCtx, nArg
12000 2c 20 61 70 56 61 6c 2c 20 30 29 3b 0a 7d 0a 73  , apVal, 0);.}.s
12010 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 45  tatic void fts5E
12020 78 70 72 46 75 6e 63 74 69 6f 6e 54 63 6c 28 0a  xprFunctionTcl(.
12030 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
12040 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
12050 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
12060 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
12070 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
120a0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
120b0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
120c0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
120d0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
120e0 29 7b 0a 20 20 66 74 73 35 45 78 70 72 46 75 6e  ){.  fts5ExprFun
120f0 63 74 69 6f 6e 28 70 43 74 78 2c 20 6e 41 72 67  ction(pCtx, nArg
12100 2c 20 61 70 56 61 6c 2c 20 31 29 3b 0a 7d 0a 0a  , apVal, 1);.}..
12110 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
12120 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 53  entation of an S
12130 51 4c 69 74 65 20 75 73 65 72 2d 64 65 66 69 6e  QLite user-defin
12140 65 64 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ed-function that
12150 20 61 63 63 65 70 74 73 20 61 0a 2a 2a 20 73 69   accepts a.** si
12160 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61 73 20  ngle integer as 
12170 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
12180 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 61  the integer is a
12190 6e 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 20  n alpha-numeric 
121a0 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 6f 64 65  .** unicode code
121b0 20 70 6f 69 6e 74 2c 20 31 20 69 73 20 72 65 74   point, 1 is ret
121c0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
121d0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   0..*/.static vo
121e0 69 64 20 66 74 73 35 45 78 70 72 49 73 41 6c 6e  id fts5ExprIsAln
121f0 75 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  um(.  sqlite3_co
12200 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
12210 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
12220 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
12230 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12250 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12260 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74   args */.  sqlit
12270 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
12280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
12290 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
122a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 6f   */.){.  int iCo
122b0 64 65 3b 0a 20 20 75 38 20 61 41 72 72 5b 33 32  de;.  u8 aArr[32
122c0 5d 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d 31  ];.  if( nArg!=1
122d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
122e0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
122f0 78 2c 20 0a 20 20 20 20 20 20 20 20 22 77 72 6f  x, .        "wro
12300 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
12310 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
12320 6f 6e 20 66 74 73 35 5f 69 73 61 6c 6e 75 6d 22  on fts5_isalnum"
12330 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20  , -1.    );.    
12340 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d 65  return;.  }.  me
12350 6d 73 65 74 28 61 41 72 72 2c 20 30 2c 20 73 69  mset(aArr, 0, si
12360 7a 65 6f 66 28 61 41 72 72 29 29 3b 0a 20 20 73  zeof(aArr));.  s
12370 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64  qlite3Fts5Unicod
12380 65 43 61 74 50 61 72 73 65 28 22 4c 2a 22 2c 20  eCatParse("L*", 
12390 61 41 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  aArr);.  sqlite3
123a0 46 74 73 35 55 6e 69 63 6f 64 65 43 61 74 50 61  Fts5UnicodeCatPa
123b0 72 73 65 28 22 4e 2a 22 2c 20 61 41 72 72 29 3b  rse("N*", aArr);
123c0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e  .  sqlite3Fts5Un
123d0 69 63 6f 64 65 43 61 74 50 61 72 73 65 28 22 43  icodeCatParse("C
123e0 6f 22 2c 20 61 41 72 72 29 3b 0a 20 20 69 43 6f  o", aArr);.  iCo
123f0 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  de = sqlite3_val
12400 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29  ue_int(apVal[0])
12410 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
12420 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 61 41 72  lt_int(pCtx, aAr
12430 72 5b 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  r[sqlite3Fts5Uni
12440 63 6f 64 65 43 61 74 65 67 6f 72 79 28 28 75 33  codeCategory((u3
12450 32 29 69 43 6f 64 65 29 5d 29 3b 0a 7d 0a 0a 73  2)iCode)]);.}..s
12460 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 45  tatic void fts5E
12470 78 70 72 46 6f 6c 64 28 0a 20 20 73 71 6c 69 74  xprFold(.  sqlit
12480 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
12490 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
124a0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
124b0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
124c0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
124d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
124e0 65 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20 20  er of args */.  
124f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
12500 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
12510 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75  /* Function argu
12520 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ments */.){.  if
12530 28 20 6e 41 72 67 21 3d 31 20 26 26 20 6e 41 72  ( nArg!=1 && nAr
12540 67 21 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69  g!=2 ){.    sqli
12550 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
12560 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20  (pCtx, .        
12570 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "wrong number of
12580 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
12590 6e 63 74 69 6f 6e 20 66 74 73 35 5f 66 6f 6c 64  nction fts5_fold
125a0 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  ", -1.    );.  }
125b0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 43  else{.    int iC
125c0 6f 64 65 3b 0a 20 20 20 20 69 6e 74 20 62 52 65  ode;.    int bRe
125d0 6d 6f 76 65 44 69 61 63 72 69 74 69 63 73 20 3d  moveDiacritics =
125e0 20 30 3b 0a 20 20 20 20 69 43 6f 64 65 20 3d 20   0;.    iCode = 
125f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
12600 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20  t(apVal[0]);.   
12610 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 20 62   if( nArg==2 ) b
12620 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 73  RemoveDiacritics
12630 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
12640 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  _int(apVal[1]);.
12650 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
12660 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 73 71 6c  lt_int(pCtx, sql
12670 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65 46  ite3Fts5UnicodeF
12680 6f 6c 64 28 69 43 6f 64 65 2c 20 62 52 65 6d 6f  old(iCode, bRemo
12690 76 65 44 69 61 63 72 69 74 69 63 73 29 29 3b 0a  veDiacritics));.
126a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
126b0 73 20 69 73 20 63 61 6c 6c 65 64 20 64 75 72 69  s is called duri
126c0 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
126d0 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20 74 68  n to register th
126e0 65 20 66 74 73 35 5f 65 78 70 72 28 29 20 73 63  e fts5_expr() sc
126f0 61 6c 61 72 0a 2a 2a 20 55 44 46 20 77 69 74 68  alar.** UDF with
12700 20 74 68 65 20 53 51 4c 69 74 65 20 68 61 6e 64   the SQLite hand
12710 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
12720 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
12730 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
12740 73 35 45 78 70 72 49 6e 69 74 28 46 74 73 35 47  s5ExprInit(Fts5G
12750 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 20  lobal *pGlobal, 
12760 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
12770 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72 46  struct Fts5ExprF
12780 75 6e 63 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  unc {.    const 
12790 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 6f 69  char *z;.    voi
127a0 64 20 28 2a 78 29 28 73 71 6c 69 74 65 33 5f 63  d (*x)(sqlite3_c
127b0 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
127c0 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20  te3_value**);.  
127d0 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20  } aFunc[] = {.  
127e0 20 20 7b 20 22 66 74 73 35 5f 65 78 70 72 22 2c    { "fts5_expr",
127f0 20 20 20 20 20 66 74 73 35 45 78 70 72 46 75 6e       fts5ExprFun
12800 63 74 69 6f 6e 48 72 20 7d 2c 0a 20 20 20 20 7b  ctionHr },.    {
12810 20 22 66 74 73 35 5f 65 78 70 72 5f 74 63 6c 22   "fts5_expr_tcl"
12820 2c 20 66 74 73 35 45 78 70 72 46 75 6e 63 74 69  , fts5ExprFuncti
12830 6f 6e 54 63 6c 20 7d 2c 0a 20 20 20 20 7b 20 22  onTcl },.    { "
12840 66 74 73 35 5f 69 73 61 6c 6e 75 6d 22 2c 20 20  fts5_isalnum",  
12850 66 74 73 35 45 78 70 72 49 73 41 6c 6e 75 6d 20  fts5ExprIsAlnum 
12860 7d 2c 0a 20 20 20 20 7b 20 22 66 74 73 35 5f 66  },.    { "fts5_f
12870 6f 6c 64 22 2c 20 20 20 20 20 66 74 73 35 45 78  old",     fts5Ex
12880 70 72 46 6f 6c 64 20 7d 2c 0a 20 20 7d 3b 0a 20  prFold },.  };. 
12890 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
128a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
128b0 76 6f 69 64 20 2a 70 43 74 78 20 3d 20 28 76 6f  void *pCtx = (vo
128c0 69 64 2a 29 70 47 6c 6f 62 61 6c 3b 0a 0a 20 20  id*)pGlobal;..  
128d0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
128e0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 41 72 72 61  ITE_OK && i<Arra
128f0 79 53 69 7a 65 28 61 46 75 6e 63 29 3b 20 69 2b  ySize(aFunc); i+
12900 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 46  +){.    struct F
12910 74 73 35 45 78 70 72 46 75 6e 63 20 2a 70 20 3d  ts5ExprFunc *p =
12920 20 26 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20   &aFunc[i];.    
12930 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
12940 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
12950 20 70 2d 3e 7a 2c 20 2d 31 2c 20 53 51 4c 49 54   p->z, -1, SQLIT
12960 45 5f 55 54 46 38 2c 20 70 43 74 78 2c 20 70 2d  E_UTF8, pCtx, p-
12970 3e 78 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  >x, 0, 0);.  }..
12980 20 20 2f 2a 20 41 76 6f 69 64 20 77 61 72 6e 69    /* Avoid warni
12990 6e 67 73 20 69 6e 64 69 63 61 74 69 6e 67 20 74  ngs indicating t
129a0 68 61 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  hat sqlite3Fts5P
129b0 61 72 73 65 72 54 72 61 63 65 28 29 20 61 6e 64  arserTrace() and
129c0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 74 73  .  ** sqlite3Fts
129d0 35 50 61 72 73 65 72 46 61 6c 6c 62 61 63 6b 28  5ParserFallback(
129e0 29 20 61 72 65 20 75 6e 75 73 65 64 20 2a 2f 0a  ) are unused */.
129f0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
12a00 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 46 74   (void)sqlite3Ft
12a10 73 35 50 61 72 73 65 72 54 72 61 63 65 3b 0a 23  s5ParserTrace;.#
12a20 65 6e 64 69 66 0a 20 20 28 76 6f 69 64 29 73 71  endif.  (void)sq
12a30 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72 46  lite3Fts5ParserF
12a40 61 6c 6c 62 61 63 6b 3b 0a 0a 20 20 72 65 74 75  allback;..  retu
12a50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12a60 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
12a70 72 20 6f 66 20 70 68 72 61 73 65 73 20 69 6e 20  r of phrases in 
12a80 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
12a90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12aa0 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43 6f  Fts5ExprPhraseCo
12ab0 75 6e 74 28 46 74 73 35 45 78 70 72 20 2a 70 45  unt(Fts5Expr *pE
12ac0 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  xpr){.  return (
12ad0 70 45 78 70 72 20 3f 20 70 45 78 70 72 2d 3e 6e  pExpr ? pExpr->n
12ae0 50 68 72 61 73 65 20 3a 20 30 29 3b 0a 7d 0a 0a  Phrase : 0);.}..
12af0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12b00 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
12b10 20 69 6e 20 74 68 65 20 69 50 68 72 61 73 65 27   in the iPhrase'
12b20 74 68 20 70 68 72 61 73 65 20 69 6e 20 70 45 78  th phrase in pEx
12b30 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pr..*/.int sqlit
12b40 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65  e3Fts5ExprPhrase
12b50 53 69 7a 65 28 46 74 73 35 45 78 70 72 20 2a 70  Size(Fts5Expr *p
12b60 45 78 70 72 2c 20 69 6e 74 20 69 50 68 72 61 73  Expr, int iPhras
12b70 65 29 7b 0a 20 20 69 66 28 20 69 50 68 72 61 73  e){.  if( iPhras
12b80 65 3c 30 20 7c 7c 20 69 50 68 72 61 73 65 3e 3d  e<0 || iPhrase>=
12b90 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 20 29  pExpr->nPhrase )
12ba0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
12bb0 75 72 6e 20 70 45 78 70 72 2d 3e 61 70 45 78 70  urn pExpr->apExp
12bc0 72 50 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d  rPhrase[iPhrase]
12bd0 2d 3e 6e 54 65 72 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->nTerm;.}../*.*
12be0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12bf0 69 73 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  is used to acces
12c00 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  s the current po
12c10 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  sition list for 
12c20 70 68 72 61 73 65 0a 2a 2a 20 69 50 68 72 61 73  phrase.** iPhras
12c30 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
12c40 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73 74  3Fts5ExprPoslist
12c50 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72  (Fts5Expr *pExpr
12c60 2c 20 69 6e 74 20 69 50 68 72 61 73 65 2c 20 63  , int iPhrase, c
12c70 6f 6e 73 74 20 75 38 20 2a 2a 70 61 29 7b 0a 20  onst u8 **pa){. 
12c80 20 69 6e 74 20 6e 52 65 74 3b 0a 20 20 46 74 73   int nRet;.  Fts
12c90 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
12ca0 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 61 70  rase = pExpr->ap
12cb0 45 78 70 72 50 68 72 61 73 65 5b 69 50 68 72 61  ExprPhrase[iPhra
12cc0 73 65 5d 3b 0a 20 20 46 74 73 35 45 78 70 72 4e  se];.  Fts5ExprN
12cd0 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 70 50 68  ode *pNode = pPh
12ce0 72 61 73 65 2d 3e 70 4e 6f 64 65 3b 0a 20 20 69  rase->pNode;.  i
12cf0 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d  f( pNode->bEof==
12d00 30 20 26 26 20 70 4e 6f 64 65 2d 3e 69 52 6f 77  0 && pNode->iRow
12d10 69 64 3d 3d 70 45 78 70 72 2d 3e 70 52 6f 6f 74  id==pExpr->pRoot
12d20 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
12d30 2a 70 61 20 3d 20 70 50 68 72 61 73 65 2d 3e 70  *pa = pPhrase->p
12d40 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 6e 52  oslist.p;.    nR
12d50 65 74 20 3d 20 70 50 68 72 61 73 65 2d 3e 70 6f  et = pPhrase->po
12d60 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 65 6c 73 65  slist.n;.  }else
12d70 7b 0a 20 20 20 20 2a 70 61 20 3d 20 30 3b 0a 20  {.    *pa = 0;. 
12d80 20 20 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 7d     nRet = 0;.  }
12d90 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a  .  return nRet;.
12da0 7d 0a 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f  }..struct Fts5Po
12db0 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 20 7b  slistPopulator {
12dc0 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72  .  Fts5PoslistWr
12dd0 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 69  iter writer;.  i
12de0 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e00 2a 20 54 72 75 65 20 69 66 20 6f 6b 20 74 6f 20  * True if ok to 
12e10 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20 69 6e  populate */.  in
12e20 74 20 62 4d 69 73 73 3b 0a 7d 3b 0a 0a 46 74 73  t bMiss;.};..Fts
12e30 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f  5PoslistPopulato
12e40 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 45 78  r *sqlite3Fts5Ex
12e50 70 72 43 6c 65 61 72 50 6f 73 6c 69 73 74 73 28  prClearPoslists(
12e60 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts5Expr *pExpr,
12e70 20 69 6e 74 20 62 4c 69 76 65 29 7b 0a 20 20 46   int bLive){.  F
12e80 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61  ts5PoslistPopula
12e90 74 6f 72 20 2a 70 52 65 74 3b 0a 20 20 70 52 65  tor *pRet;.  pRe
12ea0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
12eb0 6f 63 36 34 28 73 69 7a 65 6f 66 28 46 74 73 35  oc64(sizeof(Fts5
12ec0 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72  PoslistPopulator
12ed0 29 2a 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65  )*pExpr->nPhrase
12ee0 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
12ef0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12f00 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20  memset(pRet, 0, 
12f10 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69  sizeof(Fts5Posli
12f20 73 74 50 6f 70 75 6c 61 74 6f 72 29 2a 70 45 78  stPopulator)*pEx
12f30 70 72 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20 20  pr->nPhrase);.  
12f40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78    for(i=0; i<pEx
12f50 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b  pr->nPhrase; i++
12f60 29 7b 0a 20 20 20 20 20 20 46 74 73 35 42 75 66  ){.      Fts5Buf
12f70 66 65 72 20 2a 70 42 75 66 20 3d 20 26 70 45 78  fer *pBuf = &pEx
12f80 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  pr->apExprPhrase
12f90 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74 3b 0a 20 20  [i]->poslist;.  
12fa0 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65      Fts5ExprNode
12fb0 20 2a 70 4e 6f 64 65 20 3d 20 70 45 78 70 72 2d   *pNode = pExpr-
12fc0 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d  >apExprPhrase[i]
12fd0 2d 3e 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20 61  ->pNode;.      a
12fe0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 70  ssert( pExpr->ap
12ff0 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e 6e  ExprPhrase[i]->n
13000 54 65 72 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Term==1 );.     
13010 20 69 66 28 20 62 4c 69 76 65 20 26 26 20 0a 20   if( bLive && . 
13020 20 20 20 20 20 20 20 20 20 28 70 42 75 66 2d 3e           (pBuf->
13030 6e 3d 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e 69  n==0 || pNode->i
13040 52 6f 77 69 64 21 3d 70 45 78 70 72 2d 3e 70 52  Rowid!=pExpr->pR
13050 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 7c 7c 20 70  oot->iRowid || p
13060 4e 6f 64 65 2d 3e 62 45 6f 66 29 0a 20 20 20 20  Node->bEof).    
13070 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65    ){.        pRe
13080 74 5b 69 5d 2e 62 4d 69 73 73 20 3d 20 31 3b 0a  t[i].bMiss = 1;.
13090 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
130a0 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 30       pBuf->n = 0
130b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
130c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
130d0 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 46 74 73  t;.}..struct Fts
130e0 35 45 78 70 72 43 74 78 20 7b 0a 20 20 46 74 73  5ExprCtx {.  Fts
130f0 35 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20  5Expr *pExpr;.  
13100 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
13110 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f 72  ator *aPopulator
13120 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a 7d 3b  ;.  i64 iOff;.};
13130 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
13140 46 74 73 35 45 78 70 72 43 74 78 20 46 74 73 35  Fts5ExprCtx Fts5
13150 45 78 70 72 43 74 78 3b 0a 0a 2f 2a 0a 2a 2a 20  ExprCtx;../*.** 
13160 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20  TODO: Make this 
13170 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a  more efficient!.
13180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
13190 73 35 45 78 70 72 43 6f 6c 73 65 74 54 65 73 74  s5ExprColsetTest
131a0 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f  (Fts5Colset *pCo
131b0 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  lset, int iCol){
131c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
131d0 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e  i=0; i<pColset->
131e0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
131f0 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43  if( pColset->aiC
13200 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65  ol[i]==iCol ) re
13210 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
13220 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
13230 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 50 6f  c int fts5ExprPo
13240 70 75 6c 61 74 65 50 6f 73 6c 69 73 74 73 43 62  pulatePoslistsCb
13250 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13270 2a 20 43 6f 70 79 20 6f 66 20 32 6e 64 20 61 72  * Copy of 2nd ar
13280 67 75 6d 65 6e 74 20 74 6f 20 78 54 6f 6b 65 6e  gument to xToken
13290 69 7a 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 74  ize() */.  int t
132a0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
132b0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
132c0 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66 6c   FTS5_TOKEN_* fl
132d0 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
132e0 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  har *pToken,    
132f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13300 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
13310 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69  ing token */.  i
13320 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
13330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
13340 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79  e of token in by
13350 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e  tes */.  int iUn
13360 75 73 65 64 31 2c 20 20 20 20 20 20 20 20 20 20  used1,          
13370 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
13380 65 74 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68  et of token with
13390 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20 2a 2f  in input text */
133a0 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64 32 20  .  int iUnused2 
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
133c0 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20   Byte offset of 
133d0 65 6e 64 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  end of token wit
133e0 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20 2a  hin input text *
133f0 2f 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72 43  /.){.  Fts5ExprC
13400 74 78 20 2a 70 20 3d 20 28 46 74 73 35 45 78 70  tx *p = (Fts5Exp
13410 72 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 46 74  rCtx*)pCtx;.  Ft
13420 73 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20  s5Expr *pExpr = 
13430 70 2d 3e 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  p->pExpr;.  int 
13440 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
13450 41 4d 32 28 69 55 6e 75 73 65 64 31 2c 20 69 55  AM2(iUnused1, iU
13460 6e 75 73 65 64 32 29 3b 0a 0a 20 20 69 66 28 20  nused2);..  if( 
13470 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58 5f  nToken>FTS5_MAX_
13480 54 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54 6f  TOKEN_SIZE ) nTo
13490 6b 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f 54  ken = FTS5_MAX_T
134a0 4f 4b 45 4e 5f 53 49 5a 45 3b 0a 20 20 69 66 28  OKEN_SIZE;.  if(
134b0 20 28 74 66 6c 61 67 73 20 26 20 46 54 53 35 5f   (tflags & FTS5_
134c0 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 29  TOKEN_COLOCATED)
134d0 3d 3d 30 20 29 20 70 2d 3e 69 4f 66 66 2b 2b 3b  ==0 ) p->iOff++;
134e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
134f0 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  xpr->nPhrase; i+
13500 2b 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72  +){.    Fts5Expr
13510 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
13520 20 69 66 28 20 70 2d 3e 61 50 6f 70 75 6c 61 74   if( p->aPopulat
13530 6f 72 5b 69 5d 2e 62 4f 6b 3d 3d 30 20 29 20 63  or[i].bOk==0 ) c
13540 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
13550 28 70 54 65 72 6d 3d 26 70 45 78 70 72 2d 3e 61  (pTerm=&pExpr->a
13560 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e  pExprPhrase[i]->
13570 61 54 65 72 6d 5b 30 5d 3b 20 70 54 65 72 6d 3b  aTerm[0]; pTerm;
13580 20 70 54 65 72 6d 3d 70 54 65 72 6d 2d 3e 70 53   pTerm=pTerm->pS
13590 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20 69  ynonym){.      i
135a0 6e 74 20 6e 54 65 72 6d 20 3d 20 28 69 6e 74 29  nt nTerm = (int)
135b0 73 74 72 6c 65 6e 28 70 54 65 72 6d 2d 3e 7a 54  strlen(pTerm->zT
135c0 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  erm);.      if( 
135d0 28 6e 54 65 72 6d 3d 3d 6e 54 6f 6b 65 6e 20 7c  (nTerm==nToken |
135e0 7c 20 28 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20  | (nTerm<nToken 
135f0 26 26 20 70 54 65 72 6d 2d 3e 62 50 72 65 66 69  && pTerm->bPrefi
13600 78 29 29 0a 20 20 20 20 20 20 20 26 26 20 6d 65  x)).       && me
13610 6d 63 6d 70 28 70 54 65 72 6d 2d 3e 7a 54 65 72  mcmp(pTerm->zTer
13620 6d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d  m, pToken, nTerm
13630 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
13640 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
13650 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
13660 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 0a 20  tWriterAppend(. 
13670 20 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70             &pExp
13680 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b  r->apExprPhrase[
13690 69 5d 2d 3e 70 6f 73 6c 69 73 74 2c 20 26 70 2d  i]->poslist, &p-
136a0 3e 61 50 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e 77  >aPopulator[i].w
136b0 72 69 74 65 72 2c 20 70 2d 3e 69 4f 66 66 0a 20  riter, p->iOff. 
136c0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
136d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
136e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 62 72  n rc;.        br
136f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
13700 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
13720 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  t sqlite3Fts5Exp
13730 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74  rPopulatePoslist
13740 73 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  s(.  Fts5Config 
13750 2a 70 43 6f 6e 66 69 67 2c 0a 20 20 46 74 73 35  *pConfig,.  Fts5
13760 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20  Expr *pExpr, .  
13770 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
13780 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f 72  ator *aPopulator
13790 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20  ,.  int iCol, . 
137a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
137b0 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 6e 74 20 69  int n.){.  int i
137c0 3b 0a 20 20 46 74 73 35 45 78 70 72 43 74 78 20  ;.  Fts5ExprCtx 
137d0 73 43 74 78 3b 0a 20 20 73 43 74 78 2e 70 45 78  sCtx;.  sCtx.pEx
137e0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 43  pr = pExpr;.  sC
137f0 74 78 2e 61 50 6f 70 75 6c 61 74 6f 72 20 3d 20  tx.aPopulator = 
13800 61 50 6f 70 75 6c 61 74 6f 72 3b 0a 20 20 73 43  aPopulator;.  sC
13810 74 78 2e 69 4f 66 66 20 3d 20 28 28 28 69 36 34  tx.iOff = (((i64
13820 29 69 43 6f 6c 29 20 3c 3c 20 33 32 29 20 2d 20  )iCol) << 32) - 
13830 31 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1;..  for(i=0; i
13840 3c 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b  <pExpr->nPhrase;
13850 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 45   i++){.    Fts5E
13860 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d  xprNode *pNode =
13870 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50 68   pExpr->apExprPh
13880 72 61 73 65 5b 69 5d 2d 3e 70 4e 6f 64 65 3b 0a  rase[i]->pNode;.
13890 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a      Fts5Colset *
138a0 70 43 6f 6c 73 65 74 20 3d 20 70 4e 6f 64 65 2d  pColset = pNode-
138b0 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 3b  >pNear->pColset;
138c0 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 73 65  .    if( (pColse
138d0 74 20 26 26 20 30 3d 3d 66 74 73 35 45 78 70 72  t && 0==fts5Expr
138e0 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c 73  ColsetTest(pCols
138f0 65 74 2c 20 69 43 6f 6c 29 29 20 0a 20 20 20 20  et, iCol)) .    
13900 20 7c 7c 20 61 50 6f 70 75 6c 61 74 6f 72 5b 69   || aPopulator[i
13910 5d 2e 62 4d 69 73 73 0a 20 20 20 20 29 7b 0a 20  ].bMiss.    ){. 
13920 20 20 20 20 20 61 50 6f 70 75 6c 61 74 6f 72 5b       aPopulator[
13930 69 5d 2e 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20  i].bOk = 0;.    
13940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 50 6f  }else{.      aPo
13950 70 75 6c 61 74 6f 72 5b 69 5d 2e 62 4f 6b 20 3d  pulator[i].bOk =
13960 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
13970 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
13980 74 73 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f 6e  ts5Tokenize(pCon
13990 66 69 67 2c 20 0a 20 20 20 20 20 20 46 54 53 35  fig, .      FTS5
139a0 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d 45  _TOKENIZE_DOCUME
139b0 4e 54 2c 20 7a 2c 20 6e 2c 20 28 76 6f 69 64 2a  NT, z, n, (void*
139c0 29 26 73 43 74 78 2c 20 66 74 73 35 45 78 70 72  )&sCtx, fts5Expr
139d0 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74 73  PopulatePoslists
139e0 43 62 0a 20 20 29 3b 0a 7d 0a 0a 73 74 61 74 69  Cb.  );.}..stati
139f0 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 43  c void fts5ExprC
13a00 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 46 74 73  learPoslists(Fts
13a10 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
13a20 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  ){.  if( pNode->
13a30 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d  eType==FTS5_TERM
13a40 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65   || pNode->eType
13a50 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 29 7b  ==FTS5_STRING ){
13a60 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  .    pNode->pNea
13a70 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e  r->apPhrase[0]->
13a80 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20  poslist.n = 0;. 
13a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
13aa0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
13ab0 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3b  i<pNode->nChild;
13ac0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
13ad0 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73  5ExprClearPoslis
13ae0 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c  ts(pNode->apChil
13af0 64 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  d[i]);.    }.  }
13b00 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
13b10 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c  ts5ExprCheckPosl
13b20 69 73 74 73 28 46 74 73 35 45 78 70 72 4e 6f 64  ists(Fts5ExprNod
13b30 65 20 2a 70 4e 6f 64 65 2c 20 69 36 34 20 69 52  e *pNode, i64 iR
13b40 6f 77 69 64 29 7b 0a 20 20 70 4e 6f 64 65 2d 3e  owid){.  pNode->
13b50 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  iRowid = iRowid;
13b60 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d  .  pNode->bEof =
13b70 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4e   0;.  switch( pN
13b80 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  ode->eType ){.  
13b90 20 20 63 61 73 65 20 46 54 53 35 5f 54 45 52 4d    case FTS5_TERM
13ba0 3a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f  :.    case FTS5_
13bb0 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 72 65  STRING:.      re
13bc0 74 75 72 6e 20 28 70 4e 6f 64 65 2d 3e 70 4e 65  turn (pNode->pNe
13bd0 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
13be0 3e 70 6f 73 6c 69 73 74 2e 6e 3e 30 29 3b 0a 0a  >poslist.n>0);..
13bf0 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e      case FTS5_AN
13c00 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  D: {.      int i
13c10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
13c20 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
13c30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13c40 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65 63  if( fts5ExprChec
13c50 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 2d  kPoslists(pNode-
13c60 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52 6f  >apChild[i], iRo
13c70 77 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  wid)==0 ){.     
13c80 20 20 20 20 20 66 74 73 35 45 78 70 72 43 6c 65       fts5ExprCle
13c90 61 72 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65  arPoslists(pNode
13ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
13cb0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
13cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13cd0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
13ce0 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20 7b   case FTS5_OR: {
13cf0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
13d00 20 20 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30      int bRet = 0
13d10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
13d20 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
13d30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13d40 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65 63  if( fts5ExprChec
13d50 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 2d  kPoslists(pNode-
13d60 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52 6f  >apChild[i], iRo
13d70 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  wid) ){.        
13d80 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20    bRet = 1;.    
13d90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13da0 20 20 20 20 72 65 74 75 72 6e 20 62 52 65 74 3b      return bRet;
13db0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
13dc0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
13dd0 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70  ert( pNode->eTyp
13de0 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29 3b 0a 20  e==FTS5_NOT );. 
13df0 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35       if( 0==fts5
13e00 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74  ExprCheckPoslist
13e10 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  s(pNode->apChild
13e20 5b 30 5d 2c 20 69 52 6f 77 69 64 29 0a 20 20 20  [0], iRowid).   
13e30 20 20 20 20 20 20 20 7c 7c 20 30 21 3d 66 74 73         || 0!=fts
13e40 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73  5ExprCheckPoslis
13e50 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c  ts(pNode->apChil
13e60 64 5b 31 5d 2c 20 69 52 6f 77 69 64 29 0a 20 20  d[1], iRowid).  
13e70 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13e80 20 66 74 73 35 45 78 70 72 43 6c 65 61 72 50 6f   fts5ExprClearPo
13e90 73 6c 69 73 74 73 28 70 4e 6f 64 65 29 3b 0a 20  slists(pNode);. 
13ea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
13eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13ec0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
13ed0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 76    return 1;.}..v
13ee0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 45  oid sqlite3Fts5E
13ef0 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74 73  xprCheckPoslists
13f00 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72  (Fts5Expr *pExpr
13f10 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
13f20 20 66 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f   fts5ExprCheckPo
13f30 73 6c 69 73 74 73 28 70 45 78 70 72 2d 3e 70 52  slists(pExpr->pR
13f40 6f 6f 74 2c 20 69 52 6f 77 69 64 29 3b 0a 7d 0a  oot, iRowid);.}.
13f50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13f60 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
13f70 6c 65 64 20 66 6f 72 20 64 65 74 61 69 6c 3d 63  led for detail=c
13f80 6f 6c 75 6d 6e 73 20 74 61 62 6c 65 73 2e 20 0a  olumns tables. .
13f90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
13fa0 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 6c 6c  s5ExprPhraseColl
13fb0 69 73 74 28 0a 20 20 46 74 73 35 45 78 70 72 20  ist(.  Fts5Expr 
13fc0 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e 74 20 69  *pExpr, .  int i
13fd0 50 68 72 61 73 65 2c 20 0a 20 20 63 6f 6e 73 74  Phrase, .  const
13fe0 20 75 38 20 2a 2a 70 70 43 6f 6c 6c 69 73 74 2c   u8 **ppCollist,
13ff0 20 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 6c 69   .  int *pnColli
14000 73 74 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72  st.){.  Fts5Expr
14010 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
14020 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50  = pExpr->apExprP
14030 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d 3b 0a  hrase[iPhrase];.
14040 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
14050 70 4e 6f 64 65 20 3d 20 70 50 68 72 61 73 65 2d  pNode = pPhrase-
14060 3e 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  >pNode;.  int rc
14070 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
14080 20 61 73 73 65 72 74 28 20 69 50 68 72 61 73 65   assert( iPhrase
14090 3e 3d 30 20 26 26 20 69 50 68 72 61 73 65 3c 70  >=0 && iPhrase<p
140a0 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 20 29 3b  Expr->nPhrase );
140b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
140c0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
140d0 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
140e0 43 4f 4c 55 4d 4e 53 20 29 3b 0a 0a 20 20 69 66  COLUMNS );..  if
140f0 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d 30  ( pNode->bEof==0
14100 20 0a 20 20 20 26 26 20 70 4e 6f 64 65 2d 3e 69   .   && pNode->i
14110 52 6f 77 69 64 3d 3d 70 45 78 70 72 2d 3e 70 52  Rowid==pExpr->pR
14120 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 0a 20 20 20  oot->iRowid .   
14130 26 26 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c  && pPhrase->posl
14140 69 73 74 2e 6e 3e 30 0a 20 20 29 7b 0a 20 20 20  ist.n>0.  ){.   
14150 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
14160 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d  Term = &pPhrase-
14170 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 69  >aTerm[0];.    i
14180 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  f( pTerm->pSynon
14190 79 6d 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  ym ){.      Fts5
141a0 42 75 66 66 65 72 20 2a 70 42 75 66 20 3d 20 28  Buffer *pBuf = (
141b0 46 74 73 35 42 75 66 66 65 72 2a 29 26 70 54 65  Fts5Buffer*)&pTe
141c0 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 5b 31 5d 3b  rm->pSynonym[1];
141d0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35  .      rc = fts5
141e0 45 78 70 72 53 79 6e 6f 6e 79 6d 4c 69 73 74 28  ExprSynonymList(
141f0 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
14200 2c 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 2c  , pNode->iRowid,
14210 20 70 42 75 66 2c 20 28 75 38 2a 2a 29 70 70 43   pBuf, (u8**)ppC
14220 6f 6c 6c 69 73 74 2c 20 70 6e 43 6f 6c 6c 69 73  ollist, pnCollis
14230 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
14240 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 43  else{.      *ppC
14250 6f 6c 6c 69 73 74 20 3d 20 70 50 68 72 61 73 65  ollist = pPhrase
14260 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72  ->aTerm[0].pIter
14270 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 2a  ->pData;.      *
14280 70 6e 43 6f 6c 6c 69 73 74 20 3d 20 70 50 68 72  pnCollist = pPhr
14290 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49  ase->aTerm[0].pI
142a0 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20  ter->nData;.    
142b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  }.  }else{.    *
142c0 70 70 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20  ppCollist = 0;. 
142d0 20 20 20 2a 70 6e 43 6f 6c 6c 69 73 74 20 3d 20     *pnCollist = 
142e0 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
142f0 20 72 63 3b 0a 7d 0a                              rc;.}.