/ Hex Artifact Content
Login

Artifact 840c88d55e78083a5e61a35968df877712ae28791b347eced1e98e3b337d2d3c:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2f 0a 0a 0a 0a 23  *****.**.*/....#
0180: 69 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74  include "fts5Int
0190: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 66 74  .h".#include "ft
01a0: 73 35 70 61 72 73 65 2e 68 22 0a 0a 2f 2a 0a 2a  s5parse.h"../*.*
01b0: 2a 20 41 6c 6c 20 74 6f 6b 65 6e 20 74 79 70 65  * All token type
01c0: 73 20 69 6e 20 74 68 65 20 67 65 6e 65 72 61 74  s in the generat
01d0: 65 64 20 66 74 73 35 70 61 72 73 65 2e 68 20 66  ed fts5parse.h f
01e0: 69 6c 65 20 61 72 65 20 67 72 65 61 74 65 72 20  ile are greater 
01f0: 74 68 61 6e 20 30 2e 0a 2a 2f 0a 23 64 65 66 69  than 0..*/.#defi
0200: 6e 65 20 46 54 53 35 5f 45 4f 46 20 30 0a 0a 23  ne FTS5_EOF 0..#
0210: 64 65 66 69 6e 65 20 46 54 53 35 5f 4c 41 52 47  define FTS5_LARG
0220: 45 53 54 5f 49 4e 54 36 34 20 20 28 30 78 66 66  EST_INT64  (0xff
0230: 66 66 66 66 66 66 7c 28 28 28 69 36 34 29 30 78  ffffff|(((i64)0x
0240: 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a  7fffffff)<<32)).
0250: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0260: 46 74 73 35 45 78 70 72 54 65 72 6d 20 46 74 73  Fts5ExprTerm Fts
0270: 35 45 78 70 72 54 65 72 6d 3b 0a 0a 2f 2a 0a 2a  5ExprTerm;../*.*
0280: 2a 20 46 75 6e 63 74 69 6f 6e 73 20 67 65 6e 65  * Functions gene
0290: 72 61 74 65 64 20 62 79 20 6c 65 6d 6f 6e 20 66  rated by lemon f
02a0: 72 6f 6d 20 66 74 73 35 70 61 72 73 65 2e 79 2e  rom fts5parse.y.
02b0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
02c0: 33 46 74 73 35 50 61 72 73 65 72 41 6c 6c 6f 63  3Fts5ParserAlloc
02d0: 28 76 6f 69 64 20 2a 28 2a 6d 61 6c 6c 6f 63 50  (void *(*mallocP
02e0: 72 6f 63 29 28 75 36 34 29 29 3b 0a 76 6f 69 64  roc)(u64));.void
02f0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
0300: 65 72 46 72 65 65 28 76 6f 69 64 2a 2c 20 76 6f  erFree(void*, vo
0310: 69 64 20 28 2a 66 72 65 65 50 72 6f 63 29 28 76  id (*freeProc)(v
0320: 6f 69 64 2a 29 29 3b 0a 76 6f 69 64 20 73 71 6c  oid*));.void sql
0330: 69 74 65 33 46 74 73 35 50 61 72 73 65 72 28 76  ite3Fts5Parser(v
0340: 6f 69 64 2a 2c 20 69 6e 74 2c 20 46 74 73 35 54  oid*, int, Fts5T
0350: 6f 6b 65 6e 2c 20 46 74 73 35 50 61 72 73 65 2a  oken, Fts5Parse*
0360: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
0370: 47 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  G.#include <stdi
0380: 6f 2e 68 3e 0a 76 6f 69 64 20 73 71 6c 69 74 65  o.h>.void sqlite
0390: 33 46 74 73 35 50 61 72 73 65 72 54 72 61 63 65  3Fts5ParserTrace
03a0: 28 46 49 4c 45 2a 2c 20 63 68 61 72 2a 29 3b 0a  (FILE*, char*);.
03b0: 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74  #endif.int sqlit
03c0: 65 33 46 74 73 35 50 61 72 73 65 72 46 61 6c 6c  e3Fts5ParserFall
03d0: 62 61 63 6b 28 69 6e 74 29 3b 0a 0a 0a 73 74 72  back(int);...str
03e0: 75 63 74 20 46 74 73 35 45 78 70 72 20 7b 0a 20  uct Fts5Expr {. 
03f0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64   Fts5Index *pInd
0400: 65 78 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  ex;.  Fts5Config
0410: 20 2a 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73   *pConfig;.  Fts
0420: 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 6f 6f 74  5ExprNode *pRoot
0430: 3b 0a 20 20 69 6e 74 20 62 44 65 73 63 3b 20 20  ;.  int bDesc;  
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 69      /* Iterate i
0460: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  n descending row
0470: 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e  id order */.  in
0480: 74 20 6e 50 68 72 61 73 65 3b 20 20 20 20 20 20  t nPhrase;      
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
04a0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 68 72 61 73   Number of phras
04b0: 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
04c0: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 50 68   */.  Fts5ExprPh
04d0: 72 61 73 65 20 2a 2a 61 70 45 78 70 72 50 68 72  rase **apExprPhr
04e0: 61 73 65 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ase;  /* Pointer
04f0: 73 20 74 6f 20 70 68 72 61 73 65 20 6f 62 6a 65  s to phrase obje
0500: 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  cts */.};../*.**
0510: 20 65 54 79 70 65 3a 0a 2a 2a 20 20 20 45 78 70   eType:.**   Exp
0520: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 79 70  ression node typ
0530: 65 2e 20 41 6c 77 61 79 73 20 6f 6e 65 20 6f 66  e. Always one of
0540: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 54  :.**.**       FT
0550: 53 35 5f 41 4e 44 20 20 20 20 20 20 20 20 20 20  S5_AND          
0560: 20 20 20 20 20 20 20 28 6e 43 68 69 6c 64 2c 20         (nChild, 
0570: 61 70 43 68 69 6c 64 20 76 61 6c 69 64 29 0a 2a  apChild valid).*
0580: 2a 20 20 20 20 20 20 20 46 54 53 35 5f 4f 52 20  *       FTS5_OR 
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 20 28 6e 43 68 69 6c 64 2c 20 61 70 43 68 69 6c   (nChild, apChil
05b0: 64 20 76 61 6c 69 64 29 0a 2a 2a 20 20 20 20 20  d valid).**     
05c0: 20 20 46 54 53 35 5f 4e 4f 54 20 20 20 20 20 20    FTS5_NOT      
05d0: 20 20 20 20 20 20 20 20 20 20 20 28 6e 43 68 69             (nChi
05e0: 6c 64 2c 20 61 70 43 68 69 6c 64 20 76 61 6c 69  ld, apChild vali
05f0: 64 29 0a 2a 2a 20 20 20 20 20 20 20 46 54 53 35  d).**       FTS5
0600: 5f 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 20  _STRING         
0610: 20 20 20 20 20 28 70 4e 65 61 72 20 76 61 6c 69       (pNear vali
0620: 64 29 0a 2a 2a 20 20 20 20 20 20 20 46 54 53 35  d).**       FTS5
0630: 5f 54 45 52 4d 20 20 20 20 20 20 20 20 20 20 20  _TERM           
0640: 20 20 20 20 20 28 70 4e 65 61 72 20 76 61 6c 69       (pNear vali
0650: 64 29 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  d).*/.struct Fts
0660: 35 45 78 70 72 4e 6f 64 65 20 7b 0a 20 20 69 6e  5ExprNode {.  in
0670: 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0690: 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20   Node type */.  
06a0: 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20  int bEof;       
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 2f 2a 20 54 72 75 65 20 61 74 20 45 4f 46 20 2a  /* True at EOF *
06d0: 2f 0a 20 20 69 6e 74 20 62 4e 6f 6d 61 74 63 68  /.  int bNomatch
06e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
06f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
0700: 6e 74 72 79 20 69 73 20 6e 6f 74 20 61 20 6d 61  ntry is not a ma
0710: 74 63 68 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65 78  tch */..  /* Nex
0720: 74 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 69  t method for thi
0730: 73 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 6e 74  s node. */.  int
0740: 20 28 2a 78 4e 65 78 74 29 28 46 74 73 35 45 78   (*xNext)(Fts5Ex
0750: 70 72 2a 2c 20 46 74 73 35 45 78 70 72 4e 6f 64  pr*, Fts5ExprNod
0760: 65 2a 2c 20 69 6e 74 2c 20 69 36 34 29 3b 0a 0a  e*, int, i64);..
0770: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
07a0: 69 64 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  id */.  Fts5Expr
07b0: 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 3b 20  Nearset *pNear; 
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 46          /* For F
07d0: 54 53 35 5f 53 54 52 49 4e 47 20 2d 20 63 6c 75  TS5_STRING - clu
07e0: 73 74 65 72 20 6f 66 20 70 68 72 61 73 65 73 20  ster of phrases 
07f0: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 69 6c 64 20 6e  */..  /* Child n
0800: 6f 64 65 73 2e 20 46 6f 72 20 61 20 4e 4f 54 20  odes. For a NOT 
0810: 6e 6f 64 65 2c 20 74 68 69 73 20 61 72 72 61 79  node, this array
0820: 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 73   always contains
0830: 20 32 20 65 6e 74 72 69 65 73 2e 20 46 6f 72 20   2 entries. For 
0840: 0a 20 20 2a 2a 20 41 4e 44 20 6f 72 20 4f 52 20  .  ** AND or OR 
0850: 6e 6f 64 65 73 2c 20 69 74 20 63 6f 6e 74 61 69  nodes, it contai
0860: 6e 73 20 32 20 6f 72 20 6d 6f 72 65 20 65 6e 74  ns 2 or more ent
0870: 72 69 65 73 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  ries.  */.  int 
0880: 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  nChild;         
0890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
08a0: 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 6e  umber of child n
08b0: 6f 64 65 73 20 2a 2f 0a 20 20 46 74 73 35 45 78  odes */.  Fts5Ex
08c0: 70 72 4e 6f 64 65 20 2a 61 70 43 68 69 6c 64 5b  prNode *apChild[
08d0: 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  1];       /* Arr
08e0: 61 79 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64 65  ay of child node
08f0: 73 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  s */.};..#define
0900: 20 46 74 73 35 4e 6f 64 65 49 73 53 74 72 69 6e   Fts5NodeIsStrin
0910: 67 28 70 29 20 28 28 70 29 2d 3e 65 54 79 70 65  g(p) ((p)->eType
0920: 3d 3d 46 54 53 35 5f 54 45 52 4d 20 7c 7c 20 28  ==FTS5_TERM || (
0930: 70 29 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  p)->eType==FTS5_
0940: 53 54 52 49 4e 47 29 0a 0a 2f 2a 0a 2a 2a 20 49  STRING)../*.** I
0950: 6e 76 6f 6b 65 20 74 68 65 20 78 4e 65 78 74 20  nvoke the xNext 
0960: 6d 65 74 68 6f 64 20 6f 66 20 61 6e 20 46 74 73  method of an Fts
0970: 35 45 78 70 72 4e 6f 64 65 20 6f 62 6a 65 63 74  5ExprNode object
0980: 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 73 68 6f  . This macro sho
0990: 75 6c 64 20 62 65 0a 2a 2a 20 75 73 65 64 20 61  uld be.** used a
09a0: 73 20 69 66 20 69 74 20 68 61 73 20 74 68 65 20  s if it has the 
09b0: 73 61 6d 65 20 73 69 67 6e 61 74 75 72 65 20 61  same signature a
09c0: 73 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d 65  s the xNext() me
09d0: 74 68 6f 64 73 20 74 68 65 6d 73 65 6c 76 65 73  thods themselves
09e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 74 73  ..*/.#define fts
09f0: 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 61 2c  5ExprNodeNext(a,
0a00: 62 2c 63 2c 64 29 20 28 62 29 2d 3e 78 4e 65 78  b,c,d) (b)->xNex
0a10: 74 28 28 61 29 2c 20 28 62 29 2c 20 28 63 29 2c  t((a), (b), (c),
0a20: 20 28 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   (d))../*.** An 
0a30: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0a40: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0a50: 75 72 65 20 72 65 70 72 65 73 65 6e 74 73 20 61  ure represents a
0a60: 20 73 69 6e 67 6c 65 20 73 65 61 72 63 68 20 74   single search t
0a70: 65 72 6d 0a 2a 2a 20 6f 72 20 74 65 72 6d 20 70  erm.** or term p
0a80: 72 65 66 69 78 2e 0a 2a 2f 0a 73 74 72 75 63 74  refix..*/.struct
0a90: 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 7b 0a   Fts5ExprTerm {.
0aa0: 20 20 75 38 20 62 50 72 65 66 69 78 3b 20 20 20    u8 bPrefix;   
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
0ad0: 70 72 65 66 69 78 20 74 65 72 6d 20 2a 2f 0a 20  prefix term */. 
0ae0: 20 75 38 20 62 46 69 72 73 74 3b 20 20 20 20 20   u8 bFirst;     
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 6f 6b 65   /* True if toke
0b10: 6e 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20  n must be first 
0b20: 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  in column */.  c
0b30: 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20  har *zTerm;     
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0b50: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
0b60: 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 49   term */.  Fts5I
0b70: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 3b  ndexIter *pIter;
0b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
0b90: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 69 73 20  erator for this 
0ba0: 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 45 78  term */.  Fts5Ex
0bb0: 70 72 54 65 72 6d 20 2a 70 53 79 6e 6f 6e 79 6d  prTerm *pSynonym
0bc0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
0bd0: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 69 6e  nter to first in
0be0: 20 6c 69 73 74 20 6f 66 20 73 79 6e 6f 6e 79 6d   list of synonym
0bf0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  s */.};../*.** A
0c00: 20 70 68 72 61 73 65 2e 20 4f 6e 65 20 6f 72 20   phrase. One or 
0c10: 6d 6f 72 65 20 74 65 72 6d 73 20 74 68 61 74 20  more terms that 
0c20: 6d 75 73 74 20 61 70 70 65 61 72 20 69 6e 20 61  must appear in a
0c30: 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75   contiguous sequ
0c40: 65 6e 63 65 0a 2a 2a 20 77 69 74 68 69 6e 20 61  ence.** within a
0c50: 20 64 6f 63 75 6d 65 6e 74 20 66 6f 72 20 69 74   document for it
0c60: 20 74 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74   to match..*/.st
0c70: 72 75 63 74 20 46 74 73 35 45 78 70 72 50 68 72  ruct Fts5ExprPhr
0c80: 61 73 65 20 7b 0a 20 20 46 74 73 35 45 78 70 72  ase {.  Fts5Expr
0c90: 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 20 20 20 20  Node *pNode;    
0ca0: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f          /* FTS5_
0cb0: 53 54 52 49 4e 47 20 6e 6f 64 65 20 74 68 69 73  STRING node this
0cc0: 20 70 68 72 61 73 65 20 69 73 20 70 61 72 74 20   phrase is part 
0cd0: 6f 66 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  of */.  Fts5Buff
0ce0: 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20  er poslist;     
0cf0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
0d00: 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
0d10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0d40: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  of entries in aT
0d50: 65 72 6d 5b 5d 20 2a 2f 0a 20 20 46 74 73 35 45  erm[] */.  Fts5E
0d60: 78 70 72 54 65 72 6d 20 61 54 65 72 6d 5b 31 5d  xprTerm aTerm[1]
0d70: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
0d80: 72 6d 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  rms that make up
0d90: 20 74 68 69 73 20 70 68 72 61 73 65 20 2a 2f 0a   this phrase */.
0da0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  };../*.** One or
0db0: 20 6d 6f 72 65 20 70 68 72 61 73 65 73 20 74 68   more phrases th
0dc0: 61 74 20 6d 75 73 74 20 61 70 70 65 61 72 20 77  at must appear w
0dd0: 69 74 68 69 6e 20 61 20 63 65 72 74 61 69 6e 20  ithin a certain 
0de0: 74 6f 6b 65 6e 20 64 69 73 74 61 6e 63 65 20 6f  token distance o
0df0: 66 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 20  f.** each other 
0e00: 77 69 74 68 69 6e 20 65 61 63 68 20 6d 61 74 63  within each matc
0e10: 68 69 6e 67 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a  hing document..*
0e20: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 45 78 70  /.struct Fts5Exp
0e30: 72 4e 65 61 72 73 65 74 20 7b 0a 20 20 69 6e 74  rNearset {.  int
0e40: 20 6e 4e 65 61 72 3b 20 20 20 20 20 20 20 20 20   nNear;         
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0e60: 4e 45 41 52 20 70 61 72 61 6d 65 74 65 72 20 2a  NEAR parameter *
0e70: 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
0e80: 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20  pColset;        
0e90: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74      /* Columns t
0ea0: 6f 20 73 65 61 72 63 68 20 28 4e 55 4c 4c 20 2d  o search (NULL -
0eb0: 3e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a  > all columns) *
0ec0: 2f 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65 3b  /.  int nPhrase;
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0ef0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 50 68 72   entries in aPhr
0f00: 61 73 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ase[] array */. 
0f10: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
0f20: 2a 61 70 50 68 72 61 73 65 5b 31 5d 3b 20 20 20  *apPhrase[1];   
0f30: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 68 72   /* Array of phr
0f40: 61 73 65 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a  ase pointers */.
0f50: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  };.../*.** Parse
0f60: 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 73 74 72   context..*/.str
0f70: 75 63 74 20 46 74 73 35 50 61 72 73 65 20 7b 0a  uct Fts5Parse {.
0f80: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
0f90: 6f 6e 66 69 67 3b 0a 20 20 63 68 61 72 20 2a 7a  onfig;.  char *z
0fa0: 45 72 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Err;.  int rc;. 
0fb0: 20 69 6e 74 20 6e 50 68 72 61 73 65 3b 20 20 20   int nPhrase;   
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 50 68   /* Size of apPh
0fe0: 72 61 73 65 20 61 72 72 61 79 20 2a 2f 0a 20 20  rase array */.  
0ff0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
1000: 2a 61 70 50 68 72 61 73 65 3b 20 20 20 20 20 20  *apPhrase;      
1010: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 6c 6c 20  /* Array of all 
1020: 70 68 72 61 73 65 73 20 2a 2f 0a 20 20 46 74 73  phrases */.  Fts
1030: 35 45 78 70 72 4e 6f 64 65 20 2a 70 45 78 70 72  5ExprNode *pExpr
1040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1050: 52 65 73 75 6c 74 20 6f 66 20 61 20 73 75 63 63  Result of a succ
1060: 65 73 73 66 75 6c 20 70 61 72 73 65 20 2a 2f 0a  essful parse */.
1070: 7d 3b 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  };..void sqlite3
1080: 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 46  Fts5ParseError(F
1090: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
10a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
10b0: 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  mt, ...){.  va_l
10c0: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
10d0: 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
10e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
10f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1100: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 20 3d 20   pParse->zErr = 
1110: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
1120: 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20  (zFmt, ap);.    
1130: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1140: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1150: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
1160: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45  static int fts5E
1170: 78 70 72 49 73 73 70 61 63 65 28 63 68 61 72 20  xprIsspace(char 
1180: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 74 3d 3d  t){.  return t==
1190: 27 20 27 20 7c 7c 20 74 3d 3d 27 5c 74 27 20 7c  ' ' || t=='\t' |
11a0: 7c 20 74 3d 3d 27 5c 6e 27 20 7c 7c 20 74 3d 3d  | t=='\n' || t==
11b0: 27 5c 72 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  '\r';.}../*.** R
11c0: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74 6f  ead the first to
11d0: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 6e 75 6c  ken from the nul
11e0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
11f0: 6e 67 20 61 74 20 2a 70 7a 2e 0a 2a 2f 0a 73 74  ng at *pz..*/.st
1200: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
1210: 72 47 65 74 54 6f 6b 65 6e 28 0a 20 20 46 74 73  rGetToken(.  Fts
1220: 35 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  5Parse *pParse, 
1230: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
1240: 70 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pz,             
1250: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f     /* IN/OUT: Po
1260: 69 6e 74 65 72 20 69 6e 74 6f 20 62 75 66 66 65  inter into buffe
1270: 72 20 2a 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e  r */.  Fts5Token
1280: 20 2a 70 54 6f 6b 65 6e 0a 29 7b 0a 20 20 63 6f   *pToken.){.  co
1290: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 2a 70  nst char *z = *p
12a0: 7a 3b 0a 20 20 69 6e 74 20 74 6f 6b 3b 0a 0a 20  z;.  int tok;.. 
12b0: 20 2f 2a 20 53 6b 69 70 20 70 61 73 74 20 61 6e   /* Skip past an
12c0: 79 20 77 68 69 74 65 73 70 61 63 65 20 2a 2f 0a  y whitespace */.
12d0: 20 20 77 68 69 6c 65 28 20 66 74 73 35 45 78 70    while( fts5Exp
12e0: 72 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  rIsspace(*z) ) z
12f0: 2b 2b 3b 0a 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70  ++;..  pToken->p
1300: 20 3d 20 7a 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e   = z;.  pToken->
1310: 6e 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28  n = 1;.  switch(
1320: 20 2a 7a 20 29 7b 0a 20 20 20 20 63 61 73 65 20   *z ){.    case 
1330: 27 28 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  '(':  tok = FTS5
1340: 5f 4c 50 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  _LP;    break;. 
1350: 20 20 20 63 61 73 65 20 27 29 27 3a 20 20 74 6f     case ')':  to
1360: 6b 20 3d 20 46 54 53 35 5f 52 50 3b 20 20 20 20  k = FTS5_RP;    
1370: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1380: 27 7b 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  '{':  tok = FTS5
1390: 5f 4c 43 50 3b 20 20 20 62 72 65 61 6b 3b 0a 20  _LCP;   break;. 
13a0: 20 20 20 63 61 73 65 20 27 7d 27 3a 20 20 74 6f     case '}':  to
13b0: 6b 20 3d 20 46 54 53 35 5f 52 43 50 3b 20 20 20  k = FTS5_RCP;   
13c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
13d0: 27 3a 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  ':':  tok = FTS5
13e0: 5f 43 4f 4c 4f 4e 3b 20 62 72 65 61 6b 3b 0a 20  _COLON; break;. 
13f0: 20 20 20 63 61 73 65 20 27 2c 27 3a 20 20 74 6f     case ',':  to
1400: 6b 20 3d 20 46 54 53 35 5f 43 4f 4d 4d 41 3b 20  k = FTS5_COMMA; 
1410: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1420: 27 2b 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  '+':  tok = FTS5
1430: 5f 50 4c 55 53 3b 20 20 62 72 65 61 6b 3b 0a 20  _PLUS;  break;. 
1440: 20 20 20 63 61 73 65 20 27 2a 27 3a 20 20 74 6f     case '*':  to
1450: 6b 20 3d 20 46 54 53 35 5f 53 54 41 52 3b 20 20  k = FTS5_STAR;  
1460: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1470: 27 2d 27 3a 20 20 74 6f 6b 20 3d 20 46 54 53 35  '-':  tok = FTS5
1480: 5f 4d 49 4e 55 53 3b 20 62 72 65 61 6b 3b 0a 20  _MINUS; break;. 
1490: 20 20 20 63 61 73 65 20 27 5e 27 3a 20 20 74 6f     case '^':  to
14a0: 6b 20 3d 20 46 54 53 35 5f 43 41 52 45 54 3b 20  k = FTS5_CARET; 
14b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
14c0: 27 5c 30 27 3a 20 74 6f 6b 20 3d 20 46 54 53 35  '\0': tok = FTS5
14d0: 5f 45 4f 46 3b 20 20 20 62 72 65 61 6b 3b 0a 0a  _EOF;   break;..
14e0: 20 20 20 20 63 61 73 65 20 27 22 27 3a 20 7b 0a      case '"': {.
14f0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1500: 20 2a 7a 32 3b 0a 20 20 20 20 20 20 74 6f 6b 20   *z2;.      tok 
1510: 3d 20 46 54 53 35 5f 53 54 52 49 4e 47 3b 0a 0a  = FTS5_STRING;..
1520: 20 20 20 20 20 20 66 6f 72 28 7a 32 3d 26 7a 5b        for(z2=&z[
1530: 31 5d 3b 20 31 3b 20 7a 32 2b 2b 29 7b 0a 20 20  1]; 1; z2++){.  
1540: 20 20 20 20 20 20 69 66 28 20 7a 32 5b 30 5d 3d        if( z2[0]=
1550: 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='"' ){.        
1560: 20 20 7a 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20    z2++;.        
1570: 20 20 69 66 28 20 7a 32 5b 30 5d 21 3d 27 22 27    if( z2[0]!='"'
1580: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1590: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15a0: 7a 32 5b 30 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20  z2[0]=='\0' ){. 
15b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15c0: 46 74 73 35 50 61 72 73 65 45 72 72 6f 72 28 70  Fts5ParseError(p
15d0: 50 61 72 73 65 2c 20 22 75 6e 74 65 72 6d 69 6e  Parse, "untermin
15e0: 61 74 65 64 20 73 74 72 69 6e 67 22 29 3b 0a 20  ated string");. 
15f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1600: 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20 20  FTS5_EOF;.      
1610: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1620: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a    pToken->n = (z
1630: 32 20 2d 20 7a 29 3b 0a 20 20 20 20 20 20 62 72  2 - z);.      br
1640: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1650: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
1670: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1680: 65 33 46 74 73 35 49 73 42 61 72 65 77 6f 72 64  e3Fts5IsBareword
1690: 28 7a 5b 30 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  (z[0])==0 ){.   
16a0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
16b0: 50 61 72 73 65 45 72 72 6f 72 28 70 50 61 72 73  ParseError(pPars
16c0: 65 2c 20 22 66 74 73 35 3a 20 73 79 6e 74 61 78  e, "fts5: syntax
16d0: 20 65 72 72 6f 72 20 6e 65 61 72 20 5c 22 25 2e   error near \"%.
16e0: 31 73 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20  1s\"", z);.     
16f0: 20 20 20 72 65 74 75 72 6e 20 46 54 53 35 5f 45     return FTS5_E
1700: 4f 46 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OF;.      }.    
1710: 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 53 54 52    tok = FTS5_STR
1720: 49 4e 47 3b 0a 20 20 20 20 20 20 66 6f 72 28 7a  ING;.      for(z
1730: 32 3d 26 7a 5b 31 5d 3b 20 73 71 6c 69 74 65 33  2=&z[1]; sqlite3
1740: 46 74 73 35 49 73 42 61 72 65 77 6f 72 64 28 2a  Fts5IsBareword(*
1750: 7a 32 29 3b 20 7a 32 2b 2b 29 3b 0a 20 20 20 20  z2); z2++);.    
1760: 20 20 70 54 6f 6b 65 6e 2d 3e 6e 20 3d 20 28 7a    pToken->n = (z
1770: 32 20 2d 20 7a 29 3b 0a 20 20 20 20 20 20 69 66  2 - z);.      if
1780: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 32 20 26  ( pToken->n==2 &
1790: 26 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2d  & memcmp(pToken-
17a0: 3e 70 2c 20 22 4f 52 22 2c 20 32 29 3d 3d 30 20  >p, "OR", 2)==0 
17b0: 29 20 20 74 6f 6b 20 3d 20 46 54 53 35 5f 4f 52  )  tok = FTS5_OR
17c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b  ;.      if( pTok
17d0: 65 6e 2d 3e 6e 3d 3d 33 20 26 26 20 6d 65 6d 63  en->n==3 && memc
17e0: 6d 70 28 70 54 6f 6b 65 6e 2d 3e 70 2c 20 22 4e  mp(pToken->p, "N
17f0: 4f 54 22 2c 20 33 29 3d 3d 30 20 29 20 74 6f 6b  OT", 3)==0 ) tok
1800: 20 3d 20 46 54 53 35 5f 4e 4f 54 3b 0a 20 20 20   = FTS5_NOT;.   
1810: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e     if( pToken->n
1820: 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 70 54  ==3 && memcmp(pT
1830: 6f 6b 65 6e 2d 3e 70 2c 20 22 41 4e 44 22 2c 20  oken->p, "AND", 
1840: 33 29 3d 3d 30 20 29 20 74 6f 6b 20 3d 20 46 54  3)==0 ) tok = FT
1850: 53 35 5f 41 4e 44 3b 0a 20 20 20 20 20 20 62 72  S5_AND;.      br
1860: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
1870: 20 20 2a 70 7a 20 3d 20 26 70 54 6f 6b 65 6e 2d    *pz = &pToken-
1880: 3e 70 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 3b 0a 20  >p[pToken->n];. 
1890: 20 72 65 74 75 72 6e 20 74 6f 6b 3b 0a 7d 0a 0a   return tok;.}..
18a0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
18b0: 35 50 61 72 73 65 41 6c 6c 6f 63 28 75 36 34 20  5ParseAlloc(u64 
18c0: 74 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  t){ return sqlit
18d0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 28 73 71 6c  e3_malloc64((sql
18e0: 69 74 65 33 5f 69 6e 74 36 34 29 74 29 3b 7d 0a  ite3_int64)t);}.
18f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1900: 50 61 72 73 65 46 72 65 65 28 76 6f 69 64 20 2a  ParseFree(void *
1910: 70 29 7b 20 73 71 6c 69 74 65 33 5f 66 72 65 65  p){ sqlite3_free
1920: 28 70 29 3b 20 7d 0a 0a 69 6e 74 20 73 71 6c 69  (p); }..int sqli
1930: 74 65 33 46 74 73 35 45 78 70 72 4e 65 77 28 0a  te3Fts5ExprNew(.
1940: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
1950: 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20  onfig,          
1960: 20 20 2f 2a 20 46 54 53 35 20 43 6f 6e 66 69 67    /* FTS5 Config
1970: 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  uration */.  int
1980: 20 69 43 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20 63   iCol,.  const c
1990: 68 61 72 20 2a 7a 45 78 70 72 2c 20 20 20 20 20  har *zExpr,     
19a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
19b0: 65 73 73 69 6f 6e 20 74 65 78 74 20 2a 2f 0a 20  ession text */. 
19c0: 20 46 74 73 35 45 78 70 72 20 2a 2a 70 70 4e 65   Fts5Expr **ppNe
19d0: 77 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  w, .  char **pzE
19e0: 72 72 0a 29 7b 0a 20 20 46 74 73 35 50 61 72 73  rr.){.  Fts5Pars
19f0: 65 20 73 50 61 72 73 65 3b 0a 20 20 46 74 73 35  e sParse;.  Fts5
1a00: 54 6f 6b 65 6e 20 74 6f 6b 65 6e 3b 0a 20 20 63  Token token;.  c
1a10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
1a20: 45 78 70 72 3b 0a 20 20 69 6e 74 20 74 3b 20 20  Expr;.  int t;  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1a50: 74 6f 6b 65 6e 20 74 79 70 65 20 2a 2f 0a 20 20  token type */.  
1a60: 76 6f 69 64 20 2a 70 45 6e 67 69 6e 65 3b 0a 20  void *pEngine;. 
1a70: 20 46 74 73 35 45 78 70 72 20 2a 70 4e 65 77 3b   Fts5Expr *pNew;
1a80: 0a 0a 20 20 2a 70 70 4e 65 77 20 3d 20 30 3b 0a  ..  *ppNew = 0;.
1a90: 20 20 2a 70 7a 45 72 72 20 3d 20 30 3b 0a 20 20    *pzErr = 0;.  
1aa0: 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20  memset(&sParse, 
1ab0: 30 2c 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65  0, sizeof(sParse
1ac0: 29 29 3b 0a 20 20 70 45 6e 67 69 6e 65 20 3d 20  ));.  pEngine = 
1ad0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
1ae0: 72 41 6c 6c 6f 63 28 66 74 73 35 50 61 72 73 65  rAlloc(fts5Parse
1af0: 41 6c 6c 6f 63 29 3b 0a 20 20 69 66 28 20 70 45  Alloc);.  if( pE
1b00: 6e 67 69 6e 65 3d 3d 30 20 29 7b 20 72 65 74 75  ngine==0 ){ retu
1b10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1b20: 20 7d 0a 20 20 73 50 61 72 73 65 2e 70 43 6f 6e   }.  sParse.pCon
1b30: 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 0a  fig = pConfig;..
1b40: 20 20 64 6f 20 7b 0a 20 20 20 20 74 20 3d 20 66    do {.    t = f
1b50: 74 73 35 45 78 70 72 47 65 74 54 6f 6b 65 6e 28  ts5ExprGetToken(
1b60: 26 73 50 61 72 73 65 2c 20 26 7a 2c 20 26 74 6f  &sParse, &z, &to
1b70: 6b 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ken);.    sqlite
1b80: 33 46 74 73 35 50 61 72 73 65 72 28 70 45 6e 67  3Fts5Parser(pEng
1b90: 69 6e 65 2c 20 74 2c 20 74 6f 6b 65 6e 2c 20 26  ine, t, token, &
1ba0: 73 50 61 72 73 65 29 3b 0a 20 20 7d 77 68 69 6c  sParse);.  }whil
1bb0: 65 28 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51  e( sParse.rc==SQ
1bc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 74 21 3d 46 54  LITE_OK && t!=FT
1bd0: 53 35 5f 45 4f 46 20 29 3b 0a 20 20 73 71 6c 69  S5_EOF );.  sqli
1be0: 74 65 33 46 74 73 35 50 61 72 73 65 72 46 72 65  te3Fts5ParserFre
1bf0: 65 28 70 45 6e 67 69 6e 65 2c 20 66 74 73 35 50  e(pEngine, fts5P
1c00: 61 72 73 65 46 72 65 65 29 3b 0a 0a 20 20 2f 2a  arseFree);..  /*
1c10: 20 49 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   If the LHS of t
1c20: 68 65 20 4d 41 54 43 48 20 65 78 70 72 65 73 73  he MATCH express
1c30: 69 6f 6e 20 77 61 73 20 61 20 75 73 65 72 20 63  ion was a user c
1c40: 6f 6c 75 6d 6e 2c 20 61 70 70 6c 79 20 74 68 65  olumn, apply the
1c50: 0a 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 63  .  ** implicit c
1c60: 6f 6c 75 6d 6e 2d 66 69 6c 74 65 72 2e 20 20 2a  olumn-filter.  *
1c70: 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 70 43 6f  /.  if( iCol<pCo
1c80: 6e 66 69 67 2d 3e 6e 43 6f 6c 20 26 26 20 73 50  nfig->nCol && sP
1c90: 61 72 73 65 2e 70 45 78 70 72 20 26 26 20 73 50  arse.pExpr && sP
1ca0: 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f  arse.rc==SQLITE_
1cb0: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  OK ){.    int n 
1cc0: 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f 6c  = sizeof(Fts5Col
1cd0: 73 65 74 29 3b 0a 20 20 20 20 46 74 73 35 43 6f  set);.    Fts5Co
1ce0: 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20  lset *pColset = 
1cf0: 28 46 74 73 35 43 6f 6c 73 65 74 2a 29 73 71 6c  (Fts5Colset*)sql
1d00: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
1d10: 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c 20 6e  ro(&sParse.rc, n
1d20: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  );.    if( pCols
1d30: 65 74 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  et ){.      pCol
1d40: 73 65 74 2d 3e 6e 43 6f 6c 20 3d 20 31 3b 0a 20  set->nCol = 1;. 
1d50: 20 20 20 20 20 70 43 6f 6c 73 65 74 2d 3e 61 69       pColset->ai
1d60: 43 6f 6c 5b 30 5d 20 3d 20 69 43 6f 6c 3b 0a 20  Col[0] = iCol;. 
1d70: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d80: 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74 28 26  ParseSetColset(&
1d90: 73 50 61 72 73 65 2c 20 73 50 61 72 73 65 2e 70  sParse, sParse.p
1da0: 45 78 70 72 2c 20 70 43 6f 6c 73 65 74 29 3b 0a  Expr, pColset);.
1db0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1dc0: 65 72 74 28 20 73 50 61 72 73 65 2e 72 63 21 3d  ert( sParse.rc!=
1dd0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 50 61  SQLITE_OK || sPa
1de0: 72 73 65 2e 7a 45 72 72 3d 3d 30 20 29 3b 0a 20  rse.zErr==0 );. 
1df0: 20 69 66 28 20 73 50 61 72 73 65 2e 72 63 3d 3d   if( sParse.rc==
1e00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e10: 20 2a 70 70 4e 65 77 20 3d 20 70 4e 65 77 20 3d   *ppNew = pNew =
1e20: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1e30: 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 29  sizeof(Fts5Expr)
1e40: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1e50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 50 61 72  =0 ){.      sPar
1e60: 73 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  se.rc = SQLITE_N
1e70: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 73 71 6c 69  OMEM;.      sqli
1e80: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
1e90: 46 72 65 65 28 73 50 61 72 73 65 2e 70 45 78 70  Free(sParse.pExp
1ea0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
1eb0: 20 20 20 20 20 69 66 28 20 21 73 50 61 72 73 65       if( !sParse
1ec0: 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  .pExpr ){.      
1ed0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79 74    const int nByt
1ee0: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 45  e = sizeof(Fts5E
1ef0: 78 70 72 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  xprNode);.      
1f00: 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20 3d 20    pNew->pRoot = 
1f10: 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29 73  (Fts5ExprNode*)s
1f20: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
1f30: 5a 65 72 6f 28 26 73 50 61 72 73 65 2e 72 63 2c  Zero(&sParse.rc,
1f40: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
1f50: 20 69 66 28 20 70 4e 65 77 2d 3e 70 52 6f 6f 74   if( pNew->pRoot
1f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
1f70: 65 77 2d 3e 70 52 6f 6f 74 2d 3e 62 45 6f 66 20  ew->pRoot->bEof 
1f80: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
1f90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fa0: 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 20      pNew->pRoot 
1fb0: 3d 20 73 50 61 72 73 65 2e 70 45 78 70 72 3b 0a  = sParse.pExpr;.
1fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
1fd0: 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ew->pIndex = 0;.
1fe0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6e        pNew->pCon
1ff0: 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20  fig = pConfig;. 
2000: 20 20 20 20 20 70 4e 65 77 2d 3e 61 70 45 78 70       pNew->apExp
2010: 72 50 68 72 61 73 65 20 3d 20 73 50 61 72 73 65  rPhrase = sParse
2020: 2e 61 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20  .apPhrase;.     
2030: 20 70 4e 65 77 2d 3e 6e 50 68 72 61 73 65 20 3d   pNew->nPhrase =
2040: 20 73 50 61 72 73 65 2e 6e 50 68 72 61 73 65 3b   sParse.nPhrase;
2050: 0a 20 20 20 20 20 20 73 50 61 72 73 65 2e 61 70  .      sParse.ap
2060: 50 68 72 61 73 65 20 3d 20 30 3b 0a 20 20 20 20  Phrase = 0;.    
2070: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
2080: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
2090: 6f 64 65 46 72 65 65 28 73 50 61 72 73 65 2e 70  odeFree(sParse.p
20a0: 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  Expr);.  }..  sq
20b0: 6c 69 74 65 33 5f 66 72 65 65 28 73 50 61 72 73  lite3_free(sPars
20c0: 65 2e 61 70 50 68 72 61 73 65 29 3b 0a 20 20 2a  e.apPhrase);.  *
20d0: 70 7a 45 72 72 20 3d 20 73 50 61 72 73 65 2e 7a  pzErr = sParse.z
20e0: 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 50  Err;.  return sP
20f0: 61 72 73 65 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  arse.rc;.}../*.*
2100: 2a 20 46 72 65 65 20 74 68 65 20 65 78 70 72 65  * Free the expre
2110: 73 73 69 6f 6e 20 6e 6f 64 65 20 6f 62 6a 65 63  ssion node objec
2120: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2130: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
2140: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
2150: 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
2160: 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 29  Fts5ExprNode *p)
2170: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
2180: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
2190: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64  i=0; i<p->nChild
21a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
21b0: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f  lite3Fts5ParseNo
21c0: 64 65 46 72 65 65 28 70 2d 3e 61 70 43 68 69 6c  deFree(p->apChil
21d0: 64 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  d[i]);.    }.   
21e0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
21f0: 65 4e 65 61 72 73 65 74 46 72 65 65 28 70 2d 3e  eNearsetFree(p->
2200: 70 4e 65 61 72 29 3b 0a 20 20 20 20 73 71 6c 69  pNear);.    sqli
2210: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
2220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
2230: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62  he expression ob
2240: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
2250: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
2260: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2270: 33 46 74 73 35 45 78 70 72 46 72 65 65 28 46 74  3Fts5ExprFree(Ft
2280: 73 35 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  s5Expr *p){.  if
2290: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
22a0: 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 46  e3Fts5ParseNodeF
22b0: 72 65 65 28 70 2d 3e 70 52 6f 6f 74 29 3b 0a 20  ree(p->pRoot);. 
22c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22d0: 70 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 29  p->apExprPhrase)
22e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22f0: 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
2300: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 54 65  .** Argument pTe
2310: 72 6d 20 6d 75 73 74 20 62 65 20 61 20 73 79 6e  rm must be a syn
2320: 6f 6e 79 6d 20 69 74 65 72 61 74 6f 72 2e 20 52  onym iterator. R
2330: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
2340: 74 20 72 6f 77 69 64 0a 2a 2a 20 74 68 61 74 20  t rowid.** that 
2350: 69 74 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  it points to..*/
2360: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
2370: 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64  ExprSynonymRowid
2380: 28 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70  (Fts5ExprTerm *p
2390: 54 65 72 6d 2c 20 69 6e 74 20 62 44 65 73 63 2c  Term, int bDesc,
23a0: 20 69 6e 74 20 2a 70 62 45 6f 66 29 7b 0a 20 20   int *pbEof){.  
23b0: 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a 20 20  i64 iRet = 0;.  
23c0: 69 6e 74 20 62 52 65 74 56 61 6c 69 64 20 3d 20  int bRetValid = 
23d0: 30 3b 0a 20 20 46 74 73 35 45 78 70 72 54 65 72  0;.  Fts5ExprTer
23e0: 6d 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *p;..  assert(
23f0: 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d   pTerm->pSynonym
2400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 44   );.  assert( bD
2410: 65 73 63 3d 3d 30 20 7c 7c 20 62 44 65 73 63 3d  esc==0 || bDesc=
2420: 3d 31 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54  =1 );.  for(p=pT
2430: 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
2440: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 69 66 28 20  nonym){.    if( 
2450: 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74  0==sqlite3Fts5It
2460: 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 20  erEof(p->pIter) 
2470: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
2480: 77 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e  wid = p->pIter->
2490: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 66  iRowid;.      if
24a0: 28 20 62 52 65 74 56 61 6c 69 64 3d 3d 30 20 7c  ( bRetValid==0 |
24b0: 7c 20 28 62 44 65 73 63 21 3d 28 69 52 6f 77 69  | (bDesc!=(iRowi
24c0: 64 3c 69 52 65 74 29 29 20 29 7b 0a 20 20 20 20  d<iRet)) ){.    
24d0: 20 20 20 20 69 52 65 74 20 3d 20 69 52 6f 77 69      iRet = iRowi
24e0: 64 3b 0a 20 20 20 20 20 20 20 20 62 52 65 74 56  d;.        bRetV
24f0: 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
2500: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
2510: 66 28 20 70 62 45 6f 66 20 26 26 20 62 52 65 74  f( pbEof && bRet
2520: 56 61 6c 69 64 3d 3d 30 20 29 20 2a 70 62 45 6f  Valid==0 ) *pbEo
2530: 66 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  f = 1;.  return 
2540: 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  iRet;.}../*.** A
2550: 72 67 75 6d 65 6e 74 20 70 54 65 72 6d 20 6d 75  rgument pTerm mu
2560: 73 74 20 62 65 20 61 20 73 79 6e 6f 6e 79 6d 20  st be a synonym 
2570: 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  iterator..*/.sta
2580: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
2590: 53 79 6e 6f 6e 79 6d 4c 69 73 74 28 0a 20 20 46  SynonymList(.  F
25a0: 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
25b0: 72 6d 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  rm, .  i64 iRowi
25c0: 64 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  d,.  Fts5Buffer 
25d0: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
25e0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73       /* Use this
25f0: 20 62 75 66 66 65 72 20 66 6f 72 20 73 70 61 63   buffer for spac
2600: 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
2610: 0a 20 20 75 38 20 2a 2a 70 61 2c 20 69 6e 74 20  .  u8 **pa, int 
2620: 2a 70 6e 0a 29 7b 0a 20 20 46 74 73 35 50 6f 73  *pn.){.  Fts5Pos
2630: 6c 69 73 74 52 65 61 64 65 72 20 61 53 74 61 74  listReader aStat
2640: 69 63 5b 34 5d 3b 0a 20 20 46 74 73 35 50 6f 73  ic[4];.  Fts5Pos
2650: 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49 74 65  listReader *aIte
2660: 72 20 3d 20 61 53 74 61 74 69 63 3b 0a 20 20 69  r = aStatic;.  i
2670: 6e 74 20 6e 49 74 65 72 20 3d 20 30 3b 0a 20 20  nt nIter = 0;.  
2680: 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 34 3b 0a  int nAlloc = 4;.
2690: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26a0: 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 45 78 70 72  E_OK;.  Fts5Expr
26b0: 54 65 72 6d 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Term *p;..  asse
26c0: 72 74 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  rt( pTerm->pSyno
26d0: 6e 79 6d 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  nym );.  for(p=p
26e0: 54 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53  Term; p; p=p->pS
26f0: 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 46 74 73  ynonym){.    Fts
2700: 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
2710: 72 20 3d 20 70 2d 3e 70 49 74 65 72 3b 0a 20 20  r = p->pIter;.  
2720: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73    if( sqlite3Fts
2730: 35 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 3d  5IterEof(pIter)=
2740: 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
2750: 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 7b 0a 20  wid==iRowid ){. 
2760: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
2770: 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69  nData==0 ) conti
2780: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  nue;.      if( n
2790: 49 74 65 72 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a  Iter==nAlloc ){.
27a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27b0: 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69  int64 nByte = si
27c0: 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74  zeof(Fts5Poslist
27d0: 52 65 61 64 65 72 29 20 2a 20 6e 41 6c 6c 6f 63  Reader) * nAlloc
27e0: 20 2a 20 32 3b 0a 20 20 20 20 20 20 20 20 46 74   * 2;.        Ft
27f0: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
2800: 2a 61 4e 65 77 20 3d 20 28 46 74 73 35 50 6f 73  *aNew = (Fts5Pos
2810: 6c 69 73 74 52 65 61 64 65 72 2a 29 73 71 6c 69  listReader*)sqli
2820: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
2830: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
2840: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
2850: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2860: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2870: 20 20 20 67 6f 74 6f 20 73 79 6e 6f 6e 79 6d 5f     goto synonym_
2880: 70 6f 73 6c 69 73 74 5f 6f 75 74 3b 0a 20 20 20  poslist_out;.   
2890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
28a0: 65 6d 63 70 79 28 61 4e 65 77 2c 20 61 49 74 65  emcpy(aNew, aIte
28b0: 72 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 6f  r, sizeof(Fts5Po
28c0: 73 6c 69 73 74 52 65 61 64 65 72 29 20 2a 20 6e  slistReader) * n
28d0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  Iter);.        n
28e0: 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
28f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 49  ;.        if( aI
2900: 74 65 72 21 3d 61 53 74 61 74 69 63 20 29 20 73  ter!=aStatic ) s
2910: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49 74 65  qlite3_free(aIte
2920: 72 29 3b 0a 20 20 20 20 20 20 20 20 61 49 74 65  r);.        aIte
2930: 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  r = aNew;.      
2940: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  }.      sqlite3F
2950: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2960: 49 6e 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74  Init(pIter->pDat
2970: 61 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c  a, pIter->nData,
2980: 20 26 61 49 74 65 72 5b 6e 49 74 65 72 5d 29 3b   &aIter[nIter]);
2990: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
29a0: 49 74 65 72 5b 6e 49 74 65 72 5d 2e 62 45 6f 66  Iter[nIter].bEof
29b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 49 74  ==0 );.      nIt
29c0: 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
29d0: 0a 20 20 69 66 28 20 6e 49 74 65 72 3d 3d 31 20  .  if( nIter==1 
29e0: 29 7b 0a 20 20 20 20 2a 70 61 20 3d 20 28 75 38  ){.    *pa = (u8
29f0: 2a 29 61 49 74 65 72 5b 30 5d 2e 61 3b 0a 20 20  *)aIter[0].a;.  
2a00: 20 20 2a 70 6e 20 3d 20 61 49 74 65 72 5b 30 5d    *pn = aIter[0]
2a10: 2e 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  .n;.  }else{.   
2a20: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
2a30: 65 72 20 77 72 69 74 65 72 20 3d 20 7b 30 7d 3b  er writer = {0};
2a40: 0a 20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d  .    i64 iPrev =
2a50: 20 2d 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66   -1;.    fts5Buf
2a60: 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
2a70: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
2a80: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2a90: 20 20 69 36 34 20 69 4d 69 6e 20 3d 20 46 54 53    i64 iMin = FTS
2aa0: 35 5f 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  5_LARGEST_INT64;
2ab0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2ac0: 69 3c 6e 49 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  i<nIter; i++){. 
2ad0: 20 20 20 20 20 20 20 69 66 28 20 61 49 74 65 72         if( aIter
2ae0: 5b 69 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20  [i].bEof==0 ){. 
2af0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 49 74           if( aIt
2b00: 65 72 5b 69 5d 2e 69 50 6f 73 3d 3d 69 50 72 65  er[i].iPos==iPre
2b10: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  v ){.           
2b20: 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
2b30: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
2b40: 74 28 26 61 49 74 65 72 5b 69 5d 29 20 29 20 63  t(&aIter[i]) ) c
2b50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2b60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2b70: 66 28 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f 73  f( aIter[i].iPos
2b80: 3c 69 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  <iMin ){.       
2b90: 20 20 20 20 20 69 4d 69 6e 20 3d 20 61 49 74 65       iMin = aIte
2ba0: 72 5b 69 5d 2e 69 50 6f 73 3b 0a 20 20 20 20 20  r[i].iPos;.     
2bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2bd0: 66 28 20 69 4d 69 6e 3d 3d 46 54 53 35 5f 4c 41  f( iMin==FTS5_LA
2be0: 52 47 45 53 54 5f 49 4e 54 36 34 20 7c 7c 20 72  RGEST_INT64 || r
2bf0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
2c00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d  reak;.      rc =
2c10: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2c20: 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28  istWriterAppend(
2c30: 70 42 75 66 2c 20 26 77 72 69 74 65 72 2c 20 69  pBuf, &writer, i
2c40: 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 50 72 65  Min);.      iPre
2c50: 76 20 3d 20 69 4d 69 6e 3b 0a 20 20 20 20 7d 0a  v = iMin;.    }.
2c60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
2c80: 70 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20  pa = pBuf->p;.  
2c90: 20 20 20 20 2a 70 6e 20 3d 20 70 42 75 66 2d 3e      *pn = pBuf->
2ca0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 73  n;.    }.  }.. s
2cb0: 79 6e 6f 6e 79 6d 5f 70 6f 73 6c 69 73 74 5f 6f  ynonym_poslist_o
2cc0: 75 74 3a 0a 20 20 69 66 28 20 61 49 74 65 72 21  ut:.  if( aIter!
2cd0: 3d 61 53 74 61 74 69 63 20 29 20 73 71 6c 69 74  =aStatic ) sqlit
2ce0: 65 33 5f 66 72 65 65 28 61 49 74 65 72 29 3b 0a  e3_free(aIter);.
2cf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d00: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 69 6e 64 69 76  ./*.** All indiv
2d10: 69 64 75 61 6c 20 74 65 72 6d 20 69 74 65 72 61  idual term itera
2d20: 74 6f 72 73 20 69 6e 20 70 50 68 72 61 73 65 20  tors in pPhrase 
2d30: 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2d40: 6f 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 2a  o be valid and.*
2d50: 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  * pointing to th
2d60: 65 20 73 61 6d 65 20 72 6f 77 69 64 20 77 68 65  e same rowid whe
2d70: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2d80: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20  is called. This 
2d90: 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 63 68 65  function .** che
2da0: 63 6b 73 20 69 66 20 74 68 65 20 63 75 72 72 65  cks if the curre
2db0: 6e 74 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20  nt rowid really 
2dc0: 69 73 20 61 20 6d 61 74 63 68 2c 20 61 6e 64 20  is a match, and 
2dd0: 69 66 20 73 6f 20 70 6f 70 75 6c 61 74 65 73 0a  if so populates.
2de0: 2a 2a 20 74 68 65 20 70 50 68 72 61 73 65 2d 3e  ** the pPhrase->
2df0: 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 61  poslist buffer a
2e00: 63 63 6f 72 64 69 6e 67 6c 79 2e 20 4f 75 74 70  ccordingly. Outp
2e10: 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62  ut parameter *pb
2e20: 4d 61 74 63 68 0a 2a 2a 20 69 73 20 73 65 74 20  Match.** is set 
2e30: 74 6f 20 74 72 75 65 20 69 66 20 74 68 69 73 20  to true if this 
2e40: 69 73 20 72 65 61 6c 6c 79 20 61 20 6d 61 74 63  is really a matc
2e50: 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  h, or false othe
2e60: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  rwise..**.** SQL
2e70: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2e80: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
2e90: 63 63 75 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c  ccurs, or an SQL
2ea0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 0a  ite error code .
2eb0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74  ** otherwise. It
2ec0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
2ed0: 65 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ed an error code
2ee0: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
2ef0: 72 6f 77 69 64 20 69 73 20 0a 2a 2a 20 6e 6f 74  rowid is .** not
2f00: 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61   a match..*/.sta
2f10: 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72  tic int fts5Expr
2f20: 50 68 72 61 73 65 49 73 4d 61 74 63 68 28 0a 20  PhraseIsMatch(. 
2f30: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
2f40: 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
2f50: 20 2f 2a 20 4e 6f 64 65 20 70 50 68 72 61 73 65   /* Node pPhrase
2f60: 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20   belongs to */. 
2f70: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
2f80: 2a 70 50 68 72 61 73 65 2c 20 20 20 20 20 20 20  *pPhrase,       
2f90: 20 2f 2a 20 50 68 72 61 73 65 20 6f 62 6a 65 63   /* Phrase objec
2fa0: 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  t to initialize 
2fb0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4d 61 74 63  */.  int *pbMatc
2fc0: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
2fd0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
2fe0: 20 74 6f 20 74 72 75 65 20 69 66 20 72 65 61 6c   to true if real
2ff0: 6c 79 20 61 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  ly a match */.){
3000: 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72  .  Fts5PoslistWr
3010: 69 74 65 72 20 77 72 69 74 65 72 20 3d 20 7b 30  iter writer = {0
3020: 7d 3b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74  };.  Fts5Poslist
3030: 52 65 61 64 65 72 20 61 53 74 61 74 69 63 5b 34  Reader aStatic[4
3040: 5d 3b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74  ];.  Fts5Poslist
3050: 52 65 61 64 65 72 20 2a 61 49 74 65 72 20 3d 20  Reader *aIter = 
3060: 61 53 74 61 74 69 63 3b 0a 20 20 69 6e 74 20 69  aStatic;.  int i
3070: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3080: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 46  ITE_OK;.  int bF
3090: 69 72 73 74 20 3d 20 70 50 68 72 61 73 65 2d 3e  irst = pPhrase->
30a0: 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 3b  aTerm[0].bFirst;
30b0: 0a 20 20 0a 20 20 66 74 73 35 42 75 66 66 65 72  .  .  fts5Buffer
30c0: 5a 65 72 6f 28 26 70 50 68 72 61 73 65 2d 3e 70  Zero(&pPhrase->p
30d0: 6f 73 6c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 49  oslist);..  /* I
30e0: 66 20 74 68 65 20 61 53 74 61 74 69 63 5b 5d 20  f the aStatic[] 
30f0: 61 72 72 61 79 20 69 73 20 6e 6f 74 20 6c 61 72  array is not lar
3100: 67 65 20 65 6e 6f 75 67 68 2c 20 61 6c 6c 6f 63  ge enough, alloc
3110: 61 74 65 20 61 20 6c 61 72 67 65 20 61 72 72 61  ate a large arra
3120: 79 0a 20 20 2a 2a 20 75 73 69 6e 67 20 73 71 6c  y.  ** using sql
3130: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54  ite3_malloc(). T
3140: 68 69 73 20 61 70 70 72 6f 61 63 68 20 63 6f 75  his approach cou
3150: 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64 20 75  ld be improved u
3160: 70 6f 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  pon. */.  if( pP
3170: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3e 41 72 72  hrase->nTerm>Arr
3180: 61 79 53 69 7a 65 28 61 53 74 61 74 69 63 29 20  aySize(aStatic) 
3190: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
31a0: 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a  nt64 nByte = siz
31b0: 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52  eof(Fts5PoslistR
31c0: 65 61 64 65 72 29 20 2a 20 70 50 68 72 61 73 65  eader) * pPhrase
31d0: 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 61 49 74  ->nTerm;.    aIt
31e0: 65 72 20 3d 20 28 46 74 73 35 50 6f 73 6c 69 73  er = (Fts5Poslis
31f0: 74 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65 33  tReader*)sqlite3
3200: 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
3210: 3b 0a 20 20 20 20 69 66 28 20 21 61 49 74 65 72  ;.    if( !aIter
3220: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
3230: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
3240: 6d 73 65 74 28 61 49 74 65 72 2c 20 30 2c 20 73  mset(aIter, 0, s
3250: 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73  izeof(Fts5Poslis
3260: 74 52 65 61 64 65 72 29 20 2a 20 70 50 68 72 61  tReader) * pPhra
3270: 73 65 2d 3e 6e 54 65 72 6d 29 3b 0a 0a 20 20 2f  se->nTerm);..  /
3280: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 74  * Initialize a t
3290: 65 72 6d 20 69 74 65 72 61 74 6f 72 20 66 6f 72  erm iterator for
32a0: 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
32b0: 65 20 70 68 72 61 73 65 20 2a 2f 0a 20 20 66 6f  e phrase */.  fo
32c0: 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65  r(i=0; i<pPhrase
32d0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  ->nTerm; i++){. 
32e0: 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
32f0: 2a 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73  *pTerm = &pPhras
3300: 65 2d 3e 61 54 65 72 6d 5b 69 5d 3b 0a 20 20 20  e->aTerm[i];.   
3310: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
3320: 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20  int bFlag = 0;. 
3330: 20 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20     u8 *a = 0;.  
3340: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79    if( pTerm->pSy
3350: 6e 6f 6e 79 6d 20 29 7b 0a 20 20 20 20 20 20 46  nonym ){.      F
3360: 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
3370: 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20  {0, 0, 0};.     
3380: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 53 79   rc = fts5ExprSy
3390: 6e 6f 6e 79 6d 4c 69 73 74 28 70 54 65 72 6d 2c  nonymList(pTerm,
33a0: 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 2c 20   pNode->iRowid, 
33b0: 26 62 75 66 2c 20 26 61 2c 20 26 6e 29 3b 0a 20  &buf, &a, &n);. 
33c0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
33d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
33e0: 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20 20 20  ree(a);.        
33f0: 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74  goto ismatch_out
3400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3410: 69 66 28 20 61 3d 3d 62 75 66 2e 70 20 29 20 62  if( a==buf.p ) b
3420: 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 65  Flag = 1;.    }e
3430: 6c 73 65 7b 0a 20 20 20 20 20 20 61 20 3d 20 28  lse{.      a = (
3440: 75 38 2a 29 70 54 65 72 6d 2d 3e 70 49 74 65 72  u8*)pTerm->pIter
3450: 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 6e  ->pData;.      n
3460: 20 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 2d   = pTerm->pIter-
3470: 3e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  >nData;.    }.  
3480: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
3490: 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 61  listReaderInit(a
34a0: 2c 20 6e 2c 20 26 61 49 74 65 72 5b 69 5d 29 3b  , n, &aIter[i]);
34b0: 0a 20 20 20 20 61 49 74 65 72 5b 69 5d 2e 62 46  .    aIter[i].bF
34c0: 6c 61 67 20 3d 20 28 75 38 29 62 46 6c 61 67 3b  lag = (u8)bFlag;
34d0: 0a 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69  .    if( aIter[i
34e0: 5d 2e 62 45 6f 66 20 29 20 67 6f 74 6f 20 69 73  ].bEof ) goto is
34f0: 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  match_out;.  }..
3500: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
3510: 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 20 20    int bMatch;.  
3520: 20 20 69 36 34 20 69 50 6f 73 20 3d 20 61 49 74    i64 iPos = aIt
3530: 65 72 5b 30 5d 2e 69 50 6f 73 3b 0a 20 20 20 20  er[0].iPos;.    
3540: 64 6f 20 7b 0a 20 20 20 20 20 20 62 4d 61 74 63  do {.      bMatc
3550: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  h = 1;.      for
3560: 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d  (i=0; i<pPhrase-
3570: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
3580: 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
3590: 74 52 65 61 64 65 72 20 2a 70 50 6f 73 20 3d 20  tReader *pPos = 
35a0: 26 61 49 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20  &aIter[i];.     
35b0: 20 20 20 69 36 34 20 69 41 64 6a 20 3d 20 69 50     i64 iAdj = iP
35c0: 6f 73 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20  os + i;.        
35d0: 69 66 28 20 70 50 6f 73 2d 3e 69 50 6f 73 21 3d  if( pPos->iPos!=
35e0: 69 41 64 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  iAdj ){.        
35f0: 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20    bMatch = 0;.  
3600: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
3610: 50 6f 73 2d 3e 69 50 6f 73 3c 69 41 64 6a 20 29  Pos->iPos<iAdj )
3620: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
3630: 28 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  ( sqlite3Fts5Pos
3640: 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 70  listReaderNext(p
3650: 50 6f 73 29 20 29 20 67 6f 74 6f 20 69 73 6d 61  Pos) ) goto isma
3660: 74 63 68 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  tch_out;.       
3670: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
3680: 66 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3e 69 41  f( pPos->iPos>iA
3690: 64 6a 20 29 20 69 50 6f 73 20 3d 20 70 50 6f 73  dj ) iPos = pPos
36a0: 2d 3e 69 50 6f 73 2d 69 3b 0a 20 20 20 20 20 20  ->iPos-i;.      
36b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36c0: 7d 77 68 69 6c 65 28 20 62 4d 61 74 63 68 3d 3d  }while( bMatch==
36d0: 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  0 );..    /* App
36e0: 65 6e 64 20 70 6f 73 69 74 69 6f 6e 20 69 50 6f  end position iPo
36f0: 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  s to the output 
3700: 2a 2f 0a 20 20 20 20 69 66 28 20 62 46 69 72 73  */.    if( bFirs
3710: 74 3d 3d 30 20 7c 7c 20 46 54 53 35 5f 50 4f 53  t==0 || FTS5_POS
3720: 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3d 3d 30  2OFFSET(iPos)==0
3730: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
3740: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
3750: 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 70  tWriterAppend(&p
3760: 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2c  Phrase->poslist,
3770: 20 26 77 72 69 74 65 72 2c 20 69 50 6f 73 29 3b   &writer, iPos);
3780: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
3790: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
37a0: 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20 20 20  ismatch_out;.   
37b0: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
37c0: 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72   i<pPhrase->nTer
37d0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
37e0: 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  f( sqlite3Fts5Po
37f0: 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
3800: 26 61 49 74 65 72 5b 69 5d 29 20 29 20 67 6f 74  &aIter[i]) ) got
3810: 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20  o ismatch_out;. 
3820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 69 73 6d 61 74     }.  }.. ismat
3830: 63 68 5f 6f 75 74 3a 0a 20 20 2a 70 62 4d 61 74  ch_out:.  *pbMat
3840: 63 68 20 3d 20 28 70 50 68 72 61 73 65 2d 3e 70  ch = (pPhrase->p
3850: 6f 73 6c 69 73 74 2e 6e 3e 30 29 3b 0a 20 20 66  oslist.n>0);.  f
3860: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73  or(i=0; i<pPhras
3870: 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  e->nTerm; i++){.
3880: 20 20 20 20 69 66 28 20 61 49 74 65 72 5b 69 5d      if( aIter[i]
3890: 2e 62 46 6c 61 67 20 29 20 73 71 6c 69 74 65 33  .bFlag ) sqlite3
38a0: 5f 66 72 65 65 28 28 75 38 2a 29 61 49 74 65 72  _free((u8*)aIter
38b0: 5b 69 5d 2e 61 29 3b 0a 20 20 7d 0a 20 20 69 66  [i].a);.  }.  if
38c0: 28 20 61 49 74 65 72 21 3d 61 53 74 61 74 69 63  ( aIter!=aStatic
38d0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
38e0: 61 49 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aIter);.  return
38f0: 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
3900: 73 74 72 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61  struct Fts5Looka
3910: 68 65 61 64 52 65 61 64 65 72 20 46 74 73 35 4c  headReader Fts5L
3920: 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 3b 0a  ookaheadReader;.
3930: 73 74 72 75 63 74 20 46 74 73 35 4c 6f 6f 6b 61  struct Fts5Looka
3940: 68 65 61 64 52 65 61 64 65 72 20 7b 0a 20 20 63  headReader {.  c
3950: 6f 6e 73 74 20 75 38 20 2a 61 3b 20 20 20 20 20  onst u8 *a;     
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3970: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3980: 69 6e 67 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ing position lis
3990: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  t */.  int n;   
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
39c0: 66 20 62 75 66 66 65 72 20 61 5b 5d 20 69 6e 20  f buffer a[] in 
39d0: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
39e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
39f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3a00: 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 20  rrent offset in 
3a10: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
3a20: 0a 20 20 69 36 34 20 69 50 6f 73 3b 20 20 20 20  .  i64 iPos;    
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 6f     /* Current po
3a50: 73 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36 34 20  sition */.  i64 
3a60: 69 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20  iLookahead;     
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3a80: 65 78 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a  ext position */.
3a90: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  };..#define FTS5
3aa0: 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46 20 28  _LOOKAHEAD_EOF (
3ab0: 28 28 69 36 34 29 31 29 20 3c 3c 20 36 32 29 0a  ((i64)1) << 62).
3ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
3ad0: 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 4e  LookaheadReaderN
3ae0: 65 78 74 28 46 74 73 35 4c 6f 6f 6b 61 68 65 61  ext(Fts5Lookahea
3af0: 64 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 70  dReader *p){.  p
3b00: 2d 3e 69 50 6f 73 20 3d 20 70 2d 3e 69 4c 6f 6f  ->iPos = p->iLoo
3b10: 6b 61 68 65 61 64 3b 0a 20 20 69 66 28 20 73 71  kahead;.  if( sq
3b20: 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
3b30: 4e 65 78 74 36 34 28 70 2d 3e 61 2c 20 70 2d 3e  Next64(p->a, p->
3b40: 6e 2c 20 26 70 2d 3e 69 2c 20 26 70 2d 3e 69 4c  n, &p->i, &p->iL
3b50: 6f 6f 6b 61 68 65 61 64 29 20 29 7b 0a 20 20 20  ookahead) ){.   
3b60: 20 70 2d 3e 69 4c 6f 6f 6b 61 68 65 61 64 20 3d   p->iLookahead =
3b70: 20 46 54 53 35 5f 4c 4f 4f 4b 41 48 45 41 44 5f   FTS5_LOOKAHEAD_
3b80: 45 4f 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  EOF;.  }.  retur
3b90: 6e 20 28 70 2d 3e 69 50 6f 73 3d 3d 46 54 53 35  n (p->iPos==FTS5
3ba0: 5f 4c 4f 4f 4b 41 48 45 41 44 5f 45 4f 46 29 3b  _LOOKAHEAD_EOF);
3bb0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
3bc0: 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64  ts5LookaheadRead
3bd0: 65 72 49 6e 69 74 28 0a 20 20 63 6f 6e 73 74 20  erInit(.  const 
3be0: 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20  u8 *a, int n,   
3bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3c00: 66 65 72 20 74 6f 20 72 65 61 64 20 70 6f 73 69  fer to read posi
3c10: 74 69 6f 6e 20 6c 69 73 74 20 66 72 6f 6d 20 2a  tion list from *
3c20: 2f 0a 20 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61  /.  Fts5Lookahea
3c30: 64 52 65 61 64 65 72 20 2a 70 20 20 20 20 20 20  dReader *p      
3c40: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
3c50: 6f 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61  object to initia
3c60: 6c 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d  lize */.){.  mem
3c70: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
3c80: 28 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65  (Fts5LookaheadRe
3c90: 61 64 65 72 29 29 3b 0a 20 20 70 2d 3e 61 20 3d  ader));.  p->a =
3ca0: 20 61 3b 0a 20 20 70 2d 3e 6e 20 3d 20 6e 3b 0a   a;.  p->n = n;.
3cb0: 20 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52    fts5LookaheadR
3cc0: 65 61 64 65 72 4e 65 78 74 28 70 29 3b 0a 20 20  eaderNext(p);.  
3cd0: 72 65 74 75 72 6e 20 66 74 73 35 4c 6f 6f 6b 61  return fts5Looka
3ce0: 68 65 61 64 52 65 61 64 65 72 4e 65 78 74 28 70  headReaderNext(p
3cf0: 29 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  );.}..typedef st
3d00: 72 75 63 74 20 46 74 73 35 4e 65 61 72 54 72 69  ruct Fts5NearTri
3d10: 6d 6d 65 72 20 46 74 73 35 4e 65 61 72 54 72 69  mmer Fts5NearTri
3d20: 6d 6d 65 72 3b 0a 73 74 72 75 63 74 20 46 74 73  mmer;.struct Fts
3d30: 35 4e 65 61 72 54 72 69 6d 6d 65 72 20 7b 0a 20  5NearTrimmer {. 
3d40: 20 46 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52 65   Fts5LookaheadRe
3d50: 61 64 65 72 20 72 65 61 64 65 72 3b 20 20 20 20  ader reader;    
3d60: 20 2f 2a 20 49 6e 70 75 74 20 69 74 65 72 61 74   /* Input iterat
3d70: 6f 72 20 2a 2f 0a 20 20 46 74 73 35 50 6f 73 6c  or */.  Fts5Posl
3d80: 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
3d90: 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ;       /* Write
3da0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 46  r context */.  F
3db0: 74 73 35 42 75 66 66 65 72 20 2a 70 4f 75 74 3b  ts5Buffer *pOut;
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3dd0: 2a 20 4f 75 74 70 75 74 20 70 6f 73 6c 69 73 74  * Output poslist
3de0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
3df0: 65 20 6e 65 61 72 2d 73 65 74 20 6f 62 6a 65 63  e near-set objec
3e00: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
3e10: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63  first argument c
3e20: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
3e30: 6e 0a 2a 2a 20 6f 6e 65 20 70 68 72 61 73 65 2e  n.** one phrase.
3e40: 20 41 6c 6c 20 70 68 72 61 73 65 73 20 63 75 72   All phrases cur
3e50: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20  rently point to 
3e60: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 54 68  the same row. Th
3e70: 65 0a 2a 2a 20 46 74 73 35 45 78 70 72 50 68 72  e.** Fts5ExprPhr
3e80: 61 73 65 2e 70 6f 73 6c 69 73 74 20 62 75 66 66  ase.poslist buff
3e90: 65 72 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  ers are populate
3ea0: 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
3eb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
3ec0: 74 65 73 74 73 20 69 66 20 74 68 65 20 63 75 72  tests if the cur
3ed0: 72 65 6e 74 20 72 6f 77 20 63 6f 6e 74 61 69 6e  rent row contain
3ee0: 73 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 65  s instances of e
3ef0: 61 63 68 20 70 68 72 61 73 65 20 73 75 66 66 69  ach phrase suffi
3f00: 63 69 65 6e 74 6c 79 0a 2a 2a 20 63 6c 6f 73 65  ciently.** close
3f10: 20 74 6f 67 65 74 68 65 72 20 74 6f 20 6d 65 65   together to mee
3f20: 74 20 74 68 65 20 4e 45 41 52 20 63 6f 6e 73 74  t the NEAR const
3f30: 72 61 69 6e 74 2e 20 4e 6f 6e 2d 7a 65 72 6f 20  raint. Non-zero 
3f40: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  is returned if i
3f50: 74 0a 2a 2a 20 64 6f 65 73 2c 20 6f 72 20 7a 65  t.** does, or ze
3f60: 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ro otherwise..**
3f70: 0a 2a 2a 20 49 66 20 69 6e 2f 6f 75 74 20 70 61  .** If in/out pa
3f80: 72 61 6d 65 74 65 72 20 28 2a 70 52 63 29 20 69  rameter (*pRc) i
3f90: 73 20 73 65 74 20 74 6f 20 6f 74 68 65 72 20 74  s set to other t
3fa0: 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  han SQLITE_OK wh
3fb0: 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
3fc0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
3fd0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 72  t is a no-op. Or
3fe0: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65  , if an error (e
3ff0: 2e 67 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .g. SQLITE_NOMEM
4000: 29 0a 2a 2a 20 6f 63 63 75 72 73 20 77 69 74 68  ).** occurs with
4010: 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
4020: 20 28 2a 70 52 63 29 20 69 73 20 73 65 74 20 61   (*pRc) is set a
4030: 63 63 6f 72 64 69 6e 67 6c 79 20 62 65 66 6f 72  ccordingly befor
4040: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
4050: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
4060: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
4070: 20 62 6f 74 68 20 74 68 65 73 65 20 63 61 73 65   both these case
4080: 73 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 6e 6f 20  s..** .** If no 
4090: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
40a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 61 20 6d 61 74   non-zero (a mat
40b0: 63 68 29 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ch) is returned,
40c0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
40d0: 73 74 0a 2a 2a 20 6f 66 20 65 61 63 68 20 70 68  st.** of each ph
40e0: 72 61 73 65 20 6f 62 6a 65 63 74 20 69 73 20 65  rase object is e
40f0: 64 69 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dited to contain
4100: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 65 6e 74 72   only those entr
4110: 69 65 73 20 74 68 61 74 0a 2a 2a 20 6d 65 65 74  ies that.** meet
4120: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
4130: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
4140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4150: 66 74 73 35 45 78 70 72 4e 65 61 72 49 73 4d 61  fts5ExprNearIsMa
4160: 74 63 68 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  tch(int *pRc, Ft
4170: 73 35 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70  s5ExprNearset *p
4180: 4e 65 61 72 29 7b 0a 20 20 46 74 73 35 4e 65 61  Near){.  Fts5Nea
4190: 72 54 72 69 6d 6d 65 72 20 61 53 74 61 74 69 63  rTrimmer aStatic
41a0: 5b 34 5d 3b 0a 20 20 46 74 73 35 4e 65 61 72 54  [4];.  Fts5NearT
41b0: 72 69 6d 6d 65 72 20 2a 61 20 3d 20 61 53 74 61  rimmer *a = aSta
41c0: 74 69 63 3b 0a 20 20 46 74 73 35 45 78 70 72 50  tic;.  Fts5ExprP
41d0: 68 72 61 73 65 20 2a 2a 61 70 50 68 72 61 73 65  hrase **apPhrase
41e0: 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61   = pNear->apPhra
41f0: 73 65 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a 20 20  se;..  int i;.  
4200: 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20  int rc = *pRc;. 
4210: 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 0a 20 20   int bMatch;..  
4220: 61 73 73 65 72 74 28 20 70 4e 65 61 72 2d 3e 6e  assert( pNear->n
4230: 50 68 72 61 73 65 3e 31 20 29 3b 0a 0a 20 20 2f  Phrase>1 );..  /
4240: 2a 20 49 66 20 74 68 65 20 61 53 74 61 74 69 63  * If the aStatic
4250: 5b 5d 20 61 72 72 61 79 20 69 73 20 6e 6f 74 20  [] array is not 
4260: 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20 61 6c  large enough, al
4270: 6c 6f 63 61 74 65 20 61 20 6c 61 72 67 65 20 61  locate a large a
4280: 72 72 61 79 0a 20 20 2a 2a 20 75 73 69 6e 67 20  rray.  ** using 
4290: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
42a0: 2e 20 54 68 69 73 20 61 70 70 72 6f 61 63 68 20  . This approach 
42b0: 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65  could be improve
42c0: 64 20 75 70 6f 6e 2e 20 2a 2f 0a 20 20 69 66 28  d upon. */.  if(
42d0: 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3e   pNear->nPhrase>
42e0: 41 72 72 61 79 53 69 7a 65 28 61 53 74 61 74 69  ArraySize(aStati
42f0: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
4300: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
4310: 73 69 7a 65 6f 66 28 46 74 73 35 4e 65 61 72 54  sizeof(Fts5NearT
4320: 72 69 6d 6d 65 72 29 20 2a 20 70 4e 65 61 72 2d  rimmer) * pNear-
4330: 3e 6e 50 68 72 61 73 65 3b 0a 20 20 20 20 61 20  >nPhrase;.    a 
4340: 3d 20 28 46 74 73 35 4e 65 61 72 54 72 69 6d 6d  = (Fts5NearTrimm
4350: 65 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  er*)sqlite3Fts5M
4360: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
4370: 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
4380: 20 20 20 20 6d 65 6d 73 65 74 28 61 53 74 61 74      memset(aStat
4390: 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53  ic, 0, sizeof(aS
43a0: 74 61 74 69 63 29 29 3b 0a 20 20 7d 0a 20 20 69  tatic));.  }.  i
43b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
43c0: 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
43d0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  c;.    return 0;
43e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
43f0: 61 6c 69 7a 65 20 61 20 6c 6f 6f 6b 61 68 65 61  alize a lookahea
4400: 64 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 65  d iterator for e
4410: 61 63 68 20 70 68 72 61 73 65 2e 20 41 66 74 65  ach phrase. Afte
4420: 72 20 70 61 73 73 69 6e 67 20 74 68 65 0a 20 20  r passing the.  
4430: 2a 2a 20 62 75 66 66 65 72 20 61 6e 64 20 62 75  ** buffer and bu
4440: 66 66 65 72 20 73 69 7a 65 20 74 6f 20 74 68 65  ffer size to the
4450: 20 6c 6f 6f 6b 61 73 69 64 65 2d 72 65 61 64 65   lookaside-reade
4460: 72 20 69 6e 69 74 20 66 75 6e 63 74 69 6f 6e 2c  r init function,
4470: 20 7a 65 72 6f 0a 20 20 2a 2a 20 74 68 65 20 70   zero.  ** the p
4480: 68 72 61 73 65 20 70 6f 73 6c 69 73 74 20 62 75  hrase poslist bu
4490: 66 66 65 72 2e 20 54 68 65 20 6e 65 77 20 70 6f  ffer. The new po
44a0: 73 6c 69 73 74 20 66 6f 72 20 74 68 65 20 70 68  slist for the ph
44b0: 72 61 73 65 20 28 63 6f 6e 74 61 69 6e 69 6e 67  rase (containing
44c0: 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 65  .  ** the same e
44d0: 6e 74 72 69 65 73 20 61 73 20 74 68 65 20 6f 72  ntries as the or
44e0: 69 67 69 6e 61 6c 20 77 69 74 68 20 73 6f 6d 65  iginal with some
44f0: 20 65 6e 74 72 69 65 73 20 72 65 6d 6f 76 65 64   entries removed
4500: 20 6f 6e 20 61 63 63 6f 75 6e 74 20 0a 20 20 2a   on account .  *
4510: 2a 20 6f 66 20 74 68 65 20 4e 45 41 52 20 63 6f  * of the NEAR co
4520: 6e 73 74 72 61 69 6e 74 29 20 69 73 20 77 72 69  nstraint) is wri
4530: 74 74 65 6e 20 6f 76 65 72 20 74 68 65 20 6f 72  tten over the or
4540: 69 67 69 6e 61 6c 20 65 76 65 6e 20 61 73 20 69  iginal even as i
4550: 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20  t is.  ** being 
4560: 72 65 61 64 2e 20 54 68 69 73 20 69 73 20 73 61  read. This is sa
4570: 66 65 20 61 73 20 74 68 65 20 65 6e 74 72 69 65  fe as the entrie
4580: 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 6f  s for the new po
4590: 73 6c 69 73 74 20 61 72 65 20 61 0a 20 20 2a 2a  slist are a.  **
45a0: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 6f   subset of the o
45b0: 6c 64 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  ld, so it is not
45c0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 64 61   possible for da
45d0: 74 61 20 79 65 74 20 74 6f 20 62 65 20 72 65 61  ta yet to be rea
45e0: 64 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 76 65  d to.  ** be ove
45f0: 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
4600: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72  for(i=0; i<pNear
4610: 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b  ->nPhrase; i++){
4620: 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
4630: 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 61 70 50  *pPoslist = &apP
4640: 68 72 61 73 65 5b 69 5d 2d 3e 70 6f 73 6c 69 73  hrase[i]->poslis
4650: 74 3b 0a 20 20 20 20 66 74 73 35 4c 6f 6f 6b 61  t;.    fts5Looka
4660: 68 65 61 64 52 65 61 64 65 72 49 6e 69 74 28 70  headReaderInit(p
4670: 50 6f 73 6c 69 73 74 2d 3e 70 2c 20 70 50 6f 73  Poslist->p, pPos
4680: 6c 69 73 74 2d 3e 6e 2c 20 26 61 5b 69 5d 2e 72  list->n, &a[i].r
4690: 65 61 64 65 72 29 3b 0a 20 20 20 20 70 50 6f 73  eader);.    pPos
46a0: 6c 69 73 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20  list->n = 0;.   
46b0: 20 61 5b 69 5d 2e 70 4f 75 74 20 3d 20 70 50 6f   a[i].pOut = pPo
46c0: 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 77 68  slist;.  }..  wh
46d0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e  ile( 1 ){.    in
46e0: 74 20 69 41 64 76 3b 0a 20 20 20 20 69 36 34 20  t iAdv;.    i64 
46f0: 69 4d 69 6e 3b 0a 20 20 20 20 69 36 34 20 69 4d  iMin;.    i64 iM
4700: 61 78 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ax;..    /* This
4710: 20 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73 20   block advances 
4720: 74 68 65 20 70 68 72 61 73 65 20 69 74 65 72 61  the phrase itera
4730: 74 6f 72 73 20 75 6e 74 69 6c 20 74 68 65 79 20  tors until they 
4740: 70 6f 69 6e 74 20 74 6f 20 61 20 73 65 74 20 6f  point to a set o
4750: 66 0a 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73  f.    ** entries
4760: 20 74 68 61 74 20 74 6f 67 65 74 68 65 72 20 63   that together c
4770: 6f 6d 70 72 69 73 65 20 61 20 6d 61 74 63 68 2e  omprise a match.
4780: 20 20 2a 2f 0a 20 20 20 20 69 4d 61 78 20 3d 20    */.    iMax = 
4790: 61 5b 30 5d 2e 72 65 61 64 65 72 2e 69 50 6f 73  a[0].reader.iPos
47a0: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
47b0: 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20   bMatch = 1;.   
47c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
47d0: 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  ear->nPhrase; i+
47e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  +){.        Fts5
47f0: 4c 6f 6f 6b 61 68 65 61 64 52 65 61 64 65 72 20  LookaheadReader 
4800: 2a 70 50 6f 73 20 3d 20 26 61 5b 69 5d 2e 72 65  *pPos = &a[i].re
4810: 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 69 4d  ader;.        iM
4820: 69 6e 20 3d 20 69 4d 61 78 20 2d 20 70 4e 65 61  in = iMax - pNea
4830: 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 2d 3e  r->apPhrase[i]->
4840: 6e 54 65 72 6d 20 2d 20 70 4e 65 61 72 2d 3e 6e  nTerm - pNear->n
4850: 4e 65 61 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Near;.        if
4860: 28 20 70 50 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69  ( pPos->iPos<iMi
4870: 6e 20 7c 7c 20 70 50 6f 73 2d 3e 69 50 6f 73 3e  n || pPos->iPos>
4880: 69 4d 61 78 20 29 7b 0a 20 20 20 20 20 20 20 20  iMax ){.        
4890: 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20    bMatch = 0;.  
48a0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
48b0: 50 6f 73 2d 3e 69 50 6f 73 3c 69 4d 69 6e 20 29  Pos->iPos<iMin )
48c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
48d0: 28 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52  ( fts5LookaheadR
48e0: 65 61 64 65 72 4e 65 78 74 28 70 50 6f 73 29 20  eaderNext(pPos) 
48f0: 29 20 67 6f 74 6f 20 69 73 6d 61 74 63 68 5f 6f  ) goto ismatch_o
4900: 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
4910: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
4920: 6f 73 2d 3e 69 50 6f 73 3e 69 4d 61 78 20 29 20  os->iPos>iMax ) 
4930: 69 4d 61 78 20 3d 20 70 50 6f 73 2d 3e 69 50 6f  iMax = pPos->iPo
4940: 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  s;.        }.   
4950: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
4960: 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20   bMatch==0 );.. 
4970: 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
4980: 72 79 20 74 6f 20 65 61 63 68 20 6f 75 74 70 75  ry to each outpu
4990: 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  t position list 
49a0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
49b0: 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  i<pNear->nPhrase
49c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 36  ; i++){.      i6
49d0: 34 20 69 50 6f 73 20 3d 20 61 5b 69 5d 2e 72 65  4 iPos = a[i].re
49e0: 61 64 65 72 2e 69 50 6f 73 3b 0a 20 20 20 20 20  ader.iPos;.     
49f0: 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
4a00: 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 26 61  er *pWriter = &a
4a10: 5b 69 5d 2e 77 72 69 74 65 72 3b 0a 20 20 20 20  [i].writer;.    
4a20: 20 20 69 66 28 20 61 5b 69 5d 2e 70 4f 75 74 2d    if( a[i].pOut-
4a30: 3e 6e 3d 3d 30 20 7c 7c 20 69 50 6f 73 21 3d 70  >n==0 || iPos!=p
4a40: 57 72 69 74 65 72 2d 3e 69 50 72 65 76 20 29 7b  Writer->iPrev ){
4a50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4a60: 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
4a70: 72 41 70 70 65 6e 64 28 61 5b 69 5d 2e 70 4f 75  rAppend(a[i].pOu
4a80: 74 2c 20 70 57 72 69 74 65 72 2c 20 69 50 6f 73  t, pWriter, iPos
4a90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4aa0: 0a 0a 20 20 20 20 69 41 64 76 20 3d 20 30 3b 0a  ..    iAdv = 0;.
4ab0: 20 20 20 20 69 4d 69 6e 20 3d 20 61 5b 30 5d 2e      iMin = a[0].
4ac0: 72 65 61 64 65 72 2e 69 4c 6f 6f 6b 61 68 65 61  reader.iLookahea
4ad0: 64 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  d;.    for(i=0; 
4ae0: 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  i<pNear->nPhrase
4af0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4b00: 28 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c  ( a[i].reader.iL
4b10: 6f 6f 6b 61 68 65 61 64 20 3c 20 69 4d 69 6e 20  ookahead < iMin 
4b20: 29 7b 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20  ){.        iMin 
4b30: 3d 20 61 5b 69 5d 2e 72 65 61 64 65 72 2e 69 4c  = a[i].reader.iL
4b40: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20  ookahead;.      
4b50: 20 20 69 41 64 76 20 3d 20 69 3b 0a 20 20 20 20    iAdv = i;.    
4b60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
4b70: 28 20 66 74 73 35 4c 6f 6f 6b 61 68 65 61 64 52  ( fts5LookaheadR
4b80: 65 61 64 65 72 4e 65 78 74 28 26 61 5b 69 41 64  eaderNext(&a[iAd
4b90: 76 5d 2e 72 65 61 64 65 72 29 20 29 20 67 6f 74  v].reader) ) got
4ba0: 6f 20 69 73 6d 61 74 63 68 5f 6f 75 74 3b 0a 20  o ismatch_out;. 
4bb0: 20 7d 0a 0a 20 20 69 73 6d 61 74 63 68 5f 6f 75   }..  ismatch_ou
4bc0: 74 3a 20 7b 0a 20 20 20 20 69 6e 74 20 62 52 65  t: {.    int bRe
4bd0: 74 20 3d 20 61 5b 30 5d 2e 70 4f 75 74 2d 3e 6e  t = a[0].pOut->n
4be0: 3e 30 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72  >0;.    *pRc = r
4bf0: 63 3b 0a 20 20 20 20 69 66 28 20 61 21 3d 61 53  c;.    if( a!=aS
4c00: 74 61 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f  tatic ) sqlite3_
4c10: 66 72 65 65 28 61 29 3b 0a 20 20 20 20 72 65 74  free(a);.    ret
4c20: 75 72 6e 20 62 52 65 74 3b 0a 20 20 7d 0a 7d 0a  urn bRet;.  }.}.
4c30: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69  ./*.** Advance i
4c40: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 75 6e  terator pIter un
4c50: 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
4c60: 20 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74   a value equal t
4c70: 6f 20 6f 72 20 6c 61 73 74 65 72 0a 2a 2a 20 74  o or laster.** t
4c80: 68 61 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 20  han the initial 
4c90: 76 61 6c 75 65 20 6f 66 20 2a 70 69 4c 61 73 74  value of *piLast
4ca0: 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  . If this means 
4cb0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
4cc0: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 75  nts.** to a valu
4cd0: 65 20 6c 61 73 74 65 72 20 74 68 61 6e 20 2a 70  e laster than *p
4ce0: 69 4c 61 73 74 2c 20 75 70 64 61 74 65 20 2a 70  iLast, update *p
4cf0: 69 4c 61 73 74 20 74 6f 20 74 68 65 20 6e 65 77  iLast to the new
4d00: 20 6c 61 73 74 65 73 74 20 76 61 6c 75 65 2e 0a   lastest value..
4d10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 74 65  **.** If the ite
4d20: 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f  rator reaches EO
4d30: 46 2c 20 73 65 74 20 2a 70 62 45 6f 66 20 74 6f  F, set *pbEof to
4d40: 20 74 72 75 65 20 62 65 66 6f 72 65 20 72 65 74   true before ret
4d50: 75 72 6e 69 6e 67 2e 20 49 66 0a 2a 2a 20 61 6e  urning. If.** an
4d60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
4d70: 65 74 20 2a 70 52 63 20 74 6f 20 61 6e 20 65 72  et *pRc to an er
4d80: 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 65 69 74  ror code. If eit
4d90: 68 65 72 20 2a 70 62 45 6f 66 20 6f 72 20 2a 70  her *pbEof or *p
4da0: 52 63 0a 2a 2a 20 61 72 65 20 73 65 74 2c 20 72  Rc.** are set, r
4db0: 65 74 75 72 6e 20 61 20 6e 6f 6e 2d 7a 65 72 6f  eturn a non-zero
4dc0: 20 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73   value. Otherwis
4dd0: 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a  e, return zero..
4de0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
4df0: 73 35 45 78 70 72 41 64 76 61 6e 63 65 74 6f 28  s5ExprAdvanceto(
4e00: 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
4e10: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
4e20: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
4e30: 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
4e40: 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20  nt bDesc,       
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4e60: 2a 20 54 72 75 65 20 69 66 20 69 74 65 72 61 74  * True if iterat
4e70: 6f 72 20 69 73 20 22 72 6f 77 69 64 20 44 45 53  or is "rowid DES
4e80: 43 22 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c  C" */.  i64 *piL
4e90: 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
4ea0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
4eb0: 54 3a 20 4c 61 73 74 65 73 74 20 72 6f 77 69 64  T: Lastest rowid
4ec0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
4ed0: 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
4f00: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  code */.  int *p
4f10: 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  bEof            
4f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
4f30: 3a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  : Set to true if
4f40: 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 36 34   EOF */.){.  i64
4f50: 20 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74   iLast = *piLast
4f60: 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  ;.  i64 iRowid;.
4f70: 0a 20 20 69 52 6f 77 69 64 20 3d 20 70 49 74 65  .  iRowid = pIte
4f80: 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28  r->iRowid;.  if(
4f90: 20 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69 4c   (bDesc==0 && iL
4fa0: 61 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20 28  ast>iRowid) || (
4fb0: 62 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c 69  bDesc && iLast<i
4fc0: 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 69 6e  Rowid) ){.    in
4fd0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
4fe0: 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  s5IterNextFrom(p
4ff0: 49 74 65 72 2c 20 69 4c 61 73 74 29 3b 0a 20 20  Iter, iLast);.  
5000: 20 20 69 66 28 20 72 63 20 7c 7c 20 73 71 6c 69    if( rc || sqli
5010: 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
5020: 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2a  Iter) ){.      *
5030: 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRc = rc;.      
5040: 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  *pbEof = 1;.    
5050: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5060: 7d 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 70  }.    iRowid = p
5070: 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  Iter->iRowid;.  
5080: 20 20 61 73 73 65 72 74 28 20 28 62 44 65 73 63    assert( (bDesc
5090: 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  ==0 && iRowid>=i
50a0: 4c 61 73 74 29 20 7c 7c 20 28 62 44 65 73 63 3d  Last) || (bDesc=
50b0: 3d 31 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c  =1 && iRowid<=iL
50c0: 61 73 74 29 20 29 3b 0a 20 20 7d 0a 20 20 2a 70  ast) );.  }.  *p
50d0: 69 4c 61 73 74 20 3d 20 69 52 6f 77 69 64 3b 0a  iLast = iRowid;.
50e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
50f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45  static int fts5E
5100: 78 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e 63  xprSynonymAdvanc
5110: 65 74 6f 28 0a 20 20 46 74 73 35 45 78 70 72 54  eto(.  Fts5ExprT
5120: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20  erm *pTerm,     
5130: 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 69         /* Term i
5140: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
5150: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  ce */.  int bDes
5160: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5170: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5180: 69 66 20 69 74 65 72 61 74 6f 72 20 69 73 20 22  if iterator is "
5190: 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20  rowid DESC" */. 
51a0: 20 69 36 34 20 2a 70 69 4c 61 73 74 2c 20 20 20   i64 *piLast,   
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 61 73 74   /* IN/OUT: Last
51d0: 65 73 74 20 72 6f 77 69 64 20 73 65 65 6e 20 73  est rowid seen s
51e0: 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  o far */.  int *
51f0: 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20  pRc             
5200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
5210: 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
5220: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
5230: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 36 34 20  QLITE_OK;.  i64 
5240: 69 4c 61 73 74 20 3d 20 2a 70 69 4c 61 73 74 3b  iLast = *piLast;
5250: 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20  .  Fts5ExprTerm 
5260: 2a 70 3b 0a 20 20 69 6e 74 20 62 45 6f 66 20 3d  *p;.  int bEof =
5270: 20 30 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 54 65   0;..  for(p=pTe
5280: 72 6d 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rm; rc==SQLITE_O
5290: 4b 20 26 26 20 70 3b 20 70 3d 70 2d 3e 70 53 79  K && p; p=p->pSy
52a0: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 69 66 28 20  nonym){.    if( 
52b0: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
52c0: 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d 30 20  of(p->pIter)==0 
52d0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
52e0: 77 69 64 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e  wid = p->pIter->
52f0: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 66  iRowid;.      if
5300: 28 20 28 62 44 65 73 63 3d 3d 30 20 26 26 20 69  ( (bDesc==0 && i
5310: 4c 61 73 74 3e 69 52 6f 77 69 64 29 20 7c 7c 20  Last>iRowid) || 
5320: 28 62 44 65 73 63 20 26 26 20 69 4c 61 73 74 3c  (bDesc && iLast<
5330: 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20  iRowid) ){.     
5340: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
5350: 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ts5IterNextFrom(
5360: 70 2d 3e 70 49 74 65 72 2c 20 69 4c 61 73 74 29  p->pIter, iLast)
5370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5380: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
5390: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
53a0: 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 62  *pRc = rc;.    b
53b0: 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
53c0: 7b 0a 20 20 20 20 2a 70 69 4c 61 73 74 20 3d 20  {.    *piLast = 
53d0: 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52  fts5ExprSynonymR
53e0: 6f 77 69 64 28 70 54 65 72 6d 2c 20 62 44 65 73  owid(pTerm, bDes
53f0: 63 2c 20 26 62 45 6f 66 29 3b 0a 20 20 7d 0a 20  c, &bEof);.  }. 
5400: 20 72 65 74 75 72 6e 20 62 45 6f 66 3b 0a 7d 0a   return bEof;.}.
5410: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
5420: 35 45 78 70 72 4e 65 61 72 54 65 73 74 28 0a 20  5ExprNearTest(. 
5430: 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73   int *pRc,.  Fts
5440: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  5Expr *pExpr,   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5460: 45 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  Expression that 
5470: 70 4e 65 61 72 20 69 73 20 61 20 70 61 72 74 20  pNear is a part 
5480: 6f 66 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  of */.  Fts5Expr
5490: 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20 20  Node *pNode     
54a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
54b0: 4e 45 41 52 22 20 6e 6f 64 65 20 28 46 54 53 35  NEAR" node (FTS5
54c0: 5f 53 54 52 49 4e 47 29 20 2a 2f 0a 29 7b 0a 20  _STRING) */.){. 
54d0: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
54e0: 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d   *pNear = pNode-
54f0: 3e 70 4e 65 61 72 3b 0a 20 20 69 6e 74 20 72 63  >pNear;.  int rc
5500: 20 3d 20 2a 70 52 63 3b 0a 0a 20 20 69 66 28 20   = *pRc;..  if( 
5510: 70 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e  pExpr->pConfig->
5520: 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45  eDetail!=FTS5_DE
5530: 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  TAIL_FULL ){.   
5540: 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70   Fts5ExprTerm *p
5550: 54 65 72 6d 3b 0a 20 20 20 20 46 74 73 35 45 78  Term;.    Fts5Ex
5560: 70 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  prPhrase *pPhras
5570: 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50 68 72  e = pNear->apPhr
5580: 61 73 65 5b 30 5d 3b 0a 20 20 20 20 70 50 68 72  ase[0];.    pPhr
5590: 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d  ase->poslist.n =
55a0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72   0;.    for(pTer
55b0: 6d 3d 26 70 50 68 72 61 73 65 2d 3e 61 54 65 72  m=&pPhrase->aTer
55c0: 6d 5b 30 5d 3b 20 70 54 65 72 6d 3b 20 70 54 65  m[0]; pTerm; pTe
55d0: 72 6d 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e  rm=pTerm->pSynon
55e0: 79 6d 29 7b 0a 20 20 20 20 20 20 46 74 73 35 49  ym){.      Fts5I
55f0: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
5600: 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0a  = pTerm->pIter;.
5610: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5620: 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74  3Fts5IterEof(pIt
5630: 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  er)==0 ){.      
5640: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f    if( pIter->iRo
5650: 77 69 64 3d 3d 70 4e 6f 64 65 2d 3e 69 52 6f 77  wid==pNode->iRow
5660: 69 64 20 26 26 20 70 49 74 65 72 2d 3e 6e 44 61  id && pIter->nDa
5670: 74 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ta>0 ){.        
5680: 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69    pPhrase->posli
5690: 73 74 2e 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  st.n = 1;.      
56a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
56b0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 68  }.    return pPh
56c0: 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b  rase->poslist.n;
56d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
56e0: 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t i;..    /* Che
56f0: 63 6b 20 74 68 61 74 20 65 61 63 68 20 70 68 72  ck that each phr
5700: 61 73 65 20 69 6e 20 74 68 65 20 6e 65 61 72 73  ase in the nears
5710: 65 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  et matches the c
5720: 75 72 72 65 6e 74 20 72 6f 77 2e 0a 20 20 20 20  urrent row..    
5730: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
5740: 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
5750: 20 62 75 66 66 65 72 73 20 61 74 20 74 68 65 20   buffers at the 
5760: 73 61 6d 65 20 74 69 6d 65 2e 20 49 66 20 61 6e  same time. If an
5770: 79 0a 20 20 20 20 2a 2a 20 70 68 72 61 73 65 20  y.    ** phrase 
5780: 69 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20  is not a match, 
5790: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
57a0: 20 6c 6f 6f 70 20 65 61 72 6c 79 2e 20 20 2a 2f   loop early.  */
57b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
57c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
57d0: 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b  <pNear->nPhrase;
57e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   i++){.      Fts
57f0: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
5800: 72 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70  rase = pNear->ap
5810: 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20  Phrase[i];.     
5820: 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 6e 54   if( pPhrase->nT
5830: 65 72 6d 3e 31 20 7c 7c 20 70 50 68 72 61 73 65  erm>1 || pPhrase
5840: 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f  ->aTerm[0].pSyno
5850: 6e 79 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  nym .       || p
5860: 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 7c 7c  Near->pColset ||
5870: 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b   pPhrase->aTerm[
5880: 30 5d 2e 62 46 69 72 73 74 0a 20 20 20 20 20 20  0].bFirst.      
5890: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ){.        int b
58a0: 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
58b0: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
58c0: 50 68 72 61 73 65 49 73 4d 61 74 63 68 28 70 4e  PhraseIsMatch(pN
58d0: 6f 64 65 2c 20 70 50 68 72 61 73 65 2c 20 26 62  ode, pPhrase, &b
58e0: 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 20 20  Match);.        
58f0: 69 66 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 20  if( bMatch==0 ) 
5900: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
5910: 73 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  se{.        Fts5
5920: 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
5930: 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65 72   = pPhrase->aTer
5940: 6d 5b 30 5d 2e 70 49 74 65 72 3b 0a 20 20 20 20  m[0].pIter;.    
5950: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
5960: 74 28 26 72 63 2c 20 26 70 50 68 72 61 73 65 2d  t(&rc, &pPhrase-
5970: 3e 70 6f 73 6c 69 73 74 2c 20 70 49 74 65 72 2d  >poslist, pIter-
5980: 3e 6e 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 70  >nData, pIter->p
5990: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
59a0: 20 20 20 7d 0a 0a 20 20 20 20 2a 70 52 63 20 3d     }..    *pRc =
59b0: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d   rc;.    if( i==
59c0: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 20 26  pNear->nPhrase &
59d0: 26 20 28 69 3d 3d 31 20 7c 7c 20 66 74 73 35 45  & (i==1 || fts5E
59e0: 78 70 72 4e 65 61 72 49 73 4d 61 74 63 68 28 70  xprNearIsMatch(p
59f0: 52 63 2c 20 70 4e 65 61 72 29 29 20 29 7b 0a 20  Rc, pNear)) ){. 
5a00: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5a10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
5a20: 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  0;.  }.}.../*.**
5a30: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   Initialize all 
5a40: 74 65 72 6d 20 69 74 65 72 61 74 6f 72 73 20 69  term iterators i
5a50: 6e 20 74 68 65 20 70 4e 65 61 72 20 6f 62 6a 65  n the pNear obje
5a60: 63 74 2e 20 49 66 20 61 6e 79 20 74 65 72 6d 20  ct. If any term 
5a70: 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 74 6f 20 6d  is found.** to m
5a80: 61 74 63 68 20 6e 6f 20 64 6f 63 75 6d 65 6e 74  atch no document
5a90: 73 20 61 74 20 61 6c 6c 2c 20 72 65 74 75 72 6e  s at all, return
5aa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
5ab0: 68 6f 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e  hout initializin
5ac0: 67 20 61 6e 79 0a 2a 2a 20 66 75 72 74 68 65 72  g any.** further
5ad0: 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   iterators..**.*
5ae0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
5af0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
5b00: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
5b10: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
5b20: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
5b30: 4b 2e 20 49 74 20 69 73 20 6e 6f 74 20 63 6f 6e  K. It is not con
5b40: 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72  sidered an error
5b50: 20 69 66 20 73 6f 6d 65 20 74 65 72 6d 20 6d 61   if some term ma
5b60: 74 63 68 65 73 20 7a 65 72 6f 0a 2a 2a 20 64 6f  tches zero.** do
5b70: 63 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  cuments..*/.stat
5b80: 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 4e  ic int fts5ExprN
5b90: 65 61 72 49 6e 69 74 41 6c 6c 28 0a 20 20 46 74  earInitAll(.  Ft
5ba0: 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20  s5Expr *pExpr,. 
5bb0: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
5bc0: 4e 6f 64 65 0a 29 7b 0a 20 20 46 74 73 35 45 78  Node.){.  Fts5Ex
5bd0: 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
5be0: 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 3b   = pNode->pNear;
5bf0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
5c00: 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d  ert( pNode->bNom
5c10: 61 74 63 68 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  atch==0 );.  for
5c20: 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e  (i=0; i<pNear->n
5c30: 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20  Phrase; i++){.  
5c40: 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65    Fts5ExprPhrase
5c50: 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61   *pPhrase = pNea
5c60: 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a  r->apPhrase[i];.
5c70: 20 20 20 20 69 66 28 20 70 50 68 72 61 73 65 2d      if( pPhrase-
5c80: 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20  >nTerm==0 ){.   
5c90: 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d     pNode->bEof =
5ca0: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
5cb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5cc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5cd0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
5ce0: 30 3b 20 6a 3c 70 50 68 72 61 73 65 2d 3e 6e 54  0; j<pPhrase->nT
5cf0: 65 72 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  erm; j++){.     
5d00: 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20     Fts5ExprTerm 
5d10: 2a 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73  *pTerm = &pPhras
5d20: 65 2d 3e 61 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  e->aTerm[j];.   
5d30: 20 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72       Fts5ExprTer
5d40: 6d 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  m *p;.        in
5d50: 74 20 62 48 69 74 20 3d 20 30 3b 0a 0a 20 20 20  t bHit = 0;..   
5d60: 20 20 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d       for(p=pTerm
5d70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e  ; p; p=p->pSynon
5d80: 79 6d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ym){.          i
5d90: 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  nt rc;.         
5da0: 20 69 66 28 20 70 2d 3e 70 49 74 65 72 20 29 7b   if( p->pIter ){
5db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
5dc0: 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
5dd0: 65 28 70 2d 3e 70 49 74 65 72 29 3b 0a 20 20 20  e(p->pIter);.   
5de0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 49 74 65           p->pIte
5df0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
5e00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
5e10: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
5e20: 65 78 51 75 65 72 79 28 0a 20 20 20 20 20 20 20  exQuery(.       
5e30: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 49         pExpr->pI
5e40: 6e 64 65 78 2c 20 70 2d 3e 7a 54 65 72 6d 2c 20  ndex, p->zTerm, 
5e50: 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a  (int)strlen(p->z
5e60: 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20  Term),.         
5e70: 20 20 20 20 20 28 70 54 65 72 6d 2d 3e 62 50 72       (pTerm->bPr
5e80: 65 66 69 78 20 3f 20 46 54 53 35 49 4e 44 45 58  efix ? FTS5INDEX
5e90: 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 3a 20  _QUERY_PREFIX : 
5ea0: 30 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  0) |.           
5eb0: 20 20 20 28 70 45 78 70 72 2d 3e 62 44 65 73 63     (pExpr->bDesc
5ec0: 20 3f 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   ? FTS5INDEX_QUE
5ed0: 52 59 5f 44 45 53 43 20 3a 20 30 29 2c 0a 20 20  RY_DESC : 0),.  
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 61              pNea
5ef0: 72 2d 3e 70 43 6f 6c 73 65 74 2c 0a 20 20 20 20  r->pColset,.    
5f00: 20 20 20 20 20 20 20 20 20 20 26 70 2d 3e 70 49            &p->pI
5f10: 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ter.          );
5f20: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
5f30: 74 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t( (rc==SQLITE_O
5f40: 4b 29 3d 3d 28 70 2d 3e 70 49 74 65 72 21 3d 30  K)==(p->pIter!=0
5f50: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
5f60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5f70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
5f80: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
5f90: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
5fa0: 66 28 70 2d 3e 70 49 74 65 72 29 20 29 7b 0a 20  f(p->pIter) ){. 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 62 48 69 74 20             bHit 
5fc0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
5fd0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
5fe0: 20 20 20 20 69 66 28 20 62 48 69 74 3d 3d 30 20      if( bHit==0 
5ff0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f  ){.          pNo
6000: 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  de->bEof = 1;.  
6010: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
6020: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6030: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6040: 7d 0a 20 20 7d 0a 0a 20 20 70 4e 6f 64 65 2d 3e  }.  }..  pNode->
6050: 62 45 6f 66 20 3d 20 30 3b 0a 20 20 72 65 74 75  bEof = 0;.  retu
6060: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6070: 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  ./*.** If pExpr 
6080: 69 73 20 61 6e 20 41 53 43 20 69 74 65 72 61 74  is an ASC iterat
6090: 6f 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  or, this functio
60a0: 6e 20 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75  n returns a valu
60b0: 65 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 61  e with the.** sa
60c0: 6d 65 20 73 69 67 6e 20 61 73 3a 0a 2a 2a 0a 2a  me sign as:.**.*
60d0: 2a 20 20 20 28 69 4c 68 73 20 2d 20 69 52 68 73  *   (iLhs - iRhs
60e0: 29 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ).**.** Otherwis
60f0: 65 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  e, if this is a 
6100: 44 45 53 43 20 69 74 65 72 61 74 6f 72 2c 20 74  DESC iterator, t
6110: 68 65 20 6f 70 70 6f 73 69 74 65 20 69 73 20 72  he opposite is r
6120: 65 74 75 72 6e 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  eturned:.**.**  
6130: 20 28 69 52 68 73 20 2d 20 69 4c 68 73 29 0a 2a   (iRhs - iLhs).*
6140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
6150: 35 52 6f 77 69 64 43 6d 70 28 0a 20 20 46 74 73  5RowidCmp(.  Fts
6160: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20  5Expr *pExpr,.  
6170: 69 36 34 20 69 4c 68 73 2c 0a 20 20 69 36 34 20  i64 iLhs,.  i64 
6180: 69 52 68 73 0a 29 7b 0a 20 20 61 73 73 65 72 74  iRhs.){.  assert
6190: 28 20 70 45 78 70 72 2d 3e 62 44 65 73 63 3d 3d  ( pExpr->bDesc==
61a0: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 62 44 65 73  0 || pExpr->bDes
61b0: 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 45  c==1 );.  if( pE
61c0: 78 70 72 2d 3e 62 44 65 73 63 3d 3d 30 20 29 7b  xpr->bDesc==0 ){
61d0: 0a 20 20 20 20 69 66 28 20 69 4c 68 73 3c 69 52  .    if( iLhs<iR
61e0: 68 73 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  hs ) return -1;.
61f0: 20 20 20 20 72 65 74 75 72 6e 20 28 69 4c 68 73      return (iLhs
6200: 20 3e 20 69 52 68 73 29 3b 0a 20 20 7d 65 6c 73   > iRhs);.  }els
6210: 65 7b 0a 20 20 20 20 69 66 28 20 69 4c 68 73 3e  e{.    if( iLhs>
6220: 69 52 68 73 20 29 20 72 65 74 75 72 6e 20 2d 31  iRhs ) return -1
6230: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 4c  ;.    return (iL
6240: 68 73 20 3c 20 69 52 68 73 29 3b 0a 20 20 7d 0a  hs < iRhs);.  }.
6250: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
6260: 74 73 35 45 78 70 72 53 65 74 45 6f 66 28 46 74  ts5ExprSetEof(Ft
6270: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
6280: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  e){.  int i;.  p
6290: 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Node->bEof = 1;.
62a0: 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63    pNode->bNomatc
62b0: 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  h = 0;.  for(i=0
62c0: 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
62d0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73  d; i++){.    fts
62e0: 35 45 78 70 72 53 65 74 45 6f 66 28 70 4e 6f 64  5ExprSetEof(pNod
62f0: 65 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 29 3b 0a  e->apChild[i]);.
6300: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
6310: 69 64 20 66 74 73 35 45 78 70 72 4e 6f 64 65 5a  id fts5ExprNodeZ
6320: 65 72 6f 50 6f 73 6c 69 73 74 28 46 74 73 35 45  eroPoslist(Fts5E
6330: 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b  xprNode *pNode){
6340: 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54  .  if( pNode->eT
6350: 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47  ype==FTS5_STRING
6360: 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65   || pNode->eType
6370: 3d 3d 46 54 53 35 5f 54 45 52 4d 20 29 7b 0a 20  ==FTS5_TERM ){. 
6380: 20 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73     Fts5ExprNears
6390: 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64  et *pNear = pNod
63a0: 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 20 20 69 6e  e->pNear;.    in
63b0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
63c0: 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50 68 72 61  ; i<pNear->nPhra
63d0: 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  se; i++){.      
63e0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a  Fts5ExprPhrase *
63f0: 70 50 68 72 61 73 65 20 3d 20 70 4e 65 61 72 2d  pPhrase = pNear-
6400: 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b 0a 20 20  >apPhrase[i];.  
6410: 20 20 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73      pPhrase->pos
6420: 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  list.n = 0;.    
6430: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
6440: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6450: 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69  0; i<pNode->nChi
6460: 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
6470: 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f  fts5ExprNodeZero
6480: 50 6f 73 6c 69 73 74 28 70 4e 6f 64 65 2d 3e 61  Poslist(pNode->a
6490: 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  pChild[i]);.    
64a0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  }.  }.}..../*.**
64b0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
64c0: 75 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ues currently in
64d0: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 74  dicated by the t
64e0: 77 6f 20 6e 6f 64 65 73 20 61 73 20 66 6f 6c 6c  wo nodes as foll
64f0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 72 65  ows:.**.**    re
6500: 73 20 3d 20 28 2a 70 31 29 20 2d 20 28 2a 70 32  s = (*p1) - (*p2
6510: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 64 65 73 20 74 68  ).**.** Nodes th
6520: 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 75  at point to valu
6530: 65 73 20 74 68 61 74 20 63 6f 6d 65 20 6c 61 74  es that come lat
6540: 65 72 20 69 6e 20 74 68 65 20 69 74 65 72 61 74  er in the iterat
6550: 69 6f 6e 20 6f 72 64 65 72 20 61 72 65 0a 2a 2a  ion order are.**
6560: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
6570: 65 20 6c 61 72 67 65 72 2e 20 4e 6f 64 65 73 20  e larger. Nodes 
6580: 61 74 20 45 4f 46 20 61 72 65 20 74 68 65 20 6c  at EOF are the l
6590: 61 72 67 65 73 74 20 6f 66 20 61 6c 6c 2e 0a 2a  argest of all..*
65a0: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
65b0: 74 68 61 74 20 69 66 20 74 68 65 20 69 74 65 72  that if the iter
65c0: 61 74 69 6f 6e 20 6f 72 64 65 72 20 69 73 20 41  ation order is A
65d0: 53 43 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  SC, then numeric
65e0: 61 6c 6c 79 20 6c 61 72 67 65 72 0a 2a 2a 20 72  ally larger.** r
65f0: 6f 77 69 64 73 20 61 72 65 20 63 6f 6e 73 69 64  owids are consid
6600: 65 72 65 64 20 6c 61 72 67 65 72 2e 20 4f 72 20  ered larger. Or 
6610: 69 66 20 69 74 20 69 73 20 74 68 65 20 64 65 66  if it is the def
6620: 61 75 6c 74 20 44 45 53 43 2c 20 6e 75 6d 65 72  ault DESC, numer
6630: 69 63 61 6c 6c 79 0a 2a 2a 20 73 6d 61 6c 6c 65  ically.** smalle
6640: 72 20 72 6f 77 69 64 73 20 61 72 65 20 6c 61 72  r rowids are lar
6650: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
6660: 6e 74 20 66 74 73 35 4e 6f 64 65 43 6f 6d 70 61  nt fts5NodeCompa
6670: 72 65 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a  re(.  Fts5Expr *
6680: 70 45 78 70 72 2c 0a 20 20 46 74 73 35 45 78 70  pExpr,.  Fts5Exp
6690: 72 4e 6f 64 65 20 2a 70 31 2c 20 0a 20 20 46 74  rNode *p1, .  Ft
66a0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 32 0a 29  s5ExprNode *p2.)
66b0: 7b 0a 20 20 69 66 28 20 70 32 2d 3e 62 45 6f 66  {.  if( p2->bEof
66c0: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
66d0: 69 66 28 20 70 31 2d 3e 62 45 6f 66 20 29 20 72  if( p1->bEof ) r
66e0: 65 74 75 72 6e 20 2b 31 3b 0a 20 20 72 65 74 75  eturn +1;.  retu
66f0: 72 6e 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28  rn fts5RowidCmp(
6700: 70 45 78 70 72 2c 20 70 31 2d 3e 69 52 6f 77 69  pExpr, p1->iRowi
6710: 64 2c 20 70 32 2d 3e 69 52 6f 77 69 64 29 3b 0a  d, p2->iRowid);.
6720: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 69 6e 64  }../*.** All ind
6730: 69 76 69 64 75 61 6c 20 74 65 72 6d 20 69 74 65  ividual term ite
6740: 72 61 74 6f 72 73 20 69 6e 20 70 4e 65 61 72 20  rators in pNear 
6750: 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
6760: 6f 20 62 65 20 76 61 6c 69 64 20 77 68 65 6e 0a  o be valid when.
6770: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
6780: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73   is called. This
6790: 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
67a0: 20 69 66 20 61 6c 6c 20 74 65 72 6d 20 69 74 65   if all term ite
67b0: 72 61 74 6f 72 73 0a 2a 2a 20 70 6f 69 6e 74 20  rators.** point 
67c0: 74 6f 20 74 68 65 20 73 61 6d 65 20 72 6f 77 69  to the same rowi
67d0: 64 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 61  d, and if not, a
67e0: 64 76 61 6e 63 65 73 20 74 68 65 6d 20 75 6e 74  dvances them unt
67f0: 69 6c 20 74 68 65 79 20 64 6f 2e 0a 2a 2a 20 49  il they do..** I
6800: 66 20 61 6e 20 45 4f 46 20 69 73 20 72 65 61 63  f an EOF is reac
6810: 68 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  hed before this 
6820: 68 61 70 70 65 6e 73 2c 20 2a 70 62 45 6f 66 20  happens, *pbEof 
6830: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 62  is set to true b
6840: 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
6850: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ng..**.** SQLITE
6860: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
6870: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
6880: 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  rs, or an SQLite
6890: 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20   error code .** 
68a0: 6f 74 68 65 72 77 69 73 65 2e 20 49 74 20 69 73  otherwise. It is
68b0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
68c0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
68d0: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 72 65 61   an iterator rea
68e0: 63 68 65 73 0a 2a 2a 20 45 4f 46 2e 0a 2a 2f 0a  ches.** EOF..*/.
68f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 45  static int fts5E
6900: 78 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52 49  xprNodeTest_STRI
6910: 4e 47 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a  NG(.  Fts5Expr *
6920: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
6930: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6940: 69 6f 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f  ion pPhrase belo
6950: 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35  ngs to */.  Fts5
6960: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 0a  ExprNode *pNode.
6970: 29 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61  ){.  Fts5ExprNea
6980: 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20 70 4e  rset *pNear = pN
6990: 6f 64 65 2d 3e 70 4e 65 61 72 3b 0a 20 20 46 74  ode->pNear;.  Ft
69a0: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 4c  s5ExprPhrase *pL
69b0: 65 66 74 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50  eft = pNear->apP
69c0: 68 72 61 73 65 5b 30 5d 3b 0a 20 20 69 6e 74 20  hrase[0];.  int 
69d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
69e0: 20 20 69 36 34 20 69 4c 61 73 74 3b 20 20 20 20    i64 iLast;    
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 2f 2a 20 4c 61 73 74 65 73 74 20 72 6f 77    /* Lastest row
6a10: 69 64 20 61 6e 79 20 69 74 65 72 61 74 6f 72 20  id any iterator 
6a20: 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 69  points to */.  i
6a30: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a50: 2a 20 50 68 72 61 73 65 20 61 6e 64 20 74 6f 6b  * Phrase and tok
6a60: 65 6e 20 69 6e 64 65 78 2c 20 72 65 73 70 65 63  en index, respec
6a70: 74 69 76 65 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  tively */.  int 
6a80: 62 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  bMatch;         
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6aa0: 72 75 65 20 69 66 20 61 6c 6c 20 74 65 72 6d 73  rue if all terms
6ab0: 20 61 72 65 20 61 74 20 74 68 65 20 73 61 6d 65   are at the same
6ac0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 6f 6e 73   rowid */.  cons
6ad0: 74 20 69 6e 74 20 62 44 65 73 63 20 3d 20 70 45  t int bDesc = pE
6ae0: 78 70 72 2d 3e 62 44 65 73 63 3b 0a 0a 20 20 2f  xpr->bDesc;..  /
6af0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
6b00: 73 20 6e 6f 64 65 20 73 68 6f 75 6c 64 20 6e 6f  s node should no
6b10: 74 20 62 65 20 46 54 53 35 5f 54 45 52 4d 20 2a  t be FTS5_TERM *
6b20: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 61  /.  assert( pNea
6b30: 72 2d 3e 6e 50 68 72 61 73 65 3e 31 20 0a 20 20  r->nPhrase>1 .  
6b40: 20 20 20 20 20 7c 7c 20 70 4e 65 61 72 2d 3e 61       || pNear->a
6b50: 70 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54 65 72  pPhrase[0]->nTer
6b60: 6d 3e 31 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  m>1 .       || p
6b70: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
6b80: 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e  ]->aTerm[0].pSyn
6b90: 6f 6e 79 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70  onym.       || p
6ba0: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
6bb0: 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72  ]->aTerm[0].bFir
6bc0: 73 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  st.  );..  /* In
6bd0: 69 74 69 61 6c 69 7a 65 20 69 4c 61 73 74 2c 20  itialize iLast, 
6be0: 74 68 65 20 22 6c 61 73 74 65 73 74 22 20 72 6f  the "lastest" ro
6bf0: 77 69 64 20 61 6e 79 20 69 74 65 72 61 74 6f 72  wid any iterator
6c00: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 49 66 20 74   points to. If t
6c10: 68 65 0a 20 20 2a 2a 20 69 74 65 72 61 74 6f 72  he.  ** iterator
6c20: 20 73 6b 69 70 73 20 74 68 72 6f 75 67 68 20 72   skips through r
6c30: 6f 77 69 64 73 20 69 6e 20 74 68 65 20 64 65 66  owids in the def
6c40: 61 75 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f  ault ascending o
6c50: 72 64 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 73  rder, this means
6c60: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75  .  ** the maximu
6c70: 6d 20 72 6f 77 69 64 2e 20 4f 72 2c 20 69 66 20  m rowid. Or, if 
6c80: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
6c90: 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20  "ORDER BY rowid 
6ca0: 44 45 53 43 22 2c 20 74 68 65 6e 20 69 74 0a 20  DESC", then it. 
6cb0: 20 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 6d 69   ** means the mi
6cc0: 6e 69 6d 75 6d 20 72 6f 77 69 64 2e 20 20 2a 2f  nimum rowid.  */
6cd0: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 61 54  .  if( pLeft->aT
6ce0: 65 72 6d 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 20  erm[0].pSynonym 
6cf0: 29 7b 0a 20 20 20 20 69 4c 61 73 74 20 3d 20 66  ){.    iLast = f
6d00: 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d 52 6f  ts5ExprSynonymRo
6d10: 77 69 64 28 26 70 4c 65 66 74 2d 3e 61 54 65 72  wid(&pLeft->aTer
6d20: 6d 5b 30 5d 2c 20 62 44 65 73 63 2c 20 30 29 3b  m[0], bDesc, 0);
6d30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4c  .  }else{.    iL
6d40: 61 73 74 20 3d 20 70 4c 65 66 74 2d 3e 61 54 65  ast = pLeft->aTe
6d50: 72 6d 5b 30 5d 2e 70 49 74 65 72 2d 3e 69 52 6f  rm[0].pIter->iRo
6d60: 77 69 64 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b  wid;.  }..  do {
6d70: 0a 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31 3b  .    bMatch = 1;
6d80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6d90: 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20  pNear->nPhrase; 
6da0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i++){.      Fts5
6db0: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
6dc0: 61 73 65 20 3d 20 70 4e 65 61 72 2d 3e 61 70 50  ase = pNear->apP
6dd0: 68 72 61 73 65 5b 69 5d 3b 0a 20 20 20 20 20 20  hrase[i];.      
6de0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 68 72 61  for(j=0; j<pPhra
6df0: 73 65 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 29 7b  se->nTerm; j++){
6e00: 0a 20 20 20 20 20 20 20 20 46 74 73 35 45 78 70  .        Fts5Exp
6e10: 72 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  rTerm *pTerm = &
6e20: 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 6a  pPhrase->aTerm[j
6e30: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
6e40: 54 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29  Term->pSynonym )
6e50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
6e60: 69 52 6f 77 69 64 20 3d 20 66 74 73 35 45 78 70  iRowid = fts5Exp
6e70: 72 53 79 6e 6f 6e 79 6d 52 6f 77 69 64 28 70 54  rSynonymRowid(pT
6e80: 65 72 6d 2c 20 62 44 65 73 63 2c 20 30 29 3b 0a  erm, bDesc, 0);.
6e90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
6ea0: 6f 77 69 64 3d 3d 69 4c 61 73 74 20 29 20 63 6f  owid==iLast ) co
6eb0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6ec0: 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20    bMatch = 0;.  
6ed0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
6ee0: 45 78 70 72 53 79 6e 6f 6e 79 6d 41 64 76 61 6e  ExprSynonymAdvan
6ef0: 63 65 74 6f 28 70 54 65 72 6d 2c 20 62 44 65 73  ceto(pTerm, bDes
6f00: 63 2c 20 26 69 4c 61 73 74 2c 20 26 72 63 29 20  c, &iLast, &rc) 
6f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
6f20: 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d  Node->bNomatch =
6f30: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
6f40: 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20 31 3b  pNode->bEof = 1;
6f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
6f60: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
6f70: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
6f80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  e{.          Fts
6f90: 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
6fa0: 72 20 3d 20 70 50 68 72 61 73 65 2d 3e 61 54 65  r = pPhrase->aTe
6fb0: 72 6d 5b 6a 5d 2e 70 49 74 65 72 3b 0a 20 20 20  rm[j].pIter;.   
6fc0: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
6fd0: 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 20  ->iRowid==iLast 
6fe0: 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 29  || pIter->bEof )
6ff0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7000: 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20 30 3b       bMatch = 0;
7010: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
7020: 74 73 35 45 78 70 72 41 64 76 61 6e 63 65 74 6f  ts5ExprAdvanceto
7030: 28 70 49 74 65 72 2c 20 62 44 65 73 63 2c 20 26  (pIter, bDesc, &
7040: 69 4c 61 73 74 2c 20 26 72 63 2c 20 26 70 4e 6f  iLast, &rc, &pNo
7050: 64 65 2d 3e 62 45 6f 66 29 20 29 7b 0a 20 20 20  de->bEof) ){.   
7060: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7070: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
7080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7090: 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
70a0: 28 20 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a  ( bMatch==0 );..
70b0: 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64 20    pNode->iRowid 
70c0: 3d 20 69 4c 61 73 74 3b 0a 20 20 70 4e 6f 64 65  = iLast;.  pNode
70d0: 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28 28 30  ->bNomatch = ((0
70e0: 3d 3d 66 74 73 35 45 78 70 72 4e 65 61 72 54 65  ==fts5ExprNearTe
70f0: 73 74 28 26 72 63 2c 20 70 45 78 70 72 2c 20 70  st(&rc, pExpr, p
7100: 4e 6f 64 65 29 29 20 26 26 20 72 63 3d 3d 53 51  Node)) && rc==SQ
7110: 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 61 73 73 65  LITE_OK);.  asse
7120: 72 74 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d  rt( pNode->bEof=
7130: 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 4e 6f  =0 || pNode->bNo
7140: 6d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20 72  match==0 );..  r
7150: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7160: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 66  ** Advance the f
7170: 69 72 73 74 20 74 65 72 6d 20 69 74 65 72 61 74  irst term iterat
7180: 6f 72 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  or in the first 
7190: 70 68 72 61 73 65 20 6f 66 20 70 4e 65 61 72 2e  phrase of pNear.
71a0: 20 53 65 74 20 6f 75 74 70 75 74 0a 2a 2a 20 76   Set output.** v
71b0: 61 72 69 61 62 6c 65 20 2a 70 62 45 6f 66 20 74  ariable *pbEof t
71c0: 6f 20 74 72 75 65 20 69 66 20 69 74 20 72 65 61  o true if it rea
71d0: 63 68 65 73 20 45 4f 46 20 6f 72 20 69 66 20 61  ches EOF or if a
71e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
71f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
7200: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
7210: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
7220: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
7230: 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
7240: 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
7250: 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e  nt fts5ExprNodeN
7260: 65 78 74 5f 53 54 52 49 4e 47 28 0a 20 20 46 74  ext_STRING(.  Ft
7270: 73 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s5Expr *pExpr,  
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7290: 20 45 78 70 72 65 73 73 69 6f 6e 20 70 50 68 72   Expression pPhr
72a0: 61 73 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  ase belongs to *
72b0: 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65  /.  Fts5ExprNode
72c0: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
72d0: 20 20 20 20 2f 2a 20 46 54 53 35 5f 53 54 52 49      /* FTS5_STRI
72e0: 4e 47 20 6f 72 20 46 54 53 35 5f 54 45 52 4d 20  NG or FTS5_TERM 
72f0: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46  node */.  int bF
7300: 72 6f 6d 56 61 6c 69 64 2c 0a 20 20 69 36 34 20  romValid,.  i64 
7310: 69 46 72 6f 6d 20 0a 29 7b 0a 20 20 46 74 73 35  iFrom .){.  Fts5
7320: 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d 20  ExprTerm *pTerm 
7330: 3d 20 26 70 4e 6f 64 65 2d 3e 70 4e 65 61 72 2d  = &pNode->pNear-
7340: 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d 3e 61 54  >apPhrase[0]->aT
7350: 65 72 6d 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63  erm[0];.  int rc
7360: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
7370: 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63 68   pNode->bNomatch
7380: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72   = 0;.  if( pTer
7390: 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 20 29 7b 0a 20  m->pSynonym ){. 
73a0: 20 20 20 69 6e 74 20 62 45 6f 66 20 3d 20 31 3b     int bEof = 1;
73b0: 0a 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72  .    Fts5ExprTer
73c0: 6d 20 2a 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  m *p;..    /* Fi
73d0: 6e 64 20 74 68 65 20 66 69 72 73 74 65 73 74 20  nd the firstest 
73e0: 72 6f 77 69 64 20 61 6e 79 20 73 79 6e 6f 6e 79  rowid any synony
73f0: 6d 20 70 6f 69 6e 74 73 20 74 6f 2e 20 2a 2f 0a  m points to. */.
7400: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
7410: 20 66 74 73 35 45 78 70 72 53 79 6e 6f 6e 79 6d   fts5ExprSynonym
7420: 52 6f 77 69 64 28 70 54 65 72 6d 2c 20 70 45 78  Rowid(pTerm, pEx
7430: 70 72 2d 3e 62 44 65 73 63 2c 20 30 29 3b 0a 0a  pr->bDesc, 0);..
7440: 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65      /* Advance e
7450: 61 63 68 20 69 74 65 72 61 74 6f 72 20 74 68 61  ach iterator tha
7460: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
7470: 74 73 20 74 6f 20 69 52 6f 77 69 64 2e 20 4f 72  ts to iRowid. Or
7480: 2c 20 69 66 20 69 46 72 6f 6d 0a 20 20 20 20 2a  , if iFrom.    *
7490: 2a 20 69 73 20 76 61 6c 69 64 20 2d 20 65 61 63  * is valid - eac
74a0: 68 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  h iterator that 
74b0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 72 6f 77 69  points to a rowi
74c0: 64 20 62 65 66 6f 72 65 20 69 46 72 6f 6d 2e 20  d before iFrom. 
74d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54   */.    for(p=pT
74e0: 65 72 6d 3b 20 70 3b 20 70 3d 70 2d 3e 70 53 79  erm; p; p=p->pSy
74f0: 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20 69 66  nonym){.      if
7500: 28 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ( sqlite3Fts5Ite
7510: 72 45 6f 66 28 70 2d 3e 70 49 74 65 72 29 3d 3d  rEof(p->pIter)==
7520: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  0 ){.        i64
7530: 20 69 69 20 3d 20 70 2d 3e 70 49 74 65 72 2d 3e   ii = p->pIter->
7540: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
7550: 69 66 28 20 69 69 3d 3d 69 52 6f 77 69 64 20 0a  if( ii==iRowid .
7560: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72           || (bFr
7570: 6f 6d 56 61 6c 69 64 20 26 26 20 69 69 21 3d 69  omValid && ii!=i
7580: 46 72 6f 6d 20 26 26 20 28 69 69 3e 69 46 72 6f  From && (ii>iFro
7590: 6d 29 3d 3d 70 45 78 70 72 2d 3e 62 44 65 73 63  m)==pExpr->bDesc
75a0: 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
75b0: 20 20 20 20 20 20 20 20 69 66 28 20 62 46 72 6f          if( bFro
75c0: 6d 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  mValid ){.      
75d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
75e0: 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
75f0: 6f 6d 28 70 2d 3e 70 49 74 65 72 2c 20 69 46 72  om(p->pIter, iFr
7600: 6f 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  om);.          }
7610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7620: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
7630: 73 35 49 74 65 72 4e 65 78 74 28 70 2d 3e 70 49  s5IterNext(p->pI
7640: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
7650: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
7660: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7680: 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
7690: 49 74 65 72 45 6f 66 28 70 2d 3e 70 49 74 65 72  IterEof(p->pIter
76a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
76b0: 20 20 20 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20      bEof = 0;.  
76c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
76d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
76e0: 20 20 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20     bEof = 0;.   
76f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7700: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
7710: 20 74 68 65 20 45 4f 46 20 66 6c 61 67 20 69 66   the EOF flag if
7720: 20 65 69 74 68 65 72 20 61 6c 6c 20 73 79 6e 6f   either all syno
7730: 6e 79 6d 20 69 74 65 72 61 74 6f 72 73 20 61 72  nym iterators ar
7740: 65 20 61 74 20 45 4f 46 20 6f 72 20 61 6e 0a 20  e at EOF or an. 
7750: 20 20 20 2a 2a 20 65 72 72 6f 72 20 68 61 73 20     ** error has 
7760: 6f 63 63 75 72 72 65 64 2e 20 20 2a 2f 0a 20 20  occurred.  */.  
7770: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
7780: 28 72 63 20 7c 7c 20 62 45 6f 66 29 3b 0a 20 20  (rc || bEof);.  
7790: 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 49  }else{.    Fts5I
77a0: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
77b0: 3d 20 70 54 65 72 6d 2d 3e 70 49 74 65 72 3b 0a  = pTerm->pIter;.
77c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 46 74 73  .    assert( Fts
77d0: 35 4e 6f 64 65 49 73 53 74 72 69 6e 67 28 70 4e  5NodeIsString(pN
77e0: 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ode) );.    if( 
77f0: 62 46 72 6f 6d 56 61 6c 69 64 20 29 7b 0a 20 20  bFromValid ){.  
7800: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7810: 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d  Fts5IterNextFrom
7820: 28 70 49 74 65 72 2c 20 69 46 72 6f 6d 29 3b 0a  (pIter, iFrom);.
7830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7840: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
7850: 35 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29  5IterNext(pIter)
7860: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 6f  ;.    }..    pNo
7870: 64 65 2d 3e 62 45 6f 66 20 3d 20 28 72 63 20 7c  de->bEof = (rc |
7880: 7c 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  | sqlite3Fts5Ite
7890: 72 45 6f 66 28 70 49 74 65 72 29 29 3b 0a 20 20  rEof(pIter));.  
78a0: 7d 0a 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  }..  if( pNode->
78b0: 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  bEof==0 ){.    a
78c0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
78d0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
78e0: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73   fts5ExprNodeTes
78f0: 74 5f 53 54 52 49 4e 47 28 70 45 78 70 72 2c 20  t_STRING(pExpr, 
7900: 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  pNode);.  }..  r
7910: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
7920: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
7930: 72 4e 6f 64 65 54 65 73 74 5f 54 45 52 4d 28 0a  rNodeTest_TERM(.
7940: 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70    Fts5Expr *pExp
7950: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
7960: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
7970: 74 68 61 74 20 70 4e 65 61 72 20 69 73 20 61 20  that pNear is a 
7980: 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73  part of */.  Fts
7990: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
79b0: 54 68 65 20 22 4e 45 41 52 22 20 6e 6f 64 65 20  The "NEAR" node 
79c0: 28 46 54 53 35 5f 54 45 52 4d 29 20 2a 2f 0a 29  (FTS5_TERM) */.)
79d0: 7b 0a 20 20 2f 2a 20 41 73 20 74 68 69 73 20 22  {.  /* As this "
79e0: 4e 45 41 52 22 20 6f 62 6a 65 63 74 20 69 73 20  NEAR" object is 
79f0: 61 63 74 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c  actually a singl
7a00: 65 20 70 68 72 61 73 65 20 74 68 61 74 20 63 6f  e phrase that co
7a10: 6e 73 69 73 74 73 20 0a 20 20 2a 2a 20 6f 66 20  nsists .  ** of 
7a20: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 6e  a single term on
7a30: 6c 79 2c 20 67 72 61 62 20 70 6f 69 6e 74 65 72  ly, grab pointer
7a40: 73 20 69 6e 74 6f 20 74 68 65 20 70 6f 73 6c 69  s into the posli
7a50: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
7a60: 65 0a 20 20 2a 2a 20 66 74 73 35 5f 69 6e 64 65  e.  ** fts5_inde
7a70: 78 2e 63 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  x.c iterator obj
7a80: 65 63 74 2e 20 54 68 69 73 20 69 73 20 6d 75 63  ect. This is muc
7a90: 68 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 79  h faster than sy
7aa0: 6e 74 68 65 73 69 7a 69 6e 67 20 0a 20 20 2a 2a  nthesizing .  **
7ab0: 20 61 20 6e 65 77 20 70 6f 73 6c 69 73 74 20 74   a new poslist t
7ac0: 68 65 20 77 61 79 20 77 65 20 68 61 76 65 20 74  he way we have t
7ad0: 6f 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6c  o for more compl
7ae0: 69 63 61 74 65 64 20 70 68 72 61 73 65 20 6f 72  icated phrase or
7af0: 20 4e 45 41 52 0a 20 20 2a 2a 20 65 78 70 72 65   NEAR.  ** expre
7b00: 73 73 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 46 74  ssions.  */.  Ft
7b10: 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
7b20: 68 72 61 73 65 20 3d 20 70 4e 6f 64 65 2d 3e 70  hrase = pNode->p
7b30: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
7b40: 5d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  ];.  Fts5IndexIt
7b50: 65 72 20 2a 70 49 74 65 72 20 3d 20 70 50 68 72  er *pIter = pPhr
7b60: 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49  ase->aTerm[0].pI
7b70: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
7b80: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
7b90: 53 35 5f 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  S5_TERM );.  ass
7ba0: 65 72 74 28 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  ert( pNode->pNea
7bb0: 72 2d 3e 6e 50 68 72 61 73 65 3d 3d 31 20 26 26  r->nPhrase==1 &&
7bc0: 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3d   pPhrase->nTerm=
7bd0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
7be0: 70 50 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30  pPhrase->aTerm[0
7bf0: 5d 2e 70 53 79 6e 6f 6e 79 6d 3d 3d 30 20 29 3b  ].pSynonym==0 );
7c00: 0a 0a 20 20 70 50 68 72 61 73 65 2d 3e 70 6f 73  ..  pPhrase->pos
7c10: 6c 69 73 74 2e 6e 20 3d 20 70 49 74 65 72 2d 3e  list.n = pIter->
7c20: 6e 44 61 74 61 3b 0a 20 20 69 66 28 20 70 45 78  nData;.  if( pEx
7c30: 70 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  pr->pConfig->eDe
7c40: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
7c50: 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 70 50  L_FULL ){.    pP
7c60: 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74 2e 70  hrase->poslist.p
7c70: 20 3d 20 28 75 38 2a 29 70 49 74 65 72 2d 3e 70   = (u8*)pIter->p
7c80: 44 61 74 61 3b 0a 20 20 7d 0a 20 20 70 4e 6f 64  Data;.  }.  pNod
7c90: 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 49 74 65  e->iRowid = pIte
7ca0: 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 4e 6f  r->iRowid;.  pNo
7cb0: 64 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 28  de->bNomatch = (
7cc0: 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
7cd0: 2e 6e 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72 6e  .n==0);.  return
7ce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7cf0: 2a 0a 2a 2a 20 78 4e 65 78 74 28 29 20 6d 65 74  *.** xNext() met
7d00: 68 6f 64 20 66 6f 72 20 61 20 6e 6f 64 65 20 6f  hod for a node o
7d10: 66 20 74 79 70 65 20 46 54 53 35 5f 54 45 52 4d  f type FTS5_TERM
7d20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7d30: 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74  fts5ExprNodeNext
7d40: 5f 54 45 52 4d 28 0a 20 20 46 74 73 35 45 78 70  _TERM(.  Fts5Exp
7d50: 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74 73  r *pExpr, .  Fts
7d60: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
7d70: 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61 6c  ,.  int bFromVal
7d80: 69 64 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d 0a  id,.  i64 iFrom.
7d90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  ){.  int rc;.  F
7da0: 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
7db0: 74 65 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65  ter = pNode->pNe
7dc0: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
7dd0: 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65 72 3b  >aTerm[0].pIter;
7de0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64  ..  assert( pNod
7df0: 65 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  e->bEof==0 );.  
7e00: 69 66 28 20 62 46 72 6f 6d 56 61 6c 69 64 20 29  if( bFromValid )
7e10: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7e20: 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
7e30: 6f 6d 28 70 49 74 65 72 2c 20 69 46 72 6f 6d 29  om(pIter, iFrom)
7e40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7e50: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
7e60: 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
7e70: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
7e80: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
7e90: 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
7ea0: 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ter)==0 ){.    r
7eb0: 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65  c = fts5ExprNode
7ec0: 54 65 73 74 5f 54 45 52 4d 28 70 45 78 70 72 2c  Test_TERM(pExpr,
7ed0: 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 65 6c 73 65   pNode);.  }else
7ee0: 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62 45 6f  {.    pNode->bEo
7ef0: 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 6f 64 65  f = 1;.    pNode
7f00: 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a  ->bNomatch = 0;.
7f10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7f20: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7f30: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
7f40: 5f 4f 52 28 0a 20 20 46 74 73 35 45 78 70 72 20  _OR(.  Fts5Expr 
7f50: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
7f60: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
7f70: 73 69 6f 6e 20 6f 66 20 77 68 69 63 68 20 70 4e  sion of which pN
7f80: 6f 64 65 20 69 73 20 61 20 70 61 72 74 20 2a 2f  ode is a part */
7f90: 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
7fa0: 2a 70 4e 6f 64 65 20 20 20 20 20 20 20 20 20 20  *pNode          
7fb0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
7fc0: 20 6e 6f 64 65 20 74 6f 20 74 65 73 74 20 2a 2f   node to test */
7fd0: 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  .){.  Fts5ExprNo
7fe0: 64 65 20 2a 70 4e 65 78 74 20 3d 20 70 4e 6f 64  de *pNext = pNod
7ff0: 65 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 3b 0a 20  e->apChild[0];. 
8000: 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69   int i;..  for(i
8010: 3d 31 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68  =1; i<pNode->nCh
8020: 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ild; i++){.    F
8030: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 43 68  ts5ExprNode *pCh
8040: 69 6c 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43  ild = pNode->apC
8050: 68 69 6c 64 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  hild[i];.    int
8060: 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f 64 65 43   cmp = fts5NodeC
8070: 6f 6d 70 61 72 65 28 70 45 78 70 72 2c 20 70 4e  ompare(pExpr, pN
8080: 65 78 74 2c 20 70 43 68 69 6c 64 29 3b 0a 20 20  ext, pChild);.  
8090: 20 20 69 66 28 20 63 6d 70 3e 30 20 7c 7c 20 28    if( cmp>0 || (
80a0: 63 6d 70 3d 3d 30 20 26 26 20 70 43 68 69 6c 64  cmp==0 && pChild
80b0: 2d 3e 62 4e 6f 6d 61 74 63 68 3d 3d 30 29 20 29  ->bNomatch==0) )
80c0: 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
80d0: 70 43 68 69 6c 64 3b 0a 20 20 20 20 7d 0a 20 20  pChild;.    }.  
80e0: 7d 0a 20 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69  }.  pNode->iRowi
80f0: 64 20 3d 20 70 4e 65 78 74 2d 3e 69 52 6f 77 69  d = pNext->iRowi
8100: 64 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66  d;.  pNode->bEof
8110: 20 3d 20 70 4e 65 78 74 2d 3e 62 45 6f 66 3b 0a   = pNext->bEof;.
8120: 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f 6d 61 74 63    pNode->bNomatc
8130: 68 20 3d 20 70 4e 65 78 74 2d 3e 62 4e 6f 6d 61  h = pNext->bNoma
8140: 74 63 68 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  tch;.}..static i
8150: 6e 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e  nt fts5ExprNodeN
8160: 65 78 74 5f 4f 52 28 0a 20 20 46 74 73 35 45 78  ext_OR(.  Fts5Ex
8170: 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 46 74  pr *pExpr, .  Ft
8180: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
8190: 65 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 56 61  e,.  int bFromVa
81a0: 6c 69 64 2c 0a 20 20 69 36 34 20 69 46 72 6f 6d  lid,.  i64 iFrom
81b0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
81c0: 36 34 20 69 4c 61 73 74 20 3d 20 70 4e 6f 64 65  64 iLast = pNode
81d0: 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 66 6f 72  ->iRowid;..  for
81e0: 28 69 3d 30 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e  (i=0; i<pNode->n
81f0: 43 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Child; i++){.   
8200: 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70   Fts5ExprNode *p
8210: 31 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69  1 = pNode->apChi
8220: 6c 64 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ld[i];.    asser
8230: 74 28 20 70 31 2d 3e 62 45 6f 66 20 7c 7c 20 66  t( p1->bEof || f
8240: 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78 70  ts5RowidCmp(pExp
8250: 72 2c 20 70 31 2d 3e 69 52 6f 77 69 64 2c 20 69  r, p1->iRowid, i
8260: 4c 61 73 74 29 3e 3d 30 20 29 3b 0a 20 20 20 20  Last)>=0 );.    
8270: 69 66 28 20 70 31 2d 3e 62 45 6f 66 3d 3d 30 20  if( p1->bEof==0 
8280: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 31  ){.      if( (p1
8290: 2d 3e 69 52 6f 77 69 64 3d 3d 69 4c 61 73 74 29  ->iRowid==iLast)
82a0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 62 46 72   .       || (bFr
82b0: 6f 6d 56 61 6c 69 64 20 26 26 20 66 74 73 35 52  omValid && fts5R
82c0: 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20 70  owidCmp(pExpr, p
82d0: 31 2d 3e 69 52 6f 77 69 64 2c 20 69 46 72 6f 6d  1->iRowid, iFrom
82e0: 29 3c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  )<0).      ){.  
82f0: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66        int rc = f
8300: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28  ts5ExprNodeNext(
8310: 70 45 78 70 72 2c 20 70 31 2c 20 62 46 72 6f 6d  pExpr, p1, bFrom
8320: 56 61 6c 69 64 2c 20 69 46 72 6f 6d 29 3b 0a 20  Valid, iFrom);. 
8330: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
8340: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8350: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f        pNode->bNo
8360: 6d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  match = 0;.     
8370: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8380: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8390: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66  }.    }.  }..  f
83a0: 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f  ts5ExprNodeTest_
83b0: 4f 52 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 29  OR(pExpr, pNode)
83c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
83d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
83e0: 72 67 75 6d 65 6e 74 20 70 4e 6f 64 65 20 69 73  rgument pNode is
83f0: 20 61 6e 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64   an FTS5_AND nod
8400: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8410: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73   fts5ExprNodeTes
8420: 74 5f 41 4e 44 28 0a 20 20 46 74 73 35 45 78 70  t_AND(.  Fts5Exp
8430: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
8440: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
8450: 65 73 73 69 6f 6e 20 70 50 68 72 61 73 65 20 62  ession pPhrase b
8460: 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46  elongs to */.  F
8470: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 41 6e  ts5ExprNode *pAn
8480: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d              /
8490: 2a 20 46 54 53 35 5f 41 4e 44 20 6e 6f 64 65 20  * FTS5_AND node 
84a0: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b  to advance */.){
84b0: 0a 20 20 69 6e 74 20 69 43 68 69 6c 64 3b 0a 20  .  int iChild;. 
84c0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 70 41 6e   i64 iLast = pAn
84d0: 64 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74  d->iRowid;.  int
84e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
84f0: 0a 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 0a  .  int bMatch;..
8500: 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 2d 3e    assert( pAnd->
8510: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 64 6f 20  bEof==0 );.  do 
8520: 7b 0a 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d  {.    pAnd->bNom
8530: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 62 4d  atch = 0;.    bM
8540: 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 66 6f  atch = 1;.    fo
8550: 72 28 69 43 68 69 6c 64 3d 30 3b 20 69 43 68 69  r(iChild=0; iChi
8560: 6c 64 3c 70 41 6e 64 2d 3e 6e 43 68 69 6c 64 3b  ld<pAnd->nChild;
8570: 20 69 43 68 69 6c 64 2b 2b 29 7b 0a 20 20 20 20   iChild++){.    
8580: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
8590: 70 43 68 69 6c 64 20 3d 20 70 41 6e 64 2d 3e 61  pChild = pAnd->a
85a0: 70 43 68 69 6c 64 5b 69 43 68 69 6c 64 5d 3b 0a  pChild[iChild];.
85b0: 20 20 20 20 20 20 69 6e 74 20 63 6d 70 20 3d 20        int cmp = 
85c0: 66 74 73 35 52 6f 77 69 64 43 6d 70 28 70 45 78  fts5RowidCmp(pEx
85d0: 70 72 2c 20 69 4c 61 73 74 2c 20 70 43 68 69 6c  pr, iLast, pChil
85e0: 64 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  d->iRowid);.    
85f0: 20 20 69 66 28 20 63 6d 70 3e 30 20 29 7b 0a 20    if( cmp>0 ){. 
8600: 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
8610: 65 20 70 43 68 69 6c 64 20 75 6e 74 69 6c 20 69  e pChild until i
8620: 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 4c 61 73  t points to iLas
8630: 74 20 6f 72 20 6c 61 73 74 65 72 20 2a 2f 0a 20  t or laster */. 
8640: 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
8650: 45 78 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78  ExprNodeNext(pEx
8660: 70 72 2c 20 70 43 68 69 6c 64 2c 20 31 2c 20 69  pr, pChild, 1, i
8670: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Last);.        i
8680: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
86a0: 6e 64 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30  nd->bNomatch = 0
86b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
86c0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
86d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
86e0: 2f 2a 20 49 66 20 74 68 65 20 63 68 69 6c 64 20  /* If the child 
86f0: 6e 6f 64 65 20 69 73 20 6e 6f 77 20 61 74 20 45  node is now at E
8700: 4f 46 2c 20 73 6f 20 69 73 20 74 68 65 20 70 61  OF, so is the pa
8710: 72 65 6e 74 20 41 4e 44 20 6e 6f 64 65 2e 20 4f  rent AND node. O
8720: 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
8730: 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64  ** the child nod
8740: 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
8750: 74 6f 20 68 61 76 65 20 61 64 76 61 6e 63 65 64  to have advanced
8760: 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72   at least as far
8770: 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77   as.      ** row
8780: 69 64 20 69 4c 61 73 74 2e 20 53 6f 20 69 66 20  id iLast. So if 
8790: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 65 78 61  it is not at exa
87a0: 63 74 6c 79 20 69 4c 61 73 74 2c 20 70 43 68 69  ctly iLast, pChi
87b0: 6c 64 2d 3e 69 52 6f 77 69 64 20 69 73 20 74 68  ld->iRowid is th
87c0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 6c  e.      ** new l
87d0: 61 73 74 65 73 74 20 72 6f 77 69 64 20 73 65 65  astest rowid see
87e0: 6e 20 73 6f 20 66 61 72 2e 20 20 2a 2f 0a 20 20  n so far.  */.  
87f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69      assert( pChi
8800: 6c 64 2d 3e 62 45 6f 66 20 7c 7c 20 66 74 73 35  ld->bEof || fts5
8810: 52 6f 77 69 64 43 6d 70 28 70 45 78 70 72 2c 20  RowidCmp(pExpr, 
8820: 69 4c 61 73 74 2c 20 70 43 68 69 6c 64 2d 3e 69  iLast, pChild->i
8830: 52 6f 77 69 64 29 3c 3d 30 20 29 3b 0a 20 20 20  Rowid)<=0 );.   
8840: 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 62     if( pChild->b
8850: 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Eof ){.        f
8860: 74 73 35 45 78 70 72 53 65 74 45 6f 66 28 70 41  ts5ExprSetEof(pA
8870: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 62 4d 61  nd);.        bMa
8880: 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  tch = 1;.       
8890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
88a0: 6c 73 65 20 69 66 28 20 69 4c 61 73 74 21 3d 70  lse if( iLast!=p
88b0: 43 68 69 6c 64 2d 3e 69 52 6f 77 69 64 20 29 7b  Child->iRowid ){
88c0: 0a 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20  .        bMatch 
88d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 4c 61  = 0;.        iLa
88e0: 73 74 20 3d 20 70 43 68 69 6c 64 2d 3e 69 52 6f  st = pChild->iRo
88f0: 77 69 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  wid;.      }..  
8900: 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
8910: 62 4e 6f 6d 61 74 63 68 20 29 7b 0a 20 20 20 20  bNomatch ){.    
8920: 20 20 20 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74      pAnd->bNomat
8930: 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ch = 1;.      }.
8940: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
8950: 62 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 0a 20 20  bMatch==0 );..  
8960: 69 66 28 20 70 41 6e 64 2d 3e 62 4e 6f 6d 61 74  if( pAnd->bNomat
8970: 63 68 20 26 26 20 70 41 6e 64 21 3d 70 45 78 70  ch && pAnd!=pExp
8980: 72 2d 3e 70 52 6f 6f 74 20 29 7b 0a 20 20 20 20  r->pRoot ){.    
8990: 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f  fts5ExprNodeZero
89a0: 50 6f 73 6c 69 73 74 28 70 41 6e 64 29 3b 0a 20  Poslist(pAnd);. 
89b0: 20 7d 0a 20 20 70 41 6e 64 2d 3e 69 52 6f 77 69   }.  pAnd->iRowi
89c0: 64 20 3d 20 69 4c 61 73 74 3b 0a 20 20 72 65 74  d = iLast;.  ret
89d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
89e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
89f0: 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 41 4e  5ExprNodeNext_AN
8a00: 44 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70  D(.  Fts5Expr *p
8a10: 45 78 70 72 2c 20 0a 20 20 46 74 73 35 45 78 70  Expr, .  Fts5Exp
8a20: 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20  rNode *pNode,.  
8a30: 69 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a  int bFromValid,.
8a40: 20 20 69 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20    i64 iFrom.){. 
8a50: 20 69 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78   int rc = fts5Ex
8a60: 70 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72  prNodeNext(pExpr
8a70: 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64  , pNode->apChild
8a80: 5b 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c  [0], bFromValid,
8a90: 20 69 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72   iFrom);.  if( r
8aa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8ab0: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
8ac0: 72 4e 6f 64 65 54 65 73 74 5f 41 4e 44 28 70 45  rNodeTest_AND(pE
8ad0: 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d  xpr, pNode);.  }
8ae0: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64 65 2d  else{.    pNode-
8af0: 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a 20  >bNomatch = 0;. 
8b00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8b10: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
8b20: 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 4e  s5ExprNodeTest_N
8b30: 4f 54 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a  OT(.  Fts5Expr *
8b40: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
8b50: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
8b60: 69 6f 6e 20 70 50 68 72 61 73 65 20 62 65 6c 6f  ion pPhrase belo
8b70: 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35  ngs to */.  Fts5
8b80: 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  ExprNode *pNode 
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8ba0: 54 53 35 5f 4e 4f 54 20 6e 6f 64 65 20 74 6f 20  TS5_NOT node to 
8bb0: 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20  advance */.){.  
8bc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8bd0: 4f 4b 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f  OK;.  Fts5ExprNo
8be0: 64 65 20 2a 70 31 20 3d 20 70 4e 6f 64 65 2d 3e  de *p1 = pNode->
8bf0: 61 70 43 68 69 6c 64 5b 30 5d 3b 0a 20 20 46 74  apChild[0];.  Ft
8c00: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 32 20 3d  s5ExprNode *p2 =
8c10: 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
8c20: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  1];.  assert( pN
8c30: 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 32 20 29  ode->nChild==2 )
8c40: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  ;..  while( rc==
8c50: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 2d  SQLITE_OK && p1-
8c60: 3e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >bEof==0 ){.    
8c70: 69 6e 74 20 63 6d 70 20 3d 20 66 74 73 35 4e 6f  int cmp = fts5No
8c80: 64 65 43 6f 6d 70 61 72 65 28 70 45 78 70 72 2c  deCompare(pExpr,
8c90: 20 70 31 2c 20 70 32 29 3b 0a 20 20 20 20 69 66   p1, p2);.    if
8ca0: 28 20 63 6d 70 3e 30 20 29 7b 0a 20 20 20 20 20  ( cmp>0 ){.     
8cb0: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
8cc0: 64 65 4e 65 78 74 28 70 45 78 70 72 2c 20 70 32  deNext(pExpr, p2
8cd0: 2c 20 31 2c 20 70 31 2d 3e 69 52 6f 77 69 64 29  , 1, p1->iRowid)
8ce0: 3b 0a 20 20 20 20 20 20 63 6d 70 20 3d 20 66 74  ;.      cmp = ft
8cf0: 73 35 4e 6f 64 65 43 6f 6d 70 61 72 65 28 70 45  s5NodeCompare(pE
8d00: 78 70 72 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20  xpr, p1, p2);.  
8d10: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
8d20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
8d30: 20 63 6d 70 3c 3d 30 20 29 3b 0a 20 20 20 20 69   cmp<=0 );.    i
8d40: 66 28 20 63 6d 70 20 7c 7c 20 70 32 2d 3e 62 4e  f( cmp || p2->bN
8d50: 6f 6d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  omatch ) break;.
8d60: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
8d70: 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c  rNodeNext(pExpr,
8d80: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a   p1, 0, 0);.  }.
8d90: 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d 20    pNode->bEof = 
8da0: 70 31 2d 3e 62 45 6f 66 3b 0a 20 20 70 4e 6f 64  p1->bEof;.  pNod
8db0: 65 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 70 31  e->bNomatch = p1
8dc0: 2d 3e 62 4e 6f 6d 61 74 63 68 3b 0a 20 20 70 4e  ->bNomatch;.  pN
8dd0: 6f 64 65 2d 3e 69 52 6f 77 69 64 20 3d 20 70 31  ode->iRowid = p1
8de0: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28 20  ->iRowid;.  if( 
8df0: 70 31 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20  p1->bEof ){.    
8e00: 66 74 73 35 45 78 70 72 4e 6f 64 65 5a 65 72 6f  fts5ExprNodeZero
8e10: 50 6f 73 6c 69 73 74 28 70 32 29 3b 0a 20 20 7d  Poslist(p2);.  }
8e20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8e40: 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54  ExprNodeNext_NOT
8e50: 28 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45  (.  Fts5Expr *pE
8e60: 78 70 72 2c 20 0a 20 20 46 74 73 35 45 78 70 72  xpr, .  Fts5Expr
8e70: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 0a 20 20 69  Node *pNode,.  i
8e80: 6e 74 20 62 46 72 6f 6d 56 61 6c 69 64 2c 0a 20  nt bFromValid,. 
8e90: 20 69 36 34 20 69 46 72 6f 6d 0a 29 7b 0a 20 20   i64 iFrom.){.  
8ea0: 69 6e 74 20 72 63 20 3d 20 66 74 73 35 45 78 70  int rc = fts5Exp
8eb0: 72 4e 6f 64 65 4e 65 78 74 28 70 45 78 70 72 2c  rNodeNext(pExpr,
8ec0: 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
8ed0: 30 5d 2c 20 62 46 72 6f 6d 56 61 6c 69 64 2c 20  0], bFromValid, 
8ee0: 69 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20 72 63  iFrom);.  if( rc
8ef0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8f00: 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72     rc = fts5Expr
8f10: 4e 6f 64 65 54 65 73 74 5f 4e 4f 54 28 70 45 78  NodeTest_NOT(pEx
8f20: 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a  pr, pNode);.  }.
8f30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8f40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65  _OK ){.    pNode
8f50: 2d 3e 62 4e 6f 6d 61 74 63 68 20 3d 20 30 3b 0a  ->bNomatch = 0;.
8f60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 4e 6f  .}../*.** If pNo
8f80: 64 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  de currently poi
8f90: 6e 74 73 20 74 6f 20 61 20 6d 61 74 63 68 2c 20  nts to a match, 
8fa0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
8fb0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0a  turns SQLITE_OK.
8fc0: 2a 2a 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66  ** without modif
8fd0: 79 69 6e 67 20 69 74 2e 20 4f 74 68 65 72 77 69  ying it. Otherwi
8fe0: 73 65 2c 20 70 4e 6f 64 65 20 69 73 20 61 64 76  se, pNode is adv
8ff0: 61 6e 63 65 64 20 75 6e 74 69 6c 20 69 74 20 64  anced until it d
9000: 6f 65 73 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20  oes point.** to 
9010: 61 20 6d 61 74 63 68 20 6f 72 20 45 4f 46 20 69  a match or EOF i
9020: 73 20 72 65 61 63 68 65 64 2e 0a 2a 2f 0a 73 74  s reached..*/.st
9030: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 78 70  atic int fts5Exp
9040: 72 4e 6f 64 65 54 65 73 74 28 0a 20 20 46 74 73  rNodeTest(.  Fts
9050: 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  5Expr *pExpr,   
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9070: 45 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 77 68  Expression of wh
9080: 69 63 68 20 70 4e 6f 64 65 20 69 73 20 61 20 70  ich pNode is a p
9090: 61 72 74 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  art */.  Fts5Exp
90a0: 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 20 20 20  rNode *pNode    
90b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
90c0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 74  ession node to t
90d0: 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  est */.){.  int 
90e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
90f0: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f    if( pNode->bEo
9100: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 77 69 74  f==0 ){.    swit
9110: 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65  ch( pNode->eType
9120: 20 29 7b 0a 0a 20 20 20 20 20 20 63 61 73 65 20   ){..      case 
9130: 46 54 53 35 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  FTS5_STRING: {. 
9140: 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
9150: 45 78 70 72 4e 6f 64 65 54 65 73 74 5f 53 54 52  ExprNodeTest_STR
9160: 49 4e 47 28 70 45 78 70 72 2c 20 70 4e 6f 64 65  ING(pExpr, pNode
9170: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9180: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
9190: 20 63 61 73 65 20 46 54 53 35 5f 54 45 52 4d 3a   case FTS5_TERM:
91a0: 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
91b0: 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74  fts5ExprNodeTest
91c0: 5f 54 45 52 4d 28 70 45 78 70 72 2c 20 70 4e 6f  _TERM(pExpr, pNo
91d0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  de);.        bre
91e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
91f0: 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44     case FTS5_AND
9200: 3a 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  : {.        rc =
9210: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 54 65 73   fts5ExprNodeTes
9220: 74 5f 41 4e 44 28 70 45 78 70 72 2c 20 70 4e 6f  t_AND(pExpr, pNo
9230: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  de);.        bre
9240: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
9250: 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a     case FTS5_OR:
9260: 20 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 45   {.        fts5E
9270: 78 70 72 4e 6f 64 65 54 65 73 74 5f 4f 52 28 70  xprNodeTest_OR(p
9280: 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20  Expr, pNode);.  
9290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
92a0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
92b0: 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 4e 6f  ult: assert( pNo
92c0: 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  de->eType==FTS5_
92d0: 4e 4f 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20  NOT ); {.       
92e0: 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e 6f   rc = fts5ExprNo
92f0: 64 65 54 65 73 74 5f 4e 4f 54 28 70 45 78 70 72  deTest_NOT(pExpr
9300: 2c 20 70 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20  , pNode);.      
9310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9330: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 20 0a 2f 2a 0a  urn rc;.}.. ./*.
9340: 2a 2a 20 53 65 74 20 6e 6f 64 65 20 70 4e 6f 64  ** Set node pNod
9350: 65 2c 20 77 68 69 63 68 20 69 73 20 70 61 72 74  e, which is part
9360: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
9370: 45 78 70 72 2c 20 74 6f 20 70 6f 69 6e 74 20 74  Expr, to point t
9380: 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6d  o the first.** m
9390: 61 74 63 68 2e 20 49 66 20 74 68 65 72 65 20 61  atch. If there a
93a0: 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 73  re no matches, s
93b0: 65 74 20 74 68 65 20 4e 6f 64 65 2e 62 45 6f 66  et the Node.bEof
93c0: 20 66 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   flag to indicat
93d0: 65 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  e EOF..**.** Ret
93e0: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
93f0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
9400: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20  rror occurs, or 
9410: 53 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65 72 77  SQLITE_OK otherw
9420: 69 73 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  ise..** It is no
9430: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  t an error if th
9440: 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68  ere are no match
9450: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
9460: 74 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69  t fts5ExprNodeFi
9470: 72 73 74 28 46 74 73 35 45 78 70 72 20 2a 70 45  rst(Fts5Expr *pE
9480: 78 70 72 2c 20 46 74 73 35 45 78 70 72 4e 6f 64  xpr, Fts5ExprNod
9490: 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74  e *pNode){.  int
94a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
94b0: 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20 3d  .  pNode->bEof =
94c0: 20 30 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 4e 6f   0;.  pNode->bNo
94d0: 6d 61 74 63 68 20 3d 20 30 3b 0a 0a 20 20 69 66  match = 0;..  if
94e0: 28 20 46 74 73 35 4e 6f 64 65 49 73 53 74 72 69  ( Fts5NodeIsStri
94f0: 6e 67 28 70 4e 6f 64 65 29 20 29 7b 0a 20 20 20  ng(pNode) ){.   
9500: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61   /* Initialize a
9510: 6c 6c 20 74 65 72 6d 20 69 74 65 72 61 74 6f 72  ll term iterator
9520: 73 20 69 6e 20 74 68 65 20 4e 45 41 52 20 6f 62  s in the NEAR ob
9530: 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ject. */.    rc 
9540: 3d 20 66 74 73 35 45 78 70 72 4e 65 61 72 49 6e  = fts5ExprNearIn
9550: 69 74 41 6c 6c 28 70 45 78 70 72 2c 20 70 4e 6f  itAll(pExpr, pNo
9560: 64 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  de);.  }else if(
9570: 20 70 4e 6f 64 65 2d 3e 78 4e 65 78 74 3d 3d 30   pNode->xNext==0
9580: 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 62   ){.    pNode->b
9590: 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
95a0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
95b0: 20 69 6e 74 20 6e 45 6f 66 20 3d 20 30 3b 0a 20   int nEof = 0;. 
95c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
95d0: 6f 64 65 2d 3e 6e 43 68 69 6c 64 20 26 26 20 72  ode->nChild && r
95e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
95f0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78  +){.      Fts5Ex
9600: 70 72 4e 6f 64 65 20 2a 70 43 68 69 6c 64 20 3d  prNode *pChild =
9610: 20 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c 64 5b   pNode->apChild[
9620: 69 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  i];.      rc = f
9630: 74 73 35 45 78 70 72 4e 6f 64 65 46 69 72 73 74  ts5ExprNodeFirst
9640: 28 70 45 78 70 72 2c 20 70 4e 6f 64 65 2d 3e 61  (pExpr, pNode->a
9650: 70 43 68 69 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  pChild[i]);.    
9660: 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
9670: 2d 3e 62 45 6f 66 3d 3d 30 20 7c 7c 20 70 43 68  ->bEof==0 || pCh
9680: 69 6c 64 2d 3e 62 45 6f 66 3d 3d 31 20 29 3b 0a  ild->bEof==1 );.
9690: 20 20 20 20 20 20 6e 45 6f 66 20 2b 3d 20 70 43        nEof += pC
96a0: 68 69 6c 64 2d 3e 62 45 6f 66 3b 0a 20 20 20 20  hild->bEof;.    
96b0: 7d 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 69 52 6f  }.    pNode->iRo
96c0: 77 69 64 20 3d 20 70 4e 6f 64 65 2d 3e 61 70 43  wid = pNode->apC
96d0: 68 69 6c 64 5b 30 5d 2d 3e 69 52 6f 77 69 64 3b  hild[0]->iRowid;
96e0: 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4e  ..    switch( pN
96f0: 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  ode->eType ){.  
9700: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e      case FTS5_AN
9710: 44 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  D:.        if( n
9720: 45 6f 66 3e 30 20 29 20 66 74 73 35 45 78 70 72  Eof>0 ) fts5Expr
9730: 53 65 74 45 6f 66 28 70 4e 6f 64 65 29 3b 0a 20  SetEof(pNode);. 
9740: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
9750: 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 4f       case FTS5_O
9760: 52 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  R:.        if( p
9770: 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64 3d 3d 6e 45  Node->nChild==nE
9780: 6f 66 20 29 20 66 74 73 35 45 78 70 72 53 65 74  of ) fts5ExprSet
9790: 45 6f 66 28 70 4e 6f 64 65 29 3b 0a 20 20 20 20  Eof(pNode);.    
97a0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
97b0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
97c0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65     assert( pNode
97d0: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f  ->eType==FTS5_NO
97e0: 54 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  T );.        pNo
97f0: 64 65 2d 3e 62 45 6f 66 20 3d 20 70 4e 6f 64 65  de->bEof = pNode
9800: 2d 3e 61 70 43 68 69 6c 64 5b 30 5d 2d 3e 62 45  ->apChild[0]->bE
9810: 6f 66 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  of;.        brea
9820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
9830: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9840: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
9850: 73 35 45 78 70 72 4e 6f 64 65 54 65 73 74 28 70  s5ExprNodeTest(p
9860: 45 78 70 72 2c 20 70 4e 6f 64 65 29 3b 0a 20 20  Expr, pNode);.  
9870: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9880: 0a 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 69  .../*.** Begin i
9890: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
98a0: 20 74 68 65 20 73 65 74 20 6f 66 20 64 6f 63 75   the set of docu
98b0: 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 70  ments in index p
98c0: 49 64 78 20 6d 61 74 63 68 65 64 20 62 79 0a 2a  Idx matched by.*
98d0: 2a 20 74 68 65 20 4d 41 54 43 48 20 65 78 70 72  * the MATCH expr
98e0: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
98f0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
9900: 65 6e 74 2e 20 49 66 20 74 68 65 20 22 62 44 65  ent. If the "bDe
9910: 73 63 22 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  sc" .** paramete
9920: 72 20 69 73 20 70 61 73 73 65 64 20 61 20 6e 6f  r is passed a no
9930: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 74  n-zero value, it
9940: 65 72 61 74 69 6f 6e 20 69 73 20 69 6e 20 64 65  eration is in de
9950: 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 0a  scending rowid .
9960: 2a 2a 20 6f 72 64 65 72 2e 20 4f 72 2c 20 69 66  ** order. Or, if
9970: 20 69 74 20 69 73 20 7a 65 72 6f 2c 20 69 6e 20   it is zero, in 
9980: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
9990: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 65 72 61 74  .**.** If iterat
99a0: 69 6e 67 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ing in ascending
99b0: 20 72 6f 77 69 64 20 6f 72 64 65 72 20 28 62 44   rowid order (bD
99c0: 65 73 63 3d 3d 30 29 2c 20 74 68 65 20 66 69 72  esc==0), the fir
99d0: 73 74 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 76  st document.** v
99e0: 69 73 69 74 65 64 20 69 73 20 74 68 61 74 20 77  isited is that w
99f0: 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
9a00: 20 72 6f 77 69 64 20 74 68 61 74 20 69 73 20 6c   rowid that is l
9a10: 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
9a20: 75 61 6c 0a 2a 2a 20 74 6f 20 70 61 72 61 6d 65  ual.** to parame
9a30: 74 65 72 20 69 46 69 72 73 74 2e 20 4f 72 2c 20  ter iFirst. Or, 
9a40: 69 66 20 69 74 65 72 61 74 69 6e 67 20 69 6e 20  if iterating in 
9a50: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
9a60: 28 62 44 65 73 63 3d 3d 31 29 2c 0a 2a 2a 20 74  (bDesc==1),.** t
9a70: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 64 6f  hen the first do
9a80: 63 75 6d 65 6e 74 20 76 69 73 69 74 65 64 20 6d  cument visited m
9a90: 75 73 74 20 68 61 76 65 20 61 20 72 6f 77 69 64  ust have a rowid
9aa0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
9ab0: 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 69 46 69  .** equal to iFi
9ac0: 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  rst..**.** Retur
9ad0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
9ae0: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
9af0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
9b00: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 20 49 74  de otherwise. It
9b10: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
9b20: 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
9b30: 66 20 74 68 65 20 71 75 65 72 79 20 64 6f 65 73  f the query does
9b40: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 64   not match any d
9b50: 6f 63 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  ocuments..*/.int
9b60: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
9b70: 46 69 72 73 74 28 46 74 73 35 45 78 70 72 20 2a  First(Fts5Expr *
9b80: 70 2c 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  p, Fts5Index *pI
9b90: 64 78 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20  dx, i64 iFirst, 
9ba0: 69 6e 74 20 62 44 65 73 63 29 7b 0a 20 20 46 74  int bDesc){.  Ft
9bb0: 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 6f 6f  s5ExprNode *pRoo
9bc0: 74 20 3d 20 70 2d 3e 70 52 6f 6f 74 3b 0a 20 20  t = p->pRoot;.  
9bd0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
9c00: 2f 0a 0a 20 20 70 2d 3e 70 49 6e 64 65 78 20 3d  /..  p->pIndex =
9c10: 20 70 49 64 78 3b 0a 20 20 70 2d 3e 62 44 65 73   pIdx;.  p->bDes
9c20: 63 20 3d 20 62 44 65 73 63 3b 0a 20 20 72 63 20  c = bDesc;.  rc 
9c30: 3d 20 66 74 73 35 45 78 70 72 4e 6f 64 65 46 69  = fts5ExprNodeFi
9c40: 72 73 74 28 70 2c 20 70 52 6f 6f 74 29 3b 0a 0a  rst(p, pRoot);..
9c50: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 61 74 20 45    /* If not at E
9c60: 4f 46 20 62 75 74 20 74 68 65 20 63 75 72 72 65  OF but the curre
9c70: 6e 74 20 72 6f 77 69 64 20 6f 63 63 75 72 73 20  nt rowid occurs 
9c80: 65 61 72 6c 69 65 72 20 74 68 61 6e 20 69 46 69  earlier than iFi
9c90: 72 73 74 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  rst in.  ** the 
9ca0: 69 74 65 72 61 74 69 6f 6e 20 6f 72 64 65 72 2c  iteration order,
9cb0: 20 6d 6f 76 65 20 74 6f 20 64 6f 63 75 6d 65 6e   move to documen
9cc0: 74 20 69 46 69 72 73 74 20 6f 72 20 6c 61 74 65  t iFirst or late
9cd0: 72 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  r. */.  if( rc==
9ce0: 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
9cf0: 20 30 3d 3d 70 52 6f 6f 74 2d 3e 62 45 6f 66 20   0==pRoot->bEof 
9d00: 0a 20 20 20 26 26 20 66 74 73 35 52 6f 77 69 64  .   && fts5Rowid
9d10: 43 6d 70 28 70 2c 20 70 52 6f 6f 74 2d 3e 69 52  Cmp(p, pRoot->iR
9d20: 6f 77 69 64 2c 20 69 46 69 72 73 74 29 3c 30 20  owid, iFirst)<0 
9d30: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  .  ){.    rc = f
9d40: 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78 74 28  ts5ExprNodeNext(
9d50: 70 2c 20 70 52 6f 6f 74 2c 20 31 2c 20 69 46 69  p, pRoot, 1, iFi
9d60: 72 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rst);.  }..  /* 
9d70: 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
9d80: 69 73 20 6e 6f 74 20 61 74 20 61 20 72 65 61 6c  is not at a real
9d90: 20 6d 61 74 63 68 2c 20 73 6b 69 70 20 66 6f 72   match, skip for
9da0: 77 61 72 64 20 75 6e 74 69 6c 20 69 74 20 69 73  ward until it is
9db0: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 52  . */.  while( pR
9dc0: 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68 20 29 7b  oot->bNomatch ){
9dd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
9de0: 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 72  ot->bEof==0 && r
9df0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
9e00: 20 20 20 20 72 63 20 3d 20 66 74 73 35 45 78 70      rc = fts5Exp
9e10: 72 4e 6f 64 65 4e 65 78 74 28 70 2c 20 70 52 6f  rNodeNext(p, pRo
9e20: 6f 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ot, 0, 0);.  }. 
9e30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9e40: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
9e50: 20 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 0a   next document .
9e60: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
9e70: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
9e80: 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
9e90: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
9ea0: 68 65 72 77 69 73 65 2e 20 49 74 0a 2a 2a 20 69  herwise. It.** i
9eb0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
9ec0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
9ed0: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
9ee0: 6d 61 74 63 68 20 61 6e 79 20 64 6f 63 75 6d 65  match any docume
9ef0: 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
9f00: 74 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28  te3Fts5ExprNext(
9f10: 46 74 73 35 45 78 70 72 20 2a 70 2c 20 69 36 34  Fts5Expr *p, i64
9f20: 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 72   iLast){.  int r
9f30: 63 3b 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  c;.  Fts5ExprNod
9f40: 65 20 2a 70 52 6f 6f 74 20 3d 20 70 2d 3e 70 52  e *pRoot = p->pR
9f50: 6f 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  oot;.  assert( p
9f60: 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26  Root->bEof==0 &&
9f70: 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d 61 74 63 68   pRoot->bNomatch
9f80: 3d 3d 30 20 29 3b 0a 20 20 64 6f 20 7b 0a 20 20  ==0 );.  do {.  
9f90: 20 20 72 63 20 3d 20 66 74 73 35 45 78 70 72 4e    rc = fts5ExprN
9fa0: 6f 64 65 4e 65 78 74 28 70 2c 20 70 52 6f 6f 74  odeNext(p, pRoot
9fb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  , 0, 0);.    ass
9fc0: 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62 4e 6f 6d  ert( pRoot->bNom
9fd0: 61 74 63 68 3d 3d 30 20 7c 7c 20 28 72 63 3d 3d  atch==0 || (rc==
9fe0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 52 6f  SQLITE_OK && pRo
9ff0: 6f 74 2d 3e 62 45 6f 66 3d 3d 30 29 20 29 3b 0a  ot->bEof==0) );.
a000: 20 20 7d 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d    }while( pRoot-
a010: 3e 62 4e 6f 6d 61 74 63 68 20 29 3b 0a 20 20 69  >bNomatch );.  i
a020: 66 28 20 66 74 73 35 52 6f 77 69 64 43 6d 70 28  f( fts5RowidCmp(
a030: 70 2c 20 70 52 6f 6f 74 2d 3e 69 52 6f 77 69 64  p, pRoot->iRowid
a040: 2c 20 69 4c 61 73 74 29 3e 30 20 29 7b 0a 20 20  , iLast)>0 ){.  
a050: 20 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 20 3d 20    pRoot->bEof = 
a060: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
a070: 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
a080: 65 33 46 74 73 35 45 78 70 72 45 6f 66 28 46 74  e3Fts5ExprEof(Ft
a090: 73 35 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  s5Expr *p){.  re
a0a0: 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74 2d 3e 62  turn p->pRoot->b
a0b0: 45 6f 66 3b 0a 7d 0a 0a 69 36 34 20 73 71 6c 69  Eof;.}..i64 sqli
a0c0: 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69 64  te3Fts5ExprRowid
a0d0: 28 46 74 73 35 45 78 70 72 20 2a 70 29 7b 0a 20  (Fts5Expr *p){. 
a0e0: 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 6f 6f 74   return p->pRoot
a0f0: 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61  ->iRowid;.}..sta
a100: 74 69 63 20 69 6e 74 20 66 74 73 35 50 61 72 73  tic int fts5Pars
a110: 65 53 74 72 69 6e 67 46 72 6f 6d 54 6f 6b 65 6e  eStringFromToken
a120: 28 46 74 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b  (Fts5Token *pTok
a130: 65 6e 2c 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a  en, char **pz){.
a140: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a150: 45 5f 4f 4b 3b 0a 20 20 2a 70 7a 20 3d 20 73 71  E_OK;.  *pz = sq
a160: 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70  lite3Fts5Strndup
a170: 28 26 72 63 2c 20 70 54 6f 6b 65 6e 2d 3e 70 2c  (&rc, pToken->p,
a180: 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 72   pToken->n);.  r
a190: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a1a0: 2a 2a 20 46 72 65 65 20 74 68 65 20 70 68 72 61  ** Free the phra
a1b0: 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  se object passed
a1c0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
a1d0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a1e0: 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 50 68   void fts5ExprPh
a1f0: 72 61 73 65 46 72 65 65 28 46 74 73 35 45 78 70  raseFree(Fts5Exp
a200: 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
a210: 29 7b 0a 20 20 69 66 28 20 70 50 68 72 61 73 65  ){.  if( pPhrase
a220: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
a230: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
a240: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 2b  hrase->nTerm; i+
a250: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 45 78  +){.      Fts5Ex
a260: 70 72 54 65 72 6d 20 2a 70 53 79 6e 3b 0a 20 20  prTerm *pSyn;.  
a270: 20 20 20 20 46 74 73 35 45 78 70 72 54 65 72 6d      Fts5ExprTerm
a280: 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 46   *pNext;.      F
a290: 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65  ts5ExprTerm *pTe
a2a0: 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61  rm = &pPhrase->a
a2b0: 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 73  Term[i];.      s
a2c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 65 72  qlite3_free(pTer
a2d0: 6d 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  m->zTerm);.     
a2e0: 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
a2f0: 43 6c 6f 73 65 28 70 54 65 72 6d 2d 3e 70 49 74  Close(pTerm->pIt
a300: 65 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  er);.      for(p
a310: 53 79 6e 3d 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  Syn=pTerm->pSyno
a320: 6e 79 6d 3b 20 70 53 79 6e 3b 20 70 53 79 6e 3d  nym; pSyn; pSyn=
a330: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
a340: 70 4e 65 78 74 20 3d 20 70 53 79 6e 2d 3e 70 53  pNext = pSyn->pS
a350: 79 6e 6f 6e 79 6d 3b 0a 20 20 20 20 20 20 20 20  ynonym;.        
a360: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
a370: 6c 6f 73 65 28 70 53 79 6e 2d 3e 70 49 74 65 72  lose(pSyn->pIter
a380: 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
a390: 75 66 66 65 72 46 72 65 65 28 28 46 74 73 35 42  ufferFree((Fts5B
a3a0: 75 66 66 65 72 2a 29 26 70 53 79 6e 5b 31 5d 29  uffer*)&pSyn[1])
a3b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a3c0: 33 5f 66 72 65 65 28 70 53 79 6e 29 3b 0a 20 20  3_free(pSyn);.  
a3d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a3e0: 69 66 28 20 70 50 68 72 61 73 65 2d 3e 70 6f 73  if( pPhrase->pos
a3f0: 6c 69 73 74 2e 6e 53 70 61 63 65 3e 30 20 29 20  list.nSpace>0 ) 
a400: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
a410: 70 50 68 72 61 73 65 2d 3e 70 6f 73 6c 69 73 74  pPhrase->poslist
a420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
a430: 72 65 65 28 70 50 68 72 61 73 65 29 3b 0a 20 20  ree(pPhrase);.  
a440: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
a450: 68 65 20 22 62 46 69 72 73 74 22 20 66 6c 61 67  he "bFirst" flag
a460: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 74 6f   on the first to
a470: 6b 65 6e 20 6f 66 20 74 68 65 20 70 68 72 61 73  ken of the phras
a480: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
a490: 2a 2a 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  ** only argument
a4a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a4b0: 33 46 74 73 35 50 61 72 73 65 53 65 74 43 61 72  3Fts5ParseSetCar
a4c0: 65 74 28 46 74 73 35 45 78 70 72 50 68 72 61 73  et(Fts5ExprPhras
a4d0: 65 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69  e *pPhrase){.  i
a4e0: 66 28 20 70 50 68 72 61 73 65 20 26 26 20 70 50  f( pPhrase && pP
a4f0: 68 72 61 73 65 2d 3e 6e 54 65 72 6d 20 29 7b 0a  hrase->nTerm ){.
a500: 20 20 20 20 70 50 68 72 61 73 65 2d 3e 61 54 65      pPhrase->aTe
a510: 72 6d 5b 30 5d 2e 62 46 69 72 73 74 20 3d 20 31  rm[0].bFirst = 1
a520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
a530: 66 20 61 72 67 75 6d 65 6e 74 20 70 4e 65 61 72  f argument pNear
a540: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61   is NULL, then a
a550: 20 6e 65 77 20 46 74 73 35 45 78 70 72 4e 65 61   new Fts5ExprNea
a560: 72 73 65 74 20 6f 62 6a 65 63 74 20 69 73 20 61  rset object is a
a570: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6e 64 20  llocated.** and 
a580: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 70  populated with p
a590: 50 68 72 61 73 65 2e 20 4f 72 2c 20 69 66 20 70  Phrase. Or, if p
a5a0: 4e 65 61 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Near is not NULL
a5b0: 2c 20 70 68 72 61 73 65 20 70 50 68 72 61 73 65  , phrase pPhrase
a5c0: 20 69 73 0a 2a 2a 20 61 70 70 65 6e 64 65 64 20   is.** appended 
a5d0: 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20 72 65  to it and the re
a5e0: 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 2e 0a  sults returned..
a5f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
a600: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 62 6f  error occurs, bo
a610: 74 68 20 74 68 65 20 70 4e 65 61 72 20 61 6e 64  th the pNear and
a620: 20 70 50 68 72 61 73 65 20 6f 62 6a 65 63 74 73   pPhrase objects
a630: 20 61 72 65 20 66 72 65 65 64 20 61 6e 64 0a 2a   are freed and.*
a640: 2a 20 4e 55 4c 4c 20 72 65 74 75 72 6e 65 64 2e  * NULL returned.
a650: 0a 2a 2f 0a 46 74 73 35 45 78 70 72 4e 65 61 72  .*/.Fts5ExprNear
a660: 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35  set *sqlite3Fts5
a670: 50 61 72 73 65 4e 65 61 72 73 65 74 28 0a 20 20  ParseNearset(.  
a680: 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73  Fts5Parse *pPars
a690: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
a6a0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
a6b0: 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 65   */.  Fts5ExprNe
a6c0: 61 72 73 65 74 20 2a 70 4e 65 61 72 2c 20 20 20  arset *pNear,   
a6d0: 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e        /* Existin
a6e0: 67 20 6e 65 61 72 73 65 74 2c 20 6f 72 20 4e 55  g nearset, or NU
a6f0: 4c 4c 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  LL */.  Fts5Expr
a700: 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
a710: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 65 6e          /* Recen
a720: 74 6c 79 20 70 61 72 73 65 64 20 70 68 72 61 73  tly parsed phras
a730: 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
a740: 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20 38 3b  int SZALLOC = 8;
a750: 0a 20 20 46 74 73 35 45 78 70 72 4e 65 61 72 73  .  Fts5ExprNears
a760: 65 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a 20  et *pRet = 0;.. 
a770: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d   if( pParse->rc=
a780: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a790: 20 20 69 66 28 20 70 50 68 72 61 73 65 3d 3d 30    if( pPhrase==0
a7a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a7b0: 20 70 4e 65 61 72 3b 0a 20 20 20 20 7d 0a 20 20   pNear;.    }.  
a7c0: 20 20 69 66 28 20 70 4e 65 61 72 3d 3d 30 20 29    if( pNear==0 )
a7d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
a7e0: 69 6e 74 36 34 20 6e 42 79 74 65 3b 0a 20 20 20  int64 nByte;.   
a7f0: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
a800: 66 28 46 74 73 35 45 78 70 72 4e 65 61 72 73 65  f(Fts5ExprNearse
a810: 74 29 20 2b 20 53 5a 41 4c 4c 4f 43 20 2a 20 73  t) + SZALLOC * s
a820: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68  izeof(Fts5ExprPh
a830: 72 61 73 65 2a 29 3b 0a 20 20 20 20 20 20 70 52  rase*);.      pR
a840: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  et = sqlite3_mal
a850: 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20  loc64(nByte);.  
a860: 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
a870: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
a880: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
a890: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
a8a0: 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
a8b0: 74 28 70 52 65 74 2c 20 30 2c 20 28 73 69 7a 65  t(pRet, 0, (size
a8c0: 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  _t)nByte);.     
a8d0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
a8e0: 20 28 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65   (pNear->nPhrase
a8f0: 20 25 20 53 5a 41 4c 4c 4f 43 29 3d 3d 30 20 29   % SZALLOC)==0 )
a900: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77  {.      int nNew
a910: 20 3d 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73   = pNear->nPhras
a920: 65 20 2b 20 53 5a 41 4c 4c 4f 43 3b 0a 20 20 20  e + SZALLOC;.   
a930: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
a940: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 6e   nByte;..      n
a950: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
a960: 73 35 45 78 70 72 4e 65 61 72 73 65 74 29 20 2b  s5ExprNearset) +
a970: 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66 28 46   nNew * sizeof(F
a980: 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 3b  ts5ExprPhrase*);
a990: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46  .      pRet = (F
a9a0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 2a 29  ts5ExprNearset*)
a9b0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
a9c0: 34 28 70 4e 65 61 72 2c 20 6e 42 79 74 65 29 3b  4(pNear, nByte);
a9d0: 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 3d  .      if( pRet=
a9e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  =0 ){.        pP
a9f0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
aa00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
aa10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
aa20: 20 20 70 52 65 74 20 3d 20 70 4e 65 61 72 3b 0a    pRet = pNear;.
aa30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
aa40: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
aa50: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
aa60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
aa70: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
aa80: 50 61 72 73 65 4e 65 61 72 73 65 74 46 72 65 65  ParseNearsetFree
aa90: 28 70 4e 65 61 72 29 3b 0a 20 20 20 20 73 71 6c  (pNear);.    sql
aaa0: 69 74 65 33 46 74 73 35 50 61 72 73 65 50 68 72  ite3Fts5ParsePhr
aab0: 61 73 65 46 72 65 65 28 70 50 68 72 61 73 65 29  aseFree(pPhrase)
aac0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
aad0: 66 28 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65  f( pRet->nPhrase
aae0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  >0 ){.      Fts5
aaf0: 45 78 70 72 50 68 72 61 73 65 20 2a 70 4c 61 73  ExprPhrase *pLas
ab00: 74 20 3d 20 70 52 65 74 2d 3e 61 70 50 68 72 61  t = pRet->apPhra
ab10: 73 65 5b 70 52 65 74 2d 3e 6e 50 68 72 61 73 65  se[pRet->nPhrase
ab20: 2d 31 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  -1];.      asser
ab30: 74 28 20 70 4c 61 73 74 3d 3d 70 50 61 72 73 65  t( pLast==pParse
ab40: 2d 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73  ->apPhrase[pPars
ab50: 65 2d 3e 6e 50 68 72 61 73 65 2d 32 5d 20 29 3b  e->nPhrase-2] );
ab60: 0a 20 20 20 20 20 20 69 66 28 20 70 50 68 72 61  .      if( pPhra
ab70: 73 65 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 7b 0a  se->nTerm==0 ){.
ab80: 20 20 20 20 20 20 20 20 66 74 73 35 45 78 70 72          fts5Expr
ab90: 50 68 72 61 73 65 46 72 65 65 28 70 50 68 72 61  PhraseFree(pPhra
aba0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  se);.        pRe
abb0: 74 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a 20 20  t->nPhrase--;.  
abc0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50        pParse->nP
abd0: 68 72 61 73 65 2d 2d 3b 0a 20 20 20 20 20 20 20  hrase--;.       
abe0: 20 70 50 68 72 61 73 65 20 3d 20 70 4c 61 73 74   pPhrase = pLast
abf0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ac00: 28 20 70 4c 61 73 74 2d 3e 6e 54 65 72 6d 3d 3d  ( pLast->nTerm==
ac10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
ac20: 35 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28  5ExprPhraseFree(
ac30: 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pLast);.        
ac40: 70 50 61 72 73 65 2d 3e 61 70 50 68 72 61 73 65  pParse->apPhrase
ac50: 5b 70 50 61 72 73 65 2d 3e 6e 50 68 72 61 73 65  [pParse->nPhrase
ac60: 2d 32 5d 20 3d 20 70 50 68 72 61 73 65 3b 0a 20  -2] = pPhrase;. 
ac70: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
ac80: 50 68 72 61 73 65 2d 2d 3b 0a 20 20 20 20 20 20  Phrase--;.      
ac90: 20 20 70 52 65 74 2d 3e 6e 50 68 72 61 73 65 2d    pRet->nPhrase-
aca0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
acb0: 0a 20 20 20 20 70 52 65 74 2d 3e 61 70 50 68 72  .    pRet->apPhr
acc0: 61 73 65 5b 70 52 65 74 2d 3e 6e 50 68 72 61 73  ase[pRet->nPhras
acd0: 65 2b 2b 5d 20 3d 20 70 50 68 72 61 73 65 3b 0a  e++] = pPhrase;.
ace0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
acf0: 74 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  t;.}..typedef st
ad00: 72 75 63 74 20 54 6f 6b 65 6e 43 74 78 20 54 6f  ruct TokenCtx To
ad10: 6b 65 6e 43 74 78 3b 0a 73 74 72 75 63 74 20 54  kenCtx;.struct T
ad20: 6f 6b 65 6e 43 74 78 20 7b 0a 20 20 46 74 73 35  okenCtx {.  Fts5
ad30: 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68 72  ExprPhrase *pPhr
ad40: 61 73 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 7d  ase;.  int rc;.}
ad50: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63  ;../*.** Callbac
ad60: 6b 20 66 6f 72 20 74 6f 6b 65 6e 69 7a 69 6e 67  k for tokenizing
ad70: 20 74 65 72 6d 73 20 75 73 65 64 20 62 79 20 50   terms used by P
ad80: 61 72 73 65 54 65 72 6d 28 29 2e 0a 2a 2f 0a 73  arseTerm()..*/.s
ad90: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 61  tatic int fts5Pa
ada0: 72 73 65 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 76  rseTokenize(.  v
adb0: 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20  oid *pContext,  
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
add0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 46 74 73  * Pointer to Fts
ade0: 35 49 6e 73 65 72 74 43 74 78 20 6f 62 6a 65 63  5InsertCtx objec
adf0: 74 20 2a 2f 0a 20 20 69 6e 74 20 74 66 6c 61 67  t */.  int tflag
ae00: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
ae10: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
ae20: 66 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66  f FTS5_TOKEN_* f
ae30: 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
ae40: 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  char *pToken,   
ae50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
ae60: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
ae70: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  oken */.  int nT
ae80: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
ae90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
aea0: 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79  e of token in by
aeb0: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e  tes */.  int iUn
aec0: 75 73 65 64 31 2c 20 20 20 20 20 20 20 20 20 20  used1,          
aed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
aee0: 74 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65  t offset of toke
aef0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73  n */.  int iUnus
af00: 65 64 32 20 20 20 20 20 20 20 20 20 20 20 20 20  ed2             
af10: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
af20: 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f  fset of token */
af30: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
af40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
af50: 74 20 69 6e 74 20 53 5a 41 4c 4c 4f 43 20 3d 20  t int SZALLOC = 
af60: 38 3b 0a 20 20 54 6f 6b 65 6e 43 74 78 20 2a 70  8;.  TokenCtx *p
af70: 43 74 78 20 3d 20 28 54 6f 6b 65 6e 43 74 78 2a  Ctx = (TokenCtx*
af80: 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 46 74 73  )pContext;.  Fts
af90: 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50 68  5ExprPhrase *pPh
afa0: 72 61 73 65 20 3d 20 70 43 74 78 2d 3e 70 50 68  rase = pCtx->pPh
afb0: 72 61 73 65 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  rase;..  UNUSED_
afc0: 50 41 52 41 4d 32 28 69 55 6e 75 73 65 64 31 2c  PARAM2(iUnused1,
afd0: 20 69 55 6e 75 73 65 64 32 29 3b 0a 0a 20 20 2f   iUnused2);..  /
afe0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
aff0: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
b000: 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
b010: 2d 6f 70 20 2a 2f 0a 20 20 69 66 28 20 70 43 74  -op */.  if( pCt
b020: 78 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc!=SQLITE_OK
b030: 20 29 20 72 65 74 75 72 6e 20 70 43 74 78 2d 3e   ) return pCtx->
b040: 72 63 3b 0a 20 20 69 66 28 20 6e 54 6f 6b 65 6e  rc;.  if( nToken
b050: 3e 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f  >FTS5_MAX_TOKEN_
b060: 53 49 5a 45 20 29 20 6e 54 6f 6b 65 6e 20 3d 20  SIZE ) nToken = 
b070: 46 54 53 35 5f 4d 41 58 5f 54 4f 4b 45 4e 5f 53  FTS5_MAX_TOKEN_S
b080: 49 5a 45 3b 0a 0a 20 20 69 66 28 20 70 50 68 72  IZE;..  if( pPhr
b090: 61 73 65 20 26 26 20 70 50 68 72 61 73 65 2d 3e  ase && pPhrase->
b0a0: 6e 54 65 72 6d 3e 30 20 26 26 20 28 74 66 6c 61  nTerm>0 && (tfla
b0b0: 67 73 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e 5f  gs & FTS5_TOKEN_
b0c0: 43 4f 4c 4f 43 41 54 45 44 29 20 29 7b 0a 20 20  COLOCATED) ){.  
b0d0: 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
b0e0: 70 53 79 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSyn;.    sqlite
b0f0: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
b100: 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54  sizeof(Fts5ExprT
b110: 65 72 6d 29 20 2b 20 73 69 7a 65 6f 66 28 46 74  erm) + sizeof(Ft
b120: 73 35 42 75 66 66 65 72 29 20 2b 20 6e 54 6f 6b  s5Buffer) + nTok
b130: 65 6e 2b 31 3b 0a 20 20 20 20 70 53 79 6e 20 3d  en+1;.    pSyn =
b140: 20 28 46 74 73 35 45 78 70 72 54 65 72 6d 2a 29   (Fts5ExprTerm*)
b150: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
b160: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
b170: 20 70 53 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   pSyn==0 ){.    
b180: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
b190: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
b1a0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 53 79        memset(pSy
b1b0: 6e 2c 20 30 2c 20 28 73 69 7a 65 5f 74 29 6e 42  n, 0, (size_t)nB
b1c0: 79 74 65 29 3b 0a 20 20 20 20 20 20 70 53 79 6e  yte);.      pSyn
b1d0: 2d 3e 7a 54 65 72 6d 20 3d 20 28 28 63 68 61 72  ->zTerm = ((char
b1e0: 2a 29 70 53 79 6e 29 20 2b 20 73 69 7a 65 6f 66  *)pSyn) + sizeof
b1f0: 28 46 74 73 35 45 78 70 72 54 65 72 6d 29 20 2b  (Fts5ExprTerm) +
b200: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
b210: 65 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  er);.      memcp
b220: 79 28 70 53 79 6e 2d 3e 7a 54 65 72 6d 2c 20 70  y(pSyn->zTerm, p
b230: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
b240: 20 20 20 20 20 20 70 53 79 6e 2d 3e 70 53 79 6e        pSyn->pSyn
b250: 6f 6e 79 6d 20 3d 20 70 50 68 72 61 73 65 2d 3e  onym = pPhrase->
b260: 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e  aTerm[pPhrase->n
b270: 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79 6d  Term-1].pSynonym
b280: 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d  ;.      pPhrase-
b290: 3e 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e  >aTerm[pPhrase->
b2a0: 6e 54 65 72 6d 2d 31 5d 2e 70 53 79 6e 6f 6e 79  nTerm-1].pSynony
b2b0: 6d 20 3d 20 70 53 79 6e 3b 0a 20 20 20 20 7d 0a  m = pSyn;.    }.
b2c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73    }else{.    Fts
b2d0: 35 45 78 70 72 54 65 72 6d 20 2a 70 54 65 72 6d  5ExprTerm *pTerm
b2e0: 3b 0a 20 20 20 20 69 66 28 20 70 50 68 72 61 73  ;.    if( pPhras
b2f0: 65 3d 3d 30 20 7c 7c 20 28 70 50 68 72 61 73 65  e==0 || (pPhrase
b300: 2d 3e 6e 54 65 72 6d 20 25 20 53 5a 41 4c 4c 4f  ->nTerm % SZALLO
b310: 43 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46  C)==0 ){.      F
b320: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
b330: 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  New;.      int n
b340: 4e 65 77 20 3d 20 53 5a 41 4c 4c 4f 43 20 2b 20  New = SZALLOC + 
b350: 28 70 50 68 72 61 73 65 20 3f 20 70 50 68 72 61  (pPhrase ? pPhra
b360: 73 65 2d 3e 6e 54 65 72 6d 20 3a 20 30 29 3b 0a  se->nTerm : 0);.
b370: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 46  .      pNew = (F
b380: 74 73 35 45 78 70 72 50 68 72 61 73 65 2a 29 73  ts5ExprPhrase*)s
b390: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
b3a0: 28 70 50 68 72 61 73 65 2c 20 0a 20 20 20 20 20  (pPhrase, .     
b3b0: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
b3c0: 45 78 70 72 50 68 72 61 73 65 29 20 2b 20 73 69  ExprPhrase) + si
b3d0: 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54 65 72  zeof(Fts5ExprTer
b3e0: 6d 29 20 2a 20 6e 4e 65 77 0a 20 20 20 20 20 20  m) * nNew.      
b3f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
b400: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
b410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
b420: 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
b430: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 68 72          if( pPhr
b440: 61 73 65 3d 3d 30 20 29 20 6d 65 6d 73 65 74 28  ase==0 ) memset(
b450: 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
b460: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 29 29  Fts5ExprPhrase))
b470: 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  ;.        pCtx->
b480: 70 50 68 72 61 73 65 20 3d 20 70 50 68 72 61 73  pPhrase = pPhras
b490: 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
b4a0: 20 20 70 4e 65 77 2d 3e 6e 54 65 72 6d 20 3d 20    pNew->nTerm = 
b4b0: 6e 4e 65 77 20 2d 20 53 5a 41 4c 4c 4f 43 3b 0a  nNew - SZALLOC;.
b4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
b4d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b4e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 54  E_OK ){.      pT
b4f0: 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65 2d 3e  erm = &pPhrase->
b500: 61 54 65 72 6d 5b 70 50 68 72 61 73 65 2d 3e 6e  aTerm[pPhrase->n
b510: 54 65 72 6d 2b 2b 5d 3b 0a 20 20 20 20 20 20 6d  Term++];.      m
b520: 65 6d 73 65 74 28 70 54 65 72 6d 2c 20 30 2c 20  emset(pTerm, 0, 
b530: 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 54  sizeof(Fts5ExprT
b540: 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 70 54 65  erm));.      pTe
b550: 72 6d 2d 3e 7a 54 65 72 6d 20 3d 20 73 71 6c 69  rm->zTerm = sqli
b560: 74 65 33 46 74 73 35 53 74 72 6e 64 75 70 28 26  te3Fts5Strndup(&
b570: 72 63 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  rc, pToken, nTok
b580: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  en);.    }.  }..
b590: 20 20 70 43 74 78 2d 3e 72 63 20 3d 20 72 63 3b    pCtx->rc = rc;
b5a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b5b0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
b5c0: 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70   phrase object p
b5d0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
b5e0: 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  y argument..*/.v
b5f0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 50  oid sqlite3Fts5P
b600: 61 72 73 65 50 68 72 61 73 65 46 72 65 65 28 46  arsePhraseFree(F
b610: 74 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70  ts5ExprPhrase *p
b620: 50 68 72 61 73 65 29 7b 0a 20 20 66 74 73 35 45  Phrase){.  fts5E
b630: 78 70 72 50 68 72 61 73 65 46 72 65 65 28 70 50  xprPhraseFree(pP
b640: 68 72 61 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hrase);.}../*.**
b650: 20 46 72 65 65 20 74 68 65 20 70 68 72 61 73 65   Free the phrase
b660: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
b670: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
b680: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
b690: 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 4e  qlite3Fts5ParseN
b6a0: 65 61 72 73 65 74 46 72 65 65 28 46 74 73 35 45  earsetFree(Fts5E
b6b0: 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61  xprNearset *pNea
b6c0: 72 29 7b 0a 20 20 69 66 28 20 70 4e 65 61 72 20  r){.  if( pNear 
b6d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
b6e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65    for(i=0; i<pNe
b6f0: 61 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b 2b  ar->nPhrase; i++
b700: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 45 78 70  ){.      fts5Exp
b710: 72 50 68 72 61 73 65 46 72 65 65 28 70 4e 65 61  rPhraseFree(pNea
b720: 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 29 3b  r->apPhrase[i]);
b730: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b740: 65 33 5f 66 72 65 65 28 70 4e 65 61 72 2d 3e 70  e3_free(pNear->p
b750: 43 6f 6c 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Colset);.    sql
b760: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 61 72 29  ite3_free(pNear)
b770: 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 73 71  ;.  }.}..void sq
b780: 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 46 69  lite3Fts5ParseFi
b790: 6e 69 73 68 65 64 28 46 74 73 35 50 61 72 73 65  nished(Fts5Parse
b7a0: 20 2a 70 50 61 72 73 65 2c 20 46 74 73 35 45 78   *pParse, Fts5Ex
b7b0: 70 72 4e 6f 64 65 20 2a 70 29 7b 0a 20 20 61 73  prNode *p){.  as
b7c0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 45  sert( pParse->pE
b7d0: 78 70 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  xpr==0 );.  pPar
b7e0: 73 65 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 7d  se->pExpr = p;.}
b7f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b800: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
b810: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
b820: 20 70 72 6f 63 65 73 73 20 61 20 73 74 72 69 6e   process a strin
b830: 67 20 74 6f 6b 65 6e 2e 20 54 68 65 0a 2a 2a 20  g token. The.** 
b840: 73 74 72 69 6e 67 20 6d 61 79 20 6f 72 20 6d 61  string may or ma
b850: 79 20 6e 6f 74 20 62 65 20 71 75 6f 74 65 64 2e  y not be quoted.
b860: 20 49 6e 20 61 6e 79 20 63 61 73 65 20 69 74 20   In any case it 
b870: 69 73 20 74 6f 6b 65 6e 69 7a 65 64 20 61 6e 64  is tokenized and
b880: 20 61 0a 2a 2a 20 70 68 72 61 73 65 20 6f 62 6a   a.** phrase obj
b890: 65 63 74 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  ect consisting o
b8a0: 66 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 72 65 74  f all tokens ret
b8b0: 75 72 6e 65 64 2e 0a 2a 2f 0a 46 74 73 35 45 78  urned..*/.Fts5Ex
b8c0: 70 72 50 68 72 61 73 65 20 2a 73 71 6c 69 74 65  prPhrase *sqlite
b8d0: 33 46 74 73 35 50 61 72 73 65 54 65 72 6d 28 0a  3Fts5ParseTerm(.
b8e0: 20 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61    Fts5Parse *pPa
b8f0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
b900: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
b910: 78 74 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  xt */.  Fts5Expr
b920: 50 68 72 61 73 65 20 2a 70 41 70 70 65 6e 64 2c  Phrase *pAppend,
b930: 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
b940: 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a  e to append to *
b950: 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70  /.  Fts5Token *p
b960: 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
b970: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
b980: 20 74 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 20 20 69   tokenize */.  i
b990: 6e 74 20 62 50 72 65 66 69 78 20 20 20 20 20 20  nt bPrefix      
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b9b0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
b9c0: 69 73 20 61 20 74 72 61 69 6c 69 6e 67 20 22 2a  is a trailing "*
b9d0: 22 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f  " */.){.  Fts5Co
b9e0: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
b9f0: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 3b  pParse->pConfig;
ba00: 0a 20 20 54 6f 6b 65 6e 43 74 78 20 73 43 74 78  .  TokenCtx sCtx
ba10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ba20: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62     /* Context ob
ba30: 6a 65 63 74 20 70 61 73 73 65 64 20 74 6f 20 63  ject passed to c
ba40: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  allback */.  int
ba50: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba70: 54 6f 6b 65 6e 69 7a 65 20 72 65 74 75 72 6e 20  Tokenize return 
ba80: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
ba90: 7a 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74  z = 0;..  memset
baa0: 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
bab0: 66 28 54 6f 6b 65 6e 43 74 78 29 29 3b 0a 20 20  f(TokenCtx));.  
bac0: 73 43 74 78 2e 70 50 68 72 61 73 65 20 3d 20 70  sCtx.pPhrase = p
bad0: 41 70 70 65 6e 64 3b 0a 0a 20 20 72 63 20 3d 20  Append;..  rc = 
bae0: 66 74 73 35 50 61 72 73 65 53 74 72 69 6e 67 46  fts5ParseStringF
baf0: 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 2c  romToken(pToken,
bb00: 20 26 7a 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d   &z);.  if( rc==
bb10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bb20: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
bb30: 35 5f 54 4f 4b 45 4e 49 5a 45 5f 51 55 45 52 59  5_TOKENIZE_QUERY
bb40: 20 7c 20 28 62 50 72 65 66 69 78 20 3f 20 46 54   | (bPrefix ? FT
bb50: 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 50 52 45 46  S5_TOKENIZE_PREF
bb60: 49 58 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  IX : 0);.    int
bb70: 20 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   n;.    sqlite3F
bb80: 74 73 35 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20  ts5Dequote(z);. 
bb90: 20 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c     n = (int)strl
bba0: 65 6e 28 7a 29 3b 0a 20 20 20 20 72 63 20 3d 20  en(z);.    rc = 
bbb0: 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e  sqlite3Fts5Token
bbc0: 69 7a 65 28 70 43 6f 6e 66 69 67 2c 20 66 6c 61  ize(pConfig, fla
bbd0: 67 73 2c 20 7a 2c 20 6e 2c 20 26 73 43 74 78 2c  gs, z, n, &sCtx,
bbe0: 20 66 74 73 35 50 61 72 73 65 54 6f 6b 65 6e 69   fts5ParseTokeni
bbf0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ze);.  }.  sqlit
bc00: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 69 66  e3_free(z);.  if
bc10: 28 20 72 63 20 7c 7c 20 28 72 63 20 3d 20 73 43  ( rc || (rc = sC
bc20: 74 78 2e 72 63 29 20 29 7b 0a 20 20 20 20 70 50  tx.rc) ){.    pP
bc30: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
bc40: 20 20 20 66 74 73 35 45 78 70 72 50 68 72 61 73     fts5ExprPhras
bc50: 65 46 72 65 65 28 73 43 74 78 2e 70 50 68 72 61  eFree(sCtx.pPhra
bc60: 73 65 29 3b 0a 20 20 20 20 73 43 74 78 2e 70 50  se);.    sCtx.pP
bc70: 68 72 61 73 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  hrase = 0;.  }el
bc80: 73 65 7b 0a 0a 20 20 20 20 69 66 28 20 70 41 70  se{..    if( pAp
bc90: 70 65 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pend==0 ){.     
bca0: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 50   if( (pParse->nP
bcb0: 68 72 61 73 65 20 25 20 38 29 3d 3d 30 20 29 7b  hrase % 8)==0 ){
bcc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bcd0: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
bce0: 69 7a 65 6f 66 28 46 74 73 35 45 78 70 72 50 68  izeof(Fts5ExprPh
bcf0: 72 61 73 65 2a 29 20 2a 20 28 70 50 61 72 73 65  rase*) * (pParse
bd00: 2d 3e 6e 50 68 72 61 73 65 20 2b 20 38 29 3b 0a  ->nPhrase + 8);.
bd10: 20 20 20 20 20 20 20 20 46 74 73 35 45 78 70 72          Fts5Expr
bd20: 50 68 72 61 73 65 20 2a 2a 61 70 4e 65 77 3b 0a  Phrase **apNew;.
bd30: 20 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20          apNew = 
bd40: 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 2a  (Fts5ExprPhrase*
bd50: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
bd60: 63 36 34 28 70 50 61 72 73 65 2d 3e 61 70 50 68  c64(pParse->apPh
bd70: 72 61 73 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  rase, nByte);.  
bd80: 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d        if( apNew=
bd90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
bda0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
bdb0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
bdc0: 20 20 20 20 20 66 74 73 35 45 78 70 72 50 68 72       fts5ExprPhr
bdd0: 61 73 65 46 72 65 65 28 73 43 74 78 2e 70 50 68  aseFree(sCtx.pPh
bde0: 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rase);.         
bdf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
be00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
be10: 72 73 65 2d 3e 61 70 50 68 72 61 73 65 20 3d 20  rse->apPhrase = 
be20: 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20  apNew;.      }. 
be30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68       pParse->nPh
be40: 72 61 73 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  rase++;.    }.. 
be50: 20 20 20 69 66 28 20 73 43 74 78 2e 70 50 68 72     if( sCtx.pPhr
be60: 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ase==0 ){.      
be70: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
be80: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 74  when parsing a t
be90: 6f 6b 65 6e 20 6f 72 20 71 75 6f 74 65 64 20 70  oken or quoted p
bea0: 68 72 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  hrase that conta
beb0: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  ins.      ** no 
bec0: 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65 72 73  token characters
bed0: 20 61 74 20 61 6c 6c 2e 20 28 65 2e 67 20 2e 2e   at all. (e.g ..
bee0: 2e 20 4d 41 54 43 48 20 27 22 22 27 29 2e 20 2a  . MATCH '""'). *
bef0: 2f 0a 20 20 20 20 20 20 73 43 74 78 2e 70 50 68  /.      sCtx.pPh
bf00: 72 61 73 65 20 3d 20 73 71 6c 69 74 65 33 46 74  rase = sqlite3Ft
bf10: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 50  s5MallocZero(&pP
bf20: 61 72 73 65 2d 3e 72 63 2c 20 73 69 7a 65 6f 66  arse->rc, sizeof
bf30: 28 46 74 73 35 45 78 70 72 50 68 72 61 73 65 29  (Fts5ExprPhrase)
bf40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
bf50: 20 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 6e   sCtx.pPhrase->n
bf60: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 73 43  Term ){.      sC
bf70: 74 78 2e 70 50 68 72 61 73 65 2d 3e 61 54 65 72  tx.pPhrase->aTer
bf80: 6d 5b 73 43 74 78 2e 70 50 68 72 61 73 65 2d 3e  m[sCtx.pPhrase->
bf90: 6e 54 65 72 6d 2d 31 5d 2e 62 50 72 65 66 69 78  nTerm-1].bPrefix
bfa0: 20 3d 20 28 75 38 29 62 50 72 65 66 69 78 3b 0a   = (u8)bPrefix;.
bfb0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
bfc0: 2d 3e 61 70 50 68 72 61 73 65 5b 70 50 61 72 73  ->apPhrase[pPars
bfd0: 65 2d 3e 6e 50 68 72 61 73 65 2d 31 5d 20 3d 20  e->nPhrase-1] = 
bfe0: 73 43 74 78 2e 70 50 68 72 61 73 65 3b 0a 20 20  sCtx.pPhrase;.  
bff0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 43 74 78  }..  return sCtx
c000: 2e 70 50 68 72 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a  .pPhrase;.}../*.
c010: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
c020: 46 54 53 35 20 65 78 70 72 65 73 73 69 6f 6e 20  FTS5 expression 
c030: 62 79 20 63 6c 6f 6e 69 6e 67 20 70 68 72 61 73  by cloning phras
c040: 65 20 69 50 68 72 61 73 65 20 6f 66 20 74 68 65  e iPhrase of the
c050: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
c060: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
c070: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
c080: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
c090: 45 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65 28  ExprClonePhrase(
c0a0: 0a 20 20 46 74 73 35 45 78 70 72 20 2a 70 45 78  .  Fts5Expr *pEx
c0b0: 70 72 2c 20 0a 20 20 69 6e 74 20 69 50 68 72 61  pr, .  int iPhra
c0c0: 73 65 2c 20 0a 20 20 46 74 73 35 45 78 70 72 20  se, .  Fts5Expr 
c0d0: 2a 2a 70 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74  **ppNew.){.  int
c0e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c100: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
c110: 20 46 74 73 35 45 78 70 72 50 68 72 61 73 65 20   Fts5ExprPhrase 
c120: 2a 70 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20  *pOrig;         
c130: 20 2f 2a 20 54 68 65 20 70 68 72 61 73 65 20 65   /* The phrase e
c140: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
c150: 78 70 72 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  xpr */.  Fts5Exp
c160: 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  r *pNew = 0;    
c170: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
c180: 65 73 73 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  ession to return
c190: 20 76 69 61 20 2a 70 70 4e 65 77 20 2a 2f 0a 20   via *ppNew */. 
c1a0: 20 54 6f 6b 65 6e 43 74 78 20 73 43 74 78 20 3d   TokenCtx sCtx =
c1b0: 20 7b 30 2c 30 7d 3b 20 20 20 20 20 20 20 20 20   {0,0};         
c1c0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65   /* Context obje
c1d0: 63 74 20 66 6f 72 20 66 74 73 35 50 61 72 73 65  ct for fts5Parse
c1e0: 54 6f 6b 65 6e 69 7a 65 20 2a 2f 0a 0a 20 20 70  Tokenize */..  p
c1f0: 4f 72 69 67 20 3d 20 70 45 78 70 72 2d 3e 61 70  Orig = pExpr->ap
c200: 45 78 70 72 50 68 72 61 73 65 5b 69 50 68 72 61  ExprPhrase[iPhra
c210: 73 65 5d 3b 0a 20 20 70 4e 65 77 20 3d 20 28 46  se];.  pNew = (F
c220: 74 73 35 45 78 70 72 2a 29 73 71 6c 69 74 65 33  ts5Expr*)sqlite3
c230: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
c240: 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 45  rc, sizeof(Fts5E
c250: 78 70 72 29 29 3b 0a 20 20 69 66 28 20 72 63 3d  xpr));.  if( rc=
c260: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c270: 20 20 70 4e 65 77 2d 3e 61 70 45 78 70 72 50 68    pNew->apExprPh
c280: 72 61 73 65 20 3d 20 28 46 74 73 35 45 78 70 72  rase = (Fts5Expr
c290: 50 68 72 61 73 65 2a 2a 29 73 71 6c 69 74 65 33  Phrase**)sqlite3
c2a0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
c2b0: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 73 69 7a  rc, .        siz
c2c0: 65 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61  eof(Fts5ExprPhra
c2d0: 73 65 2a 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  se*));.  }.  if(
c2e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c2f0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f  {.    pNew->pRoo
c300: 74 20 3d 20 28 46 74 73 35 45 78 70 72 4e 6f 64  t = (Fts5ExprNod
c310: 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
c320: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20  llocZero(&rc, . 
c330: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
c340: 73 35 45 78 70 72 4e 6f 64 65 29 29 3b 0a 20 20  s5ExprNode));.  
c350: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
c360: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65  TE_OK ){.    pNe
c370: 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 20  w->pRoot->pNear 
c380: 3d 20 28 46 74 73 35 45 78 70 72 4e 65 61 72 73  = (Fts5ExprNears
c390: 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  et*)sqlite3Fts5M
c3a0: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a  allocZero(&rc, .
c3b0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46          sizeof(F
c3c0: 74 73 35 45 78 70 72 4e 65 61 72 73 65 74 29 20  ts5ExprNearset) 
c3d0: 2b 20 73 69 7a 65 6f 66 28 46 74 73 35 45 78 70  + sizeof(Fts5Exp
c3e0: 72 50 68 72 61 73 65 2a 29 29 3b 0a 20 20 7d 0a  rPhrase*));.  }.
c3f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c400: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43  _OK ){.    Fts5C
c410: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 4f 72  olset *pColsetOr
c420: 69 67 20 3d 20 70 4f 72 69 67 2d 3e 70 4e 6f 64  ig = pOrig->pNod
c430: 65 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65  e->pNear->pColse
c440: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  t;.    if( pCols
c450: 65 74 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  etOrig ){.      
c460: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
c470: 79 74 65 3b 0a 20 20 20 20 20 20 46 74 73 35 43  yte;.      Fts5C
c480: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 0a  olset *pColset;.
c490: 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69        nByte = si
c4a0: 7a 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74 29  zeof(Fts5Colset)
c4b0: 20 2b 20 28 70 43 6f 6c 73 65 74 4f 72 69 67 2d   + (pColsetOrig-
c4c0: 3e 6e 43 6f 6c 2d 31 29 20 2a 20 73 69 7a 65 6f  >nCol-1) * sizeo
c4d0: 66 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 43  f(int);.      pC
c4e0: 6f 6c 73 65 74 20 3d 20 28 46 74 73 35 43 6f 6c  olset = (Fts5Col
c4f0: 73 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  set*)sqlite3Fts5
c500: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
c510: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
c520: 28 20 70 43 6f 6c 73 65 74 20 29 7b 20 0a 20 20  ( pColset ){ .  
c530: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f        memcpy(pCo
c540: 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74 4f 72 69  lset, pColsetOri
c550: 67 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79 74 65  g, (size_t)nByte
c560: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c570: 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 70 4e   pNew->pRoot->pN
c580: 65 61 72 2d 3e 70 43 6f 6c 73 65 74 20 3d 20 70  ear->pColset = p
c590: 43 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  Colset;.    }.  
c5a0: 7d 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 2d 3e  }..  if( pOrig->
c5b0: 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 6e 74  nTerm ){.    int
c5c0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c5e0: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
c5f0: 74 68 72 6f 75 67 68 20 70 68 72 61 73 65 20 74  through phrase t
c600: 65 72 6d 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  erms */.    for(
c610: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
c620: 4f 4b 20 26 26 20 69 3c 70 4f 72 69 67 2d 3e 6e  OK && i<pOrig->n
c630: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
c640: 20 20 69 6e 74 20 74 66 6c 61 67 73 20 3d 20 30    int tflags = 0
c650: 3b 0a 20 20 20 20 20 20 46 74 73 35 45 78 70 72  ;.      Fts5Expr
c660: 54 65 72 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66  Term *p;.      f
c670: 6f 72 28 70 3d 26 70 4f 72 69 67 2d 3e 61 54 65  or(p=&pOrig->aTe
c680: 72 6d 5b 69 5d 3b 20 70 20 26 26 20 72 63 3d 3d  rm[i]; p && rc==
c690: 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 3d 70 2d 3e  SQLITE_OK; p=p->
c6a0: 70 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20  pSynonym){.     
c6b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c6c0: 54 65 72 6d 20 3d 20 70 2d 3e 7a 54 65 72 6d 3b  Term = p->zTerm;
c6d0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
c6e0: 73 35 50 61 72 73 65 54 6f 6b 65 6e 69 7a 65 28  s5ParseTokenize(
c6f0: 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 74 66  (void*)&sCtx, tf
c700: 6c 61 67 73 2c 20 7a 54 65 72 6d 2c 20 28 69 6e  lags, zTerm, (in
c710: 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c  t)strlen(zTerm),
c720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  .            0, 
c730: 30 29 3b 0a 20 20 20 20 20 20 20 20 74 66 6c 61  0);.        tfla
c740: 67 73 20 3d 20 46 54 53 35 5f 54 4f 4b 45 4e 5f  gs = FTS5_TOKEN_
c750: 43 4f 4c 4f 43 41 54 45 44 3b 0a 20 20 20 20 20  COLOCATED;.     
c760: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
c770: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c780: 20 20 20 20 20 20 73 43 74 78 2e 70 50 68 72 61        sCtx.pPhra
c790: 73 65 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62 50 72  se->aTerm[i].bPr
c7a0: 65 66 69 78 20 3d 20 70 4f 72 69 67 2d 3e 61 54  efix = pOrig->aT
c7b0: 65 72 6d 5b 69 5d 2e 62 50 72 65 66 69 78 3b 0a  erm[i].bPrefix;.
c7c0: 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 50 68          sCtx.pPh
c7d0: 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 5d 2e 62  rase->aTerm[i].b
c7e0: 46 69 72 73 74 20 3d 20 70 4f 72 69 67 2d 3e 61  First = pOrig->a
c7f0: 54 65 72 6d 5b 69 5d 2e 62 46 69 72 73 74 3b 0a  Term[i].bFirst;.
c800: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c810: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
c820: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
c830: 70 61 72 73 69 6e 67 20 61 20 74 6f 6b 65 6e 20  parsing a token 
c840: 6f 72 20 71 75 6f 74 65 64 20 70 68 72 61 73 65  or quoted phrase
c850: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 20   that contains. 
c860: 20 20 20 2a 2a 20 6e 6f 20 74 6f 6b 65 6e 20 63     ** no token c
c870: 68 61 72 61 63 74 65 72 73 20 61 74 20 61 6c 6c  haracters at all
c880: 2e 20 28 65 2e 67 20 2e 2e 2e 20 4d 41 54 43 48  . (e.g ... MATCH
c890: 20 27 22 22 27 29 2e 20 2a 2f 0a 20 20 20 20 73   '""'). */.    s
c8a0: 43 74 78 2e 70 50 68 72 61 73 65 20 3d 20 73 71  Ctx.pPhrase = sq
c8b0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
c8c0: 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28  ero(&rc, sizeof(
c8d0: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 29 29  Fts5ExprPhrase))
c8e0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
c8f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c900: 20 20 2f 2a 20 41 6c 6c 20 74 68 65 20 61 6c 6c    /* All the all
c910: 6f 63 61 74 69 6f 6e 73 20 73 75 63 63 65 65 64  ocations succeed
c920: 65 64 2e 20 50 75 74 20 74 68 65 20 65 78 70 72  ed. Put the expr
c930: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 74 6f  ession object to
c940: 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 70  gether. */.    p
c950: 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 45  New->pIndex = pE
c960: 78 70 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  xpr->pIndex;.   
c970: 20 70 4e 65 77 2d 3e 70 43 6f 6e 66 69 67 20 3d   pNew->pConfig =
c980: 20 70 45 78 70 72 2d 3e 70 43 6f 6e 66 69 67 3b   pExpr->pConfig;
c990: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 50 68 72 61  .    pNew->nPhra
c9a0: 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77  se = 1;.    pNew
c9b0: 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b 30  ->apExprPhrase[0
c9c0: 5d 20 3d 20 73 43 74 78 2e 70 50 68 72 61 73 65  ] = sCtx.pPhrase
c9d0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f  ;.    pNew->pRoo
c9e0: 74 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68 72 61  t->pNear->apPhra
c9f0: 73 65 5b 30 5d 20 3d 20 73 43 74 78 2e 70 50 68  se[0] = sCtx.pPh
ca00: 72 61 73 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  rase;.    pNew->
ca10: 70 52 6f 6f 74 2d 3e 70 4e 65 61 72 2d 3e 6e 50  pRoot->pNear->nP
ca20: 68 72 61 73 65 20 3d 20 31 3b 0a 20 20 20 20 73  hrase = 1;.    s
ca30: 43 74 78 2e 70 50 68 72 61 73 65 2d 3e 70 4e 6f  Ctx.pPhrase->pNo
ca40: 64 65 20 3d 20 70 4e 65 77 2d 3e 70 52 6f 6f 74  de = pNew->pRoot
ca50: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 69 67  ;..    if( pOrig
ca60: 2d 3e 6e 54 65 72 6d 3d 3d 31 20 0a 20 20 20 20  ->nTerm==1 .    
ca70: 20 26 26 20 70 4f 72 69 67 2d 3e 61 54 65 72 6d   && pOrig->aTerm
ca80: 5b 30 5d 2e 70 53 79 6e 6f 6e 79 6d 3d 3d 30 20  [0].pSynonym==0 
ca90: 0a 20 20 20 20 20 26 26 20 70 4f 72 69 67 2d 3e  .     && pOrig->
caa0: 61 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 3d  aTerm[0].bFirst=
cab0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
cac0: 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d 3e 65 54   pNew->pRoot->eT
cad0: 79 70 65 20 3d 20 46 54 53 35 5f 54 45 52 4d 3b  ype = FTS5_TERM;
cae0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f  .      pNew->pRo
caf0: 6f 74 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  ot->xNext = fts5
cb00: 45 78 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45 52  ExprNodeNext_TER
cb10: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
cb20: 20 20 20 20 70 4e 65 77 2d 3e 70 52 6f 6f 74 2d      pNew->pRoot-
cb30: 3e 65 54 79 70 65 20 3d 20 46 54 53 35 5f 53 54  >eType = FTS5_ST
cb40: 52 49 4e 47 3b 0a 20 20 20 20 20 20 70 4e 65 77  RING;.      pNew
cb50: 2d 3e 70 52 6f 6f 74 2d 3e 78 4e 65 78 74 20 3d  ->pRoot->xNext =
cb60: 20 66 74 73 35 45 78 70 72 4e 6f 64 65 4e 65 78   fts5ExprNodeNex
cb70: 74 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 7d 0a  t_STRING;.    }.
cb80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
cb90: 69 74 65 33 46 74 73 35 45 78 70 72 46 72 65 65  ite3Fts5ExprFree
cba0: 28 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35  (pNew);.    fts5
cbb0: 45 78 70 72 50 68 72 61 73 65 46 72 65 65 28 73  ExprPhraseFree(s
cbc0: 43 74 78 2e 70 50 68 72 61 73 65 29 3b 0a 20 20  Ctx.pPhrase);.  
cbd0: 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a    pNew = 0;.  }.
cbe0: 0a 20 20 2a 70 70 4e 65 77 20 3d 20 70 4e 65 77  .  *ppNew = pNew
cbf0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cc00: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 20 70  .../*.** Token p
cc10: 54 6f 6b 20 68 61 73 20 61 70 70 65 61 72 65 64  Tok has appeared
cc20: 20 69 6e 20 61 20 4d 41 54 43 48 20 65 78 70 72   in a MATCH expr
cc30: 65 73 73 69 6f 6e 20 77 68 65 72 65 20 74 68 65  ession where the
cc40: 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 0a 2a   NEAR operator.*
cc50: 2a 20 69 73 20 65 78 70 65 63 74 65 64 2e 20 49  * is expected. I
cc60: 66 20 74 6f 6b 65 6e 20 70 54 6f 6b 20 64 6f 65  f token pTok doe
cc70: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 22 4e  s not contain "N
cc80: 45 41 52 22 2c 20 73 74 6f 72 65 20 61 6e 20 65  EAR", store an e
cc90: 72 72 6f 72 0a 2a 2a 20 69 6e 20 74 68 65 20 70  rror.** in the p
cca0: 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Parse object..*/
ccb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
ccc0: 35 50 61 72 73 65 4e 65 61 72 28 46 74 73 35 50  5ParseNear(Fts5P
ccd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 46 74  arse *pParse, Ft
cce0: 73 35 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a  s5Token *pTok){.
ccf0: 20 20 69 66 28 20 70 54 6f 6b 2d 3e 6e 21 3d 34    if( pTok->n!=4
cd00: 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 4e 45 41 52   || memcmp("NEAR
cd10: 22 2c 20 70 54 6f 6b 2d 3e 70 2c 20 34 29 20 29  ", pTok->p, 4) )
cd20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
cd30: 35 50 61 72 73 65 45 72 72 6f 72 28 0a 20 20 20  5ParseError(.   
cd40: 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 66 74       pParse, "ft
cd50: 73 35 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72  s5: syntax error
cd60: 20 6e 65 61 72 20 5c 22 25 2e 2a 73 5c 22 22 2c   near \"%.*s\"",
cd70: 20 70 54 6f 6b 2d 3e 6e 2c 20 70 54 6f 6b 2d 3e   pTok->n, pTok->
cd80: 70 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  p.    );.  }.}..
cd90: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
cda0: 50 61 72 73 65 53 65 74 44 69 73 74 61 6e 63 65  ParseSetDistance
cdb0: 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70  (.  Fts5Parse *p
cdc0: 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78  Parse, .  Fts5Ex
cdd0: 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72  prNearset *pNear
cde0: 2c 0a 20 20 46 74 73 35 54 6f 6b 65 6e 20 2a 70  ,.  Fts5Token *p
cdf0: 0a 29 7b 0a 20 20 69 66 28 20 70 4e 65 61 72 20  .){.  if( pNear 
ce00: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 61 72  ){.    int nNear
ce10: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
ce20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 20 29 7b  .    if( p->n ){
ce30: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
ce40: 69 3c 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  i<p->n; i++){.  
ce50: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 28        char c = (
ce60: 63 68 61 72 29 70 2d 3e 70 5b 69 5d 3b 0a 20 20  char)p->p[i];.  
ce70: 20 20 20 20 20 20 69 66 28 20 63 3c 27 30 27 20        if( c<'0' 
ce80: 7c 7c 20 63 3e 27 39 27 20 29 7b 0a 20 20 20 20  || c>'9' ){.    
ce90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
cea0: 35 50 61 72 73 65 45 72 72 6f 72 28 0a 20 20 20  5ParseError(.   
ceb0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
cec0: 65 2c 20 22 65 78 70 65 63 74 65 64 20 69 6e 74  e, "expected int
ced0: 65 67 65 72 2c 20 67 6f 74 20 5c 22 25 2e 2a 73  eger, got \"%.*s
cee0: 5c 22 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 70 0a  \"", p->n, p->p.
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b                );
cf00: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
cf10: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
cf20: 20 20 20 20 20 6e 4e 65 61 72 20 3d 20 6e 4e 65       nNear = nNe
cf30: 61 72 20 2a 20 31 30 20 2b 20 28 70 2d 3e 70 5b  ar * 10 + (p->p[
cf40: 69 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 20  i] - '0');.     
cf50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
cf60: 20 20 20 20 6e 4e 65 61 72 20 3d 20 46 54 53 35      nNear = FTS5
cf70: 5f 44 45 46 41 55 4c 54 5f 4e 45 41 52 44 49 53  _DEFAULT_NEARDIS
cf80: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  T;.    }.    pNe
cf90: 61 72 2d 3e 6e 4e 65 61 72 20 3d 20 6e 4e 65 61  ar->nNear = nNea
cfa0: 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r;.  }.}../*.** 
cfb0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
cfc0: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
cfd0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
cfe0: 62 65 20 4e 55 4c 4c 2c 20 6f 72 20 69 74 20 6d  be NULL, or it m
cff0: 61 79 20 62 65 0a 2a 2a 20 61 6e 20 65 78 69 73  ay be.** an exis
d000: 74 69 6e 67 20 46 74 73 35 43 6f 6c 73 65 74 20  ting Fts5Colset 
d010: 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75 6e  object. This fun
d020: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
d030: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20  pointer to.** a 
d040: 6e 65 77 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63  new colset objec
d050: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
d060: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 28 70 29   contents of (p)
d070: 20 77 69 74 68 20 6e 65 77 20 76 61 6c 75 65 20   with new value 
d080: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 75 6d 62 65 72  column.** number
d090: 20 69 43 6f 6c 20 61 70 70 65 6e 64 65 64 2e 20   iCol appended. 
d0a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
d0b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
d0c0: 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  tore an error co
d0d0: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
d0e0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
d0f0: 20 54 68 65 20 6f 6c 64 20 63 6f 6c 73 65 74 20   The old colset 
d100: 6f 62 6a 65 63 74 20 28 69 66 20 61 6e 79 29 20  object (if any) 
d110: 69 73 20 6e 6f 74 20 66 72 65 65 64 20 69 6e 20  is not freed in 
d120: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
d130: 61 74 69 63 20 46 74 73 35 43 6f 6c 73 65 74 20  atic Fts5Colset 
d140: 2a 66 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74  *fts5ParseColset
d150: 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70  (.  Fts5Parse *p
d160: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d170: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 53 51 4c      /* Store SQL
d180: 49 54 45 5f 4e 4f 4d 45 4d 20 68 65 72 65 20 69  ITE_NOMEM here i
d190: 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
d1a0: 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 2c 20 20  Fts5Colset *p,  
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 2f 2a 20 45 78 69 73 74 69 6e 67 20 63 6f 6c 73  /* Existing cols
d1d0: 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  et object */.  i
d1e0: 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20  nt iCol         
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d200: 2a 20 4e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  * New column to 
d210: 61 64 64 20 74 6f 20 63 6f 6c 73 65 74 20 6f 62  add to colset ob
d220: 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
d230: 20 6e 43 6f 6c 20 3d 20 70 20 3f 20 70 2d 3e 6e   nCol = p ? p->n
d240: 43 6f 6c 20 3a 20 30 3b 20 20 20 20 20 2f 2a 20  Col : 0;     /* 
d250: 4e 75 6d 2e 20 63 6f 6c 75 6d 6e 73 20 61 6c 72  Num. columns alr
d260: 65 61 64 79 20 69 6e 20 63 6f 6c 73 65 74 20 6f  eady in colset o
d270: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 43  bject */.  Fts5C
d280: 6f 6c 73 65 74 20 2a 70 4e 65 77 3b 20 20 20 20  olset *pNew;    
d290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
d2a0: 77 20 63 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20  w colset object 
d2b0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20  to return */..  
d2c0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
d2d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
d2e0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
d2f0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 50 61 72 73  =0 && iCol<pPars
d300: 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  e->pConfig->nCol
d310: 20 29 3b 0a 0a 20 20 70 4e 65 77 20 3d 20 73 71   );..  pNew = sq
d320: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
d330: 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 43 6f  p, sizeof(Fts5Co
d340: 6c 73 65 74 29 20 2b 20 73 69 7a 65 6f 66 28 69  lset) + sizeof(i
d350: 6e 74 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  nt)*nCol);.  if(
d360: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
d370: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
d380: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
d390: 73 65 7b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43  se{.    int *aiC
d3a0: 6f 6c 20 3d 20 70 4e 65 77 2d 3e 61 69 43 6f 6c  ol = pNew->aiCol
d3b0: 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
d3c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d3d0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
d3e0: 20 69 66 28 20 61 69 43 6f 6c 5b 69 5d 3d 3d 69   if( aiCol[i]==i
d3f0: 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 70 4e 65  Col ) return pNe
d400: 77 3b 0a 20 20 20 20 20 20 69 66 28 20 61 69 43  w;.      if( aiC
d410: 6f 6c 5b 69 5d 3e 69 43 6f 6c 20 29 20 62 72 65  ol[i]>iCol ) bre
d420: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ak;.    }.    fo
d430: 72 28 6a 3d 6e 43 6f 6c 3b 20 6a 3e 69 3b 20 6a  r(j=nCol; j>i; j
d440: 2d 2d 29 7b 0a 20 20 20 20 20 20 61 69 43 6f 6c  --){.      aiCol
d450: 5b 6a 5d 20 3d 20 61 69 43 6f 6c 5b 6a 2d 31 5d  [j] = aiCol[j-1]
d460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 69 43 6f  ;.    }.    aiCo
d470: 6c 5b 69 5d 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  l[i] = iCol;.   
d480: 20 70 4e 65 77 2d 3e 6e 43 6f 6c 20 3d 20 6e 43   pNew->nCol = nC
d490: 6f 6c 2b 31 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  ol+1;..#ifndef N
d4a0: 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 43 68 65  DEBUG.    /* Che
d4b0: 63 6b 20 74 68 61 74 20 74 68 65 20 61 72 72 61  ck that the arra
d4c0: 79 20 69 73 20 69 6e 20 6f 72 64 65 72 20 61 6e  y is in order an
d4d0: 64 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75  d contains no du
d4e0: 70 6c 69 63 61 74 65 20 65 6e 74 72 69 65 73 2e  plicate entries.
d4f0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   */.    for(i=1;
d500: 20 69 3c 70 4e 65 77 2d 3e 6e 43 6f 6c 3b 20 69   i<pNew->nCol; i
d510: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 4e 65 77  ++) assert( pNew
d520: 2d 3e 61 69 43 6f 6c 5b 69 5d 3e 70 4e 65 77 2d  ->aiCol[i]>pNew-
d530: 3e 61 69 43 6f 6c 5b 69 2d 31 5d 20 29 3b 0a 23  >aiCol[i-1] );.#
d540: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
d550: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
d560: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
d570: 72 65 74 75 72 6e 20 61 6e 20 46 74 73 35 43 6f  return an Fts5Co
d580: 6c 73 65 74 20 6f 62 6a 65 63 74 20 73 70 65 63  lset object spec
d590: 69 66 79 69 6e 67 20 74 68 65 20 69 6e 76 65 72  ifying the inver
d5a0: 73 65 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  se of.** the col
d5b0: 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68  set passed as th
d5c0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
d5d0: 74 2e 20 46 72 65 65 20 74 68 65 20 63 6f 6c 73  t. Free the cols
d5e0: 65 74 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  et passed.** as 
d5f0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
d600: 65 6e 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  ent before retur
d610: 6e 69 6e 67 2e 0a 2a 2f 0a 46 74 73 35 43 6f 6c  ning..*/.Fts5Col
d620: 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74 73 35  set *sqlite3Fts5
d630: 50 61 72 73 65 43 6f 6c 73 65 74 49 6e 76 65 72  ParseColsetInver
d640: 74 28 46 74 73 35 50 61 72 73 65 20 2a 70 50 61  t(Fts5Parse *pPa
d650: 72 73 65 2c 20 46 74 73 35 43 6f 6c 73 65 74 20  rse, Fts5Colset 
d660: 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65  *p){.  Fts5Colse
d670: 74 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 6e  t *pRet;.  int n
d680: 43 6f 6c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43  Col = pParse->pC
d690: 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 0a 20 20  onfig->nCol;..  
d6a0: 70 52 65 74 20 3d 20 28 46 74 73 35 43 6f 6c 73  pRet = (Fts5Cols
d6b0: 65 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  et*)sqlite3Fts5M
d6c0: 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 50 61 72 73  allocZero(&pPars
d6d0: 65 2d 3e 72 63 2c 20 0a 20 20 20 20 20 20 73 69  e->rc, .      si
d6e0: 7a 65 6f 66 28 46 74 73 35 43 6f 6c 73 65 74 29  zeof(Fts5Colset)
d6f0: 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e   + sizeof(int)*n
d700: 43 6f 6c 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Col.  );.  if( p
d710: 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
d720: 3b 0a 20 20 20 20 69 6e 74 20 69 4f 6c 64 20 3d  ;.    int iOld =
d730: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
d740: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
d750: 20 20 20 20 20 69 66 28 20 69 4f 6c 64 3e 3d 70       if( iOld>=p
d760: 2d 3e 6e 43 6f 6c 20 7c 7c 20 70 2d 3e 61 69 43  ->nCol || p->aiC
d770: 6f 6c 5b 69 4f 6c 64 5d 21 3d 69 20 29 7b 0a 20  ol[iOld]!=i ){. 
d780: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 69 43         pRet->aiC
d790: 6f 6c 5b 70 52 65 74 2d 3e 6e 43 6f 6c 2b 2b 5d  ol[pRet->nCol++]
d7a0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = i;.      }els
d7b0: 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 6c 64 2b  e{.        iOld+
d7c0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
d7d0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
d7e0: 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
d7f0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 46 74 73 35 43  n pRet;.}..Fts5C
d800: 6f 6c 73 65 74 20 2a 73 71 6c 69 74 65 33 46 74  olset *sqlite3Ft
d810: 73 35 50 61 72 73 65 43 6f 6c 73 65 74 28 0a 20  s5ParseColset(. 
d820: 20 46 74 73 35 50 61 72 73 65 20 2a 70 50 61 72   Fts5Parse *pPar
d830: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
d840: 20 2f 2a 20 53 74 6f 72 65 20 53 51 4c 49 54 45   /* Store SQLITE
d850: 5f 4e 4f 4d 45 4d 20 68 65 72 65 20 69 66 20 72  _NOMEM here if r
d860: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 46 74 73  equired */.  Fts
d870: 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
d880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d890: 45 78 69 73 74 69 6e 67 20 63 6f 6c 73 65 74 20  Existing colset 
d8a0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
d8b0: 54 6f 6b 65 6e 20 2a 70 0a 29 7b 0a 20 20 46 74  Token *p.){.  Ft
d8c0: 73 35 43 6f 6c 73 65 74 20 2a 70 52 65 74 20 3d  s5Colset *pRet =
d8d0: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a   0;.  int iCol;.
d8e0: 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 63 6f    /* Dequoted co
d910: 70 79 20 6f 66 20 74 6f 6b 65 6e 20 70 20 2a 2f  py of token p */
d920: 0a 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 46  ..  z = sqlite3F
d930: 74 73 35 53 74 72 6e 64 75 70 28 26 70 50 61 72  ts5Strndup(&pPar
d940: 73 65 2d 3e 72 63 2c 20 70 2d 3e 70 2c 20 70 2d  se->rc, p->p, p-
d950: 3e 6e 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  >n);.  if( pPars
d960: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
d970: 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
d980: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 50  ig *pConfig = pP
d990: 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20  arse->pConfig;. 
d9a0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 44 65     sqlite3Fts5De
d9b0: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 20 20 66 6f  quote(z);.    fo
d9c0: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
d9d0: 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69 43  Config->nCol; iC
d9e0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ol++){.      if(
d9f0: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
da00: 63 6d 70 28 70 43 6f 6e 66 69 67 2d 3e 61 7a 43  cmp(pConfig->azC
da10: 6f 6c 5b 69 43 6f 6c 5d 2c 20 7a 29 20 29 20 62  ol[iCol], z) ) b
da20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
da30: 69 66 28 20 69 43 6f 6c 3d 3d 70 43 6f 6e 66 69  if( iCol==pConfi
da40: 67 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  g->nCol ){.     
da50: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
da60: 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 22  eError(pParse, "
da70: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20  no such column: 
da80: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 65 6c  %s", z);.    }el
da90: 73 65 7b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  se{.      pRet =
daa0: 20 66 74 73 35 50 61 72 73 65 43 6f 6c 73 65 74   fts5ParseColset
dab0: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 73 65 74  (pParse, pColset
dac0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iCol);.    }. 
dad0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
dae0: 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  z);.  }..  if( p
daf0: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Ret==0 ){.    as
db00: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63  sert( pParse->rc
db10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
db20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
db30: 70 43 6f 6c 73 65 74 29 3b 0a 20 20 7d 0a 0a 20  pColset);.  }.. 
db40: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
db50: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ./*.** If argume
db60: 6e 74 20 70 4f 72 69 67 20 69 73 20 4e 55 4c 4c  nt pOrig is NULL
db70: 2c 20 6f 72 20 69 66 20 28 2a 70 52 63 29 20 69  , or if (*pRc) i
db80: 73 20 73 65 74 20 74 6f 20 61 6e 79 74 68 69 6e  s set to anythin
db90: 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20  g other than.** 
dba0: 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
dbb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
dbc0: 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20  called, NULL is 
dbd0: 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a  returned. .**.**
dbe0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 63 6f   Otherwise, a co
dbf0: 70 79 20 6f 66 20 28 2a 70 4f 72 69 67 29 20 69  py of (*pOrig) i
dc00: 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f  s made into memo
dc10: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
dc20: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 35 4d  .** sqlite3Fts5M
dc30: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 61 6e 64 20  allocZero() and 
dc40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20  a pointer to it 
dc50: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
dc60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
dc70: 61 69 6c 73 2c 20 28 2a 70 52 63 29 20 69 73 20  ails, (*pRc) is 
dc80: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
dc90: 4d 45 4d 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  MEM and NULL is 
dca0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
dcb0: 74 69 63 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  tic Fts5Colset *
dcc0: 66 74 73 35 43 6c 6f 6e 65 43 6f 6c 73 65 74 28  fts5CloneColset(
dcd0: 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 43 6f  int *pRc, Fts5Co
dce0: 6c 73 65 74 20 2a 70 4f 72 69 67 29 7b 0a 20 20  lset *pOrig){.  
dcf0: 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 52 65 74  Fts5Colset *pRet
dd00: 3b 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b  ;.  if( pOrig ){
dd10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
dd20: 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  64 nByte = sizeo
dd30: 66 28 46 74 73 35 43 6f 6c 73 65 74 29 20 2b 20  f(Fts5Colset) + 
dd40: 28 70 4f 72 69 67 2d 3e 6e 43 6f 6c 2d 31 29 20  (pOrig->nCol-1) 
dd50: 2a 20 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20  * sizeof(int);. 
dd60: 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 43     pRet = (Fts5C
dd70: 6f 6c 73 65 74 2a 29 73 71 6c 69 74 65 33 46 74  olset*)sqlite3Ft
dd80: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 52 63  s5MallocZero(pRc
dd90: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
dda0: 28 20 70 52 65 74 20 29 7b 20 0a 20 20 20 20 20  ( pRet ){ .     
ddb0: 20 6d 65 6d 63 70 79 28 70 52 65 74 2c 20 70 4f   memcpy(pRet, pO
ddc0: 72 69 67 2c 20 28 73 69 7a 65 5f 74 29 6e 42 79  rig, (size_t)nBy
ddd0: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  te);.    }.  }el
dde0: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
ddf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
de00: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
de10: 6d 6f 76 65 20 66 72 6f 6d 20 63 6f 6c 73 65 74  move from colset
de20: 20 70 43 6f 6c 73 65 74 20 61 6e 79 20 63 6f 6c   pColset any col
de30: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f  umns that are no
de40: 74 20 61 6c 73 6f 20 69 6e 20 63 6f 6c 73 65 74  t also in colset
de50: 20 70 4d 65 72 67 65 2e 0a 2a 2f 0a 73 74 61 74   pMerge..*/.stat
de60: 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
de70: 65 43 6f 6c 73 65 74 28 46 74 73 35 43 6f 6c 73  eColset(Fts5Cols
de80: 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 46 74 73  et *pColset, Fts
de90: 35 43 6f 6c 73 65 74 20 2a 70 4d 65 72 67 65 29  5Colset *pMerge)
dea0: 7b 0a 20 20 69 6e 74 20 69 49 6e 20 3d 20 30 3b  {.  int iIn = 0;
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
dec0: 74 20 69 6e 70 75 74 20 69 6e 20 70 43 6f 6c 73  t input in pCols
ded0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 72  et */.  int iMer
dee0: 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ge = 0;       /*
def0: 20 4e 65 78 74 20 69 6e 70 75 74 20 69 6e 20 70   Next input in p
df00: 4d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  Merge */.  int i
df10: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
df20: 20 2f 2a 20 4e 65 78 74 20 6f 75 74 70 75 74 20   /* Next output 
df30: 73 6c 6f 74 20 69 6e 20 70 43 6f 6c 73 65 74 20  slot in pColset 
df40: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 49 6e  */..  while( iIn
df50: 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 20 26  <pColset->nCol &
df60: 26 20 69 4d 65 72 67 65 3c 70 4d 65 72 67 65 2d  & iMerge<pMerge-
df70: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74  >nCol ){.    int
df80: 20 69 44 69 66 66 20 3d 20 70 43 6f 6c 73 65 74   iDiff = pColset
df90: 2d 3e 61 69 43 6f 6c 5b 69 49 6e 5d 20 2d 20 70  ->aiCol[iIn] - p
dfa0: 4d 65 72 67 65 2d 3e 61 69 43 6f 6c 5b 69 4d 65  Merge->aiCol[iMe
dfb0: 72 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 69 44  rge];.    if( iD
dfc0: 69 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  iff==0 ){.      
dfd0: 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69  pColset->aiCol[i
dfe0: 4f 75 74 2b 2b 5d 20 3d 20 70 4d 65 72 67 65 2d  Out++] = pMerge-
dff0: 3e 61 69 43 6f 6c 5b 69 4d 65 72 67 65 5d 3b 0a  >aiCol[iMerge];.
e000: 20 20 20 20 20 20 69 4d 65 72 67 65 2b 2b 3b 0a        iMerge++;.
e010: 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
e020: 20 7d 65 6c 73 65 20 69 66 28 20 69 44 69 66 66   }else if( iDiff
e030: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 4d 65 72  >0 ){.      iMer
e040: 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ge++;.    }else{
e050: 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
e060: 20 20 7d 0a 20 20 7d 0a 20 20 70 43 6f 6c 73 65    }.  }.  pColse
e070: 74 2d 3e 6e 43 6f 6c 20 3d 20 69 4f 75 74 3b 0a  t->nCol = iOut;.
e080: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
e090: 76 65 6c 79 20 61 70 70 6c 79 20 63 6f 6c 73 65  vely apply colse
e0a0: 74 20 70 43 6f 6c 73 65 74 20 74 6f 20 65 78 70  t pColset to exp
e0b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 70 4e 6f  ression node pNo
e0c0: 64 65 20 61 6e 64 20 61 6c 6c 20 6f 66 0a 2a 2a  de and all of.**
e0d0: 20 69 74 73 20 64 65 63 65 6e 64 65 6e 74 73 2e   its decendents.
e0e0: 20 49 66 20 28 2a 70 70 46 72 65 65 29 20 69 73   If (*ppFree) is
e0f0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 63 6f   not NULL, it co
e100: 6e 74 61 69 6e 73 20 61 20 73 70 61 72 65 20 63  ntains a spare c
e110: 6f 70 79 0a 2a 2a 20 6f 66 20 70 43 6f 6c 73 65  opy.** of pColse
e120: 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
e130: 20 6d 61 79 20 75 73 65 20 74 68 65 20 73 70 61   may use the spa
e140: 72 65 20 63 6f 70 79 20 61 6e 64 20 73 65 74 20  re copy and set 
e150: 28 2a 70 70 46 72 65 65 29 20 74 6f 0a 2a 2a 20  (*ppFree) to.** 
e160: 7a 65 72 6f 2c 20 6f 72 20 69 74 20 6d 61 79 20  zero, or it may 
e170: 63 72 65 61 74 65 20 63 6f 70 69 65 73 20 6f 66  create copies of
e180: 20 70 43 6f 6c 73 65 74 20 75 73 69 6e 67 20 66   pColset using f
e190: 74 73 35 43 6c 6f 6e 65 43 6f 6c 73 65 74 28 29  ts5CloneColset()
e1a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e1b0: 20 66 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c   fts5ParseSetCol
e1c0: 73 65 74 28 0a 20 20 46 74 73 35 50 61 72 73 65  set(.  Fts5Parse
e1d0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 46 74 73   *pParse, .  Fts
e1e0: 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65  5ExprNode *pNode
e1f0: 2c 20 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  , .  Fts5Colset 
e200: 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35  *pColset,.  Fts5
e210: 43 6f 6c 73 65 74 20 2a 2a 70 70 46 72 65 65 0a  Colset **ppFree.
e220: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
e230: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
e240: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
e250: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ode->eType==FTS5
e260: 5f 54 45 52 4d 20 7c 7c 20 70 4e 6f 64 65 2d 3e  _TERM || pNode->
e270: 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49  eType==FTS5_STRI
e280: 4e 47 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  NG .         || 
e290: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54  pNode->eType==FT
e2a0: 53 35 5f 41 4e 44 20 20 7c 7c 20 70 4e 6f 64 65  S5_AND  || pNode
e2b0: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 4f 52  ->eType==FTS5_OR
e2c0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 6f  .         || pNo
e2d0: 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  de->eType==FTS5_
e2e0: 4e 4f 54 20 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65  NOT  || pNode->e
e2f0: 54 79 70 65 3d 3d 46 54 53 35 5f 45 4f 46 0a 20  Type==FTS5_EOF. 
e300: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e     );.    if( pN
e310: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  ode->eType==FTS5
e320: 5f 53 54 52 49 4e 47 20 7c 7c 20 70 4e 6f 64 65  _STRING || pNode
e330: 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45  ->eType==FTS5_TE
e340: 52 4d 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  RM ){.      Fts5
e350: 45 78 70 72 4e 65 61 72 73 65 74 20 2a 70 4e 65  ExprNearset *pNe
e360: 61 72 20 3d 20 70 4e 6f 64 65 2d 3e 70 4e 65 61  ar = pNode->pNea
e370: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  r;.      if( pNe
e380: 61 72 2d 3e 70 43 6f 6c 73 65 74 20 29 7b 0a 20  ar->pColset ){. 
e390: 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
e3a0: 43 6f 6c 73 65 74 28 70 4e 65 61 72 2d 3e 70 43  Colset(pNear->pC
e3b0: 6f 6c 73 65 74 2c 20 70 43 6f 6c 73 65 74 29 3b  olset, pColset);
e3c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
e3d0: 61 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  ar->pColset->nCo
e3e0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
e3f0: 20 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 3d    pNode->eType =
e400: 20 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20   FTS5_EOF;.     
e410: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65 78       pNode->xNex
e420: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
e430: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e440: 20 2a 70 70 46 72 65 65 20 29 7b 0a 20 20 20 20   *ppFree ){.    
e450: 20 20 20 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73      pNear->pCols
e460: 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  et = pColset;.  
e470: 20 20 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20        *ppFree = 
e480: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
e490: 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d 3e 70          pNear->p
e4a0: 43 6f 6c 73 65 74 20 3d 20 66 74 73 35 43 6c 6f  Colset = fts5Clo
e4b0: 6e 65 43 6f 6c 73 65 74 28 26 70 50 61 72 73 65  neColset(&pParse
e4c0: 2d 3e 72 63 2c 20 70 43 6f 6c 73 65 74 29 3b 0a  ->rc, pColset);.
e4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
e4e0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
e4f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
e500: 6f 64 65 2d 3e 65 54 79 70 65 21 3d 46 54 53 35  ode->eType!=FTS5
e510: 5f 45 4f 46 20 7c 7c 20 70 4e 6f 64 65 2d 3e 6e  _EOF || pNode->n
e520: 43 68 69 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20  Child==0 );.    
e530: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 6f    for(i=0; i<pNo
e540: 64 65 2d 3e 6e 43 68 69 6c 64 3b 20 69 2b 2b 29  de->nChild; i++)
e550: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 50 61  {.        fts5Pa
e560: 72 73 65 53 65 74 43 6f 6c 73 65 74 28 70 50 61  rseSetColset(pPa
e570: 72 73 65 2c 20 70 4e 6f 64 65 2d 3e 61 70 43 68  rse, pNode->apCh
e580: 69 6c 64 5b 69 5d 2c 20 70 43 6f 6c 73 65 74 2c  ild[i], pColset,
e590: 20 70 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20   ppFree);.      
e5a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
e5b0: 2a 0a 2a 2a 20 41 70 70 6c 79 20 63 6f 6c 73 65  *.** Apply colse
e5c0: 74 20 70 43 6f 6c 73 65 74 20 74 6f 20 65 78 70  t pColset to exp
e5d0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 70 45 78  ression node pEx
e5e0: 70 72 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  pr and all of it
e5f0: 73 20 64 65 73 63 65 6e 64 65 6e 74 73 2e 0a 2a  s descendents..*
e600: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
e610: 73 35 50 61 72 73 65 53 65 74 43 6f 6c 73 65 74  s5ParseSetColset
e620: 28 0a 20 20 46 74 73 35 50 61 72 73 65 20 2a 70  (.  Fts5Parse *p
e630: 50 61 72 73 65 2c 20 0a 20 20 46 74 73 35 45 78  Parse, .  Fts5Ex
e640: 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 2c 20 0a  prNode *pExpr, .
e650: 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
e660: 6f 6c 73 65 74 20 0a 29 7b 0a 20 20 46 74 73 35  olset .){.  Fts5
e670: 43 6f 6c 73 65 74 20 2a 70 46 72 65 65 20 3d 20  Colset *pFree = 
e680: 70 43 6f 6c 73 65 74 3b 0a 20 20 69 66 28 20 70  pColset;.  if( p
e690: 50 61 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Parse->pConfig->
e6a0: 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
e6b0: 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
e6c0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
e6d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
e6e0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 20 3d 20 73  pParse->zErr = s
e6f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
e700: 20 20 20 20 20 20 22 66 74 73 35 3a 20 63 6f 6c        "fts5: col
e710: 75 6d 6e 20 71 75 65 72 69 65 73 20 61 72 65 20  umn queries are 
e720: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 28 64  not supported (d
e730: 65 74 61 69 6c 3d 6e 6f 6e 65 29 22 0a 20 20 20  etail=none)".   
e740: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
e750: 20 66 74 73 35 50 61 72 73 65 53 65 74 43 6f 6c   fts5ParseSetCol
e760: 73 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  set(pParse, pExp
e770: 72 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 46 72  r, pColset, &pFr
e780: 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ee);.  }.  sqlit
e790: 65 33 5f 66 72 65 65 28 70 46 72 65 65 29 3b 0a  e3_free(pFree);.
e7a0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
e7b0: 74 73 35 45 78 70 72 41 73 73 69 67 6e 58 4e 65  ts5ExprAssignXNe
e7c0: 78 74 28 46 74 73 35 45 78 70 72 4e 6f 64 65 20  xt(Fts5ExprNode 
e7d0: 2a 70 4e 6f 64 65 29 7b 0a 20 20 73 77 69 74 63  *pNode){.  switc
e7e0: 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20  h( pNode->eType 
e7f0: 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53 35  ){.    case FTS5
e800: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
e810: 20 46 74 73 35 45 78 70 72 4e 65 61 72 73 65 74   Fts5ExprNearset
e820: 20 2a 70 4e 65 61 72 20 3d 20 70 4e 6f 64 65 2d   *pNear = pNode-
e830: 3e 70 4e 65 61 72 3b 0a 20 20 20 20 20 20 69 66  >pNear;.      if
e840: 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  ( pNear->nPhrase
e850: 3d 3d 31 20 26 26 20 70 4e 65 61 72 2d 3e 61 70  ==1 && pNear->ap
e860: 50 68 72 61 73 65 5b 30 5d 2d 3e 6e 54 65 72 6d  Phrase[0]->nTerm
e870: 3d 3d 31 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==1 .       && p
e880: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
e890: 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 53 79 6e  ]->aTerm[0].pSyn
e8a0: 6f 6e 79 6d 3d 3d 30 0a 20 20 20 20 20 20 20 26  onym==0.       &
e8b0: 26 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61 73  & pNear->apPhras
e8c0: 65 5b 30 5d 2d 3e 61 54 65 72 6d 5b 30 5d 2e 62  e[0]->aTerm[0].b
e8d0: 46 69 72 73 74 3d 3d 30 0a 20 20 20 20 20 20 29  First==0.      )
e8e0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d  {.        pNode-
e8f0: 3e 65 54 79 70 65 20 3d 20 46 54 53 35 5f 54 45  >eType = FTS5_TE
e900: 52 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64  RM;.        pNod
e910: 65 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45  e->xNext = fts5E
e920: 78 70 72 4e 6f 64 65 4e 65 78 74 5f 54 45 52 4d  xprNodeNext_TERM
e930: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e940: 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e         pNode->xN
e950: 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f  ext = fts5ExprNo
e960: 64 65 4e 65 78 74 5f 53 54 52 49 4e 47 3b 0a 20  deNext_STRING;. 
e970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
e980: 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20  ak;.    };..    
e990: 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20 7b 0a  case FTS5_OR: {.
e9a0: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 78 4e 65        pNode->xNe
e9b0: 78 74 20 3d 20 66 74 73 35 45 78 70 72 4e 6f 64  xt = fts5ExprNod
e9c0: 65 4e 65 78 74 5f 4f 52 3b 0a 20 20 20 20 20 20  eNext_OR;.      
e9d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 3b 0a 0a 20  break;.    };.. 
e9e0: 20 20 20 63 61 73 65 20 46 54 53 35 5f 41 4e 44     case FTS5_AND
e9f0: 3a 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  : {.      pNode-
ea00: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78 70  >xNext = fts5Exp
ea10: 72 4e 6f 64 65 4e 65 78 74 5f 41 4e 44 3b 0a 20  rNodeNext_AND;. 
ea20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ea30: 7d 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  };..    default:
ea40: 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
ea50: 65 54 79 70 65 3d 3d 46 54 53 35 5f 4e 4f 54 20  eType==FTS5_NOT 
ea60: 29 3b 20 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65  ); {.      pNode
ea70: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 45 78  ->xNext = fts5Ex
ea80: 70 72 4e 6f 64 65 4e 65 78 74 5f 4e 4f 54 3b 0a  prNodeNext_NOT;.
ea90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eaa0: 20 7d 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   };.  }.}..stati
eab0: 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72 41  c void fts5ExprA
eac0: 64 64 43 68 69 6c 64 72 65 6e 28 46 74 73 35 45  ddChildren(Fts5E
ead0: 78 70 72 4e 6f 64 65 20 2a 70 2c 20 46 74 73 35  xprNode *p, Fts5
eae0: 45 78 70 72 4e 6f 64 65 20 2a 70 53 75 62 29 7b  ExprNode *pSub){
eaf0: 0a 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 21  .  if( p->eType!
eb00: 3d 46 54 53 35 5f 4e 4f 54 20 26 26 20 70 53 75  =FTS5_NOT && pSu
eb10: 62 2d 3e 65 54 79 70 65 3d 3d 70 2d 3e 65 54 79  b->eType==p->eTy
eb20: 70 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  pe ){.    int nB
eb30: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
eb40: 35 45 78 70 72 4e 6f 64 65 2a 29 20 2a 20 70 53  5ExprNode*) * pS
eb50: 75 62 2d 3e 6e 43 68 69 6c 64 3b 0a 20 20 20 20  ub->nChild;.    
eb60: 6d 65 6d 63 70 79 28 26 70 2d 3e 61 70 43 68 69  memcpy(&p->apChi
eb70: 6c 64 5b 70 2d 3e 6e 43 68 69 6c 64 5d 2c 20 70  ld[p->nChild], p
eb80: 53 75 62 2d 3e 61 70 43 68 69 6c 64 2c 20 6e 42  Sub->apChild, nB
eb90: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 68  yte);.    p->nCh
eba0: 69 6c 64 20 2b 3d 20 70 53 75 62 2d 3e 6e 43 68  ild += pSub->nCh
ebb0: 69 6c 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ild;.    sqlite3
ebc0: 5f 66 72 65 65 28 70 53 75 62 29 3b 0a 20 20 7d  _free(pSub);.  }
ebd0: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61 70 43  else{.    p->apC
ebe0: 68 69 6c 64 5b 70 2d 3e 6e 43 68 69 6c 64 2b 2b  hild[p->nChild++
ebf0: 5d 20 3d 20 70 53 75 62 3b 0a 20 20 7d 0a 7d 0a  ] = pSub;.  }.}.
ec00: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
ec10: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
ec20: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62 6a 65   expression obje
ec30: 63 74 2e 20 49 66 20 61 6e 79 74 68 69 6e 67 20  ct. If anything 
ec40: 67 6f 65 73 20 77 72 6f 6e 67 20 28 69 2e 65 2e  goes wrong (i.e.
ec50: 0a 2a 2a 20 4f 4f 4d 20 65 72 72 6f 72 29 2c 20  .** OOM error), 
ec60: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
ec70: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
ec80: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
ec90: 2f 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  /.Fts5ExprNode *
eca0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
ecb0: 4e 6f 64 65 28 0a 20 20 46 74 73 35 50 61 72 73  Node(.  Fts5Pars
ecc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ecd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
ece0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
ecf0: 74 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  t eType,        
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed10: 20 46 54 53 35 5f 53 54 52 49 4e 47 2c 20 41 4e   FTS5_STRING, AN
ed20: 44 2c 20 4f 52 20 6f 72 20 4e 4f 54 20 2a 2f 0a  D, OR or NOT */.
ed30: 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a    Fts5ExprNode *
ed40: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
ed50: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 63    /* Left hand c
ed60: 68 69 6c 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hild expression 
ed70: 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  */.  Fts5ExprNod
ed80: 65 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20  e *pRight,      
ed90: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61       /* Right ha
eda0: 6e 64 20 63 68 69 6c 64 20 65 78 70 72 65 73 73  nd child express
edb0: 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78 70  ion */.  Fts5Exp
edc0: 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
edd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
ede0: 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f  STRING expressio
edf0: 6e 73 2c 20 74 68 65 20 6e 65 61 72 20 63 6c 75  ns, the near clu
ee00: 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ster */.){.  Fts
ee10: 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 65 74 20  5ExprNode *pRet 
ee20: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  = 0;..  if( pPar
ee30: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
ee40: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 68  K ){.    int nCh
ee50: 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
ee60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ee70: 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   of children of 
ee80: 72 65 74 75 72 6e 65 64 20 6e 6f 64 65 20 2a 2f  returned node */
ee90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
eea0: 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  64 nByte;       
eeb0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
eec0: 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
eed0: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 2a   for this node *
eee0: 2f 0a 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  /. .    assert( 
eef0: 28 65 54 79 70 65 21 3d 46 54 53 35 5f 53 54 52  (eType!=FTS5_STR
ef00: 49 4e 47 20 26 26 20 21 70 4e 65 61 72 29 0a 20  ING && !pNear). 
ef10: 20 20 20 20 20 20 20 20 7c 7c 20 28 65 54 79 70          || (eTyp
ef20: 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 26  e==FTS5_STRING &
ef30: 26 20 21 70 4c 65 66 74 20 26 26 20 21 70 52 69  & !pLeft && !pRi
ef40: 67 68 74 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  ght).    );.    
ef50: 69 66 28 20 65 54 79 70 65 3d 3d 46 54 53 35 5f  if( eType==FTS5_
ef60: 53 54 52 49 4e 47 20 26 26 20 70 4e 65 61 72 3d  STRING && pNear=
ef70: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ef80: 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 46 54     if( eType!=FT
ef90: 53 35 5f 53 54 52 49 4e 47 20 26 26 20 70 4c 65  S5_STRING && pLe
efa0: 66 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70  ft==0 ) return p
efb0: 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 65  Right;.    if( e
efc0: 54 79 70 65 21 3d 46 54 53 35 5f 53 54 52 49 4e  Type!=FTS5_STRIN
efd0: 47 20 26 26 20 70 52 69 67 68 74 3d 3d 30 20 29  G && pRight==0 )
efe0: 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 0a   return pLeft;..
eff0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 46      if( eType==F
f000: 54 53 35 5f 4e 4f 54 20 29 7b 0a 20 20 20 20 20  TS5_NOT ){.     
f010: 20 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20   nChild = 2;.   
f020: 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65   }else if( eType
f030: 3d 3d 46 54 53 35 5f 41 4e 44 20 7c 7c 20 65 54  ==FTS5_AND || eT
f040: 79 70 65 3d 3d 46 54 53 35 5f 4f 52 20 29 7b 0a  ype==FTS5_OR ){.
f050: 20 20 20 20 20 20 6e 43 68 69 6c 64 20 3d 20 32        nChild = 2
f060: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
f070: 74 2d 3e 65 54 79 70 65 3d 3d 65 54 79 70 65 20  t->eType==eType 
f080: 29 20 6e 43 68 69 6c 64 20 2b 3d 20 70 4c 65 66  ) nChild += pLef
f090: 74 2d 3e 6e 43 68 69 6c 64 2d 31 3b 0a 20 20 20  t->nChild-1;.   
f0a0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 65     if( pRight->e
f0b0: 54 79 70 65 3d 3d 65 54 79 70 65 20 29 20 6e 43  Type==eType ) nC
f0c0: 68 69 6c 64 20 2b 3d 20 70 52 69 67 68 74 2d 3e  hild += pRight->
f0d0: 6e 43 68 69 6c 64 2d 31 3b 0a 20 20 20 20 7d 0a  nChild-1;.    }.
f0e0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
f0f0: 65 6f 66 28 46 74 73 35 45 78 70 72 4e 6f 64 65  eof(Fts5ExprNode
f100: 29 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 35 45  ) + sizeof(Fts5E
f110: 78 70 72 4e 6f 64 65 2a 29 2a 28 6e 43 68 69 6c  xprNode*)*(nChil
f120: 64 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  d-1);.    pRet =
f130: 20 28 46 74 73 35 45 78 70 72 4e 6f 64 65 2a 29   (Fts5ExprNode*)
f140: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
f150: 63 5a 65 72 6f 28 26 70 50 61 72 73 65 2d 3e 72  cZero(&pParse->r
f160: 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20  c, nByte);..    
f170: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
f180: 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d 20    pRet->eType = 
f190: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 52 65  eType;.      pRe
f1a0: 74 2d 3e 70 4e 65 61 72 20 3d 20 70 4e 65 61 72  t->pNear = pNear
f1b0: 3b 0a 20 20 20 20 20 20 66 74 73 35 45 78 70 72  ;.      fts5Expr
f1c0: 41 73 73 69 67 6e 58 4e 65 78 74 28 70 52 65 74  AssignXNext(pRet
f1d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
f1e0: 70 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20  pe==FTS5_STRING 
f1f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
f200: 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20  Phrase;.        
f210: 66 6f 72 28 69 50 68 72 61 73 65 3d 30 3b 20 69  for(iPhrase=0; i
f220: 50 68 72 61 73 65 3c 70 4e 65 61 72 2d 3e 6e 50  Phrase<pNear->nP
f230: 68 72 61 73 65 3b 20 69 50 68 72 61 73 65 2b 2b  hrase; iPhrase++
f240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
f250: 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 50 68  ar->apPhrase[iPh
f260: 72 61 73 65 5d 2d 3e 70 4e 6f 64 65 20 3d 20 70  rase]->pNode = p
f270: 52 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Ret;.          i
f280: 66 28 20 70 4e 65 61 72 2d 3e 61 70 50 68 72 61  f( pNear->apPhra
f290: 73 65 5b 69 50 68 72 61 73 65 5d 2d 3e 6e 54 65  se[iPhrase]->nTe
f2a0: 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rm==0 ){.       
f2b0: 20 20 20 20 20 70 52 65 74 2d 3e 78 4e 65 78 74       pRet->xNext
f2c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f2d0: 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d 20    pRet->eType = 
f2e0: 46 54 53 35 5f 45 4f 46 3b 0a 20 20 20 20 20 20  FTS5_EOF;.      
f2f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
f300: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
f310: 72 73 65 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  rse->pConfig->eD
f320: 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
f330: 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
f340: 20 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72       Fts5ExprPhr
f350: 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
f360: 4e 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30  Near->apPhrase[0
f370: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
f380: 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 21   pNear->nPhrase!
f390: 3d 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  =1 .           |
f3a0: 7c 20 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d  | pPhrase->nTerm
f3b0: 3e 31 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  >1.           ||
f3c0: 20 28 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d   (pPhrase->nTerm
f3d0: 3e 30 20 26 26 20 70 50 68 72 61 73 65 2d 3e 61  >0 && pPhrase->a
f3e0: 54 65 72 6d 5b 30 5d 2e 62 46 69 72 73 74 29 0a  Term[0].bFirst).
f3f0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
f400: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
f410: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
f420: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
f430: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
f440: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
f450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
f460: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 7a 45 72  ert( pParse->zEr
f470: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r==0 );.        
f480: 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72      pParse->zErr
f490: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f4a0: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
f4b0: 20 20 20 20 22 66 74 73 35 3a 20 25 73 20 71 75      "fts5: %s qu
f4c0: 65 72 69 65 73 20 61 72 65 20 6e 6f 74 20 73 75  eries are not su
f4d0: 70 70 6f 72 74 65 64 20 28 64 65 74 61 69 6c 21  pported (detail!
f4e0: 3d 66 75 6c 6c 29 22 2c 20 0a 20 20 20 20 20 20  =full)", .      
f4f0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 61 72 2d            pNear-
f500: 3e 6e 50 68 72 61 73 65 3d 3d 31 20 3f 20 22 70  >nPhrase==1 ? "p
f510: 68 72 61 73 65 22 3a 20 22 4e 45 41 52 22 0a 20  hrase": "NEAR". 
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
f530: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
f540: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
f550: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
f560: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
f570: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
f580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f590: 20 20 20 66 74 73 35 45 78 70 72 41 64 64 43 68     fts5ExprAddCh
f5a0: 69 6c 64 72 65 6e 28 70 52 65 74 2c 20 70 4c 65  ildren(pRet, pLe
f5b0: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ft);.        fts
f5c0: 35 45 78 70 72 41 64 64 43 68 69 6c 64 72 65 6e  5ExprAddChildren
f5d0: 28 70 52 65 74 2c 20 70 52 69 67 68 74 29 3b 0a  (pRet, pRight);.
f5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f5f0: 7d 0a 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  }..  if( pRet==0
f600: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f610: 70 50 61 72 73 65 2d 3e 72 63 21 3d 53 51 4c 49  pParse->rc!=SQLI
f620: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c  TE_OK );.    sql
f630: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64  ite3Fts5ParseNod
f640: 65 46 72 65 65 28 70 4c 65 66 74 29 3b 0a 20 20  eFree(pLeft);.  
f650: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72    sqlite3Fts5Par
f660: 73 65 4e 6f 64 65 46 72 65 65 28 70 52 69 67 68  seNodeFree(pRigh
f670: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  t);.    sqlite3F
f680: 74 73 35 50 61 72 73 65 4e 65 61 72 73 65 74 46  ts5ParseNearsetF
f690: 72 65 65 28 70 4e 65 61 72 29 3b 0a 20 20 7d 0a  ree(pNear);.  }.
f6a0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
f6b0: 0a 0a 46 74 73 35 45 78 70 72 4e 6f 64 65 20 2a  ..Fts5ExprNode *
f6c0: 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65  sqlite3Fts5Parse
f6d0: 49 6d 70 6c 69 63 69 74 41 6e 64 28 0a 20 20 46  ImplicitAnd(.  F
f6e0: 74 73 35 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts5Parse *pParse
f6f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f700: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
f710: 2a 2f 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64  */.  Fts5ExprNod
f720: 65 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  e *pLeft,       
f730: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e       /* Left han
f740: 64 20 63 68 69 6c 64 20 65 78 70 72 65 73 73 69  d child expressi
f750: 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 45 78 70 72  on */.  Fts5Expr
f760: 4e 6f 64 65 20 2a 70 52 69 67 68 74 20 20 20 20  Node *pRight    
f770: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
f780: 20 68 61 6e 64 20 63 68 69 6c 64 20 65 78 70 72   hand child expr
f790: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 46  ession */.){.  F
f7a0: 74 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 52 65  ts5ExprNode *pRe
f7b0: 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 45 78 70  t = 0;.  Fts5Exp
f7c0: 72 4e 6f 64 65 20 2a 70 50 72 65 76 3b 0a 0a 20  rNode *pPrev;.. 
f7d0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 20   if( pParse->rc 
f7e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
f7f0: 73 35 50 61 72 73 65 4e 6f 64 65 46 72 65 65 28  s5ParseNodeFree(
f800: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
f810: 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65  te3Fts5ParseNode
f820: 46 72 65 65 28 70 52 69 67 68 74 29 3b 0a 20 20  Free(pRight);.  
f830: 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 61 73 73 65  }else{..    asse
f840: 72 74 28 20 70 4c 65 66 74 2d 3e 65 54 79 70 65  rt( pLeft->eType
f850: 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 0a 20  ==FTS5_STRING . 
f860: 20 20 20 20 20 20 20 7c 7c 20 70 4c 65 66 74 2d         || pLeft-
f870: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
f880: 4d 0a 20 20 20 20 20 20 20 20 7c 7c 20 70 4c 65  M.        || pLe
f890: 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  ft->eType==FTS5_
f8a0: 45 4f 46 0a 20 20 20 20 20 20 20 20 7c 7c 20 70  EOF.        || p
f8b0: 4c 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Left->eType==FTS
f8c0: 35 5f 41 4e 44 0a 20 20 20 20 29 3b 0a 20 20 20  5_AND.    );.   
f8d0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
f8e0: 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52  >eType==FTS5_STR
f8f0: 49 4e 47 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  ING .        || 
f900: 70 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46  pRight->eType==F
f910: 54 53 35 5f 54 45 52 4d 20 0a 20 20 20 20 20 20  TS5_TERM .      
f920: 20 20 7c 7c 20 70 52 69 67 68 74 2d 3e 65 54 79    || pRight->eTy
f930: 70 65 3d 3d 46 54 53 35 5f 45 4f 46 20 0a 20 20  pe==FTS5_EOF .  
f940: 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c    );..    if( pL
f950: 65 66 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35  eft->eType==FTS5
f960: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 70 50  _AND ){.      pP
f970: 72 65 76 20 3d 20 70 4c 65 66 74 2d 3e 61 70 43  rev = pLeft->apC
f980: 68 69 6c 64 5b 70 4c 65 66 74 2d 3e 6e 43 68 69  hild[pLeft->nChi
f990: 6c 64 2d 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  ld-1];.    }else
f9a0: 7b 0a 20 20 20 20 20 20 70 50 72 65 76 20 3d 20  {.      pPrev = 
f9b0: 70 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pLeft;.    }.   
f9c0: 20 61 73 73 65 72 74 28 20 70 50 72 65 76 2d 3e   assert( pPrev->
f9d0: 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54 52 49  eType==FTS5_STRI
f9e0: 4e 47 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 70  NG .        || p
f9f0: 50 72 65 76 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Prev->eType==FTS
fa00: 35 5f 54 45 52 4d 20 0a 20 20 20 20 20 20 20 20  5_TERM .        
fa10: 7c 7c 20 70 50 72 65 76 2d 3e 65 54 79 70 65 3d  || pPrev->eType=
fa20: 3d 46 54 53 35 5f 45 4f 46 20 0a 20 20 20 20 20  =FTS5_EOF .     
fa30: 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70     );..    if( p
fa40: 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46 54  Right->eType==FT
fa50: 53 35 5f 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  S5_EOF ){.      
fa60: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
fa70: 61 70 50 68 72 61 73 65 5b 70 50 61 72 73 65 2d  apPhrase[pParse-
fa80: 3e 6e 50 68 72 61 73 65 2d 31 5d 3d 3d 70 52 69  >nPhrase-1]==pRi
fa90: 67 68 74 2d 3e 70 4e 65 61 72 2d 3e 61 70 50 68  ght->pNear->apPh
faa0: 72 61 73 65 5b 30 5d 20 29 3b 0a 20 20 20 20 20  rase[0] );.     
fab0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 61 72 73   sqlite3Fts5Pars
fac0: 65 4e 6f 64 65 46 72 65 65 28 70 52 69 67 68 74  eNodeFree(pRight
fad0: 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
fae0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 50 61  pLeft;.      pPa
faf0: 72 73 65 2d 3e 6e 50 68 72 61 73 65 2d 2d 3b 0a  rse->nPhrase--;.
fb00: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
fb10: 66 28 20 70 50 72 65 76 2d 3e 65 54 79 70 65 3d  f( pPrev->eType=
fb20: 3d 46 54 53 35 5f 45 4f 46 20 29 7b 0a 20 20 20  =FTS5_EOF ){.   
fb30: 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
fb40: 65 20 2a 2a 61 70 3b 0a 0a 20 20 20 20 20 20 69  e **ap;..      i
fb50: 66 28 20 70 50 72 65 76 3d 3d 70 4c 65 66 74 20  f( pPrev==pLeft 
fb60: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20  ){.        pRet 
fb70: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
fb80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
fb90: 4c 65 66 74 2d 3e 61 70 43 68 69 6c 64 5b 70 4c  Left->apChild[pL
fba0: 65 66 74 2d 3e 6e 43 68 69 6c 64 2d 31 5d 20 3d  eft->nChild-1] =
fbb0: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
fbc0: 20 70 52 65 74 20 3d 20 70 4c 65 66 74 3b 0a 20   pRet = pLeft;. 
fbd0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 70       }..      ap
fbe0: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 70 50 68   = &pParse->apPh
fbf0: 72 61 73 65 5b 70 50 61 72 73 65 2d 3e 6e 50 68  rase[pParse->nPh
fc00: 72 61 73 65 2d 31 2d 70 52 69 67 68 74 2d 3e 70  rase-1-pRight->p
fc10: 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65 5d 3b 0a  Near->nPhrase];.
fc20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
fc30: 5b 30 5d 3d 3d 70 50 72 65 76 2d 3e 70 4e 65 61  [0]==pPrev->pNea
fc40: 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 20 29  r->apPhrase[0] )
fc50: 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
fc60: 61 70 2c 20 26 61 70 5b 31 5d 2c 20 73 69 7a 65  ap, &ap[1], size
fc70: 6f 66 28 46 74 73 35 45 78 70 72 50 68 72 61 73  of(Fts5ExprPhras
fc80: 65 2a 29 2a 70 52 69 67 68 74 2d 3e 70 4e 65 61  e*)*pRight->pNea
fc90: 72 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20 20 20  r->nPhrase);.   
fca0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 50 68 72 61     pParse->nPhra
fcb0: 73 65 2d 2d 3b 0a 0a 20 20 20 20 20 20 73 71 6c  se--;..      sql
fcc0: 69 74 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64  ite3Fts5ParseNod
fcd0: 65 46 72 65 65 28 70 50 72 65 76 29 3b 0a 20 20  eFree(pPrev);.  
fce0: 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
fcf0: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
fd00: 65 33 46 74 73 35 50 61 72 73 65 4e 6f 64 65 28  e3Fts5ParseNode(
fd10: 70 50 61 72 73 65 2c 20 46 54 53 35 5f 41 4e 44  pParse, FTS5_AND
fd20: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
fd30: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
fd40: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
fd50: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66  ..static char *f
fd60: 74 73 35 45 78 70 72 54 65 72 6d 50 72 69 6e 74  ts5ExprTermPrint
fd70: 28 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a 70  (Fts5ExprTerm *p
fd80: 54 65 72 6d 29 7b 0a 20 20 73 71 6c 69 74 65 33  Term){.  sqlite3
fd90: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 30  _int64 nByte = 0
fda0: 3b 0a 20 20 46 74 73 35 45 78 70 72 54 65 72 6d  ;.  Fts5ExprTerm
fdb0: 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75   *p;.  char *zQu
fdc0: 6f 74 65 64 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  oted;..  /* Dete
fdd0: 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75  rmine the maximu
fde0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  m amount of spac
fdf0: 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  e required. */. 
fe00: 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20 70 3b   for(p=pTerm; p;
fe10: 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d 29 7b   p=p->pSynonym){
fe20: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 28 69  .    nByte += (i
fe30: 6e 74 29 73 74 72 6c 65 6e 28 70 54 65 72 6d 2d  nt)strlen(pTerm-
fe40: 3e 7a 54 65 72 6d 29 20 2a 20 32 20 2b 20 33 20  >zTerm) * 2 + 3 
fe50: 2b 20 32 3b 0a 20 20 7d 0a 20 20 7a 51 75 6f 74  + 2;.  }.  zQuot
fe60: 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
fe70: 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 0a 20  loc64(nByte);.. 
fe80: 20 69 66 28 20 7a 51 75 6f 74 65 64 20 29 7b 0a   if( zQuoted ){.
fe90: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
fea0: 20 20 20 66 6f 72 28 70 3d 70 54 65 72 6d 3b 20     for(p=pTerm; 
feb0: 70 3b 20 70 3d 70 2d 3e 70 53 79 6e 6f 6e 79 6d  p; p=p->pSynonym
fec0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
fed0: 49 6e 20 3d 20 70 2d 3e 7a 54 65 72 6d 3b 0a 20  In = p->zTerm;. 
fee0: 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b       zQuoted[i++
fef0: 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 77  ] = '"';.      w
ff00: 68 69 6c 65 28 20 2a 7a 49 6e 20 29 7b 0a 20 20  hile( *zIn ){.  
ff10: 20 20 20 20 20 20 69 66 28 20 2a 7a 49 6e 3d 3d        if( *zIn==
ff20: 27 22 27 20 29 20 7a 51 75 6f 74 65 64 5b 69 2b  '"' ) zQuoted[i+
ff30: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20  +] = '"';.      
ff40: 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20 3d    zQuoted[i++] =
ff50: 20 2a 7a 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d   *zIn++;.      }
ff60: 0a 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69  .      zQuoted[i
ff70: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 20 20 20  ++] = '"';.     
ff80: 20 69 66 28 20 70 2d 3e 70 53 79 6e 6f 6e 79 6d   if( p->pSynonym
ff90: 20 29 20 7a 51 75 6f 74 65 64 5b 69 2b 2b 5d 20   ) zQuoted[i++] 
ffa0: 3d 20 27 7c 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '|';.    }.   
ffb0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 62 50 72 65   if( pTerm->bPre
ffc0: 66 69 78 20 29 7b 0a 20 20 20 20 20 20 7a 51 75  fix ){.      zQu
ffd0: 6f 74 65 64 5b 69 2b 2b 5d 20 3d 20 27 20 27 3b  oted[i++] = ' ';
ffe0: 0a 20 20 20 20 20 20 7a 51 75 6f 74 65 64 5b 69  .      zQuoted[i
fff0: 2b 2b 5d 20 3d 20 27 2a 27 3b 0a 20 20 20 20 7d  ++] = '*';.    }
10000 0a 20 20 20 20 7a 51 75 6f 74 65 64 5b 69 2b 2b  .    zQuoted[i++
10010 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
10020 72 65 74 75 72 6e 20 7a 51 75 6f 74 65 64 3b 0a  return zQuoted;.
10030 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
10040 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64  fts5PrintfAppend
10050 28 63 68 61 72 20 2a 7a 41 70 70 2c 20 63 6f 6e  (char *zApp, con
10060 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
10070 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65  ..){.  char *zNe
10080 77 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  w;.  va_list ap;
10090 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
100a0 7a 46 6d 74 29 3b 0a 20 20 7a 4e 65 77 20 3d 20  zFmt);.  zNew = 
100b0 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
100c0 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61  (zFmt, ap);.  va
100d0 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
100e0 7a 41 70 70 20 26 26 20 7a 4e 65 77 20 29 7b 0a  zApp && zNew ){.
100f0 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 32 20      char *zNew2 
10100 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10110 66 28 22 25 73 25 73 22 2c 20 7a 41 70 70 2c 20  f("%s%s", zApp, 
10120 7a 4e 65 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  zNew);.    sqlit
10130 65 33 5f 66 72 65 65 28 7a 4e 65 77 29 3b 0a 20  e3_free(zNew);. 
10140 20 20 20 7a 4e 65 77 20 3d 20 7a 4e 65 77 32 3b     zNew = zNew2;
10150 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
10160 72 65 65 28 7a 41 70 70 29 3b 0a 20 20 72 65 74  ree(zApp);.  ret
10170 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn zNew;.}../*.
10180 2a 2a 20 43 6f 6d 70 6f 73 65 20 61 20 74 63 6c  ** Compose a tcl
10190 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73  -readable repres
101a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 65 78 70 72  entation of expr
101b0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 52 65  ession pExpr. Re
101c0 74 75 72 6e 20 61 20 0a 2a 2a 20 70 6f 69 6e 74  turn a .** point
101d0 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
101e0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 61 74 20 72  ontaining that r
101f0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 49  epresentation. I
10200 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
10210 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
10220 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 74 20  he caller to at 
10230 73 6f 6d 65 20 70 6f 69 6e 74 20 66 72 65 65 20  some point free 
10240 74 68 65 20 62 75 66 66 65 72 20 75 73 69 6e 67  the buffer using
10250 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65   .** sqlite3_fre
10260 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
10270 68 61 72 20 2a 66 74 73 35 45 78 70 72 50 72 69  har *fts5ExprPri
10280 6e 74 54 63 6c 28 0a 20 20 46 74 73 35 43 6f 6e  ntTcl(.  Fts5Con
10290 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20  fig *pConfig, . 
102a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
102b0 61 72 73 65 74 43 6d 64 2c 0a 20 20 46 74 73 35  arsetCmd,.  Fts5
102c0 45 78 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 0a  ExprNode *pExpr.
102d0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  ){.  char *zRet 
102e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  = 0;.  if( pExpr
102f0 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 53 54  ->eType==FTS5_ST
10300 52 49 4e 47 20 7c 7c 20 70 45 78 70 72 2d 3e 65  RING || pExpr->e
10310 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52 4d 20  Type==FTS5_TERM 
10320 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70 72 4e  ){.    Fts5ExprN
10330 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20 3d 20  earset *pNear = 
10340 70 45 78 70 72 2d 3e 70 4e 65 61 72 3b 0a 20 20  pExpr->pNear;.  
10350 20 20 69 6e 74 20 69 3b 20 0a 20 20 20 20 69 6e    int i; .    in
10360 74 20 69 54 65 72 6d 3b 0a 0a 20 20 20 20 7a 52  t iTerm;..    zR
10370 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41  et = fts5PrintfA
10380 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 25 73 20  ppend(zRet, "%s 
10390 22 2c 20 7a 4e 65 61 72 73 65 74 43 6d 64 29 3b  ", zNearsetCmd);
103a0 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
103b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
103c0 20 69 66 28 20 70 4e 65 61 72 2d 3e 70 43 6f 6c   if( pNear->pCol
103d0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  set ){.      int
103e0 20 2a 61 69 43 6f 6c 20 3d 20 70 4e 65 61 72 2d   *aiCol = pNear-
103f0 3e 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b  >pColset->aiCol;
10400 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  .      int nCol 
10410 3d 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  = pNear->pColset
10420 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66  ->nCol;.      if
10430 28 20 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20  ( nCol==1 ){.   
10440 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35       zRet = fts5
10450 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65  PrintfAppend(zRe
10460 74 2c 20 22 2d 63 6f 6c 20 25 64 20 22 2c 20 61  t, "-col %d ", a
10470 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20  iCol[0]);.      
10480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
10490 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66  Ret = fts5Printf
104a0 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 2d 63  Append(zRet, "-c
104b0 6f 6c 20 7b 25 64 22 2c 20 61 69 43 6f 6c 5b 30  ol {%d", aiCol[0
104c0 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ]);.        for(
104d0 69 3d 31 3b 20 69 3c 70 4e 65 61 72 2d 3e 70 43  i=1; i<pNear->pC
104e0 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  olset->nCol; i++
104f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65  ){.          zRe
10500 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70  t = fts5PrintfAp
10510 70 65 6e 64 28 7a 52 65 74 2c 20 22 20 25 64 22  pend(zRet, " %d"
10520 2c 20 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , aiCol[i]);.   
10530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
10540 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e 74 66  Ret = fts5Printf
10550 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22 7d 20  Append(zRet, "} 
10560 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
10570 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20    if( zRet==0 ) 
10580 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
10590 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72 2d 3e  .    if( pNear->
105a0 6e 50 68 72 61 73 65 3e 31 20 29 7b 0a 20 20 20  nPhrase>1 ){.   
105b0 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72     zRet = fts5Pr
105c0 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c  intfAppend(zRet,
105d0 20 22 2d 6e 65 61 72 20 25 64 20 22 2c 20 70 4e   "-near %d ", pN
105e0 65 61 72 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20 20  ear->nNear);.   
105f0 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29     if( zRet==0 )
10600 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10610 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73  ..    zRet = fts
10620 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
10630 65 74 2c 20 22 2d 2d 22 29 3b 0a 20 20 20 20 69  et, "--");.    i
10640 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72 65 74  f( zRet==0 ) ret
10650 75 72 6e 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28  urn 0;..    for(
10660 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e 50  i=0; i<pNear->nP
10670 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  hrase; i++){.   
10680 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61 73     Fts5ExprPhras
10690 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e 65  e *pPhrase = pNe
106a0 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d 3b  ar->apPhrase[i];
106b0 0a 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66  ..      zRet = f
106c0 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28  ts5PrintfAppend(
106d0 7a 52 65 74 2c 20 22 20 7b 22 29 3b 0a 20 20 20  zRet, " {");.   
106e0 20 20 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20     for(iTerm=0; 
106f0 7a 52 65 74 20 26 26 20 69 54 65 72 6d 3c 70 50  zRet && iTerm<pP
10700 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b 20 69 54  hrase->nTerm; iT
10710 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
10720 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70 50  char *zTerm = pP
10730 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54 65  hrase->aTerm[iTe
10740 72 6d 5d 2e 7a 54 65 72 6d 3b 0a 20 20 20 20 20  rm].zTerm;.     
10750 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72     zRet = fts5Pr
10760 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c  intfAppend(zRet,
10770 20 22 25 73 25 73 22 2c 20 69 54 65 72 6d 3d 3d   "%s%s", iTerm==
10780 30 3f 22 22 3a 22 20 22 2c 20 7a 54 65 72 6d 29  0?"":" ", zTerm)
10790 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
107a0 68 72 61 73 65 2d 3e 61 54 65 72 6d 5b 69 54 65  hrase->aTerm[iTe
107b0 72 6d 5d 2e 62 50 72 65 66 69 78 20 29 7b 0a 20  rm].bPrefix ){. 
107c0 20 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20           zRet = 
107d0 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64  fts5PrintfAppend
107e0 28 7a 52 65 74 2c 20 22 2a 22 29 3b 0a 20 20 20  (zRet, "*");.   
107f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
10800 20 20 20 20 20 20 69 66 28 20 7a 52 65 74 20 29        if( zRet )
10810 20 7a 52 65 74 20 3d 20 66 74 73 35 50 72 69 6e   zRet = fts5Prin
10820 74 66 41 70 70 65 6e 64 28 7a 52 65 74 2c 20 22  tfAppend(zRet, "
10830 7d 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  }");.      if( z
10840 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ret==0 ) return 
10850 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  0;.    }..  }els
10860 65 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  e{.    char cons
10870 74 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 20 20  t *zOp = 0;.    
10880 69 6e 74 20 69 3b 0a 20 20 20 20 73 77 69 74 63  int i;.    switc
10890 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 20  h( pExpr->eType 
108a0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 46 54  ){.      case FT
108b0 53 35 5f 41 4e 44 3a 20 7a 4f 70 20 3d 20 22 41  S5_AND: zOp = "A
108c0 4e 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ND"; break;.    
108d0 20 20 63 61 73 65 20 46 54 53 35 5f 4e 4f 54 3a    case FTS5_NOT:
108e0 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 62 72   zOp = "NOT"; br
108f0 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
10900 6c 74 3a 20 0a 20 20 20 20 20 20 20 20 61 73 73  lt: .        ass
10910 65 72 74 28 20 70 45 78 70 72 2d 3e 65 54 79 70  ert( pExpr->eTyp
10920 65 3d 3d 46 54 53 35 5f 4f 52 20 29 3b 0a 20 20  e==FTS5_OR );.  
10930 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22        zOp = "OR"
10940 3b 20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ; .        break
10950 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65  ;.    }..    zRe
10960 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
10970 6e 74 66 28 22 25 73 22 2c 20 7a 4f 70 29 3b 0a  ntf("%s", zOp);.
10980 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 52 65      for(i=0; zRe
10990 74 20 26 26 20 69 3c 70 45 78 70 72 2d 3e 6e 43  t && i<pExpr->nC
109a0 68 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  hild; i++){.    
109b0 20 20 63 68 61 72 20 2a 7a 20 3d 20 66 74 73 35    char *z = fts5
109c0 45 78 70 72 50 72 69 6e 74 54 63 6c 28 70 43 6f  ExprPrintTcl(pCo
109d0 6e 66 69 67 2c 20 7a 4e 65 61 72 73 65 74 43 6d  nfig, zNearsetCm
109e0 64 2c 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c  d, pExpr->apChil
109f0 64 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  d[i]);.      if(
10a00 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 73   !z ){.        s
10a10 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 74  qlite3_free(zRet
10a20 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20  );.        zRet 
10a30 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
10a40 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d  {.        zRet =
10a50 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65 6e   fts5PrintfAppen
10a60 64 28 7a 52 65 74 2c 20 22 20 5b 25 7a 5d 22 2c  d(zRet, " [%z]",
10a70 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   z);.      }.   
10a80 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
10a90 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63   zRet;.}..static
10aa0 20 63 68 61 72 20 2a 66 74 73 35 45 78 70 72 50   char *fts5ExprP
10ab0 72 69 6e 74 28 46 74 73 35 43 6f 6e 66 69 67 20  rint(Fts5Config 
10ac0 2a 70 43 6f 6e 66 69 67 2c 20 46 74 73 35 45 78  *pConfig, Fts5Ex
10ad0 70 72 4e 6f 64 65 20 2a 70 45 78 70 72 29 7b 0a  prNode *pExpr){.
10ae0 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30    char *zRet = 0
10af0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65  ;.  if( pExpr->e
10b00 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Type==0 ){.    r
10b10 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70  eturn sqlite3_mp
10b20 72 69 6e 74 66 28 22 5c 22 5c 22 22 29 3b 0a 20  rintf("\"\"");. 
10b30 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 45 78   }else.  if( pEx
10b40 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f  pr->eType==FTS5_
10b50 53 54 52 49 4e 47 20 7c 7c 20 70 45 78 70 72 2d  STRING || pExpr-
10b60 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
10b70 4d 20 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70  M ){.    Fts5Exp
10b80 72 4e 65 61 72 73 65 74 20 2a 70 4e 65 61 72 20  rNearset *pNear 
10b90 3d 20 70 45 78 70 72 2d 3e 70 4e 65 61 72 3b 0a  = pExpr->pNear;.
10ba0 20 20 20 20 69 6e 74 20 69 3b 20 0a 20 20 20 20      int i; .    
10bb0 69 6e 74 20 69 54 65 72 6d 3b 0a 0a 20 20 20 20  int iTerm;..    
10bc0 69 66 28 20 70 4e 65 61 72 2d 3e 70 43 6f 6c 73  if( pNear->pCols
10bd0 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
10be0 69 43 6f 6c 20 3d 20 70 4e 65 61 72 2d 3e 70 43  iCol = pNear->pC
10bf0 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 3b  olset->aiCol[0];
10c00 0a 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74  .      zRet = ft
10c10 73 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a  s5PrintfAppend(z
10c20 52 65 74 2c 20 22 25 73 20 3a 20 22 2c 20 70 43  Ret, "%s : ", pC
10c30 6f 6e 66 69 67 2d 3e 61 7a 43 6f 6c 5b 69 43 6f  onfig->azCol[iCo
10c40 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  l]);.      if( z
10c50 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ret==0 ) return 
10c60 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
10c70 28 20 70 4e 65 61 72 2d 3e 6e 50 68 72 61 73 65  ( pNear->nPhrase
10c80 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 74  >1 ){.      zRet
10c90 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
10ca0 65 6e 64 28 7a 52 65 74 2c 20 22 4e 45 41 52 28  end(zRet, "NEAR(
10cb0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ");.      if( zR
10cc0 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  et==0 ) return 0
10cd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
10ce0 28 69 3d 30 3b 20 69 3c 70 4e 65 61 72 2d 3e 6e  (i=0; i<pNear->n
10cf0 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20  Phrase; i++){.  
10d00 20 20 20 20 46 74 73 35 45 78 70 72 50 68 72 61      Fts5ExprPhra
10d10 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 4e  se *pPhrase = pN
10d20 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 69 5d  ear->apPhrase[i]
10d30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 30  ;.      if( i!=0
10d40 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
10d50 20 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70   = fts5PrintfApp
10d60 65 6e 64 28 7a 52 65 74 2c 20 22 20 22 29 3b 0a  end(zRet, " ");.
10d70 20 20 20 20 20 20 20 20 69 66 28 20 7a 52 65 74          if( zRet
10d80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
10da0 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
10db0 3c 70 50 68 72 61 73 65 2d 3e 6e 54 65 72 6d 3b  <pPhrase->nTerm;
10dc0 20 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   iTerm++){.     
10dd0 20 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d     char *zTerm =
10de0 20 66 74 73 35 45 78 70 72 54 65 72 6d 50 72 69   fts5ExprTermPri
10df0 6e 74 28 26 70 50 68 72 61 73 65 2d 3e 61 54 65  nt(&pPhrase->aTe
10e00 72 6d 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20  rm[iTerm]);.    
10e10 20 20 20 20 69 66 28 20 7a 54 65 72 6d 20 29 7b      if( zTerm ){
10e20 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 74 20  .          zRet 
10e30 3d 20 66 74 73 35 50 72 69 6e 74 66 41 70 70 65  = fts5PrintfAppe
10e40 6e 64 28 7a 52 65 74 2c 20 22 25 73 25 73 22 2c  nd(zRet, "%s%s",
10e50 20 69 54 65 72 6d 3d 3d 30 3f 22 22 3a 22 20 2b   iTerm==0?"":" +
10e60 20 22 2c 20 7a 54 65 72 6d 29 3b 0a 20 20 20 20   ", zTerm);.    
10e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10e80 65 65 28 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  ee(zTerm);.     
10e90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10ea0 20 7a 54 65 72 6d 3d 3d 30 20 7c 7c 20 7a 52 65   zTerm==0 || zRe
10eb0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
10ec0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10ed0 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ret);.          
10ee0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
10ef0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10f00 7d 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 61 72  }..    if( pNear
10f10 2d 3e 6e 50 68 72 61 73 65 3e 31 20 29 7b 0a 20  ->nPhrase>1 ){. 
10f20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73 35       zRet = fts5
10f30 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52 65  PrintfAppend(zRe
10f40 74 2c 20 22 2c 20 25 64 29 22 2c 20 70 4e 65 61  t, ", %d)", pNea
10f50 72 2d 3e 6e 4e 65 61 72 29 3b 0a 20 20 20 20 20  r->nNear);.     
10f60 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 72   if( zRet==0 ) r
10f70 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
10f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
10f90 72 20 63 6f 6e 73 74 20 2a 7a 4f 70 20 3d 20 30  r const *zOp = 0
10fa0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ;.    int i;..  
10fb0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
10fc0 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  >eType ){.      
10fd0 63 61 73 65 20 46 54 53 35 5f 41 4e 44 3a 20 7a  case FTS5_AND: z
10fe0 4f 70 20 3d 20 22 20 41 4e 44 20 22 3b 20 62 72  Op = " AND "; br
10ff0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
11000 46 54 53 35 5f 4e 4f 54 3a 20 7a 4f 70 20 3d 20  FTS5_NOT: zOp = 
11010 22 20 4e 4f 54 20 22 3b 20 62 72 65 61 6b 3b 0a  " NOT "; break;.
11020 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
11030 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11040 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46   pExpr->eType==F
11050 54 53 35 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  TS5_OR );.      
11060 20 20 7a 4f 70 20 3d 20 22 20 4f 52 20 22 3b 20    zOp = " OR "; 
11070 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
11080 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
11090 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 6e 43 68  =0; i<pExpr->nCh
110a0 69 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ild; i++){.     
110b0 20 63 68 61 72 20 2a 7a 20 3d 20 66 74 73 35 45   char *z = fts5E
110c0 78 70 72 50 72 69 6e 74 28 70 43 6f 6e 66 69 67  xprPrint(pConfig
110d0 2c 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c 64  , pExpr->apChild
110e0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
110f0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
11100 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65  sqlite3_free(zRe
11110 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  t);.        zRet
11120 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
11130 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  e{.        int e
11140 20 3d 20 70 45 78 70 72 2d 3e 61 70 43 68 69 6c   = pExpr->apChil
11150 64 5b 69 5d 2d 3e 65 54 79 70 65 3b 0a 20 20 20  d[i]->eType;.   
11160 20 20 20 20 20 69 6e 74 20 62 20 3d 20 28 65 21       int b = (e!
11170 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 26 26 20  =FTS5_STRING && 
11180 65 21 3d 46 54 53 35 5f 54 45 52 4d 20 26 26 20  e!=FTS5_TERM && 
11190 65 21 3d 46 54 53 35 5f 45 4f 46 29 3b 0a 20 20  e!=FTS5_EOF);.  
111a0 20 20 20 20 20 20 7a 52 65 74 20 3d 20 66 74 73        zRet = fts
111b0 35 50 72 69 6e 74 66 41 70 70 65 6e 64 28 7a 52  5PrintfAppend(zR
111c0 65 74 2c 20 22 25 73 25 73 25 7a 25 73 22 2c 20  et, "%s%s%z%s", 
111d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 69 3d  .            (i=
111e0 3d 30 20 3f 20 22 22 20 3a 20 7a 4f 70 29 2c 0a  =0 ? "" : zOp),.
111f0 20 20 20 20 20 20 20 20 20 20 20 20 28 62 3f 22              (b?"
11200 28 22 3a 22 22 29 2c 20 7a 2c 20 28 62 3f 22 29  (":""), z, (b?")
11210 22 3a 22 22 29 0a 20 20 20 20 20 20 20 20 29 3b  ":"").        );
11220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11230 66 28 20 7a 52 65 74 3d 3d 30 20 29 20 62 72 65  f( zRet==0 ) bre
11240 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11250 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
11260 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
11270 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65  mentation of use
11280 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
11290 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 35 5f   functions fts5_
112a0 65 78 70 72 28 29 20 28 62 54 63 6c 3d 3d 30 29  expr() (bTcl==0)
112b0 0a 2a 2a 20 61 6e 64 20 66 74 73 35 5f 65 78 70  .** and fts5_exp
112c0 72 5f 74 63 6c 28 29 20 28 62 54 63 6c 21 3d 30  r_tcl() (bTcl!=0
112d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
112e0 64 20 66 74 73 35 45 78 70 72 46 75 6e 63 74 69  d fts5ExprFuncti
112f0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
11300 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
11310 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
11320 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
11330 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11360 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74   args */.  sqlit
11370 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
11380 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
11390 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
113a0 20 2a 2f 0a 20 20 69 6e 74 20 62 54 63 6c 0a 29   */.  int bTcl.)
113b0 7b 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a  {.  Fts5Global *
113c0 70 47 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35 47  pGlobal = (Fts5G
113d0 6c 6f 62 61 6c 2a 29 73 71 6c 69 74 65 33 5f 75  lobal*)sqlite3_u
113e0 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
113f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11400 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
11410 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b  db_handle(pCtx);
11420 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11430 45 78 70 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  Expr = 0;.  char
11440 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 46 74   *zErr = 0;.  Ft
11450 73 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20  s5Expr *pExpr = 
11460 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  0;.  int rc;.  i
11470 6e 74 20 69 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  nt i;..  const c
11480 68 61 72 20 2a 2a 61 7a 43 6f 6e 66 69 67 3b 20  har **azConfig; 
11490 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
114a0 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66  y of arguments f
114b0 6f 72 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 2f  or Fts5Config */
114c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
114d0 4e 65 61 72 73 65 74 43 6d 64 20 3d 20 22 6e 65  NearsetCmd = "ne
114e0 61 72 73 65 74 22 3b 0a 20 20 69 6e 74 20 6e 43  arset";.  int nC
114f0 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20  onfig;          
11500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
11510 65 20 6f 66 20 61 7a 43 6f 6e 66 69 67 5b 5d 20  e of azConfig[] 
11520 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
11530 2a 70 43 6f 6e 66 69 67 20 3d 20 30 3b 0a 20 20  *pConfig = 0;.  
11540 69 6e 74 20 69 41 72 67 20 3d 20 31 3b 0a 0a 20  int iArg = 1;.. 
11550 20 69 66 28 20 6e 41 72 67 3c 31 20 29 7b 0a 20   if( nArg<1 ){. 
11560 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65     zErr = sqlite
11570 33 5f 6d 70 72 69 6e 74 66 28 22 77 72 6f 6e 67  3_mprintf("wrong
11580 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
11590 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
115a0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 62 54   %s",.        bT
115b0 63 6c 20 3f 20 22 66 74 73 35 5f 65 78 70 72 5f  cl ? "fts5_expr_
115c0 74 63 6c 22 20 3a 20 22 66 74 73 35 5f 65 78 70  tcl" : "fts5_exp
115d0 72 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  r".    );.    sq
115e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
115f0 6f 72 28 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d  or(pCtx, zErr, -
11600 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
11610 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
11620 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
11630 66 28 20 62 54 63 6c 20 26 26 20 6e 41 72 67 3e  f( bTcl && nArg>
11640 31 20 29 7b 0a 20 20 20 20 7a 4e 65 61 72 73 65  1 ){.    zNearse
11650 74 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  tCmd = (const ch
11660 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
11670 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
11680 3b 0a 20 20 20 20 69 41 72 67 20 3d 20 32 3b 0a  ;.    iArg = 2;.
11690 20 20 7d 0a 0a 20 20 6e 43 6f 6e 66 69 67 20 3d    }..  nConfig =
116a0 20 33 20 2b 20 28 6e 41 72 67 2d 69 41 72 67 29   3 + (nArg-iArg)
116b0 3b 0a 20 20 61 7a 43 6f 6e 66 69 67 20 3d 20 28  ;.  azConfig = (
116c0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 73 71 6c  const char**)sql
116d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
116e0 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 6e 43  zeof(char*) * nC
116f0 6f 6e 66 69 67 29 3b 0a 20 20 69 66 28 20 61 7a  onfig);.  if( az
11700 43 6f 6e 66 69 67 3d 3d 30 20 29 7b 0a 20 20 20  Config==0 ){.   
11710 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11720 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78  error_nomem(pCtx
11730 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
11740 20 7d 0a 20 20 61 7a 43 6f 6e 66 69 67 5b 30 5d   }.  azConfig[0]
11750 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6e 66 69 67   = 0;.  azConfig
11760 5b 31 5d 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  [1] = "main";.  
11770 61 7a 43 6f 6e 66 69 67 5b 32 5d 20 3d 20 22 74  azConfig[2] = "t
11780 62 6c 22 3b 0a 20 20 66 6f 72 28 69 3d 33 3b 20  bl";.  for(i=3; 
11790 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b  iArg<nArg; iArg+
117a0 2b 29 7b 0a 20 20 20 20 61 7a 43 6f 6e 66 69 67  +){.    azConfig
117b0 5b 69 2b 2b 5d 20 3d 20 28 63 6f 6e 73 74 20 63  [i++] = (const c
117c0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
117d0 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69 41  ue_text(apVal[iA
117e0 72 67 5d 29 3b 0a 20 20 7d 0a 0a 20 20 7a 45 78  rg]);.  }..  zEx
117f0 70 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  pr = (const char
11800 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
11810 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
11820 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
11830 74 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28 70  ts5ConfigParse(p
11840 47 6c 6f 62 61 6c 2c 20 64 62 2c 20 6e 43 6f 6e  Global, db, nCon
11850 66 69 67 2c 20 61 7a 43 6f 6e 66 69 67 2c 20 26  fig, azConfig, &
11860 70 43 6f 6e 66 69 67 2c 20 26 7a 45 72 72 29 3b  pConfig, &zErr);
11870 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
11890 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
118a0 4e 65 77 28 70 43 6f 6e 66 69 67 2c 20 70 43 6f  New(pConfig, pCo
118b0 6e 66 69 67 2d 3e 6e 43 6f 6c 2c 20 7a 45 78 70  nfig->nCol, zExp
118c0 72 2c 20 26 70 45 78 70 72 2c 20 26 7a 45 72 72  r, &pExpr, &zErr
118d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
118e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
118f0 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20    char *zText;. 
11900 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
11910 6f 6f 74 2d 3e 78 4e 65 78 74 3d 3d 30 20 29 7b  oot->xNext==0 ){
11920 0a 20 20 20 20 20 20 7a 54 65 78 74 20 3d 20 73  .      zText = s
11930 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
11940 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
11950 28 20 62 54 63 6c 20 29 7b 0a 20 20 20 20 20 20  ( bTcl ){.      
11960 7a 54 65 78 74 20 3d 20 66 74 73 35 45 78 70 72  zText = fts5Expr
11970 50 72 69 6e 74 54 63 6c 28 70 43 6f 6e 66 69 67  PrintTcl(pConfig
11980 2c 20 7a 4e 65 61 72 73 65 74 43 6d 64 2c 20 70  , zNearsetCmd, p
11990 45 78 70 72 2d 3e 70 52 6f 6f 74 29 3b 0a 20 20  Expr->pRoot);.  
119a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
119b0 54 65 78 74 20 3d 20 66 74 73 35 45 78 70 72 50  Text = fts5ExprP
119c0 72 69 6e 74 28 70 43 6f 6e 66 69 67 2c 20 70 45  rint(pConfig, pE
119d0 78 70 72 2d 3e 70 52 6f 6f 74 29 3b 0a 20 20 20  xpr->pRoot);.   
119e0 20 7d 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74   }.    if( zText
119f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
11a00 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11a20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11a30 74 65 78 74 28 70 43 74 78 2c 20 7a 54 65 78 74  text(pCtx, zText
11a40 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
11a50 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73  NSIENT);.      s
11a60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78  qlite3_free(zTex
11a70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
11a80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11a90 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 45  OK ){.    if( zE
11aa0 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
11ab0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
11ac0 28 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29  (pCtx, zErr, -1)
11ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11ae0 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
11af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
11b00 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
11b10 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29  r_code(pCtx, rc)
11b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11b30 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64  lite3_free((void
11b40 20 2a 29 61 7a 43 6f 6e 66 69 67 29 3b 0a 20 20   *)azConfig);.  
11b50 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
11b60 67 46 72 65 65 28 70 43 6f 6e 66 69 67 29 3b 0a  gFree(pConfig);.
11b70 20 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70    sqlite3Fts5Exp
11b80 72 46 72 65 65 28 70 45 78 70 72 29 3b 0a 7d 0a  rFree(pExpr);.}.
11b90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
11ba0 35 45 78 70 72 46 75 6e 63 74 69 6f 6e 48 72 28  5ExprFunctionHr(
11bb0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
11bc0 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
11bd0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
11be0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
11bf0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
11c20 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
11c30 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
11c40 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
11c50 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
11c60 0a 29 7b 0a 20 20 66 74 73 35 45 78 70 72 46 75  .){.  fts5ExprFu
11c70 6e 63 74 69 6f 6e 28 70 43 74 78 2c 20 6e 41 72  nction(pCtx, nAr
11c80 67 2c 20 61 70 56 61 6c 2c 20 30 29 3b 0a 7d 0a  g, apVal, 0);.}.
11c90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11ca0 45 78 70 72 46 75 6e 63 74 69 6f 6e 54 63 6c 28  ExprFunctionTcl(
11cb0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
11cc0 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
11cd0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
11ce0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
11cf0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
11d20 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
11d30 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
11d40 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
11d50 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
11d60 0a 29 7b 0a 20 20 66 74 73 35 45 78 70 72 46 75  .){.  fts5ExprFu
11d70 6e 63 74 69 6f 6e 28 70 43 74 78 2c 20 6e 41 72  nction(pCtx, nAr
11d80 67 2c 20 61 70 56 61 6c 2c 20 31 29 3b 0a 7d 0a  g, apVal, 1);.}.
11d90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
11da0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20  mentation of an 
11db0 53 51 4c 69 74 65 20 75 73 65 72 2d 64 65 66 69  SQLite user-defi
11dc0 6e 65 64 2d 66 75 6e 63 74 69 6f 6e 20 74 68 61  ned-function tha
11dd0 74 20 61 63 63 65 70 74 73 20 61 0a 2a 2a 20 73  t accepts a.** s
11de0 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61 73  ingle integer as
11df0 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
11e00 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20   the integer is 
11e10 61 6e 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63  an alpha-numeric
11e20 20 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 6f 64   .** unicode cod
11e30 65 20 70 6f 69 6e 74 2c 20 31 20 69 73 20 72 65  e point, 1 is re
11e40 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11e50 65 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e 0..*/.static v
11e60 6f 69 64 20 66 74 73 35 45 78 70 72 49 73 41 6c  oid fts5ExprIsAl
11e70 6e 75 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  num(.  sqlite3_c
11e80 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
11e90 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
11ea0 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
11eb0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11ee0 66 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69  f args */.  sqli
11ef0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
11f00 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  l           /* F
11f10 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
11f20 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43  s */.){.  int iC
11f30 6f 64 65 3b 0a 20 20 75 38 20 61 41 72 72 5b 33  ode;.  u8 aArr[3
11f40 32 5d 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  2];.  if( nArg!=
11f50 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
11f60 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
11f70 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 77 72  tx, .        "wr
11f80 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
11f90 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
11fa0 69 6f 6e 20 66 74 73 35 5f 69 73 61 6c 6e 75 6d  ion fts5_isalnum
11fb0 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20  ", -1.    );.   
11fc0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d   return;.  }.  m
11fd0 65 6d 73 65 74 28 61 41 72 72 2c 20 30 2c 20 73  emset(aArr, 0, s
11fe0 69 7a 65 6f 66 28 61 41 72 72 29 29 3b 0a 20 20  izeof(aArr));.  
11ff0 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f  sqlite3Fts5Unico
12000 64 65 43 61 74 50 61 72 73 65 28 22 4c 2a 22 2c  deCatParse("L*",
12010 20 61 41 72 72 29 3b 0a 20 20 73 71 6c 69 74 65   aArr);.  sqlite
12020 33 46 74 73 35 55 6e 69 63 6f 64 65 43 61 74 50  3Fts5UnicodeCatP
12030 61 72 73 65 28 22 4e 2a 22 2c 20 61 41 72 72 29  arse("N*", aArr)
12040 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 55  ;.  sqlite3Fts5U
12050 6e 69 63 6f 64 65 43 61 74 50 61 72 73 65 28 22  nicodeCatParse("
12060 43 6f 22 2c 20 61 41 72 72 29 3b 0a 20 20 69 43  Co", aArr);.  iC
12070 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ode = sqlite3_va
12080 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d  lue_int(apVal[0]
12090 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
120a0 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 61 41  ult_int(pCtx, aA
120b0 72 72 5b 73 71 6c 69 74 65 33 46 74 73 35 55 6e  rr[sqlite3Fts5Un
120c0 69 63 6f 64 65 43 61 74 65 67 6f 72 79 28 28 75  icodeCategory((u
120d0 33 32 29 69 43 6f 64 65 29 5d 29 3b 0a 7d 0a 0a  32)iCode)]);.}..
120e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
120f0 45 78 70 72 46 6f 6c 64 28 0a 20 20 73 71 6c 69  ExprFold(.  sqli
12100 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
12110 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
12120 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
12130 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
12140 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
12150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12160 62 65 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20  ber of args */. 
12170 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
12180 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
12190 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
121a0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
121b0 66 28 20 6e 41 72 67 21 3d 31 20 26 26 20 6e 41  f( nArg!=1 && nA
121c0 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c  rg!=2 ){.    sql
121d0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
121e0 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
121f0 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f   "wrong number o
12200 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
12210 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 66 6f 6c  unction fts5_fol
12220 64 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20 20  d", -1.    );.  
12230 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
12240 43 6f 64 65 3b 0a 20 20 20 20 69 6e 74 20 62 52  Code;.    int bR
12250 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 73 20  emoveDiacritics 
12260 3d 20 30 3b 0a 20 20 20 20 69 43 6f 64 65 20 3d  = 0;.    iCode =
12270 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
12280 6e 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  nt(apVal[0]);.  
12290 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 20    if( nArg==2 ) 
122a0 62 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63  bRemoveDiacritic
122b0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
122c0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b  e_int(apVal[1]);
122d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
122e0 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 73 71  ult_int(pCtx, sq
122f0 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
12300 46 6f 6c 64 28 69 43 6f 64 65 2c 20 62 52 65 6d  Fold(iCode, bRem
12310 6f 76 65 44 69 61 63 72 69 74 69 63 73 29 29 3b  oveDiacritics));
12320 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
12330 69 73 20 69 73 20 63 61 6c 6c 65 64 20 64 75 72  is is called dur
12340 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ing initializati
12350 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20 74  on to register t
12360 68 65 20 66 74 73 35 5f 65 78 70 72 28 29 20 73  he fts5_expr() s
12370 63 61 6c 61 72 0a 2a 2a 20 55 44 46 20 77 69 74  calar.** UDF wit
12380 68 20 74 68 65 20 53 51 4c 69 74 65 20 68 61 6e  h the SQLite han
12390 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
123a0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
123b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
123c0 74 73 35 45 78 70 72 49 6e 69 74 28 46 74 73 35  ts5ExprInit(Fts5
123d0 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c  Global *pGlobal,
123e0 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20   sqlite3 *db){. 
123f0 20 73 74 72 75 63 74 20 46 74 73 35 45 78 70 72   struct Fts5Expr
12400 46 75 6e 63 20 7b 0a 20 20 20 20 63 6f 6e 73 74  Func {.    const
12410 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 6f   char *z;.    vo
12420 69 64 20 28 2a 78 29 28 73 71 6c 69 74 65 33 5f  id (*x)(sqlite3_
12430 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
12440 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20  ite3_value**);. 
12450 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20   } aFunc[] = {. 
12460 20 20 20 7b 20 22 66 74 73 35 5f 65 78 70 72 22     { "fts5_expr"
12470 2c 20 20 20 20 20 66 74 73 35 45 78 70 72 46 75  ,     fts5ExprFu
12480 6e 63 74 69 6f 6e 48 72 20 7d 2c 0a 20 20 20 20  nctionHr },.    
12490 7b 20 22 66 74 73 35 5f 65 78 70 72 5f 74 63 6c  { "fts5_expr_tcl
124a0 22 2c 20 66 74 73 35 45 78 70 72 46 75 6e 63 74  ", fts5ExprFunct
124b0 69 6f 6e 54 63 6c 20 7d 2c 0a 20 20 20 20 7b 20  ionTcl },.    { 
124c0 22 66 74 73 35 5f 69 73 61 6c 6e 75 6d 22 2c 20  "fts5_isalnum", 
124d0 20 66 74 73 35 45 78 70 72 49 73 41 6c 6e 75 6d   fts5ExprIsAlnum
124e0 20 7d 2c 0a 20 20 20 20 7b 20 22 66 74 73 35 5f   },.    { "fts5_
124f0 66 6f 6c 64 22 2c 20 20 20 20 20 66 74 73 35 45  fold",     fts5E
12500 78 70 72 46 6f 6c 64 20 7d 2c 0a 20 20 7d 3b 0a  xprFold },.  };.
12510 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
12520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12530 20 76 6f 69 64 20 2a 70 43 74 78 20 3d 20 28 76   void *pCtx = (v
12540 6f 69 64 2a 29 70 47 6c 6f 62 61 6c 3b 0a 0a 20  oid*)pGlobal;.. 
12550 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
12560 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 41 72 72  LITE_OK && i<Arr
12570 61 79 53 69 7a 65 28 61 46 75 6e 63 29 3b 20 69  aySize(aFunc); i
12580 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
12590 46 74 73 35 45 78 70 72 46 75 6e 63 20 2a 70 20  Fts5ExprFunc *p 
125a0 3d 20 26 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  = &aFunc[i];.   
125b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
125c0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
125d0 2c 20 70 2d 3e 7a 2c 20 2d 31 2c 20 53 51 4c 49  , p->z, -1, SQLI
125e0 54 45 5f 55 54 46 38 2c 20 70 43 74 78 2c 20 70  TE_UTF8, pCtx, p
125f0 2d 3e 78 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ->x, 0, 0);.  }.
12600 0a 20 20 2f 2a 20 41 76 6f 69 64 20 77 61 72 6e  .  /* Avoid warn
12610 69 6e 67 73 20 69 6e 64 69 63 61 74 69 6e 67 20  ings indicating 
12620 74 68 61 74 20 73 71 6c 69 74 65 33 46 74 73 35  that sqlite3Fts5
12630 50 61 72 73 65 72 54 72 61 63 65 28 29 20 61 6e  ParserTrace() an
12640 64 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 74  d.  ** sqlite3Ft
12650 73 35 50 61 72 73 65 72 46 61 6c 6c 62 61 63 6b  s5ParserFallback
12660 28 29 20 61 72 65 20 75 6e 75 73 65 64 20 2a 2f  () are unused */
12670 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
12680 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 46    (void)sqlite3F
12690 74 73 35 50 61 72 73 65 72 54 72 61 63 65 3b 0a  ts5ParserTrace;.
126a0 23 65 6e 64 69 66 0a 20 20 28 76 6f 69 64 29 73  #endif.  (void)s
126b0 71 6c 69 74 65 33 46 74 73 35 50 61 72 73 65 72  qlite3Fts5Parser
126c0 46 61 6c 6c 62 61 63 6b 3b 0a 0a 20 20 72 65 74  Fallback;..  ret
126d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
126e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
126f0 65 72 20 6f 66 20 70 68 72 61 73 65 73 20 69 6e  er of phrases in
12700 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
12710 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
12720 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43  3Fts5ExprPhraseC
12730 6f 75 6e 74 28 46 74 73 35 45 78 70 72 20 2a 70  ount(Fts5Expr *p
12740 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
12750 28 70 45 78 70 72 20 3f 20 70 45 78 70 72 2d 3e  (pExpr ? pExpr->
12760 6e 50 68 72 61 73 65 20 3a 20 30 29 3b 0a 7d 0a  nPhrase : 0);.}.
12770 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12780 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
12790 73 20 69 6e 20 74 68 65 20 69 50 68 72 61 73 65  s in the iPhrase
127a0 27 74 68 20 70 68 72 61 73 65 20 69 6e 20 70 45  'th phrase in pE
127b0 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  xpr..*/.int sqli
127c0 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73  te3Fts5ExprPhras
127d0 65 53 69 7a 65 28 46 74 73 35 45 78 70 72 20 2a  eSize(Fts5Expr *
127e0 70 45 78 70 72 2c 20 69 6e 74 20 69 50 68 72 61  pExpr, int iPhra
127f0 73 65 29 7b 0a 20 20 69 66 28 20 69 50 68 72 61  se){.  if( iPhra
12800 73 65 3c 30 20 7c 7c 20 69 50 68 72 61 73 65 3e  se<0 || iPhrase>
12810 3d 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 20  =pExpr->nPhrase 
12820 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
12830 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 70 45 78  turn pExpr->apEx
12840 70 72 50 68 72 61 73 65 5b 69 50 68 72 61 73 65  prPhrase[iPhrase
12850 5d 2d 3e 6e 54 65 72 6d 3b 0a 7d 0a 0a 2f 2a 0a  ]->nTerm;.}../*.
12860 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12870 20 69 73 20 75 73 65 64 20 74 6f 20 61 63 63 65   is used to acce
12880 73 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ss the current p
12890 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72  osition list for
128a0 20 70 68 72 61 73 65 0a 2a 2a 20 69 50 68 72 61   phrase.** iPhra
128b0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
128c0 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73  e3Fts5ExprPoslis
128d0 74 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70  t(Fts5Expr *pExp
128e0 72 2c 20 69 6e 74 20 69 50 68 72 61 73 65 2c 20  r, int iPhrase, 
128f0 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 29 7b 0a  const u8 **pa){.
12900 20 20 69 6e 74 20 6e 52 65 74 3b 0a 20 20 46 74    int nRet;.  Ft
12910 73 35 45 78 70 72 50 68 72 61 73 65 20 2a 70 50  s5ExprPhrase *pP
12920 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 61  hrase = pExpr->a
12930 70 45 78 70 72 50 68 72 61 73 65 5b 69 50 68 72  pExprPhrase[iPhr
12940 61 73 65 5d 3b 0a 20 20 46 74 73 35 45 78 70 72  ase];.  Fts5Expr
12950 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 70 50  Node *pNode = pP
12960 68 72 61 73 65 2d 3e 70 4e 6f 64 65 3b 0a 20 20  hrase->pNode;.  
12970 69 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d  if( pNode->bEof=
12980 3d 30 20 26 26 20 70 4e 6f 64 65 2d 3e 69 52 6f  =0 && pNode->iRo
12990 77 69 64 3d 3d 70 45 78 70 72 2d 3e 70 52 6f 6f  wid==pExpr->pRoo
129a0 74 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  t->iRowid ){.   
129b0 20 2a 70 61 20 3d 20 70 50 68 72 61 73 65 2d 3e   *pa = pPhrase->
129c0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 6e  poslist.p;.    n
129d0 52 65 74 20 3d 20 70 50 68 72 61 73 65 2d 3e 70  Ret = pPhrase->p
129e0 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 65 6c 73  oslist.n;.  }els
129f0 65 7b 0a 20 20 20 20 2a 70 61 20 3d 20 30 3b 0a  e{.    *pa = 0;.
12a00 20 20 20 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20      nRet = 0;.  
12a10 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  }.  return nRet;
12a20 0a 7d 0a 0a 73 74 72 75 63 74 20 46 74 73 35 50  .}..struct Fts5P
12a30 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f 72 20  oslistPopulator 
12a40 7b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57  {.  Fts5PoslistW
12a50 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20  riter writer;.  
12a60 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20  int bOk;        
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 2f 2a 20 54 72 75 65 20 69 66 20 6f 6b 20 74 6f  /* True if ok to
12a90 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20 69   populate */.  i
12aa0 6e 74 20 62 4d 69 73 73 3b 0a 7d 3b 0a 0a 46 74  nt bMiss;.};..Ft
12ab0 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74  s5PoslistPopulat
12ac0 6f 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 45  or *sqlite3Fts5E
12ad0 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73 74 73  xprClearPoslists
12ae0 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72  (Fts5Expr *pExpr
12af0 2c 20 69 6e 74 20 62 4c 69 76 65 29 7b 0a 20 20  , int bLive){.  
12b00 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
12b10 61 74 6f 72 20 2a 70 52 65 74 3b 0a 20 20 70 52  ator *pRet;.  pR
12b20 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  et = sqlite3_mal
12b30 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 46 74 73  loc64(sizeof(Fts
12b40 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c 61 74 6f  5PoslistPopulato
12b50 72 29 2a 70 45 78 70 72 2d 3e 6e 50 68 72 61 73  r)*pExpr->nPhras
12b60 65 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  e);.  if( pRet )
12b70 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
12b80 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c   memset(pRet, 0,
12b90 20 73 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c   sizeof(Fts5Posl
12ba0 69 73 74 50 6f 70 75 6c 61 74 6f 72 29 2a 70 45  istPopulator)*pE
12bb0 78 70 72 2d 3e 6e 50 68 72 61 73 65 29 3b 0a 20  xpr->nPhrase);. 
12bc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
12bd0 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69 2b  xpr->nPhrase; i+
12be0 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 42 75  +){.      Fts5Bu
12bf0 66 66 65 72 20 2a 70 42 75 66 20 3d 20 26 70 45  ffer *pBuf = &pE
12c00 78 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73  xpr->apExprPhras
12c10 65 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74 3b 0a 20  e[i]->poslist;. 
12c20 20 20 20 20 20 46 74 73 35 45 78 70 72 4e 6f 64       Fts5ExprNod
12c30 65 20 2a 70 4e 6f 64 65 20 3d 20 70 45 78 70 72  e *pNode = pExpr
12c40 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65 5b 69  ->apExprPhrase[i
12c50 5d 2d 3e 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20  ]->pNode;.      
12c60 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
12c70 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d 3e  pExprPhrase[i]->
12c80 6e 54 65 72 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  nTerm==1 );.    
12c90 20 20 69 66 28 20 62 4c 69 76 65 20 26 26 20 0a    if( bLive && .
12ca0 20 20 20 20 20 20 20 20 20 20 28 70 42 75 66 2d            (pBuf-
12cb0 3e 6e 3d 3d 30 20 7c 7c 20 70 4e 6f 64 65 2d 3e  >n==0 || pNode->
12cc0 69 52 6f 77 69 64 21 3d 70 45 78 70 72 2d 3e 70  iRowid!=pExpr->p
12cd0 52 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 7c 7c 20  Root->iRowid || 
12ce0 70 4e 6f 64 65 2d 3e 62 45 6f 66 29 0a 20 20 20  pNode->bEof).   
12cf0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52     ){.        pR
12d00 65 74 5b 69 5d 2e 62 4d 69 73 73 20 3d 20 31 3b  et[i].bMiss = 1;
12d10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12d20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20        pBuf->n = 
12d30 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
12d40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
12d50 65 74 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 46 74  et;.}..struct Ft
12d60 73 35 45 78 70 72 43 74 78 20 7b 0a 20 20 46 74  s5ExprCtx {.  Ft
12d70 73 35 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20  s5Expr *pExpr;. 
12d80 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75   Fts5PoslistPopu
12d90 6c 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f  lator *aPopulato
12da0 72 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a 7d  r;.  i64 iOff;.}
12db0 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
12dc0 20 46 74 73 35 45 78 70 72 43 74 78 20 46 74 73   Fts5ExprCtx Fts
12dd0 35 45 78 70 72 43 74 78 3b 0a 0a 2f 2a 0a 2a 2a  5ExprCtx;../*.**
12de0 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73   TODO: Make this
12df0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21   more efficient!
12e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12e10 74 73 35 45 78 70 72 43 6f 6c 73 65 74 54 65 73  ts5ExprColsetTes
12e20 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43  t(Fts5Colset *pC
12e30 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29  olset, int iCol)
12e40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
12e50 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
12e60 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
12e70 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69   if( pColset->ai
12e80 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72  Col[i]==iCol ) r
12e90 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
12ea0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
12eb0 69 63 20 69 6e 74 20 66 74 73 35 45 78 70 72 50  ic int fts5ExprP
12ec0 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74 73 43  opulatePoslistsC
12ed0 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b(.  void *pCtx,
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ef0 2f 2a 20 43 6f 70 79 20 6f 66 20 32 6e 64 20 61  /* Copy of 2nd a
12f00 72 67 75 6d 65 6e 74 20 74 6f 20 78 54 6f 6b 65  rgument to xToke
12f10 6e 69 7a 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20  nize() */.  int 
12f20 74 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  tflags,         
12f30 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
12f40 66 20 46 54 53 35 5f 54 4f 4b 45 4e 5f 2a 20 66  f FTS5_TOKEN_* f
12f50 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
12f60 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  char *pToken,   
12f70 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
12f80 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
12f90 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ning token */.  
12fa0 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
12fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
12fc0 7a 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62  ze of token in b
12fd0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 55  ytes */.  int iU
12fe0 6e 75 73 65 64 31 2c 20 20 20 20 20 20 20 20 20  nused1,         
12ff0 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
13000 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  set of token wit
13010 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20 2a  hin input text *
13020 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64 32  /.  int iUnused2
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13040 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66  * Byte offset of
13050 20 65 6e 64 20 6f 66 20 74 6f 6b 65 6e 20 77 69   end of token wi
13060 74 68 69 6e 20 69 6e 70 75 74 20 74 65 78 74 20  thin input text 
13070 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 45 78 70 72  */.){.  Fts5Expr
13080 43 74 78 20 2a 70 20 3d 20 28 46 74 73 35 45 78  Ctx *p = (Fts5Ex
13090 70 72 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 46  prCtx*)pCtx;.  F
130a0 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d  ts5Expr *pExpr =
130b0 20 70 2d 3e 70 45 78 70 72 3b 0a 20 20 69 6e 74   p->pExpr;.  int
130c0 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
130d0 52 41 4d 32 28 69 55 6e 75 73 65 64 31 2c 20 69  RAM2(iUnused1, i
130e0 55 6e 75 73 65 64 32 29 3b 0a 0a 20 20 69 66 28  Unused2);..  if(
130f0 20 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 4d 41 58   nToken>FTS5_MAX
13100 5f 54 4f 4b 45 4e 5f 53 49 5a 45 20 29 20 6e 54  _TOKEN_SIZE ) nT
13110 6f 6b 65 6e 20 3d 20 46 54 53 35 5f 4d 41 58 5f  oken = FTS5_MAX_
13120 54 4f 4b 45 4e 5f 53 49 5a 45 3b 0a 20 20 69 66  TOKEN_SIZE;.  if
13130 28 20 28 74 66 6c 61 67 73 20 26 20 46 54 53 35  ( (tflags & FTS5
13140 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44  _TOKEN_COLOCATED
13150 29 3d 3d 30 20 29 20 70 2d 3e 69 4f 66 66 2b 2b  )==0 ) p->iOff++
13160 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
13170 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 3b 20 69  Expr->nPhrase; i
13180 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 45 78 70  ++){.    Fts5Exp
13190 72 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  rTerm *pTerm;.  
131a0 20 20 69 66 28 20 70 2d 3e 61 50 6f 70 75 6c 61    if( p->aPopula
131b0 74 6f 72 5b 69 5d 2e 62 4f 6b 3d 3d 30 20 29 20  tor[i].bOk==0 ) 
131c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
131d0 72 28 70 54 65 72 6d 3d 26 70 45 78 70 72 2d 3e  r(pTerm=&pExpr->
131e0 61 70 45 78 70 72 50 68 72 61 73 65 5b 69 5d 2d  apExprPhrase[i]-
131f0 3e 61 54 65 72 6d 5b 30 5d 3b 20 70 54 65 72 6d  >aTerm[0]; pTerm
13200 3b 20 70 54 65 72 6d 3d 70 54 65 72 6d 2d 3e 70  ; pTerm=pTerm->p
13210 53 79 6e 6f 6e 79 6d 29 7b 0a 20 20 20 20 20 20  Synonym){.      
13220 69 6e 74 20 6e 54 65 72 6d 20 3d 20 28 69 6e 74  int nTerm = (int
13230 29 73 74 72 6c 65 6e 28 70 54 65 72 6d 2d 3e 7a  )strlen(pTerm->z
13240 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Term);.      if(
13250 20 28 6e 54 65 72 6d 3d 3d 6e 54 6f 6b 65 6e 20   (nTerm==nToken 
13260 7c 7c 20 28 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  || (nTerm<nToken
13270 20 26 26 20 70 54 65 72 6d 2d 3e 62 50 72 65 66   && pTerm->bPref
13280 69 78 29 29 0a 20 20 20 20 20 20 20 26 26 20 6d  ix)).       && m
13290 65 6d 63 6d 70 28 70 54 65 72 6d 2d 3e 7a 54 65  emcmp(pTerm->zTe
132a0 72 6d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 65 72  rm, pToken, nTer
132b0 6d 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  m)==0.      ){. 
132c0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
132d0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
132e0 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 0a  stWriterAppend(.
132f0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 45 78              &pEx
13300 70 72 2d 3e 61 70 45 78 70 72 50 68 72 61 73 65  pr->apExprPhrase
13310 5b 69 5d 2d 3e 70 6f 73 6c 69 73 74 2c 20 26 70  [i]->poslist, &p
13320 2d 3e 61 50 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e  ->aPopulator[i].
13330 77 72 69 74 65 72 2c 20 70 2d 3e 69 4f 66 66 0a  writer, p->iOff.
13340 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
13350 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13360 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 62  rn rc;.        b
13370 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13380 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69   SQLITE_OK;.}..i
133a0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  nt sqlite3Fts5Ex
133b0 70 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73  prPopulatePoslis
133c0 74 73 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  ts(.  Fts5Config
133d0 20 2a 70 43 6f 6e 66 69 67 2c 0a 20 20 46 74 73   *pConfig,.  Fts
133e0 35 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20  5Expr *pExpr, . 
133f0 20 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75   Fts5PoslistPopu
13400 6c 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f  lator *aPopulato
13410 72 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a  r,.  int iCol, .
13420 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
13430 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 6e 74 20   int n.){.  int 
13440 69 3b 0a 20 20 46 74 73 35 45 78 70 72 43 74 78  i;.  Fts5ExprCtx
13450 20 73 43 74 78 3b 0a 20 20 73 43 74 78 2e 70 45   sCtx;.  sCtx.pE
13460 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73  xpr = pExpr;.  s
13470 43 74 78 2e 61 50 6f 70 75 6c 61 74 6f 72 20 3d  Ctx.aPopulator =
13480 20 61 50 6f 70 75 6c 61 74 6f 72 3b 0a 20 20 73   aPopulator;.  s
13490 43 74 78 2e 69 4f 66 66 20 3d 20 28 28 28 69 36  Ctx.iOff = (((i6
134a0 34 29 69 43 6f 6c 29 20 3c 3c 20 33 32 29 20 2d  4)iCol) << 32) -
134b0 20 31 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   1;..  for(i=0; 
134c0 69 3c 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65  i<pExpr->nPhrase
134d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
134e0 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  ExprNode *pNode 
134f0 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72 50  = pExpr->apExprP
13500 68 72 61 73 65 5b 69 5d 2d 3e 70 4e 6f 64 65 3b  hrase[i]->pNode;
13510 0a 20 20 20 20 46 74 73 35 43 6f 6c 73 65 74 20  .    Fts5Colset 
13520 2a 70 43 6f 6c 73 65 74 20 3d 20 70 4e 6f 64 65  *pColset = pNode
13530 2d 3e 70 4e 65 61 72 2d 3e 70 43 6f 6c 73 65 74  ->pNear->pColset
13540 3b 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 73  ;.    if( (pCols
13550 65 74 20 26 26 20 30 3d 3d 66 74 73 35 45 78 70  et && 0==fts5Exp
13560 72 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c  rColsetTest(pCol
13570 73 65 74 2c 20 69 43 6f 6c 29 29 20 0a 20 20 20  set, iCol)) .   
13580 20 20 7c 7c 20 61 50 6f 70 75 6c 61 74 6f 72 5b    || aPopulator[
13590 69 5d 2e 62 4d 69 73 73 0a 20 20 20 20 29 7b 0a  i].bMiss.    ){.
135a0 20 20 20 20 20 20 61 50 6f 70 75 6c 61 74 6f 72        aPopulator
135b0 5b 69 5d 2e 62 4f 6b 20 3d 20 30 3b 0a 20 20 20  [i].bOk = 0;.   
135c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 50   }else{.      aP
135d0 6f 70 75 6c 61 74 6f 72 5b 69 5d 2e 62 4f 6b 20  opulator[i].bOk 
135e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
135f0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
13600 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 70 43 6f  Fts5Tokenize(pCo
13610 6e 66 69 67 2c 20 0a 20 20 20 20 20 20 46 54 53  nfig, .      FTS
13620 35 5f 54 4f 4b 45 4e 49 5a 45 5f 44 4f 43 55 4d  5_TOKENIZE_DOCUM
13630 45 4e 54 2c 20 7a 2c 20 6e 2c 20 28 76 6f 69 64  ENT, z, n, (void
13640 2a 29 26 73 43 74 78 2c 20 66 74 73 35 45 78 70  *)&sCtx, fts5Exp
13650 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74  rPopulatePoslist
13660 73 43 62 0a 20 20 29 3b 0a 7d 0a 0a 73 74 61 74  sCb.  );.}..stat
13670 69 63 20 76 6f 69 64 20 66 74 73 35 45 78 70 72  ic void fts5Expr
13680 43 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 46 74  ClearPoslists(Ft
13690 73 35 45 78 70 72 4e 6f 64 65 20 2a 70 4e 6f 64  s5ExprNode *pNod
136a0 65 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  e){.  if( pNode-
136b0 3e 65 54 79 70 65 3d 3d 46 54 53 35 5f 54 45 52  >eType==FTS5_TER
136c0 4d 20 7c 7c 20 70 4e 6f 64 65 2d 3e 65 54 79 70  M || pNode->eTyp
136d0 65 3d 3d 46 54 53 35 5f 53 54 52 49 4e 47 20 29  e==FTS5_STRING )
136e0 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 70 4e 65  {.    pNode->pNe
136f0 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d 2d  ar->apPhrase[0]-
13700 3e 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a  >poslist.n = 0;.
13710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
13720 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13730 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c 64   i<pNode->nChild
13740 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
13750 73 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69  s5ExprClearPosli
13760 73 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69  sts(pNode->apChi
13770 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ld[i]);.    }.  
13780 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
13790 66 74 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73  fts5ExprCheckPos
137a0 6c 69 73 74 73 28 46 74 73 35 45 78 70 72 4e 6f  lists(Fts5ExprNo
137b0 64 65 20 2a 70 4e 6f 64 65 2c 20 69 36 34 20 69  de *pNode, i64 i
137c0 52 6f 77 69 64 29 7b 0a 20 20 70 4e 6f 64 65 2d  Rowid){.  pNode-
137d0 3e 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  >iRowid = iRowid
137e0 3b 0a 20 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 20  ;.  pNode->bEof 
137f0 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  = 0;.  switch( p
13800 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20  Node->eType ){. 
13810 20 20 20 63 61 73 65 20 46 54 53 35 5f 54 45 52     case FTS5_TER
13820 4d 3a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35  M:.    case FTS5
13830 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 72  _STRING:.      r
13840 65 74 75 72 6e 20 28 70 4e 6f 64 65 2d 3e 70 4e  eturn (pNode->pN
13850 65 61 72 2d 3e 61 70 50 68 72 61 73 65 5b 30 5d  ear->apPhrase[0]
13860 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3e 30 29 3b 0a  ->poslist.n>0);.
13870 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 41  .    case FTS5_A
13880 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
13890 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
138a0 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
138b0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; i++){.       
138c0 20 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65   if( fts5ExprChe
138d0 63 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65  ckPoslists(pNode
138e0 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52  ->apChild[i], iR
138f0 6f 77 69 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  owid)==0 ){.    
13900 20 20 20 20 20 20 66 74 73 35 45 78 70 72 43 6c        fts5ExprCl
13910 65 61 72 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64  earPoslists(pNod
13920 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
13930 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
13940 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13950 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
13960 20 20 63 61 73 65 20 46 54 53 35 5f 4f 52 3a 20    case FTS5_OR: 
13970 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
13980 20 20 20 20 20 69 6e 74 20 62 52 65 74 20 3d 20       int bRet = 
13990 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  0;.      for(i=0
139a0 3b 20 69 3c 70 4e 6f 64 65 2d 3e 6e 43 68 69 6c  ; i<pNode->nChil
139b0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; i++){.       
139c0 20 69 66 28 20 66 74 73 35 45 78 70 72 43 68 65   if( fts5ExprChe
139d0 63 6b 50 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65  ckPoslists(pNode
139e0 2d 3e 61 70 43 68 69 6c 64 5b 69 5d 2c 20 69 52  ->apChild[i], iR
139f0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20  owid) ){.       
13a00 20 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20     bRet = 1;.   
13a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13a20 20 20 20 20 20 72 65 74 75 72 6e 20 62 52 65 74       return bRet
13a30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66  ;.    }..    def
13a40 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
13a50 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79  sert( pNode->eTy
13a60 70 65 3d 3d 46 54 53 35 5f 4e 4f 54 20 29 3b 0a  pe==FTS5_NOT );.
13a70 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73        if( 0==fts
13a80 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73  5ExprCheckPoslis
13a90 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69 6c  ts(pNode->apChil
13aa0 64 5b 30 5d 2c 20 69 52 6f 77 69 64 29 0a 20 20  d[0], iRowid).  
13ab0 20 20 20 20 20 20 20 20 7c 7c 20 30 21 3d 66 74          || 0!=ft
13ac0 73 35 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69  s5ExprCheckPosli
13ad0 73 74 73 28 70 4e 6f 64 65 2d 3e 61 70 43 68 69  sts(pNode->apChi
13ae0 6c 64 5b 31 5d 2c 20 69 52 6f 77 69 64 29 0a 20  ld[1], iRowid). 
13af0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
13b00 20 20 66 74 73 35 45 78 70 72 43 6c 65 61 72 50    fts5ExprClearP
13b10 6f 73 6c 69 73 74 73 28 70 4e 6f 64 65 29 3b 0a  oslists(pNode);.
13b20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
13b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13b40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
13b50 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13b60 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
13b70 45 78 70 72 43 68 65 63 6b 50 6f 73 6c 69 73 74  ExprCheckPoslist
13b80 73 28 46 74 73 35 45 78 70 72 20 2a 70 45 78 70  s(Fts5Expr *pExp
13b90 72 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  r, i64 iRowid){.
13ba0 20 20 66 74 73 35 45 78 70 72 43 68 65 63 6b 50    fts5ExprCheckP
13bb0 6f 73 6c 69 73 74 73 28 70 45 78 70 72 2d 3e 70  oslists(pExpr->p
13bc0 52 6f 6f 74 2c 20 69 52 6f 77 69 64 29 3b 0a 7d  Root, iRowid);.}
13bd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
13be0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
13bf0 6c 6c 65 64 20 66 6f 72 20 64 65 74 61 69 6c 3d  lled for detail=
13c00 63 6f 6c 75 6d 6e 73 20 74 61 62 6c 65 73 2e 20  columns tables. 
13c10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
13c20 74 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 6c  ts5ExprPhraseCol
13c30 6c 69 73 74 28 0a 20 20 46 74 73 35 45 78 70 72  list(.  Fts5Expr
13c40 20 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e 74 20   *pExpr, .  int 
13c50 69 50 68 72 61 73 65 2c 20 0a 20 20 63 6f 6e 73  iPhrase, .  cons
13c60 74 20 75 38 20 2a 2a 70 70 43 6f 6c 6c 69 73 74  t u8 **ppCollist
13c70 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 6c  , .  int *pnColl
13c80 69 73 74 0a 29 7b 0a 20 20 46 74 73 35 45 78 70  ist.){.  Fts5Exp
13c90 72 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  rPhrase *pPhrase
13ca0 20 3d 20 70 45 78 70 72 2d 3e 61 70 45 78 70 72   = pExpr->apExpr
13cb0 50 68 72 61 73 65 5b 69 50 68 72 61 73 65 5d 3b  Phrase[iPhrase];
13cc0 0a 20 20 46 74 73 35 45 78 70 72 4e 6f 64 65 20  .  Fts5ExprNode 
13cd0 2a 70 4e 6f 64 65 20 3d 20 70 50 68 72 61 73 65  *pNode = pPhrase
13ce0 2d 3e 70 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ->pNode;.  int r
13cf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
13d00 20 20 61 73 73 65 72 74 28 20 69 50 68 72 61 73    assert( iPhras
13d10 65 3e 3d 30 20 26 26 20 69 50 68 72 61 73 65 3c  e>=0 && iPhrase<
13d20 70 45 78 70 72 2d 3e 6e 50 68 72 61 73 65 20 29  pExpr->nPhrase )
13d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
13d40 72 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  r->pConfig->eDet
13d50 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
13d60 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 0a 20 20 69  _COLUMNS );..  i
13d70 66 28 20 70 4e 6f 64 65 2d 3e 62 45 6f 66 3d 3d  f( pNode->bEof==
13d80 30 20 0a 20 20 20 26 26 20 70 4e 6f 64 65 2d 3e  0 .   && pNode->
13d90 69 52 6f 77 69 64 3d 3d 70 45 78 70 72 2d 3e 70  iRowid==pExpr->p
13da0 52 6f 6f 74 2d 3e 69 52 6f 77 69 64 20 0a 20 20  Root->iRowid .  
13db0 20 26 26 20 70 50 68 72 61 73 65 2d 3e 70 6f 73   && pPhrase->pos
13dc0 6c 69 73 74 2e 6e 3e 30 0a 20 20 29 7b 0a 20 20  list.n>0.  ){.  
13dd0 20 20 46 74 73 35 45 78 70 72 54 65 72 6d 20 2a    Fts5ExprTerm *
13de0 70 54 65 72 6d 20 3d 20 26 70 50 68 72 61 73 65  pTerm = &pPhrase
13df0 2d 3e 61 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20  ->aTerm[0];.    
13e00 69 66 28 20 70 54 65 72 6d 2d 3e 70 53 79 6e 6f  if( pTerm->pSyno
13e10 6e 79 6d 20 29 7b 0a 20 20 20 20 20 20 46 74 73  nym ){.      Fts
13e20 35 42 75 66 66 65 72 20 2a 70 42 75 66 20 3d 20  5Buffer *pBuf = 
13e30 28 46 74 73 35 42 75 66 66 65 72 2a 29 26 70 54  (Fts5Buffer*)&pT
13e40 65 72 6d 2d 3e 70 53 79 6e 6f 6e 79 6d 5b 31 5d  erm->pSynonym[1]
13e50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
13e60 35 45 78 70 72 53 79 6e 6f 6e 79 6d 4c 69 73 74  5ExprSynonymList
13e70 28 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  (.          pTer
13e80 6d 2c 20 70 4e 6f 64 65 2d 3e 69 52 6f 77 69 64  m, pNode->iRowid
13e90 2c 20 70 42 75 66 2c 20 28 75 38 2a 2a 29 70 70  , pBuf, (u8**)pp
13ea0 43 6f 6c 6c 69 73 74 2c 20 70 6e 43 6f 6c 6c 69  Collist, pnColli
13eb0 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
13ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
13ed0 43 6f 6c 6c 69 73 74 20 3d 20 70 50 68 72 61 73  Collist = pPhras
13ee0 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70 49 74 65  e->aTerm[0].pIte
13ef0 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  r->pData;.      
13f00 2a 70 6e 43 6f 6c 6c 69 73 74 20 3d 20 70 50 68  *pnCollist = pPh
13f10 72 61 73 65 2d 3e 61 54 65 72 6d 5b 30 5d 2e 70  rase->aTerm[0].p
13f20 49 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 20 20 20  Iter->nData;.   
13f30 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13f40 2a 70 70 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a  *ppCollist = 0;.
13f50 20 20 20 20 2a 70 6e 43 6f 6c 6c 69 73 74 20 3d      *pnCollist =
13f60 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
13f70 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.