/ Hex Artifact Content
Login

Artifact 572bd5d4d272ca562240dc1905538f060783ab78:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4a 75 6e 20 30  /*.** 2014 Jun 0
0010: 39 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  9.**.** 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 2a 20 54 68 69 73  *****.**.** This
0180: 20 69 73 20 61 6e 20 53 51 4c 69 74 65 20 6d 6f   is an SQLite mo
0190: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  dule implementin
01a0: 67 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72  g full-text sear
01b0: 63 68 2e 0a 2a 2f 0a 0a 0a 23 69 6e 63 6c 75 64  ch..*/...#includ
01c0: 65 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a 0a  e "fts5Int.h"...
01d0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
01e0: 74 73 35 54 61 62 6c 65 20 46 74 73 35 54 61 62  ts5Table Fts5Tab
01f0: 6c 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  le;.typedef stru
0200: 63 74 20 46 74 73 35 43 75 72 73 6f 72 20 46 74  ct Fts5Cursor Ft
0210: 73 35 43 75 72 73 6f 72 3b 0a 74 79 70 65 64 65  s5Cursor;.typede
0220: 66 20 73 74 72 75 63 74 20 46 74 73 35 47 6c 6f  f struct Fts5Glo
0230: 62 61 6c 20 46 74 73 35 47 6c 6f 62 61 6c 3b 0a  bal Fts5Global;.
0240: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
0250: 74 73 35 41 75 78 69 6c 69 61 72 79 20 46 74 73  ts5Auxiliary Fts
0260: 35 41 75 78 69 6c 69 61 72 79 3b 0a 74 79 70 65  5Auxiliary;.type
0270: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 41  def struct Fts5A
0280: 75 78 64 61 74 61 20 46 74 73 35 41 75 78 64 61  uxdata Fts5Auxda
0290: 74 61 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ta;..typedef str
02a0: 75 63 74 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  uct Fts5Tokenize
02b0: 72 4d 6f 64 75 6c 65 20 46 74 73 35 54 6f 6b 65  rModule Fts5Toke
02c0: 6e 69 7a 65 72 4d 6f 64 75 6c 65 3b 0a 0a 2f 2a  nizerModule;../*
02d0: 0a 2a 2a 20 4e 4f 54 45 53 20 4f 4e 20 54 52 41  .** NOTES ON TRA
02e0: 4e 53 41 43 54 49 4f 4e 53 3a 20 0a 2a 2a 0a 2a  NSACTIONS: .**.*
02f0: 2a 20 53 51 4c 69 74 65 20 69 6e 76 6f 6b 65 73  * SQLite invokes
0300: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
0310: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 65 74  irtual table met
0320: 68 6f 64 73 20 61 73 20 74 72 61 6e 73 61 63 74  hods as transact
0330: 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 6f 70 65  ions are .** ope
0340: 6e 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 62  ned and closed b
0350: 79 20 74 68 65 20 75 73 65 72 3a 0a 2a 2a 0a 2a  y the user:.**.*
0360: 2a 20 20 20 20 20 78 42 65 67 69 6e 28 29 3a 20  *     xBegin(): 
0370: 20 20 20 53 74 61 72 74 20 6f 66 20 61 20 6e 65     Start of a ne
0380: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
0390: 2a 20 20 20 20 20 78 53 79 6e 63 28 29 3a 20 20  *     xSync():  
03a0: 20 20 20 49 6e 69 74 69 61 6c 20 70 61 72 74 20     Initial part 
03b0: 6f 66 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d  of two-phase com
03c0: 6d 69 74 2e 0a 2a 2a 20 20 20 20 20 78 43 6f 6d  mit..**     xCom
03d0: 6d 69 74 28 29 3a 20 20 20 46 69 6e 61 6c 20 70  mit():   Final p
03e0: 61 72 74 20 6f 66 20 74 77 6f 2d 70 68 61 73 65  art of two-phase
03f0: 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 20 20 20 20   commit..**     
0400: 78 52 6f 6c 6c 62 61 63 6b 28 29 3a 20 52 6f 6c  xRollback(): Rol
0410: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
0420: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ction..**.** Any
0430: 74 68 69 6e 67 20 74 68 61 74 20 69 73 20 72 65  thing that is re
0440: 71 75 69 72 65 64 20 61 73 20 70 61 72 74 20 6f  quired as part o
0450: 66 20 61 20 63 6f 6d 6d 69 74 20 74 68 61 74 20  f a commit that 
0460: 6d 61 79 20 66 61 69 6c 20 69 73 20 70 65 72 66  may fail is perf
0470: 6f 72 6d 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ormed.** in the 
0480: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
0490: 2e 20 43 75 72 72 65 6e 74 20 76 65 72 73 69 6f  . Current versio
04a0: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 69 67 6e  ns of SQLite ign
04b0: 6f 72 65 20 61 6e 79 20 65 72 72 6f 72 73 20 0a  ore any errors .
04c0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  ** returned by x
04d0: 43 6f 6d 6d 69 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Commit()..**.** 
04e0: 41 6e 64 20 61 73 20 73 75 62 2d 74 72 61 6e 73  And as sub-trans
04f0: 61 63 74 69 6f 6e 73 20 61 72 65 20 6f 70 65 6e  actions are open
0500: 65 64 2f 63 6c 6f 73 65 64 3a 0a 2a 2a 0a 2a 2a  ed/closed:.**.**
0510: 20 20 20 20 20 78 53 61 76 65 70 6f 69 6e 74 28       xSavepoint(
0520: 69 6e 74 20 53 29 3a 20 20 4f 70 65 6e 20 73 61  int S):  Open sa
0530: 76 65 70 6f 69 6e 74 20 53 2e 0a 2a 2a 20 20 20  vepoint S..**   
0540: 20 20 78 52 65 6c 65 61 73 65 28 69 6e 74 20 53    xRelease(int S
0550: 29 3a 20 20 20 20 43 6f 6d 6d 69 74 20 61 6e 64  ):    Commit and
0560: 20 63 6c 6f 73 65 20 73 61 76 65 70 6f 69 6e 74   close savepoint
0570: 20 53 2e 0a 2a 2a 20 20 20 20 20 78 52 6f 6c 6c   S..**     xRoll
0580: 62 61 63 6b 54 6f 28 69 6e 74 20 53 29 3a 20 52  backTo(int S): R
0590: 6f 6c 6c 62 61 63 6b 20 74 6f 20 73 74 61 72 74  ollback to start
05a0: 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 20 53 2e   of savepoint S.
05b0: 0a 2a 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  .**.** During a 
05c0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
05d0: 6e 20 74 68 65 20 66 74 73 35 5f 69 6e 64 65 78  n the fts5_index
05e0: 2e 63 20 6d 6f 64 75 6c 65 20 6d 61 79 20 63 61  .c module may ca
05f0: 63 68 65 20 73 6f 6d 65 20 64 61 74 61 20 0a 2a  che some data .*
0600: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 2e 20 49 74 20  * in-memory. It 
0610: 69 73 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  is flushed to di
0620: 73 6b 20 77 68 65 6e 65 76 65 72 20 78 53 79 6e  sk whenever xSyn
0630: 63 28 29 2c 20 78 52 65 6c 65 61 73 65 28 29 20  c(), xRelease() 
0640: 6f 72 0a 2a 2a 20 78 53 61 76 65 70 6f 69 6e 74  or.** xSavepoint
0650: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 6e  () is called. An
0660: 64 20 64 69 73 63 61 72 64 65 64 20 77 68 65 6e  d discarded when
0670: 65 76 65 72 20 78 52 6f 6c 6c 62 61 63 6b 28 29  ever xRollback()
0680: 20 6f 72 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 28   or xRollbackTo(
0690: 29 20 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ) .** is called.
06a0: 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
06b0: 6c 6c 79 2c 20 69 66 20 53 51 4c 49 54 45 5f 44  lly, if SQLITE_D
06c0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
06d0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
06e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
06f0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
0700: 65 64 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ed to record the
0710: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
0720: 74 69 6f 6e 20 73 74 61 74 65 2e 20 54 68 69 73  tion state. This
0730: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
0740: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2c  is not required,
0750: 20 62 75 74 20 69 74 20 69 73 20 75 73 65 64 20   but it is used 
0760: 69 6e 20 74 68 65 20 61 73 73 65 72 74 28 29 20  in the assert() 
0770: 73 74 61 74 65 6d 65 6e 74 73 20 65 78 65 63 75  statements execu
0780: 74 65 64 20 62 79 0a 2a 2a 20 66 75 6e 63 74 69  ted by.** functi
0790: 6f 6e 20 66 74 73 35 43 68 65 63 6b 54 72 61 6e  on fts5CheckTran
07a0: 73 61 63 74 69 6f 6e 53 74 61 74 65 28 29 20 28  sactionState() (
07b0: 73 65 65 20 62 65 6c 6f 77 29 2e 0a 2a 2f 0a 73  see below)..*/.s
07c0: 74 72 75 63 74 20 46 74 73 35 54 72 61 6e 73 61  truct Fts5Transa
07d0: 63 74 69 6f 6e 53 74 61 74 65 20 7b 0a 20 20 69  ctionState {.  i
07e0: 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  nt eState;      
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0800: 2a 20 30 3d 3d 63 6c 6f 73 65 64 2c 20 31 3d 3d  * 0==closed, 1==
0810: 6f 70 65 6e 2c 20 32 3d 3d 73 79 6e 63 65 64 20  open, 2==synced 
0820: 2a 2f 0a 20 20 69 6e 74 20 69 53 61 76 65 70 6f  */.  int iSavepo
0830: 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
0840: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0850: 66 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  f open savepoint
0860: 73 20 28 30 20 2d 3e 20 6e 6f 6e 65 29 20 2a 2f  s (0 -> none) */
0870: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e  .};../*.** A sin
0880: 67 6c 65 20 6f 62 6a 65 63 74 20 6f 66 20 74 68  gle object of th
0890: 69 73 20 74 79 70 65 20 69 73 20 61 6c 6c 6f 63  is type is alloc
08a0: 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 46 54  ated when the FT
08b0: 53 35 20 6d 6f 64 75 6c 65 20 69 73 20 0a 2a 2a  S5 module is .**
08c0: 20 72 65 67 69 73 74 65 72 65 64 20 77 69 74 68   registered with
08d0: 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   a database hand
08e0: 6c 65 2e 20 49 74 20 69 73 20 75 73 65 64 20 74  le. It is used t
08f0: 6f 20 73 74 6f 72 65 20 70 6f 69 6e 74 65 72 73  o store pointers
0900: 20 74 6f 0a 2a 2a 20 61 6c 6c 20 72 65 67 69 73   to.** all regis
0910: 74 65 72 65 64 20 46 54 53 35 20 65 78 74 65 6e  tered FTS5 exten
0920: 73 69 6f 6e 73 20 2d 20 74 6f 6b 65 6e 69 7a 65  sions - tokenize
0930: 72 73 20 61 6e 64 20 61 75 78 69 6c 69 61 72 79  rs and auxiliary
0940: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   functions..*/.s
0950: 74 72 75 63 74 20 46 74 73 35 47 6c 6f 62 61 6c  truct Fts5Global
0960: 20 7b 0a 20 20 66 74 73 35 5f 61 70 69 20 61 70   {.  fts5_api ap
0970: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
0980: 20 20 20 20 20 2f 2a 20 55 73 65 72 20 76 69 73       /* User vis
0990: 69 62 6c 65 20 70 61 72 74 20 6f 66 20 6f 62 6a  ible part of obj
09a0: 65 63 74 20 28 73 65 65 20 66 74 73 35 2e 68 29  ect (see fts5.h)
09b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
09c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
09d0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
09e0: 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ted database con
09f0: 6e 65 63 74 69 6f 6e 20 2a 2f 20 0a 20 20 69 36  nection */ .  i6
0a00: 34 20 69 4e 65 78 74 49 64 3b 20 20 20 20 20 20  4 iNextId;      
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0a20: 20 55 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   Used to allocat
0a30: 65 20 75 6e 69 71 75 65 20 63 75 72 73 6f 72 20  e unique cursor 
0a40: 69 64 73 20 2a 2f 0a 20 20 46 74 73 35 41 75 78  ids */.  Fts5Aux
0a50: 69 6c 69 61 72 79 20 2a 70 41 75 78 3b 20 20 20  iliary *pAux;   
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
0a70: 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  t in list of all
0a80: 20 61 75 78 2e 20 66 75 6e 63 74 69 6f 6e 73 20   aux. functions 
0a90: 2a 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  */.  Fts5Tokeniz
0aa0: 65 72 4d 6f 64 75 6c 65 20 2a 70 54 6f 6b 3b 20  erModule *pTok; 
0ab0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
0ac0: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 6f 6b   list of all tok
0ad0: 65 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 73 20 2a  enizer modules *
0ae0: 2f 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  /.  Fts5Cursor *
0af0: 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20  pCsr;           
0b00: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
0b10: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  list of all open
0b20: 20 63 75 72 73 6f 72 73 20 2a 2f 0a 7d 3b 0a 0a   cursors */.};..
0b30: 2f 2a 0a 2a 2a 20 45 61 63 68 20 61 75 78 69 6c  /*.** Each auxil
0b40: 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 20 72 65  iary function re
0b50: 67 69 73 74 65 72 65 64 20 77 69 74 68 20 74 68  gistered with th
0b60: 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 69 73  e FTS5 module is
0b70: 20 72 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a 20   represented.** 
0b80: 62 79 20 61 6e 20 6f 62 6a 65 63 74 20 6f 66 20  by an object of 
0b90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  the following ty
0ba0: 70 65 2e 20 41 6c 6c 20 73 75 63 68 20 6f 62 6a  pe. All such obj
0bb0: 65 63 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ects are stored 
0bc0: 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  as part.** of th
0bd0: 65 20 46 74 73 35 47 6c 6f 62 61 6c 2e 70 41 75  e Fts5Global.pAu
0be0: 78 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  x list..*/.struc
0bf0: 74 20 46 74 73 35 41 75 78 69 6c 69 61 72 79 20  t Fts5Auxiliary 
0c00: 7b 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a  {.  Fts5Global *
0c10: 70 47 6c 6f 62 61 6c 3b 20 20 20 20 20 20 20 20  pGlobal;        
0c20: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 63 6f      /* Global co
0c30: 6e 74 65 78 74 20 66 6f 72 20 74 68 69 73 20 66  ntext for this f
0c40: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  unction */.  cha
0c50: 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20 20  r *zFunc;       
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0c70: 46 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 28 6e  Function name (n
0c80: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 29 20 2a  ul-terminated) *
0c90: 2f 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44  /.  void *pUserD
0ca0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
0cb0: 20 20 20 20 2f 2a 20 55 73 65 72 2d 64 61 74 61      /* User-data
0cc0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 66 74   pointer */.  ft
0cd0: 73 35 5f 65 78 74 65 6e 73 69 6f 6e 5f 66 75 6e  s5_extension_fun
0ce0: 63 74 69 6f 6e 20 78 46 75 6e 63 3b 20 20 2f 2a  ction xFunc;  /*
0cf0: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
0d00: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  on */.  void (*x
0d10: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 3b  Destroy)(void*);
0d20: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
0d30: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 2a  uctor function *
0d40: 2f 0a 20 20 46 74 73 35 41 75 78 69 6c 69 61 72  /.  Fts5Auxiliar
0d50: 79 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  y *pNext;       
0d60: 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 65 67 69      /* Next regi
0d70: 73 74 65 72 65 64 20 61 75 78 69 6c 69 61 72 79  stered auxiliary
0d80: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a   function */.};.
0d90: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 74 6f 6b 65  ./*.** Each toke
0da0: 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20 72 65 67  nizer module reg
0db0: 69 73 74 65 72 65 64 20 77 69 74 68 20 74 68 65  istered with the
0dc0: 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 69 73 20   FTS5 module is 
0dd0: 72 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a 20 62  represented.** b
0de0: 79 20 61 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74  y an object of t
0df0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70  he following typ
0e00: 65 2e 20 41 6c 6c 20 73 75 63 68 20 6f 62 6a 65  e. All such obje
0e10: 63 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  cts are stored a
0e20: 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  s part.** of the
0e30: 20 46 74 73 35 47 6c 6f 62 61 6c 2e 70 54 6f 6b   Fts5Global.pTok
0e40: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   list..*/.struct
0e50: 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f   Fts5TokenizerMo
0e60: 64 75 6c 65 20 7b 0a 20 20 63 68 61 72 20 2a 7a  dule {.  char *z
0e70: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
0e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0e90: 20 6f 66 20 74 6f 6b 65 6e 69 7a 65 72 20 2a 2f   of tokenizer */
0ea0: 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61  .  void *pUserDa
0eb0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
0ec0: 20 20 20 2f 2a 20 55 73 65 72 20 70 6f 69 6e 74     /* User point
0ed0: 65 72 20 70 61 73 73 65 64 20 74 6f 20 78 43 72  er passed to xCr
0ee0: 65 61 74 65 28 29 20 2a 2f 0a 20 20 66 74 73 35  eate() */.  fts5
0ef0: 5f 74 6f 6b 65 6e 69 7a 65 72 20 78 3b 20 20 20  _tokenizer x;   
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0f10: 6f 6b 65 6e 69 7a 65 72 20 66 75 6e 63 74 69 6f  okenizer functio
0f20: 6e 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ns */.  void (*x
0f30: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 3b  Destroy)(void*);
0f40: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
0f50: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 2a  uctor function *
0f60: 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  /.  Fts5Tokenize
0f70: 72 4d 6f 64 75 6c 65 20 2a 70 4e 65 78 74 3b 20  rModule *pNext; 
0f80: 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 65 67 69      /* Next regi
0f90: 73 74 65 72 65 64 20 74 6f 6b 65 6e 69 7a 65 72  stered tokenizer
0fa0: 20 6d 6f 64 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f   module */.};../
0fb0: 2a 0a 2a 2a 20 56 69 72 74 75 61 6c 2d 74 61 62  *.** Virtual-tab
0fc0: 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  le object..*/.st
0fd0: 72 75 63 74 20 46 74 73 35 54 61 62 6c 65 20 7b  ruct Fts5Table {
0fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
0ff0: 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  base;           
1000: 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
1010: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
1020: 63 6f 72 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f  core */.  Fts5Co
1030: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20  nfig *pConfig;  
1040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
1050: 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 66 69  tual table confi
1060: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 46 74  guration */.  Ft
1070: 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b  s5Index *pIndex;
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1090: 20 46 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   Full-text index
10a0: 20 2a 2f 0a 20 20 46 74 73 35 53 74 6f 72 61 67   */.  Fts5Storag
10b0: 65 20 2a 70 53 74 6f 72 61 67 65 3b 20 20 20 20  e *pStorage;    
10c0: 20 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e        /* Documen
10d0: 74 20 73 74 6f 72 65 20 2a 2f 0a 20 20 46 74 73  t store */.  Fts
10e0: 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c  5Global *pGlobal
10f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1100: 47 6c 6f 62 61 6c 20 28 63 6f 6e 6e 65 63 74 69  Global (connecti
1110: 6f 6e 20 77 69 64 65 29 20 64 61 74 61 20 2a 2f  on wide) data */
1120: 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70  .  Fts5Cursor *p
1130: 53 6f 72 74 43 73 72 3b 20 20 20 20 20 20 20 20  SortCsr;        
1140: 20 20 20 2f 2a 20 53 6f 72 74 20 64 61 74 61 20     /* Sort data 
1150: 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f 72  from this cursor
1160: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1170: 45 5f 44 45 42 55 47 0a 20 20 73 74 72 75 63 74  E_DEBUG.  struct
1180: 20 46 74 73 35 54 72 61 6e 73 61 63 74 69 6f 6e   Fts5Transaction
1190: 53 74 61 74 65 20 74 73 3b 0a 23 65 6e 64 69 66  State ts;.#endif
11a0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .};..struct Fts5
11b0: 4d 61 74 63 68 50 68 72 61 73 65 20 7b 0a 20 20  MatchPhrase {.  
11c0: 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 6f 73  Fts5Buffer *pPos
11d0: 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
11e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
11f0: 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f  rrent poslist */
1200: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20  .  int nTerm;   
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 68     /* Size of ph
1230: 72 61 73 65 20 69 6e 20 74 65 72 6d 73 20 2a 2f  rase in terms */
1240: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 70 53 74 6d 74  .};../*.** pStmt
1250: 3a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 72 6f  :.**   SELECT ro
1260: 77 69 64 2c 20 3c 66 74 73 3e 20 46 52 4f 4d 20  wid, <fts> FROM 
1270: 3c 66 74 73 3e 20 4f 52 44 45 52 20 42 59 20 2b  <fts> ORDER BY +
1280: 72 61 6e 6b 3b 0a 2a 2a 0a 2a 2a 20 61 49 64 78  rank;.**.** aIdx
1290: 5b 5d 3a 0a 2a 2a 20 20 20 54 68 65 72 65 20 69  []:.**   There i
12a0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
12b0: 68 65 20 61 49 64 78 5b 5d 20 61 72 72 61 79 20  he aIdx[] array 
12c0: 66 6f 72 20 65 61 63 68 20 70 68 72 61 73 65 20  for each phrase 
12d0: 69 6e 20 74 68 65 20 71 75 65 72 79 2c 0a 2a 2a  in the query,.**
12e0: 20 20 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20     the value of 
12f0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6f 66 66  which is the off
1300: 73 65 74 20 77 69 74 68 69 6e 20 61 50 6f 73 6c  set within aPosl
1310: 69 73 74 5b 5d 20 66 6f 6c 6c 6f 77 69 6e 67 20  ist[] following 
1320: 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20 20 20 62  the last .**   b
1330: 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74  yte of the posit
1340: 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 74 68 65  ion list for the
1350: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
1360: 68 72 61 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  hrase..*/.struct
1370: 20 46 74 73 35 53 6f 72 74 65 72 20 7b 0a 20 20   Fts5Sorter {.  
1380: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1390: 74 6d 74 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  tmt;.  i64 iRowi
13a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
13b0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
13c0: 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 6f 6e  t rowid */.  con
13d0: 73 74 20 75 38 20 2a 61 50 6f 73 6c 69 73 74 3b  st u8 *aPoslist;
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f0: 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 20 66  Position lists f
1400: 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a  or current row *
1410: 2f 0a 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20  /.  int nIdx;   
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1440: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 49 64 78   entries in aIdx
1450: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 61 49 64 78  [] */.  int aIdx
1460: 5b 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [0];            
1470: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1480: 74 73 20 69 6e 74 6f 20 61 50 6f 73 6c 69 73 74  ts into aPoslist
1490: 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77   for current row
14a0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 56   */.};.../*.** V
14b0: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 63 75 72  irtual-table cur
14c0: 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
14d0: 2a 20 7a 53 70 65 63 69 61 6c 3a 0a 2a 2a 20 20  * zSpecial:.**  
14e0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 27 73   If this is a 's
14f0: 70 65 63 69 61 6c 27 20 71 75 65 72 79 20 28 72  pecial' query (r
1500: 65 66 65 72 20 74 6f 20 66 75 6e 63 74 69 6f 6e  efer to function
1510: 20 66 74 73 35 53 70 65 63 69 61 6c 4d 61 74 63   fts5SpecialMatc
1520: 68 28 29 29 2c 20 0a 2a 2a 20 20 20 74 68 65 6e  h()), .**   then
1530: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 70   this variable p
1540: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
1550: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
1560: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a   containing the.
1570: 2a 2a 20 20 20 72 65 73 75 6c 74 20 74 6f 20 72  **   result to r
1580: 65 74 75 72 6e 20 74 68 72 6f 75 67 68 20 74 68  eturn through th
1590: 65 20 74 61 62 6c 65 2d 6e 61 6d 65 20 63 6f 6c  e table-name col
15a0: 75 6d 6e 2e 20 49 74 20 69 73 20 6e 75 6c 2d 74  umn. It is nul-t
15b0: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 61  erminated.**   a
15c0: 6e 64 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75  nd should eventu
15d0: 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 75 73  ally be freed us
15e0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
15f0: 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  ()..*/.struct Ft
1600: 73 35 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  s5Cursor {.  sql
1610: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
1620: 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20   base;       /* 
1630: 42 61 73 65 20 63 6c 61 73 73 20 75 73 65 64 20  Base class used 
1640: 62 79 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  by SQLite core *
1650: 2f 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 3b 20  /.  int idxNum; 
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 2f 2a 20 69 64 78 4e 75 6d 20 70 61      /* idxNum pa
1680: 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65 72 28  ssed to xFilter(
1690: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  ) */.  sqlite3_s
16a0: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
16b0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
16c0: 65 6e 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ent used to read
16d0: 20 25 5f 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20   %_content */.  
16e0: 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 3b  Fts5Expr *pExpr;
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
1710: 72 20 4d 41 54 43 48 20 71 75 65 72 69 65 73 20  r MATCH queries 
1720: 2a 2f 0a 20 20 46 74 73 35 53 6f 72 74 65 72 20  */.  Fts5Sorter 
1730: 2a 70 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20  *pSorter;       
1740: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 66       /* Sorter f
1750: 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 61 6e  or "ORDER BY ran
1760: 6b 22 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  k" queries */.  
1770: 69 6e 74 20 63 73 72 66 6c 61 67 73 3b 20 20 20  int csrflags;   
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
17a0: 72 20 66 6c 61 67 73 20 28 73 65 65 20 62 65 6c  r flags (see bel
17b0: 6f 77 29 20 2a 2f 0a 20 20 46 74 73 35 43 75 72  ow) */.  Fts5Cur
17c0: 73 6f 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  sor *pNext;     
17d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
17e0: 20 63 75 72 73 6f 72 20 69 6e 20 46 74 73 35 43   cursor in Fts5C
17f0: 75 72 73 6f 72 2e 70 43 73 72 20 6c 69 73 74 20  ursor.pCsr list 
1800: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 70 65 63  */.  char *zSpec
1810: 69 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ial;            
1820: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
1830: 66 20 73 70 65 63 69 61 6c 20 71 75 65 72 79 20  f special query 
1840: 2a 2f 0a 0a 20 20 2f 2a 20 22 72 61 6e 6b 22 20  */..  /* "rank" 
1850: 66 75 6e 63 74 69 6f 6e 2e 20 50 6f 70 75 6c 61  function. Popula
1860: 74 65 64 20 6f 6e 20 64 65 6d 61 6e 64 20 66 72  ted on demand fr
1870: 6f 6d 20 76 74 61 62 2e 78 43 6f 6c 75 6d 6e 28  om vtab.xColumn(
1880: 29 2e 20 2a 2f 0a 20 20 46 74 73 35 41 75 78 69  ). */.  Fts5Auxi
1890: 6c 69 61 72 79 20 2a 70 52 61 6e 6b 3b 20 20 20  liary *pRank;   
18a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 6b 20          /* Rank 
18b0: 63 61 6c 6c 62 61 63 6b 20 28 6f 72 20 4e 55 4c  callback (or NUL
18c0: 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 61 6e  L) */.  int nRan
18d0: 6b 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  kArg;           
18e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18f0: 72 20 6f 66 20 74 72 61 69 6c 69 6e 67 20 61 72  r of trailing ar
1900: 67 75 6d 65 6e 74 73 20 66 6f 72 20 72 61 6e 6b  guments for rank
1910: 28 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  () */.  sqlite3_
1920: 76 61 6c 75 65 20 2a 2a 61 70 52 61 6e 6b 41 72  value **apRankAr
1930: 67 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  g;      /* Array
1940: 20 6f 66 20 74 72 61 69 6c 69 6e 67 20 61 72 67   of trailing arg
1950: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  uments */.  sqli
1960: 74 65 33 5f 73 74 6d 74 20 2a 70 52 61 6e 6b 41  te3_stmt *pRankA
1970: 72 67 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 4f  rgStmt;     /* O
1980: 72 69 67 69 6e 20 6f 66 20 6f 62 6a 65 63 74 73  rigin of objects
1990: 20 69 6e 20 61 70 52 61 6e 6b 41 72 67 5b 5d 20   in apRankArg[] 
19a0: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  */..  /* Variabl
19b0: 65 73 20 75 73 65 64 20 62 79 20 61 75 78 69 6c  es used by auxil
19c0: 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 2a  iary functions *
19d0: 2f 0a 20 20 69 36 34 20 69 43 73 72 49 64 3b 20  /.  i64 iCsrId; 
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 69 64      /* Cursor id
1a00: 20 2a 2f 0a 20 20 46 74 73 35 41 75 78 69 6c 69   */.  Fts5Auxili
1a10: 61 72 79 20 2a 70 41 75 78 3b 20 20 20 20 20 20  ary *pAux;      
1a20: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1a30: 6c 79 20 65 78 65 63 75 74 69 6e 67 20 65 78 74  ly executing ext
1a40: 65 6e 73 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  ension function 
1a50: 2a 2f 0a 20 20 46 74 73 35 41 75 78 64 61 74 61  */.  Fts5Auxdata
1a60: 20 2a 70 41 75 78 64 61 74 61 3b 20 20 20 20 20   *pAuxdata;     
1a70: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
1a80: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1a90: 73 61 76 65 64 20 61 75 78 2d 64 61 74 61 20 2a  saved aux-data *
1aa0: 2f 0a 20 20 69 6e 74 20 2a 61 43 6f 6c 75 6d 6e  /.  int *aColumn
1ab0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1ac0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 66 6f      /* Values fo
1ad0: 72 20 78 43 6f 6c 75 6d 6e 53 69 7a 65 28 29 20  r xColumnSize() 
1ae0: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 49 6e 73 74 43  */..  int nInstC
1af0: 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
1b00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b10: 6f 66 20 70 68 72 61 73 65 20 69 6e 73 74 61 6e  of phrase instan
1b20: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 49  ces */.  int *aI
1b30: 6e 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nst;            
1b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 69 6e           /* 3 in
1b50: 74 65 67 65 72 73 20 70 65 72 20 70 68 72 61 73  tegers per phras
1b60: 65 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 7d 3b  e instance */.};
1b70: 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66  ../*.** Values f
1b80: 6f 72 20 46 74 73 35 43 75 72 73 6f 72 2e 63 73  or Fts5Cursor.cs
1b90: 72 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  rflags.*/.#defin
1ba0: 65 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52  e FTS5CSR_REQUIR
1bb0: 45 5f 43 4f 4e 54 45 4e 54 20 20 20 30 78 30 31  E_CONTENT   0x01
1bc0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 43 53 52  .#define FTS5CSR
1bd0: 5f 52 45 51 55 49 52 45 5f 44 4f 43 53 49 5a 45  _REQUIRE_DOCSIZE
1be0: 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20     0x02.#define 
1bf0: 46 54 53 35 43 53 52 5f 45 4f 46 20 20 20 20 20  FTS5CSR_EOF     
1c00: 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a 0a            0x04..
1c10: 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 74 6f 20  /*.** Macros to 
1c20: 53 65 74 28 29 2c 20 43 6c 65 61 72 28 29 20 61  Set(), Clear() a
1c30: 6e 64 20 54 65 73 74 28 29 20 63 75 72 73 6f 72  nd Test() cursor
1c40: 20 66 6c 61 67 73 2e 0a 2a 2f 0a 23 64 65 66 69   flags..*/.#defi
1c50: 6e 65 20 43 73 72 46 6c 61 67 53 65 74 28 70 43  ne CsrFlagSet(pC
1c60: 73 72 2c 20 66 6c 61 67 29 20 20 20 28 28 70 43  sr, flag)   ((pC
1c70: 73 72 29 2d 3e 63 73 72 66 6c 61 67 73 20 7c 3d  sr)->csrflags |=
1c80: 20 28 66 6c 61 67 29 29 0a 23 64 65 66 69 6e 65   (flag)).#define
1c90: 20 43 73 72 46 6c 61 67 43 6c 65 61 72 28 70 43   CsrFlagClear(pC
1ca0: 73 72 2c 20 66 6c 61 67 29 20 28 28 70 43 73 72  sr, flag) ((pCsr
1cb0: 29 2d 3e 63 73 72 66 6c 61 67 73 20 26 3d 20 7e  )->csrflags &= ~
1cc0: 28 66 6c 61 67 29 29 0a 23 64 65 66 69 6e 65 20  (flag)).#define 
1cd0: 43 73 72 46 6c 61 67 54 65 73 74 28 70 43 73 72  CsrFlagTest(pCsr
1ce0: 2c 20 66 6c 61 67 29 20 20 28 28 70 43 73 72 29  , flag)  ((pCsr)
1cf0: 2d 3e 63 73 72 66 6c 61 67 73 20 26 20 28 66 6c  ->csrflags & (fl
1d00: 61 67 29 29 0a 0a 73 74 72 75 63 74 20 46 74 73  ag))..struct Fts
1d10: 35 41 75 78 64 61 74 61 20 7b 0a 20 20 46 74 73  5Auxdata {.  Fts
1d20: 35 41 75 78 69 6c 69 61 72 79 20 2a 70 41 75 78  5Auxiliary *pAux
1d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1d40: 45 78 74 65 6e 73 69 6f 6e 20 74 6f 20 77 68 69  Extension to whi
1d50: 63 68 20 74 68 69 73 20 62 65 6c 6f 6e 67 73 20  ch this belongs 
1d60: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 50 74 72 3b  */.  void *pPtr;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d90: 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 28  value */.  void(
1da0: 2a 78 44 65 6c 65 74 65 29 28 76 6f 69 64 2a 29  *xDelete)(void*)
1db0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  ;          /* De
1dc0: 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 46 74  structor */.  Ft
1dd0: 73 35 41 75 78 64 61 74 61 20 2a 70 4e 65 78 74  s5Auxdata *pNext
1de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1df0: 20 4e 65 78 74 20 6f 62 6a 65 63 74 20 69 6e 20   Next object in 
1e00: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 7d  linked list */.}
1e10: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1e20: 5f 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 46  _DEBUG.#define F
1e30: 54 53 35 5f 42 45 47 49 4e 20 20 20 20 20 20 31  TS5_BEGIN      1
1e40: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 59  .#define FTS5_SY
1e50: 4e 43 20 20 20 20 20 20 20 32 0a 23 64 65 66 69  NC       2.#defi
1e60: 6e 65 20 46 54 53 35 5f 43 4f 4d 4d 49 54 20 20  ne FTS5_COMMIT  
1e70: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 46 54 53     3.#define FTS
1e80: 35 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 34 0a 23  5_ROLLBACK   4.#
1e90: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 41 56 45  define FTS5_SAVE
1ea0: 50 4f 49 4e 54 20 20 35 0a 23 64 65 66 69 6e 65  POINT  5.#define
1eb0: 20 46 54 53 35 5f 52 45 4c 45 41 53 45 20 20 20   FTS5_RELEASE   
1ec0: 20 36 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f   6.#define FTS5_
1ed0: 52 4f 4c 4c 42 41 43 4b 54 4f 20 37 0a 73 74 61  ROLLBACKTO 7.sta
1ee0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 65  tic void fts5Che
1ef0: 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61  ckTransactionSta
1f00: 74 65 28 46 74 73 35 54 61 62 6c 65 20 2a 70 2c  te(Fts5Table *p,
1f10: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
1f20: 76 65 70 6f 69 6e 74 29 7b 0a 20 20 73 77 69 74  vepoint){.  swit
1f30: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1f40: 73 65 20 46 54 53 35 5f 42 45 47 49 4e 3a 0a 20  se FTS5_BEGIN:. 
1f50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1f60: 74 73 2e 65 53 74 61 74 65 3d 3d 30 20 29 3b 0a  ts.eState==0 );.
1f70: 20 20 20 20 20 20 70 2d 3e 74 73 2e 65 53 74 61        p->ts.eSta
1f80: 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  te = 1;.      p-
1f90: 3e 74 73 2e 69 53 61 76 65 70 6f 69 6e 74 20 3d  >ts.iSavepoint =
1fa0: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
1fb0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35  ;..    case FTS5
1fc0: 5f 53 59 4e 43 3a 0a 20 20 20 20 20 20 61 73 73  _SYNC:.      ass
1fd0: 65 72 74 28 20 70 2d 3e 74 73 2e 65 53 74 61 74  ert( p->ts.eStat
1fe0: 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  e==1 );.      p-
1ff0: 3e 74 73 2e 65 53 74 61 74 65 20 3d 20 32 3b 0a  >ts.eState = 2;.
2000: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2010: 20 20 63 61 73 65 20 46 54 53 35 5f 43 4f 4d 4d    case FTS5_COMM
2020: 49 54 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  IT:.      assert
2030: 28 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d  ( p->ts.eState==
2040: 32 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74 73  2 );.      p->ts
2050: 2e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20  .eState = 0;.   
2060: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
2070: 61 73 65 20 46 54 53 35 5f 52 4f 4c 4c 42 41 43  ase FTS5_ROLLBAC
2080: 4b 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  K:.      assert(
2090: 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d 31   p->ts.eState==1
20a0: 20 7c 7c 20 70 2d 3e 74 73 2e 65 53 74 61 74 65   || p->ts.eState
20b0: 3d 3d 32 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==2 );.      p->
20c0: 74 73 2e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20  ts.eState = 0;. 
20d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
20e0: 20 63 61 73 65 20 46 54 53 35 5f 53 41 56 45 50   case FTS5_SAVEP
20f0: 4f 49 4e 54 3a 0a 20 20 20 20 20 20 61 73 73 65  OINT:.      asse
2100: 72 74 28 20 70 2d 3e 74 73 2e 65 53 74 61 74 65  rt( p->ts.eState
2110: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==1 );.      ass
2120: 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
2130: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2140: 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 70  rt( iSavepoint>p
2150: 2d 3e 74 73 2e 69 53 61 76 65 70 6f 69 6e 74 20  ->ts.iSavepoint 
2160: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74 73 2e 69  );.      p->ts.i
2170: 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 53 61 76  Savepoint = iSav
2180: 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 62 72  epoint;.      br
2190: 65 61 6b 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  eak;.      .    
21a0: 63 61 73 65 20 46 54 53 35 5f 52 45 4c 45 41 53  case FTS5_RELEAS
21b0: 45 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  E:.      assert(
21c0: 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d 31   p->ts.eState==1
21d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21e0: 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
21f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2200: 20 69 53 61 76 65 70 6f 69 6e 74 3c 3d 70 2d 3e   iSavepoint<=p->
2210: 74 73 2e 69 53 61 76 65 70 6f 69 6e 74 20 29 3b  ts.iSavepoint );
2220: 0a 20 20 20 20 20 20 70 2d 3e 74 73 2e 69 53 61  .      p->ts.iSa
2230: 76 65 70 6f 69 6e 74 20 3d 20 69 53 61 76 65 70  vepoint = iSavep
2240: 6f 69 6e 74 2d 31 3b 0a 20 20 20 20 20 20 62 72  oint-1;.      br
2250: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 46  eak;..    case F
2260: 54 53 35 5f 52 4f 4c 4c 42 41 43 4b 54 4f 3a 0a  TS5_ROLLBACKTO:.
2270: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2280: 3e 74 73 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b  >ts.eState==1 );
2290: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
22a0: 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a  Savepoint>=0 );.
22b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
22c0: 61 76 65 70 6f 69 6e 74 3c 3d 70 2d 3e 74 73 2e  avepoint<=p->ts.
22d0: 69 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  iSavepoint );.  
22e0: 20 20 20 20 70 2d 3e 74 73 2e 69 53 61 76 65 70      p->ts.iSavep
22f0: 6f 69 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e  oint = iSavepoin
2300: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
2310: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
2320: 66 69 6e 65 20 66 74 73 35 43 68 65 63 6b 54 72  fine fts5CheckTr
2330: 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65 28 78  ansactionState(x
2340: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ,y,z).#endif.../
2350: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 76 69 72  *.** Close a vir
2360: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
2370: 65 20 6f 70 65 6e 65 64 20 62 79 20 66 74 73 35  e opened by fts5
2380: 49 6e 69 74 56 74 61 62 28 29 2e 20 49 66 20 74  InitVtab(). If t
2390: 68 65 20 62 44 65 73 74 72 6f 79 0a 2a 2a 20 61  he bDestroy.** a
23a0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
23b0: 65 72 6f 2c 20 61 74 74 65 6d 70 74 20 64 65 6c  ero, attempt del
23c0: 65 74 65 20 74 68 65 20 73 68 61 64 6f 77 20 74  ete the shadow t
23d0: 61 62 6c 65 73 20 66 72 6f 6d 20 74 65 68 20 64  ables from teh d
23e0: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
23f0: 63 20 69 6e 74 20 66 74 73 35 46 72 65 65 56 74  c int fts5FreeVt
2400: 61 62 28 46 74 73 35 54 61 62 6c 65 20 2a 70 54  ab(Fts5Table *pT
2410: 61 62 2c 20 69 6e 74 20 62 44 65 73 74 72 6f 79  ab, int bDestroy
2420: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2430: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
2440: 54 61 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  Tab ){.    int r
2450: 63 32 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71  c2;.    rc2 = sq
2460: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
2470: 6f 73 65 28 70 54 61 62 2d 3e 70 49 6e 64 65 78  ose(pTab->pIndex
2480: 2c 20 62 44 65 73 74 72 6f 79 29 3b 0a 20 20 20  , bDestroy);.   
2490: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24a0: 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
24b0: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
24c0: 46 74 73 35 53 74 6f 72 61 67 65 43 6c 6f 73 65  Fts5StorageClose
24d0: 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c  (pTab->pStorage,
24e0: 20 62 44 65 73 74 72 6f 79 29 3b 0a 20 20 20 20   bDestroy);.    
24f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2500: 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
2510: 20 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e    sqlite3Fts5Con
2520: 66 69 67 46 72 65 65 28 70 54 61 62 2d 3e 70 43  figFree(pTab->pC
2530: 6f 6e 66 69 67 29 3b 0a 20 20 20 20 73 71 6c 69  onfig);.    sqli
2540: 74 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a  te3_free(pTab);.
2550: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 44  .}../*.** The xD
2570: 69 73 63 6f 6e 6e 65 63 74 28 29 20 76 69 72 74  isconnect() virt
2580: 75 61 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64  ual table method
2590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25a0: 66 74 73 35 44 69 73 63 6f 6e 6e 65 63 74 4d 65  fts5DisconnectMe
25b0: 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
25c0: 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 72 65 74  b *pVtab){.  ret
25d0: 75 72 6e 20 66 74 73 35 46 72 65 65 56 74 61 62  urn fts5FreeVtab
25e0: 28 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56 74  ((Fts5Table*)pVt
25f0: 61 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ab, 0);.}../*.**
2600: 20 54 68 65 20 78 44 65 73 74 72 6f 79 28 29 20   The xDestroy() 
2610: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 65  virtual table me
2620: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
2630: 69 6e 74 20 66 74 73 35 44 65 73 74 72 6f 79 4d  int fts5DestroyM
2640: 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74  ethod(sqlite3_vt
2650: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 72 65  ab *pVtab){.  re
2660: 74 75 72 6e 20 66 74 73 35 46 72 65 65 56 74 61  turn fts5FreeVta
2670: 62 28 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56  b((Fts5Table*)pV
2680: 74 61 62 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  tab, 1);.}../*.*
2690: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26a0: 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
26b0: 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20 74 68  ation of both th
26c0: 65 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78  e xConnect and x
26d0: 43 72 65 61 74 65 0a 2a 2a 20 6d 65 74 68 6f 64  Create.** method
26e0: 73 20 6f 66 20 74 68 65 20 46 54 53 33 20 76 69  s of the FTS3 vi
26f0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
2700: 2a 2a 20 54 68 65 20 61 72 67 76 5b 5d 20 61 72  ** The argv[] ar
2710: 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ray contains the
2720: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
2730: 2a 20 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e  *   argv[0]   ->
2740: 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28 22   module name  ("
2750: 66 74 73 35 22 29 0a 2a 2a 20 20 20 61 72 67 76  fts5").**   argv
2760: 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73  [1]   -> databas
2770: 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
2780: 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e  [2]   -> table n
2790: 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e  ame.**   argv[..
27a0: 2e 5d 20 2d 3e 20 22 63 6f 6c 75 6d 6e 20 6e 61  .] -> "column na
27b0: 6d 65 22 20 61 6e 64 20 6f 74 68 65 72 20 6d 6f  me" and other mo
27c0: 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 20 66 69  dule argument fi
27d0: 65 6c 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  elds..*/.static 
27e0: 69 6e 74 20 66 74 73 35 49 6e 69 74 56 74 61 62  int fts5InitVtab
27f0: 28 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c  (.  int bCreate,
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2820: 78 43 72 65 61 74 65 2c 20 66 61 6c 73 65 20 66  xCreate, false f
2830: 6f 72 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20  or xConnect */. 
2840: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 2f 2a 20 54 68 65 20 53 51 4c 69 74 65 20 64   /* The SQLite d
2870: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2880: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
2890: 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ux,             
28a0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
28b0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
28c0: 20 74 6f 6b 65 6e 69 7a 65 72 73 20 2a 2f 0a 20   tokenizers */. 
28d0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
2900: 65 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61  ements in argv a
2910: 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rray */.  const 
2920: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72  char * const *ar
2930: 67 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72  gv,       /* xCr
2940: 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72  eate/xConnect ar
2950: 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a  gument array */.
2960: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
2970: 2a 70 70 56 54 61 62 2c 20 20 20 20 20 20 20 20  *ppVTab,        
2980: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
2990: 65 73 75 6c 74 69 6e 67 20 76 74 61 62 20 73 74  esulting vtab st
29a0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
29b0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20    char **pzErr  
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 2f 2a 20 57 72 69 74 65 20 61 6e 79 20 65    /* Write any e
29e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72  rror message her
29f0: 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 47 6c  e */.){.  Fts5Gl
2a00: 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 20 3d 20  obal *pGlobal = 
2a10: 28 46 74 73 35 47 6c 6f 62 61 6c 2a 29 70 41 75  (Fts5Global*)pAu
2a20: 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x;.  const char 
2a30: 2a 2a 61 7a 43 6f 6e 66 69 67 20 3d 20 28 63 6f  **azConfig = (co
2a40: 6e 73 74 20 63 68 61 72 2a 2a 29 61 72 67 76 3b  nst char**)argv;
2a50: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2a80: 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
2a90: 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20 20 20 20  g *pConfig;     
2aa0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2ab0: 73 20 6f 66 20 70 61 72 73 69 6e 67 20 61 72 67  s of parsing arg
2ac0: 63 2f 61 72 67 76 20 2a 2f 0a 20 20 46 74 73 35  c/argv */.  Fts5
2ad0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2af0: 65 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ew virtual table
2b00: 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2f 2a   object */..  /*
2b10: 20 50 61 72 73 65 20 74 68 65 20 61 72 67 75 6d   Parse the argum
2b20: 65 6e 74 73 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ents */.  rc = s
2b30: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
2b40: 50 61 72 73 65 28 70 47 6c 6f 62 61 6c 2c 20 64  Parse(pGlobal, d
2b50: 62 2c 20 61 72 67 63 2c 20 61 7a 43 6f 6e 66 69  b, argc, azConfi
2b60: 67 2c 20 26 70 43 6f 6e 66 69 67 2c 20 70 7a 45  g, &pConfig, pzE
2b70: 72 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  rr);.  assert( (
2b80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b90: 20 2a 70 7a 45 72 72 3d 3d 30 29 20 7c 7c 20 70   *pzErr==0) || p
2ba0: 43 6f 6e 66 69 67 3d 3d 30 20 29 3b 0a 0a 20 20  Config==0 );..  
2bb0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
2bc0: 6e 65 77 20 76 74 61 62 20 6f 62 6a 65 63 74 20  new vtab object 
2bd0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2be0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 54  ITE_OK ){.    pT
2bf0: 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a  ab = (Fts5Table*
2c00: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2c10: 73 69 7a 65 6f 66 28 46 74 73 35 54 61 62 6c 65  sizeof(Fts5Table
2c20: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
2c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2c40: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2c50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c60: 20 6d 65 6d 73 65 74 28 70 54 61 62 2c 20 30 2c   memset(pTab, 0,
2c70: 20 73 69 7a 65 6f 66 28 46 74 73 35 54 61 62 6c   sizeof(Fts5Tabl
2c80: 65 29 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  e));.      pTab-
2c90: 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
2ca0: 69 67 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ig;.      pTab->
2cb0: 70 47 6c 6f 62 61 6c 20 3d 20 70 47 6c 6f 62 61  pGlobal = pGloba
2cc0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  l;.    }.  }..  
2cd0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 69 6e 64 65  /* Open the inde
2ce0: 78 20 73 75 62 2d 73 79 73 74 65 6d 20 2a 2f 0a  x sub-system */.
2cf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2d10: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2d20: 4f 70 65 6e 28 70 43 6f 6e 66 69 67 2c 20 62 43  Open(pConfig, bC
2d30: 72 65 61 74 65 2c 20 26 70 54 61 62 2d 3e 70 49  reate, &pTab->pI
2d40: 6e 64 65 78 2c 20 70 7a 45 72 72 29 3b 0a 20 20  ndex, pzErr);.  
2d50: 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
2d60: 20 73 74 6f 72 61 67 65 20 73 75 62 2d 73 79 73   storage sub-sys
2d70: 74 65 6d 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  tem */.  if( rc=
2d80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
2da0: 73 35 53 74 6f 72 61 67 65 4f 70 65 6e 28 0a 20  s5StorageOpen(. 
2db0: 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2c 20         pConfig, 
2dc0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 62 43  pTab->pIndex, bC
2dd0: 72 65 61 74 65 2c 20 26 70 54 61 62 2d 3e 70 53  reate, &pTab->pS
2de0: 74 6f 72 61 67 65 2c 20 70 7a 45 72 72 0a 20 20  torage, pzErr.  
2df0: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43    );.  }..  /* C
2e00: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  all sqlite3_decl
2e10: 61 72 65 5f 76 74 61 62 28 29 20 2a 2f 0a 20 20  are_vtab() */.  
2e20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e30: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
2e40: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 44  lite3Fts5ConfigD
2e50: 65 63 6c 61 72 65 56 74 61 62 28 70 43 6f 6e 66  eclareVtab(pConf
2e60: 69 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ig);.  }..  if( 
2e70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e80: 0a 20 20 20 20 66 74 73 35 46 72 65 65 56 74 61  .    fts5FreeVta
2e90: 62 28 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  b(pTab, 0);.    
2ea0: 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pTab = 0;.  }els
2eb0: 65 20 69 66 28 20 62 43 72 65 61 74 65 20 29 7b  e if( bCreate ){
2ec0: 0a 20 20 20 20 66 74 73 35 43 68 65 63 6b 54 72  .    fts5CheckTr
2ed0: 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65 28 70  ansactionState(p
2ee0: 54 61 62 2c 20 46 54 53 35 5f 42 45 47 49 4e 2c  Tab, FTS5_BEGIN,
2ef0: 20 30 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 54   0);.  }.  *ppVT
2f00: 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74  ab = (sqlite3_vt
2f10: 61 62 2a 29 70 54 61 62 3b 0a 20 20 72 65 74 75  ab*)pTab;.  retu
2f20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f30: 54 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 20 61  The xConnect() a
2f40: 6e 64 20 78 43 72 65 61 74 65 28 29 20 6d 65 74  nd xCreate() met
2f50: 68 6f 64 73 20 66 6f 72 20 74 68 65 20 76 69 72  hods for the vir
2f60: 74 75 61 6c 20 74 61 62 6c 65 2e 20 41 6c 6c 20  tual table. All 
2f70: 74 68 65 0a 2a 2a 20 77 6f 72 6b 20 69 73 20 64  the.** work is d
2f80: 6f 6e 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  one in function 
2f90: 66 74 73 35 49 6e 69 74 56 74 61 62 28 29 2e 0a  fts5InitVtab()..
2fa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
2fb0: 73 35 43 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28  s5ConnectMethod(
2fc0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
2ff0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76  onnection */.  v
3000: 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20  oid *pAux,      
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3020: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 6f 6b  * Pointer to tok
3030: 65 6e 69 7a 65 72 20 68 61 73 68 20 74 61 62 6c  enizer hash tabl
3040: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  e */.  int argc,
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3070: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
3080: 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a 20 20  argv array */.  
3090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
30a0: 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20 20 20  st *argv,       
30b0: 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e  /* xCreate/xConn
30c0: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61 72 72  ect argument arr
30d0: 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ay */.  sqlite3_
30e0: 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 20 20  vtab **ppVtab,  
30f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3100: 4e 65 77 20 73 71 6c 69 74 65 33 5f 76 74 61 62  New sqlite3_vtab
3110: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
3120: 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20  r **pzErr       
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3140: 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  OUT: sqlite3_mal
3150: 6c 6f 63 27 64 20 65 72 72 6f 72 20 6d 65 73 73  loc'd error mess
3160: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  age */.){.  retu
3170: 72 6e 20 66 74 73 35 49 6e 69 74 56 74 61 62 28  rn fts5InitVtab(
3180: 30 2c 20 64 62 2c 20 70 41 75 78 2c 20 61 72 67  0, db, pAux, arg
3190: 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c  c, argv, ppVtab,
31a0: 20 70 7a 45 72 72 29 3b 0a 7d 0a 73 74 61 74 69   pzErr);.}.stati
31b0: 63 20 69 6e 74 20 66 74 73 35 43 72 65 61 74 65  c int fts5Create
31c0: 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
31d0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
31e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
31f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3200: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78   */.  void *pAux
3210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3220: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3230: 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61   to tokenizer ha
3240: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  sh table */.  in
3250: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3270: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3280: 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72 72 61  nts in argv arra
3290: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
32a0: 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67 76 2c  r * const *argv,
32b0: 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
32c0: 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67 75 6d  e/xConnect argum
32d0: 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
32e0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
32f0: 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  Vtab,          /
3300: 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c 69 74  * OUT: New sqlit
3310: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20 2a  e3_vtab object *
3320: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c 69      /* OUT: sqli
3350: 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65 72 72  te3_malloc'd err
3360: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b  or message */.){
3370: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
3380: 69 74 56 74 61 62 28 31 2c 20 64 62 2c 20 70 41  itVtab(1, db, pA
3390: 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  ux, argc, argv, 
33a0: 70 70 56 74 61 62 2c 20 70 7a 45 72 72 29 3b 0a  ppVtab, pzErr);.
33b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72  }../*.** The thr
33c0: 65 65 20 71 75 65 72 79 20 70 6c 61 6e 73 20 78  ee query plans x
33d0: 42 65 73 74 49 6e 64 65 78 20 6d 61 79 20 63 68  BestIndex may ch
33e0: 6f 6f 73 65 20 62 65 74 77 65 65 6e 2e 0a 2a 2f  oose between..*/
33f0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4c  .#define FTS5_PL
3400: 41 4e 5f 53 43 41 4e 20 20 20 20 20 20 20 20 20  AN_SCAN         
3410: 20 20 31 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20    1       /* No 
3420: 75 73 61 62 6c 65 20 63 6f 6e 73 74 72 61 69 6e  usable constrain
3430: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  t */.#define FTS
3440: 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 20 20 20 20  5_PLAN_MATCH    
3450: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 2f 2a        2       /*
3460: 20 28 3c 74 62 6c 3e 20 4d 41 54 43 48 20 3f 29   (<tbl> MATCH ?)
3470: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
3480: 5f 50 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d 41 54  _PLAN_SORTED_MAT
3490: 43 48 20 20 20 33 20 20 20 20 20 20 20 2f 2a 20  CH   3       /* 
34a0: 28 3c 74 62 6c 3e 20 4d 41 54 43 48 20 3f 20 4f  (<tbl> MATCH ? O
34b0: 52 44 45 52 20 42 59 20 72 61 6e 6b 29 20 2a 2f  RDER BY rank) */
34c0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4c  .#define FTS5_PL
34d0: 41 4e 5f 52 4f 57 49 44 20 20 20 20 20 20 20 20  AN_ROWID        
34e0: 20 20 34 20 20 20 20 20 20 20 2f 2a 20 28 72 6f    4       /* (ro
34f0: 77 69 64 20 3d 20 3f 29 20 2a 2f 0a 23 64 65 66  wid = ?) */.#def
3500: 69 6e 65 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f  ine FTS5_PLAN_SO
3510: 55 52 43 45 20 20 20 20 20 20 20 20 20 35 20 20  URCE         5  
3520: 20 20 20 20 20 2f 2a 20 41 20 73 6f 75 72 63 65       /* A source
3530: 20 63 75 72 73 6f 72 20 66 6f 72 20 53 4f 52 54   cursor for SORT
3540: 45 44 5f 4d 41 54 43 48 20 2a 2f 0a 23 64 65 66  ED_MATCH */.#def
3550: 69 6e 65 20 46 54 53 35 5f 50 4c 41 4e 5f 53 50  ine FTS5_PLAN_SP
3560: 45 43 49 41 4c 20 20 20 20 20 20 20 20 36 20 20  ECIAL        6  
3570: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 74 65 72       /* An inter
3580: 6e 61 6c 20 71 75 65 72 79 20 2a 2f 0a 0a 23 64  nal query */..#d
3590: 65 66 69 6e 65 20 46 54 53 35 5f 50 4c 41 4e 28  efine FTS5_PLAN(
35a0: 69 64 78 4e 75 6d 29 20 28 28 69 64 78 4e 75 6d  idxNum) ((idxNum
35b0: 29 20 26 20 30 78 37 29 0a 0a 23 64 65 66 69 6e  ) & 0x7)..#defin
35c0: 65 20 46 54 53 35 5f 4f 52 44 45 52 5f 44 45 53  e FTS5_ORDER_DES
35d0: 43 20 20 20 38 20 20 20 20 20 20 20 2f 2a 20 4f  C   8       /* O
35e0: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
35f0: 53 43 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  SC */.#define FT
3600: 53 35 5f 4f 52 44 45 52 5f 41 53 43 20 20 20 31  S5_ORDER_ASC   1
3610: 36 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52  6       /* ORDER
3620: 20 42 59 20 72 6f 77 69 64 20 41 53 43 20 2a 2f   BY rowid ASC */
3630: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
3640: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
3650: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3660: 67 75 6d 65 6e 74 20 66 6f 72 20 61 20 75 73 61  gument for a usa
3670: 62 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  ble constraint.*
3680: 2a 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  * on column iCol
3690: 20 75 73 69 6e 67 20 6f 70 65 72 61 74 6f 72 20   using operator 
36a0: 65 4f 70 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  eOp. If one is f
36b0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 69 74 73  ound, return its
36c0: 20 69 6e 64 65 78 20 69 6e 0a 2a 2a 20 74 68 65   index in.** the
36d0: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61   pInfo->aConstra
36e0: 69 6e 74 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  int[] array. If 
36f0: 6e 6f 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69  no such constrai
3700: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74  nt is found, ret
3710: 75 72 6e 0a 2a 2a 20 61 20 6e 65 67 61 74 69 76  urn.** a negativ
3720: 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  e value..*/.stat
3730: 69 63 20 69 6e 74 20 66 74 73 35 46 69 6e 64 43  ic int fts5FindC
3740: 6f 6e 73 74 72 61 69 6e 74 28 73 71 6c 69 74 65  onstraint(sqlite
3750: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
3760: 6e 66 6f 2c 20 69 6e 74 20 65 4f 70 2c 20 69 6e  nfo, int eOp, in
3770: 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  t iCol){.  int i
3780: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3790: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
37a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  t; i++){.    str
37b0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
37c0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 20  x_constraint *p 
37d0: 3d 20 26 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  = &pInfo->aConst
37e0: 72 61 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  raint[i];.    if
37f0: 28 20 70 2d 3e 75 73 61 62 6c 65 20 26 26 20 70  ( p->usable && p
3800: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 20  ->iColumn==iCol 
3810: 26 26 20 70 2d 3e 6f 70 3d 3d 65 4f 70 20 29 20  && p->op==eOp ) 
3820: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
3830: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
3840: 20 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74   .** Implementat
3850: 69 6f 6e 20 6f 66 20 74 68 65 20 78 42 65 73 74  ion of the xBest
3860: 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 66 6f 72  Index method for
3870: 20 46 54 53 35 20 74 61 62 6c 65 73 2e 20 54 68   FTS5 tables. Th
3880: 65 72 65 0a 2a 2a 20 61 72 65 20 74 68 72 65 65  ere.** are three
3890: 20 70 6f 73 73 69 62 6c 65 20 73 74 72 61 74 65   possible strate
38a0: 67 69 65 73 2c 20 69 6e 20 6f 72 64 65 72 20 6f  gies, in order o
38b0: 66 20 70 72 65 66 65 72 65 6e 63 65 3a 0a 2a 2a  f preference:.**
38c0: 0a 2a 2a 20 20 20 31 2e 20 46 75 6c 6c 2d 74 65  .**   1. Full-te
38d0: 78 74 20 73 65 61 72 63 68 20 75 73 69 6e 67 20  xt search using 
38e0: 61 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72  a MATCH operator
38f0: 2e 0a 2a 2a 20 20 20 32 2e 20 41 20 62 79 2d 72  ..**   2. A by-r
3900: 6f 77 69 64 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 20  owid lookup..** 
3910: 20 20 33 2e 20 41 20 66 75 6c 6c 2d 74 61 62 6c    3. A full-tabl
3920: 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  e scan..*/.stati
3930: 63 20 69 6e 74 20 66 74 73 35 42 65 73 74 49 6e  c int fts5BestIn
3940: 64 65 78 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  dexMethod(sqlite
3950: 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73  3_vtab *pVTab, s
3960: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
3970: 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 46 74 73  o *pInfo){.  Fts
3980: 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  5Table *pTab = (
3990: 46 74 73 35 54 61 62 6c 65 2a 29 70 56 54 61 62  Fts5Table*)pVTab
39a0: 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  ;.  Fts5Config *
39b0: 70 43 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d 3e  pConfig = pTab->
39c0: 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69  pConfig;.  int i
39d0: 43 6f 6e 73 3b 0a 20 20 69 6e 74 20 65 50 6c 61  Cons;.  int ePla
39e0: 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 5f 53 43  n = FTS5_PLAN_SC
39f0: 41 4e 3b 0a 0a 20 20 69 43 6f 6e 73 20 3d 20 66  AN;..  iCons = f
3a00: 74 73 35 46 69 6e 64 43 6f 6e 73 74 72 61 69 6e  ts5FindConstrain
3a10: 74 28 70 49 6e 66 6f 2c 53 51 4c 49 54 45 5f 49  t(pInfo,SQLITE_I
3a20: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
3a30: 4d 41 54 43 48 2c 70 43 6f 6e 66 69 67 2d 3e 6e  MATCH,pConfig->n
3a40: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 69 43 6f 6e  Col);.  if( iCon
3a50: 73 3e 3d 30 20 29 7b 0a 20 20 20 20 65 50 6c 61  s>=0 ){.    ePla
3a60: 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 5f 4d 41  n = FTS5_PLAN_MA
3a70: 54 43 48 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  TCH;.    pInfo->
3a80: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
3a90: 31 2e 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1.0;.  }else{.  
3aa0: 20 20 69 43 6f 6e 73 20 3d 20 66 74 73 35 46 69    iCons = fts5Fi
3ab0: 6e 64 43 6f 6e 73 74 72 61 69 6e 74 28 70 49 6e  ndConstraint(pIn
3ac0: 66 6f 2c 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  fo, SQLITE_INDEX
3ad0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 2c 20  _CONSTRAINT_EQ, 
3ae0: 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  -1);.    if( iCo
3af0: 6e 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 65  ns>=0 ){.      e
3b00: 50 6c 61 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e  Plan = FTS5_PLAN
3b10: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 70 49  _ROWID;.      pI
3b20: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
3b30: 73 74 20 3d 20 32 2e 30 3b 0a 20 20 20 20 7d 0a  st = 2.0;.    }.
3b40: 20 20 7d 0a 0a 20 20 69 66 28 20 69 43 6f 6e 73    }..  if( iCons
3b50: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  >=0 ){.    pInfo
3b60: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
3b70: 67 65 5b 69 43 6f 6e 73 5d 2e 61 72 67 76 49 6e  ge[iCons].argvIn
3b80: 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e  dex = 1;.    pIn
3b90: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
3ba0: 73 61 67 65 5b 69 43 6f 6e 73 5d 2e 6f 6d 69 74  sage[iCons].omit
3bb0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3bc0: 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61     pInfo->estima
3bd0: 74 65 64 43 6f 73 74 20 3d 20 31 30 30 30 30 30  tedCost = 100000
3be0: 30 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  00.0;.  }..  if(
3bf0: 20 70 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79   pInfo->nOrderBy
3c00: 3d 3d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==1 ){.    int i
3c10: 53 6f 72 74 20 3d 20 70 49 6e 66 6f 2d 3e 61 4f  Sort = pInfo->aO
3c20: 72 64 65 72 42 79 5b 30 5d 2e 69 43 6f 6c 75 6d  rderBy[0].iColum
3c30: 6e 3b 0a 20 20 20 20 69 66 28 20 69 53 6f 72 74  n;.    if( iSort
3c40: 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  <0 ){.      /* O
3c50: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 5b 41  RDER BY rowid [A
3c60: 53 43 7c 44 45 53 43 5d 20 2a 2f 0a 20 20 20 20  SC|DESC] */.    
3c70: 20 20 70 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79    pInfo->orderBy
3c80: 43 6f 6e 73 75 6d 65 64 20 3d 20 31 3b 0a 20 20  Consumed = 1;.  
3c90: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53 6f 72    }else if( iSor
3ca0: 74 3d 3d 28 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  t==(pConfig->nCo
3cb0: 6c 2b 31 29 20 26 26 20 65 50 6c 61 6e 3d 3d 46  l+1) && ePlan==F
3cc0: 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 20 29  TS5_PLAN_MATCH )
3cd0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52  {.      /* ORDER
3ce0: 20 42 59 20 72 61 6e 6b 20 5b 41 53 43 7c 44 45   BY rank [ASC|DE
3cf0: 53 43 5d 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e  SC] */.      pIn
3d00: 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
3d10: 6d 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 65  med = 1;.      e
3d20: 50 6c 61 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e  Plan = FTS5_PLAN
3d30: 5f 53 4f 52 54 45 44 5f 4d 41 54 43 48 3b 0a 20  _SORTED_MATCH;. 
3d40: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
3d50: 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
3d60: 75 6d 65 64 20 29 7b 0a 20 20 20 20 20 20 65 50  umed ){.      eP
3d70: 6c 61 6e 20 7c 3d 20 70 49 6e 66 6f 2d 3e 61 4f  lan |= pInfo->aO
3d80: 72 64 65 72 42 79 5b 30 5d 2e 64 65 73 63 20 3f  rderBy[0].desc ?
3d90: 20 46 54 53 35 5f 4f 52 44 45 52 5f 44 45 53 43   FTS5_ORDER_DESC
3da0: 20 3a 20 46 54 53 35 5f 4f 52 44 45 52 5f 41 53   : FTS5_ORDER_AS
3db0: 43 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20  C;.    }.  }.   
3dc0: 0a 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  .  pInfo->idxNum
3dd0: 20 3d 20 65 50 6c 61 6e 3b 0a 20 20 72 65 74 75   = ePlan;.  retu
3de0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3df0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
3e00: 61 74 69 6f 6e 20 6f 66 20 78 4f 70 65 6e 20 6d  ation of xOpen m
3e10: 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
3e20: 20 69 6e 74 20 66 74 73 35 4f 70 65 6e 4d 65 74   int fts5OpenMet
3e30: 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
3e40: 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33   *pVTab, sqlite3
3e50: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
3e60: 70 43 73 72 29 7b 0a 20 20 46 74 73 35 54 61 62  pCsr){.  Fts5Tab
3e70: 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
3e80: 54 61 62 6c 65 2a 29 70 56 54 61 62 3b 0a 20 20  Table*)pVTab;.  
3e90: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
3ea0: 66 69 67 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6e  fig = pTab->pCon
3eb0: 66 69 67 3b 0a 20 20 46 74 73 35 43 75 72 73 6f  fig;.  Fts5Curso
3ec0: 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20  r *pCsr;        
3ed0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 75         /* New cu
3ee0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rsor object */. 
3ef0: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
3f20: 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
3f30: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
3f40: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
3f50: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
3f60: 64 65 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d  de */..  nByte =
3f70: 20 73 69 7a 65 6f 66 28 46 74 73 35 43 75 72 73   sizeof(Fts5Curs
3f80: 6f 72 29 20 2b 20 70 43 6f 6e 66 69 67 2d 3e 6e  or) + pConfig->n
3f90: 43 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 69 6e 74  Col * sizeof(int
3fa0: 29 3b 0a 20 20 70 43 73 72 20 3d 20 28 46 74 73  );.  pCsr = (Fts
3fb0: 35 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33  5Cursor*)sqlite3
3fc0: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
3fd0: 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20    if( pCsr ){.  
3fe0: 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47    Fts5Global *pG
3ff0: 6c 6f 62 61 6c 20 3d 20 70 54 61 62 2d 3e 70 47  lobal = pTab->pG
4000: 6c 6f 62 61 6c 3b 0a 20 20 20 20 6d 65 6d 73 65  lobal;.    memse
4010: 74 28 70 43 73 72 2c 20 30 2c 20 6e 42 79 74 65  t(pCsr, 0, nByte
4020: 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 43 6f  );.    pCsr->aCo
4030: 6c 75 6d 6e 53 69 7a 65 20 3d 20 28 69 6e 74 2a  lumnSize = (int*
4040: 29 26 70 43 73 72 5b 31 5d 3b 0a 20 20 20 20 70  )&pCsr[1];.    p
4050: 43 73 72 2d 3e 70 4e 65 78 74 20 3d 20 70 47 6c  Csr->pNext = pGl
4060: 6f 62 61 6c 2d 3e 70 43 73 72 3b 0a 20 20 20 20  obal->pCsr;.    
4070: 70 47 6c 6f 62 61 6c 2d 3e 70 43 73 72 20 3d 20  pGlobal->pCsr = 
4080: 70 43 73 72 3b 0a 20 20 20 20 70 43 73 72 2d 3e  pCsr;.    pCsr->
4090: 69 43 73 72 49 64 20 3d 20 2b 2b 70 47 6c 6f 62  iCsrId = ++pGlob
40a0: 61 6c 2d 3e 69 4e 65 78 74 49 64 3b 0a 20 20 7d  al->iNextId;.  }
40b0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
40c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
40d0: 0a 20 20 2a 70 70 43 73 72 20 3d 20 28 73 71 6c  .  *ppCsr = (sql
40e0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
40f0: 2a 29 70 43 73 72 3b 0a 20 20 72 65 74 75 72 6e  *)pCsr;.  return
4100: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
4110: 6e 74 20 66 74 73 35 53 74 6d 74 54 79 70 65 28  nt fts5StmtType(
4120: 69 6e 74 20 69 64 78 4e 75 6d 29 7b 0a 20 20 69  int idxNum){.  i
4130: 66 28 20 46 54 53 35 5f 50 4c 41 4e 28 69 64 78  f( FTS5_PLAN(idx
4140: 4e 75 6d 29 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f  Num)==FTS5_PLAN_
4150: 53 43 41 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  SCAN ){.    retu
4160: 72 6e 20 28 69 64 78 4e 75 6d 26 46 54 53 35 5f  rn (idxNum&FTS5_
4170: 4f 52 44 45 52 5f 41 53 43 29 20 3f 20 46 54 53  ORDER_ASC) ? FTS
4180: 35 5f 53 54 4d 54 5f 53 43 41 4e 5f 41 53 43 20  5_STMT_SCAN_ASC 
4190: 3a 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e  : FTS5_STMT_SCAN
41a0: 5f 44 45 53 43 3b 0a 20 20 7d 0a 20 20 72 65 74  _DESC;.  }.  ret
41b0: 75 72 6e 20 46 54 53 35 5f 53 54 4d 54 5f 4c 4f  urn FTS5_STMT_LO
41c0: 4f 4b 55 50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  OKUP;.}../*.** T
41d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
41e0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
41f0: 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
4200: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
4210: 65 6e 74 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 20  ent.** is moved 
4220: 74 6f 20 70 6f 69 6e 74 20 61 74 20 61 20 64 69  to point at a di
4230: 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 49 74 20  fferent row. It 
4240: 63 6c 65 61 72 73 20 61 6c 6c 20 63 61 63 68 65  clears all cache
4250: 64 20 64 61 74 61 20 0a 2a 2a 20 73 70 65 63 69  d data .** speci
4260: 66 69 63 20 74 6f 20 74 68 65 20 70 72 65 76 69  fic to the previ
4270: 6f 75 73 20 72 6f 77 20 73 74 6f 72 65 64 20 62  ous row stored b
4280: 79 20 74 68 65 20 63 75 72 73 6f 72 20 6f 62 6a  y the cursor obj
4290: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
42a0: 6f 69 64 20 66 74 73 35 43 73 72 4e 65 77 72 6f  oid fts5CsrNewro
42b0: 77 28 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43  w(Fts5Cursor *pC
42c0: 73 72 29 7b 0a 20 20 43 73 72 46 6c 61 67 53 65  sr){.  CsrFlagSe
42d0: 74 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f  t(pCsr, FTS5CSR_
42e0: 52 45 51 55 49 52 45 5f 43 4f 4e 54 45 4e 54 20  REQUIRE_CONTENT 
42f0: 7c 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52  | FTS5CSR_REQUIR
4300: 45 5f 44 4f 43 53 49 5a 45 20 29 3b 0a 20 20 73  E_DOCSIZE );.  s
4310: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
4320: 2d 3e 61 49 6e 73 74 29 3b 0a 20 20 70 43 73 72  ->aInst);.  pCsr
4330: 2d 3e 61 49 6e 73 74 20 3d 20 30 3b 0a 20 20 70  ->aInst = 0;.  p
4340: 43 73 72 2d 3e 6e 49 6e 73 74 43 6f 75 6e 74 20  Csr->nInstCount 
4350: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
4360: 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
4370: 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
4380: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 65 65 20  information see 
4390: 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  the documentatio
43a0: 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 78 43 6c 6f  n.** on the xClo
43b0: 73 65 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  se method of the
43c0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
43d0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
43e0: 74 69 63 20 69 6e 74 20 66 74 73 35 43 6c 6f 73  tic int fts5Clos
43f0: 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  eMethod(sqlite3_
4400: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
4410: 72 73 6f 72 29 7b 0a 20 20 46 74 73 35 54 61 62  rsor){.  Fts5Tab
4420: 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
4430: 54 61 62 6c 65 2a 29 28 70 43 75 72 73 6f 72 2d  Table*)(pCursor-
4440: 3e 70 56 74 61 62 29 3b 0a 20 20 46 74 73 35 43  >pVtab);.  Fts5C
4450: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
4460: 74 73 35 43 75 72 73 6f 72 2a 29 70 43 75 72 73  ts5Cursor*)pCurs
4470: 6f 72 3b 0a 20 20 46 74 73 35 43 75 72 73 6f 72  or;.  Fts5Cursor
4480: 20 2a 2a 70 70 3b 0a 20 20 46 74 73 35 41 75 78   **pp;.  Fts5Aux
4490: 64 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 46  data *pData;.  F
44a0: 74 73 35 41 75 78 64 61 74 61 20 2a 70 4e 65 78  ts5Auxdata *pNex
44b0: 74 3b 0a 0a 20 20 66 74 73 35 43 73 72 4e 65 77  t;..  fts5CsrNew
44c0: 72 6f 77 28 70 43 73 72 29 3b 0a 20 20 69 66 28  row(pCsr);.  if(
44d0: 20 70 43 73 72 2d 3e 70 53 74 6d 74 20 29 7b 0a   pCsr->pStmt ){.
44e0: 20 20 20 20 69 6e 74 20 65 53 74 6d 74 20 3d 20      int eStmt = 
44f0: 66 74 73 35 53 74 6d 74 54 79 70 65 28 70 43 73  fts5StmtType(pCs
4500: 72 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 20 20  r->idxNum);.    
4510: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
4520: 67 65 53 74 6d 74 52 65 6c 65 61 73 65 28 70 54  geStmtRelease(pT
4530: 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 65 53  ab->pStorage, eS
4540: 74 6d 74 2c 20 70 43 73 72 2d 3e 70 53 74 6d 74  tmt, pCsr->pStmt
4550: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 73  );.  }.  if( pCs
4560: 72 2d 3e 70 53 6f 72 74 65 72 20 29 7b 0a 20 20  r->pSorter ){.  
4570: 20 20 46 74 73 35 53 6f 72 74 65 72 20 2a 70 53    Fts5Sorter *pS
4580: 6f 72 74 65 72 20 3d 20 70 43 73 72 2d 3e 70 53  orter = pCsr->pS
4590: 6f 72 74 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  orter;.    sqlit
45a0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 6f 72  e3_finalize(pSor
45b0: 74 65 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ter->pStmt);.   
45c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
45d0: 6f 72 74 65 72 29 3b 0a 20 20 7d 0a 20 20 0a 20  orter);.  }.  . 
45e0: 20 69 66 28 20 70 43 73 72 2d 3e 69 64 78 4e 75   if( pCsr->idxNu
45f0: 6d 21 3d 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 55  m!=FTS5_PLAN_SOU
4600: 52 43 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  RCE ){.    sqlit
4610: 65 33 46 74 73 35 45 78 70 72 46 72 65 65 28 70  e3Fts5ExprFree(p
4620: 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d  Csr->pExpr);.  }
4630: 0a 0a 20 20 66 6f 72 28 70 44 61 74 61 3d 70 43  ..  for(pData=pC
4640: 73 72 2d 3e 70 41 75 78 64 61 74 61 3b 20 70 44  sr->pAuxdata; pD
4650: 61 74 61 3b 20 70 44 61 74 61 3d 70 4e 65 78 74  ata; pData=pNext
4660: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4670: 44 61 74 61 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Data->pNext;.   
4680: 20 69 66 28 20 70 44 61 74 61 2d 3e 78 44 65 6c   if( pData->xDel
4690: 65 74 65 20 29 20 70 44 61 74 61 2d 3e 78 44 65  ete ) pData->xDe
46a0: 6c 65 74 65 28 70 44 61 74 61 2d 3e 70 50 74 72  lete(pData->pPtr
46b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
46c0: 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 7d 0a  ree(pData);.  }.
46d0: 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
46e0: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 74 68 65   cursor from the
46f0: 20 46 74 73 35 47 6c 6f 62 61 6c 2e 70 43 73 72   Fts5Global.pCsr
4700: 20 6c 69 73 74 20 2a 2f 0a 20 20 66 6f 72 28 70   list */.  for(p
4710: 70 3d 26 70 54 61 62 2d 3e 70 47 6c 6f 62 61 6c  p=&pTab->pGlobal
4720: 2d 3e 70 43 73 72 3b 20 28 2a 70 70 29 21 3d 70  ->pCsr; (*pp)!=p
4730: 43 73 72 3b 20 70 70 3d 26 28 2a 70 70 29 2d 3e  Csr; pp=&(*pp)->
4740: 70 4e 65 78 74 29 3b 0a 20 20 2a 70 70 20 3d 20  pNext);.  *pp = 
4750: 70 43 73 72 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20  pCsr->pNext;..  
4760: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
4770: 28 70 43 73 72 2d 3e 70 52 61 6e 6b 41 72 67 53  (pCsr->pRankArgS
4780: 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tmt);.  sqlite3_
4790: 66 72 65 65 28 70 43 73 72 2d 3e 61 70 52 61 6e  free(pCsr->apRan
47a0: 6b 41 72 67 29 3b 0a 0a 20 20 73 71 6c 69 74 65  kArg);..  sqlite
47b0: 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 7a 53 70  3_free(pCsr->zSp
47c0: 65 63 69 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  ecial);.  sqlite
47d0: 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20  3_free(pCsr);.  
47e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
47f0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
4800: 66 74 73 35 53 6f 72 74 65 72 4e 65 78 74 28 46  fts5SorterNext(F
4810: 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ts5Cursor *pCsr)
4820: 7b 0a 20 20 46 74 73 35 53 6f 72 74 65 72 20 2a  {.  Fts5Sorter *
4830: 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d 3e  pSorter = pCsr->
4840: 70 53 6f 72 74 65 72 3b 0a 20 20 69 6e 74 20 72  pSorter;.  int r
4850: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
4860: 65 33 5f 73 74 65 70 28 70 53 6f 72 74 65 72 2d  e3_step(pSorter-
4870: 3e 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  >pStmt);.  if( r
4880: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
4890: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
48a0: 45 5f 4f 4b 3b 0a 20 20 20 20 43 73 72 46 6c 61  E_OK;.    CsrFla
48b0: 67 53 65 74 28 70 43 73 72 2c 20 46 54 53 35 43  gSet(pCsr, FTS5C
48c0: 53 52 5f 45 4f 46 29 3b 0a 20 20 7d 65 6c 73 65  SR_EOF);.  }else
48d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
48e0: 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ROW ){.    const
48f0: 20 75 38 20 2a 61 3b 0a 20 20 20 20 63 6f 6e 73   u8 *a;.    cons
4900: 74 20 75 38 20 2a 61 42 6c 6f 62 3b 0a 20 20 20  t u8 *aBlob;.   
4910: 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20 20 20   int nBlob;.    
4920: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69  int i;.    int i
4930: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Off = 0;.    rc 
4940: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
4950: 20 20 70 53 6f 72 74 65 72 2d 3e 69 52 6f 77 69    pSorter->iRowi
4960: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
4970: 6d 6e 5f 69 6e 74 36 34 28 70 53 6f 72 74 65 72  mn_int64(pSorter
4980: 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  ->pStmt, 0);.   
4990: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
49a0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
49b0: 6f 72 74 65 72 2d 3e 70 53 74 6d 74 2c 20 31 29  orter->pStmt, 1)
49c0: 3b 0a 20 20 20 20 61 42 6c 6f 62 20 3d 20 61 20  ;.    aBlob = a 
49d0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
49e0: 5f 62 6c 6f 62 28 70 53 6f 72 74 65 72 2d 3e 70  _blob(pSorter->p
49f0: 53 74 6d 74 2c 20 31 29 3b 0a 0a 20 20 20 20 66  Stmt, 1);..    f
4a00: 6f 72 28 69 3d 30 3b 20 69 3c 28 70 53 6f 72 74  or(i=0; i<(pSort
4a10: 65 72 2d 3e 6e 49 64 78 2d 31 29 3b 20 69 2b 2b  er->nIdx-1); i++
4a20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61  ){.      int iVa
4a30: 6c 3b 0a 20 20 20 20 20 20 61 20 2b 3d 20 67 65  l;.      a += ge
4a40: 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69 56 61  tVarint32(a, iVa
4a50: 6c 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  l);.      iOff +
4a60: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 53  = iVal;.      pS
4a70: 6f 72 74 65 72 2d 3e 61 49 64 78 5b 69 5d 20 3d  orter->aIdx[i] =
4a80: 20 69 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 20   iOff;.    }.   
4a90: 20 70 53 6f 72 74 65 72 2d 3e 61 49 64 78 5b 69   pSorter->aIdx[i
4aa0: 5d 20 3d 20 26 61 42 6c 6f 62 5b 6e 42 6c 6f 62  ] = &aBlob[nBlob
4ab0: 5d 20 2d 20 61 3b 0a 0a 20 20 20 20 70 53 6f 72  ] - a;..    pSor
4ac0: 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20  ter->aPoslist = 
4ad0: 61 3b 0a 20 20 20 20 66 74 73 35 43 73 72 4e 65  a;.    fts5CsrNe
4ae0: 77 72 6f 77 28 70 43 73 72 29 3b 0a 20 20 7d 0a  wrow(pCsr);.  }.
4af0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4b00: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
4b10: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
4b20: 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
4b30: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
4b40: 68 65 73 20 74 68 65 20 0a 2a 2a 20 73 65 61 72  hes the .** sear
4b50: 63 68 20 63 72 69 74 65 72 69 61 2e 0a 2a 2a 0a  ch criteria..**.
4b60: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
4b70: 5f 4f 4b 20 69 66 20 6e 6f 74 68 69 6e 67 20 67  _OK if nothing g
4b80: 6f 65 73 20 77 72 6f 6e 67 2e 20 20 53 51 4c 49  oes wrong.  SQLI
4b90: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
4ba0: 64 0a 2a 2a 20 65 76 65 6e 20 69 66 20 77 65 20  d.** even if we 
4bb0: 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c  reach end-of-fil
4bc0: 65 2e 20 20 54 68 65 20 66 74 73 35 45 6f 66 4d  e.  The fts5EofM
4bd0: 65 74 68 6f 64 28 29 20 77 69 6c 6c 20 62 65 20  ethod() will be 
4be0: 63 61 6c 6c 65 64 0a 2a 2a 20 73 75 62 73 65 71  called.** subseq
4bf0: 75 65 6e 74 6c 79 20 74 6f 20 64 65 74 65 72 6d  uently to determ
4c00: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
4c10: 6f 74 20 61 6e 20 45 4f 46 20 77 61 73 20 68 69  ot an EOF was hi
4c20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
4c30: 20 66 74 73 35 4e 65 78 74 4d 65 74 68 6f 64 28   fts5NextMethod(
4c40: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
4c50: 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20  sor *pCursor){. 
4c60: 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73   Fts5Cursor *pCs
4c70: 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a  r = (Fts5Cursor*
4c80: 29 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  )pCursor;.  int 
4c90: 65 50 6c 61 6e 20 3d 20 46 54 53 35 5f 50 4c 41  ePlan = FTS5_PLA
4ca0: 4e 28 70 43 73 72 2d 3e 69 64 78 4e 75 6d 29 3b  N(pCsr->idxNum);
4cb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4cc0: 54 45 5f 4f 4b 3b 0a 0a 20 20 73 77 69 74 63 68  TE_OK;..  switch
4cd0: 28 20 65 50 6c 61 6e 20 29 7b 0a 20 20 20 20 63  ( ePlan ){.    c
4ce0: 61 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f 4d 41  ase FTS5_PLAN_MA
4cf0: 54 43 48 3a 0a 20 20 20 20 63 61 73 65 20 46 54  TCH:.    case FT
4d00: 53 35 5f 50 4c 41 4e 5f 53 4f 55 52 43 45 3a 0a  S5_PLAN_SOURCE:.
4d10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4d20: 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 70  e3Fts5ExprNext(p
4d30: 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  Csr->pExpr);.   
4d40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74     if( sqlite3Ft
4d50: 73 35 45 78 70 72 45 6f 66 28 70 43 73 72 2d 3e  s5ExprEof(pCsr->
4d60: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
4d70: 20 20 43 73 72 46 6c 61 67 53 65 74 28 70 43 73    CsrFlagSet(pCs
4d80: 72 2c 20 46 54 53 35 43 53 52 5f 45 4f 46 29 3b  r, FTS5CSR_EOF);
4d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
4da0: 74 73 35 43 73 72 4e 65 77 72 6f 77 28 70 43 73  ts5CsrNewrow(pCs
4db0: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
4dc0: 0a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f  ..    case FTS5_
4dd0: 50 4c 41 4e 5f 53 50 45 43 49 41 4c 3a 20 7b 0a  PLAN_SPECIAL: {.
4de0: 20 20 20 20 20 20 43 73 72 46 6c 61 67 53 65 74        CsrFlagSet
4df0: 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 45  (pCsr, FTS5CSR_E
4e00: 4f 46 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  OF);.      break
4e10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
4e20: 65 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 52 54  e FTS5_PLAN_SORT
4e30: 45 44 5f 4d 41 54 43 48 3a 20 7b 0a 20 20 20 20  ED_MATCH: {.    
4e40: 20 20 72 63 20 3d 20 66 74 73 35 53 6f 72 74 65    rc = fts5Sorte
4e50: 72 4e 65 78 74 28 70 43 73 72 29 3b 0a 20 20 20  rNext(pCsr);.   
4e60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4e70: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
4e80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4e90: 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 53 74 6d  _step(pCsr->pStm
4ea0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
4eb0: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
4ec0: 20 20 20 20 20 20 20 20 43 73 72 46 6c 61 67 53          CsrFlagS
4ed0: 65 74 28 70 43 73 72 2c 20 46 54 53 35 43 53 52  et(pCsr, FTS5CSR
4ee0: 5f 45 4f 46 29 3b 0a 20 20 20 20 20 20 20 20 72  _EOF);.        r
4ef0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
4f00: 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a  t(pCsr->pStmt);.
4f10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4f20: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4f30: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
4f40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
4f50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4f60: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
4f70: 43 75 72 73 6f 72 46 69 72 73 74 53 6f 72 74 65  CursorFirstSorte
4f80: 64 28 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61  d(Fts5Table *pTa
4f90: 62 2c 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70  b, Fts5Cursor *p
4fa0: 43 73 72 2c 20 69 6e 74 20 62 41 73 63 29 7b 0a  Csr, int bAsc){.
4fb0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
4fc0: 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d 3e 70 43  onfig = pTab->pC
4fd0: 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 53 6f 72  onfig;.  Fts5Sor
4fe0: 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 0a 20 20  ter *pSorter;.  
4ff0: 69 6e 74 20 6e 50 68 72 61 73 65 3b 0a 20 20 69  int nPhrase;.  i
5000: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
5010: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5020: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
5030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e  const char *zRan
5040: 6b 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 7a 52 61  k = pConfig->zRa
5050: 6e 6b 20 3f 20 70 43 6f 6e 66 69 67 2d 3e 7a 52  nk ? pConfig->zR
5060: 61 6e 6b 20 3a 20 46 54 53 35 5f 44 45 46 41 55  ank : FTS5_DEFAU
5070: 4c 54 5f 52 41 4e 4b 3b 0a 20 20 0a 20 20 6e 50  LT_RANK;.  .  nP
5080: 68 72 61 73 65 20 3d 20 73 71 6c 69 74 65 33 46  hrase = sqlite3F
5090: 74 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 75  ts5ExprPhraseCou
50a0: 6e 74 28 70 43 73 72 2d 3e 70 45 78 70 72 29 3b  nt(pCsr->pExpr);
50b0: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
50c0: 66 28 46 74 73 35 53 6f 72 74 65 72 29 20 2b 20  f(Fts5Sorter) + 
50d0: 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 6e 50  sizeof(int) * nP
50e0: 68 72 61 73 65 3b 0a 20 20 70 53 6f 72 74 65 72  hrase;.  pSorter
50f0: 20 3d 20 28 46 74 73 35 53 6f 72 74 65 72 2a 29   = (Fts5Sorter*)
5100: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
5110: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 53 6f  Byte);.  if( pSo
5120: 72 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rter==0 ) return
5130: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5140: 20 6d 65 6d 73 65 74 28 70 53 6f 72 74 65 72 2c   memset(pSorter,
5150: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 53   0, nByte);.  pS
5160: 6f 72 74 65 72 2d 3e 6e 49 64 78 20 3d 20 6e 50  orter->nIdx = nP
5170: 68 72 61 73 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44  hrase;..  /* TOD
5180: 4f 3a 20 49 74 20 77 6f 75 6c 64 20 62 65 20 62  O: It would be b
5190: 65 74 74 65 72 20 74 6f 20 68 61 76 65 20 73 6f  etter to have so
51a0: 6d 65 20 73 79 73 74 65 6d 20 66 6f 72 20 72 65  me system for re
51b0: 75 73 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 0a  using statement.
51c0: 20 20 2a 2a 20 68 61 6e 64 6c 65 73 20 68 65 72    ** handles her
51d0: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  e, rather than p
51e0: 72 65 70 61 72 69 6e 67 20 61 20 6e 65 77 20 6f  reparing a new o
51f0: 6e 65 20 66 6f 72 20 65 61 63 68 20 71 75 65 72  ne for each quer
5200: 79 2e 20 42 75 74 20 74 68 61 74 0a 20 20 2a 2a  y. But that.  **
5210: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
5220: 20 61 73 20 53 51 4c 69 74 65 20 72 65 66 65 72   as SQLite refer
5230: 65 6e 63 65 20 63 6f 75 6e 74 73 20 74 68 65 20  ence counts the 
5240: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
5250: 6a 65 63 74 73 2e 0a 20 20 2a 2a 20 41 6e 64 20  jects..  ** And 
5260: 73 69 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d  since the statem
5270: 65 6e 74 20 72 65 71 75 69 72 65 64 20 68 65 72  ent required her
5280: 65 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 69  e reads from thi
5290: 73 20 76 65 72 79 20 76 69 72 74 75 61 6c 20 0a  s very virtual .
52a0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 73 61 76 69    ** table, savi
52b0: 6e 67 20 69 74 20 63 72 65 61 74 65 73 20 61 20  ng it creates a 
52c0: 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
52d0: 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ce..  **.  ** If
52e0: 20 53 51 4c 69 74 65 20 61 20 62 75 69 6c 74 2d   SQLite a built-
52f0: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63  in statement cac
5300: 68 65 2c 20 74 68 69 73 20 77 6f 75 6c 64 6e 27  he, this wouldn'
5310: 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 20  t be a problem. 
5320: 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  */.  zSql = sqli
5330: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
5340: 45 43 54 20 72 6f 77 69 64 2c 20 72 61 6e 6b 20  ECT rowid, rank 
5350: 46 52 4f 4d 20 25 51 2e 25 51 20 4f 52 44 45 52  FROM %Q.%Q ORDER
5360: 20 42 59 20 25 73 28 25 73 25 73 25 73 29 20 25   BY %s(%s%s%s) %
5370: 73 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  s",.      pConfi
5380: 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
5390: 3e 7a 4e 61 6d 65 2c 20 7a 52 61 6e 6b 2c 20 70  >zName, zRank, p
53a0: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 0a 20  Config->zName,. 
53b0: 20 20 20 20 20 28 70 43 6f 6e 66 69 67 2d 3e 7a       (pConfig->z
53c0: 52 61 6e 6b 41 72 67 73 20 3f 20 22 2c 20 22 20  RankArgs ? ", " 
53d0: 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 28 70 43  : ""),.      (pC
53e0: 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41 72 67 73  onfig->zRankArgs
53f0: 20 3f 20 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e   ? pConfig->zRan
5400: 6b 41 72 67 73 20 3a 20 22 22 29 2c 0a 20 20 20  kArgs : ""),.   
5410: 20 20 20 62 41 73 63 20 3f 20 22 41 53 43 22 20     bAsc ? "ASC" 
5420: 3a 20 22 44 45 53 43 22 0a 20 20 29 3b 0a 20 20  : "DESC".  );.  
5430: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
5440: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
5450: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
5460: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
5470: 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66  prepare_v2(pConf
5480: 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ig->db, zSql, -1
5490: 2c 20 26 70 53 6f 72 74 65 72 2d 3e 70 53 74 6d  , &pSorter->pStm
54a0: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
54b0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
54c0: 20 7d 0a 0a 20 20 70 43 73 72 2d 3e 70 53 6f 72   }..  pCsr->pSor
54d0: 74 65 72 20 3d 20 70 53 6f 72 74 65 72 3b 0a 20  ter = pSorter;. 
54e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
54f0: 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
5500: 28 20 70 54 61 62 2d 3e 70 53 6f 72 74 43 73 72  ( pTab->pSortCsr
5510: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  ==0 );.    pTab-
5520: 3e 70 53 6f 72 74 43 73 72 20 3d 20 70 43 73 72  >pSortCsr = pCsr
5530: 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 53  ;.    rc = fts5S
5540: 6f 72 74 65 72 4e 65 78 74 28 70 43 73 72 29 3b  orterNext(pCsr);
5550: 0a 20 20 20 20 70 54 61 62 2d 3e 70 53 6f 72 74  .    pTab->pSort
5560: 43 73 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Csr = 0;.  }..  
5570: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5580: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
5590: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 6f 72 74 65  _finalize(pSorte
55a0: 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  r->pStmt);.    s
55b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6f 72  qlite3_free(pSor
55c0: 74 65 72 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e  ter);.    pCsr->
55d0: 70 53 6f 72 74 65 72 20 3d 20 30 3b 0a 20 20 7d  pSorter = 0;.  }
55e0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
55f0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
5600: 35 43 75 72 73 6f 72 46 69 72 73 74 28 46 74 73  5CursorFirst(Fts
5610: 35 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 46 74  5Table *pTab, Ft
5620: 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s5Cursor *pCsr, 
5630: 69 6e 74 20 62 41 73 63 29 7b 0a 20 20 69 6e 74  int bAsc){.  int
5640: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
5650: 74 65 33 46 74 73 35 45 78 70 72 46 69 72 73 74  te3Fts5ExprFirst
5660: 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 70 54  (pCsr->pExpr, pT
5670: 61 62 2d 3e 70 49 6e 64 65 78 2c 20 62 41 73 63  ab->pIndex, bAsc
5680: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
5690: 46 74 73 35 45 78 70 72 45 6f 66 28 70 43 73 72  Fts5ExprEof(pCsr
56a0: 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->pExpr) ){.    
56b0: 43 73 72 46 6c 61 67 53 65 74 28 70 43 73 72 2c  CsrFlagSet(pCsr,
56c0: 20 46 54 53 35 43 53 52 5f 45 4f 46 29 3b 0a 20   FTS5CSR_EOF);. 
56d0: 20 7d 0a 20 20 66 74 73 35 43 73 72 4e 65 77 72   }.  fts5CsrNewr
56e0: 6f 77 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75  ow(pCsr);.  retu
56f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5700: 50 72 6f 63 65 73 73 20 61 20 22 73 70 65 63 69  Process a "speci
5710: 61 6c 22 20 71 75 65 72 79 2e 20 41 20 73 70 65  al" query. A spe
5720: 63 69 61 6c 20 71 75 65 72 79 20 69 73 20 69 64  cial query is id
5730: 65 6e 74 69 66 69 65 64 20 61 73 20 6f 6e 65 20  entified as one 
5740: 77 69 74 68 20 61 0a 2a 2a 20 4d 41 54 43 48 20  with a.** MATCH 
5750: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
5760: 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 27 2a  begins with a '*
5770: 27 20 63 68 61 72 61 63 74 65 72 2e 20 54 68 65  ' character. The
5780: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 0a 2a 2a   remainder of.**
5790: 20 74 68 65 20 74 65 78 74 20 70 61 73 73 65 64   the text passed
57a0: 20 74 6f 20 74 68 65 20 4d 41 54 43 48 20 6f 70   to the MATCH op
57b0: 65 72 61 74 6f 72 20 61 72 65 20 75 73 65 64 20  erator are used 
57c0: 61 73 20 20 74 68 65 20 73 70 65 63 69 61 6c 20  as  the special 
57d0: 71 75 65 72 79 0a 2a 2a 20 70 61 72 61 6d 65 74  query.** paramet
57e0: 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
57f0: 6e 74 20 66 74 73 35 53 70 65 63 69 61 6c 4d 61  nt fts5SpecialMa
5800: 74 63 68 28 0a 20 20 46 74 73 35 54 61 62 6c 65  tch(.  Fts5Table
5810: 20 2a 70 54 61 62 2c 20 0a 20 20 46 74 73 35 43   *pTab, .  Fts5C
5820: 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20  ursor *pCsr, .  
5830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65  const char *zQue
5840: 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ry.){.  int rc =
5850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
5860: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
5870: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  n code */.  cons
5880: 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 51 75 65  t char *z = zQue
5890: 72 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ry;         /* S
58a0: 70 65 63 69 61 6c 20 71 75 65 72 79 20 74 65 78  pecial query tex
58b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  t */.  int n;   
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
58e0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 65 78   of bytes in tex
58f0: 74 20 61 74 20 7a 20 2a 2f 0a 0a 20 20 77 68 69  t at z */..  whi
5900: 6c 65 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20  le( z[0]==' ' ) 
5910: 7a 2b 2b 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  z++;.  for(n=0; 
5920: 7a 5b 6e 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27 20  z[n] && z[n]!=' 
5930: 27 3b 20 6e 2b 2b 29 3b 0a 0a 20 20 61 73 73 65  '; n++);..  asse
5940: 72 74 28 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a  rt( pTab->base.z
5950: 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 61  ErrMsg==0 );.  a
5960: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 7a 53 70  ssert( pCsr->zSp
5970: 65 63 69 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 69  ecial==0 );..  i
5980: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
5990: 72 6e 69 63 6d 70 28 22 72 65 61 64 73 22 2c 20  rnicmp("reads", 
59a0: 7a 2c 20 6e 29 20 29 7b 0a 20 20 20 20 70 43 73  z, n) ){.    pCs
59b0: 72 2d 3e 7a 53 70 65 63 69 61 6c 20 3d 20 73 71  r->zSpecial = sq
59c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
59d0: 64 22 2c 20 73 71 6c 69 74 65 33 46 74 73 35 49  d", sqlite3Fts5I
59e0: 6e 64 65 78 52 65 61 64 73 28 70 54 61 62 2d 3e  ndexReads(pTab->
59f0: 70 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 43  pIndex));.    pC
5a00: 73 72 2d 3e 69 64 78 4e 75 6d 20 3d 20 46 54 53  sr->idxNum = FTS
5a10: 35 5f 50 4c 41 4e 5f 53 50 45 43 49 41 4c 3b 0a  5_PLAN_SPECIAL;.
5a20: 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 7a 53      if( pCsr->zS
5a30: 70 65 63 69 61 6c 3d 3d 30 20 29 20 72 63 20 3d  pecial==0 ) rc =
5a40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5a50: 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 2f   }.  else{.    /
5a60: 2a 20 41 6e 20 75 6e 72 65 63 6f 67 6e 69 7a 65  * An unrecognize
5a70: 64 20 64 69 72 65 63 74 69 76 65 2e 20 52 65 74  d directive. Ret
5a80: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  urn an error mes
5a90: 73 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 54 61  sage. */.    pTa
5aa0: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20  b->base.zErrMsg 
5ab0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5ac0: 66 28 22 75 6e 6b 6e 6f 77 6e 20 73 70 65 63 69  f("unknown speci
5ad0: 61 6c 20 71 75 65 72 79 3a 20 25 2e 2a 73 22 2c  al query: %.*s",
5ae0: 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 72 63 20 3d   n, z);.    rc =
5af0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5b00: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
5b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
5b20: 20 66 6f 72 20 61 6e 20 61 75 78 69 6c 69 61 72   for an auxiliar
5b30: 79 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  y function named
5b40: 20 7a 4e 61 6d 65 20 74 68 61 74 20 63 61 6e 20   zName that can 
5b50: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 61 62  be used with tab
5b60: 6c 65 0a 2a 2a 20 70 54 61 62 2e 20 49 66 20 6f  le.** pTab. If o
5b70: 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74  ne is found, ret
5b80: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5b90: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
5ba0: 6e 67 20 46 74 73 35 41 75 78 69 6c 69 61 72 79  ng Fts5Auxiliary
5bb0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 4f  .** structure. O
5bc0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
5bd0: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78  such function ex
5be0: 69 73 74 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ists, return NUL
5bf0: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  L..*/.static Fts
5c00: 35 41 75 78 69 6c 69 61 72 79 20 2a 66 74 73 35  5Auxiliary *fts5
5c10: 46 69 6e 64 41 75 78 69 6c 69 61 72 79 28 46 74  FindAuxiliary(Ft
5c20: 73 35 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  s5Table *pTab, c
5c30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5c40: 29 7b 0a 20 20 46 74 73 35 41 75 78 69 6c 69 61  ){.  Fts5Auxilia
5c50: 72 79 20 2a 70 41 75 78 3b 0a 0a 20 20 66 6f 72  ry *pAux;..  for
5c60: 28 70 41 75 78 3d 70 54 61 62 2d 3e 70 47 6c 6f  (pAux=pTab->pGlo
5c70: 62 61 6c 2d 3e 70 41 75 78 3b 20 70 41 75 78 3b  bal->pAux; pAux;
5c80: 20 70 41 75 78 3d 70 41 75 78 2d 3e 70 4e 65 78   pAux=pAux->pNex
5c90: 74 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  t){.    if( sqli
5ca0: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d  te3_stricmp(zNam
5cb0: 65 2c 20 70 41 75 78 2d 3e 7a 46 75 6e 63 29 3d  e, pAux->zFunc)=
5cc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 70 41 75 78  =0 ) return pAux
5cd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 66  ;.  }..  /* No f
5ce0: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  unction of the s
5cf0: 70 65 63 69 66 69 65 64 20 6e 61 6d 65 20 77 61  pecified name wa
5d00: 73 20 66 6f 75 6e 64 2e 20 52 65 74 75 72 6e 20  s found. Return 
5d10: 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30  0. */.  return 0
5d20: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  ;.}...static int
5d30: 20 66 74 73 35 46 69 6e 64 52 61 6e 6b 46 75 6e   fts5FindRankFun
5d40: 63 74 69 6f 6e 28 46 74 73 35 43 75 72 73 6f 72  ction(Fts5Cursor
5d50: 20 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 35 54   *pCsr){.  Fts5T
5d60: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74  able *pTab = (Ft
5d70: 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e  s5Table*)(pCsr->
5d80: 62 61 73 65 2e 70 56 74 61 62 29 3b 0a 20 20 46  base.pVtab);.  F
5d90: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
5da0: 69 67 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6e 66  ig = pTab->pConf
5db0: 69 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ig;.  const char
5dc0: 20 2a 7a 52 61 6e 6b 20 3d 20 70 43 6f 6e 66 69   *zRank = pConfi
5dd0: 67 2d 3e 7a 52 61 6e 6b 3b 0a 20 20 69 6e 74 20  g->zRank;.  int 
5de0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5df0: 20 20 46 74 73 35 41 75 78 69 6c 69 61 72 79 20    Fts5Auxiliary 
5e00: 2a 70 41 75 78 3b 0a 0a 20 20 69 66 28 20 7a 52  *pAux;..  if( zR
5e10: 61 6e 6b 3d 3d 30 20 29 20 7a 52 61 6e 6b 20 3d  ank==0 ) zRank =
5e20: 20 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 52 41   FTS5_DEFAULT_RA
5e30: 4e 4b 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 2d  NK;..  if( pTab-
5e40: 3e 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 41  >pConfig->zRankA
5e50: 72 67 73 20 29 7b 0a 20 20 20 20 63 68 61 72 20  rgs ){.    char 
5e60: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
5e70: 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
5e80: 25 73 22 2c 20 70 54 61 62 2d 3e 70 43 6f 6e 66  %s", pTab->pConf
5e90: 69 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 29 3b 0a  ig->zRankArgs);.
5ea0: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
5eb0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
5ec0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5ed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
5ee0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
5ef0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
5f00: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
5f10: 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v2(pConfig->db,
5f20: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
5f30: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
5f40: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
5f50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
5f60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
5f70: 70 43 73 72 2d 3e 70 52 61 6e 6b 41 72 67 53 74  pCsr->pRankArgSt
5f80: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  mt==0 );.      i
5f90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5fb0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
5fc0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
5fd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
5fe0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
5ff0: 20 20 70 43 73 72 2d 3e 6e 52 61 6e 6b 41 72 67    pCsr->nRankArg
6000: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
6010: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
6020: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
6030: 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  = sizeof(sqlite3
6040: 5f 76 61 6c 75 65 2a 29 2a 70 43 73 72 2d 3e 6e  _value*)*pCsr->n
6050: 52 61 6e 6b 41 72 67 3b 0a 20 20 20 20 20 20 20  RankArg;.       
6060: 20 20 20 70 43 73 72 2d 3e 61 70 52 61 6e 6b 41     pCsr->apRankA
6070: 72 67 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61  rg = (sqlite3_va
6080: 6c 75 65 2a 2a 29 73 71 6c 69 74 65 33 46 74 73  lue**)sqlite3Fts
6090: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
60a0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
60b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
60c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
60d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
60e0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
60f0: 69 3c 70 43 73 72 2d 3e 6e 52 61 6e 6b 41 72 67  i<pCsr->nRankArg
6100: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6110: 20 20 20 20 20 20 70 43 73 72 2d 3e 61 70 52 61        pCsr->apRa
6120: 6e 6b 41 72 67 5b 69 5d 20 3d 20 73 71 6c 69 74  nkArg[i] = sqlit
6130: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
6140: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
6150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6160: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
6170: 43 73 72 2d 3e 70 52 61 6e 6b 41 72 67 53 74 6d  Csr->pRankArgStm
6180: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
6190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
61a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
61b0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
61c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
61d0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
61e0: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  K );.        }. 
61f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6200: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
6210: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 41 75  TE_OK ){.    pAu
6220: 78 20 3d 20 66 74 73 35 46 69 6e 64 41 75 78 69  x = fts5FindAuxi
6230: 6c 69 61 72 79 28 70 54 61 62 2c 20 7a 52 61 6e  liary(pTab, zRan
6240: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 41 75 78  k);.    if( pAux
6250: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
6260: 65 72 74 28 20 70 54 61 62 2d 3e 62 61 73 65 2e  ert( pTab->base.
6270: 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20  zErrMsg==0 );.  
6280: 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a      pTab->base.z
6290: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
62a0: 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63  _mprintf("no suc
62b0: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c  h function: %s",
62c0: 20 7a 52 61 6e 6b 29 3b 0a 20 20 20 20 20 20 72   zRank);.      r
62d0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
62e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
62f0: 43 73 72 2d 3e 70 52 61 6e 6b 20 3d 20 70 41 75  Csr->pRank = pAu
6300: 78 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  x;.  return rc;.
6310: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
6320: 20 74 68 65 20 78 46 69 6c 74 65 72 20 69 6e 74   the xFilter int
6330: 65 72 66 61 63 65 20 66 6f 72 20 74 68 65 20 76  erface for the v
6340: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 53  irtual table.  S
6350: 65 65 0a 2a 2a 20 74 68 65 20 76 69 72 74 75 61  ee.** the virtua
6360: 6c 20 74 61 62 6c 65 20 78 46 69 6c 74 65 72 20  l table xFilter 
6370: 6d 65 74 68 6f 64 20 64 6f 63 75 6d 65 6e 74 61  method documenta
6380: 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
6390: 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  nal.** informati
63a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
63b0: 74 20 66 74 73 35 46 69 6c 74 65 72 4d 65 74 68  t fts5FilterMeth
63c0: 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
63d0: 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  ab_cursor *pCurs
63e0: 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75 72  or,   /* The cur
63f0: 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74 68 69  sor used for thi
6400: 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
6410: 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20 20 20   idxNum,        
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6430: 53 74 72 61 74 65 67 79 20 69 6e 64 65 78 20 2a  Strategy index *
6440: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6450: 69 64 78 53 74 72 2c 20 20 20 20 20 20 20 20 20  idxStr,         
6460: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f      /* Unused */
6470: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20  .  int nVal,    
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
64a0: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70 56 61  elements in apVa
64b0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  l */.  sqlite3_v
64c0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
64d0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
64e0: 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e 64 65  nts for the inde
64f0: 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f 0a 29  xing scheme */.)
6500: 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70  {.  Fts5Table *p
6510: 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65  Tab = (Fts5Table
6520: 2a 29 28 70 43 75 72 73 6f 72 2d 3e 70 56 74 61  *)(pCursor->pVta
6530: 62 29 3b 0a 20 20 46 74 73 35 43 75 72 73 6f 72  b);.  Fts5Cursor
6540: 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75   *pCsr = (Fts5Cu
6550: 72 73 6f 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20  rsor*)pCursor;. 
6560: 20 69 6e 74 20 62 41 73 63 20 3d 20 28 28 69 64   int bAsc = ((id
6570: 78 4e 75 6d 20 26 20 46 54 53 35 5f 4f 52 44 45  xNum & FTS5_ORDE
6580: 52 5f 41 53 43 29 20 3f 20 31 20 3a 20 30 29 3b  R_ASC) ? 1 : 0);
6590: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
65a0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
65b0: 28 20 70 43 73 72 2d 3e 70 53 74 6d 74 3d 3d 30  ( pCsr->pStmt==0
65c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
65d0: 73 72 2d 3e 70 45 78 70 72 3d 3d 30 20 29 3b 0a  sr->pExpr==0 );.
65e0: 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
65f0: 63 73 72 66 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  csrflags==0 );. 
6600: 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70   assert( pCsr->p
6610: 52 61 6e 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  Rank==0 );..  if
6620: 28 20 70 54 61 62 2d 3e 70 53 6f 72 74 43 73 72  ( pTab->pSortCsr
6630: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 70 53   ){.    /* If pS
6640: 6f 72 74 43 73 72 20 69 73 20 6e 6f 6e 2d 4e 55  ortCsr is non-NU
6650: 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  LL, then this ca
6660: 6c 6c 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  ll is being made
6670: 20 61 73 20 70 61 72 74 20 6f 66 20 0a 20 20 20   as part of .   
6680: 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 66   ** processing f
6690: 6f 72 20 61 20 22 2e 2e 2e 20 4d 41 54 43 48 20  or a "... MATCH 
66a0: 3c 65 78 70 72 3e 20 4f 52 44 45 52 20 42 59 20  <expr> ORDER BY 
66b0: 72 61 6e 6b 22 20 71 75 65 72 79 20 28 65 50 6c  rank" query (ePl
66c0: 61 6e 20 69 73 0a 20 20 20 20 2a 2a 20 73 65 74  an is.    ** set
66d0: 20 74 6f 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f   to FTS5_PLAN_SO
66e0: 52 54 45 44 5f 4d 41 54 43 48 29 2e 20 70 53 6f  RTED_MATCH). pSo
66f0: 72 74 43 73 72 20 69 73 20 74 68 65 20 63 75 72  rtCsr is the cur
6700: 73 6f 72 20 74 68 61 74 20 77 69 6c 6c 0a 20 20  sor that will.  
6710: 20 20 2a 2a 20 72 65 74 75 72 6e 20 72 65 73 75    ** return resu
6720: 6c 74 73 20 74 6f 20 74 68 65 20 75 73 65 72 20  lts to the user 
6730: 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 20  for this query. 
6740: 54 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  The current curs
6750: 6f 72 20 0a 20 20 20 20 2a 2a 20 28 70 43 75 72  or .    ** (pCur
6760: 73 6f 72 29 20 69 73 20 75 73 65 64 20 74 6f 20  sor) is used to 
6770: 65 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72  execute the quer
6780: 79 20 69 73 73 75 65 64 20 62 79 20 66 75 6e 63  y issued by func
6790: 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 66 74 73  tion .    ** fts
67a0: 35 43 75 72 73 6f 72 46 69 72 73 74 53 6f 72 74  5CursorFirstSort
67b0: 65 64 28 29 20 61 62 6f 76 65 2e 20 20 2a 2f 0a  ed() above.  */.
67c0: 20 20 20 20 61 73 73 65 72 74 28 20 46 54 53 35      assert( FTS5
67d0: 5f 50 4c 41 4e 28 69 64 78 4e 75 6d 29 3d 3d 46  _PLAN(idxNum)==F
67e0: 54 53 35 5f 50 4c 41 4e 5f 53 43 41 4e 20 29 3b  TS5_PLAN_SCAN );
67f0: 0a 20 20 20 20 70 43 73 72 2d 3e 69 64 78 4e 75  .    pCsr->idxNu
6800: 6d 20 3d 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f  m = FTS5_PLAN_SO
6810: 55 52 43 45 3b 0a 20 20 20 20 70 43 73 72 2d 3e  URCE;.    pCsr->
6820: 70 45 78 70 72 20 3d 20 70 54 61 62 2d 3e 70 53  pExpr = pTab->pS
6830: 6f 72 74 43 73 72 2d 3e 70 45 78 70 72 3b 0a 20  ortCsr->pExpr;. 
6840: 20 20 20 72 63 20 3d 20 66 74 73 35 43 75 72 73     rc = fts5Curs
6850: 6f 72 46 69 72 73 74 28 70 54 61 62 2c 20 70 43  orFirst(pTab, pC
6860: 73 72 2c 20 62 41 73 63 29 3b 0a 20 20 7d 65 6c  sr, bAsc);.  }el
6870: 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 50 6c 61  se{.    int ePla
6880: 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 28 69 64  n = FTS5_PLAN(id
6890: 78 4e 75 6d 29 3b 0a 20 20 20 20 70 43 73 72 2d  xNum);.    pCsr-
68a0: 3e 69 64 78 4e 75 6d 20 3d 20 69 64 78 4e 75 6d  >idxNum = idxNum
68b0: 3b 0a 20 20 20 20 69 66 28 20 65 50 6c 61 6e 3d  ;.    if( ePlan=
68c0: 3d 46 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48  =FTS5_PLAN_MATCH
68d0: 20 7c 7c 20 65 50 6c 61 6e 3d 3d 46 54 53 35 5f   || ePlan==FTS5_
68e0: 50 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d 41 54 43  PLAN_SORTED_MATC
68f0: 48 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  H ){.      const
6900: 20 63 68 61 72 20 2a 7a 45 78 70 72 20 3d 20 28   char *zExpr = (
6910: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
6920: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6930: 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 20 20 20  pVal[0]);..     
6940: 20 69 66 28 20 7a 45 78 70 72 5b 30 5d 3d 3d 27   if( zExpr[0]=='
6950: 2a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  *' ){.        /*
6960: 20 54 68 65 20 75 73 65 72 20 68 61 73 20 69 73   The user has is
6970: 73 75 65 64 20 61 20 71 75 65 72 79 20 6f 66 20  sued a query of 
6980: 74 68 65 20 66 6f 72 6d 20 22 4d 41 54 43 48 20  the form "MATCH 
6990: 27 2a 2e 2e 2e 27 22 2e 20 54 68 69 73 0a 20 20  '*...'". This.  
69a0: 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74        ** indicat
69b0: 65 73 20 74 68 61 74 20 74 68 65 20 4d 41 54 43  es that the MATC
69c0: 48 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  H expression is 
69d0: 6e 6f 74 20 61 20 66 75 6c 6c 20 74 65 78 74 20  not a full text 
69e0: 71 75 65 72 79 2c 0a 20 20 20 20 20 20 20 20 2a  query,.        *
69f0: 2a 20 62 75 74 20 61 20 72 65 71 75 65 73 74 20  * but a request 
6a00: 66 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  for an internal 
6a10: 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20  parameter.  */. 
6a20: 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
6a30: 53 70 65 63 69 61 6c 4d 61 74 63 68 28 70 54 61  SpecialMatch(pTa
6a40: 62 2c 20 70 43 73 72 2c 20 26 7a 45 78 70 72 5b  b, pCsr, &zExpr[
6a50: 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1]);.      }else
6a60: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
6a70: 2a 70 7a 45 72 72 20 3d 20 26 70 54 61 62 2d 3e  *pzErr = &pTab->
6a80: 62 61 73 65 2e 7a 45 72 72 4d 73 67 3b 0a 20 20  base.zErrMsg;.  
6a90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6aa0: 65 33 46 74 73 35 45 78 70 72 4e 65 77 28 70 54  e3Fts5ExprNew(pT
6ab0: 61 62 2d 3e 70 43 6f 6e 66 69 67 2c 20 7a 45 78  ab->pConfig, zEx
6ac0: 70 72 2c 20 26 70 43 73 72 2d 3e 70 45 78 70 72  pr, &pCsr->pExpr
6ad0: 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  , pzErr);.      
6ae0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6af0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
6b00: 20 69 66 28 20 65 50 6c 61 6e 3d 3d 46 54 53 35   if( ePlan==FTS5
6b10: 5f 50 4c 41 4e 5f 4d 41 54 43 48 20 29 7b 0a 20  _PLAN_MATCH ){. 
6b20: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
6b30: 66 74 73 35 43 75 72 73 6f 72 46 69 72 73 74 28  fts5CursorFirst(
6b40: 70 54 61 62 2c 20 70 43 73 72 2c 20 62 41 73 63  pTab, pCsr, bAsc
6b50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
6b60: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6b70: 72 63 20 3d 20 66 74 73 35 43 75 72 73 6f 72 46  rc = fts5CursorF
6b80: 69 72 73 74 53 6f 72 74 65 64 28 70 54 61 62 2c  irstSorted(pTab,
6b90: 20 70 43 73 72 2c 20 62 41 73 63 29 3b 0a 20 20   pCsr, bAsc);.  
6ba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6bb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6bc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
6bd0: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  This is either a
6be0: 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
6bf0: 20 28 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c   (ePlan==FTS5_PL
6c00: 41 4e 5f 53 43 41 4e 29 20 6f 72 20 61 20 6c 6f  AN_SCAN) or a lo
6c10: 6f 6b 75 70 0a 20 20 20 20 20 20 2a 2a 20 62 79  okup.      ** by
6c20: 20 72 6f 77 69 64 20 28 65 50 6c 61 6e 3d 3d 46   rowid (ePlan==F
6c30: 54 53 35 5f 50 4c 41 4e 5f 52 4f 57 49 44 29 2e  TS5_PLAN_ROWID).
6c40: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65    */.      int e
6c50: 53 74 6d 74 20 3d 20 66 74 73 35 53 74 6d 74 54  Stmt = fts5StmtT
6c60: 79 70 65 28 69 64 78 4e 75 6d 29 3b 0a 20 20 20  ype(idxNum);.   
6c70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
6c80: 74 73 35 53 74 6f 72 61 67 65 53 74 6d 74 28 70  ts5StorageStmt(p
6c90: 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 65  Tab->pStorage, e
6ca0: 53 74 6d 74 2c 20 26 70 43 73 72 2d 3e 70 53 74  Stmt, &pCsr->pSt
6cb0: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
6cc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6cd0: 20 20 20 20 20 20 20 20 69 66 28 20 65 50 6c 61          if( ePla
6ce0: 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 52 4f 57  n==FTS5_PLAN_ROW
6cf0: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
6d00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
6d10: 75 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  ue(pCsr->pStmt, 
6d20: 31 2c 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  1, apVal[0]);.  
6d30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6d40: 72 63 20 3d 20 66 74 73 35 4e 65 78 74 4d 65 74  rc = fts5NextMet
6d50: 68 6f 64 28 70 43 75 72 73 6f 72 29 3b 0a 20 20  hod(pCursor);.  
6d60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6d70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6d80: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 69 73 20  ./* .** This is 
6d90: 74 68 65 20 78 45 6f 66 20 6d 65 74 68 6f 64 20  the xEof method 
6da0: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
6db0: 61 62 6c 65 2e 20 53 51 4c 69 74 65 20 63 61 6c  able. SQLite cal
6dc0: 6c 73 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74  ls this .** rout
6dd0: 69 6e 65 20 74 6f 20 66 69 6e 64 20 6f 75 74 20  ine to find out 
6de0: 69 66 20 69 74 20 68 61 73 20 72 65 61 63 68 65  if it has reache
6df0: 64 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 72  d the end of a r
6e00: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
6e10: 61 74 69 63 20 69 6e 74 20 66 74 73 35 45 6f 66  atic int fts5Eof
6e20: 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
6e30: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tab_cursor *pCur
6e40: 73 6f 72 29 7b 0a 20 20 46 74 73 35 43 75 72 73  sor){.  Fts5Curs
6e50: 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35  or *pCsr = (Fts5
6e60: 43 75 72 73 6f 72 2a 29 70 43 75 72 73 6f 72 3b  Cursor*)pCursor;
6e70: 0a 20 20 72 65 74 75 72 6e 20 28 43 73 72 46 6c  .  return (CsrFl
6e80: 61 67 54 65 73 74 28 70 43 73 72 2c 20 46 54 53  agTest(pCsr, FTS
6e90: 35 43 53 52 5f 45 4f 46 29 20 3f 20 31 20 3a 20  5CSR_EOF) ? 1 : 
6ea0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  0);.}../*.** Ret
6eb0: 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 74 68  urn the rowid th
6ec0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 63 75  at the cursor cu
6ed0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
6ee0: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  o..*/.static i64
6ef0: 20 66 74 73 35 43 75 72 73 6f 72 52 6f 77 69 64   fts5CursorRowid
6f00: 28 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73  (Fts5Cursor *pCs
6f10: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 46 54  r){.  assert( FT
6f20: 53 35 5f 50 4c 41 4e 28 70 43 73 72 2d 3e 69 64  S5_PLAN(pCsr->id
6f30: 78 4e 75 6d 29 3d 3d 46 54 53 35 5f 50 4c 41 4e  xNum)==FTS5_PLAN
6f40: 5f 4d 41 54 43 48 20 0a 20 20 20 20 20 20 20 7c  _MATCH .       |
6f50: 7c 20 46 54 53 35 5f 50 4c 41 4e 28 70 43 73 72  | FTS5_PLAN(pCsr
6f60: 2d 3e 69 64 78 4e 75 6d 29 3d 3d 46 54 53 35 5f  ->idxNum)==FTS5_
6f70: 50 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d 41 54 43  PLAN_SORTED_MATC
6f80: 48 20 0a 20 20 20 20 20 20 20 7c 7c 20 46 54 53  H .       || FTS
6f90: 35 5f 50 4c 41 4e 28 70 43 73 72 2d 3e 69 64 78  5_PLAN(pCsr->idx
6fa0: 4e 75 6d 29 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f  Num)==FTS5_PLAN_
6fb0: 53 4f 55 52 43 45 20 0a 20 20 29 3b 0a 20 20 69  SOURCE .  );.  i
6fc0: 66 28 20 70 43 73 72 2d 3e 70 53 6f 72 74 65 72  f( pCsr->pSorter
6fd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
6fe0: 43 73 72 2d 3e 70 53 6f 72 74 65 72 2d 3e 69 52  Csr->pSorter->iR
6ff0: 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  owid;.  }else{. 
7000: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
7010: 33 46 74 73 35 45 78 70 72 52 6f 77 69 64 28 70  3Fts5ExprRowid(p
7020: 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d  Csr->pExpr);.  }
7030: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
7040: 69 73 20 74 68 65 20 78 52 6f 77 69 64 20 6d 65  is the xRowid me
7050: 74 68 6f 64 2e 20 54 68 65 20 53 51 4c 69 74 65  thod. The SQLite
7060: 20 63 6f 72 65 20 63 61 6c 6c 73 20 74 68 69 73   core calls this
7070: 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 72   routine to.** r
7080: 65 74 72 69 65 76 65 20 74 68 65 20 72 6f 77 69  etrieve the rowi
7090: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
70a0: 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  t row of the res
70b0: 75 6c 74 20 73 65 74 2e 20 66 74 73 35 0a 2a 2a  ult set. fts5.**
70c0: 20 65 78 70 6f 73 65 73 20 25 5f 63 6f 6e 74 65   exposes %_conte
70d0: 6e 74 2e 64 6f 63 69 64 20 61 73 20 74 68 65 20  nt.docid as the 
70e0: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 76 69  rowid for the vi
70f0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 65  rtual table. The
7100: 0a 2a 2a 20 72 6f 77 69 64 20 73 68 6f 75 6c 64  .** rowid should
7110: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   be written to *
7120: 70 52 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69  pRowid..*/.stati
7130: 63 20 69 6e 74 20 66 74 73 35 52 6f 77 69 64 4d  c int fts5RowidM
7140: 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74  ethod(sqlite3_vt
7150: 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  ab_cursor *pCurs
7160: 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  or, sqlite_int64
7170: 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 46 74 73   *pRowid){.  Fts
7180: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  5Cursor *pCsr = 
7190: 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 75  (Fts5Cursor*)pCu
71a0: 72 73 6f 72 3b 0a 20 20 69 6e 74 20 65 50 6c 61  rsor;.  int ePla
71b0: 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 28 70 43  n = FTS5_PLAN(pC
71c0: 73 72 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 0a  sr->idxNum);.  .
71d0: 20 20 61 73 73 65 72 74 28 20 43 73 72 46 6c 61    assert( CsrFla
71e0: 67 54 65 73 74 28 70 43 73 72 2c 20 46 54 53 35  gTest(pCsr, FTS5
71f0: 43 53 52 5f 45 4f 46 29 3d 3d 30 20 29 3b 0a 20  CSR_EOF)==0 );. 
7200: 20 73 77 69 74 63 68 28 20 65 50 6c 61 6e 20 29   switch( ePlan )
7210: 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f  {.    case FTS5_
7220: 50 4c 41 4e 5f 53 50 45 43 49 41 4c 3a 0a 20 20  PLAN_SPECIAL:.  
7230: 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 30 3b      *pRowid = 0;
7240: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
7250: 20 20 20 63 61 73 65 20 46 54 53 35 5f 50 4c 41     case FTS5_PLA
7260: 4e 5f 53 4f 55 52 43 45 3a 0a 20 20 20 20 63 61  N_SOURCE:.    ca
7270: 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f 4d 41 54  se FTS5_PLAN_MAT
7280: 43 48 3a 0a 20 20 20 20 63 61 73 65 20 46 54 53  CH:.    case FTS
7290: 35 5f 50 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d 41  5_PLAN_SORTED_MA
72a0: 54 43 48 3a 0a 20 20 20 20 20 20 2a 70 52 6f 77  TCH:.      *pRow
72b0: 69 64 20 3d 20 66 74 73 35 43 75 72 73 6f 72 52  id = fts5CursorR
72c0: 6f 77 69 64 28 70 43 73 72 29 3b 0a 20 20 20 20  owid(pCsr);.    
72d0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
72e0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 2a 70 52  fault:.      *pR
72f0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  owid = sqlite3_c
7300: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 43 73 72  olumn_int64(pCsr
7310: 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  ->pStmt, 0);.   
7320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
7330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7340: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
7350: 68 65 20 63 75 72 73 6f 72 20 72 65 71 75 69 72  he cursor requir
7360: 65 73 20 73 65 65 6b 69 6e 67 20 28 62 53 65 65  es seeking (bSee
7370: 6b 52 65 71 75 69 72 65 64 20 66 6c 61 67 20 69  kRequired flag i
7380: 73 20 73 65 74 29 2c 20 73 65 65 6b 20 69 74 2e  s set), seek it.
7390: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
73a0: 45 5f 4f 4b 20 69 66 20 6e 6f 20 65 72 72 6f 72  E_OK if no error
73b0: 20 6f 63 63 75 72 73 2c 20 6f 72 20 61 6e 20 53   occurs, or an S
73c0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
73d0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
73e0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65  tatic int fts5Se
73f0: 65 6b 43 75 72 73 6f 72 28 46 74 73 35 43 75 72  ekCursor(Fts5Cur
7400: 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
7410: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7420: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
7430: 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 79  ursor does not y
7440: 65 74 20 68 61 76 65 20 61 20 73 74 61 74 65 6d  et have a statem
7450: 65 6e 74 20 68 61 6e 64 6c 65 2c 20 6f 62 74 61  ent handle, obta
7460: 69 6e 20 6f 6e 65 20 6e 6f 77 2e 20 2a 2f 20 0a  in one now. */ .
7470: 20 20 69 66 28 20 70 43 73 72 2d 3e 70 53 74 6d    if( pCsr->pStm
7480: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  t==0 ){.    Fts5
7490: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
74a0: 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72 2d  ts5Table*)(pCsr-
74b0: 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a 20 20  >base.pVtab);.  
74c0: 20 20 69 6e 74 20 65 53 74 6d 74 20 3d 20 66 74    int eStmt = ft
74d0: 73 35 53 74 6d 74 54 79 70 65 28 70 43 73 72 2d  s5StmtType(pCsr-
74e0: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 20 20 72 63  >idxNum);.    rc
74f0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
7500: 6f 72 61 67 65 53 74 6d 74 28 70 54 61 62 2d 3e  orageStmt(pTab->
7510: 70 53 74 6f 72 61 67 65 2c 20 65 53 74 6d 74 2c  pStorage, eStmt,
7520: 20 26 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a   &pCsr->pStmt);.
7530: 20 20 20 20 61 73 73 65 72 74 28 20 43 73 72 46      assert( CsrF
7540: 6c 61 67 54 65 73 74 28 70 43 73 72 2c 20 46 54  lagTest(pCsr, FT
7550: 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f 43 4f  S5CSR_REQUIRE_CO
7560: 4e 54 45 4e 54 29 20 29 3b 0a 20 20 7d 0a 0a 20  NTENT) );.  }.. 
7570: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7580: 4f 4b 20 26 26 20 43 73 72 46 6c 61 67 54 65 73  OK && CsrFlagTes
7590: 74 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f  t(pCsr, FTS5CSR_
75a0: 52 45 51 55 49 52 45 5f 43 4f 4e 54 45 4e 54 29  REQUIRE_CONTENT)
75b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
75c0: 70 43 73 72 2d 3e 70 45 78 70 72 20 29 3b 0a 20  pCsr->pExpr );. 
75d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
75e0: 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20  (pCsr->pStmt);. 
75f0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
7600: 69 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d  int64(pCsr->pStm
7610: 74 2c 20 31 2c 20 66 74 73 35 43 75 72 73 6f 72  t, 1, fts5Cursor
7620: 52 6f 77 69 64 28 70 43 73 72 29 29 3b 0a 20 20  Rowid(pCsr));.  
7630: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
7640: 74 65 70 28 70 43 73 72 2d 3e 70 53 74 6d 74 29  tep(pCsr->pStmt)
7650: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
7660: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
7670: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
7680: 3b 0a 20 20 20 20 20 20 43 73 72 46 6c 61 67 43  ;.      CsrFlagC
7690: 6c 65 61 72 28 70 43 73 72 2c 20 46 54 53 35 43  lear(pCsr, FTS5C
76a0: 53 52 5f 52 45 51 55 49 52 45 5f 43 4f 4e 54 45  SR_REQUIRE_CONTE
76b0: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  NT);.    }else{.
76c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
76d0: 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70  e3_reset(pCsr->p
76e0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
76f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7700: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
7710: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
7720: 41 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  AB;.      }.    
7730: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
7740: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
7750: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7760: 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 61 6e  led to handle an
7770: 20 46 54 53 20 49 4e 53 45 52 54 20 63 6f 6d 6d   FTS INSERT comm
7780: 61 6e 64 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  and. In other wo
7790: 72 64 73 2c 0a 2a 2a 20 61 6e 20 49 4e 53 45 52  rds,.** an INSER
77a0: 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 74  T statement of t
77b0: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
77c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66     INSERT INTO f
77d0: 74 73 28 66 74 73 29 20 56 41 4c 55 45 53 28 24  ts(fts) VALUES($
77e0: 70 43 6d 64 29 0a 2a 2a 20 20 20 20 20 49 4e 53  pCmd).**     INS
77f0: 45 52 54 20 49 4e 54 4f 20 66 74 73 28 66 74 73  ERT INTO fts(fts
7800: 2c 20 72 61 6e 6b 29 20 56 41 4c 55 45 53 28 24  , rank) VALUES($
7810: 70 43 6d 64 2c 20 24 70 56 61 6c 29 0a 2a 2a 0a  pCmd, $pVal).**.
7820: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 61 6c  ** Argument pVal
7830: 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 61 73   is the value as
7840: 73 69 67 6e 65 64 20 74 6f 20 63 6f 6c 75 6d 6e  signed to column
7850: 20 22 66 74 73 22 20 62 79 20 74 68 65 20 49 4e   "fts" by the IN
7860: 53 45 52 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  SERT .** stateme
7870: 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  nt. This functio
7880: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
7890: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
78a0: 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 0a  l, or an SQLite.
78b0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
78c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
78d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ..**.** The comm
78e0: 61 6e 64 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ands implemented
78f0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
7900: 6e 20 61 72 65 20 64 6f 63 75 6d 65 6e 74 65 64  n are documented
7910: 20 69 6e 20 74 68 65 20 22 53 70 65 63 69 61 6c   in the "Special
7920: 0a 2a 2a 20 49 4e 53 45 52 54 20 44 69 72 65 63  .** INSERT Direc
7930: 74 69 76 65 73 22 20 73 65 63 74 69 6f 6e 20 6f  tives" section o
7940: 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  f the documentat
7950: 69 6f 6e 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ion. It should b
7960: 65 20 75 70 64 61 74 65 64 20 69 66 0a 2a 2a 20  e updated if.** 
7970: 6d 6f 72 65 20 63 6f 6d 6d 61 6e 64 73 20 61 72  more commands ar
7980: 65 20 61 64 64 65 64 20 74 6f 20 74 68 69 73 20  e added to this 
7990: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
79a0: 74 69 63 20 69 6e 74 20 66 74 73 35 53 70 65 63  tic int fts5Spec
79b0: 69 61 6c 49 6e 73 65 72 74 28 0a 20 20 46 74 73  ialInsert(.  Fts
79c0: 35 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20  5Table *pTab,   
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
79e0: 46 74 73 35 20 74 61 62 6c 65 20 6f 62 6a 65 63  Fts5 table objec
79f0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  t */.  sqlite3_v
7a00: 61 6c 75 65 20 2a 70 43 6d 64 2c 20 20 20 20 20  alue *pCmd,     
7a10: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
7a20: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 73 70  inserted into sp
7a30: 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ecial column */.
7a40: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
7a50: 2a 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  *pVal           
7a60: 20 20 2f 2a 20 56 61 6c 75 65 20 69 6e 73 65 72    /* Value inser
7a70: 74 65 64 20 69 6e 74 6f 20 72 6f 77 69 64 20 63  ted into rowid c
7a80: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  olumn */.){.  co
7a90: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
7aa0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
7ab0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 43  e3_value_text(pC
7ac0: 6d 64 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  md);.  int rc = 
7ad0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
7ae0: 20 62 45 72 72 6f 72 20 3d 20 30 3b 0a 0a 20 20   bError = 0;..  
7af0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
7b00: 74 72 69 63 6d 70 28 22 69 6e 74 65 67 72 69 74  tricmp("integrit
7b10: 79 2d 63 68 65 63 6b 22 2c 20 7a 29 20 29 7b 0a  y-check", z) ){.
7b20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7b30: 46 74 73 35 53 74 6f 72 61 67 65 49 6e 74 65 67  Fts5StorageInteg
7b40: 72 69 74 79 28 70 54 61 62 2d 3e 70 53 74 6f 72  rity(pTab->pStor
7b50: 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
7b60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
7b70: 74 73 35 43 6f 6e 66 69 67 53 65 74 56 61 6c 75  ts5ConfigSetValu
7b80: 65 28 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2c  e(pTab->pConfig,
7b90: 20 7a 2c 20 70 56 61 6c 2c 20 26 62 45 72 72 6f   z, pVal, &bErro
7ba0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
7bb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7bc0: 20 20 20 69 66 28 20 62 45 72 72 6f 72 20 29 7b     if( bError ){
7bd0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
7be0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
7bf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
7c10: 35 53 74 6f 72 61 67 65 43 6f 6e 66 69 67 56 61  5StorageConfigVa
7c20: 6c 75 65 28 70 54 61 62 2d 3e 70 53 74 6f 72 61  lue(pTab->pStora
7c30: 67 65 2c 20 7a 2c 20 70 56 61 6c 29 3b 0a 20 20  ge, z, pVal);.  
7c40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7c50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7c60: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
7c70: 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c  tion is the impl
7c80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7c90: 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c 62 61  e xUpdate callba
7ca0: 63 6b 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 46  ck used by .** F
7cb0: 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS3 virtual tabl
7cc0: 65 73 2e 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  es. It is invoke
7cd0: 64 20 62 79 20 53 51 4c 69 74 65 20 65 61 63 68  d by SQLite each
7ce0: 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 74   time a row is t
7cf0: 6f 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  o be.** inserted
7d00: 2c 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c  , updated or del
7d10: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
7d20: 69 6e 74 20 66 74 73 35 55 70 64 61 74 65 4d 65  int fts5UpdateMe
7d30: 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
7d40: 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20  vtab *pVtab,    
7d50: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
7d60: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
7d70: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7da0: 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
7db0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
7dc0: 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20  e **apVal,      
7dd0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
7de0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73  arguments */.  s
7df0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
7e00: 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 2f  wid            /
7e10: 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66 65 63  * OUT: The affec
7e20: 74 65 64 20 28 6f 72 20 65 66 66 65 63 74 65 64  ted (or effected
7e30: 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  ) rowid */.){.  
7e40: 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20  Fts5Table *pTab 
7e50: 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56  = (Fts5Table*)pV
7e60: 74 61 62 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69  tab;.  Fts5Confi
7e70: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 54 61  g *pConfig = pTa
7e80: 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e  b->pConfig;.  in
7e90: 74 20 65 54 79 70 65 30 3b 20 20 20 20 20 20 20  t eType0;       
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7eb0: 20 76 61 6c 75 65 5f 74 79 70 65 28 29 20 6f 66   value_type() of
7ec0: 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 20 20 69   apVal[0] */.  i
7ed0: 6e 74 20 65 43 6f 6e 66 6c 69 63 74 3b 20 20 20  nt eConflict;   
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ef0: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 66 6f  * ON CONFLICT fo
7f00: 72 20 74 68 69 73 20 44 4d 4c 20 2a 2f 0a 20 20  r this DML */.  
7f10: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
7f20: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
7f30: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
7f40: 2f 0a 0a 20 20 2f 2a 20 41 20 74 72 61 6e 73 61  /..  /* A transa
7f50: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
7f60: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
7f70: 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 61 73 73  called. */.  ass
7f80: 65 72 74 28 20 70 54 61 62 2d 3e 74 73 2e 65 53  ert( pTab->ts.eS
7f90: 74 61 74 65 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  tate==1 );..  /*
7fa0: 20 41 20 64 65 6c 65 74 65 20 73 70 65 63 69 66   A delete specif
7fb0: 69 65 73 20 61 20 73 69 6e 67 6c 65 20 61 72 67  ies a single arg
7fc0: 75 6d 65 6e 74 20 2d 20 74 68 65 20 72 6f 77 69  ument - the rowi
7fd0: 64 20 6f 66 20 74 68 65 20 72 6f 77 20 74 6f 20  d of the row to 
7fe0: 72 65 6d 6f 76 65 2e 0a 20 20 2a 2a 20 55 70 64  remove..  ** Upd
7ff0: 61 74 65 20 61 6e 64 20 69 6e 73 65 72 74 20 6f  ate and insert o
8000: 70 65 72 61 74 69 6f 6e 73 20 70 61 73 73 3a 0a  perations pass:.
8010: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54    **.  **   1. T
8020: 68 65 20 22 6f 6c 64 22 20 72 6f 77 69 64 2c 20  he "old" rowid, 
8030: 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 20 20  or NULL..  **   
8040: 32 2e 20 54 68 65 20 22 6e 65 77 22 20 72 6f 77  2. The "new" row
8050: 69 64 2e 0a 20 20 2a 2a 20 20 20 33 2e 20 56 61  id..  **   3. Va
8060: 6c 75 65 73 20 66 6f 72 20 65 61 63 68 20 6f 66  lues for each of
8070: 20 74 68 65 20 6e 43 6f 6c 20 6d 61 74 63 68 61   the nCol matcha
8080: 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ble columns..  *
8090: 2a 20 20 20 34 2e 20 56 61 6c 75 65 73 20 66 6f  *   4. Values fo
80a0: 72 20 74 68 65 20 74 77 6f 20 68 69 64 64 65 6e  r the two hidden
80b0: 20 63 6f 6c 75 6d 6e 73 20 28 3c 74 61 62 6c 65   columns (<table
80c0: 6e 61 6d 65 3e 20 61 6e 64 20 22 72 61 6e 6b 22  name> and "rank"
80d0: 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
80e0: 28 20 6e 41 72 67 3d 3d 31 20 7c 7c 20 6e 41 72  ( nArg==1 || nAr
80f0: 67 3d 3d 28 32 20 2b 20 70 43 6f 6e 66 69 67 2d  g==(2 + pConfig-
8100: 3e 6e 43 6f 6c 20 2b 20 32 29 20 29 3b 0a 0a 20  >nCol + 2) );.. 
8110: 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 53   if( nArg>1 && S
8120: 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69  QLITE_NULL!=sqli
8130: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
8140: 70 56 61 6c 5b 32 20 2b 20 70 43 6f 6e 66 69 67  pVal[2 + pConfig
8150: 2d 3e 6e 43 6f 6c 5d 29 20 29 7b 0a 20 20 20 20  ->nCol]) ){.    
8160: 72 65 74 75 72 6e 20 66 74 73 35 53 70 65 63 69  return fts5Speci
8170: 61 6c 49 6e 73 65 72 74 28 70 54 61 62 2c 20 0a  alInsert(pTab, .
8180: 20 20 20 20 20 20 20 20 61 70 56 61 6c 5b 32 20          apVal[2 
8190: 2b 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 5d  + pConfig->nCol]
81a0: 2c 20 61 70 56 61 6c 5b 32 20 2b 20 70 43 6f 6e  , apVal[2 + pCon
81b0: 66 69 67 2d 3e 6e 43 6f 6c 20 2b 20 31 5d 0a 20  fig->nCol + 1]. 
81c0: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 65 54 79     );.  }..  eTy
81d0: 70 65 30 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  pe0 = sqlite3_va
81e0: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30  lue_type(apVal[0
81f0: 5d 29 3b 0a 20 20 65 43 6f 6e 66 6c 69 63 74 20  ]);.  eConflict 
8200: 3d 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f  = sqlite3_vtab_o
8210: 6e 5f 63 6f 6e 66 6c 69 63 74 28 70 43 6f 6e 66  n_conflict(pConf
8220: 69 67 2d 3e 64 62 29 3b 0a 0a 20 20 61 73 73 65  ig->db);..  asse
8230: 72 74 28 20 65 54 79 70 65 30 3d 3d 53 51 4c 49  rt( eType0==SQLI
8240: 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65 54  TE_INTEGER || eT
8250: 79 70 65 30 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  ype0==SQLITE_NUL
8260: 4c 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  L );.  if( eType
8270: 30 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  0==SQLITE_INTEGE
8280: 52 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65  R ){.    i64 iDe
8290: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
82a0: 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d  e_int64(apVal[0]
82b0: 29 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74  );    /* Rowid t
82c0: 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20  o delete */.    
82d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
82e0: 53 74 6f 72 61 67 65 44 65 6c 65 74 65 28 70 54  StorageDelete(pT
82f0: 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69 44  ab->pStorage, iD
8300: 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  el);.  }..  if( 
8310: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8320: 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 72   nArg>1 ){.    r
8330: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53  c = sqlite3Fts5S
8340: 74 6f 72 61 67 65 49 6e 73 65 72 74 28 70 54 61  torageInsert(pTa
8350: 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 61 70 56  b->pStorage, apV
8360: 61 6c 2c 20 65 43 6f 6e 66 6c 69 63 74 2c 20 70  al, eConflict, p
8370: 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 0a 20 20 72  Rowid);.  }..  r
8380: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8390: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
83a0: 6e 20 6f 66 20 78 53 79 6e 63 28 29 20 6d 65 74  n of xSync() met
83b0: 68 6f 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  hod. .*/.static 
83c0: 69 6e 74 20 66 74 73 35 53 79 6e 63 4d 65 74 68  int fts5SyncMeth
83d0: 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  od(sqlite3_vtab 
83e0: 2a 70 56 74 61 62 29 7b 0a 20 20 69 6e 74 20 72  *pVtab){.  int r
83f0: 63 3b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a  c;.  Fts5Table *
8400: 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c  pTab = (Fts5Tabl
8410: 65 2a 29 70 56 74 61 62 3b 0a 20 20 66 74 73 35  e*)pVtab;.  fts5
8420: 43 68 65 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  CheckTransaction
8430: 53 74 61 74 65 28 70 54 61 62 2c 20 46 54 53 35  State(pTab, FTS5
8440: 5f 53 59 4e 43 2c 20 30 29 3b 0a 20 20 72 63 20  _SYNC, 0);.  rc 
8450: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  = sqlite3Fts5Sto
8460: 72 61 67 65 53 79 6e 63 28 70 54 61 62 2d 3e 70  rageSync(pTab->p
8470: 53 74 6f 72 61 67 65 2c 20 31 29 3b 0a 20 20 72  Storage, 1);.  r
8480: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8490: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
84a0: 6e 20 6f 66 20 78 42 65 67 69 6e 28 29 20 6d 65  n of xBegin() me
84b0: 74 68 6f 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  thod. .*/.static
84c0: 20 69 6e 74 20 66 74 73 35 42 65 67 69 6e 4d 65   int fts5BeginMe
84d0: 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
84e0: 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 66 74 73  b *pVtab){.  fts
84f0: 35 43 68 65 63 6b 54 72 61 6e 73 61 63 74 69 6f  5CheckTransactio
8500: 6e 53 74 61 74 65 28 28 46 74 73 35 54 61 62 6c  nState((Fts5Tabl
8510: 65 2a 29 70 56 74 61 62 2c 20 46 54 53 35 5f 42  e*)pVtab, FTS5_B
8520: 45 47 49 4e 2c 20 30 29 3b 0a 20 20 72 65 74 75  EGIN, 0);.  retu
8530: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8540: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
8550: 61 74 69 6f 6e 20 6f 66 20 78 43 6f 6d 6d 69 74  ation of xCommit
8560: 28 29 20 6d 65 74 68 6f 64 2e 20 54 68 69 73 20  () method. This 
8570: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
8580: 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74  contents of.** t
8590: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
85a0: 20 68 61 73 68 2d 74 61 62 6c 65 20 68 61 76 65   hash-table have
85b0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 6c   already been fl
85c0: 75 73 68 65 64 20 69 6e 74 6f 20 74 68 65 20 64  ushed into the d
85d0: 61 74 61 62 61 73 65 0a 2a 2a 20 62 79 20 66 74  atabase.** by ft
85e0: 73 35 53 79 6e 63 4d 65 74 68 6f 64 28 29 2e 0a  s5SyncMethod()..
85f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
8600: 73 35 43 6f 6d 6d 69 74 4d 65 74 68 6f 64 28 73  s5CommitMethod(s
8610: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
8620: 61 62 29 7b 0a 20 20 66 74 73 35 43 68 65 63 6b  ab){.  fts5Check
8630: 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65  TransactionState
8640: 28 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56 74  ((Fts5Table*)pVt
8650: 61 62 2c 20 46 54 53 35 5f 43 4f 4d 4d 49 54 2c  ab, FTS5_COMMIT,
8660: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
8670: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8680: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
8690: 20 6f 66 20 78 52 6f 6c 6c 62 61 63 6b 28 29 2e   of xRollback().
86a0: 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
86b0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e  tents of the pen
86c0: 64 69 6e 67 2d 74 65 72 6d 73 0a 2a 2a 20 68 61  ding-terms.** ha
86d0: 73 68 2d 74 61 62 6c 65 2e 20 41 6e 79 20 63 68  sh-table. Any ch
86e0: 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
86f0: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 72  e database are r
8700: 65 76 65 72 74 65 64 20 62 79 20 53 51 4c 69 74  everted by SQLit
8710: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8720: 20 66 74 73 35 52 6f 6c 6c 62 61 63 6b 4d 65 74   fts5RollbackMet
8730: 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
8740: 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 6e 74 20   *pVtab){.  int 
8750: 72 63 3b 0a 20 20 46 74 73 35 54 61 62 6c 65 20  rc;.  Fts5Table 
8760: 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62  *pTab = (Fts5Tab
8770: 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 66 74 73  le*)pVtab;.  fts
8780: 35 43 68 65 63 6b 54 72 61 6e 73 61 63 74 69 6f  5CheckTransactio
8790: 6e 53 74 61 74 65 28 70 54 61 62 2c 20 46 54 53  nState(pTab, FTS
87a0: 35 5f 52 4f 4c 4c 42 41 43 4b 2c 20 30 29 3b 0a  5_ROLLBACK, 0);.
87b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
87c0: 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c 62 61 63  s5StorageRollbac
87d0: 6b 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65  k(pTab->pStorage
87e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
87f0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
8800: 66 74 73 35 41 70 69 55 73 65 72 44 61 74 61 28  fts5ApiUserData(
8810: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
8820: 78 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72  x){.  Fts5Cursor
8830: 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75   *pCsr = (Fts5Cu
8840: 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 72 65  rsor*)pCtx;.  re
8850: 74 75 72 6e 20 70 43 73 72 2d 3e 70 41 75 78 2d  turn pCsr->pAux-
8860: 3e 70 55 73 65 72 44 61 74 61 3b 0a 7d 0a 0a 73  >pUserData;.}..s
8870: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 70  tatic int fts5Ap
8880: 69 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28 46 74 73  iColumnCount(Fts
8890: 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  5Context *pCtx){
88a0: 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70  .  Fts5Cursor *p
88b0: 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f  Csr = (Fts5Curso
88c0: 72 2a 29 70 43 74 78 3b 0a 20 20 72 65 74 75 72  r*)pCtx;.  retur
88d0: 6e 20 28 28 46 74 73 35 54 61 62 6c 65 2a 29 28  n ((Fts5Table*)(
88e0: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
88f0: 29 29 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  ))->pConfig->nCo
8900: 6c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  l;.}..static int
8910: 20 66 74 73 35 41 70 69 43 6f 6c 75 6d 6e 54 6f   fts5ApiColumnTo
8920: 74 61 6c 53 69 7a 65 28 0a 20 20 46 74 73 35 43  talSize(.  Fts5C
8930: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
8940: 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 73 71   int iCol, .  sq
8950: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e 54  lite3_int64 *pnT
8960: 6f 6b 65 6e 0a 29 7b 0a 20 20 46 74 73 35 43 75  oken.){.  Fts5Cu
8970: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
8980: 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a  s5Cursor*)pCtx;.
8990: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
89a0: 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
89b0: 28 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  (pCsr->base.pVta
89c0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b);.  return sql
89d0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
89e0: 69 7a 65 28 70 54 61 62 2d 3e 70 53 74 6f 72 61  ize(pTab->pStora
89f0: 67 65 2c 20 69 43 6f 6c 2c 20 70 6e 54 6f 6b 65  ge, iCol, pnToke
8a00: 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  n);.}..static in
8a10: 74 20 66 74 73 35 41 70 69 52 6f 77 43 6f 75 6e  t fts5ApiRowCoun
8a20: 74 28 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70  t(Fts5Context *p
8a30: 43 74 78 2c 20 69 36 34 20 2a 70 6e 52 6f 77 29  Ctx, i64 *pnRow)
8a40: 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  {.  Fts5Cursor *
8a50: 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73  pCsr = (Fts5Curs
8a60: 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46 74 73 35  or*)pCtx;.  Fts5
8a70: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
8a80: 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72 2d  ts5Table*)(pCsr-
8a90: 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a 20 20  >base.pVtab);.  
8aa0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
8ab0: 73 35 53 74 6f 72 61 67 65 52 6f 77 43 6f 75 6e  s5StorageRowCoun
8ac0: 74 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65  t(pTab->pStorage
8ad0: 2c 20 70 6e 52 6f 77 29 3b 0a 7d 0a 0a 73 74 61  , pnRow);.}..sta
8ae0: 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 69 54  tic int fts5ApiT
8af0: 6f 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35 43  okenize(.  Fts5C
8b00: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
8b10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65   const char *pTe
8b20: 78 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c 20 0a  xt, int nText, .
8b30: 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74    void *pUserDat
8b40: 61 2c 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65  a,.  int (*xToke
8b50: 6e 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20  n)(void*, const 
8b60: 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c  char*, int, int,
8b70: 20 69 6e 74 2c 20 69 6e 74 29 0a 29 7b 0a 20 20   int, int).){.  
8b80: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
8b90: 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29   = (Fts5Cursor*)
8ba0: 70 43 74 78 3b 0a 20 20 46 74 73 35 54 61 62 6c  pCtx;.  Fts5Tabl
8bb0: 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54  e *pTab = (Fts5T
8bc0: 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73  able*)(pCsr->bas
8bd0: 65 2e 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75  e.pVtab);.  retu
8be0: 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f  rn sqlite3Fts5To
8bf0: 6b 65 6e 69 7a 65 28 70 54 61 62 2d 3e 70 43 6f  kenize(pTab->pCo
8c00: 6e 66 69 67 2c 20 70 54 65 78 74 2c 20 6e 54 65  nfig, pText, nTe
8c10: 78 74 2c 20 70 55 73 65 72 44 61 74 61 2c 20 78  xt, pUserData, x
8c20: 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69  Token);.}..stati
8c30: 63 20 69 6e 74 20 66 74 73 35 41 70 69 50 68 72  c int fts5ApiPhr
8c40: 61 73 65 43 6f 75 6e 74 28 46 74 73 35 43 6f 6e  aseCount(Fts5Con
8c50: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 46  text *pCtx){.  F
8c60: 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts5Cursor *pCsr 
8c70: 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70  = (Fts5Cursor*)p
8c80: 43 74 78 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  Ctx;.  return sq
8c90: 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72  lite3Fts5ExprPhr
8ca0: 61 73 65 43 6f 75 6e 74 28 70 43 73 72 2d 3e 70  aseCount(pCsr->p
8cb0: 45 78 70 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Expr);.}..static
8cc0: 20 69 6e 74 20 66 74 73 35 41 70 69 50 68 72 61   int fts5ApiPhra
8cd0: 73 65 53 69 7a 65 28 46 74 73 35 43 6f 6e 74 65  seSize(Fts5Conte
8ce0: 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 69 50  xt *pCtx, int iP
8cf0: 68 72 61 73 65 29 7b 0a 20 20 46 74 73 35 43 75  hrase){.  Fts5Cu
8d00: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
8d10: 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a  s5Cursor*)pCtx;.
8d20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8d30: 46 74 73 35 45 78 70 72 50 68 72 61 73 65 53 69  Fts5ExprPhraseSi
8d40: 7a 65 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20  ze(pCsr->pExpr, 
8d50: 69 50 68 72 61 73 65 29 3b 0a 7d 0a 0a 73 74 61  iPhrase);.}..sta
8d60: 74 69 63 20 69 6e 74 20 66 74 73 35 43 73 72 50  tic int fts5CsrP
8d70: 6f 73 6c 69 73 74 28 46 74 73 35 43 75 72 73 6f  oslist(Fts5Curso
8d80: 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 69 50 68  r *pCsr, int iPh
8d90: 72 61 73 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a  rase, const u8 *
8da0: 2a 70 61 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  *pa){.  int n;. 
8db0: 20 69 66 28 20 70 43 73 72 2d 3e 70 53 6f 72 74   if( pCsr->pSort
8dc0: 65 72 20 29 7b 0a 20 20 20 20 46 74 73 35 53 6f  er ){.    Fts5So
8dd0: 72 74 65 72 20 2a 70 53 6f 72 74 65 72 20 3d 20  rter *pSorter = 
8de0: 70 43 73 72 2d 3e 70 53 6f 72 74 65 72 3b 0a 20  pCsr->pSorter;. 
8df0: 20 20 20 69 6e 74 20 69 31 20 3d 20 28 69 50 68     int i1 = (iPh
8e00: 72 61 73 65 3d 3d 30 20 3f 20 30 20 3a 20 70 53  rase==0 ? 0 : pS
8e10: 6f 72 74 65 72 2d 3e 61 49 64 78 5b 69 50 68 72  orter->aIdx[iPhr
8e20: 61 73 65 2d 31 5d 29 3b 0a 20 20 20 20 6e 20 3d  ase-1]);.    n =
8e30: 20 70 53 6f 72 74 65 72 2d 3e 61 49 64 78 5b 69   pSorter->aIdx[i
8e40: 50 68 72 61 73 65 5d 20 2d 20 69 31 3b 0a 20 20  Phrase] - i1;.  
8e50: 20 20 2a 70 61 20 3d 20 26 70 53 6f 72 74 65 72    *pa = &pSorter
8e60: 2d 3e 61 50 6f 73 6c 69 73 74 5b 69 31 5d 3b 0a  ->aPoslist[i1];.
8e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 3d    }else{.    n =
8e80: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
8e90: 50 6f 73 6c 69 73 74 28 70 43 73 72 2d 3e 70 45  Poslist(pCsr->pE
8ea0: 78 70 72 2c 20 69 50 68 72 61 73 65 2c 20 70 61  xpr, iPhrase, pa
8eb0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8ec0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  n;.}../*.** Ensu
8ed0: 72 65 20 74 68 61 74 20 74 68 65 20 46 74 73 35  re that the Fts5
8ee0: 43 75 72 73 6f 72 2e 6e 49 6e 73 74 43 6f 75 6e  Cursor.nInstCoun
8ef0: 74 20 61 6e 64 20 61 49 6e 73 74 5b 5d 20 76 61  t and aInst[] va
8f00: 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75  riables are popu
8f10: 6c 61 74 65 64 0a 2a 2a 20 63 6f 72 72 65 63 74  lated.** correct
8f20: 6c 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ly for the curre
8f30: 6e 74 20 76 69 65 77 2e 20 52 65 74 75 72 6e 20  nt view. Return 
8f40: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
8f50: 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 0a 2a  cessful, or an.*
8f60: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
8f70: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
8f80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
8f90: 35 43 61 63 68 65 49 6e 73 74 41 72 72 61 79 28  5CacheInstArray(
8fa0: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
8fb0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
8fc0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
8fd0: 43 73 72 2d 3e 61 49 6e 73 74 3d 3d 30 20 29 7b  Csr->aInst==0 ){
8fe0: 0a 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74  .    Fts5Poslist
8ff0: 52 65 61 64 65 72 20 2a 61 49 74 65 72 3b 20 20  Reader *aIter;  
9000: 20 20 20 2f 2a 20 4f 6e 65 20 69 74 65 72 61 74     /* One iterat
9010: 6f 72 20 66 6f 72 20 65 61 63 68 20 70 68 72 61  or for each phra
9020: 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49  se */.    int nI
9030: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9040: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9050: 72 20 6f 66 20 69 74 65 72 61 74 6f 72 73 2f 70  r of iterators/p
9060: 68 72 61 73 65 73 20 2a 2f 0a 20 20 20 20 69 6e  hrases */.    in
9070: 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 0a 20 20  t nByte;.    .  
9080: 20 20 6e 49 74 65 72 20 3d 20 73 71 6c 69 74 65    nIter = sqlite
9090: 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43  3Fts5ExprPhraseC
90a0: 6f 75 6e 74 28 70 43 73 72 2d 3e 70 45 78 70 72  ount(pCsr->pExpr
90b0: 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  );.    nByte = s
90c0: 69 7a 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73  izeof(Fts5Poslis
90d0: 74 52 65 61 64 65 72 29 20 2a 20 6e 49 74 65 72  tReader) * nIter
90e0: 3b 0a 20 20 20 20 61 49 74 65 72 20 3d 20 28 46  ;.    aIter = (F
90f0: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
9100: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
9110: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79  locZero(&rc, nBy
9120: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61 49 74  te);.    if( aIt
9130: 65 72 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  er ){.      Fts5
9140: 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c  Buffer buf = {0,
9150: 20 30 2c 20 30 7d 3b 20 2f 2a 20 42 75 69 6c 64   0, 0}; /* Build
9160: 20 75 70 20 61 49 6e 73 74 5b 5d 20 68 65 72 65   up aInst[] here
9170: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   */.      int nI
9180: 6e 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nst = 0;        
9190: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
91a0: 69 6e 73 74 61 6e 63 65 73 20 73 65 65 6e 20 73  instances seen s
91b0: 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 69  o far */.      i
91c0: 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt i;..      /* 
91d0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 69  Initialize all i
91e0: 74 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20  terators */.    
91f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 74    for(i=0; i<nIt
9200: 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  er; i++){.      
9210: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 0a 20    const u8 *a;. 
9220: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 66         int n = f
9230: 74 73 35 43 73 72 50 6f 73 6c 69 73 74 28 70 43  ts5CsrPoslist(pC
9240: 73 72 2c 20 69 2c 20 26 61 29 3b 0a 20 20 20 20  sr, i, &a);.    
9250: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
9260: 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
9270: 28 2d 31 2c 20 61 2c 20 6e 2c 20 26 61 49 74 65  (-1, a, n, &aIte
9280: 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  r[i]);.      }..
9290: 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
92a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61  {.        int *a
92b0: 49 6e 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e  Inst;.        in
92c0: 74 20 69 42 65 73 74 20 3d 20 2d 31 3b 0a 20 20  t iBest = -1;.  
92d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
92e0: 3c 6e 49 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nIter; i++){.  
92f0: 20 20 20 20 20 20 20 20 69 66 28 20 28 61 49 74          if( (aIt
9300: 65 72 5b 69 5d 2e 62 45 6f 66 3d 3d 30 29 20 0a  er[i].bEof==0) .
9310: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
9320: 42 65 73 74 3c 30 20 7c 7c 20 61 49 74 65 72 5b  Best<0 || aIter[
9330: 69 5d 2e 69 50 6f 73 3c 61 49 74 65 72 5b 69 42  i].iPos<aIter[iB
9340: 65 73 74 5d 2e 69 50 6f 73 29 20 0a 20 20 20 20  est].iPos) .    
9350: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
9360: 20 20 20 20 20 69 42 65 73 74 20 3d 20 69 3b 0a       iBest = i;.
9370: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9380: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
9390: 66 28 20 69 42 65 73 74 3c 30 20 29 20 62 72 65  f( iBest<0 ) bre
93a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 73  ak;.        nIns
93b0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t++;.        if(
93c0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
93d0: 65 72 47 72 6f 77 28 26 72 63 2c 20 26 62 75 66  erGrow(&rc, &buf
93e0: 2c 20 6e 49 6e 73 74 20 2a 20 73 69 7a 65 6f 66  , nInst * sizeof
93f0: 28 69 6e 74 29 20 2a 20 33 29 20 29 20 62 72 65  (int) * 3) ) bre
9400: 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 61 49 6e  ak;..        aIn
9410: 73 74 20 3d 20 26 28 28 69 6e 74 2a 29 62 75 66  st = &((int*)buf
9420: 2e 70 29 5b 33 20 2a 20 28 6e 49 6e 73 74 2d 31  .p)[3 * (nInst-1
9430: 29 5d 3b 0a 20 20 20 20 20 20 20 20 61 49 6e 73  )];.        aIns
9440: 74 5b 30 5d 20 3d 20 69 42 65 73 74 3b 0a 20 20  t[0] = iBest;.  
9450: 20 20 20 20 20 20 61 49 6e 73 74 5b 31 5d 20 3d        aInst[1] =
9460: 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
9470: 28 61 49 74 65 72 5b 69 42 65 73 74 5d 2e 69 50  (aIter[iBest].iP
9480: 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 61 49 6e  os);.        aIn
9490: 73 74 5b 32 5d 20 3d 20 46 54 53 35 5f 50 4f 53  st[2] = FTS5_POS
94a0: 32 4f 46 46 53 45 54 28 61 49 74 65 72 5b 69 42  2OFFSET(aIter[iB
94b0: 65 73 74 5d 2e 69 50 6f 73 29 3b 0a 20 20 20 20  est].iPos);.    
94c0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
94d0: 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
94e0: 28 26 61 49 74 65 72 5b 69 42 65 73 74 5d 29 3b  (&aIter[iBest]);
94f0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9500: 70 43 73 72 2d 3e 61 49 6e 73 74 20 3d 20 28 69  pCsr->aInst = (i
9510: 6e 74 2a 29 62 75 66 2e 70 3b 0a 20 20 20 20 20  nt*)buf.p;.     
9520: 20 70 43 73 72 2d 3e 6e 49 6e 73 74 43 6f 75 6e   pCsr->nInstCoun
9530: 74 20 3d 20 6e 49 6e 73 74 3b 0a 20 20 20 20 20  t = nInst;.     
9540: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49   sqlite3_free(aI
9550: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
9560: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9570: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41  static int fts5A
9580: 70 69 49 6e 73 74 43 6f 75 6e 74 28 46 74 73 35  piInstCount(Fts5
9590: 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  Context *pCtx, i
95a0: 6e 74 20 2a 70 6e 49 6e 73 74 29 7b 0a 20 20 46  nt *pnInst){.  F
95b0: 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts5Cursor *pCsr 
95c0: 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70  = (Fts5Cursor*)p
95d0: 43 74 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Ctx;.  int rc;. 
95e0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
95f0: 28 72 63 20 3d 20 66 74 73 35 43 61 63 68 65 49  (rc = fts5CacheI
9600: 6e 73 74 41 72 72 61 79 28 70 43 73 72 29 29 20  nstArray(pCsr)) 
9610: 29 7b 0a 20 20 20 20 2a 70 6e 49 6e 73 74 20 3d  ){.    *pnInst =
9620: 20 70 43 73 72 2d 3e 6e 49 6e 73 74 43 6f 75 6e   pCsr->nInstCoun
9630: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
9640: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
9650: 74 20 66 74 73 35 41 70 69 49 6e 73 74 28 0a 20  t fts5ApiInst(. 
9660: 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43   Fts5Context *pC
9670: 74 78 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c  tx, .  int iIdx,
9680: 20 0a 20 20 69 6e 74 20 2a 70 69 50 68 72 61 73   .  int *piPhras
9690: 65 2c 20 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c  e, .  int *piCol
96a0: 2c 20 0a 20 20 69 6e 74 20 2a 70 69 4f 66 66 0a  , .  int *piOff.
96b0: 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20  ){.  Fts5Cursor 
96c0: 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72  *pCsr = (Fts5Cur
96d0: 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74  sor*)pCtx;.  int
96e0: 20 72 63 3b 0a 20 20 69 66 28 20 53 51 4c 49 54   rc;.  if( SQLIT
96f0: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 66 74 73 35  E_OK==(rc = fts5
9700: 43 61 63 68 65 49 6e 73 74 41 72 72 61 79 28 70  CacheInstArray(p
9710: 43 73 72 29 29 20 29 7b 0a 20 20 20 20 69 66 28  Csr)) ){.    if(
9720: 20 69 49 64 78 3c 30 20 7c 7c 20 69 49 64 78 3e   iIdx<0 || iIdx>
9730: 3d 70 43 73 72 2d 3e 6e 49 6e 73 74 43 6f 75 6e  =pCsr->nInstCoun
9740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
9750: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3b 0a 20 20  SQLITE_RANGE;.  
9760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
9770: 70 69 50 68 72 61 73 65 20 3d 20 70 43 73 72 2d  piPhrase = pCsr-
9780: 3e 61 49 6e 73 74 5b 69 49 64 78 2a 33 5d 3b 0a  >aInst[iIdx*3];.
9790: 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 70        *piCol = p
97a0: 43 73 72 2d 3e 61 49 6e 73 74 5b 69 49 64 78 2a  Csr->aInst[iIdx*
97b0: 33 20 2b 20 31 5d 3b 0a 20 20 20 20 20 20 2a 70  3 + 1];.      *p
97c0: 69 4f 66 66 20 3d 20 70 43 73 72 2d 3e 61 49 6e  iOff = pCsr->aIn
97d0: 73 74 5b 69 49 64 78 2a 33 20 2b 20 32 5d 3b 0a  st[iIdx*3 + 2];.
97e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
97f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
9800: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
9810: 74 73 35 41 70 69 52 6f 77 69 64 28 46 74 73 35  ts5ApiRowid(Fts5
9820: 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  Context *pCtx){.
9830: 20 20 72 65 74 75 72 6e 20 66 74 73 35 43 75 72    return fts5Cur
9840: 73 6f 72 52 6f 77 69 64 28 28 46 74 73 35 43 75  sorRowid((Fts5Cu
9850: 72 73 6f 72 2a 29 70 43 74 78 29 3b 0a 7d 0a 0a  rsor*)pCtx);.}..
9860: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41  static int fts5A
9870: 70 69 43 6f 6c 75 6d 6e 54 65 78 74 28 0a 20 20  piColumnText(.  
9880: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
9890: 78 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20  x, .  int iCol, 
98a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
98b0: 70 7a 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 0a 29  pz, .  int *pn.)
98c0: 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  {.  Fts5Cursor *
98d0: 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73  pCsr = (Fts5Curs
98e0: 6f 72 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  or*)pCtx;.  int 
98f0: 72 63 20 3d 20 66 74 73 35 53 65 65 6b 43 75 72  rc = fts5SeekCur
9900: 73 6f 72 28 70 43 73 72 29 3b 0a 20 20 69 66 28  sor(pCsr);.  if(
9910: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9920: 7b 0a 20 20 20 20 2a 70 7a 20 3d 20 28 63 6f 6e  {.    *pz = (con
9930: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
9940: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73  _column_text(pCs
9950: 72 2d 3e 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31  r->pStmt, iCol+1
9960: 29 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 73 71 6c  );.    *pn = sql
9970: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
9980: 73 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 69  s(pCsr->pStmt, i
9990: 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65  Col+1);.  }.  re
99a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
99b0: 69 63 20 69 6e 74 20 66 74 73 35 41 70 69 43 6f  ic int fts5ApiCo
99c0: 6c 75 6d 6e 53 69 7a 65 28 46 74 73 35 43 6f 6e  lumnSize(Fts5Con
99d0: 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20  text *pCtx, int 
99e0: 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6e 54 6f 6b  iCol, int *pnTok
99f0: 65 6e 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f  en){.  Fts5Curso
9a00: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43  r *pCsr = (Fts5C
9a10: 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46  ursor*)pCtx;.  F
9a20: 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts5Table *pTab =
9a30: 20 28 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43   (Fts5Table*)(pC
9a40: 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 3b  sr->base.pVtab);
9a50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9a60: 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 43 73  TE_OK;..  if( Cs
9a70: 72 46 6c 61 67 54 65 73 74 28 70 43 73 72 2c 20  rFlagTest(pCsr, 
9a80: 46 54 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f  FTS5CSR_REQUIRE_
9a90: 44 4f 43 53 49 5a 45 29 20 29 7b 0a 20 20 20 20  DOCSIZE) ){.    
9aa0: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
9ab0: 35 43 75 72 73 6f 72 52 6f 77 69 64 28 70 43 73  5CursorRowid(pCs
9ac0: 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
9ad0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44  ite3Fts5StorageD
9ae0: 6f 63 73 69 7a 65 28 70 54 61 62 2d 3e 70 53 74  ocsize(pTab->pSt
9af0: 6f 72 61 67 65 2c 20 69 52 6f 77 69 64 2c 20 70  orage, iRowid, p
9b00: 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53 69 7a 65  Csr->aColumnSize
9b10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
9b20: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
9b30: 62 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  b->pConfig->nCol
9b40: 20 29 7b 0a 20 20 20 20 2a 70 6e 54 6f 6b 65 6e   ){.    *pnToken
9b50: 20 3d 20 70 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e   = pCsr->aColumn
9b60: 53 69 7a 65 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65  Size[iCol];.  }e
9b70: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 54 6f 6b 65  lse{.    *pnToke
9b80: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  n = 0;.  }.  ret
9b90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
9ba0: 63 20 69 6e 74 20 66 74 73 35 41 70 69 50 6f 73  c int fts5ApiPos
9bb0: 6c 69 73 74 28 0a 20 20 46 74 73 35 43 6f 6e 74  list(.  Fts5Cont
9bc0: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
9bd0: 74 20 69 50 68 72 61 73 65 2c 20 0a 20 20 69 6e  t iPhrase, .  in
9be0: 74 20 2a 70 69 2c 20 0a 20 20 69 36 34 20 2a 70  t *pi, .  i64 *p
9bf0: 69 50 6f 73 20 0a 29 7b 0a 20 20 46 74 73 35 43  iPos .){.  Fts5C
9c00: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
9c10: 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b  ts5Cursor*)pCtx;
9c20: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20  .  const u8 *a; 
9c30: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
9c40: 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 66 6f     /* Poslist fo
9c50: 72 20 70 68 72 61 73 65 20 69 50 68 72 61 73 65  r phrase iPhrase
9c60: 20 2a 2f 0a 20 20 6e 20 3d 20 66 74 73 35 43 73   */.  n = fts5Cs
9c70: 72 50 6f 73 6c 69 73 74 28 70 43 73 72 2c 20 69  rPoslist(pCsr, i
9c80: 50 68 72 61 73 65 2c 20 26 61 29 3b 0a 20 20 72  Phrase, &a);.  r
9c90: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73  eturn sqlite3Fts
9ca0: 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
9cb0: 2c 20 6e 2c 20 70 69 2c 20 70 69 50 6f 73 29 3b  , n, pi, piPos);
9cc0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
9cd0: 74 73 35 41 70 69 53 65 74 41 75 78 64 61 74 61  ts5ApiSetAuxdata
9ce0: 28 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20  (.  Fts5Context 
9cf0: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
9d00: 20 20 20 20 2f 2a 20 46 74 73 35 20 63 6f 6e 74      /* Fts5 cont
9d10: 65 78 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ext */.  void *p
9d20: 50 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ptr,            
9d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9d40: 74 65 72 20 74 6f 20 73 61 76 65 20 61 73 20 61  ter to save as a
9d50: 75 78 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  uxdata */.  void
9d60: 28 2a 78 44 65 6c 65 74 65 29 28 76 6f 69 64 2a  (*xDelete)(void*
9d70: 29 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  )           /* D
9d80: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 70 50  estructor for pP
9d90: 74 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  tr (or NULL) */.
9da0: 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20  ){.  Fts5Cursor 
9db0: 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72  *pCsr = (Fts5Cur
9dc0: 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46 74 73  sor*)pCtx;.  Fts
9dd0: 35 41 75 78 64 61 74 61 20 2a 70 44 61 74 61 3b  5Auxdata *pData;
9de0: 0a 0a 20 20 66 6f 72 28 70 44 61 74 61 3d 70 43  ..  for(pData=pC
9df0: 73 72 2d 3e 70 41 75 78 64 61 74 61 3b 20 70 44  sr->pAuxdata; pD
9e00: 61 74 61 3b 20 70 44 61 74 61 3d 70 44 61 74 61  ata; pData=pData
9e10: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
9e20: 28 20 70 44 61 74 61 2d 3e 70 41 75 78 3d 3d 70  ( pData->pAux==p
9e30: 43 73 72 2d 3e 70 41 75 78 20 29 20 62 72 65 61  Csr->pAux ) brea
9e40: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44  k;.  }..  if( pD
9e50: 61 74 61 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ata ){.    if( p
9e60: 44 61 74 61 2d 3e 78 44 65 6c 65 74 65 20 29 7b  Data->xDelete ){
9e70: 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 78 44  .      pData->xD
9e80: 65 6c 65 74 65 28 70 44 61 74 61 2d 3e 70 50 74  elete(pData->pPt
9e90: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  r);.    }.  }els
9ea0: 65 7b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 28  e{.    pData = (
9eb0: 46 74 73 35 41 75 78 64 61 74 61 2a 29 73 71 6c  Fts5Auxdata*)sql
9ec0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
9ed0: 6f 66 28 46 74 73 35 41 75 78 64 61 74 61 29 29  of(Fts5Auxdata))
9ee0: 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 3d  ;.    if( pData=
9ef0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
9f00: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
9f10: 6d 73 65 74 28 70 44 61 74 61 2c 20 30 2c 20 73  mset(pData, 0, s
9f20: 69 7a 65 6f 66 28 46 74 73 35 41 75 78 64 61 74  izeof(Fts5Auxdat
9f30: 61 29 29 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e  a));.    pData->
9f40: 70 41 75 78 20 3d 20 70 43 73 72 2d 3e 70 41 75  pAux = pCsr->pAu
9f50: 78 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 70 4e  x;.    pData->pN
9f60: 65 78 74 20 3d 20 70 43 73 72 2d 3e 70 41 75 78  ext = pCsr->pAux
9f70: 64 61 74 61 3b 0a 20 20 20 20 70 43 73 72 2d 3e  data;.    pCsr->
9f80: 70 41 75 78 64 61 74 61 20 3d 20 70 44 61 74 61  pAuxdata = pData
9f90: 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61 2d 3e  ;.  }..  pData->
9fa0: 78 44 65 6c 65 74 65 20 3d 20 78 44 65 6c 65 74  xDelete = xDelet
9fb0: 65 3b 0a 20 20 70 44 61 74 61 2d 3e 70 50 74 72  e;.  pData->pPtr
9fc0: 20 3d 20 70 50 74 72 3b 0a 20 20 72 65 74 75 72   = pPtr;.  retur
9fd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9fe0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
9ff0: 35 41 70 69 47 65 74 41 75 78 64 61 74 61 28 46  5ApiGetAuxdata(F
a000: 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ts5Context *pCtx
a010: 2c 20 69 6e 74 20 62 43 6c 65 61 72 29 7b 0a 20  , int bClear){. 
a020: 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73   Fts5Cursor *pCs
a030: 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a  r = (Fts5Cursor*
a040: 29 70 43 74 78 3b 0a 20 20 46 74 73 35 41 75 78  )pCtx;.  Fts5Aux
a050: 64 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 76  data *pData;.  v
a060: 6f 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a  oid *pRet = 0;..
a070: 20 20 66 6f 72 28 70 44 61 74 61 3d 70 43 73 72    for(pData=pCsr
a080: 2d 3e 70 41 75 78 64 61 74 61 3b 20 70 44 61 74  ->pAuxdata; pDat
a090: 61 3b 20 70 44 61 74 61 3d 70 44 61 74 61 2d 3e  a; pData=pData->
a0a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
a0b0: 70 44 61 74 61 2d 3e 70 41 75 78 3d 3d 70 43 73  pData->pAux==pCs
a0c0: 72 2d 3e 70 41 75 78 20 29 20 62 72 65 61 6b 3b  r->pAux ) break;
a0d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 61 74  .  }..  if( pDat
a0e0: 61 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  a ){.    pRet = 
a0f0: 70 44 61 74 61 2d 3e 70 50 74 72 3b 0a 20 20 20  pData->pPtr;.   
a100: 20 69 66 28 20 62 43 6c 65 61 72 20 29 7b 0a 20   if( bClear ){. 
a110: 20 20 20 20 20 70 44 61 74 61 2d 3e 70 50 74 72       pData->pPtr
a120: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 61 74   = 0;.      pDat
a130: 61 2d 3e 78 44 65 6c 65 74 65 20 3d 20 30 3b 0a  a->xDelete = 0;.
a140: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
a150: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn pRet;.}..sta
a160: 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 69 51  tic int fts5ApiQ
a170: 75 65 72 79 50 68 72 61 73 65 28 46 74 73 35 43  ueryPhrase(Fts5C
a180: 6f 6e 74 65 78 74 2a 2c 20 69 6e 74 2c 20 76 6f  ontext*, int, vo
a190: 69 64 2a 2c 20 0a 20 20 20 20 69 6e 74 28 2a 29  id*, .    int(*)
a1a0: 28 63 6f 6e 73 74 20 46 74 73 35 45 78 74 65 6e  (const Fts5Exten
a1b0: 73 69 6f 6e 41 70 69 2a 2c 20 46 74 73 35 43 6f  sionApi*, Fts5Co
a1c0: 6e 74 65 78 74 2a 2c 20 76 6f 69 64 2a 29 0a 29  ntext*, void*).)
a1d0: 3b 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ;..static const 
a1e0: 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70 69  Fts5ExtensionApi
a1f0: 20 73 46 74 73 35 41 70 69 20 3d 20 7b 0a 20 20   sFts5Api = {.  
a200: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a220: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 66   iVersion */.  f
a230: 74 73 35 41 70 69 55 73 65 72 44 61 74 61 2c 0a  ts5ApiUserData,.
a240: 20 20 66 74 73 35 41 70 69 43 6f 6c 75 6d 6e 43    fts5ApiColumnC
a250: 6f 75 6e 74 2c 0a 20 20 66 74 73 35 41 70 69 52  ount,.  fts5ApiR
a260: 6f 77 43 6f 75 6e 74 2c 0a 20 20 66 74 73 35 41  owCount,.  fts5A
a270: 70 69 43 6f 6c 75 6d 6e 54 6f 74 61 6c 53 69 7a  piColumnTotalSiz
a280: 65 2c 0a 20 20 66 74 73 35 41 70 69 54 6f 6b 65  e,.  fts5ApiToke
a290: 6e 69 7a 65 2c 0a 20 20 66 74 73 35 41 70 69 50  nize,.  fts5ApiP
a2a0: 68 72 61 73 65 43 6f 75 6e 74 2c 0a 20 20 66 74  hraseCount,.  ft
a2b0: 73 35 41 70 69 50 68 72 61 73 65 53 69 7a 65 2c  s5ApiPhraseSize,
a2c0: 0a 20 20 66 74 73 35 41 70 69 49 6e 73 74 43 6f  .  fts5ApiInstCo
a2d0: 75 6e 74 2c 0a 20 20 66 74 73 35 41 70 69 49 6e  unt,.  fts5ApiIn
a2e0: 73 74 2c 0a 20 20 66 74 73 35 41 70 69 52 6f 77  st,.  fts5ApiRow
a2f0: 69 64 2c 0a 20 20 66 74 73 35 41 70 69 43 6f 6c  id,.  fts5ApiCol
a300: 75 6d 6e 54 65 78 74 2c 0a 20 20 66 74 73 35 41  umnText,.  fts5A
a310: 70 69 43 6f 6c 75 6d 6e 53 69 7a 65 2c 0a 20 20  piColumnSize,.  
a320: 66 74 73 35 41 70 69 50 6f 73 6c 69 73 74 2c 0a  fts5ApiPoslist,.
a330: 20 20 66 74 73 35 41 70 69 51 75 65 72 79 50 68    fts5ApiQueryPh
a340: 72 61 73 65 2c 0a 20 20 66 74 73 35 41 70 69 53  rase,.  fts5ApiS
a350: 65 74 41 75 78 64 61 74 61 2c 0a 20 20 66 74 73  etAuxdata,.  fts
a360: 35 41 70 69 47 65 74 41 75 78 64 61 74 61 2c 0a  5ApiGetAuxdata,.
a370: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  };.../*.** Imple
a380: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 41 50 49  mentation of API
a390: 20 66 75 6e 63 74 69 6f 6e 20 78 51 75 65 72 79   function xQuery
a3a0: 50 68 72 61 73 65 28 29 2e 0a 2a 2f 0a 73 74 61  Phrase()..*/.sta
a3b0: 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 69 51  tic int fts5ApiQ
a3c0: 75 65 72 79 50 68 72 61 73 65 28 0a 20 20 46 74  ueryPhrase(.  Ft
a3d0: 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  s5Context *pCtx,
a3e0: 20 0a 20 20 69 6e 74 20 69 50 68 72 61 73 65 2c   .  int iPhrase,
a3f0: 20 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44   .  void *pUserD
a400: 61 74 61 2c 0a 20 20 69 6e 74 28 2a 78 43 61 6c  ata,.  int(*xCal
a410: 6c 62 61 63 6b 29 28 63 6f 6e 73 74 20 46 74 73  lback)(const Fts
a420: 35 45 78 74 65 6e 73 69 6f 6e 41 70 69 2a 2c 20  5ExtensionApi*, 
a430: 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20 76 6f  Fts5Context*, vo
a440: 69 64 2a 29 0a 29 7b 0a 20 20 46 74 73 35 43 75  id*).){.  Fts5Cu
a450: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
a460: 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a  s5Cursor*)pCtx;.
a470: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
a480: 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
a490: 28 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  (pCsr->base.pVta
a4a0: 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b);.  int rc;.  
a4b0: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 4e 65 77  Fts5Cursor *pNew
a4c0: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 66 74   = 0;..  rc = ft
a4d0: 73 35 4f 70 65 6e 4d 65 74 68 6f 64 28 70 43 73  s5OpenMethod(pCs
a4e0: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 2c 20 28  r->base.pVtab, (
a4f0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
a500: 73 6f 72 2a 2a 29 26 70 4e 65 77 29 3b 0a 20 20  sor**)&pNew);.  
a510: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a520: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  K ){.    Fts5Con
a530: 66 69 67 20 2a 70 43 6f 6e 66 20 3d 20 70 54 61  fig *pConf = pTa
a540: 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  b->pConfig;.    
a550: 70 4e 65 77 2d 3e 69 64 78 4e 75 6d 20 3d 20 46  pNew->idxNum = F
a560: 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 3b 0a  TS5_PLAN_MATCH;.
a570: 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 70      pNew->base.p
a580: 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f  Vtab = (sqlite3_
a590: 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 20 20  vtab*)pTab;.    
a5a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
a5b0: 45 78 70 72 50 68 72 61 73 65 45 78 70 72 28 70  ExprPhraseExpr(p
a5c0: 43 6f 6e 66 2c 20 70 43 73 72 2d 3e 70 45 78 70  Conf, pCsr->pExp
a5d0: 72 2c 20 69 50 68 72 61 73 65 2c 20 26 70 4e 65  r, iPhrase, &pNe
a5e0: 77 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  w->pExpr);.  }..
a5f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a600: 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 72  _OK ){.    for(r
a610: 63 20 3d 20 66 74 73 35 43 75 72 73 6f 72 46 69  c = fts5CursorFi
a620: 72 73 74 28 70 54 61 62 2c 20 70 4e 65 77 2c 20  rst(pTab, pNew, 
a630: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  0);.        rc==
a640: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 43 73 72  SQLITE_OK && Csr
a650: 46 6c 61 67 54 65 73 74 28 70 4e 65 77 2c 20 46  FlagTest(pNew, F
a660: 54 53 35 43 53 52 5f 45 4f 46 29 3d 3d 30 3b 0a  TS5CSR_EOF)==0;.
a670: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
a680: 35 4e 65 78 74 4d 65 74 68 6f 64 28 28 73 71 6c  5NextMethod((sql
a690: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
a6a0: 2a 29 70 4e 65 77 29 0a 20 20 20 20 29 7b 0a 20  *)pNew).    ){. 
a6b0: 20 20 20 20 20 72 63 20 3d 20 78 43 61 6c 6c 62       rc = xCallb
a6c0: 61 63 6b 28 26 73 46 74 73 35 41 70 69 2c 20 28  ack(&sFts5Api, (
a6d0: 46 74 73 35 43 6f 6e 74 65 78 74 2a 29 70 4e 65  Fts5Context*)pNe
a6e0: 77 2c 20 70 55 73 65 72 44 61 74 61 29 3b 0a 20  w, pUserData);. 
a6f0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
a700: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a710: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a720: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
a730: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
a740: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a750: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
a760: 43 6c 6f 73 65 4d 65 74 68 6f 64 28 28 73 71 6c  CloseMethod((sql
a770: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
a780: 2a 29 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  *)pNew);.  retur
a790: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
a7a0: 76 6f 69 64 20 66 74 73 35 41 70 69 49 6e 76 6f  void fts5ApiInvo
a7b0: 6b 65 28 0a 20 20 46 74 73 35 41 75 78 69 6c 69  ke(.  Fts5Auxili
a7c0: 61 72 79 20 2a 70 41 75 78 2c 0a 20 20 46 74 73  ary *pAux,.  Fts
a7d0: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 0a 20  5Cursor *pCsr,. 
a7e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
a7f0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
a800: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
a810: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
a820: 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
a830: 3e 70 41 75 78 3d 3d 30 20 29 3b 0a 20 20 70 43  >pAux==0 );.  pC
a840: 73 72 2d 3e 70 41 75 78 20 3d 20 70 41 75 78 3b  sr->pAux = pAux;
a850: 0a 20 20 70 41 75 78 2d 3e 78 46 75 6e 63 28 26  .  pAux->xFunc(&
a860: 73 46 74 73 35 41 70 69 2c 20 28 46 74 73 35 43  sFts5Api, (Fts5C
a870: 6f 6e 74 65 78 74 2a 29 70 43 73 72 2c 20 63 6f  ontext*)pCsr, co
a880: 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
a890: 76 29 3b 0a 20 20 70 43 73 72 2d 3e 70 41 75 78  v);.  pCsr->pAux
a8a0: 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 0;.}..static 
a8b0: 76 6f 69 64 20 66 74 73 35 41 70 69 43 61 6c 6c  void fts5ApiCall
a8c0: 62 61 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  back(.  sqlite3_
a8d0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
a8e0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
a8f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
a900: 61 72 67 76 0a 29 7b 0a 0a 20 20 46 74 73 35 41  argv.){..  Fts5A
a910: 75 78 69 6c 69 61 72 79 20 2a 70 41 75 78 3b 0a  uxiliary *pAux;.
a920: 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43    Fts5Cursor *pC
a930: 73 72 3b 0a 20 20 69 36 34 20 69 43 73 72 49 64  sr;.  i64 iCsrId
a940: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
a950: 63 3e 3d 31 20 29 3b 0a 20 20 70 41 75 78 20 3d  c>=1 );.  pAux =
a960: 20 28 46 74 73 35 41 75 78 69 6c 69 61 72 79 2a   (Fts5Auxiliary*
a970: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
a980: 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69  ta(context);.  i
a990: 43 73 72 49 64 20 3d 20 73 71 6c 69 74 65 33 5f  CsrId = sqlite3_
a9a0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
a9b0: 5b 30 5d 29 3b 0a 0a 20 20 66 6f 72 28 70 43 73  [0]);..  for(pCs
a9c0: 72 3d 70 41 75 78 2d 3e 70 47 6c 6f 62 61 6c 2d  r=pAux->pGlobal-
a9d0: 3e 70 43 73 72 3b 20 70 43 73 72 3b 20 70 43 73  >pCsr; pCsr; pCs
a9e0: 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCsr->pNext){.
a9f0: 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69 43      if( pCsr->iC
aa00: 73 72 49 64 3d 3d 69 43 73 72 49 64 20 29 20 62  srId==iCsrId ) b
aa10: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
aa20: 70 43 73 72 3d 3d 30 20 29 7b 0a 20 20 20 20 63  pCsr==0 ){.    c
aa30: 68 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69  har *zErr = sqli
aa40: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
aa50: 73 75 63 68 20 63 75 72 73 6f 72 3a 20 25 6c 6c  such cursor: %ll
aa60: 64 22 2c 20 69 43 73 72 49 64 29 3b 0a 20 20 20  d", iCsrId);.   
aa70: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
aa80: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 7a  error(context, z
aa90: 45 72 72 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  Err, -1);.  }els
aaa0: 65 7b 0a 20 20 20 20 66 74 73 35 41 70 69 49 6e  e{.    fts5ApiIn
aab0: 76 6f 6b 65 28 70 41 75 78 2c 20 70 43 73 72 2c  voke(pAux, pCsr,
aac0: 20 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2d 31   context, argc-1
aad0: 2c 20 26 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d  , &argv[1]);.  }
aae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
aaf0: 20 61 20 22 70 6f 73 69 74 69 6f 6e 2d 6c 69 73   a "position-lis
ab00: 74 20 62 6c 6f 62 22 20 63 6f 72 72 65 73 70 6f  t blob" correspo
ab10: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
ab20: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
ab30: 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43 73 72 20  .** cursor pCsr 
ab40: 76 69 61 20 73 71 6c 69 74 65 33 5f 72 65 73 75  via sqlite3_resu
ab50: 6c 74 5f 62 6c 6f 62 28 29 2e 20 41 20 70 6f 73  lt_blob(). A pos
ab60: 69 74 69 6f 6e 2d 6c 69 73 74 20 62 6c 6f 62 20  ition-list blob 
ab70: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
ab80: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
ab90: 2d 6c 69 73 74 20 66 6f 72 20 65 61 63 68 20 70  -list for each p
aba0: 68 72 61 73 65 20 69 6e 20 74 68 65 20 71 75 65  hrase in the que
abb0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
abc0: 74 68 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43 73  th.** cursor pCs
abd0: 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 73 69 74  r..**.** A posit
abe0: 69 6f 6e 2d 6c 69 73 74 20 62 6c 6f 62 20 62 65  ion-list blob be
abf0: 67 69 6e 73 20 77 69 74 68 20 28 6e 50 68 72 61  gins with (nPhra
ac00: 73 65 2d 31 29 20 76 61 72 69 6e 74 73 2c 20 77  se-1) varints, w
ac10: 68 65 72 65 20 6e 50 68 72 61 73 65 20 69 73 0a  here nPhrase is.
ac20: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
ac30: 20 70 68 72 61 73 65 73 20 69 6e 20 74 68 65 20   phrases in the 
ac40: 71 75 65 72 79 2e 20 46 6f 6c 6c 6f 77 69 6e 67  query. Following
ac50: 20 74 68 65 20 76 61 72 69 6e 74 73 20 61 72 65   the varints are
ac60: 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e   the.** concaten
ac70: 61 74 65 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69  ated position li
ac80: 73 74 73 20 66 6f 72 20 65 61 63 68 20 70 68 72  sts for each phr
ac90: 61 73 65 2c 20 69 6e 20 6f 72 64 65 72 2e 0a 2a  ase, in order..*
aca0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76  *.** The first v
acb0: 61 72 69 6e 74 20 28 69 66 20 69 74 20 65 78 69  arint (if it exi
acc0: 73 74 73 29 20 63 6f 6e 74 61 69 6e 73 20 74 68  sts) contains th
acd0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 6f  e size of the po
ace0: 73 69 74 69 6f 6e 20 6c 69 73 74 0a 2a 2a 20 66  sition list.** f
acf0: 6f 72 20 70 68 72 61 73 65 20 30 2e 20 54 68 65  or phrase 0. The
ad00: 20 73 65 63 6f 6e 64 20 28 73 61 6d 65 20 64 69   second (same di
ad10: 73 63 6c 61 69 6d 65 72 29 20 63 6f 6e 74 61 69  sclaimer) contai
ad20: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 70  ns the size of p
ad30: 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20  osition.** list 
ad40: 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 54 68  1. And so on. Th
ad50: 65 72 65 20 69 73 20 6e 6f 20 73 69 7a 65 20 66  ere is no size f
ad60: 69 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69 6e  ield for the fin
ad70: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  al position list
ad80: 2c 0a 2a 2a 20 61 73 20 69 74 20 63 61 6e 20 62  ,.** as it can b
ad90: 65 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74  e derived from t
ada0: 68 65 20 74 6f 74 61 6c 20 73 69 7a 65 20 6f 66  he total size of
adb0: 20 74 68 65 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74   the blob..*/.st
adc0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73  atic int fts5Pos
add0: 6c 69 73 74 42 6c 6f 62 28 73 71 6c 69 74 65 33  listBlob(sqlite3
ade0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
adf0: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
ae00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
ae10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ae20: 3b 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65 20  ;.  int nPhrase 
ae30: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  = sqlite3Fts5Exp
ae40: 72 50 68 72 61 73 65 43 6f 75 6e 74 28 70 43 73  rPhraseCount(pCs
ae50: 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20 46 74 73  r->pExpr);.  Fts
ae60: 35 42 75 66 66 65 72 20 76 61 6c 3b 0a 0a 20 20  5Buffer val;..  
ae70: 6d 65 6d 73 65 74 28 26 76 61 6c 2c 20 30 2c 20  memset(&val, 0, 
ae80: 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
ae90: 72 29 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  r));..  /* Appen
aea0: 64 20 74 68 65 20 76 61 72 69 6e 74 73 20 2a 2f  d the varints */
aeb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e  .  for(i=0; i<(n
aec0: 50 68 72 61 73 65 2d 31 29 3b 20 69 2b 2b 29 7b  Phrase-1); i++){
aed0: 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 64  .    const u8 *d
aee0: 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74 20 6e 42  ummy;.    int nB
aef0: 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  yte = sqlite3Fts
af00: 35 45 78 70 72 50 6f 73 6c 69 73 74 28 70 43 73  5ExprPoslist(pCs
af10: 72 2d 3e 70 45 78 70 72 2c 20 69 2c 20 26 64 75  r->pExpr, i, &du
af20: 6d 6d 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mmy);.    sqlite
af30: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
af40: 64 56 61 72 69 6e 74 28 26 72 63 2c 20 26 76 61  dVarint(&rc, &va
af50: 6c 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 0a  l, nByte);.  }..
af60: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
af70: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 20 2a  position lists *
af80: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
af90: 50 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20  Phrase; i++){.  
afa0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73    const u8 *pPos
afb0: 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 50  list;.    int nP
afc0: 6f 73 6c 69 73 74 3b 0a 20 20 20 20 6e 50 6f 73  oslist;.    nPos
afd0: 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 46 74  list = sqlite3Ft
afe0: 73 35 45 78 70 72 50 6f 73 6c 69 73 74 28 70 43  s5ExprPoslist(pC
aff0: 73 72 2d 3e 70 45 78 70 72 2c 20 69 2c 20 26 70  sr->pExpr, i, &p
b000: 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  Poslist);.    sq
b010: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
b020: 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26  ppendBlob(&rc, &
b030: 76 61 6c 2c 20 6e 50 6f 73 6c 69 73 74 2c 20 70  val, nPoslist, p
b040: 50 6f 73 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  Poslist);.  }.. 
b050: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b060: 62 6c 6f 62 28 70 43 74 78 2c 20 76 61 6c 2e 70  blob(pCtx, val.p
b070: 2c 20 76 61 6c 2e 6e 2c 20 73 71 6c 69 74 65 33  , val.n, sqlite3
b080: 5f 66 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e  _free);.  return
b090: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
b0a0: 68 69 73 20 69 73 20 74 68 65 20 78 43 6f 6c 75  his is the xColu
b0b0: 6d 6e 20 6d 65 74 68 6f 64 2c 20 63 61 6c 6c 65  mn method, calle
b0c0: 64 20 62 79 20 53 51 4c 69 74 65 20 74 6f 20 72  d by SQLite to r
b0d0: 65 71 75 65 73 74 20 61 20 76 61 6c 75 65 20 66  equest a value f
b0e0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 72 6f 77 20 74  rom.** the row t
b0f0: 68 61 74 20 74 68 65 20 73 75 70 70 6c 69 65 64  hat the supplied
b100: 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
b110: 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a  y points to..*/.
b120: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43  static int fts5C
b130: 6f 6c 75 6d 6e 4d 65 74 68 6f 64 28 0a 20 20 73  olumnMethod(.  s
b140: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
b150: 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 20 20 2f  or *pCursor,   /
b160: 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 74 72  * Cursor to retr
b170: 69 65 76 65 20 76 61 6c 75 65 20 66 72 6f 6d 20  ieve value from 
b180: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  */.  sqlite3_con
b190: 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
b1a0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
b1b0: 66 6f 72 20 73 71 6c 69 74 65 33 5f 72 65 73 75  for sqlite3_resu
b1c0: 6c 74 5f 78 78 78 28 29 20 63 61 6c 6c 73 20 2a  lt_xxx() calls *
b1d0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
b200: 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 61 64 20 76  column to read v
b210: 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a  alue from */.){.
b220: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
b230: 6f 6e 66 69 67 20 3d 20 28 28 46 74 73 35 54 61  onfig = ((Fts5Ta
b240: 62 6c 65 2a 29 28 70 43 75 72 73 6f 72 2d 3e 70  ble*)(pCursor->p
b250: 56 74 61 62 29 29 2d 3e 70 43 6f 6e 66 69 67 3b  Vtab))->pConfig;
b260: 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70  .  Fts5Cursor *p
b270: 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f  Csr = (Fts5Curso
b280: 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e  r*)pCursor;.  in
b290: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b2a0: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 43  ;.  .  assert( C
b2b0: 73 72 46 6c 61 67 54 65 73 74 28 70 43 73 72 2c  srFlagTest(pCsr,
b2c0: 20 46 54 53 35 43 53 52 5f 45 4f 46 29 3d 3d 30   FTS5CSR_EOF)==0
b2d0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d   );..  if( pCsr-
b2e0: 3e 69 64 78 4e 75 6d 3d 3d 46 54 53 35 5f 50 4c  >idxNum==FTS5_PL
b2f0: 41 4e 5f 53 50 45 43 49 41 4c 20 29 7b 0a 20 20  AN_SPECIAL ){.  
b300: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 43 6f 6e    if( iCol==pCon
b310: 66 69 67 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  fig->nCol ){.   
b320: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
b330: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 70 43 73  t_text(pCtx, pCs
b340: 72 2d 3e 7a 53 70 65 63 69 61 6c 2c 20 2d 31 2c  r->zSpecial, -1,
b350: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
b360: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  T);.    }.  }els
b370: 65 0a 0a 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70  e..  if( iCol==p
b380: 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20 29 7b 0a  Config->nCol ){.
b390: 20 20 20 20 2f 2a 20 55 73 65 72 20 69 73 20 72      /* User is r
b3a0: 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 76 61  equesting the va
b3b0: 6c 75 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  lue of the speci
b3c0: 61 6c 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74  al column with t
b3d0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 0a 20 20 20  he same name.   
b3e0: 20 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65   ** as the table
b3f0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  . Return the cur
b400: 73 6f 72 20 69 6e 74 65 67 65 72 20 69 64 20 6e  sor integer id n
b410: 75 6d 62 65 72 2e 20 54 68 69 73 20 76 61 6c 75  umber. This valu
b420: 65 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  e is only.    **
b430: 20 75 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20   useful in that 
b440: 69 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  it may be passed
b450: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
b460: 67 75 6d 65 6e 74 20 74 6f 20 61 6e 20 46 54 53  gument to an FTS
b470: 35 0a 20 20 20 20 2a 2a 20 61 75 78 69 6c 69 61  5.    ** auxilia
b480: 72 79 20 66 75 6e 63 74 69 6f 6e 2e 20 20 2a 2f  ry function.  */
b490: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
b4a0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
b4b0: 70 43 73 72 2d 3e 69 43 73 72 49 64 29 3b 0a 20  pCsr->iCsrId);. 
b4c0: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3d   }else if( iCol=
b4d0: 3d 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 2b 31  =pConfig->nCol+1
b4e0: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   ){..    /* The 
b4f0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 72 61  value of the "ra
b500: 6e 6b 22 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  nk" column. */. 
b510: 20 20 20 69 66 28 20 46 54 53 35 5f 50 4c 41 4e     if( FTS5_PLAN
b520: 28 70 43 73 72 2d 3e 69 64 78 4e 75 6d 29 3d 3d  (pCsr->idxNum)==
b530: 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 55 52 43 45  FTS5_PLAN_SOURCE
b540: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 6f   ){.      fts5Po
b550: 73 6c 69 73 74 42 6c 6f 62 28 70 43 74 78 2c 20  slistBlob(pCtx, 
b560: 70 43 73 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pCsr);.    }else
b570: 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 46 54   if( .        FT
b580: 53 35 5f 50 4c 41 4e 28 70 43 73 72 2d 3e 69 64  S5_PLAN(pCsr->id
b590: 78 4e 75 6d 29 3d 3d 46 54 53 35 5f 50 4c 41 4e  xNum)==FTS5_PLAN
b5a0: 5f 4d 41 54 43 48 0a 20 20 20 20 20 7c 7c 20 46  _MATCH.     || F
b5b0: 54 53 35 5f 50 4c 41 4e 28 70 43 73 72 2d 3e 69  TS5_PLAN(pCsr->i
b5c0: 64 78 4e 75 6d 29 3d 3d 46 54 53 35 5f 50 4c 41  dxNum)==FTS5_PLA
b5d0: 4e 5f 53 4f 52 54 45 44 5f 4d 41 54 43 48 0a 20  N_SORTED_MATCH. 
b5e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
b5f0: 70 43 73 72 2d 3e 70 52 61 6e 6b 20 7c 7c 20 53  pCsr->pRank || S
b600: 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
b610: 66 74 73 35 46 69 6e 64 52 61 6e 6b 46 75 6e 63  fts5FindRankFunc
b620: 74 69 6f 6e 28 70 43 73 72 29 29 20 29 7b 0a 20  tion(pCsr)) ){. 
b630: 20 20 20 20 20 20 20 66 74 73 35 41 70 69 49 6e         fts5ApiIn
b640: 76 6f 6b 65 28 70 43 73 72 2d 3e 70 52 61 6e 6b  voke(pCsr->pRank
b650: 2c 20 70 43 73 72 2c 20 70 43 74 78 2c 20 70 43  , pCsr, pCtx, pC
b660: 73 72 2d 3e 6e 52 61 6e 6b 41 72 67 2c 20 70 43  sr->nRankArg, pC
b670: 73 72 2d 3e 61 70 52 61 6e 6b 41 72 67 29 3b 0a  sr->apRankArg);.
b680: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b690: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
b6a0: 66 74 73 35 53 65 65 6b 43 75 72 73 6f 72 28 70  fts5SeekCursor(p
b6b0: 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Csr);.    if( rc
b6c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
b6e0: 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
b6f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
b700: 61 6c 75 65 28 70 43 73 72 2d 3e 70 53 74 6d 74  alue(pCsr->pStmt
b710: 2c 20 69 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20  , iCol+1));.    
b720: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
b730: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
b740: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
b750: 65 6e 74 73 20 74 68 65 20 78 46 69 6e 64 46 75  ents the xFindFu
b760: 6e 63 74 69 6f 6e 20 6d 65 74 68 6f 64 20 66 6f  nction method fo
b770: 72 20 74 68 65 20 46 54 53 33 0a 2a 2a 20 76 69  r the FTS3.** vi
b780: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
b790: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 46  static int fts5F
b7a0: 69 6e 64 46 75 6e 63 74 69 6f 6e 4d 65 74 68 6f  indFunctionMetho
b7b0: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  d(.  sqlite3_vta
b7c0: 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20 20  b *pVtab,       
b7d0: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
b7e0: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
b7f0: 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
b820: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  QL function argu
b830: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
b840: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
b850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
b860: 6d 65 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  me of SQL functi
b870: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 2a  on */.  void (**
b880: 70 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  pxFunc)(sqlite3_
b890: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
b8a0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 20 2f  ite3_value**), /
b8b0: 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
b8c0: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 41 72 67 20  .  void **ppArg 
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8e0: 20 20 20 2f 2a 20 4f 55 54 3a 20 55 73 65 72 20     /* OUT: User 
b8f0: 64 61 74 61 20 66 6f 72 20 2a 70 78 46 75 6e 63  data for *pxFunc
b900: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 54 61 62   */.){.  Fts5Tab
b910: 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
b920: 54 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20  Table*)pVtab;.  
b930: 46 74 73 35 41 75 78 69 6c 69 61 72 79 20 2a 70  Fts5Auxiliary *p
b940: 41 75 78 3b 0a 0a 20 20 70 41 75 78 20 3d 20 66  Aux;..  pAux = f
b950: 74 73 35 46 69 6e 64 41 75 78 69 6c 69 61 72 79  ts5FindAuxiliary
b960: 28 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  (pTab, zName);. 
b970: 20 69 66 28 20 70 41 75 78 20 29 7b 0a 20 20 20   if( pAux ){.   
b980: 20 2a 70 78 46 75 6e 63 20 3d 20 66 74 73 35 41   *pxFunc = fts5A
b990: 70 69 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  piCallback;.    
b9a0: 2a 70 70 41 72 67 20 3d 20 28 76 6f 69 64 2a 29  *ppArg = (void*)
b9b0: 70 41 75 78 3b 0a 20 20 20 20 72 65 74 75 72 6e  pAux;.    return
b9c0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   1;.  }..  /* No
b9d0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
b9e0: 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d 65 20   specified name 
b9f0: 77 61 73 20 66 6f 75 6e 64 2e 20 52 65 74 75 72  was found. Retur
ba00: 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  n 0. */.  return
ba10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   0;.}../*.** Imp
ba20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 46  lementation of F
ba30: 54 53 33 20 78 52 65 6e 61 6d 65 20 6d 65 74 68  TS3 xRename meth
ba40: 6f 64 2e 20 52 65 6e 61 6d 65 20 61 6e 20 66 74  od. Rename an ft
ba50: 73 35 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  s5 table..*/.sta
ba60: 74 69 63 20 69 6e 74 20 66 74 73 35 52 65 6e 61  tic int fts5Rena
ba70: 6d 65 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69  meMethod(.  sqli
ba80: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c  te3_vtab *pVtab,
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
baa0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
bab0: 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
bac0: 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
bad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
bae0: 6e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f  name of table */
baf0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
bb00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
bb10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bb20: 54 68 65 20 78 53 61 76 65 70 6f 69 6e 74 28 29  The xSavepoint()
bb30: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 46   method..**.** F
bb40: 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
bb50: 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
bb60: 2d 74 65 72 6d 73 20 74 61 62 6c 65 20 74 6f 20  -terms table to 
bb70: 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
bb80: 69 6e 74 20 66 74 73 35 53 61 76 65 70 6f 69 6e  int fts5Savepoin
bb90: 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  tMethod(sqlite3_
bba0: 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74  vtab *pVtab, int
bbb0: 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
bbc0: 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20  Fts5Table *pTab 
bbd0: 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56  = (Fts5Table*)pV
bbe0: 74 61 62 3b 0a 20 20 66 74 73 35 43 68 65 63 6b  tab;.  fts5Check
bbf0: 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65  TransactionState
bc00: 28 70 54 61 62 2c 20 46 54 53 35 5f 53 41 56 45  (pTab, FTS5_SAVE
bc10: 50 4f 49 4e 54 2c 20 69 53 61 76 65 70 6f 69 6e  POINT, iSavepoin
bc20: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  t);.  return sql
bc30: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
bc40: 79 6e 63 28 70 54 61 62 2d 3e 70 53 74 6f 72 61  ync(pTab->pStora
bc50: 67 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge, 0);.}../*.**
bc60: 20 54 68 65 20 78 52 65 6c 65 61 73 65 28 29 20   The xRelease() 
bc70: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  method..**.** Th
bc80: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
bc90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
bca0: 35 52 65 6c 65 61 73 65 4d 65 74 68 6f 64 28 73  5ReleaseMethod(s
bcb0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
bcc0: 61 62 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  ab, int iSavepoi
bcd0: 6e 74 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65  nt){.  Fts5Table
bce0: 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54 61   *pTab = (Fts5Ta
bcf0: 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 66 74  ble*)pVtab;.  ft
bd00: 73 35 43 68 65 63 6b 54 72 61 6e 73 61 63 74 69  s5CheckTransacti
bd10: 6f 6e 53 74 61 74 65 28 70 54 61 62 2c 20 46 54  onState(pTab, FT
bd20: 53 35 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  S5_RELEASE, iSav
bd30: 65 70 6f 69 6e 74 29 3b 0a 20 20 72 65 74 75 72  epoint);.  retur
bd40: 6e 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  n sqlite3Fts5Sto
bd50: 72 61 67 65 53 79 6e 63 28 70 54 61 62 2d 3e 70  rageSync(pTab->p
bd60: 53 74 6f 72 61 67 65 2c 20 30 29 3b 0a 7d 0a 0a  Storage, 0);.}..
bd70: 2f 2a 0a 2a 2a 20 54 68 65 20 78 52 6f 6c 6c 62  /*.** The xRollb
bd80: 61 63 6b 54 6f 28 29 20 6d 65 74 68 6f 64 2e 0a  ackTo() method..
bd90: 2a 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68  **.** Discard th
bda0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
bdb0: 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 20  e pending terms 
bdc0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
bdd0: 20 69 6e 74 20 66 74 73 35 52 6f 6c 6c 62 61 63   int fts5Rollbac
bde0: 6b 54 6f 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  kToMethod(sqlite
bdf0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69  3_vtab *pVtab, i
be00: 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
be10: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
be20: 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
be30: 70 56 74 61 62 3b 0a 20 20 66 74 73 35 43 68 65  pVtab;.  fts5Che
be40: 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61  ckTransactionSta
be50: 74 65 28 70 54 61 62 2c 20 46 54 53 35 5f 52 4f  te(pTab, FTS5_RO
be60: 4c 4c 42 41 43 4b 54 4f 2c 20 69 53 61 76 65 70  LLBACKTO, iSavep
be70: 6f 69 6e 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  oint);.  return 
be80: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
be90: 67 65 52 6f 6c 6c 62 61 63 6b 28 70 54 61 62 2d  geRollback(pTab-
bea0: 3e 70 53 74 6f 72 61 67 65 29 3b 0a 7d 0a 0a 2f  >pStorage);.}../
beb0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
bec0: 6e 65 77 20 61 75 78 69 6c 69 61 72 79 20 66 75  new auxiliary fu
bed0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 67 6c 6f 62  nction with glob
bee0: 61 6c 20 63 6f 6e 74 65 78 74 20 70 47 6c 6f 62  al context pGlob
bef0: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
bf00: 74 20 66 74 73 35 43 72 65 61 74 65 41 75 78 28  t fts5CreateAux(
bf10: 0a 20 20 66 74 73 35 5f 61 70 69 20 2a 70 41 70  .  fts5_api *pAp
bf20: 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i,              
bf30: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 63 6f 6e     /* Global con
bf40: 74 65 78 74 20 28 6f 6e 65 20 70 65 72 20 64 62  text (one per db
bf50: 20 68 61 6e 64 6c 65 29 20 2a 2f 0a 20 20 63 6f   handle) */.  co
bf60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bf80: 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20 66 75 6e   Name of new fun
bf90: 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
bfa0: 2a 70 55 73 65 72 44 61 74 61 2c 20 20 20 20 20  *pUserData,     
bfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
bfc0: 65 72 20 64 61 74 61 20 66 6f 72 20 61 75 78 2e  er data for aux.
bfd0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 66   function */.  f
bfe0: 74 73 35 5f 65 78 74 65 6e 73 69 6f 6e 5f 66 75  ts5_extension_fu
bff0: 6e 63 74 69 6f 6e 20 78 46 75 6e 63 2c 20 20 2f  nction xFunc,  /
c000: 2a 20 41 75 78 2e 20 66 75 6e 63 74 69 6f 6e 20  * Aux. function 
c010: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
c020: 2f 0a 20 20 76 6f 69 64 28 2a 78 44 65 73 74 72  /.  void(*xDestr
c030: 6f 79 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  oy)(void*)      
c040: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
c050: 72 20 66 6f 72 20 70 55 73 65 72 44 61 74 61 20  r for pUserData 
c060: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 47 6c 6f 62  */.){.  Fts5Glob
c070: 61 6c 20 2a 70 47 6c 6f 62 61 6c 20 3d 20 28 46  al *pGlobal = (F
c080: 74 73 35 47 6c 6f 62 61 6c 2a 29 70 41 70 69 3b  ts5Global*)pApi;
c090: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
c0a0: 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
c0b0: 63 74 69 6f 6e 28 70 47 6c 6f 62 61 6c 2d 3e 64  ction(pGlobal->d
c0c0: 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  b, zName, -1);. 
c0d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c0e0: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 41 75  OK ){.    Fts5Au
c0f0: 78 69 6c 69 61 72 79 20 2a 70 41 75 78 3b 0a 20  xiliary *pAux;. 
c100: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c120: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
c130: 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
c140: 20 2a 2f 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d   */..    nByte =
c150: 20 73 69 7a 65 6f 66 28 46 74 73 35 41 75 78 69   sizeof(Fts5Auxi
c160: 6c 69 61 72 79 29 20 2b 20 73 74 72 6c 65 6e 28  liary) + strlen(
c170: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
c180: 70 41 75 78 20 3d 20 28 46 74 73 35 41 75 78 69  pAux = (Fts5Auxi
c190: 6c 69 61 72 79 2a 29 73 71 6c 69 74 65 33 5f 6d  liary*)sqlite3_m
c1a0: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
c1b0: 20 20 69 66 28 20 70 41 75 78 20 29 7b 0a 20 20    if( pAux ){.  
c1c0: 20 20 20 20 6d 65 6d 73 65 74 28 70 41 75 78 2c      memset(pAux,
c1d0: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
c1e0: 20 20 70 41 75 78 2d 3e 7a 46 75 6e 63 20 3d 20    pAux->zFunc = 
c1f0: 28 63 68 61 72 2a 29 26 70 41 75 78 5b 31 5d 3b  (char*)&pAux[1];
c200: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 70 41  .      strcpy(pA
c210: 75 78 2d 3e 7a 46 75 6e 63 2c 20 7a 4e 61 6d 65  ux->zFunc, zName
c220: 29 3b 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70  );.      pAux->p
c230: 47 6c 6f 62 61 6c 20 3d 20 70 47 6c 6f 62 61 6c  Global = pGlobal
c240: 3b 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 55  ;.      pAux->pU
c250: 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44  serData = pUserD
c260: 61 74 61 3b 0a 20 20 20 20 20 20 70 41 75 78 2d  ata;.      pAux-
c270: 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a  >xFunc = xFunc;.
c280: 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 73        pAux->xDes
c290: 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b  troy = xDestroy;
c2a0: 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 4e 65  .      pAux->pNe
c2b0: 78 74 20 3d 20 70 47 6c 6f 62 61 6c 2d 3e 70 41  xt = pGlobal->pA
c2c0: 75 78 3b 0a 20 20 20 20 20 20 70 47 6c 6f 62 61  ux;.      pGloba
c2d0: 6c 2d 3e 70 41 75 78 20 3d 20 70 41 75 78 3b 0a  l->pAux = pAux;.
c2e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c2f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
c300: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  EM;.    }.  }.. 
c310: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c320: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
c330: 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 54  new tokenizer. T
c340: 68 69 73 20 69 73 20 74 68 65 20 69 6d 70 6c 65  his is the imple
c350: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
c360: 20 0a 2a 2a 20 66 74 73 35 5f 61 70 69 2e 78 43   .** fts5_api.xC
c370: 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 28 29  reateTokenizer()
c380: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
c390: 69 63 20 69 6e 74 20 66 74 73 35 43 72 65 61 74  ic int fts5Creat
c3a0: 65 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 66 74  eTokenizer(.  ft
c3b0: 73 35 5f 61 70 69 20 2a 70 41 70 69 2c 20 20 20  s5_api *pApi,   
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3d0: 20 47 6c 6f 62 61 6c 20 63 6f 6e 74 65 78 74 20   Global context 
c3e0: 28 6f 6e 65 20 70 65 72 20 64 62 20 68 61 6e 64  (one per db hand
c3f0: 6c 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  le) */.  const c
c400: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
c410: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
c420: 20 6f 66 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e   of new function
c430: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 55 73 65   */.  void *pUse
c440: 72 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  rData,          
c450: 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61        /* User da
c460: 74 61 20 66 6f 72 20 61 75 78 2e 20 66 75 6e 63  ta for aux. func
c470: 74 69 6f 6e 20 2a 2f 0a 20 20 66 74 73 35 5f 74  tion */.  fts5_t
c480: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e  okenizer *pToken
c490: 69 7a 65 72 2c 20 20 20 20 20 2f 2a 20 54 6f 6b  izer,     /* Tok
c4a0: 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74  enizer implement
c4b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 28  ation */.  void(
c4c0: 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a  *xDestroy)(void*
c4d0: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  )          /* De
c4e0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 70 55 73  structor for pUs
c4f0: 65 72 44 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 46  erData */.){.  F
c500: 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62  ts5Global *pGlob
c510: 61 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61 6c  al = (Fts5Global
c520: 2a 29 70 41 70 69 3b 0a 20 20 46 74 73 35 54 6f  *)pApi;.  Fts5To
c530: 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70  kenizerModule *p
c540: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  New;.  int nByte
c550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c560: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
c570: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
c580: 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  cate */.  int rc
c590: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
c5a0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
c5b0: 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64  Fts5TokenizerMod
c5c0: 75 6c 65 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e  ule) + strlen(zN
c5d0: 61 6d 65 29 20 2b 20 31 3b 0a 20 20 70 4e 65 77  ame) + 1;.  pNew
c5e0: 20 3d 20 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65   = (Fts5Tokenize
c5f0: 72 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33  rModule*)sqlite3
c600: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
c610: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
c620: 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
c630: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 4e  , nByte);.    pN
c640: 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ew->zName = (cha
c650: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
c660: 20 73 74 72 63 70 79 28 70 4e 65 77 2d 3e 7a 4e   strcpy(pNew->zN
c670: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
c680: 20 70 4e 65 77 2d 3e 70 55 73 65 72 44 61 74 61   pNew->pUserData
c690: 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20   = pUserData;.  
c6a0: 20 20 70 4e 65 77 2d 3e 78 20 3d 20 2a 70 54 6f    pNew->x = *pTo
c6b0: 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20 70 4e 65  kenizer;.    pNe
c6c0: 77 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44  w->xDestroy = xD
c6d0: 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 4e 65 77  estroy;.    pNew
c6e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 47 6c 6f 62 61  ->pNext = pGloba
c6f0: 6c 2d 3e 70 54 6f 6b 3b 0a 20 20 20 20 70 47 6c  l->pTok;.    pGl
c700: 6f 62 61 6c 2d 3e 70 54 6f 6b 20 3d 20 70 4e 65  obal->pTok = pNe
c710: 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  w;.  }else{.    
c720: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c730: 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  M;.  }..  return
c740: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
c750: 6e 64 20 61 20 74 6f 6b 65 6e 69 7a 65 72 2e 20  nd a tokenizer. 
c760: 54 68 69 73 20 69 73 20 74 68 65 20 69 6d 70 6c  This is the impl
c770: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
c780: 65 20 0a 2a 2a 20 66 74 73 35 5f 61 70 69 2e 78  e .** fts5_api.x
c790: 46 69 6e 64 54 6f 6b 65 6e 69 7a 65 72 28 29 20  FindTokenizer() 
c7a0: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
c7b0: 63 20 69 6e 74 20 66 74 73 35 46 69 6e 64 54 6f  c int fts5FindTo
c7c0: 6b 65 6e 69 7a 65 72 28 0a 20 20 66 74 73 35 5f  kenizer(.  fts5_
c7d0: 61 70 69 20 2a 70 41 70 69 2c 20 20 20 20 20 20  api *pApi,      
c7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c             /* Gl
c7f0: 6f 62 61 6c 20 63 6f 6e 74 65 78 74 20 28 6f 6e  obal context (on
c800: 65 20 70 65 72 20 64 62 20 68 61 6e 64 6c 65 29  e per db handle)
c810: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
c820: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
c830: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
c840: 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   new function */
c850: 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  .  fts5_tokenize
c860: 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 20 20  r *pTokenizer   
c870: 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
c880: 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
c890: 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  .  Fts5Global *p
c8a0: 47 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35 47 6c  Global = (Fts5Gl
c8b0: 6f 62 61 6c 2a 29 70 41 70 69 3b 0a 20 20 69 6e  obal*)pApi;.  in
c8c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c8d0: 3b 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ;.  Fts5Tokenize
c8e0: 72 4d 6f 64 75 6c 65 20 2a 70 54 6f 6b 3b 0a 0a  rModule *pTok;..
c8f0: 20 20 66 6f 72 28 70 54 6f 6b 3d 70 47 6c 6f 62    for(pTok=pGlob
c900: 61 6c 2d 3e 70 54 6f 6b 3b 20 70 54 6f 6b 3b 20  al->pTok; pTok; 
c910: 70 54 6f 6b 3d 70 54 6f 6b 2d 3e 70 4e 65 78 74  pTok=pTok->pNext
c920: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
c930: 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65  e3_stricmp(zName
c940: 2c 20 70 54 6f 6b 2d 3e 7a 4e 61 6d 65 29 3d 3d  , pTok->zName)==
c950: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a  0 ) break;.  }..
c960: 20 20 69 66 28 20 70 54 6f 6b 20 29 7b 0a 20 20    if( pTok ){.  
c970: 20 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20    *pTokenizer = 
c980: 70 54 6f 6b 2d 3e 78 3b 0a 20 20 7d 65 6c 73 65  pTok->x;.  }else
c990: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6f  {.    memset(pTo
c9a0: 6b 65 6e 69 7a 65 72 2c 20 30 2c 20 73 69 7a 65  kenizer, 0, size
c9b0: 6f 66 28 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  of(fts5_tokenize
c9c0: 72 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r));.    rc = SQ
c9d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
c9e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c9f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
ca00: 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20  GetTokenizer(.  
ca10: 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f  Fts5Global *pGlo
ca20: 62 61 6c 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  bal, .  const ch
ca30: 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69 6e  ar **azArg,.  in
ca40: 74 20 6e 41 72 67 2c 0a 20 20 46 74 73 35 54 6f  t nArg,.  Fts5To
ca50: 6b 65 6e 69 7a 65 72 20 2a 2a 70 70 54 6f 6b 2c  kenizer **ppTok,
ca60: 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  .  fts5_tokenize
ca70: 72 20 2a 2a 70 70 54 6f 6b 41 70 69 0a 29 7b 0a  r **ppTokApi.){.
ca80: 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 4d    Fts5TokenizerM
ca90: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 30 3b  odule *pMod = 0;
caa0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cab0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 6e 41 72  TE_OK;.  if( nAr
cac0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4d 6f 64  g==0 ){.    pMod
cad0: 20 3d 20 70 47 6c 6f 62 61 6c 2d 3e 70 54 6f 6b   = pGlobal->pTok
cae0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
caf0: 6f 72 28 70 4d 6f 64 3d 70 47 6c 6f 62 61 6c 2d  or(pMod=pGlobal-
cb00: 3e 70 54 6f 6b 3b 20 70 4d 6f 64 3b 20 70 4d 6f  >pTok; pMod; pMo
cb10: 64 3d 70 4d 6f 64 2d 3e 70 4e 65 78 74 29 7b 0a  d=pMod->pNext){.
cb20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
cb30: 33 5f 73 74 72 69 63 6d 70 28 61 7a 41 72 67 5b  3_stricmp(azArg[
cb40: 30 5d 2c 20 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 29  0], pMod->zName)
cb50: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
cb60: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d   }.  }..  if( pM
cb70: 6f 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  od==0 ){.    rc 
cb80: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
cb90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
cba0: 3d 20 70 4d 6f 64 2d 3e 78 2e 78 43 72 65 61 74  = pMod->x.xCreat
cbb0: 65 28 70 4d 6f 64 2d 3e 70 55 73 65 72 44 61 74  e(pMod->pUserDat
cbc0: 61 2c 20 26 61 7a 41 72 67 5b 31 5d 2c 20 28 6e  a, &azArg[1], (n
cbd0: 41 72 67 3f 6e 41 72 67 2d 31 3a 30 29 2c 20 70  Arg?nArg-1:0), p
cbe0: 70 54 6f 6b 29 3b 0a 20 20 20 20 2a 70 70 54 6f  pTok);.    *ppTo
cbf0: 6b 41 70 69 20 3d 20 26 70 4d 6f 64 2d 3e 78 3b  kApi = &pMod->x;
cc00: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
cc10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cc20: 20 2a 70 70 54 6f 6b 41 70 69 20 3d 20 30 3b 0a   *ppTokApi = 0;.
cc30: 20 20 20 20 2a 70 70 54 6f 6b 20 3d 20 30 3b 0a      *ppTok = 0;.
cc40: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
cc50: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
cc60: 20 66 74 73 35 4d 6f 64 75 6c 65 44 65 73 74 72   fts5ModuleDestr
cc70: 6f 79 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a  oy(void *pCtx){.
cc80: 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 4d    Fts5TokenizerM
cc90: 6f 64 75 6c 65 20 2a 70 54 6f 6b 2c 20 2a 70 4e  odule *pTok, *pN
cca0: 65 78 74 54 6f 6b 3b 0a 20 20 46 74 73 35 41 75  extTok;.  Fts5Au
ccb0: 78 69 6c 69 61 72 79 20 2a 70 41 75 78 2c 20 2a  xiliary *pAux, *
ccc0: 70 4e 65 78 74 41 75 78 3b 0a 20 20 46 74 73 35  pNextAux;.  Fts5
ccd0: 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 20  Global *pGlobal 
cce0: 3d 20 28 46 74 73 35 47 6c 6f 62 61 6c 2a 29 70  = (Fts5Global*)p
ccf0: 43 74 78 3b 0a 0a 20 20 66 6f 72 28 70 41 75 78  Ctx;..  for(pAux
cd00: 3d 70 47 6c 6f 62 61 6c 2d 3e 70 41 75 78 3b 20  =pGlobal->pAux; 
cd10: 70 41 75 78 3b 20 70 41 75 78 3d 70 4e 65 78 74  pAux; pAux=pNext
cd20: 41 75 78 29 7b 0a 20 20 20 20 70 4e 65 78 74 41  Aux){.    pNextA
cd30: 75 78 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74  ux = pAux->pNext
cd40: 3b 0a 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e  ;.    if( pAux->
cd50: 78 44 65 73 74 72 6f 79 20 29 20 70 41 75 78 2d  xDestroy ) pAux-
cd60: 3e 78 44 65 73 74 72 6f 79 28 70 41 75 78 2d 3e  >xDestroy(pAux->
cd70: 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20  pUserData);.    
cd80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 75  sqlite3_free(pAu
cd90: 78 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70  x);.  }..  for(p
cda0: 54 6f 6b 3d 70 47 6c 6f 62 61 6c 2d 3e 70 54 6f  Tok=pGlobal->pTo
cdb0: 6b 3b 20 70 54 6f 6b 3b 20 70 54 6f 6b 3d 70 4e  k; pTok; pTok=pN
cdc0: 65 78 74 54 6f 6b 29 7b 0a 20 20 20 20 70 4e 65  extTok){.    pNe
cdd0: 78 74 54 6f 6b 20 3d 20 70 54 6f 6b 2d 3e 70 4e  xtTok = pTok->pN
cde0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  ext;.    if( pTo
cdf0: 6b 2d 3e 78 44 65 73 74 72 6f 79 20 29 20 70 54  k->xDestroy ) pT
ce00: 6f 6b 2d 3e 78 44 65 73 74 72 6f 79 28 70 54 6f  ok->xDestroy(pTo
ce10: 6b 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  k->pUserData);. 
ce20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ce30: 70 54 6f 6b 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  pTok);.  }..  sq
ce40: 6c 69 74 65 33 5f 66 72 65 65 28 70 47 6c 6f 62  lite3_free(pGlob
ce50: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  al);.}..static v
ce60: 6f 69 64 20 66 74 73 35 46 74 73 35 46 75 6e 63  oid fts5Fts5Func
ce70: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
ce80: 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
ce90: 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
cea0: 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
ceb0: 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
cee0: 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rgs */.  sqlite3
cef0: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
cf00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
cf10: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
cf20: 2f 0a 29 7b 0a 20 20 46 74 73 35 47 6c 6f 62 61  /.){.  Fts5Globa
cf30: 6c 20 2a 70 47 6c 6f 62 61 6c 20 3d 20 28 46 74  l *pGlobal = (Ft
cf40: 73 35 47 6c 6f 62 61 6c 2a 29 73 71 6c 69 74 65  s5Global*)sqlite
cf50: 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
cf60: 29 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 38 5d  );.  char buf[8]
cf70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
cf80: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
cf90: 20 73 69 7a 65 6f 66 28 62 75 66 29 3e 3d 73 69   sizeof(buf)>=si
cfa0: 7a 65 6f 66 28 70 47 6c 6f 62 61 6c 29 20 29 3b  zeof(pGlobal) );
cfb0: 0a 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 28  .  memcpy(buf, (
cfc0: 76 6f 69 64 2a 29 26 70 47 6c 6f 62 61 6c 2c 20  void*)&pGlobal, 
cfd0: 73 69 7a 65 6f 66 28 70 47 6c 6f 62 61 6c 29 29  sizeof(pGlobal))
cfe0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
cff0: 6c 74 5f 62 6c 6f 62 28 70 43 74 78 2c 20 62 75  lt_blob(pCtx, bu
d000: 66 2c 20 73 69 7a 65 6f 66 28 70 47 6c 6f 62 61  f, sizeof(pGloba
d010: 6c 29 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  l), SQLITE_TRANS
d020: 49 45 4e 54 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  IENT);.}..int sq
d030: 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28 73 71  lite3Fts5Init(sq
d040: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74  lite3 *db){.  st
d050: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
d060: 65 33 5f 6d 6f 64 75 6c 65 20 66 74 73 35 4d 6f  e3_module fts5Mo
d070: 64 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 69 56 65  d = {.    /* iVe
d080: 72 73 69 6f 6e 20 20 20 20 20 20 2a 2f 20 32 2c  rsion      */ 2,
d090: 0a 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20  .    /* xCreate 
d0a0: 20 20 20 20 20 20 2a 2f 20 66 74 73 35 43 72 65        */ fts5Cre
d0b0: 61 74 65 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f  ateMethod,.    /
d0c0: 2a 20 78 43 6f 6e 6e 65 63 74 20 20 20 20 20 20  * xConnect      
d0d0: 2a 2f 20 66 74 73 35 43 6f 6e 6e 65 63 74 4d 65  */ fts5ConnectMe
d0e0: 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 42 65  thod,.    /* xBe
d0f0: 73 74 49 6e 64 65 78 20 20 20 20 2a 2f 20 66 74  stIndex    */ ft
d100: 73 35 42 65 73 74 49 6e 64 65 78 4d 65 74 68 6f  s5BestIndexMetho
d110: 64 2c 0a 20 20 20 20 2f 2a 20 78 44 69 73 63 6f  d,.    /* xDisco
d120: 6e 6e 65 63 74 20 20 20 2a 2f 20 66 74 73 35 44  nnect   */ fts5D
d130: 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c  isconnectMethod,
d140: 0a 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79  .    /* xDestroy
d150: 20 20 20 20 20 20 2a 2f 20 66 74 73 35 44 65 73        */ fts5Des
d160: 74 72 6f 79 4d 65 74 68 6f 64 2c 0a 20 20 20 20  troyMethod,.    
d170: 2f 2a 20 78 4f 70 65 6e 20 20 20 20 20 20 20 20  /* xOpen        
d180: 20 2a 2f 20 66 74 73 35 4f 70 65 6e 4d 65 74 68   */ fts5OpenMeth
d190: 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 43 6c 6f 73  od,.    /* xClos
d1a0: 65 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35  e        */ fts5
d1b0: 43 6c 6f 73 65 4d 65 74 68 6f 64 2c 0a 20 20 20  CloseMethod,.   
d1c0: 20 2f 2a 20 78 46 69 6c 74 65 72 20 20 20 20 20   /* xFilter     
d1d0: 20 20 2a 2f 20 66 74 73 35 46 69 6c 74 65 72 4d    */ fts5FilterM
d1e0: 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 4e  ethod,.    /* xN
d1f0: 65 78 74 20 20 20 20 20 20 20 20 20 2a 2f 20 66  ext         */ f
d200: 74 73 35 4e 65 78 74 4d 65 74 68 6f 64 2c 0a 20  ts5NextMethod,. 
d210: 20 20 20 2f 2a 20 78 45 6f 66 20 20 20 20 20 20     /* xEof      
d220: 20 20 20 20 2a 2f 20 66 74 73 35 45 6f 66 4d 65      */ fts5EofMe
d230: 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 43 6f  thod,.    /* xCo
d240: 6c 75 6d 6e 20 20 20 20 20 20 20 2a 2f 20 66 74  lumn       */ ft
d250: 73 35 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 2c 0a  s5ColumnMethod,.
d260: 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 20 20      /* xRowid   
d270: 20 20 20 20 20 2a 2f 20 66 74 73 35 52 6f 77 69       */ fts5Rowi
d280: 64 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20  dMethod,.    /* 
d290: 78 55 70 64 61 74 65 20 20 20 20 20 20 20 2a 2f  xUpdate       */
d2a0: 20 66 74 73 35 55 70 64 61 74 65 4d 65 74 68 6f   fts5UpdateMetho
d2b0: 64 2c 0a 20 20 20 20 2f 2a 20 78 42 65 67 69 6e  d,.    /* xBegin
d2c0: 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35 42          */ fts5B
d2d0: 65 67 69 6e 4d 65 74 68 6f 64 2c 0a 20 20 20 20  eginMethod,.    
d2e0: 2f 2a 20 78 53 79 6e 63 20 20 20 20 20 20 20 20  /* xSync        
d2f0: 20 2a 2f 20 66 74 73 35 53 79 6e 63 4d 65 74 68   */ fts5SyncMeth
d300: 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 43 6f 6d 6d  od,.    /* xComm
d310: 69 74 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35  it       */ fts5
d320: 43 6f 6d 6d 69 74 4d 65 74 68 6f 64 2c 0a 20 20  CommitMethod,.  
d330: 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 20    /* xRollback  
d340: 20 20 20 2a 2f 20 66 74 73 35 52 6f 6c 6c 62 61     */ fts5Rollba
d350: 63 6b 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a  ckMethod,.    /*
d360: 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 2a   xFindFunction *
d370: 2f 20 66 74 73 35 46 69 6e 64 46 75 6e 63 74 69  / fts5FindFuncti
d380: 6f 6e 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a  onMethod,.    /*
d390: 20 78 52 65 6e 61 6d 65 20 20 20 20 20 20 20 2a   xRename       *
d3a0: 2f 20 66 74 73 35 52 65 6e 61 6d 65 4d 65 74 68  / fts5RenameMeth
d3b0: 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 53 61 76 65  od,.    /* xSave
d3c0: 70 6f 69 6e 74 20 20 20 20 2a 2f 20 66 74 73 35  point    */ fts5
d3d0: 53 61 76 65 70 6f 69 6e 74 4d 65 74 68 6f 64 2c  SavepointMethod,
d3e0: 0a 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65  .    /* xRelease
d3f0: 20 20 20 20 20 20 2a 2f 20 66 74 73 35 52 65 6c        */ fts5Rel
d400: 65 61 73 65 4d 65 74 68 6f 64 2c 0a 20 20 20 20  easeMethod,.    
d410: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 20  /* xRollbackTo  
d420: 20 2a 2f 20 66 74 73 35 52 6f 6c 6c 62 61 63 6b   */ fts5Rollback
d430: 54 6f 4d 65 74 68 6f 64 2c 0a 20 20 7d 3b 0a 0a  ToMethod,.  };..
d440: 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 74 73 35    int rc;.  Fts5
d450: 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 20  Global *pGlobal 
d460: 3d 20 30 3b 0a 20 20 70 47 6c 6f 62 61 6c 20 3d  = 0;.  pGlobal =
d470: 20 28 46 74 73 35 47 6c 6f 62 61 6c 2a 29 73 71   (Fts5Global*)sq
d480: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
d490: 65 6f 66 28 46 74 73 35 47 6c 6f 62 61 6c 29 29  eof(Fts5Global))
d4a0: 3b 0a 0a 20 20 69 66 28 20 70 47 6c 6f 62 61 6c  ;..  if( pGlobal
d4b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
d4c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d4d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 76 6f 69 64 20  }else{.    void 
d4e0: 2a 70 20 3d 20 28 76 6f 69 64 2a 29 70 47 6c 6f  *p = (void*)pGlo
d4f0: 62 61 6c 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  bal;.    memset(
d500: 70 47 6c 6f 62 61 6c 2c 20 30 2c 20 73 69 7a 65  pGlobal, 0, size
d510: 6f 66 28 46 74 73 35 47 6c 6f 62 61 6c 29 29 3b  of(Fts5Global));
d520: 0a 20 20 20 20 70 47 6c 6f 62 61 6c 2d 3e 64 62  .    pGlobal->db
d530: 20 3d 20 64 62 3b 0a 20 20 20 20 70 47 6c 6f 62   = db;.    pGlob
d540: 61 6c 2d 3e 61 70 69 2e 69 56 65 72 73 69 6f 6e  al->api.iVersion
d550: 20 3d 20 31 3b 0a 20 20 20 20 70 47 6c 6f 62 61   = 1;.    pGloba
d560: 6c 2d 3e 61 70 69 2e 78 43 72 65 61 74 65 46 75  l->api.xCreateFu
d570: 6e 63 74 69 6f 6e 20 3d 20 66 74 73 35 43 72 65  nction = fts5Cre
d580: 61 74 65 41 75 78 3b 0a 20 20 20 20 70 47 6c 6f  ateAux;.    pGlo
d590: 62 61 6c 2d 3e 61 70 69 2e 78 43 72 65 61 74 65  bal->api.xCreate
d5a0: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 66 74 73 35  Tokenizer = fts5
d5b0: 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 3b  CreateTokenizer;
d5c0: 0a 20 20 20 20 70 47 6c 6f 62 61 6c 2d 3e 61 70  .    pGlobal->ap
d5d0: 69 2e 78 46 69 6e 64 54 6f 6b 65 6e 69 7a 65 72  i.xFindTokenizer
d5e0: 20 3d 20 66 74 73 35 46 69 6e 64 54 6f 6b 65 6e   = fts5FindToken
d5f0: 69 7a 65 72 3b 0a 20 20 20 20 72 63 20 3d 20 73  izer;.    rc = s
d600: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f  qlite3_create_mo
d610: 64 75 6c 65 5f 76 32 28 64 62 2c 20 22 66 74 73  dule_v2(db, "fts
d620: 35 22 2c 20 26 66 74 73 35 4d 6f 64 2c 20 70 2c  5", &fts5Mod, p,
d630: 20 66 74 73 35 4d 6f 64 75 6c 65 44 65 73 74 72   fts5ModuleDestr
d640: 6f 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  oy);.    if( rc=
d650: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
d660: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
d670: 65 78 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20  exInit(db);.    
d680: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d690: 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33  K ) rc = sqlite3
d6a0: 46 74 73 35 45 78 70 72 49 6e 69 74 28 70 47 6c  Fts5ExprInit(pGl
d6b0: 6f 62 61 6c 2c 20 64 62 29 3b 0a 20 20 20 20 69  obal, db);.    i
d6c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d6d0: 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46   ) rc = sqlite3F
d6e0: 74 73 35 41 75 78 49 6e 69 74 28 26 70 47 6c 6f  ts5AuxInit(&pGlo
d6f0: 62 61 6c 2d 3e 61 70 69 29 3b 0a 20 20 20 20 69  bal->api);.    i
d700: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d710: 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46   ) rc = sqlite3F
d720: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e 69 74  ts5TokenizerInit
d730: 28 26 70 47 6c 6f 62 61 6c 2d 3e 61 70 69 29 3b  (&pGlobal->api);
d740: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d750: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d760: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
d770: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
d780: 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73          db, "fts
d790: 35 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54  5", 0, SQLITE_UT
d7a0: 46 38 2c 20 70 2c 20 66 74 73 35 46 74 73 35 46  F8, p, fts5Fts5F
d7b0: 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 20 20  unc, 0, 0.      
d7c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
d7d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a        eturn rc;.}...