/ Hex Artifact Content
Login

Artifact 24868f88ab2a865defbba7a92eebeb726cc991eb092b71b5f5508f180c72605b:


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 2f  e "fts5Int.h"../
01d0: 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62  *.** This variab
01e0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 66 61 6c  le is set to fal
01f0: 73 65 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  se when running 
0200: 74 65 73 74 73 20 66 6f 72 20 77 68 69 63 68 20  tests for which 
0210: 74 68 65 20 6f 6e 20 64 69 73 6b 0a 2a 2a 20 73  the on disk.** s
0220: 74 72 75 63 74 75 72 65 73 20 73 68 6f 75 6c 64  tructures should
0230: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 2e   not be corrupt.
0240: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 72 75 65   Otherwise, true
0250: 2e 20 49 66 20 69 74 20 69 73 20 66 61 6c 73 65  . If it is false
0260: 2c 20 65 78 74 72 61 0a 2a 2a 20 61 73 73 65 72  , extra.** asser
0270: 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69  t() conditions i
0280: 6e 20 74 68 65 20 66 74 73 35 20 63 6f 64 65 20  n the fts5 code 
0290: 61 72 65 20 61 63 74 69 76 61 74 65 64 20 2d 20  are activated - 
02a0: 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
02b0: 61 72 65 0a 2a 2a 20 6f 6e 6c 79 20 74 72 75 65  are.** only true
02c0: 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
02d0: 74 65 65 64 20 74 68 61 74 20 74 68 65 20 66 74  teed that the ft
02e0: 73 35 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  s5 database is n
02f0: 6f 74 20 63 6f 72 72 75 70 74 2e 0a 2a 2f 0a 69  ot corrupt..*/.i
0300: 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  nt sqlite3_fts5_
0310: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 20 3d  may_be_corrupt =
0320: 20 31 3b 0a 0a 0a 74 79 70 65 64 65 66 20 73 74   1;...typedef st
0330: 72 75 63 74 20 46 74 73 35 41 75 78 64 61 74 61  ruct Fts5Auxdata
0340: 20 46 74 73 35 41 75 78 64 61 74 61 3b 0a 74 79   Fts5Auxdata;.ty
0350: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
0360: 35 41 75 78 69 6c 69 61 72 79 20 46 74 73 35 41  5Auxiliary Fts5A
0370: 75 78 69 6c 69 61 72 79 3b 0a 74 79 70 65 64 65  uxiliary;.typede
0380: 66 20 73 74 72 75 63 74 20 46 74 73 35 43 75 72  f struct Fts5Cur
0390: 73 6f 72 20 46 74 73 35 43 75 72 73 6f 72 3b 0a  sor Fts5Cursor;.
03a0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
03b0: 74 73 35 53 6f 72 74 65 72 20 46 74 73 35 53 6f  ts5Sorter Fts5So
03c0: 72 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  rter;.typedef st
03d0: 72 75 63 74 20 46 74 73 35 54 61 62 6c 65 20 46  ruct Fts5Table F
03e0: 74 73 35 54 61 62 6c 65 3b 0a 74 79 70 65 64 65  ts5Table;.typede
03f0: 66 20 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b  f struct Fts5Tok
0400: 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 46 74 73  enizerModule Fts
0410: 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65  5TokenizerModule
0420: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 53 20 4f  ;../*.** NOTES O
0430: 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 53 3a 20  N TRANSACTIONS: 
0440: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 69 6e  .**.** SQLite in
0450: 76 6f 6b 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  vokes the follow
0460: 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ing virtual tabl
0470: 65 20 6d 65 74 68 6f 64 73 20 61 73 20 74 72 61  e methods as tra
0480: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
0490: 2a 20 6f 70 65 6e 65 64 20 61 6e 64 20 63 6c 6f  * opened and clo
04a0: 73 65 64 20 62 79 20 74 68 65 20 75 73 65 72 3a  sed by the user:
04b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 42 65 67 69  .**.**     xBegi
04c0: 6e 28 29 3a 20 20 20 20 53 74 61 72 74 20 6f 66  n():    Start of
04d0: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
04e0: 6f 6e 2e 0a 2a 2a 20 20 20 20 20 78 53 79 6e 63  on..**     xSync
04f0: 28 29 3a 20 20 20 20 20 49 6e 69 74 69 61 6c 20  ():     Initial 
0500: 70 61 72 74 20 6f 66 20 74 77 6f 2d 70 68 61 73  part of two-phas
0510: 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 20 20 20  e commit..**    
0520: 20 78 43 6f 6d 6d 69 74 28 29 3a 20 20 20 46 69   xCommit():   Fi
0530: 6e 61 6c 20 70 61 72 74 20 6f 66 20 74 77 6f 2d  nal part of two-
0540: 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a  phase commit..**
0550: 20 20 20 20 20 78 52 6f 6c 6c 62 61 63 6b 28 29       xRollback()
0560: 3a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  : Rollback the t
0570: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
0580: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
0590: 69 73 20 72 65 71 75 69 72 65 64 20 61 73 20 70  is required as p
05a0: 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 69 74 20  art of a commit 
05b0: 74 68 61 74 20 6d 61 79 20 66 61 69 6c 20 69 73  that may fail is
05c0: 20 70 65 72 66 6f 72 6d 65 64 0a 2a 2a 20 69 6e   performed.** in
05d0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
05e0: 6c 62 61 63 6b 2e 20 43 75 72 72 65 6e 74 20 76  lback. Current v
05f0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
0600: 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 65 72 72  e ignore any err
0610: 6f 72 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ors .** returned
0620: 20 62 79 20 78 43 6f 6d 6d 69 74 28 29 2e 0a 2a   by xCommit()..*
0630: 2a 0a 2a 2a 20 41 6e 64 20 61 73 20 73 75 62 2d  *.** And as sub-
0640: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
0650: 20 6f 70 65 6e 65 64 2f 63 6c 6f 73 65 64 3a 0a   opened/closed:.
0660: 2a 2a 0a 2a 2a 20 20 20 20 20 78 53 61 76 65 70  **.**     xSavep
0670: 6f 69 6e 74 28 69 6e 74 20 53 29 3a 20 20 4f 70  oint(int S):  Op
0680: 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 53 2e 0a  en savepoint S..
0690: 2a 2a 20 20 20 20 20 78 52 65 6c 65 61 73 65 28  **     xRelease(
06a0: 69 6e 74 20 53 29 3a 20 20 20 20 43 6f 6d 6d 69  int S):    Commi
06b0: 74 20 61 6e 64 20 63 6c 6f 73 65 20 73 61 76 65  t and close save
06c0: 70 6f 69 6e 74 20 53 2e 0a 2a 2a 20 20 20 20 20  point S..**     
06d0: 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 69 6e 74 20  xRollbackTo(int 
06e0: 53 29 3a 20 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  S): Rollback to 
06f0: 73 74 61 72 74 20 6f 66 20 73 61 76 65 70 6f 69  start of savepoi
0700: 6e 74 20 53 2e 0a 2a 2a 0a 2a 2a 20 44 75 72 69  nt S..**.** Duri
0710: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
0720: 61 63 74 69 6f 6e 20 74 68 65 20 66 74 73 35 5f  action the fts5_
0730: 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c 65 20 6d  index.c module m
0740: 61 79 20 63 61 63 68 65 20 73 6f 6d 65 20 64 61  ay cache some da
0750: 74 61 20 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  ta .** in-memory
0760: 2e 20 49 74 20 69 73 20 66 6c 75 73 68 65 64 20  . It is flushed 
0770: 74 6f 20 64 69 73 6b 20 77 68 65 6e 65 76 65 72  to disk whenever
0780: 20 78 53 79 6e 63 28 29 2c 20 78 52 65 6c 65 61   xSync(), xRelea
0790: 73 65 28 29 20 6f 72 0a 2a 2a 20 78 53 61 76 65  se() or.** xSave
07a0: 70 6f 69 6e 74 28 29 20 69 73 20 63 61 6c 6c 65  point() is calle
07b0: 64 2e 20 41 6e 64 20 64 69 73 63 61 72 64 65 64  d. And discarded
07c0: 20 77 68 65 6e 65 76 65 72 20 78 52 6f 6c 6c 62   whenever xRollb
07d0: 61 63 6b 28 29 20 6f 72 20 78 52 6f 6c 6c 62 61  ack() or xRollba
07e0: 63 6b 54 6f 28 29 20 0a 2a 2a 20 69 73 20 63 61  ckTo() .** is ca
07f0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  lled..**.** Addi
0800: 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 53 51 4c  tionally, if SQL
0810: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
0820: 69 6e 65 64 2c 20 61 6e 20 69 6e 73 74 61 6e 63  ined, an instanc
0830: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0840: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
0850: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0860: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  d the current tr
0870: 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 2e  ansaction state.
0880: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
0890: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  n.** is not requ
08a0: 69 72 65 64 2c 20 62 75 74 20 69 74 20 69 73 20  ired, but it is 
08b0: 75 73 65 64 20 69 6e 20 74 68 65 20 61 73 73 65  used in the asse
08c0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
08d0: 65 78 65 63 75 74 65 64 20 62 79 0a 2a 2a 20 66  executed by.** f
08e0: 75 6e 63 74 69 6f 6e 20 66 74 73 35 43 68 65 63  unction fts5Chec
08f0: 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74  kTransactionStat
0900: 65 28 29 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  e() (see below).
0910: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 54  .*/.struct Fts5T
0920: 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65 20  ransactionState 
0930: 7b 0a 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20  {.  int eState; 
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 2f 2a 20 30 3d 3d 63 6c 6f 73 65 64      /* 0==closed
0960: 2c 20 31 3d 3d 6f 70 65 6e 2c 20 32 3d 3d 73 79  , 1==open, 2==sy
0970: 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53  nced */.  int iS
0980: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
0990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
09a0: 62 65 72 20 6f 66 20 6f 70 65 6e 20 73 61 76 65  ber of open save
09b0: 70 6f 69 6e 74 73 20 28 30 20 2d 3e 20 6e 6f 6e  points (0 -> non
09c0: 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  e) */.};../*.** 
09d0: 41 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20  A single object 
09e0: 6f 66 20 74 68 69 73 20 74 79 70 65 20 69 73 20  of this type is 
09f0: 61 6c 6c 6f 63 61 74 65 64 20 77 68 65 6e 20 74  allocated when t
0a00: 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 69  he FTS5 module i
0a10: 73 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  s .** registered
0a20: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
0a30: 20 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 75   handle. It is u
0a40: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 70 6f 69  sed to store poi
0a50: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 61 6c 6c 20  nters to.** all 
0a60: 72 65 67 69 73 74 65 72 65 64 20 46 54 53 35 20  registered FTS5 
0a70: 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 74 6f 6b  extensions - tok
0a80: 65 6e 69 7a 65 72 73 20 61 6e 64 20 61 75 78 69  enizers and auxi
0a90: 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e  liary functions.
0aa0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 47  .*/.struct Fts5G
0ab0: 6c 6f 62 61 6c 20 7b 0a 20 20 66 74 73 35 5f 61  lobal {.  fts5_a
0ac0: 70 69 20 61 70 69 3b 20 20 20 20 20 20 20 20 20  pi api;         
0ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
0ae0: 72 20 76 69 73 69 62 6c 65 20 70 61 72 74 20 6f  r visible part o
0af0: 66 20 6f 62 6a 65 63 74 20 28 73 65 65 20 66 74  f object (see ft
0b00: 73 35 2e 68 29 20 2a 2f 0a 20 20 73 71 6c 69 74  s5.h) */.  sqlit
0b10: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
0b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
0b30: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
0b40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 20  e connection */ 
0b50: 0a 20 20 69 36 34 20 69 4e 65 78 74 49 64 3b 20  .  i64 iNextId; 
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 61 6c     /* Used to al
0b80: 6c 6f 63 61 74 65 20 75 6e 69 71 75 65 20 63 75  locate unique cu
0b90: 72 73 6f 72 20 69 64 73 20 2a 2f 0a 20 20 46 74  rsor ids */.  Ft
0ba0: 73 35 41 75 78 69 6c 69 61 72 79 20 2a 70 41 75  s5Auxiliary *pAu
0bb0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x;            /*
0bc0: 20 46 69 72 73 74 20 69 6e 20 6c 69 73 74 20 6f   First in list o
0bd0: 66 20 61 6c 6c 20 61 75 78 2e 20 66 75 6e 63 74  f all aux. funct
0be0: 69 6f 6e 73 20 2a 2f 0a 20 20 46 74 73 35 54 6f  ions */.  Fts5To
0bf0: 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70  kenizerModule *p
0c00: 54 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 46 69 72  Tok;      /* Fir
0c10: 73 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c  st in list of al
0c20: 6c 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 6f 64 75  l tokenizer modu
0c30: 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 54 6f 6b  les */.  Fts5Tok
0c40: 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70 44  enizerModule *pD
0c50: 66 6c 74 54 6f 6b 3b 20 20 2f 2a 20 44 65 66 61  fltTok;  /* Defa
0c60: 75 6c 74 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 6f  ult tokenizer mo
0c70: 64 75 6c 65 20 2a 2f 0a 20 20 46 74 73 35 43 75  dule */.  Fts5Cu
0c80: 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20  rsor *pCsr;     
0c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
0ca0: 73 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c  st in list of al
0cb0: 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 2a  l open cursors *
0cc0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  /.};../*.** Each
0cd0: 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
0ce0: 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 77  ion registered w
0cf0: 69 74 68 20 74 68 65 20 46 54 53 35 20 6d 6f 64  ith the FTS5 mod
0d00: 75 6c 65 20 69 73 20 72 65 70 72 65 73 65 6e 74  ule is represent
0d10: 65 64 0a 2a 2a 20 62 79 20 61 6e 20 6f 62 6a 65  ed.** by an obje
0d20: 63 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ct of the follow
0d30: 69 6e 67 20 74 79 70 65 2e 20 41 6c 6c 20 73 75  ing type. All su
0d40: 63 68 20 6f 62 6a 65 63 74 73 20 61 72 65 20 73  ch objects are s
0d50: 74 6f 72 65 64 20 61 73 20 70 61 72 74 0a 2a 2a  tored as part.**
0d60: 20 6f 66 20 74 68 65 20 46 74 73 35 47 6c 6f 62   of the Fts5Glob
0d70: 61 6c 2e 70 41 75 78 20 6c 69 73 74 2e 0a 2a 2f  al.pAux list..*/
0d80: 0a 73 74 72 75 63 74 20 46 74 73 35 41 75 78 69  .struct Fts5Auxi
0d90: 6c 69 61 72 79 20 7b 0a 20 20 46 74 73 35 47 6c  liary {.  Fts5Gl
0da0: 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 3b 20 20  obal *pGlobal;  
0db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f            /* Glo
0dc0: 62 61 6c 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  bal context for 
0dd0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
0de0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20  .  char *zFunc; 
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 6e     /* Function n
0e10: 61 6d 65 20 28 6e 75 6c 2d 74 65 72 6d 69 6e 61  ame (nul-termina
0e20: 74 65 64 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ted) */.  void *
0e30: 70 55 73 65 72 44 61 74 61 3b 20 20 20 20 20 20  pUserData;      
0e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
0e50: 72 2d 64 61 74 61 20 70 6f 69 6e 74 65 72 20 2a  r-data pointer *
0e60: 2f 0a 20 20 66 74 73 35 5f 65 78 74 65 6e 73 69  /.  fts5_extensi
0e70: 6f 6e 5f 66 75 6e 63 74 69 6f 6e 20 78 46 75 6e  on_function xFun
0e80: 63 3b 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  c;  /* Callback 
0e90: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
0ea0: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
0eb0: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 2f 2a  oid*);        /*
0ec0: 20 44 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   Destructor func
0ed0: 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 41 75  tion */.  Fts5Au
0ee0: 78 69 6c 69 61 72 79 20 2a 70 4e 65 78 74 3b 20  xiliary *pNext; 
0ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
0f00: 74 20 72 65 67 69 73 74 65 72 65 64 20 61 75 78  t registered aux
0f10: 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 20  iliary function 
0f20: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  */.};../*.** Eac
0f30: 68 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 6f 64 75  h tokenizer modu
0f40: 6c 65 20 72 65 67 69 73 74 65 72 65 64 20 77 69  le registered wi
0f50: 74 68 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75  th the FTS5 modu
0f60: 6c 65 20 69 73 20 72 65 70 72 65 73 65 6e 74 65  le is represente
0f70: 64 0a 2a 2a 20 62 79 20 61 6e 20 6f 62 6a 65 63  d.** by an objec
0f80: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t of the followi
0f90: 6e 67 20 74 79 70 65 2e 20 41 6c 6c 20 73 75 63  ng type. All suc
0fa0: 68 20 6f 62 6a 65 63 74 73 20 61 72 65 20 73 74  h objects are st
0fb0: 6f 72 65 64 20 61 73 20 70 61 72 74 0a 2a 2a 20  ored as part.** 
0fc0: 6f 66 20 74 68 65 20 46 74 73 35 47 6c 6f 62 61  of the Fts5Globa
0fd0: 6c 2e 70 54 6f 6b 20 6c 69 73 74 2e 0a 2a 2f 0a  l.pTok list..*/.
0fe0: 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e  struct Fts5Token
0ff0: 69 7a 65 72 4d 6f 64 75 6c 65 20 7b 0a 20 20 63  izerModule {.  c
1000: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1020: 2a 20 4e 61 6d 65 20 6f 66 20 74 6f 6b 65 6e 69  * Name of tokeni
1030: 7a 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  zer */.  void *p
1040: 55 73 65 72 44 61 74 61 3b 20 20 20 20 20 20 20  UserData;       
1050: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
1060: 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20   pointer passed 
1070: 74 6f 20 78 43 72 65 61 74 65 28 29 20 2a 2f 0a  to xCreate() */.
1080: 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72    fts5_tokenizer
1090: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
10a0: 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72 20 66    /* Tokenizer f
10b0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 76 6f  unctions */.  vo
10c0: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
10d0: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 2f 2a  oid*);        /*
10e0: 20 44 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   Destructor func
10f0: 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 54 6f  tion */.  Fts5To
1100: 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70  kenizerModule *p
1110: 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78  Next;     /* Nex
1120: 74 20 72 65 67 69 73 74 65 72 65 64 20 74 6f 6b  t registered tok
1130: 65 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20 2a 2f  enizer module */
1140: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 69 72 74 75  .};../*.** Virtu
1150: 61 6c 2d 74 61 62 6c 65 20 6f 62 6a 65 63 74 2e  al-table object.
1160: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 54  .*/.struct Fts5T
1170: 61 62 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  able {.  sqlite3
1180: 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20 20 20  _vtab base;     
1190: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
11a0: 20 63 6c 61 73 73 20 75 73 65 64 20 62 79 20 53   class used by S
11b0: 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 20 20  QLite core */.  
11c0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
11d0: 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  fig;            
11e0: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
11f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
1200: 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  /.  Fts5Index *p
1210: 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1220: 20 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74      /* Full-text
1230: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35   index */.  Fts5
1240: 53 74 6f 72 61 67 65 20 2a 70 53 74 6f 72 61 67  Storage *pStorag
1250: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
1260: 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 20 2a 2f  ocument store */
1270: 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  .  Fts5Global *p
1280: 47 6c 6f 62 61 6c 3b 20 20 20 20 20 20 20 20 20  Global;         
1290: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 28 63 6f     /* Global (co
12a0: 6e 6e 65 63 74 69 6f 6e 20 77 69 64 65 29 20 64  nnection wide) d
12b0: 61 74 61 20 2a 2f 0a 20 20 46 74 73 35 43 75 72  ata */.  Fts5Cur
12c0: 73 6f 72 20 2a 70 53 6f 72 74 43 73 72 3b 20 20  sor *pSortCsr;  
12d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
12e0: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
12f0: 63 75 72 73 6f 72 20 2a 2f 0a 23 69 66 64 65 66  cursor */.#ifdef
1300: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1310: 73 74 72 75 63 74 20 46 74 73 35 54 72 61 6e 73  struct Fts5Trans
1320: 61 63 74 69 6f 6e 53 74 61 74 65 20 74 73 3b 0a  actionState ts;.
1330: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63  #endif.};..struc
1340: 74 20 46 74 73 35 4d 61 74 63 68 50 68 72 61 73  t Fts5MatchPhras
1350: 65 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72  e {.  Fts5Buffer
1360: 20 2a 70 50 6f 73 6c 69 73 74 3b 20 20 20 20 20   *pPoslist;     
1370: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1380: 20 74 6f 20 63 75 72 72 65 6e 74 20 70 6f 73 6c   to current posl
1390: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ist */.  int nTe
13a0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
13b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13c0: 20 6f 66 20 70 68 72 61 73 65 20 69 6e 20 74 65   of phrase in te
13d0: 72 6d 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  rms */.};../*.**
13e0: 20 70 53 74 6d 74 3a 0a 2a 2a 20 20 20 53 45 4c   pStmt:.**   SEL
13f0: 45 43 54 20 72 6f 77 69 64 2c 20 3c 66 74 73 3e  ECT rowid, <fts>
1400: 20 46 52 4f 4d 20 3c 66 74 73 3e 20 4f 52 44 45   FROM <fts> ORDE
1410: 52 20 42 59 20 2b 72 61 6e 6b 3b 0a 2a 2a 0a 2a  R BY +rank;.**.*
1420: 2a 20 61 49 64 78 5b 5d 3a 0a 2a 2a 20 20 20 54  * aIdx[]:.**   T
1430: 68 65 72 65 20 69 73 20 6f 6e 65 20 65 6e 74 72  here is one entr
1440: 79 20 69 6e 20 74 68 65 20 61 49 64 78 5b 5d 20  y in the aIdx[] 
1450: 61 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 70  array for each p
1460: 68 72 61 73 65 20 69 6e 20 74 68 65 20 71 75 65  hrase in the que
1470: 72 79 2c 0a 2a 2a 20 20 20 74 68 65 20 76 61 6c  ry,.**   the val
1480: 75 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 74  ue of which is t
1490: 68 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  he offset within
14a0: 20 61 50 6f 73 6c 69 73 74 5b 5d 20 66 6f 6c 6c   aPoslist[] foll
14b0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 0a  owing the last .
14c0: 2a 2a 20 20 20 62 79 74 65 20 6f 66 20 74 68 65  **   byte of the
14d0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
14e0: 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
14f0: 64 69 6e 67 20 70 68 72 61 73 65 2e 0a 2a 2f 0a  ding phrase..*/.
1500: 73 74 72 75 63 74 20 46 74 73 35 53 6f 72 74 65  struct Fts5Sorte
1510: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  r {.  sqlite3_st
1520: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 36 34  mt *pStmt;.  i64
1530: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1550: 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f  Current rowid */
1560: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 50 6f  .  const u8 *aPo
1570: 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  slist;          
1580: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c     /* Position l
1590: 69 73 74 73 20 66 6f 72 20 63 75 72 72 65 6e 74  ists for current
15a0: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 49   row */.  int nI
15b0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
15c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15d0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
15e0: 6e 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e  n aIdx[] */.  in
15f0: 74 20 61 49 64 78 5b 31 5d 3b 20 20 20 20 20 20  t aIdx[1];      
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1610: 20 4f 66 66 73 65 74 73 20 69 6e 74 6f 20 61 50   Offsets into aP
1620: 6f 73 6c 69 73 74 20 66 6f 72 20 63 75 72 72 65  oslist for curre
1630: 6e 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  nt row */.};.../
1640: 2a 0a 2a 2a 20 56 69 72 74 75 61 6c 2d 74 61 62  *.** Virtual-tab
1650: 6c 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74  le cursor object
1660: 2e 0a 2a 2a 0a 2a 2a 20 69 53 70 65 63 69 61 6c  ..**.** iSpecial
1670: 3a 0a 2a 2a 20 20 20 49 66 20 74 68 69 73 20 69  :.**   If this i
1680: 73 20 61 20 27 73 70 65 63 69 61 6c 27 20 71 75  s a 'special' qu
1690: 65 72 79 20 28 72 65 66 65 72 20 74 6f 20 66 75  ery (refer to fu
16a0: 6e 63 74 69 6f 6e 20 66 74 73 35 53 70 65 63 69  nction fts5Speci
16b0: 61 6c 4d 61 74 63 68 28 29 29 2c 20 0a 2a 2a 20  alMatch()), .** 
16c0: 20 20 74 68 65 6e 20 74 68 69 73 20 76 61 72 69    then this vari
16d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
16e0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
16f0: 71 75 65 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 69 46  query. .**.** iF
1700: 69 72 73 74 52 6f 77 69 64 2c 20 69 4c 61 73 74  irstRowid, iLast
1710: 52 6f 77 69 64 3a 0a 2a 2a 20 20 20 54 68 65 73  Rowid:.**   Thes
1720: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
1730: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 46 54  only used for FT
1740: 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 20 63 75  S5_PLAN_MATCH cu
1750: 72 73 6f 72 73 2e 20 41 73 73 75 6d 69 6e 67 20  rsors. Assuming 
1760: 74 68 65 0a 2a 2a 20 20 20 63 75 72 73 6f 72 20  the.**   cursor 
1770: 69 74 65 72 61 74 65 73 20 69 6e 20 61 73 63 65  iterates in asce
1780: 6e 64 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 72  nding order of r
1790: 6f 77 69 64 73 2c 20 69 46 69 72 73 74 52 6f 77  owids, iFirstRow
17a0: 69 64 20 69 73 20 74 68 65 20 6c 6f 77 65 72 0a  id is the lower.
17b0: 2a 2a 20 20 20 6c 69 6d 69 74 20 6f 66 20 72 6f  **   limit of ro
17c0: 77 69 64 73 20 74 6f 20 72 65 74 75 72 6e 2c 20  wids to return, 
17d0: 61 6e 64 20 69 4c 61 73 74 52 6f 77 69 64 20 74  and iLastRowid t
17e0: 68 65 20 75 70 70 65 72 2e 20 49 6e 20 6f 74 68  he upper. In oth
17f0: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
1800: 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20     WHERE clause 
1810: 69 6e 20 74 68 65 20 75 73 65 72 27 73 20 71 75  in the user's qu
1820: 65 72 79 20 6d 69 67 68 74 20 68 61 76 65 20 62  ery might have b
1830: 65 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  een:.**.**      
1840: 20 3c 74 62 6c 3e 20 4d 41 54 43 48 20 3c 65 78   <tbl> MATCH <ex
1850: 70 72 3e 20 41 4e 44 20 72 6f 77 69 64 20 42 45  pr> AND rowid BE
1860: 54 57 45 45 4e 20 24 69 46 69 72 73 74 52 6f 77  TWEEN $iFirstRow
1870: 69 64 20 41 4e 44 20 24 69 4c 61 73 74 52 6f 77  id AND $iLastRow
1880: 69 64 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68  id.**.**   If th
1890: 65 20 63 75 72 73 6f 72 20 69 74 65 72 61 74 65  e cursor iterate
18a0: 73 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20  s in descending 
18b0: 6f 72 64 65 72 20 6f 66 20 72 6f 77 69 64 2c 20  order of rowid, 
18c0: 69 46 69 72 73 74 52 6f 77 69 64 0a 2a 2a 20 20  iFirstRowid.**  
18d0: 20 69 73 20 74 68 65 20 75 70 70 65 72 20 6c 69   is the upper li
18e0: 6d 69 74 20 28 69 2e 65 2e 20 74 68 65 20 22 66  mit (i.e. the "f
18f0: 69 72 73 74 22 20 72 6f 77 69 64 20 76 69 73 69  irst" rowid visi
1900: 74 65 64 29 20 61 6e 64 20 69 4c 61 73 74 52 6f  ted) and iLastRo
1910: 77 69 64 0a 2a 2a 20 20 20 74 68 65 20 6c 6f 77  wid.**   the low
1920: 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  er..*/.struct Ft
1930: 73 35 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  s5Cursor {.  sql
1940: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
1950: 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20   base;       /* 
1960: 42 61 73 65 20 63 6c 61 73 73 20 75 73 65 64 20  Base class used 
1970: 62 79 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  by SQLite core *
1980: 2f 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  /.  Fts5Cursor *
1990: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
19a0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 75 72 73      /* Next curs
19b0: 6f 72 20 69 6e 20 46 74 73 35 43 75 72 73 6f 72  or in Fts5Cursor
19c0: 2e 70 43 73 72 20 6c 69 73 74 20 2a 2f 0a 20 20  .pCsr list */.  
19d0: 69 6e 74 20 2a 61 43 6f 6c 75 6d 6e 53 69 7a 65  int *aColumnSize
19e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19f0: 2f 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 78 43  /* Values for xC
1a00: 6f 6c 75 6d 6e 53 69 7a 65 28 29 20 2a 2f 0a 20  olumnSize() */. 
1a10: 20 69 36 34 20 69 43 73 72 49 64 3b 20 20 20 20   i64 iCsrId;    
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 2f 2a 20 43 75 72 73 6f 72 20 69 64 20 2a 2f   /* Cursor id */
1a40: 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 66 72 6f 6d  ..  /* Zero from
1a50: 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 77 61   this point onwa
1a60: 72 64 73 20 6f 6e 20 63 75 72 73 6f 72 20 72 65  rds on cursor re
1a70: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 50 6c  set */.  int ePl
1a80: 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
1a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1aa0: 5f 50 4c 41 4e 5f 58 58 58 20 76 61 6c 75 65 20  _PLAN_XXX value 
1ab0: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 3b 20  */.  int bDesc; 
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1ae0: 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
1af0: 20 44 45 53 43 22 20 71 75 65 72 69 65 73 20 2a   DESC" queries *
1b00: 2f 0a 20 20 69 36 34 20 69 46 69 72 73 74 52 6f  /.  i64 iFirstRo
1b10: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
1b20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6e 6f      /* Return no
1b30: 20 72 6f 77 69 64 73 20 65 61 72 6c 69 65 72 20   rowids earlier 
1b40: 74 68 61 6e 20 74 68 69 73 20 2a 2f 0a 20 20 69  than this */.  i
1b50: 36 34 20 69 4c 61 73 74 52 6f 77 69 64 3b 20 20  64 iLastRowid;  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b70: 2a 20 52 65 74 75 72 6e 20 6e 6f 20 72 6f 77 69  * Return no rowi
1b80: 64 73 20 6c 61 74 65 72 20 74 68 61 6e 20 74 68  ds later than th
1b90: 69 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  is */.  sqlite3_
1ba0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
1bb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
1bc0: 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 72 65 61  ment used to rea
1bd0: 64 20 25 5f 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  d %_content */. 
1be0: 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
1bf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c00: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
1c10: 6f 72 20 4d 41 54 43 48 20 71 75 65 72 69 65 73  or MATCH queries
1c20: 20 2a 2f 0a 20 20 46 74 73 35 53 6f 72 74 65 72   */.  Fts5Sorter
1c30: 20 2a 70 53 6f 72 74 65 72 3b 20 20 20 20 20 20   *pSorter;      
1c40: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
1c50: 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 61  for "ORDER BY ra
1c60: 6e 6b 22 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  nk" queries */. 
1c70: 20 69 6e 74 20 63 73 72 66 6c 61 67 73 3b 20 20   int csrflags;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
1ca0: 6f 72 20 66 6c 61 67 73 20 28 73 65 65 20 62 65  or flags (see be
1cb0: 6c 6f 77 29 20 2a 2f 0a 20 20 69 36 34 20 69 53  low) */.  i64 iS
1cc0: 70 65 63 69 61 6c 3b 20 20 20 20 20 20 20 20 20  pecial;         
1cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ce0: 75 6c 74 20 6f 66 20 73 70 65 63 69 61 6c 20 71  ult of special q
1cf0: 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 22 72  uery */..  /* "r
1d00: 61 6e 6b 22 20 66 75 6e 63 74 69 6f 6e 2e 20 50  ank" function. P
1d10: 6f 70 75 6c 61 74 65 64 20 6f 6e 20 64 65 6d 61  opulated on dema
1d20: 6e 64 20 66 72 6f 6d 20 76 74 61 62 2e 78 43 6f  nd from vtab.xCo
1d30: 6c 75 6d 6e 28 29 2e 20 2a 2f 0a 20 20 63 68 61  lumn(). */.  cha
1d40: 72 20 2a 7a 52 61 6e 6b 3b 20 20 20 20 20 20 20  r *zRank;       
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d60: 43 75 73 74 6f 6d 20 72 61 6e 6b 20 66 75 6e 63  Custom rank func
1d70: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
1d80: 7a 52 61 6e 6b 41 72 67 73 3b 20 20 20 20 20 20  zRankArgs;      
1d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 73            /* Cus
1da0: 74 6f 6d 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f  tom rank functio
1db0: 6e 20 61 72 67 73 20 2a 2f 0a 20 20 46 74 73 35  n args */.  Fts5
1dc0: 41 75 78 69 6c 69 61 72 79 20 2a 70 52 61 6e 6b  Auxiliary *pRank
1dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1de0: 61 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 28 6f 72  ank callback (or
1df0: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20   NULL) */.  int 
1e00: 6e 52 61 6e 6b 41 72 67 3b 20 20 20 20 20 20 20  nRankArg;       
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e20: 75 6d 62 65 72 20 6f 66 20 74 72 61 69 6c 69 6e  umber of trailin
1e30: 67 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  g arguments for 
1e40: 72 61 6e 6b 28 29 20 2a 2f 0a 20 20 73 71 6c 69  rank() */.  sqli
1e50: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 52 61  te3_value **apRa
1e60: 6e 6b 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 41  nkArg;      /* A
1e70: 72 72 61 79 20 6f 66 20 74 72 61 69 6c 69 6e 67  rray of trailing
1e80: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1e90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52  sqlite3_stmt *pR
1ea0: 61 6e 6b 41 72 67 53 74 6d 74 3b 20 20 20 20 20  ankArgStmt;     
1eb0: 2f 2a 20 4f 72 69 67 69 6e 20 6f 66 20 6f 62 6a  /* Origin of obj
1ec0: 65 63 74 73 20 69 6e 20 61 70 52 61 6e 6b 41 72  ects in apRankAr
1ed0: 67 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 75 78  g[] */..  /* Aux
1ee0: 69 6c 69 61 72 79 20 64 61 74 61 20 73 74 6f 72  iliary data stor
1ef0: 61 67 65 20 2a 2f 0a 20 20 46 74 73 35 41 75 78  age */.  Fts5Aux
1f00: 69 6c 69 61 72 79 20 2a 70 41 75 78 3b 20 20 20  iliary *pAux;   
1f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1f20: 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67 20  ently executing 
1f30: 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e 63 74 69  extension functi
1f40: 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 41 75 78 64  on */.  Fts5Auxd
1f50: 61 74 61 20 2a 70 41 75 78 64 61 74 61 3b 20 20  ata *pAuxdata;  
1f60: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1f70: 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20   in linked list 
1f80: 6f 66 20 73 61 76 65 64 20 61 75 78 2d 64 61 74  of saved aux-dat
1f90: 61 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 63 68 65  a */..  /* Cache
1fa0: 20 75 73 65 64 20 62 79 20 61 75 78 69 6c 69 61   used by auxilia
1fb0: 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 78 49 6e  ry functions xIn
1fc0: 73 74 28 29 20 61 6e 64 20 78 49 6e 73 74 43 6f  st() and xInstCo
1fd0: 75 6e 74 28 29 20 2a 2f 0a 20 20 46 74 73 35 50  unt() */.  Fts5P
1fe0: 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49  oslistReader *aI
1ff0: 6e 73 74 49 74 65 72 3b 20 20 20 2f 2a 20 4f 6e  nstIter;   /* On
2000: 65 20 66 6f 72 20 65 61 63 68 20 70 68 72 61 73  e for each phras
2010: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 73 74  e */.  int nInst
2020: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
2030: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2040: 66 20 61 49 6e 73 74 5b 5d 20 61 72 72 61 79 20  f aInst[] array 
2050: 28 65 6e 74 72 69 65 73 20 2f 20 33 29 20 2a 2f  (entries / 3) */
2060: 0a 20 20 69 6e 74 20 6e 49 6e 73 74 43 6f 75 6e  .  int nInstCoun
2070: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2080: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2090: 70 68 72 61 73 65 20 69 6e 73 74 61 6e 63 65 73  phrase instances
20a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 49 6e 73 74   */.  int *aInst
20b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c0: 20 20 20 20 20 20 2f 2a 20 33 20 69 6e 74 65 67        /* 3 integ
20d0: 65 72 73 20 70 65 72 20 70 68 72 61 73 65 20 69  ers per phrase i
20e0: 6e 73 74 61 6e 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f  nstance */.};../
20f0: 2a 0a 2a 2a 20 42 69 74 73 20 74 68 61 74 20 6d  *.** Bits that m
2100: 61 6b 65 20 75 70 20 74 68 65 20 22 69 64 78 4e  ake up the "idxN
2110: 75 6d 22 20 70 61 72 61 6d 65 74 65 72 20 70 61  um" parameter pa
2120: 73 73 65 64 20 69 6e 64 69 72 65 63 74 6c 79 20  ssed indirectly 
2130: 62 79 20 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  by .** xBestInde
2140: 78 28 29 20 74 6f 20 78 46 69 6c 74 65 72 28 29  x() to xFilter()
2150: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ..*/.#define FTS
2160: 35 5f 42 49 5f 4d 41 54 43 48 20 20 20 20 20 20  5_BI_MATCH      
2170: 20 20 30 78 30 30 30 31 20 20 20 20 20 20 20 20    0x0001        
2180: 20 2f 2a 20 3c 74 62 6c 3e 20 4d 41 54 43 48 20   /* <tbl> MATCH 
2190: 3f 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ? */.#define FTS
21a0: 35 5f 42 49 5f 52 41 4e 4b 20 20 20 20 20 20 20  5_BI_RANK       
21b0: 20 20 30 78 30 30 30 32 20 20 20 20 20 20 20 20    0x0002        
21c0: 20 2f 2a 20 72 61 6e 6b 20 4d 41 54 43 48 20 3f   /* rank MATCH ?
21d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
21e0: 5f 42 49 5f 52 4f 57 49 44 5f 45 51 20 20 20 20  _BI_ROWID_EQ    
21f0: 20 30 78 30 30 30 34 20 20 20 20 20 20 20 20 20   0x0004         
2200: 2f 2a 20 72 6f 77 69 64 20 3d 3d 20 3f 20 2a 2f  /* rowid == ? */
2210: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 42 49  .#define FTS5_BI
2220: 5f 52 4f 57 49 44 5f 4c 45 20 20 20 20 20 30 78  _ROWID_LE     0x
2230: 30 30 30 38 20 20 20 20 20 20 20 20 20 2f 2a 20  0008         /* 
2240: 72 6f 77 69 64 20 3c 3d 20 3f 20 2a 2f 0a 23 64  rowid <= ? */.#d
2250: 65 66 69 6e 65 20 46 54 53 35 5f 42 49 5f 52 4f  efine FTS5_BI_RO
2260: 57 49 44 5f 47 45 20 20 20 20 20 30 78 30 30 31  WID_GE     0x001
2270: 30 20 20 20 20 20 20 20 20 20 2f 2a 20 72 6f 77  0         /* row
2280: 69 64 20 3e 3d 20 3f 20 2a 2f 0a 0a 23 64 65 66  id >= ? */..#def
2290: 69 6e 65 20 46 54 53 35 5f 42 49 5f 4f 52 44 45  ine FTS5_BI_ORDE
22a0: 52 5f 52 41 4e 4b 20 20 20 30 78 30 30 32 30 0a  R_RANK   0x0020.
22b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 42 49 5f  #define FTS5_BI_
22c0: 4f 52 44 45 52 5f 52 4f 57 49 44 20 20 30 78 30  ORDER_ROWID  0x0
22d0: 30 34 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35  040.#define FTS5
22e0: 5f 42 49 5f 4f 52 44 45 52 5f 44 45 53 43 20 20  _BI_ORDER_DESC  
22f0: 20 30 78 30 30 38 30 0a 0a 2f 2a 0a 2a 2a 20 56   0x0080../*.** V
2300: 61 6c 75 65 73 20 66 6f 72 20 46 74 73 35 43 75  alues for Fts5Cu
2310: 72 73 6f 72 2e 63 73 72 66 6c 61 67 73 0a 2a 2f  rsor.csrflags.*/
2320: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 43 53 52  .#define FTS5CSR
2330: 5f 45 4f 46 20 20 20 20 20 20 20 20 20 20 20 20  _EOF            
2340: 20 20 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20     0x01.#define 
2350: 46 54 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f  FTS5CSR_REQUIRE_
2360: 43 4f 4e 54 45 4e 54 20 20 20 30 78 30 32 0a 23  CONTENT   0x02.#
2370: 64 65 66 69 6e 65 20 46 54 53 35 43 53 52 5f 52  define FTS5CSR_R
2380: 45 51 55 49 52 45 5f 44 4f 43 53 49 5a 45 20 20  EQUIRE_DOCSIZE  
2390: 20 30 78 30 34 0a 23 64 65 66 69 6e 65 20 46 54   0x04.#define FT
23a0: 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f 49 4e  S5CSR_REQUIRE_IN
23b0: 53 54 20 20 20 20 20 20 30 78 30 38 0a 23 64 65  ST      0x08.#de
23c0: 66 69 6e 65 20 46 54 53 35 43 53 52 5f 46 52 45  fine FTS5CSR_FRE
23d0: 45 5f 5a 52 41 4e 4b 20 20 20 20 20 20 20 20 30  E_ZRANK        0
23e0: 78 31 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35  x10.#define FTS5
23f0: 43 53 52 5f 52 45 51 55 49 52 45 5f 52 45 53 45  CSR_REQUIRE_RESE
2400: 45 4b 20 20 20 20 30 78 32 30 0a 23 64 65 66 69  EK    0x20.#defi
2410: 6e 65 20 46 54 53 35 43 53 52 5f 52 45 51 55 49  ne FTS5CSR_REQUI
2420: 52 45 5f 50 4f 53 4c 49 53 54 20 20 20 30 78 34  RE_POSLIST   0x4
2430: 30 0a 0a 23 64 65 66 69 6e 65 20 42 69 74 46 6c  0..#define BitFl
2440: 61 67 41 6c 6c 54 65 73 74 28 78 2c 79 29 20 28  agAllTest(x,y) (
2450: 28 28 78 29 20 26 20 28 79 29 29 3d 3d 28 79 29  ((x) & (y))==(y)
2460: 29 0a 23 64 65 66 69 6e 65 20 42 69 74 46 6c 61  ).#define BitFla
2470: 67 54 65 73 74 28 78 2c 79 29 20 20 20 20 28 28  gTest(x,y)    ((
2480: 28 78 29 20 26 20 28 79 29 29 21 3d 30 29 0a 0a  (x) & (y))!=0)..
2490: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 74 6f  ./*.** Macros to
24a0: 20 53 65 74 28 29 2c 20 43 6c 65 61 72 28 29 20   Set(), Clear() 
24b0: 61 6e 64 20 54 65 73 74 28 29 20 63 75 72 73 6f  and Test() curso
24c0: 72 20 66 6c 61 67 73 2e 0a 2a 2f 0a 23 64 65 66  r flags..*/.#def
24d0: 69 6e 65 20 43 73 72 46 6c 61 67 53 65 74 28 70  ine CsrFlagSet(p
24e0: 43 73 72 2c 20 66 6c 61 67 29 20 20 20 28 28 70  Csr, flag)   ((p
24f0: 43 73 72 29 2d 3e 63 73 72 66 6c 61 67 73 20 7c  Csr)->csrflags |
2500: 3d 20 28 66 6c 61 67 29 29 0a 23 64 65 66 69 6e  = (flag)).#defin
2510: 65 20 43 73 72 46 6c 61 67 43 6c 65 61 72 28 70  e CsrFlagClear(p
2520: 43 73 72 2c 20 66 6c 61 67 29 20 28 28 70 43 73  Csr, flag) ((pCs
2530: 72 29 2d 3e 63 73 72 66 6c 61 67 73 20 26 3d 20  r)->csrflags &= 
2540: 7e 28 66 6c 61 67 29 29 0a 23 64 65 66 69 6e 65  ~(flag)).#define
2550: 20 43 73 72 46 6c 61 67 54 65 73 74 28 70 43 73   CsrFlagTest(pCs
2560: 72 2c 20 66 6c 61 67 29 20 20 28 28 70 43 73 72  r, flag)  ((pCsr
2570: 29 2d 3e 63 73 72 66 6c 61 67 73 20 26 20 28 66  )->csrflags & (f
2580: 6c 61 67 29 29 0a 0a 73 74 72 75 63 74 20 46 74  lag))..struct Ft
2590: 73 35 41 75 78 64 61 74 61 20 7b 0a 20 20 46 74  s5Auxdata {.  Ft
25a0: 73 35 41 75 78 69 6c 69 61 72 79 20 2a 70 41 75  s5Auxiliary *pAu
25b0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x;            /*
25c0: 20 45 78 74 65 6e 73 69 6f 6e 20 74 6f 20 77 68   Extension to wh
25d0: 69 63 68 20 74 68 69 73 20 62 65 6c 6f 6e 67 73  ich this belongs
25e0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 50 74 72   */.  void *pPtr
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2600: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2610: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64   value */.  void
2620: 28 2a 78 44 65 6c 65 74 65 29 28 76 6f 69 64 2a  (*xDelete)(void*
2630: 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  );          /* D
2640: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 46  estructor */.  F
2650: 74 73 35 41 75 78 64 61 74 61 20 2a 70 4e 65 78  ts5Auxdata *pNex
2660: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
2670: 2a 20 4e 65 78 74 20 6f 62 6a 65 63 74 20 69 6e  * Next object in
2680: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
2690: 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  };..#ifdef SQLIT
26a0: 45 5f 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20  E_DEBUG.#define 
26b0: 46 54 53 35 5f 42 45 47 49 4e 20 20 20 20 20 20  FTS5_BEGIN      
26c0: 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  1.#define FTS5_S
26d0: 59 4e 43 20 20 20 20 20 20 20 32 0a 23 64 65 66  YNC       2.#def
26e0: 69 6e 65 20 46 54 53 35 5f 43 4f 4d 4d 49 54 20  ine FTS5_COMMIT 
26f0: 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 46 54      3.#define FT
2700: 53 35 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 34 0a  S5_ROLLBACK   4.
2710: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 41 56  #define FTS5_SAV
2720: 45 50 4f 49 4e 54 20 20 35 0a 23 64 65 66 69 6e  EPOINT  5.#defin
2730: 65 20 46 54 53 35 5f 52 45 4c 45 41 53 45 20 20  e FTS5_RELEASE  
2740: 20 20 36 0a 23 64 65 66 69 6e 65 20 46 54 53 35    6.#define FTS5
2750: 5f 52 4f 4c 4c 42 41 43 4b 54 4f 20 37 0a 73 74  _ROLLBACKTO 7.st
2760: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68  atic void fts5Ch
2770: 65 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74  eckTransactionSt
2780: 61 74 65 28 46 74 73 35 54 61 62 6c 65 20 2a 70  ate(Fts5Table *p
2790: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
27a0: 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 73 77 69  avepoint){.  swi
27b0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
27c0: 61 73 65 20 46 54 53 35 5f 42 45 47 49 4e 3a 0a  ase FTS5_BEGIN:.
27d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
27e0: 3e 74 73 2e 65 53 74 61 74 65 3d 3d 30 20 29 3b  >ts.eState==0 );
27f0: 0a 20 20 20 20 20 20 70 2d 3e 74 73 2e 65 53 74  .      p->ts.eSt
2800: 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
2810: 2d 3e 74 73 2e 69 53 61 76 65 70 6f 69 6e 74 20  ->ts.iSavepoint 
2820: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  = -1;.      brea
2830: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 46 54 53  k;..    case FTS
2840: 35 5f 53 59 4e 43 3a 0a 20 20 20 20 20 20 61 73  5_SYNC:.      as
2850: 73 65 72 74 28 20 70 2d 3e 74 73 2e 65 53 74 61  sert( p->ts.eSta
2860: 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  te==1 );.      p
2870: 2d 3e 74 73 2e 65 53 74 61 74 65 20 3d 20 32 3b  ->ts.eState = 2;
2880: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2890: 20 20 20 63 61 73 65 20 46 54 53 35 5f 43 4f 4d     case FTS5_COM
28a0: 4d 49 54 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MIT:.      asser
28b0: 74 28 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d  t( p->ts.eState=
28c0: 3d 32 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74  =2 );.      p->t
28d0: 73 2e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20  s.eState = 0;.  
28e0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
28f0: 63 61 73 65 20 46 54 53 35 5f 52 4f 4c 4c 42 41  case FTS5_ROLLBA
2900: 43 4b 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  CK:.      assert
2910: 28 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d  ( p->ts.eState==
2920: 31 20 7c 7c 20 70 2d 3e 74 73 2e 65 53 74 61 74  1 || p->ts.eStat
2930: 65 3d 3d 32 20 7c 7c 20 70 2d 3e 74 73 2e 65 53  e==2 || p->ts.eS
2940: 74 61 74 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  tate==0 );.     
2950: 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 20 3d 20   p->ts.eState = 
2960: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
2970: 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 53  .    case FTS5_S
2980: 41 56 45 50 4f 49 4e 54 3a 0a 20 20 20 20 20 20  AVEPOINT:.      
2990: 61 73 73 65 72 74 28 20 70 2d 3e 74 73 2e 65 53  assert( p->ts.eS
29a0: 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  tate==1 );.     
29b0: 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
29c0: 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  int>=0 );.      
29d0: 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
29e0: 6e 74 3e 70 2d 3e 74 73 2e 69 53 61 76 65 70 6f  nt>p->ts.iSavepo
29f0: 69 6e 74 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  int );.      p->
2a00: 74 73 2e 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  ts.iSavepoint = 
2a10: 69 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  iSavepoint;.    
2a20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 0a    break;.      .
2a30: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 52 45      case FTS5_RE
2a40: 4c 45 41 53 45 3a 0a 20 20 20 20 20 20 61 73 73  LEASE:.      ass
2a50: 65 72 74 28 20 70 2d 3e 74 73 2e 65 53 74 61 74  ert( p->ts.eStat
2a60: 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
2a70: 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
2a80: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >=0 );.      ass
2a90: 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3c  ert( iSavepoint<
2aa0: 3d 70 2d 3e 74 73 2e 69 53 61 76 65 70 6f 69 6e  =p->ts.iSavepoin
2ab0: 74 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74 73  t );.      p->ts
2ac0: 2e 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 53  .iSavepoint = iS
2ad0: 61 76 65 70 6f 69 6e 74 2d 31 3b 0a 20 20 20 20  avepoint-1;.    
2ae0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
2af0: 73 65 20 46 54 53 35 5f 52 4f 4c 4c 42 41 43 4b  se FTS5_ROLLBACK
2b00: 54 4f 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  TO:.      assert
2b10: 28 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d  ( p->ts.eState==
2b20: 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
2b30: 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
2b40: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2b50: 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 3d 70 2d  ( iSavepoint<=p-
2b60: 3e 74 73 2e 69 53 61 76 65 70 6f 69 6e 74 20 29  >ts.iSavepoint )
2b70: 3b 0a 20 20 20 20 20 20 70 2d 3e 74 73 2e 69 53  ;.      p->ts.iS
2b80: 61 76 65 70 6f 69 6e 74 20 3d 20 69 53 61 76 65  avepoint = iSave
2b90: 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 62 72 65  point;.      bre
2ba0: 61 6b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  ak;.  }.}.#else.
2bb0: 23 20 64 65 66 69 6e 65 20 66 74 73 35 43 68 65  # define fts5Che
2bc0: 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61  ckTransactionSta
2bd0: 74 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  te(x,y,z).#endif
2be0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2bf0: 72 75 65 20 69 66 20 70 54 61 62 20 69 73 20 61  rue if pTab is a
2c00: 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20 74 61 62   contentless tab
2c10: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2c20: 74 20 66 74 73 35 49 73 43 6f 6e 74 65 6e 74 6c  t fts5IsContentl
2c30: 65 73 73 28 46 74 73 35 54 61 62 6c 65 20 2a 70  ess(Fts5Table *p
2c40: 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Tab){.  return p
2c50: 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 43  Tab->pConfig->eC
2c60: 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e  ontent==FTS5_CON
2c70: 54 45 4e 54 5f 4e 4f 4e 45 3b 0a 7d 0a 0a 2f 2a  TENT_NONE;.}../*
2c80: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 76 69 72  .** Delete a vir
2c90: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
2ca0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  e allocated by f
2cb0: 74 73 35 49 6e 69 74 56 74 61 62 28 29 2e 20 0a  ts5InitVtab(). .
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2cd0: 74 73 35 46 72 65 65 56 74 61 62 28 46 74 73 35  ts5FreeVtab(Fts5
2ce0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
2cf0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
2d00: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2d10: 43 6c 6f 73 65 28 70 54 61 62 2d 3e 70 49 6e 64  Close(pTab->pInd
2d20: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
2d30: 46 74 73 35 53 74 6f 72 61 67 65 43 6c 6f 73 65  Fts5StorageClose
2d40: 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 29  (pTab->pStorage)
2d50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2d60: 35 43 6f 6e 66 69 67 46 72 65 65 28 70 54 61 62  5ConfigFree(pTab
2d70: 2d 3e 70 43 6f 6e 66 69 67 29 3b 0a 20 20 20 20  ->pConfig);.    
2d80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
2d90: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
2da0: 20 54 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   The xDisconnect
2db0: 28 29 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  () virtual table
2dc0: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
2dd0: 69 63 20 69 6e 74 20 66 74 73 35 44 69 73 63 6f  ic int fts5Disco
2de0: 6e 6e 65 63 74 4d 65 74 68 6f 64 28 73 71 6c 69  nnectMethod(sqli
2df0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
2e00: 7b 0a 20 20 66 74 73 35 46 72 65 65 56 74 61 62  {.  fts5FreeVtab
2e10: 28 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56 74  ((Fts5Table*)pVt
2e20: 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
2e30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2e40: 2a 20 54 68 65 20 78 44 65 73 74 72 6f 79 28 29  * The xDestroy()
2e50: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
2e60: 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
2e70: 20 69 6e 74 20 66 74 73 35 44 65 73 74 72 6f 79   int fts5Destroy
2e80: 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
2e90: 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 46  tab *pVtab){.  F
2ea0: 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts5Table *pTab =
2eb0: 20 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56 74   (Fts5Table*)pVt
2ec0: 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  ab;.  int rc = s
2ed0: 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70 41 6c  qlite3Fts5DropAl
2ee0: 6c 28 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 29  l(pTab->pConfig)
2ef0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2f00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73  TE_OK ){.    fts
2f10: 35 46 72 65 65 56 74 61 62 28 28 46 74 73 35 54  5FreeVtab((Fts5T
2f20: 61 62 6c 65 2a 29 70 56 74 61 62 29 3b 0a 20 20  able*)pVtab);.  
2f30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2f40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2f50: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70  ction is the imp
2f60: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
2f70: 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63 74  oth the xConnect
2f80: 20 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a 20   and xCreate.** 
2f90: 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 46  methods of the F
2fa0: 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS3 virtual tabl
2fb0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67  e..**.** The arg
2fc0: 76 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  v[] array contai
2fd0: 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ns the following
2fe0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30  :.**.**   argv[0
2ff0: 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61  ]   -> module na
3000: 6d 65 20 20 28 22 66 74 73 35 22 29 0a 2a 2a 20  me  ("fts5").** 
3010: 20 20 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64    argv[1]   -> d
3020: 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20  atabase name.** 
3030: 20 20 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74    argv[2]   -> t
3040: 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61  able name.**   a
3050: 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20 22 63 6f 6c  rgv[...] -> "col
3060: 75 6d 6e 20 6e 61 6d 65 22 20 61 6e 64 20 6f 74  umn name" and ot
3070: 68 65 72 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d  her module argum
3080: 65 6e 74 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ent fields..*/.s
3090: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
30a0: 69 74 56 74 61 62 28 0a 20 20 69 6e 74 20 62 43  itVtab(.  int bC
30b0: 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  reate,          
30c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30d0: 65 20 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66  e for xCreate, f
30e0: 61 6c 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63  alse for xConnec
30f0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
3100: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
3110: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 51         /* The SQ
3120: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
3130: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  nnection */.  vo
3140: 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20 20  id *pAux,       
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3160: 20 48 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74   Hash table cont
3170: 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 69 7a 65 72  aining tokenizer
3180: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  s */.  int argc,
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
31b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
31c0: 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a 20 20  argv array */.  
31d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
31e0: 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20 20 20  st *argv,       
31f0: 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e  /* xCreate/xConn
3200: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61 72 72  ect argument arr
3210: 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ay */.  sqlite3_
3220: 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 20 20  vtab **ppVTab,  
3230: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
3240: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 76   the resulting v
3250: 74 61 62 20 73 74 72 75 63 74 75 72 65 20 68 65  tab structure he
3260: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  re */.  char **p
3270: 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  zErr            
3280: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
3290: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
32a0: 67 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ge here */.){.  
32b0: 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f  Fts5Global *pGlo
32c0: 62 61 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61  bal = (Fts5Globa
32d0: 6c 2a 29 70 41 75 78 3b 0a 20 20 63 6f 6e 73 74  l*)pAux;.  const
32e0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6e 66 69 67   char **azConfig
32f0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
3300: 29 61 72 67 76 3b 0a 20 20 69 6e 74 20 72 63 20  )argv;.  int rc 
3310: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
3330: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
3340: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
3350: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
3360: 52 65 73 75 6c 74 73 20 6f 66 20 70 61 72 73 69  Results of parsi
3370: 6e 67 20 61 72 67 63 2f 61 72 67 76 20 2a 2f 0a  ng argc/argv */.
3380: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
3390: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
33a0: 20 20 2f 2a 20 4e 65 77 20 76 69 72 74 75 61 6c    /* New virtual
33b0: 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f   table object */
33c0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
33d0: 74 68 65 20 6e 65 77 20 76 74 61 62 20 6f 62 6a  the new vtab obj
33e0: 65 63 74 20 61 6e 64 20 70 61 72 73 65 20 74 68  ect and parse th
33f0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
3400: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 28 46 74 73  */.  pTab = (Fts
3410: 35 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 33 46  5Table*)sqlite3F
3420: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
3430: 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 54 61  c, sizeof(Fts5Ta
3440: 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 72 63 3d  ble));.  if( rc=
3450: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3460: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
3470: 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28 70 47  s5ConfigParse(pG
3480: 6c 6f 62 61 6c 2c 20 64 62 2c 20 61 72 67 63 2c  lobal, db, argc,
3490: 20 61 7a 43 6f 6e 66 69 67 2c 20 26 70 43 6f 6e   azConfig, &pCon
34a0: 66 69 67 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20  fig, pzErr);.   
34b0: 20 61 73 73 65 72 74 28 20 28 72 63 3d 3d 53 51   assert( (rc==SQ
34c0: 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70 7a 45 72  LITE_OK && *pzEr
34d0: 72 3d 3d 30 29 20 7c 7c 20 70 43 6f 6e 66 69 67  r==0) || pConfig
34e0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
34f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3500: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 6f 6e  {.    pTab->pCon
3510: 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20  fig = pConfig;. 
3520: 20 20 20 70 54 61 62 2d 3e 70 47 6c 6f 62 61 6c     pTab->pGlobal
3530: 20 3d 20 70 47 6c 6f 62 61 6c 3b 0a 20 20 7d 0a   = pGlobal;.  }.
3540: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 69  .  /* Open the i
3550: 6e 64 65 78 20 73 75 62 2d 73 79 73 74 65 6d 20  ndex sub-system 
3560: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
3570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
3580: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
3590: 64 65 78 4f 70 65 6e 28 70 43 6f 6e 66 69 67 2c  dexOpen(pConfig,
35a0: 20 62 43 72 65 61 74 65 2c 20 26 70 54 61 62 2d   bCreate, &pTab-
35b0: 3e 70 49 6e 64 65 78 2c 20 70 7a 45 72 72 29 3b  >pIndex, pzErr);
35c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
35d0: 74 68 65 20 73 74 6f 72 61 67 65 20 73 75 62 2d  the storage sub-
35e0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 69 66 28 20  system */.  if( 
35f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3600: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
3610: 33 46 74 73 35 53 74 6f 72 61 67 65 4f 70 65 6e  3Fts5StorageOpen
3620: 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69  (.        pConfi
3630: 67 2c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  g, pTab->pIndex,
3640: 20 62 43 72 65 61 74 65 2c 20 26 70 54 61 62 2d   bCreate, &pTab-
3650: 3e 70 53 74 6f 72 61 67 65 2c 20 70 7a 45 72 72  >pStorage, pzErr
3660: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  .    );.  }..  /
3670: 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 64  * Call sqlite3_d
3680: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 2a 2f  eclare_vtab() */
3690: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
36b0: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
36c0: 69 67 44 65 63 6c 61 72 65 56 74 61 62 28 70 43  igDeclareVtab(pC
36d0: 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  onfig);.  }..  /
36e0: 2a 20 4c 6f 61 64 20 74 68 65 20 69 6e 69 74 69  * Load the initi
36f0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
3700: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
3710: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
3720: 73 73 65 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e  ssert( pConfig->
3730: 70 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20  pzErrmsg==0 );. 
3740: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72     pConfig->pzEr
3750: 72 6d 73 67 20 3d 20 70 7a 45 72 72 3b 0a 20 20  rmsg = pzErr;.  
3760: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
3770: 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69  s5IndexLoadConfi
3780: 67 28 70 54 61 62 2d 3e 70 49 6e 64 65 78 29 3b  g(pTab->pIndex);
3790: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
37a0: 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 70 54  IndexRollback(pT
37b0: 61 62 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ab->pIndex);.   
37c0: 20 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d   pConfig->pzErrm
37d0: 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  sg = 0;.  }..  i
37e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37f0: 20 29 7b 0a 20 20 20 20 66 74 73 35 46 72 65 65   ){.    fts5Free
3800: 56 74 61 62 28 70 54 61 62 29 3b 0a 20 20 20 20  Vtab(pTab);.    
3810: 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pTab = 0;.  }els
3820: 65 20 69 66 28 20 62 43 72 65 61 74 65 20 29 7b  e if( bCreate ){
3830: 0a 20 20 20 20 66 74 73 35 43 68 65 63 6b 54 72  .    fts5CheckTr
3840: 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65 28 70  ansactionState(p
3850: 54 61 62 2c 20 46 54 53 35 5f 42 45 47 49 4e 2c  Tab, FTS5_BEGIN,
3860: 20 30 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 54   0);.  }.  *ppVT
3870: 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74  ab = (sqlite3_vt
3880: 61 62 2a 29 70 54 61 62 3b 0a 20 20 72 65 74 75  ab*)pTab;.  retu
3890: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
38a0: 54 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 20 61  The xConnect() a
38b0: 6e 64 20 78 43 72 65 61 74 65 28 29 20 6d 65 74  nd xCreate() met
38c0: 68 6f 64 73 20 66 6f 72 20 74 68 65 20 76 69 72  hods for the vir
38d0: 74 75 61 6c 20 74 61 62 6c 65 2e 20 41 6c 6c 20  tual table. All 
38e0: 74 68 65 0a 2a 2a 20 77 6f 72 6b 20 69 73 20 64  the.** work is d
38f0: 6f 6e 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  one in function 
3900: 66 74 73 35 49 6e 69 74 56 74 61 62 28 29 2e 0a  fts5InitVtab()..
3910: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
3920: 73 35 43 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28  s5ConnectMethod(
3930: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3950: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
3960: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76  onnection */.  v
3970: 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20  oid *pAux,      
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3990: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 6f 6b  * Pointer to tok
39a0: 65 6e 69 7a 65 72 20 68 61 73 68 20 74 61 62 6c  enizer hash tabl
39b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  e */.  int argc,
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
39e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
39f0: 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a 20 20  argv array */.  
3a00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
3a10: 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20 20 20  st *argv,       
3a20: 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e  /* xCreate/xConn
3a30: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61 72 72  ect argument arr
3a40: 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ay */.  sqlite3_
3a50: 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 20 20  vtab **ppVtab,  
3a60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3a70: 4e 65 77 20 73 71 6c 69 74 65 33 5f 76 74 61 62  New sqlite3_vtab
3a80: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
3a90: 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20  r **pzErr       
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ab0: 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  OUT: sqlite3_mal
3ac0: 6c 6f 63 27 64 20 65 72 72 6f 72 20 6d 65 73 73  loc'd error mess
3ad0: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  age */.){.  retu
3ae0: 72 6e 20 66 74 73 35 49 6e 69 74 56 74 61 62 28  rn fts5InitVtab(
3af0: 30 2c 20 64 62 2c 20 70 41 75 78 2c 20 61 72 67  0, db, pAux, arg
3b00: 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c  c, argv, ppVtab,
3b10: 20 70 7a 45 72 72 29 3b 0a 7d 0a 73 74 61 74 69   pzErr);.}.stati
3b20: 63 20 69 6e 74 20 66 74 73 35 43 72 65 61 74 65  c int fts5Create
3b30: 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
3b40: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
3b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
3b60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3b70: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78   */.  void *pAux
3b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b90: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3ba0: 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61   to tokenizer ha
3bb0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  sh table */.  in
3bc0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3be0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3bf0: 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72 72 61  nts in argv arra
3c00: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
3c10: 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67 76 2c  r * const *argv,
3c20: 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
3c30: 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67 75 6d  e/xConnect argum
3c40: 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
3c50: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
3c60: 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  Vtab,          /
3c70: 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c 69 74  * OUT: New sqlit
3c80: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20 2a  e3_vtab object *
3c90: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c 69      /* OUT: sqli
3cc0: 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65 72 72  te3_malloc'd err
3cd0: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b  or message */.){
3ce0: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
3cf0: 69 74 56 74 61 62 28 31 2c 20 64 62 2c 20 70 41  itVtab(1, db, pA
3d00: 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  ux, argc, argv, 
3d10: 70 70 56 74 61 62 2c 20 70 7a 45 72 72 29 3b 0a  ppVtab, pzErr);.
3d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 69 66  }../*.** The dif
3d30: 66 65 72 65 6e 74 20 71 75 65 72 79 20 70 6c 61  ferent query pla
3d40: 6e 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ns..*/.#define F
3d50: 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 20 20  TS5_PLAN_MATCH  
3d60: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
3d70: 2f 2a 20 28 3c 74 62 6c 3e 20 4d 41 54 43 48 20  /* (<tbl> MATCH 
3d80: 3f 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  ?) */.#define FT
3d90: 53 35 5f 50 4c 41 4e 5f 53 4f 55 52 43 45 20 20  S5_PLAN_SOURCE  
3da0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 2f         2       /
3db0: 2a 20 41 20 73 6f 75 72 63 65 20 63 75 72 73 6f  * A source curso
3dc0: 72 20 66 6f 72 20 53 4f 52 54 45 44 5f 4d 41 54  r for SORTED_MAT
3dd0: 43 48 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  CH */.#define FT
3de0: 53 35 5f 50 4c 41 4e 5f 53 50 45 43 49 41 4c 20  S5_PLAN_SPECIAL 
3df0: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 2f         3       /
3e00: 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20 71 75  * An internal qu
3e10: 65 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ery */.#define F
3e20: 54 53 35 5f 50 4c 41 4e 5f 53 4f 52 54 45 44 5f  TS5_PLAN_SORTED_
3e30: 4d 41 54 43 48 20 20 20 34 20 20 20 20 20 20 20  MATCH   4       
3e40: 2f 2a 20 28 3c 74 62 6c 3e 20 4d 41 54 43 48 20  /* (<tbl> MATCH 
3e50: 3f 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 29  ? ORDER BY rank)
3e60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
3e70: 5f 50 4c 41 4e 5f 53 43 41 4e 20 20 20 20 20 20  _PLAN_SCAN      
3e80: 20 20 20 20 20 35 20 20 20 20 20 20 20 2f 2a 20       5       /* 
3e90: 4e 6f 20 75 73 61 62 6c 65 20 63 6f 6e 73 74 72  No usable constr
3ea0: 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  aint */.#define 
3eb0: 46 54 53 35 5f 50 4c 41 4e 5f 52 4f 57 49 44 20  FTS5_PLAN_ROWID 
3ec0: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
3ed0: 20 2f 2a 20 28 72 6f 77 69 64 20 3d 20 3f 29 20   /* (rowid = ?) 
3ee0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  */../*.** Set th
3ef0: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  e SQLITE_INDEX_S
3f00: 43 41 4e 5f 55 4e 49 51 55 45 20 66 6c 61 67 20  CAN_UNIQUE flag 
3f10: 69 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 66 6c 61  in pIdxInfo->fla
3f20: 67 73 2e 20 55 6e 6c 65 73 73 20 74 68 69 73 0a  gs. Unless this.
3f30: 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20  ** extension is 
3f40: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
3f50: 75 73 65 64 20 62 79 20 61 20 76 65 72 73 69 6f  used by a versio
3f60: 6e 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 6f 20  n of SQLite too 
3f70: 6f 6c 64 20 74 6f 0a 2a 2a 20 73 75 70 70 6f 72  old to.** suppor
3f80: 74 20 69 6e 64 65 78 2d 69 6e 66 6f 20 66 6c 61  t index-info fla
3f90: 67 73 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  gs. In that case
3fa0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
3fb0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
3fc0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
3fd0: 74 55 6e 69 71 75 65 46 6c 61 67 28 73 71 6c 69  tUniqueFlag(sqli
3fe0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
3ff0: 70 49 64 78 49 6e 66 6f 29 7b 0a 23 69 66 20 53  pIdxInfo){.#if S
4000: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
4010: 4d 42 45 52 3e 3d 33 30 30 38 30 31 32 0a 23 69  MBER>=3008012.#i
4020: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 52  fndef SQLITE_COR
4030: 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  E.  if( sqlite3_
4040: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
4050: 72 28 29 3e 3d 33 30 30 38 30 31 32 20 29 0a 23  r()>=3008012 ).#
4060: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 70 49  endif.  {.    pI
4070: 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
4080: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58   |= SQLITE_INDEX
4090: 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20  _SCAN_UNIQUE;.  
40a0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
40b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
40c0: 20 6f 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   of the xBestInd
40d0: 65 78 20 6d 65 74 68 6f 64 20 66 6f 72 20 46 54  ex method for FT
40e0: 53 35 20 74 61 62 6c 65 73 2e 20 57 69 74 68 69  S5 tables. Withi
40f0: 6e 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20  n the .** WHERE 
4100: 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69 74 20 73  constraint, it s
4110: 65 61 72 63 68 65 73 20 66 6f 72 20 74 68 65 20  earches for the 
4120: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
4130: 20 20 20 31 2e 20 41 20 4d 41 54 43 48 20 63 6f     1. A MATCH co
4140: 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e 73 74  nstraint against
4150: 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 6c   the special col
4160: 75 6d 6e 2e 0a 2a 2a 20 20 20 32 2e 20 41 20 4d  umn..**   2. A M
4170: 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20  ATCH constraint 
4180: 61 67 61 69 6e 73 74 20 74 68 65 20 22 72 61 6e  against the "ran
4190: 6b 22 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  k" column..**   
41a0: 33 2e 20 41 6e 20 3d 3d 20 63 6f 6e 73 74 72 61  3. An == constra
41b0: 69 6e 74 20 61 67 61 69 6e 73 74 20 74 68 65 20  int against the 
41c0: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  rowid column..**
41d0: 20 20 20 34 2e 20 41 20 3c 20 6f 72 20 3c 3d 20     4. A < or <= 
41e0: 63 6f 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e  constraint again
41f0: 73 74 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c  st the rowid col
4200: 75 6d 6e 2e 0a 2a 2a 20 20 20 35 2e 20 41 20 3e  umn..**   5. A >
4210: 20 6f 72 20 3e 3d 20 63 6f 6e 73 74 72 61 69 6e   or >= constrain
4220: 74 20 61 67 61 69 6e 73 74 20 74 68 65 20 72 6f  t against the ro
4230: 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  wid column..**.*
4240: 2a 20 57 69 74 68 69 6e 20 74 68 65 20 4f 52 44  * Within the ORD
4250: 45 52 20 42 59 2c 20 65 69 74 68 65 72 3a 0a 2a  ER BY, either:.*
4260: 2a 0a 2a 2a 20 20 20 35 2e 20 4f 52 44 45 52 20  *.**   5. ORDER 
4270: 42 59 20 72 61 6e 6b 20 5b 41 53 43 7c 44 45 53  BY rank [ASC|DES
4280: 43 5d 0a 2a 2a 20 20 20 36 2e 20 4f 52 44 45 52  C].**   6. ORDER
4290: 20 42 59 20 72 6f 77 69 64 20 5b 41 53 43 7c 44   BY rowid [ASC|D
42a0: 45 53 43 5d 0a 2a 2a 0a 2a 2a 20 43 6f 73 74 73  ESC].**.** Costs
42b0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 61 73   are assigned as
42c0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
42d0: 20 61 29 20 49 66 20 61 6e 20 75 6e 75 73 61 62   a) If an unusab
42e0: 6c 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f  le MATCH operato
42f0: 72 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  r is present in 
4300: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4310: 2c 20 74 68 65 0a 2a 2a 20 20 20 20 20 63 6f 73  , the.**     cos
4320: 74 20 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  t is uncondition
4330: 61 6c 6c 79 20 73 65 74 20 74 6f 20 31 65 35 30  ally set to 1e50
4340: 20 28 61 20 72 65 61 6c 6c 79 20 62 69 67 20 6e   (a really big n
4350: 75 6d 62 65 72 29 2e 0a 2a 2a 0a 2a 2a 20 20 61  umber)..**.**  a
4360: 29 20 49 66 20 61 20 4d 41 54 43 48 20 6f 70 65  ) If a MATCH ope
4370: 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 6e 74  rator is present
4380: 2c 20 74 68 65 20 63 6f 73 74 20 64 65 70 65 6e  , the cost depen
4390: 64 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 0a  ds on the other.
43a0: 2a 2a 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e  **     constrain
43b0: 74 73 20 61 6c 73 6f 20 70 72 65 73 65 6e 74 2e  ts also present.
43c0: 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   As follows:.**.
43d0: 2a 2a 20 20 20 20 20 20 20 2a 20 4e 6f 20 6f 74  **       * No ot
43e0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  her constraints:
43f0: 20 20 20 20 20 20 20 20 20 63 6f 73 74 3d 31 30           cost=10
4400: 30 30 2e 30 0a 2a 2a 20 20 20 20 20 20 20 2a 20  00.0.**       * 
4410: 4f 6e 65 20 72 6f 77 69 64 20 72 61 6e 67 65 20  One rowid range 
4420: 63 6f 6e 73 74 72 61 69 6e 74 3a 20 20 20 63 6f  constraint:   co
4430: 73 74 3d 37 35 30 2e 30 0a 2a 2a 20 20 20 20 20  st=750.0.**     
4440: 20 20 2a 20 42 6f 74 68 20 72 6f 77 69 64 20 72    * Both rowid r
4450: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
4460: 3a 20 63 6f 73 74 3d 35 30 30 2e 30 0a 2a 2a 20  : cost=500.0.** 
4470: 20 20 20 20 20 20 2a 20 41 6e 20 3d 3d 20 72 6f        * An == ro
4480: 77 69 64 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20  wid constraint: 
4490: 20 20 20 20 20 20 63 6f 73 74 3d 31 30 30 2e 30        cost=100.0
44a0: 0a 2a 2a 0a 2a 2a 20 20 62 29 20 4f 74 68 65 72  .**.**  b) Other
44b0: 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69  wise, if there i
44c0: 73 20 6e 6f 20 4d 41 54 43 48 3a 0a 2a 2a 0a 2a  s no MATCH:.**.*
44d0: 2a 20 20 20 20 20 20 20 2a 20 4e 6f 20 6f 74 68  *       * No oth
44e0: 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20  er constraints: 
44f0: 20 20 20 20 20 20 20 20 63 6f 73 74 3d 31 30 30          cost=100
4500: 30 30 30 30 2e 30 0a 2a 2a 20 20 20 20 20 20 20  0000.0.**       
4510: 2a 20 4f 6e 65 20 72 6f 77 69 64 20 72 61 6e 67  * One rowid rang
4520: 65 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20 20 20  e constraint:   
4530: 63 6f 73 74 3d 37 35 30 30 30 30 2e 30 0a 2a 2a  cost=750000.0.**
4540: 20 20 20 20 20 20 20 2a 20 42 6f 74 68 20 72 6f         * Both ro
4550: 77 69 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  wid range constr
4560: 61 69 6e 74 73 3a 20 63 6f 73 74 3d 32 35 30 30  aints: cost=2500
4570: 30 30 2e 30 0a 2a 2a 20 20 20 20 20 20 20 2a 20  00.0.**       * 
4580: 41 6e 20 3d 3d 20 72 6f 77 69 64 20 63 6f 6e 73  An == rowid cons
4590: 74 72 61 69 6e 74 3a 20 20 20 20 20 20 20 63 6f  traint:       co
45a0: 73 74 3d 31 30 2e 30 0a 2a 2a 0a 2a 2a 20 43 6f  st=10.0.**.** Co
45b0: 73 74 73 20 61 72 65 20 6e 6f 74 20 6d 6f 64 69  sts are not modi
45c0: 66 69 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  fied by the ORDE
45d0: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
45e0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42  static int fts5B
45f0: 65 73 74 49 6e 64 65 78 4d 65 74 68 6f 64 28 73  estIndexMethod(s
4600: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
4610: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
4620: 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  x_info *pInfo){.
4630: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
4640: 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
4650: 70 56 54 61 62 3b 0a 20 20 46 74 73 35 43 6f 6e  pVTab;.  Fts5Con
4660: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
4670: 54 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  Tab->pConfig;.  
4680: 63 6f 6e 73 74 20 69 6e 74 20 6e 43 6f 6c 20 3d  const int nCol =
4690: 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a   pConfig->nCol;.
46a0: 20 20 69 6e 74 20 69 64 78 46 6c 61 67 73 20 3d    int idxFlags =
46b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
46c0: 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 70    /* Parameter p
46d0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
46e0: 20 78 46 69 6c 74 65 72 28 29 20 2a 2f 0a 20 20   xFilter() */.  
46f0: 69 6e 74 20 62 48 61 73 4d 61 74 63 68 3b 0a 20  int bHasMatch;. 
4700: 20 69 6e 74 20 69 4e 65 78 74 3b 0a 20 20 69 6e   int iNext;.  in
4710: 74 20 69 3b 0a 0a 20 20 73 74 72 75 63 74 20 43  t i;..  struct C
4720: 6f 6e 73 74 72 61 69 6e 74 20 7b 0a 20 20 20 20  onstraint {.    
4730: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4750: 20 4d 61 73 6b 20 61 67 61 69 6e 73 74 20 73 71   Mask against sq
4760: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
4770: 74 72 61 69 6e 74 2e 6f 70 20 2a 2f 0a 20 20 20  traint.op */.   
4780: 20 69 6e 74 20 66 74 73 35 6f 70 3b 20 20 20 20   int fts5op;    
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47a0: 2a 20 46 54 53 35 20 6d 61 73 6b 20 66 6f 72 20  * FTS5 mask for 
47b0: 69 64 78 46 6c 61 67 73 20 2a 2f 0a 20 20 20 20  idxFlags */.    
47c0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
47e0: 20 30 3d 3d 72 6f 77 69 64 2c 20 31 3d 3d 74 62   0==rowid, 1==tb
47f0: 6c 2c 20 32 3d 3d 72 61 6e 6b 20 2a 2f 0a 20 20  l, 2==rank */.  
4800: 20 20 69 6e 74 20 6f 6d 69 74 3b 20 20 20 20 20    int omit;     
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
4830: 74 68 69 73 20 69 66 20 66 6f 75 6e 64 20 2a 2f  this if found */
4840: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6e 73 49 6e  .    int iConsIn
4850: 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
4860: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
4870: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
4880: 74 5b 5d 20 2a 2f 0a 20 20 7d 20 61 43 6f 6e 73  t[] */.  } aCons
4890: 74 72 61 69 6e 74 5b 5d 20 3d 20 7b 0a 20 20 20  traint[] = {.   
48a0: 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43   {SQLITE_INDEX_C
48b0: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 7c  ONSTRAINT_MATCH|
48c0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
48d0: 53 54 52 41 49 4e 54 5f 45 51 2c 20 0a 20 20 20  STRAINT_EQ, .   
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 46 54 53 35 5f 42 49 5f 4d 41 54 43 48 2c 20   FTS5_BI_MATCH, 
4910: 20 20 20 31 2c 20 31 2c 20 2d 31 7d 2c 0a 20 20     1, 1, -1},.  
4920: 20 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f    {SQLITE_INDEX_
4930: 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
4940: 7c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  |SQLITE_INDEX_CO
4950: 4e 53 54 52 41 49 4e 54 5f 45 51 2c 20 0a 20 20  NSTRAINT_EQ, .  
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 46 54 53 35 5f 42 49 5f 52 41 4e 4b 2c 20    FTS5_BI_RANK, 
4990: 20 20 20 20 32 2c 20 31 2c 20 2d 31 7d 2c 0a 20      2, 1, -1},. 
49a0: 20 20 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45 58     {SQLITE_INDEX
49b0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 2c 20  _CONSTRAINT_EQ, 
49c0: 20 20 20 46 54 53 35 5f 42 49 5f 52 4f 57 49 44     FTS5_BI_ROWID
49d0: 5f 45 51 2c 20 30 2c 20 30 2c 20 2d 31 7d 2c 0a  _EQ, 0, 0, -1},.
49e0: 20 20 20 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45      {SQLITE_INDE
49f0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 7c  X_CONSTRAINT_LT|
4a00: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
4a10: 53 54 52 41 49 4e 54 5f 4c 45 2c 20 0a 20 20 20  STRAINT_LE, .   
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a40: 20 46 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 4c   FTS5_BI_ROWID_L
4a50: 45 2c 20 30 2c 20 30 2c 20 2d 31 7d 2c 0a 20 20  E, 0, 0, -1},.  
4a60: 20 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f    {SQLITE_INDEX_
4a70: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 7c 53 51  CONSTRAINT_GT|SQ
4a80: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
4a90: 52 41 49 4e 54 5f 47 45 2c 20 0a 20 20 20 20 20  RAINT_GE, .     
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
4ac0: 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 47 45 2c  TS5_BI_ROWID_GE,
4ad0: 20 30 2c 20 30 2c 20 2d 31 7d 2c 0a 20 20 7d 3b   0, 0, -1},.  };
4ae0: 0a 0a 20 20 69 6e 74 20 61 43 6f 6c 4d 61 70 5b  ..  int aColMap[
4af0: 33 5d 3b 0a 20 20 61 43 6f 6c 4d 61 70 5b 30 5d  3];.  aColMap[0]
4b00: 20 3d 20 2d 31 3b 0a 20 20 61 43 6f 6c 4d 61 70   = -1;.  aColMap
4b10: 5b 31 5d 20 3d 20 6e 43 6f 6c 3b 0a 20 20 61 43  [1] = nCol;.  aC
4b20: 6f 6c 4d 61 70 5b 32 5d 20 3d 20 6e 43 6f 6c 2b  olMap[2] = nCol+
4b30: 31 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 69 64 78  1;..  /* Set idx
4b40: 46 6c 61 67 73 20 66 6c 61 67 73 20 66 6f 72 20  Flags flags for 
4b50: 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  all WHERE clause
4b60: 20 74 65 72 6d 73 20 74 68 61 74 20 77 69 6c 6c   terms that will
4b70: 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 66   be used. */.  f
4b80: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 66 6f 2d  or(i=0; i<pInfo-
4b90: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
4ba0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  +){.    struct s
4bb0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
4bc0: 73 74 72 61 69 6e 74 20 2a 70 20 3d 20 26 70 49  straint *p = &pI
4bd0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
4be0: 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  [i];.    int iCo
4bf0: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
4c00: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 6f 70 3d  .    if( (p->op=
4c10: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
4c20: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 26  NSTRAINT_MATCH &
4c30: 26 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  & iCol>=0 && iCo
4c40: 6c 3c 3d 6e 43 6f 6c 29 0a 20 20 20 20 20 7c 7c  l<=nCol).     ||
4c50: 20 28 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f   (p->op==SQLITE_
4c60: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
4c70: 5f 45 51 20 26 26 20 69 43 6f 6c 3d 3d 6e 43 6f  _EQ && iCol==nCo
4c80: 6c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  l).    ){.      
4c90: 2f 2a 20 41 20 4d 41 54 43 48 20 6f 70 65 72 61  /* A MATCH opera
4ca0: 74 6f 72 20 6f 72 20 65 71 75 69 76 61 6c 65 6e  tor or equivalen
4cb0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
4cc0: 2d 3e 75 73 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->usable ){.    
4cd0: 20 20 20 20 69 64 78 46 6c 61 67 73 20 3d 20 28      idxFlags = (
4ce0: 69 64 78 46 6c 61 67 73 20 26 20 30 78 46 46 46  idxFlags & 0xFFF
4cf0: 46 29 20 7c 20 46 54 53 35 5f 42 49 5f 4d 41 54  F) | FTS5_BI_MAT
4d00: 43 48 20 7c 20 28 69 43 6f 6c 20 3c 3c 20 31 36  CH | (iCol << 16
4d10: 29 3b 0a 20 20 20 20 20 20 20 20 61 43 6f 6e 73  );.        aCons
4d20: 74 72 61 69 6e 74 5b 30 5d 2e 69 43 6f 6e 73 49  traint[0].iConsI
4d30: 6e 64 65 78 20 3d 20 69 3b 0a 20 20 20 20 20 20  ndex = i;.      
4d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
4d50: 2a 20 41 73 20 74 68 65 72 65 20 65 78 69 73 74  * As there exist
4d60: 73 20 61 6e 20 75 6e 75 73 61 62 6c 65 20 4d 41  s an unusable MA
4d70: 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  TCH constraint t
4d80: 68 69 73 20 69 73 20 61 6e 20 0a 20 20 20 20 20  his is an .     
4d90: 20 20 20 2a 2a 20 75 6e 75 73 61 62 6c 65 20 70     ** unusable p
4da0: 6c 61 6e 2e 20 53 65 74 20 61 20 70 72 6f 68 69  lan. Set a prohi
4db0: 62 69 74 69 76 65 6c 79 20 68 69 67 68 20 63 6f  bitively high co
4dc0: 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  st. */.        p
4dd0: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
4de0: 6f 73 74 20 3d 20 31 65 35 30 3b 0a 20 20 20 20  ost = 1e50;.    
4df0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4e00: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
4e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4e20: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
4e30: 6a 3d 31 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=1; j<ArraySize
4e40: 28 61 43 6f 6e 73 74 72 61 69 6e 74 29 3b 20 6a  (aConstraint); j
4e50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
4e60: 75 63 74 20 43 6f 6e 73 74 72 61 69 6e 74 20 2a  uct Constraint *
4e70: 70 43 20 3d 20 26 61 43 6f 6e 73 74 72 61 69 6e  pC = &aConstrain
4e80: 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  t[j];.        if
4e90: 28 20 69 43 6f 6c 3d 3d 61 43 6f 6c 4d 61 70 5b  ( iCol==aColMap[
4ea0: 70 43 2d 3e 69 43 6f 6c 5d 20 26 26 20 70 2d 3e  pC->iCol] && p->
4eb0: 6f 70 20 26 20 70 43 2d 3e 6f 70 20 26 26 20 70  op & pC->op && p
4ec0: 2d 3e 75 73 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->usable ){.    
4ed0: 20 20 20 20 20 20 70 43 2d 3e 69 43 6f 6e 73 49        pC->iConsI
4ee0: 6e 64 65 78 20 3d 20 69 3b 0a 20 20 20 20 20 20  ndex = i;.      
4ef0: 20 20 20 20 69 64 78 46 6c 61 67 73 20 7c 3d 20      idxFlags |= 
4f00: 70 43 2d 3e 66 74 73 35 6f 70 3b 0a 20 20 20 20  pC->fts5op;.    
4f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4f20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
4f30: 74 20 69 64 78 46 6c 61 67 73 20 66 6c 61 67 73  t idxFlags flags
4f40: 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
4f50: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  Y clause */.  if
4f60: 28 20 70 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  ( pInfo->nOrderB
4f70: 79 3d 3d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20  y==1 ){.    int 
4f80: 69 53 6f 72 74 20 3d 20 70 49 6e 66 6f 2d 3e 61  iSort = pInfo->a
4f90: 4f 72 64 65 72 42 79 5b 30 5d 2e 69 43 6f 6c 75  OrderBy[0].iColu
4fa0: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 69 53 6f 72  mn;.    if( iSor
4fb0: 74 3d 3d 28 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  t==(pConfig->nCo
4fc0: 6c 2b 31 29 20 26 26 20 42 69 74 46 6c 61 67 54  l+1) && BitFlagT
4fd0: 65 73 74 28 69 64 78 46 6c 61 67 73 2c 20 46 54  est(idxFlags, FT
4fe0: 53 35 5f 42 49 5f 4d 41 54 43 48 29 20 29 7b 0a  S5_BI_MATCH) ){.
4ff0: 20 20 20 20 20 20 69 64 78 46 6c 61 67 73 20 7c        idxFlags |
5000: 3d 20 46 54 53 35 5f 42 49 5f 4f 52 44 45 52 5f  = FTS5_BI_ORDER_
5010: 52 41 4e 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RANK;.    }else 
5020: 69 66 28 20 69 53 6f 72 74 3d 3d 2d 31 20 29 7b  if( iSort==-1 ){
5030: 0a 20 20 20 20 20 20 69 64 78 46 6c 61 67 73 20  .      idxFlags 
5040: 7c 3d 20 46 54 53 35 5f 42 49 5f 4f 52 44 45 52  |= FTS5_BI_ORDER
5050: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20  _ROWID;.    }.  
5060: 20 20 69 66 28 20 42 69 74 46 6c 61 67 54 65 73    if( BitFlagTes
5070: 74 28 69 64 78 46 6c 61 67 73 2c 20 46 54 53 35  t(idxFlags, FTS5
5080: 5f 42 49 5f 4f 52 44 45 52 5f 52 41 4e 4b 7c 46  _BI_ORDER_RANK|F
5090: 54 53 35 5f 42 49 5f 4f 52 44 45 52 5f 52 4f 57  TS5_BI_ORDER_ROW
50a0: 49 44 29 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ID) ){.      pIn
50b0: 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
50c0: 6d 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  med = 1;.      i
50d0: 66 28 20 70 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  f( pInfo->aOrder
50e0: 42 79 5b 30 5d 2e 64 65 73 63 20 29 7b 0a 20 20  By[0].desc ){.  
50f0: 20 20 20 20 20 20 69 64 78 46 6c 61 67 73 20 7c        idxFlags |
5100: 3d 20 46 54 53 35 5f 42 49 5f 4f 52 44 45 52 5f  = FTS5_BI_ORDER_
5110: 44 45 53 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DESC;.      }.  
5120: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 61    }.  }..  /* Ca
5130: 6c 63 75 6c 61 74 65 20 74 68 65 20 65 73 74 69  lculate the esti
5140: 6d 61 74 65 64 20 63 6f 73 74 20 62 61 73 65 64  mated cost based
5150: 20 6f 6e 20 74 68 65 20 66 6c 61 67 73 20 73 65   on the flags se
5160: 74 20 69 6e 20 69 64 78 46 6c 61 67 73 2e 20 2a  t in idxFlags. *
5170: 2f 0a 20 20 62 48 61 73 4d 61 74 63 68 20 3d 20  /.  bHasMatch = 
5180: 42 69 74 46 6c 61 67 54 65 73 74 28 69 64 78 46  BitFlagTest(idxF
5190: 6c 61 67 73 2c 20 46 54 53 35 5f 42 49 5f 4d 41  lags, FTS5_BI_MA
51a0: 54 43 48 29 3b 0a 20 20 69 66 28 20 42 69 74 46  TCH);.  if( BitF
51b0: 6c 61 67 54 65 73 74 28 69 64 78 46 6c 61 67 73  lagTest(idxFlags
51c0: 2c 20 46 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f  , FTS5_BI_ROWID_
51d0: 45 51 29 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  EQ) ){.    pInfo
51e0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
51f0: 3d 20 62 48 61 73 4d 61 74 63 68 20 3f 20 31 30  = bHasMatch ? 10
5200: 30 2e 30 20 3a 20 31 30 2e 30 3b 0a 20 20 20 20  0.0 : 10.0;.    
5210: 69 66 28 20 62 48 61 73 4d 61 74 63 68 3d 3d 30  if( bHasMatch==0
5220: 20 29 20 66 74 73 35 53 65 74 55 6e 69 71 75 65   ) fts5SetUnique
5230: 46 6c 61 67 28 70 49 6e 66 6f 29 3b 0a 20 20 7d  Flag(pInfo);.  }
5240: 65 6c 73 65 20 69 66 28 20 42 69 74 46 6c 61 67  else if( BitFlag
5250: 41 6c 6c 54 65 73 74 28 69 64 78 46 6c 61 67 73  AllTest(idxFlags
5260: 2c 20 46 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f  , FTS5_BI_ROWID_
5270: 4c 45 7c 46 54 53 35 5f 42 49 5f 52 4f 57 49 44  LE|FTS5_BI_ROWID
5280: 5f 47 45 29 20 29 7b 0a 20 20 20 20 70 49 6e 66  _GE) ){.    pInf
5290: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
52a0: 20 3d 20 62 48 61 73 4d 61 74 63 68 20 3f 20 35   = bHasMatch ? 5
52b0: 30 30 2e 30 20 3a 20 32 35 30 30 30 30 2e 30 3b  00.0 : 250000.0;
52c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 42 69 74  .  }else if( Bit
52d0: 46 6c 61 67 54 65 73 74 28 69 64 78 46 6c 61 67  FlagTest(idxFlag
52e0: 73 2c 20 46 54 53 35 5f 42 49 5f 52 4f 57 49 44  s, FTS5_BI_ROWID
52f0: 5f 4c 45 7c 46 54 53 35 5f 42 49 5f 52 4f 57 49  _LE|FTS5_BI_ROWI
5300: 44 5f 47 45 29 20 29 7b 0a 20 20 20 20 70 49 6e  D_GE) ){.    pIn
5310: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
5320: 74 20 3d 20 62 48 61 73 4d 61 74 63 68 20 3f 20  t = bHasMatch ? 
5330: 37 35 30 2e 30 20 3a 20 37 35 30 30 30 30 2e 30  750.0 : 750000.0
5340: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5350: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
5360: 6f 73 74 20 3d 20 62 48 61 73 4d 61 74 63 68 20  ost = bHasMatch 
5370: 3f 20 31 30 30 30 2e 30 20 3a 20 31 30 30 30 30  ? 1000.0 : 10000
5380: 30 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  00.0;.  }..  /* 
5390: 41 73 73 69 67 6e 20 61 72 67 76 49 6e 64 65 78  Assign argvIndex
53a0: 20 76 61 6c 75 65 73 20 74 6f 20 65 61 63 68 20   values to each 
53b0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 75 73  constraint in us
53c0: 65 2e 20 2a 2f 0a 20 20 69 4e 65 78 74 20 3d 20  e. */.  iNext = 
53d0: 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
53e0: 41 72 72 61 79 53 69 7a 65 28 61 43 6f 6e 73 74  ArraySize(aConst
53f0: 72 61 69 6e 74 29 3b 20 69 2b 2b 29 7b 0a 20 20  raint); i++){.  
5400: 20 20 73 74 72 75 63 74 20 43 6f 6e 73 74 72 61    struct Constra
5410: 69 6e 74 20 2a 70 43 20 3d 20 26 61 43 6f 6e 73  int *pC = &aCons
5420: 74 72 61 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  traint[i];.    i
5430: 66 28 20 70 43 2d 3e 69 43 6f 6e 73 49 6e 64 65  f( pC->iConsInde
5440: 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  x>=0 ){.      pI
5450: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
5460: 55 73 61 67 65 5b 70 43 2d 3e 69 43 6f 6e 73 49  Usage[pC->iConsI
5470: 6e 64 65 78 5d 2e 61 72 67 76 49 6e 64 65 78 20  ndex].argvIndex 
5480: 3d 20 69 4e 65 78 74 2b 2b 3b 0a 20 20 20 20 20  = iNext++;.     
5490: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61   pInfo->aConstra
54a0: 69 6e 74 55 73 61 67 65 5b 70 43 2d 3e 69 43 6f  intUsage[pC->iCo
54b0: 6e 73 49 6e 64 65 78 5d 2e 6f 6d 69 74 20 3d 20  nsIndex].omit = 
54c0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
54d0: 43 2d 3e 6f 6d 69 74 3b 0a 20 20 20 20 7d 0a 20  C->omit;.    }. 
54e0: 20 7d 0a 0a 20 20 70 49 6e 66 6f 2d 3e 69 64 78   }..  pInfo->idx
54f0: 4e 75 6d 20 3d 20 69 64 78 46 6c 61 67 73 3b 0a  Num = idxFlags;.
5500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5510: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
5520: 74 20 66 74 73 35 4e 65 77 54 72 61 6e 73 61 63  t fts5NewTransac
5530: 74 69 6f 6e 28 46 74 73 35 54 61 62 6c 65 20 2a  tion(Fts5Table *
5540: 70 54 61 62 29 7b 0a 20 20 46 74 73 35 43 75 72  pTab){.  Fts5Cur
5550: 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 66 6f 72  sor *pCsr;.  for
5560: 28 70 43 73 72 3d 70 54 61 62 2d 3e 70 47 6c 6f  (pCsr=pTab->pGlo
5570: 62 61 6c 2d 3e 70 43 73 72 3b 20 70 43 73 72 3b  bal->pCsr; pCsr;
5580: 20 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78   pCsr=pCsr->pNex
5590: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 73 72  t){.    if( pCsr
55a0: 2d 3e 62 61 73 65 2e 70 56 74 61 62 3d 3d 28 73  ->base.pVtab==(s
55b0: 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 54 61  qlite3_vtab*)pTa
55c0: 62 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  b ) return SQLIT
55d0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
55e0: 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  rn sqlite3Fts5St
55f0: 6f 72 61 67 65 52 65 73 65 74 28 70 54 61 62 2d  orageReset(pTab-
5600: 3e 70 53 74 6f 72 61 67 65 29 3b 0a 7d 0a 0a 2f  >pStorage);.}../
5610: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5620: 69 6f 6e 20 6f 66 20 78 4f 70 65 6e 20 6d 65 74  ion of xOpen met
5630: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
5640: 6e 74 20 66 74 73 35 4f 70 65 6e 4d 65 74 68 6f  nt fts5OpenMetho
5650: 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  d(sqlite3_vtab *
5660: 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  pVTab, sqlite3_v
5670: 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
5680: 73 72 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65  sr){.  Fts5Table
5690: 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54 61   *pTab = (Fts5Ta
56a0: 62 6c 65 2a 29 70 56 54 61 62 3b 0a 20 20 46 74  ble*)pVTab;.  Ft
56b0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
56c0: 67 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69  g = pTab->pConfi
56d0: 67 3b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20  g;.  Fts5Cursor 
56e0: 2a 70 43 73 72 20 3d 20 30 3b 20 20 20 20 20 20  *pCsr = 0;      
56f0: 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 75 72 73       /* New curs
5700: 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  or object */.  i
5710: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5730: 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
5740: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
5750: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
5780: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35   */..  rc = fts5
5790: 4e 65 77 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  NewTransaction(p
57a0: 54 61 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Tab);.  if( rc==
57b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
57c0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
57d0: 46 74 73 35 43 75 72 73 6f 72 29 20 2b 20 70 43  Fts5Cursor) + pC
57e0: 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20 2a 20 73 69  onfig->nCol * si
57f0: 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20 20 20 70  zeof(int);.    p
5800: 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f  Csr = (Fts5Curso
5810: 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  r*)sqlite3_mallo
5820: 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  c(nByte);.    if
5830: 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20 20 20  ( pCsr ){.      
5840: 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f  Fts5Global *pGlo
5850: 62 61 6c 20 3d 20 70 54 61 62 2d 3e 70 47 6c 6f  bal = pTab->pGlo
5860: 62 61 6c 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  bal;.      memse
5870: 74 28 70 43 73 72 2c 20 30 2c 20 6e 42 79 74 65  t(pCsr, 0, nByte
5880: 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61  );.      pCsr->a
5890: 43 6f 6c 75 6d 6e 53 69 7a 65 20 3d 20 28 69 6e  ColumnSize = (in
58a0: 74 2a 29 26 70 43 73 72 5b 31 5d 3b 0a 20 20 20  t*)&pCsr[1];.   
58b0: 20 20 20 70 43 73 72 2d 3e 70 4e 65 78 74 20 3d     pCsr->pNext =
58c0: 20 70 47 6c 6f 62 61 6c 2d 3e 70 43 73 72 3b 0a   pGlobal->pCsr;.
58d0: 20 20 20 20 20 20 70 47 6c 6f 62 61 6c 2d 3e 70        pGlobal->p
58e0: 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 20 20  Csr = pCsr;.    
58f0: 20 20 70 43 73 72 2d 3e 69 43 73 72 49 64 20 3d    pCsr->iCsrId =
5900: 20 2b 2b 70 47 6c 6f 62 61 6c 2d 3e 69 4e 65 78   ++pGlobal->iNex
5910: 74 49 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  tId;.    }else{.
5920: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5930: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
5940: 20 7d 0a 20 20 2a 70 70 43 73 72 20 3d 20 28 73   }.  *ppCsr = (s
5950: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
5960: 6f 72 2a 29 70 43 73 72 3b 0a 20 20 72 65 74 75  or*)pCsr;.  retu
5970: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
5980: 20 69 6e 74 20 66 74 73 35 53 74 6d 74 54 79 70   int fts5StmtTyp
5990: 65 28 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43  e(Fts5Cursor *pC
59a0: 73 72 29 7b 0a 20 20 69 66 28 20 70 43 73 72 2d  sr){.  if( pCsr-
59b0: 3e 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c 41  >ePlan==FTS5_PLA
59c0: 4e 5f 53 43 41 4e 20 29 7b 0a 20 20 20 20 72 65  N_SCAN ){.    re
59d0: 74 75 72 6e 20 28 70 43 73 72 2d 3e 62 44 65 73  turn (pCsr->bDes
59e0: 63 29 20 3f 20 46 54 53 35 5f 53 54 4d 54 5f 53  c) ? FTS5_STMT_S
59f0: 43 41 4e 5f 44 45 53 43 20 3a 20 46 54 53 35 5f  CAN_DESC : FTS5_
5a00: 53 54 4d 54 5f 53 43 41 4e 5f 41 53 43 3b 0a 20  STMT_SCAN_ASC;. 
5a10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 54 53 35   }.  return FTS5
5a20: 5f 53 54 4d 54 5f 4c 4f 4f 4b 55 50 3b 0a 7d 0a  _STMT_LOOKUP;.}.
5a30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
5a40: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
5a50: 66 74 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  fter the cursor 
5a60: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
5a70: 6c 79 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  ly argument.** i
5a80: 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
5a90: 20 61 74 20 61 20 64 69 66 66 65 72 65 6e 74 20   at a different 
5aa0: 72 6f 77 2e 20 49 74 20 63 6c 65 61 72 73 20 61  row. It clears a
5ab0: 6c 6c 20 63 61 63 68 65 64 20 64 61 74 61 20 0a  ll cached data .
5ac0: 2a 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  ** specific to t
5ad0: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
5ae0: 73 74 6f 72 65 64 20 62 79 20 74 68 65 20 63 75  stored by the cu
5af0: 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  rsor object..*/.
5b00: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
5b10: 43 73 72 4e 65 77 72 6f 77 28 46 74 73 35 43 75  CsrNewrow(Fts5Cu
5b20: 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 43  rsor *pCsr){.  C
5b30: 73 72 46 6c 61 67 53 65 74 28 70 43 73 72 2c 20  srFlagSet(pCsr, 
5b40: 0a 20 20 20 20 20 20 46 54 53 35 43 53 52 5f 52  .      FTS5CSR_R
5b50: 45 51 55 49 52 45 5f 43 4f 4e 54 45 4e 54 20 0a  EQUIRE_CONTENT .
5b60: 20 20 20 20 7c 20 46 54 53 35 43 53 52 5f 52 45      | FTS5CSR_RE
5b70: 51 55 49 52 45 5f 44 4f 43 53 49 5a 45 20 0a 20  QUIRE_DOCSIZE . 
5b80: 20 20 20 7c 20 46 54 53 35 43 53 52 5f 52 45 51     | FTS5CSR_REQ
5b90: 55 49 52 45 5f 49 4e 53 54 20 0a 20 20 20 20 7c  UIRE_INST .    |
5ba0: 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52 45   FTS5CSR_REQUIRE
5bb0: 5f 50 4f 53 4c 49 53 54 20 0a 20 20 29 3b 0a 7d  _POSLIST .  );.}
5bc0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
5bd0: 73 35 46 72 65 65 43 75 72 73 6f 72 43 6f 6d 70  s5FreeCursorComp
5be0: 6f 6e 65 6e 74 73 28 46 74 73 35 43 75 72 73 6f  onents(Fts5Curso
5bf0: 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 35  r *pCsr){.  Fts5
5c00: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
5c10: 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72 2d  ts5Table*)(pCsr-
5c20: 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a 20 20  >base.pVtab);.  
5c30: 46 74 73 35 41 75 78 64 61 74 61 20 2a 70 44 61  Fts5Auxdata *pDa
5c40: 74 61 3b 0a 20 20 46 74 73 35 41 75 78 64 61 74  ta;.  Fts5Auxdat
5c50: 61 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 73 71 6c  a *pNext;..  sql
5c60: 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
5c70: 61 49 6e 73 74 49 74 65 72 29 3b 0a 20 20 73 71  aInstIter);.  sq
5c80: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d  lite3_free(pCsr-
5c90: 3e 61 49 6e 73 74 29 3b 0a 20 20 69 66 28 20 70  >aInst);.  if( p
5ca0: 43 73 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  Csr->pStmt ){.  
5cb0: 20 20 69 6e 74 20 65 53 74 6d 74 20 3d 20 66 74    int eStmt = ft
5cc0: 73 35 53 74 6d 74 54 79 70 65 28 70 43 73 72 29  s5StmtType(pCsr)
5cd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
5ce0: 35 53 74 6f 72 61 67 65 53 74 6d 74 52 65 6c 65  5StorageStmtRele
5cf0: 61 73 65 28 70 54 61 62 2d 3e 70 53 74 6f 72 61  ase(pTab->pStora
5d00: 67 65 2c 20 65 53 74 6d 74 2c 20 70 43 73 72 2d  ge, eStmt, pCsr-
5d10: 3e 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 69  >pStmt);.  }.  i
5d20: 66 28 20 70 43 73 72 2d 3e 70 53 6f 72 74 65 72  f( pCsr->pSorter
5d30: 20 29 7b 0a 20 20 20 20 46 74 73 35 53 6f 72 74   ){.    Fts5Sort
5d40: 65 72 20 2a 70 53 6f 72 74 65 72 20 3d 20 70 43  er *pSorter = pC
5d50: 73 72 2d 3e 70 53 6f 72 74 65 72 3b 0a 20 20 20  sr->pSorter;.   
5d60: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
5d70: 65 28 70 53 6f 72 74 65 72 2d 3e 70 53 74 6d 74  e(pSorter->pStmt
5d80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5d90: 72 65 65 28 70 53 6f 72 74 65 72 29 3b 0a 20 20  ree(pSorter);.  
5da0: 7d 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65  }..  if( pCsr->e
5db0: 50 6c 61 6e 21 3d 46 54 53 35 5f 50 4c 41 4e 5f  Plan!=FTS5_PLAN_
5dc0: 53 4f 55 52 43 45 20 29 7b 0a 20 20 20 20 73 71  SOURCE ){.    sq
5dd0: 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 72 65  lite3Fts5ExprFre
5de0: 65 28 70 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a  e(pCsr->pExpr);.
5df0: 20 20 7d 0a 0a 20 20 66 6f 72 28 70 44 61 74 61    }..  for(pData
5e00: 3d 70 43 73 72 2d 3e 70 41 75 78 64 61 74 61 3b  =pCsr->pAuxdata;
5e10: 20 70 44 61 74 61 3b 20 70 44 61 74 61 3d 70 4e   pData; pData=pN
5e20: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
5e30: 3d 20 70 44 61 74 61 2d 3e 70 4e 65 78 74 3b 0a  = pData->pNext;.
5e40: 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 78      if( pData->x
5e50: 44 65 6c 65 74 65 20 29 20 70 44 61 74 61 2d 3e  Delete ) pData->
5e60: 78 44 65 6c 65 74 65 28 70 44 61 74 61 2d 3e 70  xDelete(pData->p
5e70: 50 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Ptr);.    sqlite
5e80: 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20  3_free(pData);. 
5e90: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   }..  sqlite3_fi
5ea0: 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 52 61  nalize(pCsr->pRa
5eb0: 6e 6b 41 72 67 53 74 6d 74 29 3b 0a 20 20 73 71  nkArgStmt);.  sq
5ec0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d  lite3_free(pCsr-
5ed0: 3e 61 70 52 61 6e 6b 41 72 67 29 3b 0a 0a 20 20  >apRankArg);..  
5ee0: 69 66 28 20 43 73 72 46 6c 61 67 54 65 73 74 28  if( CsrFlagTest(
5ef0: 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 46 52  pCsr, FTS5CSR_FR
5f00: 45 45 5f 5a 52 41 4e 4b 29 20 29 7b 0a 20 20 20  EE_ZRANK) ){.   
5f10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5f20: 73 72 2d 3e 7a 52 61 6e 6b 29 3b 0a 20 20 20 20  sr->zRank);.    
5f30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
5f40: 72 2d 3e 7a 52 61 6e 6b 41 72 67 73 29 3b 0a 20  r->zRankArgs);. 
5f50: 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 26 70 43   }..  memset(&pC
5f60: 73 72 2d 3e 65 50 6c 61 6e 2c 20 30 2c 20 73 69  sr->ePlan, 0, si
5f70: 7a 65 6f 66 28 46 74 73 35 43 75 72 73 6f 72 29  zeof(Fts5Cursor)
5f80: 20 2d 20 28 28 75 38 2a 29 26 70 43 73 72 2d 3e   - ((u8*)&pCsr->
5f90: 65 50 6c 61 6e 20 2d 20 28 75 38 2a 29 70 43 73  ePlan - (u8*)pCs
5fa0: 72 29 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  r));.}.../*.** C
5fb0: 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
5fc0: 20 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c    For additional
5fd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 65 65   information see
5fe0: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
5ff0: 6f 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 78 43 6c  on.** on the xCl
6000: 6f 73 65 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  ose method of th
6010: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
6020: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
6030: 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6c 6f  atic int fts5Clo
6040: 73 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  seMethod(sqlite3
6050: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
6060: 75 72 73 6f 72 29 7b 0a 20 20 69 66 28 20 70 43  ursor){.  if( pC
6070: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 46 74 73  ursor ){.    Fts
6080: 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  5Table *pTab = (
6090: 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43 75 72  Fts5Table*)(pCur
60a0: 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20  sor->pVtab);.   
60b0: 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73   Fts5Cursor *pCs
60c0: 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a  r = (Fts5Cursor*
60d0: 29 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 46 74  )pCursor;.    Ft
60e0: 73 35 43 75 72 73 6f 72 20 2a 2a 70 70 3b 0a 0a  s5Cursor **pp;..
60f0: 20 20 20 20 66 74 73 35 46 72 65 65 43 75 72 73      fts5FreeCurs
6100: 6f 72 43 6f 6d 70 6f 6e 65 6e 74 73 28 70 43 73  orComponents(pCs
6110: 72 29 3b 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  r);.    /* Remov
6120: 65 20 74 68 65 20 63 75 72 73 6f 72 20 66 72 6f  e the cursor fro
6130: 6d 20 74 68 65 20 46 74 73 35 47 6c 6f 62 61 6c  m the Fts5Global
6140: 2e 70 43 73 72 20 6c 69 73 74 20 2a 2f 0a 20 20  .pCsr list */.  
6150: 20 20 66 6f 72 28 70 70 3d 26 70 54 61 62 2d 3e    for(pp=&pTab->
6160: 70 47 6c 6f 62 61 6c 2d 3e 70 43 73 72 3b 20 28  pGlobal->pCsr; (
6170: 2a 70 70 29 21 3d 70 43 73 72 3b 20 70 70 3d 26  *pp)!=pCsr; pp=&
6180: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 3b 0a 20  (*pp)->pNext);. 
6190: 20 20 20 2a 70 70 20 3d 20 70 43 73 72 2d 3e 70     *pp = pCsr->p
61a0: 4e 65 78 74 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Next;..    sqlit
61b0: 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20  e3_free(pCsr);. 
61c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
61d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
61e0: 20 69 6e 74 20 66 74 73 35 53 6f 72 74 65 72 4e   int fts5SorterN
61f0: 65 78 74 28 46 74 73 35 43 75 72 73 6f 72 20 2a  ext(Fts5Cursor *
6200: 70 43 73 72 29 7b 0a 20 20 46 74 73 35 53 6f 72  pCsr){.  Fts5Sor
6210: 74 65 72 20 2a 70 53 6f 72 74 65 72 20 3d 20 70  ter *pSorter = p
6220: 43 73 72 2d 3e 70 53 6f 72 74 65 72 3b 0a 20 20  Csr->pSorter;.  
6230: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
6240: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 6f  sqlite3_step(pSo
6250: 72 74 65 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  rter->pStmt);.  
6260: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
6270: 4f 4e 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ONE ){.    rc = 
6280: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 43  SQLITE_OK;.    C
6290: 73 72 46 6c 61 67 53 65 74 28 70 43 73 72 2c 20  srFlagSet(pCsr, 
62a0: 46 54 53 35 43 53 52 5f 45 4f 46 29 3b 0a 20 20  FTS5CSR_EOF);.  
62b0: 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
62c0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
62d0: 63 6f 6e 73 74 20 75 38 20 2a 61 3b 0a 20 20 20  const u8 *a;.   
62e0: 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62   const u8 *aBlob
62f0: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 3b  ;.    int nBlob;
6300: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6310: 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  int iOff = 0;.  
6320: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
6330: 3b 0a 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e  ;..    pSorter->
6340: 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
6350: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
6360: 6f 72 74 65 72 2d 3e 70 53 74 6d 74 2c 20 30 29  orter->pStmt, 0)
6370: 3b 0a 20 20 20 20 6e 42 6c 6f 62 20 3d 20 73 71  ;.    nBlob = sq
6380: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
6390: 65 73 28 70 53 6f 72 74 65 72 2d 3e 70 53 74 6d  es(pSorter->pStm
63a0: 74 2c 20 31 29 3b 0a 20 20 20 20 61 42 6c 6f 62  t, 1);.    aBlob
63b0: 20 3d 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63   = a = sqlite3_c
63c0: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 6f 72 74  olumn_blob(pSort
63d0: 65 72 2d 3e 70 53 74 6d 74 2c 20 31 29 3b 0a 0a  er->pStmt, 1);..
63e0: 20 20 20 20 2f 2a 20 6e 42 6c 6f 62 3d 3d 30 20      /* nBlob==0 
63f0: 69 6e 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d  in detail=none m
6400: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ode. */.    if( 
6410: 6e 42 6c 6f 62 3e 30 20 29 7b 0a 20 20 20 20 20  nBlob>0 ){.     
6420: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 70 53 6f   for(i=0; i<(pSo
6430: 72 74 65 72 2d 3e 6e 49 64 78 2d 31 29 3b 20 69  rter->nIdx-1); i
6440: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
6450: 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 61   iVal;.        a
6460: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
6470: 74 33 32 28 61 2c 20 69 56 61 6c 29 3b 0a 20 20  t32(a, iVal);.  
6480: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 69 56        iOff += iV
6490: 61 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 6f 72  al;.        pSor
64a0: 74 65 72 2d 3e 61 49 64 78 5b 69 5d 20 3d 20 69  ter->aIdx[i] = i
64b0: 4f 66 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Off;.      }.   
64c0: 20 20 20 70 53 6f 72 74 65 72 2d 3e 61 49 64 78     pSorter->aIdx
64d0: 5b 69 5d 20 3d 20 26 61 42 6c 6f 62 5b 6e 42 6c  [i] = &aBlob[nBl
64e0: 6f 62 5d 20 2d 20 61 3b 0a 20 20 20 20 20 20 70  ob] - a;.      p
64f0: 53 6f 72 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74  Sorter->aPoslist
6500: 20 3d 20 61 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = a;.    }..   
6510: 20 66 74 73 35 43 73 72 4e 65 77 72 6f 77 28 70   fts5CsrNewrow(p
6520: 43 73 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Csr);.  }..  ret
6530: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
6540: 2a 20 53 65 74 20 74 68 65 20 46 54 53 35 43 53  * Set the FTS5CS
6550: 52 5f 52 45 51 55 49 52 45 5f 52 45 53 45 45 4b  R_REQUIRE_RESEEK
6560: 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 46 54 53   flag on all FTS
6570: 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 20 63 75 72  5_PLAN_MATCH cur
6580: 73 6f 72 73 20 0a 2a 2a 20 6f 70 65 6e 20 6f 6e  sors .** open on
6590: 20 74 61 62 6c 65 20 70 54 61 62 2e 0a 2a 2f 0a   table pTab..*/.
65a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
65b0: 54 72 69 70 43 75 72 73 6f 72 73 28 46 74 73 35  TripCursors(Fts5
65c0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
65d0: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
65e0: 3b 0a 20 20 66 6f 72 28 70 43 73 72 3d 70 54 61  ;.  for(pCsr=pTa
65f0: 62 2d 3e 70 47 6c 6f 62 61 6c 2d 3e 70 43 73 72  b->pGlobal->pCsr
6600: 3b 20 70 43 73 72 3b 20 70 43 73 72 3d 70 43 73  ; pCsr; pCsr=pCs
6610: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
6620: 66 28 20 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d  f( pCsr->ePlan==
6630: 46 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 0a  FTS5_PLAN_MATCH.
6640: 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e 62 61       && pCsr->ba
6650: 73 65 2e 70 56 74 61 62 3d 3d 28 73 71 6c 69 74  se.pVtab==(sqlit
6660: 65 33 5f 76 74 61 62 2a 29 70 54 61 62 20 0a 20  e3_vtab*)pTab . 
6670: 20 20 20 29 7b 0a 20 20 20 20 20 20 43 73 72 46     ){.      CsrF
6680: 6c 61 67 53 65 74 28 70 43 73 72 2c 20 46 54 53  lagSet(pCsr, FTS
6690: 35 43 53 52 5f 52 45 51 55 49 52 45 5f 52 45 53  5CSR_REQUIRE_RES
66a0: 45 45 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EEK);.    }.  }.
66b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
66c0: 52 45 51 55 49 52 45 5f 52 45 53 45 45 4b 20 66  REQUIRE_RESEEK f
66d0: 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
66e0: 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  e cursor passed 
66f0: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
6700: 61 72 67 75 6d 65 6e 74 2c 20 63 6c 6f 73 65 20  argument, close 
6710: 61 6e 64 20 72 65 6f 70 65 6e 20 61 6c 6c 20 46  and reopen all F
6720: 74 73 35 49 6e 64 65 78 49 74 65 72 20 69 74 65  ts5IndexIter ite
6730: 72 61 74 6f 72 73 20 74 68 61 74 20 74 68 65 20  rators that the 
6740: 63 75 72 73 6f 72 20 0a 2a 2a 20 69 73 20 75 73  cursor .** is us
6750: 69 6e 67 2e 20 54 68 65 6e 20 61 74 74 65 6d 70  ing. Then attemp
6760: 74 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 75  t to move the cu
6770: 72 73 6f 72 20 74 6f 20 61 20 72 6f 77 69 64 20  rsor to a rowid 
6780: 65 71 75 61 6c 20 74 6f 20 6f 72 20 6c 61 73 74  equal to or last
6790: 65 72 0a 2a 2a 20 28 69 6e 20 74 68 65 20 63 75  er.** (in the cu
67a0: 72 73 6f 72 73 20 73 6f 72 74 20 6f 72 64 65 72  rsors sort order
67b0: 20 2d 20 41 53 43 20 6f 72 20 44 45 53 43 29 20   - ASC or DESC) 
67c0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
67d0: 20 72 6f 77 69 64 2e 20 0a 2a 2a 0a 2a 2a 20 49   rowid. .**.** I
67e0: 66 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20  f the new rowid 
67f0: 69 73 20 6e 6f 74 20 65 71 75 61 6c 20 74 6f 20  is not equal to 
6800: 74 68 65 20 6f 6c 64 2c 20 73 65 74 20 6f 75 74  the old, set out
6810: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
6820: 62 53 6b 69 70 0a 2a 2a 20 74 6f 20 31 20 62 65  bSkip.** to 1 be
6830: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
6840: 4f 74 68 65 72 77 69 73 65 2c 20 6c 65 61 76 65  Otherwise, leave
6850: 20 69 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   it unchanged..*
6860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
6870: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
6880: 66 75 6c 20 6f 72 20 69 66 20 6e 6f 20 72 65 73  ful or if no res
6890: 65 65 6b 20 77 61 73 20 72 65 71 75 69 72 65 64  eek was required
68a0: 2c 20 6f 72 20 61 6e 20 0a 2a 2a 20 65 72 72 6f  , or an .** erro
68b0: 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
68c0: 6f 72 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2f 0a  or occurred..*/.
68d0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43  static int fts5C
68e0: 75 72 73 6f 72 52 65 73 65 65 6b 28 46 74 73 35  ursorReseek(Fts5
68f0: 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e  Cursor *pCsr, in
6900: 74 20 2a 70 62 53 6b 69 70 29 7b 0a 20 20 69 6e  t *pbSkip){.  in
6910: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6920: 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 62 53  ;.  assert( *pbS
6930: 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  kip==0 );.  if( 
6940: 43 73 72 46 6c 61 67 54 65 73 74 28 70 43 73 72  CsrFlagTest(pCsr
6950: 2c 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52  , FTS5CSR_REQUIR
6960: 45 5f 52 45 53 45 45 4b 29 20 29 7b 0a 20 20 20  E_RESEEK) ){.   
6970: 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62   Fts5Table *pTab
6980: 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29 28   = (Fts5Table*)(
6990: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
69a0: 29 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 73 63  );.    int bDesc
69b0: 20 3d 20 70 43 73 72 2d 3e 62 44 65 73 63 3b 0a   = pCsr->bDesc;.
69c0: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
69d0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
69e0: 52 6f 77 69 64 28 70 43 73 72 2d 3e 70 45 78 70  Rowid(pCsr->pExp
69f0: 72 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  r);..    rc = sq
6a00: 6c 69 74 65 33 46 74 73 35 45 78 70 72 46 69 72  lite3Fts5ExprFir
6a10: 73 74 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20  st(pCsr->pExpr, 
6a20: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 69 52  pTab->pIndex, iR
6a30: 6f 77 69 64 2c 20 62 44 65 73 63 29 3b 0a 20 20  owid, bDesc);.  
6a40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6a50: 5f 4f 4b 20 26 26 20 20 69 52 6f 77 69 64 21 3d  _OK &&  iRowid!=
6a60: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 52  sqlite3Fts5ExprR
6a70: 6f 77 69 64 28 70 43 73 72 2d 3e 70 45 78 70 72  owid(pCsr->pExpr
6a80: 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 53 6b  ) ){.      *pbSk
6a90: 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ip = 1;.    }.. 
6aa0: 20 20 20 43 73 72 46 6c 61 67 43 6c 65 61 72 28     CsrFlagClear(
6ab0: 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 52 45  pCsr, FTS5CSR_RE
6ac0: 51 55 49 52 45 5f 52 45 53 45 45 4b 29 3b 0a 20  QUIRE_RESEEK);. 
6ad0: 20 20 20 66 74 73 35 43 73 72 4e 65 77 72 6f 77     fts5CsrNewrow
6ae0: 28 70 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCsr);.    if( 
6af0: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 45  sqlite3Fts5ExprE
6b00: 6f 66 28 70 43 73 72 2d 3e 70 45 78 70 72 29 20  of(pCsr->pExpr) 
6b10: 29 7b 0a 20 20 20 20 20 20 43 73 72 46 6c 61 67  ){.      CsrFlag
6b20: 53 65 74 28 70 43 73 72 2c 20 46 54 53 35 43 53  Set(pCsr, FTS5CS
6b30: 52 5f 45 4f 46 29 3b 0a 20 20 20 20 20 20 2a 70  R_EOF);.      *p
6b40: 62 53 6b 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d  bSkip = 1;.    }
6b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6b60: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  ;.}.../*.** Adva
6b70: 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
6b80: 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  o the next row i
6b90: 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
6ba0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 0a 2a 2a   matches the .**
6bb0: 20 73 65 61 72 63 68 20 63 72 69 74 65 72 69 61   search criteria
6bc0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
6bd0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 6e 6f 74 68  QLITE_OK if noth
6be0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20  ing goes wrong. 
6bf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
6c00: 74 75 72 6e 65 64 0a 2a 2a 20 65 76 65 6e 20 69  turned.** even i
6c10: 66 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f  f we reach end-o
6c20: 66 2d 66 69 6c 65 2e 20 20 54 68 65 20 66 74 73  f-file.  The fts
6c30: 35 45 6f 66 4d 65 74 68 6f 64 28 29 20 77 69 6c  5EofMethod() wil
6c40: 6c 20 62 65 20 63 61 6c 6c 65 64 0a 2a 2a 20 73  l be called.** s
6c50: 75 62 73 65 71 75 65 6e 74 6c 79 20 74 6f 20 64  ubsequently to d
6c60: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
6c70: 20 6f 72 20 6e 6f 74 20 61 6e 20 45 4f 46 20 77   or not an EOF w
6c80: 61 73 20 68 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  as hit..*/.stati
6c90: 63 20 69 6e 74 20 66 74 73 35 4e 65 78 74 4d 65  c int fts5NextMe
6ca0: 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
6cb0: 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  b_cursor *pCurso
6cc0: 72 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72  r){.  Fts5Cursor
6cd0: 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75   *pCsr = (Fts5Cu
6ce0: 72 73 6f 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20  rsor*)pCursor;. 
6cf0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
6d00: 72 74 28 20 28 70 43 73 72 2d 3e 65 50 6c 61 6e  rt( (pCsr->ePlan
6d10: 3c 33 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  <3)==.          
6d20: 28 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54  (pCsr->ePlan==FT
6d30: 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 20 7c 7c  S5_PLAN_MATCH ||
6d40: 20 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54   pCsr->ePlan==FT
6d50: 53 35 5f 50 4c 41 4e 5f 53 4f 55 52 43 45 29 20  S5_PLAN_SOURCE) 
6d60: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
6d70: 21 43 73 72 46 6c 61 67 54 65 73 74 28 70 43 73  !CsrFlagTest(pCs
6d80: 72 2c 20 46 54 53 35 43 53 52 5f 45 4f 46 29 20  r, FTS5CSR_EOF) 
6d90: 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  );..  if( pCsr->
6da0: 65 50 6c 61 6e 3c 33 20 29 7b 0a 20 20 20 20 69  ePlan<3 ){.    i
6db0: 6e 74 20 62 53 6b 69 70 20 3d 20 30 3b 0a 20 20  nt bSkip = 0;.  
6dc0: 20 20 69 66 28 20 28 72 63 20 3d 20 66 74 73 35    if( (rc = fts5
6dd0: 43 75 72 73 6f 72 52 65 73 65 65 6b 28 70 43 73  CursorReseek(pCs
6de0: 72 2c 20 26 62 53 6b 69 70 29 29 20 7c 7c 20 62  r, &bSkip)) || b
6df0: 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20 72 63  Skip ) return rc
6e00: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
6e10: 65 33 46 74 73 35 45 78 70 72 4e 65 78 74 28 70  e3Fts5ExprNext(p
6e20: 43 73 72 2d 3e 70 45 78 70 72 2c 20 70 43 73 72  Csr->pExpr, pCsr
6e30: 2d 3e 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20  ->iLastRowid);. 
6e40: 20 20 20 43 73 72 46 6c 61 67 53 65 74 28 70 43     CsrFlagSet(pC
6e50: 73 72 2c 20 73 71 6c 69 74 65 33 46 74 73 35 45  sr, sqlite3Fts5E
6e60: 78 70 72 45 6f 66 28 70 43 73 72 2d 3e 70 45 78  xprEof(pCsr->pEx
6e70: 70 72 29 29 3b 0a 20 20 20 20 66 74 73 35 43 73  pr));.    fts5Cs
6e80: 72 4e 65 77 72 6f 77 28 70 43 73 72 29 3b 0a 20  rNewrow(pCsr);. 
6e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 77 69 74   }else{.    swit
6ea0: 63 68 28 20 70 43 73 72 2d 3e 65 50 6c 61 6e 20  ch( pCsr->ePlan 
6eb0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 46 54  ){.      case FT
6ec0: 53 35 5f 50 4c 41 4e 5f 53 50 45 43 49 41 4c 3a  S5_PLAN_SPECIAL:
6ed0: 20 7b 0a 20 20 20 20 20 20 20 20 43 73 72 46 6c   {.        CsrFl
6ee0: 61 67 53 65 74 28 70 43 73 72 2c 20 46 54 53 35  agSet(pCsr, FTS5
6ef0: 43 53 52 5f 45 4f 46 29 3b 0a 20 20 20 20 20 20  CSR_EOF);.      
6f00: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
6f10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6f20: 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
6f30: 20 20 63 61 73 65 20 46 54 53 35 5f 50 4c 41 4e    case FTS5_PLAN
6f40: 5f 53 4f 52 54 45 44 5f 4d 41 54 43 48 3a 20 7b  _SORTED_MATCH: {
6f50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
6f60: 73 35 53 6f 72 74 65 72 4e 65 78 74 28 70 43 73  s5SorterNext(pCs
6f70: 72 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  r);.        brea
6f80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  k;.      }.  .  
6f90: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
6fa0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6fb0: 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 53 74  3_step(pCsr->pSt
6fc0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mt);.        if(
6fd0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
6fe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 73 72  ){.          Csr
6ff0: 46 6c 61 67 53 65 74 28 70 43 73 72 2c 20 46 54  FlagSet(pCsr, FT
7000: 53 35 43 53 52 5f 45 4f 46 29 3b 0a 20 20 20 20  S5CSR_EOF);.    
7010: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7020: 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70  e3_reset(pCsr->p
7030: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Stmt);.        }
7040: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7050: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
7060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7080: 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72   }.  .  return r
7090: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  c;.}...static in
70a0: 74 20 66 74 73 35 50 72 65 70 61 72 65 53 74 61  t fts5PrepareSta
70b0: 74 65 6d 65 6e 74 28 0a 20 20 73 71 6c 69 74 65  tement(.  sqlite
70c0: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
70d0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
70e0: 43 6f 6e 66 69 67 2c 20 0a 20 20 63 6f 6e 73 74  Config, .  const
70f0: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 0a 20 20 2e   char *zFmt,.  .
7100: 2e 2e 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ...){.  sqlite3_
7110: 73 74 6d 74 20 2a 70 52 65 74 20 3d 20 30 3b 0a  stmt *pRet = 0;.
7120: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
7130: 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 6c 69 73   *zSql;.  va_lis
7140: 74 20 61 70 3b 0a 0a 20 20 76 61 5f 73 74 61 72  t ap;..  va_star
7150: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a  t(ap, zFmt);.  z
7160: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Sql = sqlite3_vm
7170: 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
7180: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
7190: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
71a0: 54 45 5f 4e 4f 4d 45 4d 3b 20 0a 20 20 7d 65 6c  TE_NOMEM; .  }el
71b0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
71c0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28  ite3_prepare_v3(
71d0: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
71e0: 6c 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  l, -1, .        
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45 50 41      SQLITE_PREPA
7210: 52 45 5f 50 45 52 53 49 53 54 45 4e 54 2c 20 26  RE_PERSISTENT, &
7220: 70 52 65 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  pRet, 0);.    if
7230: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7240: 29 7b 0a 20 20 20 20 20 20 2a 70 43 6f 6e 66 69  ){.      *pConfi
7250: 67 2d 3e 70 7a 45 72 72 6d 73 67 20 3d 20 73 71  g->pzErrmsg = sq
7260: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
7270: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
7280: 73 67 28 70 43 6f 6e 66 69 67 2d 3e 64 62 29 29  sg(pConfig->db))
7290: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
72a0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
72b0: 20 20 7d 0a 0a 20 20 76 61 5f 65 6e 64 28 61 70    }..  va_end(ap
72c0: 29 3b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 70  );.  *ppStmt = p
72d0: 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Ret;.  return rc
72e0: 3b 0a 7d 20 0a 0a 73 74 61 74 69 63 20 69 6e 74  ;.} ..static int
72f0: 20 66 74 73 35 43 75 72 73 6f 72 46 69 72 73 74   fts5CursorFirst
7300: 53 6f 72 74 65 64 28 46 74 73 35 54 61 62 6c 65  Sorted(Fts5Table
7310: 20 2a 70 54 61 62 2c 20 46 74 73 35 43 75 72 73   *pTab, Fts5Curs
7320: 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 44  or *pCsr, int bD
7330: 65 73 63 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  esc){.  Fts5Conf
7340: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 54  ig *pConfig = pT
7350: 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46  ab->pConfig;.  F
7360: 74 73 35 53 6f 72 74 65 72 20 2a 70 53 6f 72 74  ts5Sorter *pSort
7370: 65 72 3b 0a 20 20 69 6e 74 20 6e 50 68 72 61 73  er;.  int nPhras
7380: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
7390: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
73a0: 74 20 63 68 61 72 20 2a 7a 52 61 6e 6b 20 3d 20  t char *zRank = 
73b0: 70 43 73 72 2d 3e 7a 52 61 6e 6b 3b 0a 20 20 63  pCsr->zRank;.  c
73c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e 6b  onst char *zRank
73d0: 41 72 67 73 20 3d 20 70 43 73 72 2d 3e 7a 52 61  Args = pCsr->zRa
73e0: 6e 6b 41 72 67 73 3b 0a 20 20 0a 20 20 6e 50 68  nkArgs;.  .  nPh
73f0: 72 61 73 65 20 3d 20 73 71 6c 69 74 65 33 46 74  rase = sqlite3Ft
7400: 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 75 6e  s5ExprPhraseCoun
7410: 74 28 70 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a  t(pCsr->pExpr);.
7420: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
7430: 28 46 74 73 35 53 6f 72 74 65 72 29 20 2b 20 73  (Fts5Sorter) + s
7440: 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 28 6e 50  izeof(int) * (nP
7450: 68 72 61 73 65 2d 31 29 3b 0a 20 20 70 53 6f 72  hrase-1);.  pSor
7460: 74 65 72 20 3d 20 28 46 74 73 35 53 6f 72 74 65  ter = (Fts5Sorte
7470: 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  r*)sqlite3_mallo
7480: 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  c(nByte);.  if( 
7490: 70 53 6f 72 74 65 72 3d 3d 30 20 29 20 72 65 74  pSorter==0 ) ret
74a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
74b0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53 6f 72 74  ;.  memset(pSort
74c0: 65 72 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  er, 0, nByte);. 
74d0: 20 70 53 6f 72 74 65 72 2d 3e 6e 49 64 78 20 3d   pSorter->nIdx =
74e0: 20 6e 50 68 72 61 73 65 3b 0a 0a 20 20 2f 2a 20   nPhrase;..  /* 
74f0: 54 4f 44 4f 3a 20 49 74 20 77 6f 75 6c 64 20 62  TODO: It would b
7500: 65 20 62 65 74 74 65 72 20 74 6f 20 68 61 76 65  e better to have
7510: 20 73 6f 6d 65 20 73 79 73 74 65 6d 20 66 6f 72   some system for
7520: 20 72 65 75 73 69 6e 67 20 73 74 61 74 65 6d 65   reusing stateme
7530: 6e 74 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 73 20  nt.  ** handles 
7540: 68 65 72 65 2c 20 72 61 74 68 65 72 20 74 68 61  here, rather tha
7550: 6e 20 70 72 65 70 61 72 69 6e 67 20 61 20 6e 65  n preparing a ne
7560: 77 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 71  w one for each q
7570: 75 65 72 79 2e 20 42 75 74 20 74 68 61 74 0a 20  uery. But that. 
7580: 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
7590: 62 6c 65 20 61 73 20 53 51 4c 69 74 65 20 72 65  ble as SQLite re
75a0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 74  ference counts t
75b0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
75c0: 20 6f 62 6a 65 63 74 73 2e 0a 20 20 2a 2a 20 41   objects..  ** A
75d0: 6e 64 20 73 69 6e 63 65 20 74 68 65 20 73 74 61  nd since the sta
75e0: 74 65 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  tement required 
75f0: 68 65 72 65 20 72 65 61 64 73 20 66 72 6f 6d 20  here reads from 
7600: 74 68 69 73 20 76 65 72 79 20 76 69 72 74 75 61  this very virtua
7610: 6c 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 73  l .  ** table, s
7620: 61 76 69 6e 67 20 69 74 20 63 72 65 61 74 65 73  aving it creates
7630: 20 61 20 63 69 72 63 75 6c 61 72 20 72 65 66 65   a circular refe
7640: 72 65 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rence..  **.  **
7650: 20 49 66 20 53 51 4c 69 74 65 20 61 20 62 75 69   If SQLite a bui
7660: 6c 74 2d 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  lt-in statement 
7670: 63 61 63 68 65 2c 20 74 68 69 73 20 77 6f 75 6c  cache, this woul
7680: 64 6e 27 74 20 62 65 20 61 20 70 72 6f 62 6c 65  dn't be a proble
7690: 6d 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  m. */.  rc = fts
76a0: 35 50 72 65 70 61 72 65 53 74 61 74 65 6d 65 6e  5PrepareStatemen
76b0: 74 28 26 70 53 6f 72 74 65 72 2d 3e 70 53 74 6d  t(&pSorter->pStm
76c0: 74 2c 20 70 43 6f 6e 66 69 67 2c 0a 20 20 20 20  t, pConfig,.    
76d0: 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 2c    "SELECT rowid,
76e0: 20 72 61 6e 6b 20 46 52 4f 4d 20 25 51 2e 25 51   rank FROM %Q.%Q
76f0: 20 4f 52 44 45 52 20 42 59 20 25 73 28 25 73 25   ORDER BY %s(%s%
7700: 73 25 73 29 20 25 73 22 2c 0a 20 20 20 20 20 20  s%s) %s",.      
7710: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
7720: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 7a 52  onfig->zName, zR
7730: 61 6e 6b 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  ank, pConfig->zN
7740: 61 6d 65 2c 0a 20 20 20 20 20 20 28 7a 52 61 6e  ame,.      (zRan
7750: 6b 41 72 67 73 20 3f 20 22 2c 20 22 20 3a 20 22  kArgs ? ", " : "
7760: 22 29 2c 0a 20 20 20 20 20 20 28 7a 52 61 6e 6b  "),.      (zRank
7770: 41 72 67 73 20 3f 20 7a 52 61 6e 6b 41 72 67 73  Args ? zRankArgs
7780: 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 62 44   : ""),.      bD
7790: 65 73 63 20 3f 20 22 44 45 53 43 22 20 3a 20 22  esc ? "DESC" : "
77a0: 41 53 43 22 0a 20 20 29 3b 0a 0a 20 20 70 43 73  ASC".  );..  pCs
77b0: 72 2d 3e 70 53 6f 72 74 65 72 20 3d 20 70 53 6f  r->pSorter = pSo
77c0: 72 74 65 72 3b 0a 20 20 69 66 28 20 72 63 3d 3d  rter;.  if( rc==
77d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
77e0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
77f0: 53 6f 72 74 43 73 72 3d 3d 30 20 29 3b 0a 20 20  SortCsr==0 );.  
7800: 20 20 70 54 61 62 2d 3e 70 53 6f 72 74 43 73 72    pTab->pSortCsr
7810: 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 72 63 20   = pCsr;.    rc 
7820: 3d 20 66 74 73 35 53 6f 72 74 65 72 4e 65 78 74  = fts5SorterNext
7830: 28 70 43 73 72 29 3b 0a 20 20 20 20 70 54 61 62  (pCsr);.    pTab
7840: 2d 3e 70 53 6f 72 74 43 73 72 20 3d 20 30 3b 0a  ->pSortCsr = 0;.
7850: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
7860: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7870: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
7880: 28 70 53 6f 72 74 65 72 2d 3e 70 53 74 6d 74 29  (pSorter->pStmt)
7890: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
78a0: 65 65 28 70 53 6f 72 74 65 72 29 3b 0a 20 20 20  ee(pSorter);.   
78b0: 20 70 43 73 72 2d 3e 70 53 6f 72 74 65 72 20 3d   pCsr->pSorter =
78c0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
78d0: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
78e0: 69 6e 74 20 66 74 73 35 43 75 72 73 6f 72 46 69  int fts5CursorFi
78f0: 72 73 74 28 46 74 73 35 54 61 62 6c 65 20 2a 70  rst(Fts5Table *p
7900: 54 61 62 2c 20 46 74 73 35 43 75 72 73 6f 72 20  Tab, Fts5Cursor 
7910: 2a 70 43 73 72 2c 20 69 6e 74 20 62 44 65 73 63  *pCsr, int bDesc
7920: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  ){.  int rc;.  F
7930: 74 73 35 45 78 70 72 20 2a 70 45 78 70 72 20 3d  ts5Expr *pExpr =
7940: 20 70 43 73 72 2d 3e 70 45 78 70 72 3b 0a 20 20   pCsr->pExpr;.  
7950: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
7960: 45 78 70 72 46 69 72 73 74 28 70 45 78 70 72 2c  ExprFirst(pExpr,
7970: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 70   pTab->pIndex, p
7980: 43 73 72 2d 3e 69 46 69 72 73 74 52 6f 77 69 64  Csr->iFirstRowid
7990: 2c 20 62 44 65 73 63 29 3b 0a 20 20 69 66 28 20  , bDesc);.  if( 
79a0: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 45  sqlite3Fts5ExprE
79b0: 6f 66 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  of(pExpr) ){.   
79c0: 20 43 73 72 46 6c 61 67 53 65 74 28 70 43 73 72   CsrFlagSet(pCsr
79d0: 2c 20 46 54 53 35 43 53 52 5f 45 4f 46 29 3b 0a  , FTS5CSR_EOF);.
79e0: 20 20 7d 0a 20 20 66 74 73 35 43 73 72 4e 65 77    }.  fts5CsrNew
79f0: 72 6f 77 28 70 43 73 72 29 3b 0a 20 20 72 65 74  row(pCsr);.  ret
7a00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7a10: 20 50 72 6f 63 65 73 73 20 61 20 22 73 70 65 63   Process a "spec
7a20: 69 61 6c 22 20 71 75 65 72 79 2e 20 41 20 73 70  ial" query. A sp
7a30: 65 63 69 61 6c 20 71 75 65 72 79 20 69 73 20 69  ecial query is i
7a40: 64 65 6e 74 69 66 69 65 64 20 61 73 20 6f 6e 65  dentified as one
7a50: 20 77 69 74 68 20 61 0a 2a 2a 20 4d 41 54 43 48   with a.** MATCH
7a60: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7a70: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 27   begins with a '
7a80: 2a 27 20 63 68 61 72 61 63 74 65 72 2e 20 54 68  *' character. Th
7a90: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 0a 2a  e remainder of.*
7aa0: 2a 20 74 68 65 20 74 65 78 74 20 70 61 73 73 65  * the text passe
7ab0: 64 20 74 6f 20 74 68 65 20 4d 41 54 43 48 20 6f  d to the MATCH o
7ac0: 70 65 72 61 74 6f 72 20 61 72 65 20 75 73 65 64  perator are used
7ad0: 20 61 73 20 20 74 68 65 20 73 70 65 63 69 61 6c   as  the special
7ae0: 20 71 75 65 72 79 0a 2a 2a 20 70 61 72 61 6d 65   query.** parame
7af0: 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
7b00: 69 6e 74 20 66 74 73 35 53 70 65 63 69 61 6c 4d  int fts5SpecialM
7b10: 61 74 63 68 28 0a 20 20 46 74 73 35 54 61 62 6c  atch(.  Fts5Tabl
7b20: 65 20 2a 70 54 61 62 2c 20 0a 20 20 46 74 73 35  e *pTab, .  Fts5
7b30: 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20  Cursor *pCsr, . 
7b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75   const char *zQu
7b50: 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  ery.){.  int rc 
7b60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7b80: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  rn code */.  con
7b90: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 51 75  st char *z = zQu
7ba0: 65 72 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ery;         /* 
7bb0: 53 70 65 63 69 61 6c 20 71 75 65 72 79 20 74 65  Special query te
7bc0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  xt */.  int n;  
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bf0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 65  r of bytes in te
7c00: 78 74 20 61 74 20 7a 20 2a 2f 0a 0a 20 20 77 68  xt at z */..  wh
7c10: 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29  ile( z[0]==' ' )
7c20: 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b   z++;.  for(n=0;
7c30: 20 7a 5b 6e 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27   z[n] && z[n]!='
7c40: 20 27 3b 20 6e 2b 2b 29 3b 0a 0a 20 20 61 73 73   '; n++);..  ass
7c50: 65 72 74 28 20 70 54 61 62 2d 3e 62 61 73 65 2e  ert( pTab->base.
7c60: 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20  zErrMsg==0 );.  
7c70: 70 43 73 72 2d 3e 65 50 6c 61 6e 20 3d 20 46 54  pCsr->ePlan = FT
7c80: 53 35 5f 50 4c 41 4e 5f 53 50 45 43 49 41 4c 3b  S5_PLAN_SPECIAL;
7c90: 0a 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ..  if( 0==sqlit
7ca0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 72 65 61  e3_strnicmp("rea
7cb0: 64 73 22 2c 20 7a 2c 20 6e 29 20 29 7b 0a 20 20  ds", z, n) ){.  
7cc0: 20 20 70 43 73 72 2d 3e 69 53 70 65 63 69 61 6c    pCsr->iSpecial
7cd0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
7ce0: 64 65 78 52 65 61 64 73 28 70 54 61 62 2d 3e 70  dexReads(pTab->p
7cf0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 65 6c  Index);.  }.  el
7d00: 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  se if( 0==sqlite
7d10: 33 5f 73 74 72 6e 69 63 6d 70 28 22 69 64 22 2c  3_strnicmp("id",
7d20: 20 7a 2c 20 6e 29 20 29 7b 0a 20 20 20 20 70 43   z, n) ){.    pC
7d30: 73 72 2d 3e 69 53 70 65 63 69 61 6c 20 3d 20 70  sr->iSpecial = p
7d40: 43 73 72 2d 3e 69 43 73 72 49 64 3b 0a 20 20 7d  Csr->iCsrId;.  }
7d50: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20  .  else{.    /* 
7d60: 41 6e 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  An unrecognized 
7d70: 64 69 72 65 63 74 69 76 65 2e 20 52 65 74 75 72  directive. Retur
7d80: 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  n an error messa
7d90: 67 65 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d  ge. */.    pTab-
7da0: 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20  >base.zErrMsg = 
7db0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7dc0: 22 75 6e 6b 6e 6f 77 6e 20 73 70 65 63 69 61 6c  "unknown special
7dd0: 20 71 75 65 72 79 3a 20 25 2e 2a 73 22 2c 20 6e   query: %.*s", n
7de0: 2c 20 7a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  , z);.    rc = S
7df0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
7e00: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
7e10: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
7e20: 6f 72 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  or an auxiliary 
7e30: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 7a  function named z
7e40: 4e 61 6d 65 20 74 68 61 74 20 63 61 6e 20 62 65  Name that can be
7e50: 20 75 73 65 64 20 77 69 74 68 20 74 61 62 6c 65   used with table
7e60: 0a 2a 2a 20 70 54 61 62 2e 20 49 66 20 6f 6e 65  .** pTab. If one
7e70: 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
7e80: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
7e90: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7ea0: 20 46 74 73 35 41 75 78 69 6c 69 61 72 79 0a 2a   Fts5Auxiliary.*
7eb0: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68  * structure. Oth
7ec0: 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 73 75  erwise, if no su
7ed0: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
7ee0: 74 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  ts, return NULL.
7ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 41  .*/.static Fts5A
7f00: 75 78 69 6c 69 61 72 79 20 2a 66 74 73 35 46 69  uxiliary *fts5Fi
7f10: 6e 64 41 75 78 69 6c 69 61 72 79 28 46 74 73 35  ndAuxiliary(Fts5
7f20: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
7f30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
7f40: 0a 20 20 46 74 73 35 41 75 78 69 6c 69 61 72 79  .  Fts5Auxiliary
7f50: 20 2a 70 41 75 78 3b 0a 0a 20 20 66 6f 72 28 70   *pAux;..  for(p
7f60: 41 75 78 3d 70 54 61 62 2d 3e 70 47 6c 6f 62 61  Aux=pTab->pGloba
7f70: 6c 2d 3e 70 41 75 78 3b 20 70 41 75 78 3b 20 70  l->pAux; pAux; p
7f80: 41 75 78 3d 70 41 75 78 2d 3e 70 4e 65 78 74 29  Aux=pAux->pNext)
7f90: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
7fa0: 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c  3_stricmp(zName,
7fb0: 20 70 41 75 78 2d 3e 7a 46 75 6e 63 29 3d 3d 30   pAux->zFunc)==0
7fc0: 20 29 20 72 65 74 75 72 6e 20 70 41 75 78 3b 0a   ) return pAux;.
7fd0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 66 75 6e    }..  /* No fun
7fe0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65  ction of the spe
7ff0: 63 69 66 69 65 64 20 6e 61 6d 65 20 77 61 73 20  cified name was 
8000: 66 6f 75 6e 64 2e 20 52 65 74 75 72 6e 20 30 2e  found. Return 0.
8010: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
8020: 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  }...static int f
8030: 74 73 35 46 69 6e 64 52 61 6e 6b 46 75 6e 63 74  ts5FindRankFunct
8040: 69 6f 6e 28 46 74 73 35 43 75 72 73 6f 72 20 2a  ion(Fts5Cursor *
8050: 70 43 73 72 29 7b 0a 20 20 46 74 73 35 54 61 62  pCsr){.  Fts5Tab
8060: 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
8070: 54 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61  Table*)(pCsr->ba
8080: 73 65 2e 70 56 74 61 62 29 3b 0a 20 20 46 74 73  se.pVtab);.  Fts
8090: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
80a0: 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67   = pTab->pConfig
80b0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
80c0: 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 41 75  ITE_OK;.  Fts5Au
80d0: 78 69 6c 69 61 72 79 20 2a 70 41 75 78 20 3d 20  xiliary *pAux = 
80e0: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
80f0: 2a 7a 52 61 6e 6b 20 3d 20 70 43 73 72 2d 3e 7a  *zRank = pCsr->z
8100: 52 61 6e 6b 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Rank;.  const ch
8110: 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73 20 3d 20  ar *zRankArgs = 
8120: 70 43 73 72 2d 3e 7a 52 61 6e 6b 41 72 67 73 3b  pCsr->zRankArgs;
8130: 0a 0a 20 20 69 66 28 20 7a 52 61 6e 6b 41 72 67  ..  if( zRankArg
8140: 73 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  s ){.    char *z
8150: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Sql = sqlite3Fts
8160: 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 53  5Mprintf(&rc, "S
8170: 45 4c 45 43 54 20 25 73 22 2c 20 7a 52 61 6e 6b  ELECT %s", zRank
8180: 41 72 67 73 29 3b 0a 20 20 20 20 69 66 28 20 7a  Args);.    if( z
8190: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Sql ){.      sql
81a0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
81b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
81c0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
81d0: 5f 76 33 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v3(pConfig->db,
81e0: 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20 20 20 20 20   zSql, -1,.     
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
8210: 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45  PREPARE_PERSISTE
8220: 4e 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  NT, &pStmt, 0);.
8230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8240: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ee(zSql);.      
8250: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
8260: 54 45 5f 4f 4b 20 7c 7c 20 70 43 73 72 2d 3e 70  TE_OK || pCsr->p
8270: 52 61 6e 6b 41 72 67 53 74 6d 74 3d 3d 30 20 29  RankArgStmt==0 )
8280: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
8290: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
82a0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
82b0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
82c0: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
82d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
82e0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d  .          pCsr-
82f0: 3e 6e 52 61 6e 6b 41 72 67 20 3d 20 73 71 6c 69  >nRankArg = sqli
8300: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
8310: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
8320: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
8330: 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  f(sqlite3_value*
8340: 29 2a 70 43 73 72 2d 3e 6e 52 61 6e 6b 41 72 67  )*pCsr->nRankArg
8350: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72  ;.          pCsr
8360: 2d 3e 61 70 52 61 6e 6b 41 72 67 20 3d 20 28 73  ->apRankArg = (s
8370: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 73  qlite3_value**)s
8380: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
8390: 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29  Zero(&rc, nByte)
83a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
83b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
83c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
83d0: 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
83e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
83f0: 3e 6e 52 61 6e 6b 41 72 67 3b 20 69 2b 2b 29 7b  >nRankArg; i++){
8400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8410: 43 73 72 2d 3e 61 70 52 61 6e 6b 41 72 67 5b 69  Csr->apRankArg[i
8420: 5d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ] = sqlite3_colu
8430: 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20  mn_value(pStmt, 
8440: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
8450: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
8460: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 70 52          pCsr->pR
8470: 61 6e 6b 41 72 67 53 74 6d 74 20 3d 20 70 53 74  ankArgStmt = pSt
8480: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  mt;.        }els
8490: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
84a0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
84b0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
84c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
84d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
84e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
84f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
8500: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8510: 7b 0a 20 20 20 20 70 41 75 78 20 3d 20 66 74 73  {.    pAux = fts
8520: 35 46 69 6e 64 41 75 78 69 6c 69 61 72 79 28 70  5FindAuxiliary(p
8530: 54 61 62 2c 20 7a 52 61 6e 6b 29 3b 0a 20 20 20  Tab, zRank);.   
8540: 20 69 66 28 20 70 41 75 78 3d 3d 30 20 29 7b 0a   if( pAux==0 ){.
8550: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
8560: 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67  ab->base.zErrMsg
8570: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
8580: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20  b->base.zErrMsg 
8590: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
85a0: 66 28 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  f("no such funct
85b0: 69 6f 6e 3a 20 25 73 22 2c 20 7a 52 61 6e 6b 29  ion: %s", zRank)
85c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
85d0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
85e0: 0a 20 20 7d 0a 0a 20 20 70 43 73 72 2d 3e 70 52  .  }..  pCsr->pR
85f0: 61 6e 6b 20 3d 20 70 41 75 78 3b 0a 20 20 72 65  ank = pAux;.  re
8600: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
8610: 74 69 63 20 69 6e 74 20 66 74 73 35 43 75 72 73  tic int fts5Curs
8620: 6f 72 50 61 72 73 65 52 61 6e 6b 28 0a 20 20 46  orParseRank(.  F
8630: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
8640: 69 67 2c 0a 20 20 46 74 73 35 43 75 72 73 6f 72  ig,.  Fts5Cursor
8650: 20 2a 70 43 73 72 2c 20 0a 20 20 73 71 6c 69 74   *pCsr, .  sqlit
8660: 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e 6b 0a  e3_value *pRank.
8670: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
8680: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
8690: 52 61 6e 6b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  Rank ){.    cons
86a0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
86b0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
86c0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 52 61 6e  _value_text(pRan
86d0: 6b 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52  k);.    char *zR
86e0: 61 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ank = 0;.    cha
86f0: 72 20 2a 7a 52 61 6e 6b 41 72 67 73 20 3d 20 30  r *zRankArgs = 0
8700: 3b 0a 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  ;..    if( z==0 
8710: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
8720: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
8730: 70 52 61 6e 6b 29 3d 3d 53 51 4c 49 54 45 5f 4e  pRank)==SQLITE_N
8740: 55 4c 4c 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ULL ) rc = SQLIT
8750: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  E_ERROR;.    }el
8760: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
8770: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
8780: 50 61 72 73 65 52 61 6e 6b 28 7a 2c 20 26 7a 52  ParseRank(z, &zR
8790: 61 6e 6b 2c 20 26 7a 52 61 6e 6b 41 72 67 73 29  ank, &zRankArgs)
87a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
87b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
87c0: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 7a 52 61  .      pCsr->zRa
87d0: 6e 6b 20 3d 20 7a 52 61 6e 6b 3b 0a 20 20 20 20  nk = zRank;.    
87e0: 20 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 41 72 67    pCsr->zRankArg
87f0: 73 20 3d 20 7a 52 61 6e 6b 41 72 67 73 3b 0a 20  s = zRankArgs;. 
8800: 20 20 20 20 20 43 73 72 46 6c 61 67 53 65 74 28       CsrFlagSet(
8810: 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 46 52  pCsr, FTS5CSR_FR
8820: 45 45 5f 5a 52 41 4e 4b 29 3b 0a 20 20 20 20 7d  EE_ZRANK);.    }
8830: 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
8840: 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  ITE_ERROR ){.   
8850: 20 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56     pCsr->base.pV
8860: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73  tab->zErrMsg = s
8870: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
8880: 20 20 20 20 20 20 20 20 20 20 22 70 61 72 73 65            "parse
8890: 20 65 72 72 6f 72 20 69 6e 20 72 61 6e 6b 20 66   error in rank f
88a0: 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 0a  unction: %s", z.
88b0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
88c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
88d0: 70 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 20 29  pConfig->zRank )
88e0: 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 7a 52  {.      pCsr->zR
88f0: 61 6e 6b 20 3d 20 28 63 68 61 72 2a 29 70 43 6f  ank = (char*)pCo
8900: 6e 66 69 67 2d 3e 7a 52 61 6e 6b 3b 0a 20 20 20  nfig->zRank;.   
8910: 20 20 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 41 72     pCsr->zRankAr
8920: 67 73 20 3d 20 28 63 68 61 72 2a 29 70 43 6f 6e  gs = (char*)pCon
8930: 66 69 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 3b 0a  fig->zRankArgs;.
8940: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8950: 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 20 3d 20 28   pCsr->zRank = (
8960: 63 68 61 72 2a 29 46 54 53 35 5f 44 45 46 41 55  char*)FTS5_DEFAU
8970: 4c 54 5f 52 41 4e 4b 3b 0a 20 20 20 20 20 20 70  LT_RANK;.      p
8980: 43 73 72 2d 3e 7a 52 61 6e 6b 41 72 67 73 20 3d  Csr->zRankArgs =
8990: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
89a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
89b0: 61 74 69 63 20 69 36 34 20 66 74 73 35 47 65 74  atic i64 fts5Get
89c0: 52 6f 77 69 64 4c 69 6d 69 74 28 73 71 6c 69 74  RowidLimit(sqlit
89d0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
89e0: 69 36 34 20 69 44 65 66 61 75 6c 74 29 7b 0a 20  i64 iDefault){. 
89f0: 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
8a00: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c   int eType = sql
8a10: 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72  ite3_value_numer
8a20: 69 63 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20  ic_type(pVal);. 
8a30: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
8a40: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
8a50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
8a60: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
8a70: 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
8a80: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 65 66 61  }.  return iDefa
8a90: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ult;.}../*.** Th
8aa0: 69 73 20 69 73 20 74 68 65 20 78 46 69 6c 74 65  is is the xFilte
8ab0: 72 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  r interface for 
8ac0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
8ad0: 65 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 76  e.  See.** the v
8ae0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 46 69  irtual table xFi
8af0: 6c 74 65 72 20 6d 65 74 68 6f 64 20 64 6f 63 75  lter method docu
8b00: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64  mentation for ad
8b10: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f  ditional.** info
8b20: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  rmation..** .** 
8b30: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
8b40: 70 6f 73 73 69 62 6c 65 20 71 75 65 72 79 20 73  possible query s
8b50: 74 72 61 74 65 67 69 65 73 3a 0a 2a 2a 0a 2a 2a  trategies:.**.**
8b60: 20 20 20 31 2e 20 46 75 6c 6c 2d 74 65 78 74 20     1. Full-text 
8b70: 73 65 61 72 63 68 20 75 73 69 6e 67 20 61 20 4d  search using a M
8b80: 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ATCH operator..*
8b90: 2a 20 20 20 32 2e 20 41 20 62 79 2d 72 6f 77 69  *   2. A by-rowi
8ba0: 64 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 20 20 20 33  d lookup..**   3
8bb0: 2e 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73  . A full-table s
8bc0: 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  can..*/.static i
8bd0: 6e 74 20 66 74 73 35 46 69 6c 74 65 72 4d 65 74  nt fts5FilterMet
8be0: 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  hod(.  sqlite3_v
8bf0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tab_cursor *pCur
8c00: 73 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75  sor,   /* The cu
8c10: 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74 68  rsor used for th
8c20: 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
8c30: 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20 20  t idxNum,       
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c50: 20 53 74 72 61 74 65 67 79 20 69 6e 64 65 78 20   Strategy index 
8c60: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8c70: 2a 7a 55 6e 75 73 65 64 2c 20 20 20 20 20 20 20  *zUnused,       
8c80: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a       /* Unused *
8c90: 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20  /.  int nVal,   
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8cc0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70 56   elements in apV
8cd0: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
8ce0: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
8cf0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
8d00: 65 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e 64  ents for the ind
8d10: 65 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f 0a  exing scheme */.
8d20: 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a  ){.  Fts5Table *
8d30: 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c  pTab = (Fts5Tabl
8d40: 65 2a 29 28 70 43 75 72 73 6f 72 2d 3e 70 56 74  e*)(pCursor->pVt
8d50: 61 62 29 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69  ab);.  Fts5Confi
8d60: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 54 61  g *pConfig = pTa
8d70: 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74  b->pConfig;.  Ft
8d80: 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  s5Cursor *pCsr =
8d90: 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43   (Fts5Cursor*)pC
8da0: 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20  ursor;.  int rc 
8db0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
8dd0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
8de0: 69 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  iVal = 0;       
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8e00: 6f 75 6e 74 65 72 20 66 6f 72 20 61 70 56 61 6c  ounter for apVal
8e10: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  [] */.  int bDes
8e20: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
8e30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
8e40: 69 66 20 4f 52 44 45 52 20 42 59 20 5b 72 61 6e  if ORDER BY [ran
8e50: 6b 7c 72 6f 77 69 64 5d 20 44 45 53 43 20 2a 2f  k|rowid] DESC */
8e60: 0a 20 20 69 6e 74 20 62 4f 72 64 65 72 42 79 52  .  int bOrderByR
8e70: 61 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ank;            
8e80: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 4f 52     /* True if OR
8e90: 44 45 52 20 42 59 20 72 61 6e 6b 20 2a 2f 0a 20  DER BY rank */. 
8ea0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8eb0: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20  pMatch = 0;     
8ec0: 20 2f 2a 20 3c 74 62 6c 3e 20 4d 41 54 43 48 20   /* <tbl> MATCH 
8ed0: 3f 20 65 78 70 72 65 73 73 69 6f 6e 20 28 6f 72  ? expression (or
8ee0: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 71 6c 69   NULL) */.  sqli
8ef0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e 6b  te3_value *pRank
8f00: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 72   = 0;       /* r
8f10: 61 6e 6b 20 4d 41 54 43 48 20 3f 20 65 78 70 72  ank MATCH ? expr
8f20: 65 73 73 69 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29  ession (or NULL)
8f30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
8f40: 6c 75 65 20 2a 70 52 6f 77 69 64 45 71 20 3d 20  lue *pRowidEq = 
8f50: 30 3b 20 20 20 20 2f 2a 20 72 6f 77 69 64 20 3d  0;    /* rowid =
8f60: 20 3f 20 65 78 70 72 65 73 73 69 6f 6e 20 28 6f   ? expression (o
8f70: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 71 6c  r NULL) */.  sql
8f80: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77  ite3_value *pRow
8f90: 69 64 4c 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  idLe = 0;    /* 
8fa0: 72 6f 77 69 64 20 3c 3d 20 3f 20 65 78 70 72 65  rowid <= ? expre
8fb0: 73 73 69 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29 20  ssion (or NULL) 
8fc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
8fd0: 75 65 20 2a 70 52 6f 77 69 64 47 65 20 3d 20 30  ue *pRowidGe = 0
8fe0: 3b 20 20 20 20 2f 2a 20 72 6f 77 69 64 20 3e 3d  ;    /* rowid >=
8ff0: 20 3f 20 65 78 70 72 65 73 73 69 6f 6e 20 28 6f   ? expression (o
9000: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
9010: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9030: 43 6f 6c 75 6d 6e 20 6f 6e 20 4c 48 53 20 6f 66  Column on LHS of
9040: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
9050: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
9060: 72 6d 73 67 20 3d 20 70 43 6f 6e 66 69 67 2d 3e  rmsg = pConfig->
9070: 70 7a 45 72 72 6d 73 67 3b 0a 0a 20 20 55 4e 55  pzErrmsg;..  UNU
9080: 53 45 44 5f 50 41 52 41 4d 28 7a 55 6e 75 73 65  SED_PARAM(zUnuse
9090: 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
90a0: 41 4d 28 6e 56 61 6c 29 3b 0a 0a 20 20 69 66 28  AM(nVal);..  if(
90b0: 20 70 43 73 72 2d 3e 65 50 6c 61 6e 20 29 7b 0a   pCsr->ePlan ){.
90c0: 20 20 20 20 66 74 73 35 46 72 65 65 43 75 72 73      fts5FreeCurs
90d0: 6f 72 43 6f 6d 70 6f 6e 65 6e 74 73 28 70 43 73  orComponents(pCs
90e0: 72 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  r);.    memset(&
90f0: 70 43 73 72 2d 3e 65 50 6c 61 6e 2c 20 30 2c 20  pCsr->ePlan, 0, 
9100: 73 69 7a 65 6f 66 28 46 74 73 35 43 75 72 73 6f  sizeof(Fts5Curso
9110: 72 29 20 2d 20 28 28 75 38 2a 29 26 70 43 73 72  r) - ((u8*)&pCsr
9120: 2d 3e 65 50 6c 61 6e 2d 28 75 38 2a 29 70 43 73  ->ePlan-(u8*)pCs
9130: 72 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  r));.  }..  asse
9140: 72 74 28 20 70 43 73 72 2d 3e 70 53 74 6d 74 3d  rt( pCsr->pStmt=
9150: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9160: 70 43 73 72 2d 3e 70 45 78 70 72 3d 3d 30 20 29  pCsr->pExpr==0 )
9170: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
9180: 2d 3e 63 73 72 66 6c 61 67 73 3d 3d 30 20 29 3b  ->csrflags==0 );
9190: 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
91a0: 3e 70 52 61 6e 6b 3d 3d 30 20 29 3b 0a 20 20 61  >pRank==0 );.  a
91b0: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 7a 52 61  ssert( pCsr->zRa
91c0: 6e 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nk==0 );.  asser
91d0: 74 28 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 41 72  t( pCsr->zRankAr
91e0: 67 73 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65  gs==0 );..  asse
91f0: 72 74 28 20 70 7a 45 72 72 6d 73 67 3d 3d 30 20  rt( pzErrmsg==0 
9200: 7c 7c 20 70 7a 45 72 72 6d 73 67 3d 3d 26 70 54  || pzErrmsg==&pT
9210: 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67  ab->base.zErrMsg
9220: 20 29 3b 0a 20 20 70 43 6f 6e 66 69 67 2d 3e 70   );.  pConfig->p
9230: 7a 45 72 72 6d 73 67 20 3d 20 26 70 54 61 62 2d  zErrmsg = &pTab-
9240: 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3b 0a 0a  >base.zErrMsg;..
9250: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
9260: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
9270: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 69 73   through to this
9280: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a   function..  **.
9290: 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 65 20 66    ** Note: The f
92a0: 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
92b0: 69 66 28 2e 2e 2e 29 20 73 74 61 74 65 6d 65 6e  if(...) statemen
92c0: 74 73 20 6d 75 73 74 20 62 65 20 69 6e 20 74 68  ts must be in th
92d0: 65 20 73 61 6d 65 0a 20 20 2a 2a 20 6f 72 64 65  e same.  ** orde
92e0: 72 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  r as the corresp
92f0: 6f 6e 64 69 6e 67 20 65 6e 74 72 69 65 73 20 69  onding entries i
9300: 6e 20 74 68 65 20 73 74 72 75 63 74 20 61 74 20  n the struct at 
9310: 74 68 65 20 74 6f 70 20 6f 66 0a 20 20 2a 2a 20  the top of.  ** 
9320: 66 74 73 35 42 65 73 74 49 6e 64 65 78 4d 65 74  fts5BestIndexMet
9330: 68 6f 64 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  hod().  */.  if(
9340: 20 42 69 74 46 6c 61 67 54 65 73 74 28 69 64 78   BitFlagTest(idx
9350: 4e 75 6d 2c 20 46 54 53 35 5f 42 49 5f 4d 41 54  Num, FTS5_BI_MAT
9360: 43 48 29 20 29 20 70 4d 61 74 63 68 20 3d 20 61  CH) ) pMatch = a
9370: 70 56 61 6c 5b 69 56 61 6c 2b 2b 5d 3b 0a 20 20  pVal[iVal++];.  
9380: 69 66 28 20 42 69 74 46 6c 61 67 54 65 73 74 28  if( BitFlagTest(
9390: 69 64 78 4e 75 6d 2c 20 46 54 53 35 5f 42 49 5f  idxNum, FTS5_BI_
93a0: 52 41 4e 4b 29 20 29 20 70 52 61 6e 6b 20 3d 20  RANK) ) pRank = 
93b0: 61 70 56 61 6c 5b 69 56 61 6c 2b 2b 5d 3b 0a 20  apVal[iVal++];. 
93c0: 20 69 66 28 20 42 69 74 46 6c 61 67 54 65 73 74   if( BitFlagTest
93d0: 28 69 64 78 4e 75 6d 2c 20 46 54 53 35 5f 42 49  (idxNum, FTS5_BI
93e0: 5f 52 4f 57 49 44 5f 45 51 29 20 29 20 70 52 6f  _ROWID_EQ) ) pRo
93f0: 77 69 64 45 71 20 3d 20 61 70 56 61 6c 5b 69 56  widEq = apVal[iV
9400: 61 6c 2b 2b 5d 3b 0a 20 20 69 66 28 20 42 69 74  al++];.  if( Bit
9410: 46 6c 61 67 54 65 73 74 28 69 64 78 4e 75 6d 2c  FlagTest(idxNum,
9420: 20 46 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 4c   FTS5_BI_ROWID_L
9430: 45 29 20 29 20 70 52 6f 77 69 64 4c 65 20 3d 20  E) ) pRowidLe = 
9440: 61 70 56 61 6c 5b 69 56 61 6c 2b 2b 5d 3b 0a 20  apVal[iVal++];. 
9450: 20 69 66 28 20 42 69 74 46 6c 61 67 54 65 73 74   if( BitFlagTest
9460: 28 69 64 78 4e 75 6d 2c 20 46 54 53 35 5f 42 49  (idxNum, FTS5_BI
9470: 5f 52 4f 57 49 44 5f 47 45 29 20 29 20 70 52 6f  _ROWID_GE) ) pRo
9480: 77 69 64 47 65 20 3d 20 61 70 56 61 6c 5b 69 56  widGe = apVal[iV
9490: 61 6c 2b 2b 5d 3b 0a 20 20 69 43 6f 6c 20 3d 20  al++];.  iCol = 
94a0: 28 69 64 78 4e 75 6d 3e 3e 31 36 29 3b 0a 20 20  (idxNum>>16);.  
94b0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
94c0: 26 26 20 69 43 6f 6c 3c 3d 70 43 6f 6e 66 69 67  && iCol<=pConfig
94d0: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 61 73 73 65  ->nCol );.  asse
94e0: 72 74 28 20 69 56 61 6c 3d 3d 6e 56 61 6c 20 29  rt( iVal==nVal )
94f0: 3b 0a 20 20 62 4f 72 64 65 72 42 79 52 61 6e 6b  ;.  bOrderByRank
9500: 20 3d 20 28 28 69 64 78 4e 75 6d 20 26 20 46 54   = ((idxNum & FT
9510: 53 35 5f 42 49 5f 4f 52 44 45 52 5f 52 41 4e 4b  S5_BI_ORDER_RANK
9520: 29 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 70 43  ) ? 1 : 0);.  pC
9530: 73 72 2d 3e 62 44 65 73 63 20 3d 20 62 44 65 73  sr->bDesc = bDes
9540: 63 20 3d 20 28 28 69 64 78 4e 75 6d 20 26 20 46  c = ((idxNum & F
9550: 54 53 35 5f 42 49 5f 4f 52 44 45 52 5f 44 45 53  TS5_BI_ORDER_DES
9560: 43 29 20 3f 20 31 20 3a 20 30 29 3b 0a 0a 20 20  C) ? 1 : 0);..  
9570: 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 73 6f  /* Set the curso
9580: 72 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  r upper and lowe
9590: 72 20 72 6f 77 69 64 20 6c 69 6d 69 74 73 2e 20  r rowid limits. 
95a0: 4f 6e 6c 79 20 73 6f 6d 65 20 73 74 72 61 74 65  Only some strate
95b0: 67 69 65 73 20 0a 20 20 2a 2a 20 61 63 74 75 61  gies .  ** actua
95c0: 6c 6c 79 20 75 73 65 20 74 68 65 6d 2e 20 54 68  lly use them. Th
95d0: 69 73 20 69 73 20 6f 6b 2c 20 61 73 20 74 68 65  is is ok, as the
95e0: 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65   xBestIndex() me
95f0: 74 68 6f 64 20 6c 65 61 76 65 73 20 74 68 65 0a  thod leaves the.
9600: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 64    ** sqlite3_ind
9610: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2e 6f 6d  ex_constraint.om
9620: 69 74 20 66 6c 61 67 20 63 6c 65 61 72 20 66 6f  it flag clear fo
9630: 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  r range constrai
9640: 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  nts.  ** on the 
9650: 72 6f 77 69 64 20 66 69 65 6c 64 2e 20 20 2a 2f  rowid field.  */
9660: 0a 20 20 69 66 28 20 70 52 6f 77 69 64 45 71 20  .  if( pRowidEq 
9670: 29 7b 0a 20 20 20 20 70 52 6f 77 69 64 4c 65 20  ){.    pRowidLe 
9680: 3d 20 70 52 6f 77 69 64 47 65 20 3d 20 70 52 6f  = pRowidGe = pRo
9690: 77 69 64 45 71 3b 0a 20 20 7d 0a 20 20 69 66 28  widEq;.  }.  if(
96a0: 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20 70 43   bDesc ){.    pC
96b0: 73 72 2d 3e 69 46 69 72 73 74 52 6f 77 69 64 20  sr->iFirstRowid 
96c0: 3d 20 66 74 73 35 47 65 74 52 6f 77 69 64 4c 69  = fts5GetRowidLi
96d0: 6d 69 74 28 70 52 6f 77 69 64 4c 65 2c 20 4c 41  mit(pRowidLe, LA
96e0: 52 47 45 53 54 5f 49 4e 54 36 34 29 3b 0a 20 20  RGEST_INT64);.  
96f0: 20 20 70 43 73 72 2d 3e 69 4c 61 73 74 52 6f 77    pCsr->iLastRow
9700: 69 64 20 3d 20 66 74 73 35 47 65 74 52 6f 77 69  id = fts5GetRowi
9710: 64 4c 69 6d 69 74 28 70 52 6f 77 69 64 47 65 2c  dLimit(pRowidGe,
9720: 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29   SMALLEST_INT64)
9730: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9740: 43 73 72 2d 3e 69 4c 61 73 74 52 6f 77 69 64 20  Csr->iLastRowid 
9750: 3d 20 66 74 73 35 47 65 74 52 6f 77 69 64 4c 69  = fts5GetRowidLi
9760: 6d 69 74 28 70 52 6f 77 69 64 4c 65 2c 20 4c 41  mit(pRowidLe, LA
9770: 52 47 45 53 54 5f 49 4e 54 36 34 29 3b 0a 20 20  RGEST_INT64);.  
9780: 20 20 70 43 73 72 2d 3e 69 46 69 72 73 74 52 6f    pCsr->iFirstRo
9790: 77 69 64 20 3d 20 66 74 73 35 47 65 74 52 6f 77  wid = fts5GetRow
97a0: 69 64 4c 69 6d 69 74 28 70 52 6f 77 69 64 47 65  idLimit(pRowidGe
97b0: 2c 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  , SMALLEST_INT64
97c0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54  );.  }..  if( pT
97d0: 61 62 2d 3e 70 53 6f 72 74 43 73 72 20 29 7b 0a  ab->pSortCsr ){.
97e0: 20 20 20 20 2f 2a 20 49 66 20 70 53 6f 72 74 43      /* If pSortC
97f0: 73 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  sr is non-NULL, 
9800: 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69  then this call i
9810: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 61 73 20  s being made as 
9820: 70 61 72 74 20 6f 66 20 0a 20 20 20 20 2a 2a 20  part of .    ** 
9830: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  processing for a
9840: 20 22 2e 2e 2e 20 4d 41 54 43 48 20 3c 65 78 70   "... MATCH <exp
9850: 72 3e 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b  r> ORDER BY rank
9860: 22 20 71 75 65 72 79 20 28 65 50 6c 61 6e 20 69  " query (ePlan i
9870: 73 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20  s.    ** set to 
9880: 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 52 54 45 44  FTS5_PLAN_SORTED
9890: 5f 4d 41 54 43 48 29 2e 20 70 53 6f 72 74 43 73  _MATCH). pSortCs
98a0: 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
98b0: 74 68 61 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  that will.    **
98c0: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 73 20   return results 
98d0: 74 6f 20 74 68 65 20 75 73 65 72 20 66 6f 72 20  to the user for 
98e0: 74 68 69 73 20 71 75 65 72 79 2e 20 54 68 65 20  this query. The 
98f0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 0a  current cursor .
9900: 20 20 20 20 2a 2a 20 28 70 43 75 72 73 6f 72 29      ** (pCursor)
9910: 20 69 73 20 75 73 65 64 20 74 6f 20 65 78 65 63   is used to exec
9920: 75 74 65 20 74 68 65 20 71 75 65 72 79 20 69 73  ute the query is
9930: 73 75 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  sued by function
9940: 20 0a 20 20 20 20 2a 2a 20 66 74 73 35 43 75 72   .    ** fts5Cur
9950: 73 6f 72 46 69 72 73 74 53 6f 72 74 65 64 28 29  sorFirstSorted()
9960: 20 61 62 6f 76 65 2e 20 20 2a 2f 0a 20 20 20 20   above.  */.    
9970: 61 73 73 65 72 74 28 20 70 52 6f 77 69 64 45 71  assert( pRowidEq
9980: 3d 3d 30 20 26 26 20 70 52 6f 77 69 64 4c 65 3d  ==0 && pRowidLe=
9990: 3d 30 20 26 26 20 70 52 6f 77 69 64 47 65 3d 3d  =0 && pRowidGe==
99a0: 30 20 26 26 20 70 52 61 6e 6b 3d 3d 30 20 29 3b  0 && pRank==0 );
99b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61  .    assert( nVa
99c0: 6c 3d 3d 30 20 26 26 20 70 4d 61 74 63 68 3d 3d  l==0 && pMatch==
99d0: 30 20 26 26 20 62 4f 72 64 65 72 42 79 52 61 6e  0 && bOrderByRan
99e0: 6b 3d 3d 30 20 26 26 20 62 44 65 73 63 3d 3d 30  k==0 && bDesc==0
99f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9a00: 70 43 73 72 2d 3e 69 4c 61 73 74 52 6f 77 69 64  pCsr->iLastRowid
9a10: 3d 3d 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  ==LARGEST_INT64 
9a20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9a30: 43 73 72 2d 3e 69 46 69 72 73 74 52 6f 77 69 64  Csr->iFirstRowid
9a40: 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
9a50: 20 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 65 50   );.    pCsr->eP
9a60: 6c 61 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 5f  lan = FTS5_PLAN_
9a70: 53 4f 55 52 43 45 3b 0a 20 20 20 20 70 43 73 72  SOURCE;.    pCsr
9a80: 2d 3e 70 45 78 70 72 20 3d 20 70 54 61 62 2d 3e  ->pExpr = pTab->
9a90: 70 53 6f 72 74 43 73 72 2d 3e 70 45 78 70 72 3b  pSortCsr->pExpr;
9aa0: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 43 75  .    rc = fts5Cu
9ab0: 72 73 6f 72 46 69 72 73 74 28 70 54 61 62 2c 20  rsorFirst(pTab, 
9ac0: 70 43 73 72 2c 20 62 44 65 73 63 29 3b 0a 20 20  pCsr, bDesc);.  
9ad0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 61 74 63 68  }else if( pMatch
9ae0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
9af0: 61 72 20 2a 7a 45 78 70 72 20 3d 20 28 63 6f 6e  ar *zExpr = (con
9b00: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
9b10: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
9b20: 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  l[0]);.    if( z
9b30: 45 78 70 72 3d 3d 30 20 29 20 7a 45 78 70 72 20  Expr==0 ) zExpr 
9b40: 3d 20 22 22 3b 0a 0a 20 20 20 20 72 63 20 3d 20  = "";..    rc = 
9b50: 66 74 73 35 43 75 72 73 6f 72 50 61 72 73 65 52  fts5CursorParseR
9b60: 61 6e 6b 28 70 43 6f 6e 66 69 67 2c 20 70 43 73  ank(pConfig, pCs
9b70: 72 2c 20 70 52 61 6e 6b 29 3b 0a 20 20 20 20 69  r, pRank);.    i
9b80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9b90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 45   ){.      if( zE
9ba0: 78 70 72 5b 30 5d 3d 3d 27 2a 27 20 29 7b 0a 20  xpr[0]=='*' ){. 
9bb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 73         /* The us
9bc0: 65 72 20 68 61 73 20 69 73 73 75 65 64 20 61 20  er has issued a 
9bd0: 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
9be0: 6d 20 22 4d 41 54 43 48 20 27 2a 2e 2e 2e 27 22  m "MATCH '*...'"
9bf0: 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a  . This.        *
9c00: 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  * indicates that
9c10: 20 74 68 65 20 4d 41 54 43 48 20 65 78 70 72 65   the MATCH expre
9c20: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 66  ssion is not a f
9c30: 75 6c 6c 20 74 65 78 74 20 71 75 65 72 79 2c 0a  ull text query,.
9c40: 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 61          ** but a
9c50: 20 72 65 71 75 65 73 74 20 66 6f 72 20 61 6e 20   request for an 
9c60: 69 6e 74 65 72 6e 61 6c 20 70 61 72 61 6d 65 74  internal paramet
9c70: 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  er.  */.        
9c80: 72 63 20 3d 20 66 74 73 35 53 70 65 63 69 61 6c  rc = fts5Special
9c90: 4d 61 74 63 68 28 70 54 61 62 2c 20 70 43 73 72  Match(pTab, pCsr
9ca0: 2c 20 26 7a 45 78 70 72 5b 31 5d 29 3b 0a 20 20  , &zExpr[1]);.  
9cb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9cc0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20     char **pzErr 
9cd0: 3d 20 26 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45  = &pTab->base.zE
9ce0: 72 72 4d 73 67 3b 0a 20 20 20 20 20 20 20 20 72  rrMsg;.        r
9cf0: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  c = sqlite3Fts5E
9d00: 78 70 72 4e 65 77 28 70 43 6f 6e 66 69 67 2c 20  xprNew(pConfig, 
9d10: 69 43 6f 6c 2c 20 7a 45 78 70 72 2c 20 26 70 43  iCol, zExpr, &pC
9d20: 73 72 2d 3e 70 45 78 70 72 2c 20 70 7a 45 72 72  sr->pExpr, pzErr
9d30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
9d40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9d50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 4f            if( bO
9d60: 72 64 65 72 42 79 52 61 6e 6b 20 29 7b 0a 20 20  rderByRank ){.  
9d70: 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e            pCsr->
9d80: 65 50 6c 61 6e 20 3d 20 46 54 53 35 5f 50 4c 41  ePlan = FTS5_PLA
9d90: 4e 5f 53 4f 52 54 45 44 5f 4d 41 54 43 48 3b 0a  N_SORTED_MATCH;.
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
9db0: 20 66 74 73 35 43 75 72 73 6f 72 46 69 72 73 74   fts5CursorFirst
9dc0: 53 6f 72 74 65 64 28 70 54 61 62 2c 20 70 43 73  Sorted(pTab, pCs
9dd0: 72 2c 20 62 44 65 73 63 29 3b 0a 20 20 20 20 20  r, bDesc);.     
9de0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9df0: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 65 50          pCsr->eP
9e00: 6c 61 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 5f  lan = FTS5_PLAN_
9e10: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20 20  MATCH;.         
9e20: 20 20 20 72 63 20 3d 20 66 74 73 35 43 75 72 73     rc = fts5Curs
9e30: 6f 72 46 69 72 73 74 28 70 54 61 62 2c 20 70 43  orFirst(pTab, pC
9e40: 73 72 2c 20 62 44 65 73 63 29 3b 0a 20 20 20 20  sr, bDesc);.    
9e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9e60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
9e70: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e    }else if( pCon
9e80: 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 3d 3d 30  fig->zContent==0
9e90: 20 29 7b 0a 20 20 20 20 2a 70 43 6f 6e 66 69 67   ){.    *pConfig
9ea0: 2d 3e 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  ->pzErrmsg = sql
9eb0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
9ec0: 20 20 20 20 20 20 22 25 73 3a 20 74 61 62 6c 65        "%s: table
9ed0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
9ee0: 74 20 73 63 61 6e 6e 69 6e 67 22 2c 20 70 43 6f  t scanning", pCo
9ef0: 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
9f00: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
9f10: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
9f20: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  e{.    /* This i
9f30: 73 20 65 69 74 68 65 72 20 61 20 66 75 6c 6c 2d  s either a full-
9f40: 74 61 62 6c 65 20 73 63 61 6e 20 28 65 50 6c 61  table scan (ePla
9f50: 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 53 43 41  n==FTS5_PLAN_SCA
9f60: 4e 29 20 6f 72 20 61 20 6c 6f 6f 6b 75 70 0a 20  N) or a lookup. 
9f70: 20 20 20 2a 2a 20 62 79 20 72 6f 77 69 64 20 28     ** by rowid (
9f80: 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e  ePlan==FTS5_PLAN
9f90: 5f 52 4f 57 49 44 29 2e 20 20 2a 2f 0a 20 20 20  _ROWID).  */.   
9fa0: 20 70 43 73 72 2d 3e 65 50 6c 61 6e 20 3d 20 28   pCsr->ePlan = (
9fb0: 70 52 6f 77 69 64 45 71 20 3f 20 46 54 53 35 5f  pRowidEq ? FTS5_
9fc0: 50 4c 41 4e 5f 52 4f 57 49 44 20 3a 20 46 54 53  PLAN_ROWID : FTS
9fd0: 35 5f 50 4c 41 4e 5f 53 43 41 4e 29 3b 0a 20 20  5_PLAN_SCAN);.  
9fe0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
9ff0: 73 35 53 74 6f 72 61 67 65 53 74 6d 74 28 0a 20  s5StorageStmt(. 
a000: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 70 53 74         pTab->pSt
a010: 6f 72 61 67 65 2c 20 66 74 73 35 53 74 6d 74 54  orage, fts5StmtT
a020: 79 70 65 28 70 43 73 72 29 2c 20 26 70 43 73 72  ype(pCsr), &pCsr
a030: 2d 3e 70 53 74 6d 74 2c 20 26 70 54 61 62 2d 3e  ->pStmt, &pTab->
a040: 62 61 73 65 2e 7a 45 72 72 4d 73 67 0a 20 20 20  base.zErrMsg.   
a050: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
a060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a070: 20 20 20 69 66 28 20 70 43 73 72 2d 3e 65 50 6c     if( pCsr->ePl
a080: 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 52 4f  an==FTS5_PLAN_RO
a090: 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73  WID ){.        s
a0a0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
a0b0: 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31  e(pCsr->pStmt, 1
a0c0: 2c 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20  , apVal[0]);.   
a0d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a0e0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
a0f0: 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74  nt64(pCsr->pStmt
a100: 2c 20 31 2c 20 70 43 73 72 2d 3e 69 46 69 72 73  , 1, pCsr->iFirs
a110: 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  tRowid);.       
a120: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
a130: 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c  t64(pCsr->pStmt,
a140: 20 32 2c 20 70 43 73 72 2d 3e 69 4c 61 73 74 52   2, pCsr->iLastR
a150: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  owid);.      }. 
a160: 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 4e 65       rc = fts5Ne
a170: 78 74 4d 65 74 68 6f 64 28 70 43 75 72 73 6f 72  xtMethod(pCursor
a180: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
a190: 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73  pConfig->pzErrms
a1a0: 67 20 3d 20 70 7a 45 72 72 6d 73 67 3b 0a 20 20  g = pzErrmsg;.  
a1b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a1c0: 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65   .** This is the
a1d0: 20 78 45 6f 66 20 6d 65 74 68 6f 64 20 6f 66 20   xEof method of 
a1e0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
a1f0: 65 2e 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  e. SQLite calls 
a200: 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  this .** routine
a210: 20 74 6f 20 66 69 6e 64 20 6f 75 74 20 69 66 20   to find out if 
a220: 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 74  it has reached t
a230: 68 65 20 65 6e 64 20 6f 66 20 61 20 72 65 73 75  he end of a resu
a240: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
a250: 63 20 69 6e 74 20 66 74 73 35 45 6f 66 4d 65 74  c int fts5EofMet
a260: 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
a270: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
a280: 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20  ){.  Fts5Cursor 
a290: 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72  *pCsr = (Fts5Cur
a2a0: 73 6f 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20  sor*)pCursor;.  
a2b0: 72 65 74 75 72 6e 20 28 43 73 72 46 6c 61 67 54  return (CsrFlagT
a2c0: 65 73 74 28 70 43 73 72 2c 20 46 54 53 35 43 53  est(pCsr, FTS5CS
a2d0: 52 5f 45 4f 46 29 20 3f 20 31 20 3a 20 30 29 3b  R_EOF) ? 1 : 0);
a2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a2f0: 20 74 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   the rowid that 
a300: 74 68 65 20 63 75 72 73 6f 72 20 63 75 72 72 65  the cursor curre
a310: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
a320: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  */.static i64 ft
a330: 73 35 43 75 72 73 6f 72 52 6f 77 69 64 28 46 74  s5CursorRowid(Ft
a340: 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  s5Cursor *pCsr){
a350: 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
a360: 3e 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c 41  >ePlan==FTS5_PLA
a370: 4e 5f 4d 41 54 43 48 20 0a 20 20 20 20 20 20 20  N_MATCH .       
a380: 7c 7c 20 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d  || pCsr->ePlan==
a390: 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 52 54 45 44  FTS5_PLAN_SORTED
a3a0: 5f 4d 41 54 43 48 20 0a 20 20 20 20 20 20 20 7c  _MATCH .       |
a3b0: 7c 20 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46  | pCsr->ePlan==F
a3c0: 54 53 35 5f 50 4c 41 4e 5f 53 4f 55 52 43 45 20  TS5_PLAN_SOURCE 
a3d0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 43 73 72  .  );.  if( pCsr
a3e0: 2d 3e 70 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  ->pSorter ){.   
a3f0: 20 72 65 74 75 72 6e 20 70 43 73 72 2d 3e 70 53   return pCsr->pS
a400: 6f 72 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  orter->iRowid;. 
a410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
a420: 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 45 78  rn sqlite3Fts5Ex
a430: 70 72 52 6f 77 69 64 28 70 43 73 72 2d 3e 70 45  prRowid(pCsr->pE
a440: 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  xpr);.  }.}../* 
a450: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
a460: 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 20 54  xRowid method. T
a470: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 63  he SQLite core c
a480: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
a490: 65 20 74 6f 0a 2a 2a 20 72 65 74 72 69 65 76 65  e to.** retrieve
a4a0: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
a4b0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
a4c0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
a4d0: 2e 20 66 74 73 35 0a 2a 2a 20 65 78 70 6f 73 65  . fts5.** expose
a4e0: 73 20 25 5f 63 6f 6e 74 65 6e 74 2e 72 6f 77 69  s %_content.rowi
a4f0: 64 20 61 73 20 74 68 65 20 72 6f 77 69 64 20 66  d as the rowid f
a500: 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
a510: 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 77  able. The.** row
a520: 69 64 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  id should be wri
a530: 74 74 65 6e 20 74 6f 20 2a 70 52 6f 77 69 64 2e  tten to *pRowid.
a540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a550: 74 73 35 52 6f 77 69 64 4d 65 74 68 6f 64 28 73  ts5RowidMethod(s
a560: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
a570: 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 73 71 6c  or *pCursor, sql
a580: 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
a590: 64 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72  d){.  Fts5Cursor
a5a0: 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75   *pCsr = (Fts5Cu
a5b0: 72 73 6f 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20  rsor*)pCursor;. 
a5c0: 20 69 6e 74 20 65 50 6c 61 6e 20 3d 20 70 43 73   int ePlan = pCs
a5d0: 72 2d 3e 65 50 6c 61 6e 3b 0a 20 20 0a 20 20 61  r->ePlan;.  .  a
a5e0: 73 73 65 72 74 28 20 43 73 72 46 6c 61 67 54 65  ssert( CsrFlagTe
a5f0: 73 74 28 70 43 73 72 2c 20 46 54 53 35 43 53 52  st(pCsr, FTS5CSR
a600: 5f 45 4f 46 29 3d 3d 30 20 29 3b 0a 20 20 73 77  _EOF)==0 );.  sw
a610: 69 74 63 68 28 20 65 50 6c 61 6e 20 29 7b 0a 20  itch( ePlan ){. 
a620: 20 20 20 63 61 73 65 20 46 54 53 35 5f 50 4c 41     case FTS5_PLA
a630: 4e 5f 53 50 45 43 49 41 4c 3a 0a 20 20 20 20 20  N_SPECIAL:.     
a640: 20 2a 70 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20   *pRowid = 0;.  
a650: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a660: 63 61 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f 53  case FTS5_PLAN_S
a670: 4f 55 52 43 45 3a 0a 20 20 20 20 63 61 73 65 20  OURCE:.    case 
a680: 46 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 3a  FTS5_PLAN_MATCH:
a690: 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 50  .    case FTS5_P
a6a0: 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d 41 54 43 48  LAN_SORTED_MATCH
a6b0: 3a 0a 20 20 20 20 20 20 2a 70 52 6f 77 69 64 20  :.      *pRowid 
a6c0: 3d 20 66 74 73 35 43 75 72 73 6f 72 52 6f 77 69  = fts5CursorRowi
a6d0: 64 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20 62  d(pCsr);.      b
a6e0: 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
a6f0: 6c 74 3a 0a 20 20 20 20 20 20 2a 70 52 6f 77 69  lt:.      *pRowi
a700: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
a710: 6d 6e 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e 70  mn_int64(pCsr->p
a720: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
a730: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
a740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a750: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
a760: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 73 20  cursor requires 
a770: 73 65 65 6b 69 6e 67 20 28 62 53 65 65 6b 52 65  seeking (bSeekRe
a780: 71 75 69 72 65 64 20 66 6c 61 67 20 69 73 20 73  quired flag is s
a790: 65 74 29 2c 20 73 65 65 6b 20 69 74 2e 0a 2a 2a  et), seek it..**
a7a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
a7b0: 4b 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  K if no error oc
a7c0: 63 75 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69  curs, or an SQLi
a7d0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
a7e0: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
a7f0: 66 20 61 72 67 75 6d 65 6e 74 20 62 45 72 72 6f  f argument bErro
a800: 72 6d 73 67 20 69 73 20 74 72 75 65 20 61 6e 64  rmsg is true and
a810: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a820: 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
a830: 67 65 20 6d 61 79 0a 2a 2a 20 62 65 20 6c 65 66  ge may.** be lef
a840: 74 20 69 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  t in sqlite3_vta
a850: 62 2e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 73 74  b.zErrMsg..*/.st
a860: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65 65  atic int fts5See
a870: 6b 43 75 72 73 6f 72 28 46 74 73 35 43 75 72 73  kCursor(Fts5Curs
a880: 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 45  or *pCsr, int bE
a890: 72 72 6f 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20  rrormsg){.  int 
a8a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a8b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
a8c0: 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  sor does not yet
a8d0: 20 68 61 76 65 20 61 20 73 74 61 74 65 6d 65 6e   have a statemen
a8e0: 74 20 68 61 6e 64 6c 65 2c 20 6f 62 74 61 69 6e  t handle, obtain
a8f0: 20 6f 6e 65 20 6e 6f 77 2e 20 2a 2f 20 0a 20 20   one now. */ .  
a900: 69 66 28 20 70 43 73 72 2d 3e 70 53 74 6d 74 3d  if( pCsr->pStmt=
a910: 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 54 61  =0 ){.    Fts5Ta
a920: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73  ble *pTab = (Fts
a930: 35 54 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62  5Table*)(pCsr->b
a940: 61 73 65 2e 70 56 74 61 62 29 3b 0a 20 20 20 20  ase.pVtab);.    
a950: 69 6e 74 20 65 53 74 6d 74 20 3d 20 66 74 73 35  int eStmt = fts5
a960: 53 74 6d 74 54 79 70 65 28 70 43 73 72 29 3b 0a  StmtType(pCsr);.
a970: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a980: 46 74 73 35 53 74 6f 72 61 67 65 53 74 6d 74 28  Fts5StorageStmt(
a990: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 70  .        pTab->p
a9a0: 53 74 6f 72 61 67 65 2c 20 65 53 74 6d 74 2c 20  Storage, eStmt, 
a9b0: 26 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 28 62  &pCsr->pStmt, (b
a9c0: 45 72 72 6f 72 6d 73 67 3f 26 70 54 61 62 2d 3e  Errormsg?&pTab->
a9d0: 62 61 73 65 2e 7a 45 72 72 4d 73 67 3a 30 29 0a  base.zErrMsg:0).
a9e0: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
a9f0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
aa00: 20 7c 7c 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a   || pTab->base.z
aa10: 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 20  ErrMsg==0 );.   
aa20: 20 61 73 73 65 72 74 28 20 43 73 72 46 6c 61 67   assert( CsrFlag
aa30: 54 65 73 74 28 70 43 73 72 2c 20 46 54 53 35 43  Test(pCsr, FTS5C
aa40: 53 52 5f 52 45 51 55 49 52 45 5f 43 4f 4e 54 45  SR_REQUIRE_CONTE
aa50: 4e 54 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  NT) );.  }..  if
aa60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
aa70: 26 26 20 43 73 72 46 6c 61 67 54 65 73 74 28 70  && CsrFlagTest(p
aa80: 43 73 72 2c 20 46 54 53 35 43 53 52 5f 52 45 51  Csr, FTS5CSR_REQ
aa90: 55 49 52 45 5f 43 4f 4e 54 45 4e 54 29 20 29 7b  UIRE_CONTENT) ){
aaa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73  .    assert( pCs
aab0: 72 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  r->pExpr );.    
aac0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
aad0: 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  sr->pStmt);.    
aae0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
aaf0: 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  64(pCsr->pStmt, 
ab00: 31 2c 20 66 74 73 35 43 75 72 73 6f 72 52 6f 77  1, fts5CursorRow
ab10: 69 64 28 70 43 73 72 29 29 3b 0a 20 20 20 20 72  id(pCsr));.    r
ab20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
ab30: 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20  (pCsr->pStmt);. 
ab40: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ab50: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 72  E_ROW ){.      r
ab60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ab70: 20 20 20 20 20 43 73 72 46 6c 61 67 43 6c 65 61       CsrFlagClea
ab80: 72 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f  r(pCsr, FTS5CSR_
ab90: 52 45 51 55 49 52 45 5f 43 4f 4e 54 45 4e 54 29  REQUIRE_CONTENT)
aba0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
abb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
abc0: 72 65 73 65 74 28 70 43 73 72 2d 3e 70 53 74 6d  reset(pCsr->pStm
abd0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
abe0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
abf0: 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35         rc = FTS5
ac00: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
ac10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
ac20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
ac30: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 56  ic void fts5SetV
ac40: 74 61 62 45 72 72 6f 72 28 46 74 73 35 54 61 62  tabError(Fts5Tab
ac50: 6c 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  le *p, const cha
ac60: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
ac70: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 20  {.  va_list ap; 
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 20 2f 2a 20 2e 2e 2e 20 70 72 69 6e 74      /* ... print
aca0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
acb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
acc0: 6f 72 6d 61 74 29 3b 0a 20 20 61 73 73 65 72 74  ormat);.  assert
acd0: 28 20 70 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73  ( p->base.zErrMs
ace0: 67 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 62 61 73  g==0 );.  p->bas
acf0: 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  e.zErrMsg = sqli
ad00: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
ad10: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
ad20: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
ad30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ad40: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
ad50: 64 6c 65 20 61 6e 20 46 54 53 20 49 4e 53 45 52  dle an FTS INSER
ad60: 54 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 6f 74  T command. In ot
ad70: 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 61 6e  her words,.** an
ad80: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
ad90: 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  t of the form:.*
ada0: 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20  *.**     INSERT 
adb0: 49 4e 54 4f 20 66 74 73 28 66 74 73 29 20 56 41  INTO fts(fts) VA
adc0: 4c 55 45 53 28 24 70 43 6d 64 29 0a 2a 2a 20 20  LUES($pCmd).**  
add0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66     INSERT INTO f
ade0: 74 73 28 66 74 73 2c 20 72 61 6e 6b 29 20 56 41  ts(fts, rank) VA
adf0: 4c 55 45 53 28 24 70 43 6d 64 2c 20 24 70 56 61  LUES($pCmd, $pVa
ae00: 6c 29 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  l).**.** Argumen
ae10: 74 20 70 56 61 6c 20 69 73 20 74 68 65 20 76 61  t pVal is the va
ae20: 6c 75 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  lue assigned to 
ae30: 63 6f 6c 75 6d 6e 20 22 66 74 73 22 20 62 79 20  column "fts" by 
ae40: 74 68 65 20 49 4e 53 45 52 54 20 0a 2a 2a 20 73  the INSERT .** s
ae50: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66  tatement. This f
ae60: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
ae70: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
ae80: 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
ae90: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
aea0: 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ode if an error 
aeb0: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
aec0: 65 20 63 6f 6d 6d 61 6e 64 73 20 69 6d 70 6c 65  e commands imple
aed0: 6d 65 6e 74 65 64 20 62 79 20 74 68 69 73 20 66  mented by this f
aee0: 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 6f 63 75  unction are docu
aef0: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 22 53  mented in the "S
af00: 70 65 63 69 61 6c 0a 2a 2a 20 49 4e 53 45 52 54  pecial.** INSERT
af10: 20 44 69 72 65 63 74 69 76 65 73 22 20 73 65 63   Directives" sec
af20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 63 75  tion of the docu
af30: 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 74 20 73 68  mentation. It sh
af40: 6f 75 6c 64 20 62 65 20 75 70 64 61 74 65 64 20  ould be updated 
af50: 69 66 0a 2a 2a 20 6d 6f 72 65 20 63 6f 6d 6d 61  if.** more comma
af60: 6e 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  nds are added to
af70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
af80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
af90: 73 35 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28  s5SpecialInsert(
afa0: 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54  .  Fts5Table *pT
afb0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
afc0: 20 20 20 2f 2a 20 46 74 73 35 20 74 61 62 6c 65     /* Fts5 table
afd0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
afe0: 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 2c 20 20  st char *zCmd,  
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b000: 54 65 78 74 20 69 6e 73 65 72 74 65 64 20 69 6e  Text inserted in
b010: 74 6f 20 74 61 62 6c 65 2d 6e 61 6d 65 20 63 6f  to table-name co
b020: 6c 75 6d 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lumn */.  sqlite
b030: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 20 20  3_value *pVal   
b040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
b050: 75 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ue inserted into
b060: 20 72 61 6e 6b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   rank column */.
b070: 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
b080: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d  *pConfig = pTab-
b090: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20  >pConfig;.  int 
b0a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b0b0: 20 20 69 6e 74 20 62 45 72 72 6f 72 20 3d 20 30    int bError = 0
b0c0: 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  ;..  if( 0==sqli
b0d0: 74 65 33 5f 73 74 72 69 63 6d 70 28 22 64 65 6c  te3_stricmp("del
b0e0: 65 74 65 2d 61 6c 6c 22 2c 20 7a 43 6d 64 29 20  ete-all", zCmd) 
b0f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66  ){.    if( pConf
b100: 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54  ig->eContent==FT
b110: 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41  S5_CONTENT_NORMA
b120: 4c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  L ){.      fts5S
b130: 65 74 56 74 61 62 45 72 72 6f 72 28 70 54 61 62  etVtabError(pTab
b140: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 27 64  , .          "'d
b150: 65 6c 65 74 65 2d 61 6c 6c 27 20 6d 61 79 20 6f  elete-all' may o
b160: 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
b170: 20 61 20 22 0a 20 20 20 20 20 20 20 20 20 20 22   a ".          "
b180: 63 6f 6e 74 65 6e 74 6c 65 73 73 20 6f 72 20 65  contentless or e
b190: 78 74 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  xternal content 
b1a0: 66 74 73 35 20 74 61 62 6c 65 22 0a 20 20 20 20  fts5 table".    
b1b0: 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20    );.      rc = 
b1c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b1d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
b1e0: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53  c = sqlite3Fts5S
b1f0: 74 6f 72 61 67 65 44 65 6c 65 74 65 41 6c 6c 28  torageDeleteAll(
b200: 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 29 3b  pTab->pStorage);
b210: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
b220: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
b230: 72 69 63 6d 70 28 22 72 65 62 75 69 6c 64 22 2c  ricmp("rebuild",
b240: 20 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 69 66   zCmd) ){.    if
b250: 28 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74  ( pConfig->eCont
b260: 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e  ent==FTS5_CONTEN
b270: 54 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  T_NONE ){.      
b280: 66 74 73 35 53 65 74 56 74 61 62 45 72 72 6f 72  fts5SetVtabError
b290: 28 70 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20  (pTab, .        
b2a0: 20 20 22 27 72 65 62 75 69 6c 64 27 20 6d 61 79    "'rebuild' may
b2b0: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
b2c0: 68 20 61 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20  h a contentless 
b2d0: 66 74 73 35 20 74 61 62 6c 65 22 0a 20 20 20 20  fts5 table".    
b2e0: 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20    );.      rc = 
b2f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
b310: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53  c = sqlite3Fts5S
b320: 74 6f 72 61 67 65 52 65 62 75 69 6c 64 28 70 54  torageRebuild(pT
b330: 61 62 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a 20  ab->pStorage);. 
b340: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
b350: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
b360: 63 6d 70 28 22 6f 70 74 69 6d 69 7a 65 22 2c 20  cmp("optimize", 
b370: 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 72 63 20  zCmd) ){.    rc 
b380: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  = sqlite3Fts5Sto
b390: 72 61 67 65 4f 70 74 69 6d 69 7a 65 28 70 54 61  rageOptimize(pTa
b3a0: 62 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a 20 20  b->pStorage);.  
b3b0: 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c  }else if( 0==sql
b3c0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 6d 65  ite3_stricmp("me
b3d0: 72 67 65 22 2c 20 7a 43 6d 64 29 20 29 7b 0a 20  rge", zCmd) ){. 
b3e0: 20 20 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20     int nMerge = 
b3f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
b400: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 72 63 20  t(pVal);.    rc 
b410: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  = sqlite3Fts5Sto
b420: 72 61 67 65 4d 65 72 67 65 28 70 54 61 62 2d 3e  rageMerge(pTab->
b430: 70 53 74 6f 72 61 67 65 2c 20 6e 4d 65 72 67 65  pStorage, nMerge
b440: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
b450: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
b460: 70 28 22 69 6e 74 65 67 72 69 74 79 2d 63 68 65  p("integrity-che
b470: 63 6b 22 2c 20 7a 43 6d 64 29 20 29 7b 0a 20 20  ck", zCmd) ){.  
b480: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
b490: 73 35 53 74 6f 72 61 67 65 49 6e 74 65 67 72 69  s5StorageIntegri
b4a0: 74 79 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67  ty(pTab->pStorag
b4b0: 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
b4c0: 45 5f 44 45 42 55 47 0a 20 20 7d 65 6c 73 65 20  E_DEBUG.  }else 
b4d0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
b4e0: 74 72 69 63 6d 70 28 22 70 72 65 66 69 78 2d 69  tricmp("prefix-i
b4f0: 6e 64 65 78 22 2c 20 7a 43 6d 64 29 20 29 7b 0a  ndex", zCmd) ){.
b500: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72      pConfig->bPr
b510: 65 66 69 78 49 6e 64 65 78 20 3d 20 73 71 6c 69  efixIndex = sqli
b520: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56  te3_value_int(pV
b530: 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  al);.#endif.  }e
b540: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
b550: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f  lite3Fts5IndexLo
b560: 61 64 43 6f 6e 66 69 67 28 70 54 61 62 2d 3e 70  adConfig(pTab->p
b570: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
b580: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b590: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b5a0: 74 65 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74  te3Fts5ConfigSet
b5b0: 56 61 6c 75 65 28 70 54 61 62 2d 3e 70 43 6f 6e  Value(pTab->pCon
b5c0: 66 69 67 2c 20 7a 43 6d 64 2c 20 70 56 61 6c 2c  fig, zCmd, pVal,
b5d0: 20 26 62 45 72 72 6f 72 29 3b 0a 20 20 20 20 7d   &bError);.    }
b5e0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b5f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b600: 69 66 28 20 62 45 72 72 6f 72 20 29 7b 0a 20 20  if( bError ){.  
b610: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b620: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
b630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
b640: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
b650: 6f 72 61 67 65 43 6f 6e 66 69 67 56 61 6c 75 65  orageConfigValue
b660: 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c  (pTab->pStorage,
b670: 20 7a 43 6d 64 2c 20 70 56 61 6c 2c 20 30 29 3b   zCmd, pVal, 0);
b680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b690: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b6a0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b6b0: 73 35 53 70 65 63 69 61 6c 44 65 6c 65 74 65 28  s5SpecialDelete(
b6c0: 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54  .  Fts5Table *pT
b6d0: 61 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  ab, .  sqlite3_v
b6e0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
b6f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b700: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 54 79 70  E_OK;.  int eTyp
b710: 65 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  e1 = sqlite3_val
b720: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d  ue_type(apVal[1]
b730: 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 31 3d  );.  if( eType1=
b740: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
b750: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
b760: 6e 74 36 34 20 69 44 65 6c 20 3d 20 73 71 6c 69  nt64 iDel = sqli
b770: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
b780: 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 72  apVal[1]);.    r
b790: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53  c = sqlite3Fts5S
b7a0: 74 6f 72 61 67 65 44 65 6c 65 74 65 28 70 54 61  torageDelete(pTa
b7b0: 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69 44 65  b->pStorage, iDe
b7c0: 6c 2c 20 26 61 70 56 61 6c 5b 32 5d 29 3b 0a 20  l, &apVal[2]);. 
b7d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b7e0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
b7f0: 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65 72 74  ts5StorageInsert
b800: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
b810: 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62   Fts5Table *pTab
b820: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
b830: 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20 20 69  ue **apVal, .  i
b840: 36 34 20 2a 70 69 52 6f 77 69 64 0a 29 7b 0a 20  64 *piRowid.){. 
b850: 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a   int rc = *pRc;.
b860: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b870: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
b880: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
b890: 67 65 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 28  geContentInsert(
b8a0: 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20  pTab->pStorage, 
b8b0: 61 70 56 61 6c 2c 20 70 69 52 6f 77 69 64 29 3b  apVal, piRowid);
b8c0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
b8d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b8e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
b8f0: 53 74 6f 72 61 67 65 49 6e 64 65 78 49 6e 73 65  StorageIndexInse
b900: 72 74 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67  rt(pTab->pStorag
b910: 65 2c 20 61 70 56 61 6c 2c 20 2a 70 69 52 6f 77  e, apVal, *piRow
b920: 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 63 20  id);.  }.  *pRc 
b930: 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  = rc;.}../* .** 
b940: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
b950: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
b960: 69 6f 6e 20 6f 66 20 74 68 65 20 78 55 70 64 61  ion of the xUpda
b970: 74 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  te callback used
b980: 20 62 79 20 0a 2a 2a 20 46 54 53 33 20 76 69 72   by .** FTS3 vir
b990: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 49 74 20  tual tables. It 
b9a0: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 53 51  is invoked by SQ
b9b0: 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65 20 61  Lite each time a
b9c0: 20 72 6f 77 20 69 73 20 74 6f 20 62 65 0a 2a 2a   row is to be.**
b9d0: 20 69 6e 73 65 72 74 65 64 2c 20 75 70 64 61 74   inserted, updat
b9e0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 2a  ed or deleted..*
b9f0: 2a 0a 2a 2a 20 41 20 64 65 6c 65 74 65 20 73 70  *.** A delete sp
ba00: 65 63 69 66 69 65 73 20 61 20 73 69 6e 67 6c 65  ecifies a single
ba10: 20 61 72 67 75 6d 65 6e 74 20 2d 20 74 68 65 20   argument - the 
ba20: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77  rowid of the row
ba30: 20 74 6f 20 72 65 6d 6f 76 65 2e 0a 2a 2a 20 0a   to remove..** .
ba40: 2a 2a 20 55 70 64 61 74 65 20 61 6e 64 20 69 6e  ** Update and in
ba50: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20  sert operations 
ba60: 70 61 73 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  pass:.**.**   1.
ba70: 20 54 68 65 20 22 6f 6c 64 22 20 72 6f 77 69 64   The "old" rowid
ba80: 2c 20 6f 72 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20  , or NULL..**   
ba90: 32 2e 20 54 68 65 20 22 6e 65 77 22 20 72 6f 77  2. The "new" row
baa0: 69 64 2e 0a 2a 2a 20 20 20 33 2e 20 56 61 6c 75  id..**   3. Valu
bab0: 65 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  es for each of t
bac0: 68 65 20 6e 43 6f 6c 20 6d 61 74 63 68 61 62 6c  he nCol matchabl
bad0: 65 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20 20 20  e columns..**   
bae0: 34 2e 20 56 61 6c 75 65 73 20 66 6f 72 20 74 68  4. Values for th
baf0: 65 20 74 77 6f 20 68 69 64 64 65 6e 20 63 6f 6c  e two hidden col
bb00: 75 6d 6e 73 20 28 3c 74 61 62 6c 65 6e 61 6d 65  umns (<tablename
bb10: 3e 20 61 6e 64 20 22 72 61 6e 6b 22 29 2e 0a 2a  > and "rank")..*
bb20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
bb30: 35 55 70 64 61 74 65 4d 65 74 68 6f 64 28 0a 20  5UpdateMethod(. 
bb40: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
bb50: 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  Vtab,           
bb60: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
bb70: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
bb80: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bba0: 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e   Size of argumen
bbb0: 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c  t array */.  sql
bbc0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
bbd0: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al,          /* 
bbe0: 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
bbf0: 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69  ts */.  sqlite_i
bc00: 6e 74 36 34 20 2a 70 52 6f 77 69 64 20 20 20 20  nt64 *pRowid    
bc10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
bc20: 54 68 65 20 61 66 66 65 63 74 65 64 20 28 6f 72  The affected (or
bc30: 20 65 66 66 65 63 74 65 64 29 20 72 6f 77 69 64   effected) rowid
bc40: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 54 61 62   */.){.  Fts5Tab
bc50: 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
bc60: 54 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20  Table*)pVtab;.  
bc70: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
bc80: 66 69 67 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6e  fig = pTab->pCon
bc90: 66 69 67 3b 0a 20 20 69 6e 74 20 65 54 79 70 65  fig;.  int eType
bca0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
bcb0: 20 20 20 20 20 20 20 2f 2a 20 76 61 6c 75 65 5f         /* value_
bcc0: 74 79 70 65 28 29 20 6f 66 20 61 70 56 61 6c 5b  type() of apVal[
bcd0: 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  0] */.  int rc =
bce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
bcf0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
bd00: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
bd10: 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
bd20: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
bd30: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
bd40: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
bd50: 62 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d 31 20  b->ts.eState==1 
bd60: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
bd70: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20  tab->zErrMsg==0 
bd80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  );.  assert( nAr
bd90: 67 3d 3d 31 20 7c 7c 20 6e 41 72 67 3d 3d 28 32  g==1 || nArg==(2
bda0: 2b 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 2b 32  +pConfig->nCol+2
bdb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
bdc0: 41 72 67 3d 3d 31 20 0a 20 20 20 20 20 20 7c 7c  Arg==1 .      ||
bdd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
bde0: 79 70 65 28 61 70 56 61 6c 5b 31 5d 29 3d 3d 53  ype(apVal[1])==S
bdf0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 0a 20  QLITE_INTEGER . 
be00: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
be10: 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
be20: 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])==SQLITE_NUL
be30: 4c 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  L .  );.  assert
be40: 28 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2d  ( pTab->pConfig-
be50: 3e 70 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a  >pzErrmsg==0 );.
be60: 20 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2d    pTab->pConfig-
be70: 3e 70 7a 45 72 72 6d 73 67 20 3d 20 26 70 54 61  >pzErrmsg = &pTa
be80: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3b  b->base.zErrMsg;
be90: 0a 0a 20 20 2f 2a 20 50 75 74 20 61 6e 79 20 61  ..  /* Put any a
bea0: 63 74 69 76 65 20 63 75 72 73 6f 72 73 20 69 6e  ctive cursors in
beb0: 74 6f 20 52 45 51 55 49 52 45 5f 53 45 45 4b 20  to REQUIRE_SEEK 
bec0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 66 74 73 35  state. */.  fts5
bed0: 54 72 69 70 43 75 72 73 6f 72 73 28 70 54 61 62  TripCursors(pTab
bee0: 29 3b 0a 0a 20 20 65 54 79 70 65 30 20 3d 20 73  );..  eType0 = s
bef0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
bf00: 65 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 69  e(apVal[0]);.  i
bf10: 66 28 20 65 54 79 70 65 30 3d 3d 53 51 4c 49 54  f( eType0==SQLIT
bf20: 45 5f 4e 55 4c 4c 20 0a 20 20 20 26 26 20 73 71  E_NULL .   && sq
bf30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
bf40: 28 61 70 56 61 6c 5b 32 2b 70 43 6f 6e 66 69 67  (apVal[2+pConfig
bf50: 2d 3e 6e 43 6f 6c 5d 29 21 3d 53 51 4c 49 54 45  ->nCol])!=SQLITE
bf60: 5f 4e 55 4c 4c 20 0a 20 20 29 7b 0a 20 20 20 20  _NULL .  ){.    
bf70: 2f 2a 20 41 20 22 73 70 65 63 69 61 6c 22 20 49  /* A "special" I
bf80: 4e 53 45 52 54 20 6f 70 2e 20 54 68 65 73 65 20  NSERT op. These 
bf90: 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
bfa0: 72 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 63  rately. */.    c
bfb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
bfc0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
bfd0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
bfe0: 70 56 61 6c 5b 32 2b 70 43 6f 6e 66 69 67 2d 3e  pVal[2+pConfig->
bff0: 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 69 66 28 20  nCol]);.    if( 
c000: 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e  pConfig->eConten
c010: 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f  t!=FTS5_CONTENT_
c020: 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 26 26  NORMAL .      &&
c030: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
c040: 63 6d 70 28 22 64 65 6c 65 74 65 22 2c 20 7a 29  cmp("delete", z)
c050: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72   .    ){.      r
c060: 63 20 3d 20 66 74 73 35 53 70 65 63 69 61 6c 44  c = fts5SpecialD
c070: 65 6c 65 74 65 28 70 54 61 62 2c 20 61 70 56 61  elete(pTab, apVa
c080: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
c090: 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 53 70       rc = fts5Sp
c0a0: 65 63 69 61 6c 49 6e 73 65 72 74 28 70 54 61 62  ecialInsert(pTab
c0b0: 2c 20 7a 2c 20 61 70 56 61 6c 5b 32 20 2b 20 70  , z, apVal[2 + p
c0c0: 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20 2b 20 31  Config->nCol + 1
c0d0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
c0e0: 65 7b 0a 20 20 20 20 2f 2a 20 41 20 72 65 67 75  e{.    /* A regu
c0f0: 6c 61 72 20 49 4e 53 45 52 54 2c 20 55 50 44 41  lar INSERT, UPDA
c100: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
c110: 74 65 6d 65 6e 74 2e 20 54 68 65 20 74 72 69 63  tement. The tric
c120: 6b 20 68 65 72 65 20 69 73 20 74 68 61 74 0a 20  k here is that. 
c130: 20 20 20 2a 2a 20 61 6e 79 20 63 6f 6e 66 6c 69     ** any confli
c140: 63 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20  ct on the rowid 
c150: 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 64 65  value must be de
c160: 74 65 63 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tected before an
c170: 79 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 69 66 69  y .    ** modifi
c180: 63 61 74 69 6f 6e 73 20 61 72 65 20 6d 61 64 65  cations are made
c190: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
c1a0: 20 66 69 6c 65 2e 20 54 68 65 72 65 20 61 72 65   file. There are
c1b0: 20 34 20 63 61 73 65 73 3a 0a 20 20 20 20 2a 2a   4 cases:.    **
c1c0: 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 44 45 4c  .    **   1) DEL
c1d0: 45 54 45 0a 20 20 20 20 2a 2a 20 20 20 32 29 20  ETE.    **   2) 
c1e0: 55 50 44 41 54 45 20 28 72 6f 77 69 64 20 6e 6f  UPDATE (rowid no
c1f0: 74 20 6d 6f 64 69 66 69 65 64 29 0a 20 20 20 20  t modified).    
c200: 2a 2a 20 20 20 33 29 20 55 50 44 41 54 45 20 28  **   3) UPDATE (
c210: 72 6f 77 69 64 20 6d 6f 64 69 66 69 65 64 29 0a  rowid modified).
c220: 20 20 20 20 2a 2a 20 20 20 34 29 20 49 4e 53 45      **   4) INSE
c230: 52 54 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  RT.    **.    **
c240: 20 43 61 73 65 73 20 33 20 61 6e 64 20 34 20 6d   Cases 3 and 4 m
c250: 61 79 20 76 69 6f 6c 61 74 65 20 74 68 65 20 72  ay violate the r
c260: 6f 77 69 64 20 63 6f 6e 73 74 72 61 69 6e 74 2e  owid constraint.
c270: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
c280: 65 43 6f 6e 66 6c 69 63 74 20 3d 20 53 51 4c 49  eConflict = SQLI
c290: 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 69 66  TE_ABORT;.    if
c2a0: 28 20 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74  ( pConfig->eCont
c2b0: 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e  ent==FTS5_CONTEN
c2c0: 54 5f 4e 4f 52 4d 41 4c 20 29 7b 0a 20 20 20 20  T_NORMAL ){.    
c2d0: 20 20 65 43 6f 6e 66 6c 69 63 74 20 3d 20 73 71    eConflict = sq
c2e0: 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f  lite3_vtab_on_co
c2f0: 6e 66 6c 69 63 74 28 70 43 6f 6e 66 69 67 2d 3e  nflict(pConfig->
c300: 64 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  db);.    }..    
c310: 61 73 73 65 72 74 28 20 65 54 79 70 65 30 3d 3d  assert( eType0==
c320: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c  SQLITE_INTEGER |
c330: 7c 20 65 54 79 70 65 30 3d 3d 53 51 4c 49 54 45  | eType0==SQLITE
c340: 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73  _NULL );.    ass
c350: 65 72 74 28 20 6e 41 72 67 21 3d 31 20 7c 7c 20  ert( nArg!=1 || 
c360: 65 54 79 70 65 30 3d 3d 53 51 4c 49 54 45 5f 49  eType0==SQLITE_I
c370: 4e 54 45 47 45 52 20 29 3b 0a 0a 20 20 20 20 2f  NTEGER );..    /
c380: 2a 20 46 69 6c 74 65 72 20 6f 75 74 20 61 74 74  * Filter out att
c390: 65 6d 70 74 73 20 74 6f 20 72 75 6e 20 55 50 44  empts to run UPD
c3a0: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 6f 6e  ATE or DELETE on
c3b0: 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20 74 61 62   contentless tab
c3c0: 6c 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  les..    ** This
c3d0: 20 69 73 20 6e 6f 74 20 73 75 70 6f 72 74 65 64   is not suported
c3e0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 54  .  */.    if( eT
c3f0: 79 70 65 30 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  ype0==SQLITE_INT
c400: 45 47 45 52 20 26 26 20 66 74 73 35 49 73 43 6f  EGER && fts5IsCo
c410: 6e 74 65 6e 74 6c 65 73 73 28 70 54 61 62 29 20  ntentless(pTab) 
c420: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 62  ){.      pTab->b
c430: 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ase.zErrMsg = sq
c440: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
c450: 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
c460: 20 25 73 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20   %s contentless 
c470: 66 74 73 35 20 74 61 62 6c 65 3a 20 25 73 22 2c  fts5 table: %s",
c480: 20 0a 20 20 20 20 20 20 20 20 20 20 28 6e 41 72   .          (nAr
c490: 67 3e 31 20 3f 20 22 55 50 44 41 54 45 22 20 3a  g>1 ? "UPDATE" :
c4a0: 20 22 44 45 4c 45 54 45 20 66 72 6f 6d 22 29 2c   "DELETE from"),
c4b0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
c4c0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
c4d0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
c4e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c4f0: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20 65 6c  DELETE */.    el
c500: 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29  se if( nArg==1 )
c510: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
c520: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c530: 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29  _int64(apVal[0])
c540: 3b 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 64  ;  /* Rowid to d
c550: 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  elete */.      r
c560: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53  c = sqlite3Fts5S
c570: 74 6f 72 61 67 65 44 65 6c 65 74 65 28 70 54 61  torageDelete(pTa
c580: 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69 44 65  b->pStorage, iDe
c590: 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  l, 0);.    }..  
c5a0: 20 20 2f 2a 20 49 4e 53 45 52 54 20 2a 2f 0a 20    /* INSERT */. 
c5b0: 20 20 20 65 6c 73 65 20 69 66 28 20 65 54 79 70     else if( eTyp
c5c0: 65 30 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  e0!=SQLITE_INTEG
c5d0: 45 52 20 29 7b 20 20 20 20 20 0a 20 20 20 20 20  ER ){     .     
c5e0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
c5f0: 20 52 45 50 4c 41 43 45 2c 20 66 69 72 73 74 20   REPLACE, first 
c600: 72 65 6d 6f 76 65 20 74 68 65 20 63 75 72 72 65  remove the curre
c610: 6e 74 20 65 6e 74 72 79 20 28 69 66 20 61 6e 79  nt entry (if any
c620: 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 65  ) */.      if( e
c630: 43 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54 45  Conflict==SQLITE
c640: 5f 52 45 50 4c 41 43 45 20 0a 20 20 20 20 20 20  _REPLACE .      
c650: 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
c660: 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d 29  e_type(apVal[1])
c670: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
c680: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
c690: 20 20 20 69 36 34 20 69 4e 65 77 20 3d 20 73 71     i64 iNew = sq
c6a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
c6b0: 34 28 61 70 56 61 6c 5b 31 5d 29 3b 20 20 2f 2a  4(apVal[1]);  /*
c6c0: 20 52 6f 77 69 64 20 74 6f 20 64 65 6c 65 74 65   Rowid to delete
c6d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
c6e0: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
c6f0: 61 67 65 44 65 6c 65 74 65 28 70 54 61 62 2d 3e  ageDelete(pTab->
c700: 70 53 74 6f 72 61 67 65 2c 20 69 4e 65 77 2c 20  pStorage, iNew, 
c710: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
c720: 20 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e 73    fts5StorageIns
c730: 65 72 74 28 26 72 63 2c 20 70 54 61 62 2c 20 61  ert(&rc, pTab, a
c740: 70 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20  pVal, pRowid);. 
c750: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 50 44     }..    /* UPD
c760: 41 54 45 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b  ATE */.    else{
c770: 0a 20 20 20 20 20 20 69 36 34 20 69 4f 6c 64 20  .      i64 iOld 
c780: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
c790: 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b  int64(apVal[0]);
c7a0: 20 20 2f 2a 20 4f 6c 64 20 72 6f 77 69 64 20 2a    /* Old rowid *
c7b0: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4e 65 77  /.      i64 iNew
c7c0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c7d0: 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 31 5d 29  _int64(apVal[1])
c7e0: 3b 20 20 2f 2a 20 4e 65 77 20 72 6f 77 69 64 20  ;  /* New rowid 
c7f0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 4f 6c  */.      if( iOl
c800: 64 21 3d 69 4e 65 77 20 29 7b 0a 20 20 20 20 20  d!=iNew ){.     
c810: 20 20 20 69 66 28 20 65 43 6f 6e 66 6c 69 63 74     if( eConflict
c820: 3d 3d 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  ==SQLITE_REPLACE
c830: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
c840: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
c850: 6f 72 61 67 65 44 65 6c 65 74 65 28 70 54 61 62  orageDelete(pTab
c860: 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69 4f 6c 64  ->pStorage, iOld
c870: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
c880: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c890: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
c8a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
c8b0: 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 28 70  5StorageDelete(p
c8c0: 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69  Tab->pStorage, i
c8d0: 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  New, 0);.       
c8e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
c8f0: 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65 72 74  ts5StorageInsert
c900: 28 26 72 63 2c 20 70 54 61 62 2c 20 61 70 56 61  (&rc, pTab, apVa
c910: 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  l, pRowid);.    
c920: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c930: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c940: 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f 6e 74  3Fts5StorageCont
c950: 65 6e 74 49 6e 73 65 72 74 28 70 54 61 62 2d 3e  entInsert(pTab->
c960: 70 53 74 6f 72 61 67 65 2c 20 61 70 56 61 6c 2c  pStorage, apVal,
c970: 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   pRowid);.      
c980: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c990: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c9a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c9b0: 33 46 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65  3Fts5StorageDele
c9c0: 74 65 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67  te(pTab->pStorag
c9d0: 65 2c 20 69 4f 6c 64 2c 20 30 29 3b 0a 20 20 20  e, iOld, 0);.   
c9e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c9f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ca00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ca10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ca20: 46 74 73 35 53 74 6f 72 61 67 65 49 6e 64 65 78  Fts5StorageIndex
ca30: 49 6e 73 65 72 74 28 70 54 61 62 2d 3e 70 53 74  Insert(pTab->pSt
ca40: 6f 72 61 67 65 2c 20 61 70 56 61 6c 2c 20 2a 70  orage, apVal, *p
ca50: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
ca60: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ca70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ca80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
ca90: 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65  ts5StorageDelete
caa0: 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c  (pTab->pStorage,
cab0: 20 69 4f 6c 64 2c 20 30 29 3b 0a 20 20 20 20 20   iOld, 0);.     
cac0: 20 20 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e     fts5StorageIn
cad0: 73 65 72 74 28 26 72 63 2c 20 70 54 61 62 2c 20  sert(&rc, pTab, 
cae0: 61 70 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a  apVal, pRowid);.
caf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cb00: 7d 0a 0a 20 20 70 54 61 62 2d 3e 70 43 6f 6e 66  }..  pTab->pConf
cb10: 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20 3d 20 30  ig->pzErrmsg = 0
cb20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cb30: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
cb40: 74 61 74 69 6f 6e 20 6f 66 20 78 53 79 6e 63 28  tation of xSync(
cb50: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2f 0a 73 74  ) method. .*/.st
cb60: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 79 6e  atic int fts5Syn
cb70: 63 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  cMethod(sqlite3_
cb80: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
cb90: 69 6e 74 20 72 63 3b 0a 20 20 46 74 73 35 54 61  int rc;.  Fts5Ta
cba0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73  ble *pTab = (Fts
cbb0: 35 54 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20  5Table*)pVtab;. 
cbc0: 20 66 74 73 35 43 68 65 63 6b 54 72 61 6e 73 61   fts5CheckTransa
cbd0: 63 74 69 6f 6e 53 74 61 74 65 28 70 54 61 62 2c  ctionState(pTab,
cbe0: 20 46 54 53 35 5f 53 59 4e 43 2c 20 30 29 3b 0a   FTS5_SYNC, 0);.
cbf0: 20 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2d    pTab->pConfig-
cc00: 3e 70 7a 45 72 72 6d 73 67 20 3d 20 26 70 54 61  >pzErrmsg = &pTa
cc10: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3b  b->base.zErrMsg;
cc20: 0a 20 20 66 74 73 35 54 72 69 70 43 75 72 73 6f  .  fts5TripCurso
cc30: 72 73 28 70 54 61 62 29 3b 0a 20 20 72 63 20 3d  rs(pTab);.  rc =
cc40: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
cc50: 61 67 65 53 79 6e 63 28 70 54 61 62 2d 3e 70 53  ageSync(pTab->pS
cc60: 74 6f 72 61 67 65 29 3b 0a 20 20 70 54 61 62 2d  torage);.  pTab-
cc70: 3e 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d  >pConfig->pzErrm
cc80: 73 67 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  sg = 0;.  return
cc90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
cca0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
ccb0: 78 42 65 67 69 6e 28 29 20 6d 65 74 68 6f 64 2e  xBegin() method.
ccc0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
ccd0: 66 74 73 35 42 65 67 69 6e 4d 65 74 68 6f 64 28  fts5BeginMethod(
cce0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
ccf0: 74 61 62 29 7b 0a 20 20 66 74 73 35 43 68 65 63  tab){.  fts5Chec
cd00: 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74  kTransactionStat
cd10: 65 28 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56  e((Fts5Table*)pV
cd20: 74 61 62 2c 20 46 54 53 35 5f 42 45 47 49 4e 2c  tab, FTS5_BEGIN,
cd30: 20 30 29 3b 0a 20 20 66 74 73 35 4e 65 77 54 72   0);.  fts5NewTr
cd40: 61 6e 73 61 63 74 69 6f 6e 28 28 46 74 73 35 54  ansaction((Fts5T
cd50: 61 62 6c 65 2a 29 70 56 74 61 62 29 3b 0a 20 20  able*)pVtab);.  
cd60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cd70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
cd80: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 43 6f  mentation of xCo
cd90: 6d 6d 69 74 28 29 20 6d 65 74 68 6f 64 2e 20 54  mmit() method. T
cda0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
cdb0: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a  The contents of.
cdc0: 2a 2a 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  ** the pending-t
cdd0: 65 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65 20  erms hash-table 
cde0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
cdf0: 6e 20 66 6c 75 73 68 65 64 20 69 6e 74 6f 20 74  n flushed into t
ce00: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 62  he database.** b
ce10: 79 20 66 74 73 35 53 79 6e 63 4d 65 74 68 6f 64  y fts5SyncMethod
ce20: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
ce30: 74 20 66 74 73 35 43 6f 6d 6d 69 74 4d 65 74 68  t fts5CommitMeth
ce40: 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  od(sqlite3_vtab 
ce50: 2a 70 56 74 61 62 29 7b 0a 20 20 55 4e 55 53 45  *pVtab){.  UNUSE
ce60: 44 5f 50 41 52 41 4d 28 70 56 74 61 62 29 3b 20  D_PARAM(pVtab); 
ce70: 20 2f 2a 20 43 61 6c 6c 20 62 65 6c 6f 77 20 69   /* Call below i
ce80: 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 4e 44  s a no-op for ND
ce90: 45 42 55 47 20 62 75 69 6c 64 73 20 2a 2f 0a 20  EBUG builds */. 
cea0: 20 66 74 73 35 43 68 65 63 6b 54 72 61 6e 73 61   fts5CheckTransa
ceb0: 63 74 69 6f 6e 53 74 61 74 65 28 28 46 74 73 35  ctionState((Fts5
cec0: 54 61 62 6c 65 2a 29 70 56 74 61 62 2c 20 46 54  Table*)pVtab, FT
ced0: 53 35 5f 43 4f 4d 4d 49 54 2c 20 30 29 3b 0a 20  S5_COMMIT, 0);. 
cee0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cef0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  K;.}../*.** Impl
cf00: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 52  ementation of xR
cf10: 6f 6c 6c 62 61 63 6b 28 29 2e 20 44 69 73 63 61  ollback(). Disca
cf20: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
cf30: 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  of the pending-t
cf40: 65 72 6d 73 0a 2a 2a 20 68 61 73 68 2d 74 61 62  erms.** hash-tab
cf50: 6c 65 2e 20 41 6e 79 20 63 68 61 6e 67 65 73 20  le. Any changes 
cf60: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
cf70: 62 61 73 65 20 61 72 65 20 72 65 76 65 72 74 65  base are reverte
cf80: 64 20 62 79 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  d by SQLite..*/.
cf90: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 52  static int fts5R
cfa0: 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 28 73 71  ollbackMethod(sq
cfb0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
cfc0: 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b){.  int rc;.  
cfd0: 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20  Fts5Table *pTab 
cfe0: 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56  = (Fts5Table*)pV
cff0: 74 61 62 3b 0a 20 20 66 74 73 35 43 68 65 63 6b  tab;.  fts5Check
d000: 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65  TransactionState
d010: 28 70 54 61 62 2c 20 46 54 53 35 5f 52 4f 4c 4c  (pTab, FTS5_ROLL
d020: 42 41 43 4b 2c 20 30 29 3b 0a 20 20 72 63 20 3d  BACK, 0);.  rc =
d030: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
d040: 61 67 65 52 6f 6c 6c 62 61 63 6b 28 70 54 61 62  ageRollback(pTab
d050: 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a 20 20 72  ->pStorage);.  r
d060: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
d070: 74 69 63 20 69 6e 74 20 66 74 73 35 43 73 72 50  tic int fts5CsrP
d080: 6f 73 6c 69 73 74 28 46 74 73 35 43 75 72 73 6f  oslist(Fts5Curso
d090: 72 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 75  r*, int, const u
d0a0: 38 2a 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 73 74 61  8**, int*);..sta
d0b0: 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 41 70  tic void *fts5Ap
d0c0: 69 55 73 65 72 44 61 74 61 28 46 74 73 35 43 6f  iUserData(Fts5Co
d0d0: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
d0e0: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
d0f0: 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29   = (Fts5Cursor*)
d100: 70 43 74 78 3b 0a 20 20 72 65 74 75 72 6e 20 70  pCtx;.  return p
d110: 43 73 72 2d 3e 70 41 75 78 2d 3e 70 55 73 65 72  Csr->pAux->pUser
d120: 44 61 74 61 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Data;.}..static 
d130: 69 6e 74 20 66 74 73 35 41 70 69 43 6f 6c 75 6d  int fts5ApiColum
d140: 6e 43 6f 75 6e 74 28 46 74 73 35 43 6f 6e 74 65  nCount(Fts5Conte
d150: 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 46 74 73  xt *pCtx){.  Fts
d160: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  5Cursor *pCsr = 
d170: 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74  (Fts5Cursor*)pCt
d180: 78 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 46 74  x;.  return ((Ft
d190: 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e  s5Table*)(pCsr->
d1a0: 62 61 73 65 2e 70 56 74 61 62 29 29 2d 3e 70 43  base.pVtab))->pC
d1b0: 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 7d 0a 0a  onfig->nCol;.}..
d1c0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41  static int fts5A
d1d0: 70 69 43 6f 6c 75 6d 6e 54 6f 74 61 6c 53 69 7a  piColumnTotalSiz
d1e0: 65 28 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74  e(.  Fts5Context
d1f0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 69   *pCtx, .  int i
d200: 43 6f 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  Col, .  sqlite3_
d210: 69 6e 74 36 34 20 2a 70 6e 54 6f 6b 65 6e 0a 29  int64 *pnToken.)
d220: 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  {.  Fts5Cursor *
d230: 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73  pCsr = (Fts5Curs
d240: 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46 74 73 35  or*)pCtx;.  Fts5
d250: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
d260: 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72 2d  ts5Table*)(pCsr-
d270: 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a 20 20  >base.pVtab);.  
d280: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
d290: 73 35 53 74 6f 72 61 67 65 53 69 7a 65 28 70 54  s5StorageSize(pT
d2a0: 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69 43  ab->pStorage, iC
d2b0: 6f 6c 2c 20 70 6e 54 6f 6b 65 6e 29 3b 0a 7d 0a  ol, pnToken);.}.
d2c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
d2d0: 41 70 69 52 6f 77 43 6f 75 6e 74 28 46 74 73 35  ApiRowCount(Fts5
d2e0: 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  Context *pCtx, i
d2f0: 36 34 20 2a 70 6e 52 6f 77 29 7b 0a 20 20 46 74  64 *pnRow){.  Ft
d300: 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  s5Cursor *pCsr =
d310: 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43   (Fts5Cursor*)pC
d320: 74 78 3b 0a 20 20 46 74 73 35 54 61 62 6c 65 20  tx;.  Fts5Table 
d330: 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62  *pTab = (Fts5Tab
d340: 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e  le*)(pCsr->base.
d350: 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75 72 6e  pVtab);.  return
d360: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
d370: 61 67 65 52 6f 77 43 6f 75 6e 74 28 70 54 61 62  ageRowCount(pTab
d380: 2d 3e 70 53 74 6f 72 61 67 65 2c 20 70 6e 52 6f  ->pStorage, pnRo
d390: 77 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  w);.}..static in
d3a0: 74 20 66 74 73 35 41 70 69 54 6f 6b 65 6e 69 7a  t fts5ApiTokeniz
d3b0: 65 28 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74  e(.  Fts5Context
d3c0: 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74   *pCtx, .  const
d3d0: 20 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e   char *pText, in
d3e0: 74 20 6e 54 65 78 74 2c 20 0a 20 20 76 6f 69 64  t nText, .  void
d3f0: 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 69   *pUserData,.  i
d400: 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69  nt (*xToken)(voi
d410: 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63  d*, int, const c
d420: 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  har*, int, int, 
d430: 69 6e 74 29 0a 29 7b 0a 20 20 46 74 73 35 43 75  int).){.  Fts5Cu
d440: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
d450: 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a  s5Cursor*)pCtx;.
d460: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
d470: 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
d480: 28 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  (pCsr->base.pVta
d490: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b);.  return sql
d4a0: 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ite3Fts5Tokenize
d4b0: 28 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 43  (.      pTab->pC
d4c0: 6f 6e 66 69 67 2c 20 46 54 53 35 5f 54 4f 4b 45  onfig, FTS5_TOKE
d4d0: 4e 49 5a 45 5f 41 55 58 2c 20 70 54 65 78 74 2c  NIZE_AUX, pText,
d4e0: 20 6e 54 65 78 74 2c 20 70 55 73 65 72 44 61 74   nText, pUserDat
d4f0: 61 2c 20 78 54 6f 6b 65 6e 0a 20 20 29 3b 0a 7d  a, xToken.  );.}
d500: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
d510: 35 41 70 69 50 68 72 61 73 65 43 6f 75 6e 74 28  5ApiPhraseCount(
d520: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
d530: 78 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72  x){.  Fts5Cursor
d540: 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75   *pCsr = (Fts5Cu
d550: 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 72 65  rsor*)pCtx;.  re
d560: 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35  turn sqlite3Fts5
d570: 45 78 70 72 50 68 72 61 73 65 43 6f 75 6e 74 28  ExprPhraseCount(
d580: 70 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a  pCsr->pExpr);.}.
d590: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
d5a0: 41 70 69 50 68 72 61 73 65 53 69 7a 65 28 46 74  ApiPhraseSize(Ft
d5b0: 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  s5Context *pCtx,
d5c0: 20 69 6e 74 20 69 50 68 72 61 73 65 29 7b 0a 20   int iPhrase){. 
d5d0: 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73   Fts5Cursor *pCs
d5e0: 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a  r = (Fts5Cursor*
d5f0: 29 70 43 74 78 3b 0a 20 20 72 65 74 75 72 6e 20  )pCtx;.  return 
d600: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50  sqlite3Fts5ExprP
d610: 68 72 61 73 65 53 69 7a 65 28 70 43 73 72 2d 3e  hraseSize(pCsr->
d620: 70 45 78 70 72 2c 20 69 50 68 72 61 73 65 29 3b  pExpr, iPhrase);
d630: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
d640: 74 73 35 41 70 69 43 6f 6c 75 6d 6e 54 65 78 74  ts5ApiColumnText
d650: 28 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20  (.  Fts5Context 
d660: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 69 43  *pCtx, .  int iC
d670: 6f 6c 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  ol, .  const cha
d680: 72 20 2a 2a 70 7a 2c 20 0a 20 20 69 6e 74 20 2a  r **pz, .  int *
d690: 70 6e 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pn.){.  int rc =
d6a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74   SQLITE_OK;.  Ft
d6b0: 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  s5Cursor *pCsr =
d6c0: 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43   (Fts5Cursor*)pC
d6d0: 74 78 3b 0a 20 20 69 66 28 20 66 74 73 35 49 73  tx;.  if( fts5Is
d6e0: 43 6f 6e 74 65 6e 74 6c 65 73 73 28 28 46 74 73  Contentless((Fts
d6f0: 35 54 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62  5Table*)(pCsr->b
d700: 61 73 65 2e 70 56 74 61 62 29 29 20 29 7b 0a 20  ase.pVtab)) ){. 
d710: 20 20 20 2a 70 7a 20 3d 20 30 3b 0a 20 20 20 20     *pz = 0;.    
d720: 2a 70 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  *pn = 0;.  }else
d730: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 53  {.    rc = fts5S
d740: 65 65 6b 43 75 72 73 6f 72 28 70 43 73 72 2c 20  eekCursor(pCsr, 
d750: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
d760: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d770: 20 20 20 2a 70 7a 20 3d 20 28 63 6f 6e 73 74 20     *pz = (const 
d780: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
d790: 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73 72 2d 3e  lumn_text(pCsr->
d7a0: 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a  pStmt, iCol+1);.
d7b0: 20 20 20 20 20 20 2a 70 6e 20 3d 20 73 71 6c 69        *pn = sqli
d7c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
d7d0: 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 69 43  (pCsr->pStmt, iC
d7e0: 6f 6c 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ol+1);.    }.  }
d7f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d800: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
d810: 43 73 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  CsrPoslist(.  Ft
d820: 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s5Cursor *pCsr, 
d830: 0a 20 20 69 6e 74 20 69 50 68 72 61 73 65 2c 20  .  int iPhrase, 
d840: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61  .  const u8 **pa
d850: 2c 0a 20 20 69 6e 74 20 2a 70 6e 0a 29 7b 0a 20  ,.  int *pn.){. 
d860: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
d870: 6e 66 69 67 20 3d 20 28 28 46 74 73 35 54 61 62  nfig = ((Fts5Tab
d880: 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e  le*)(pCsr->base.
d890: 70 56 74 61 62 29 29 2d 3e 70 43 6f 6e 66 69 67  pVtab))->pConfig
d8a0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
d8b0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 4c  ITE_OK;.  int bL
d8c0: 69 76 65 20 3d 20 28 70 43 73 72 2d 3e 70 53 6f  ive = (pCsr->pSo
d8d0: 72 74 65 72 3d 3d 30 29 3b 0a 0a 20 20 69 66 28  rter==0);..  if(
d8e0: 20 43 73 72 46 6c 61 67 54 65 73 74 28 70 43 73   CsrFlagTest(pCs
d8f0: 72 2c 20 46 54 53 35 43 53 52 5f 52 45 51 55 49  r, FTS5CSR_REQUI
d900: 52 45 5f 50 4f 53 4c 49 53 54 29 20 29 7b 0a 0a  RE_POSLIST) ){..
d910: 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
d920: 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
d930: 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20  ETAIL_FULL ){.  
d940: 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 50      Fts5PoslistP
d950: 6f 70 75 6c 61 74 6f 72 20 2a 61 50 6f 70 75 6c  opulator *aPopul
d960: 61 74 6f 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  ator;.      int 
d970: 69 3b 0a 20 20 20 20 20 20 61 50 6f 70 75 6c 61  i;.      aPopula
d980: 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 46 74 73  tor = sqlite3Fts
d990: 35 45 78 70 72 43 6c 65 61 72 50 6f 73 6c 69 73  5ExprClearPoslis
d9a0: 74 73 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20  ts(pCsr->pExpr, 
d9b0: 62 4c 69 76 65 29 3b 0a 20 20 20 20 20 20 69 66  bLive);.      if
d9c0: 28 20 61 50 6f 70 75 6c 61 74 6f 72 3d 3d 30 20  ( aPopulator==0 
d9d0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
d9e0: 4d 45 4d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  MEM;.      for(i
d9f0: 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
da00: 43 6f 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Col && rc==SQLIT
da10: 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
da20: 20 20 20 20 69 6e 74 20 6e 3b 20 63 6f 6e 73 74      int n; const
da30: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
da40: 20 20 72 63 20 3d 20 66 74 73 35 41 70 69 43 6f    rc = fts5ApiCo
da50: 6c 75 6d 6e 54 65 78 74 28 28 46 74 73 35 43 6f  lumnText((Fts5Co
da60: 6e 74 65 78 74 2a 29 70 43 73 72 2c 20 69 2c 20  ntext*)pCsr, i, 
da70: 26 7a 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &z, &n);.       
da80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
da90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
daa0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
dab0: 45 78 70 72 50 6f 70 75 6c 61 74 65 50 6f 73 6c  ExprPopulatePosl
dac0: 69 73 74 73 28 0a 20 20 20 20 20 20 20 20 20 20  ists(.          
dad0: 20 20 20 20 70 43 6f 6e 66 69 67 2c 20 70 43 73      pConfig, pCs
dae0: 72 2d 3e 70 45 78 70 72 2c 20 61 50 6f 70 75 6c  r->pExpr, aPopul
daf0: 61 74 6f 72 2c 20 69 2c 20 7a 2c 20 6e 0a 20 20  ator, i, z, n.  
db00: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
db10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
db20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
db30: 61 50 6f 70 75 6c 61 74 6f 72 29 3b 0a 0a 20 20  aPopulator);..  
db40: 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70 53      if( pCsr->pS
db50: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  orter ){.       
db60: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
db70: 43 68 65 63 6b 50 6f 73 6c 69 73 74 73 28 70 43  CheckPoslists(pC
db80: 73 72 2d 3e 70 45 78 70 72 2c 20 70 43 73 72 2d  sr->pExpr, pCsr-
db90: 3e 70 53 6f 72 74 65 72 2d 3e 69 52 6f 77 69 64  >pSorter->iRowid
dba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
dbb0: 0a 20 20 20 20 43 73 72 46 6c 61 67 43 6c 65 61  .    CsrFlagClea
dbc0: 72 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f  r(pCsr, FTS5CSR_
dbd0: 52 45 51 55 49 52 45 5f 50 4f 53 4c 49 53 54 29  REQUIRE_POSLIST)
dbe0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 73  ;.  }..  if( pCs
dbf0: 72 2d 3e 70 53 6f 72 74 65 72 20 26 26 20 70 43  r->pSorter && pC
dc00: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
dc10: 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c  FTS5_DETAIL_FULL
dc20: 20 29 7b 0a 20 20 20 20 46 74 73 35 53 6f 72 74   ){.    Fts5Sort
dc30: 65 72 20 2a 70 53 6f 72 74 65 72 20 3d 20 70 43  er *pSorter = pC
dc40: 73 72 2d 3e 70 53 6f 72 74 65 72 3b 0a 20 20 20  sr->pSorter;.   
dc50: 20 69 6e 74 20 69 31 20 3d 20 28 69 50 68 72 61   int i1 = (iPhra
dc60: 73 65 3d 3d 30 20 3f 20 30 20 3a 20 70 53 6f 72  se==0 ? 0 : pSor
dc70: 74 65 72 2d 3e 61 49 64 78 5b 69 50 68 72 61 73  ter->aIdx[iPhras
dc80: 65 2d 31 5d 29 3b 0a 20 20 20 20 2a 70 6e 20 3d  e-1]);.    *pn =
dc90: 20 70 53 6f 72 74 65 72 2d 3e 61 49 64 78 5b 69   pSorter->aIdx[i
dca0: 50 68 72 61 73 65 5d 20 2d 20 69 31 3b 0a 20 20  Phrase] - i1;.  
dcb0: 20 20 2a 70 61 20 3d 20 26 70 53 6f 72 74 65 72    *pa = &pSorter
dcc0: 2d 3e 61 50 6f 73 6c 69 73 74 5b 69 31 5d 3b 0a  ->aPoslist[i1];.
dcd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e    }else{.    *pn
dce0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78   = sqlite3Fts5Ex
dcf0: 70 72 50 6f 73 6c 69 73 74 28 70 43 73 72 2d 3e  prPoslist(pCsr->
dd00: 70 45 78 70 72 2c 20 69 50 68 72 61 73 65 2c 20  pExpr, iPhrase, 
dd10: 70 61 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  pa);.  }..  retu
dd20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
dd30: 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
dd40: 46 74 73 35 43 75 72 73 6f 72 2e 6e 49 6e 73 74  Fts5Cursor.nInst
dd50: 43 6f 75 6e 74 20 61 6e 64 20 61 49 6e 73 74 5b  Count and aInst[
dd60: 5d 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  ] variables are 
dd70: 70 6f 70 75 6c 61 74 65 64 0a 2a 2a 20 63 6f 72  populated.** cor
dd80: 72 65 63 74 6c 79 20 66 6f 72 20 74 68 65 20 63  rectly for the c
dd90: 75 72 72 65 6e 74 20 76 69 65 77 2e 20 52 65 74  urrent view. Ret
dda0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
ddb0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
ddc0: 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  an.** SQLite err
ddd0: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
dde0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ddf0: 20 66 74 73 35 43 61 63 68 65 49 6e 73 74 41 72   fts5CacheInstAr
de00: 72 61 79 28 46 74 73 35 43 75 72 73 6f 72 20 2a  ray(Fts5Cursor *
de10: 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  pCsr){.  int rc 
de20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
de30: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
de40: 20 2a 61 49 74 65 72 3b 20 20 20 20 20 20 20 2f   *aIter;       /
de50: 2a 20 4f 6e 65 20 69 74 65 72 61 74 6f 72 20 66  * One iterator f
de60: 6f 72 20 65 61 63 68 20 70 68 72 61 73 65 20 2a  or each phrase *
de70: 2f 0a 20 20 69 6e 74 20 6e 49 74 65 72 3b 20 20  /.  int nIter;  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dea0: 20 69 74 65 72 61 74 6f 72 73 2f 70 68 72 61 73   iterators/phras
deb0: 65 73 20 2a 2f 0a 20 20 0a 20 20 6e 49 74 65 72  es */.  .  nIter
dec0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78   = sqlite3Fts5Ex
ded0: 70 72 50 68 72 61 73 65 43 6f 75 6e 74 28 70 43  prPhraseCount(pC
dee0: 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20 69 66  sr->pExpr);.  if
def0: 28 20 70 43 73 72 2d 3e 61 49 6e 73 74 49 74 65  ( pCsr->aInstIte
df00: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  r==0 ){.    int 
df10: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
df20: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
df30: 29 20 2a 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  ) * nIter;.    p
df40: 43 73 72 2d 3e 61 49 6e 73 74 49 74 65 72 20 3d  Csr->aInstIter =
df50: 20 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61   (Fts5PoslistRea
df60: 64 65 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35  der*)sqlite3Fts5
df70: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
df80: 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 61 49  nByte);.  }.  aI
df90: 74 65 72 20 3d 20 70 43 73 72 2d 3e 61 49 6e 73  ter = pCsr->aIns
dfa0: 74 49 74 65 72 3b 0a 0a 20 20 69 66 28 20 61 49  tIter;..  if( aI
dfb0: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ter ){.    int n
dfc0: 49 6e 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Inst = 0;       
dfd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
dfe0: 65 72 20 69 6e 73 74 61 6e 63 65 73 20 73 65 65  er instances see
dff0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  n so far */.    
e000: 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 49  int i;..    /* I
e010: 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 69 74  nitialize all it
e020: 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 66  erators */.    f
e030: 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 74 65 72 20  or(i=0; i<nIter 
e040: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
e050: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
e060: 6e 73 74 20 75 38 20 2a 61 3b 0a 20 20 20 20 20  nst u8 *a;.     
e070: 20 69 6e 74 20 6e 3b 20 0a 20 20 20 20 20 20 72   int n; .      r
e080: 63 20 3d 20 66 74 73 35 43 73 72 50 6f 73 6c 69  c = fts5CsrPosli
e090: 73 74 28 70 43 73 72 2c 20 69 2c 20 26 61 2c 20  st(pCsr, i, &a, 
e0a0: 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  &n);.      if( r
e0b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e0c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
e0d0: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
e0e0: 49 6e 69 74 28 61 2c 20 6e 2c 20 26 61 49 74 65  Init(a, n, &aIte
e0f0: 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r[i]);.      }. 
e100: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
e110: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e120: 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
e130: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 49  .        int *aI
e140: 6e 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  nst;.        int
e150: 20 69 42 65 73 74 20 3d 20 2d 31 3b 0a 20 20 20   iBest = -1;.   
e160: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e170: 6e 49 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nIter; i++){.   
e180: 20 20 20 20 20 20 20 69 66 28 20 28 61 49 74 65         if( (aIte
e190: 72 5b 69 5d 2e 62 45 6f 66 3d 3d 30 29 20 0a 20  r[i].bEof==0) . 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
e1b0: 28 69 42 65 73 74 3c 30 20 7c 7c 20 61 49 74 65  (iBest<0 || aIte
e1c0: 72 5b 69 5d 2e 69 50 6f 73 3c 61 49 74 65 72 5b  r[i].iPos<aIter[
e1d0: 69 42 65 73 74 5d 2e 69 50 6f 73 29 20 0a 20 20  iBest].iPos) .  
e1e0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
e1f0: 20 20 20 20 20 20 20 20 20 69 42 65 73 74 20 3d           iBest =
e200: 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   i;.          }.
e210: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e220: 20 20 69 66 28 20 69 42 65 73 74 3c 30 20 29 20    if( iBest<0 ) 
e230: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20  break;..        
e240: 6e 49 6e 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20  nInst++;.       
e250: 20 69 66 28 20 6e 49 6e 73 74 3e 3d 70 43 73 72   if( nInst>=pCsr
e260: 2d 3e 6e 49 6e 73 74 41 6c 6c 6f 63 20 29 7b 0a  ->nInstAlloc ){.
e270: 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e            pCsr->
e280: 6e 49 6e 73 74 41 6c 6c 6f 63 20 3d 20 70 43 73  nInstAlloc = pCs
e290: 72 2d 3e 6e 49 6e 73 74 41 6c 6c 6f 63 20 3f 20  r->nInstAlloc ? 
e2a0: 70 43 73 72 2d 3e 6e 49 6e 73 74 41 6c 6c 6f 63  pCsr->nInstAlloc
e2b0: 2a 32 20 3a 20 33 32 3b 0a 20 20 20 20 20 20 20  *2 : 32;.       
e2c0: 20 20 20 61 49 6e 73 74 20 3d 20 28 69 6e 74 2a     aInst = (int*
e2d0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
e2e0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
e2f0: 70 43 73 72 2d 3e 61 49 6e 73 74 2c 20 70 43 73  pCsr->aInst, pCs
e300: 72 2d 3e 6e 49 6e 73 74 41 6c 6c 6f 63 2a 73 69  r->nInstAlloc*si
e310: 7a 65 6f 66 28 69 6e 74 29 2a 33 0a 20 20 20 20  zeof(int)*3.    
e320: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
e330: 20 20 20 20 20 20 20 69 66 28 20 61 49 6e 73 74         if( aInst
e340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e350: 70 43 73 72 2d 3e 61 49 6e 73 74 20 3d 20 61 49  pCsr->aInst = aI
e360: 6e 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nst;.          }
e370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e380: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
e390: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
e3a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e3b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
e3c0: 20 20 20 20 20 20 20 61 49 6e 73 74 20 3d 20 26         aInst = &
e3d0: 70 43 73 72 2d 3e 61 49 6e 73 74 5b 33 20 2a 20  pCsr->aInst[3 * 
e3e0: 28 6e 49 6e 73 74 2d 31 29 5d 3b 0a 20 20 20 20  (nInst-1)];.    
e3f0: 20 20 20 20 61 49 6e 73 74 5b 30 5d 20 3d 20 69      aInst[0] = i
e400: 42 65 73 74 3b 0a 20 20 20 20 20 20 20 20 61 49  Best;.        aI
e410: 6e 73 74 5b 31 5d 20 3d 20 46 54 53 35 5f 50 4f  nst[1] = FTS5_PO
e420: 53 32 43 4f 4c 55 4d 4e 28 61 49 74 65 72 5b 69  S2COLUMN(aIter[i
e430: 42 65 73 74 5d 2e 69 50 6f 73 29 3b 0a 20 20 20  Best].iPos);.   
e440: 20 20 20 20 20 61 49 6e 73 74 5b 32 5d 20 3d 20       aInst[2] = 
e450: 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28  FTS5_POS2OFFSET(
e460: 61 49 74 65 72 5b 69 42 65 73 74 5d 2e 69 50 6f  aIter[iBest].iPo
e470: 73 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  s);.        sqli
e480: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
e490: 61 64 65 72 4e 65 78 74 28 26 61 49 74 65 72 5b  aderNext(&aIter[
e4a0: 69 42 65 73 74 5d 29 3b 0a 20 20 20 20 20 20 7d  iBest]);.      }
e4b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 43 73 72  .    }..    pCsr
e4c0: 2d 3e 6e 49 6e 73 74 43 6f 75 6e 74 20 3d 20 6e  ->nInstCount = n
e4d0: 49 6e 73 74 3b 0a 20 20 20 20 43 73 72 46 6c 61  Inst;.    CsrFla
e4e0: 67 43 6c 65 61 72 28 70 43 73 72 2c 20 46 54 53  gClear(pCsr, FTS
e4f0: 35 43 53 52 5f 52 45 51 55 49 52 45 5f 49 4e 53  5CSR_REQUIRE_INS
e500: 54 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T);.  }.  return
e510: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
e520: 6e 74 20 66 74 73 35 41 70 69 49 6e 73 74 43 6f  nt fts5ApiInstCo
e530: 75 6e 74 28 46 74 73 35 43 6f 6e 74 65 78 74 20  unt(Fts5Context 
e540: 2a 70 43 74 78 2c 20 69 6e 74 20 2a 70 6e 49 6e  *pCtx, int *pnIn
e550: 73 74 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f  st){.  Fts5Curso
e560: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43  r *pCsr = (Fts5C
e570: 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 69  ursor*)pCtx;.  i
e580: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e590: 4b 3b 0a 20 20 69 66 28 20 43 73 72 46 6c 61 67  K;.  if( CsrFlag
e5a0: 54 65 73 74 28 70 43 73 72 2c 20 46 54 53 35 43  Test(pCsr, FTS5C
e5b0: 53 52 5f 52 45 51 55 49 52 45 5f 49 4e 53 54 29  SR_REQUIRE_INST)
e5c0: 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ==0 .   || SQLIT
e5d0: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 66 74 73 35  E_OK==(rc = fts5
e5e0: 43 61 63 68 65 49 6e 73 74 41 72 72 61 79 28 70  CacheInstArray(p
e5f0: 43 73 72 29 29 20 29 7b 0a 20 20 20 20 2a 70 6e  Csr)) ){.    *pn
e600: 49 6e 73 74 20 3d 20 70 43 73 72 2d 3e 6e 49 6e  Inst = pCsr->nIn
e610: 73 74 43 6f 75 6e 74 3b 0a 20 20 7d 0a 20 20 72  stCount;.  }.  r
e620: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
e630: 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 69 49  tic int fts5ApiI
e640: 6e 73 74 28 0a 20 20 46 74 73 35 43 6f 6e 74 65  nst(.  Fts5Conte
e650: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
e660: 20 69 49 64 78 2c 20 0a 20 20 69 6e 74 20 2a 70   iIdx, .  int *p
e670: 69 50 68 72 61 73 65 2c 20 0a 20 20 69 6e 74 20  iPhrase, .  int 
e680: 2a 70 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 2a  *piCol, .  int *
e690: 70 69 4f 66 66 0a 29 7b 0a 20 20 46 74 73 35 43  piOff.){.  Fts5C
e6a0: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
e6b0: 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b  ts5Cursor*)pCtx;
e6c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e6d0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 43 73 72  TE_OK;.  if( Csr
e6e0: 46 6c 61 67 54 65 73 74 28 70 43 73 72 2c 20 46  FlagTest(pCsr, F
e6f0: 54 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f 49  TS5CSR_REQUIRE_I
e700: 4e 53 54 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 53  NST)==0 .   || S
e710: 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
e720: 66 74 73 35 43 61 63 68 65 49 6e 73 74 41 72 72  fts5CacheInstArr
e730: 61 79 28 70 43 73 72 29 29 20 0a 20 20 29 7b 0a  ay(pCsr)) .  ){.
e740: 20 20 20 20 69 66 28 20 69 49 64 78 3c 30 20 7c      if( iIdx<0 |
e750: 7c 20 69 49 64 78 3e 3d 70 43 73 72 2d 3e 6e 49  | iIdx>=pCsr->nI
e760: 6e 73 74 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  nstCount ){.    
e770: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 41    rc = SQLITE_RA
e780: 4e 47 45 3b 0a 23 69 66 20 30 0a 20 20 20 20 7d  NGE;.#if 0.    }
e790: 65 6c 73 65 20 69 66 28 20 66 74 73 35 49 73 4f  else if( fts5IsO
e7a0: 66 66 73 65 74 6c 65 73 73 28 28 46 74 73 35 54  ffsetless((Fts5T
e7b0: 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62 61 73 65  able*)pCsr->base
e7c0: 2e 70 56 74 61 62 29 20 29 7b 0a 20 20 20 20 20  .pVtab) ){.     
e7d0: 20 2a 70 69 50 68 72 61 73 65 20 3d 20 70 43 73   *piPhrase = pCs
e7e0: 72 2d 3e 61 49 6e 73 74 5b 69 49 64 78 2a 33 5d  r->aInst[iIdx*3]
e7f0: 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d  ;.      *piCol =
e800: 20 70 43 73 72 2d 3e 61 49 6e 73 74 5b 69 49 64   pCsr->aInst[iId
e810: 78 2a 33 20 2b 20 32 5d 3b 0a 20 20 20 20 20 20  x*3 + 2];.      
e820: 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 23 65 6e  *piOff = -1;.#en
e830: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
e840: 20 20 20 20 20 2a 70 69 50 68 72 61 73 65 20 3d       *piPhrase =
e850: 20 70 43 73 72 2d 3e 61 49 6e 73 74 5b 69 49 64   pCsr->aInst[iId
e860: 78 2a 33 5d 3b 0a 20 20 20 20 20 20 2a 70 69 43  x*3];.      *piC
e870: 6f 6c 20 3d 20 70 43 73 72 2d 3e 61 49 6e 73 74  ol = pCsr->aInst
e880: 5b 69 49 64 78 2a 33 20 2b 20 31 5d 3b 0a 20 20  [iIdx*3 + 1];.  
e890: 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 70 43 73      *piOff = pCs
e8a0: 72 2d 3e 61 49 6e 73 74 5b 69 49 64 78 2a 33 20  r->aInst[iIdx*3 
e8b0: 2b 20 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  + 2];.    }.  }.
e8c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e8d0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
e8e0: 6e 74 36 34 20 66 74 73 35 41 70 69 52 6f 77 69  nt64 fts5ApiRowi
e8f0: 64 28 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70  d(Fts5Context *p
e900: 43 74 78 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Ctx){.  return f
e910: 74 73 35 43 75 72 73 6f 72 52 6f 77 69 64 28 28  ts5CursorRowid((
e920: 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78  Fts5Cursor*)pCtx
e930: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
e940: 20 66 74 73 35 43 6f 6c 75 6d 6e 53 69 7a 65 43   fts5ColumnSizeC
e950: 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  b(.  void *pCont
e960: 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
e970: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
e980: 74 6f 20 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  to int */.  int 
e990: 74 66 6c 61 67 73 2c 0a 20 20 63 6f 6e 73 74 20  tflags,.  const 
e9a0: 63 68 61 72 20 2a 70 55 6e 75 73 65 64 2c 20 20  char *pUnused,  
e9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
e9c0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
e9d0: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  oken */.  int nU
e9e0: 6e 75 73 65 64 2c 20 20 20 20 20 20 20 20 20 20  nused,          
e9f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ea00: 65 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 62 79  e of token in by
ea10: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e  tes */.  int iUn
ea20: 75 73 65 64 31 2c 20 20 20 20 20 20 20 20 20 20  used1,          
ea30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
ea40: 74 20 6f 66 66 73 65 74 20 6f 66 20 74 6f 6b 65  t offset of toke
ea50: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73  n */.  int iUnus
ea60: 65 64 32 20 20 20 20 20 20 20 20 20 20 20 20 20  ed2             
ea70: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
ea80: 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f  fset of token */
ea90: 0a 29 7b 0a 20 20 69 6e 74 20 2a 70 43 6e 74 20  .){.  int *pCnt 
eaa0: 3d 20 28 69 6e 74 2a 29 70 43 6f 6e 74 65 78 74  = (int*)pContext
eab0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
eac0: 32 28 70 55 6e 75 73 65 64 2c 20 6e 55 6e 75 73  2(pUnused, nUnus
ead0: 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed);.  UNUSED_PA
eae0: 52 41 4d 32 28 69 55 6e 75 73 65 64 31 2c 20 69  RAM2(iUnused1, i
eaf0: 55 6e 75 73 65 64 32 29 3b 0a 20 20 69 66 28 20  Unused2);.  if( 
eb00: 28 74 66 6c 61 67 73 20 26 20 46 54 53 35 5f 54  (tflags & FTS5_T
eb10: 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44 29 3d  OKEN_COLOCATED)=
eb20: 3d 30 20 29 7b 0a 20 20 20 20 28 2a 70 43 6e 74  =0 ){.    (*pCnt
eb30: 29 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )++;.  }.  retur
eb40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
eb50: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41  static int fts5A
eb60: 70 69 43 6f 6c 75 6d 6e 53 69 7a 65 28 46 74 73  piColumnSize(Fts
eb70: 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  5Context *pCtx, 
eb80: 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 2a 70  int iCol, int *p
eb90: 6e 54 6f 6b 65 6e 29 7b 0a 20 20 46 74 73 35 43  nToken){.  Fts5C
eba0: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
ebb0: 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b  ts5Cursor*)pCtx;
ebc0: 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54  .  Fts5Table *pT
ebd0: 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a  ab = (Fts5Table*
ebe0: 29 28 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  )(pCsr->base.pVt
ebf0: 61 62 29 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69  ab);.  Fts5Confi
ec00: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 54 61  g *pConfig = pTa
ec10: 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e  b->pConfig;.  in
ec20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ec30: 3b 0a 0a 20 20 69 66 28 20 43 73 72 46 6c 61 67  ;..  if( CsrFlag
ec40: 54 65 73 74 28 70 43 73 72 2c 20 46 54 53 35 43  Test(pCsr, FTS5C
ec50: 53 52 5f 52 45 51 55 49 52 45 5f 44 4f 43 53 49  SR_REQUIRE_DOCSI
ec60: 5a 45 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ZE) ){.    if( p
ec70: 43 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75 6d 6e 73  Config->bColumns
ec80: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34  ize ){.      i64
ec90: 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 43 75   iRowid = fts5Cu
eca0: 72 73 6f 72 52 6f 77 69 64 28 70 43 73 72 29 3b  rsorRowid(pCsr);
ecb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ecc0: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44 6f  te3Fts5StorageDo
ecd0: 63 73 69 7a 65 28 70 54 61 62 2d 3e 70 53 74 6f  csize(pTab->pSto
ece0: 72 61 67 65 2c 20 69 52 6f 77 69 64 2c 20 70 43  rage, iRowid, pC
ecf0: 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53 69 7a 65 29  sr->aColumnSize)
ed00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ed10: 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e  pConfig->zConten
ed20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t==0 ){.      in
ed30: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
ed40: 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
ed50: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ed60: 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
ed70: 61 62 55 6e 69 6e 64 65 78 65 64 5b 69 5d 3d 3d  abUnindexed[i]==
ed80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
ed90: 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53 69 7a 65  Csr->aColumnSize
eda0: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
edb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
edc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
edd0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
ede0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
edf0: 20 26 26 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e   && i<pConfig->n
ee00: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ee10: 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
ee20: 61 62 55 6e 69 6e 64 65 78 65 64 5b 69 5d 3d 3d  abUnindexed[i]==
ee30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
ee40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20 69 6e  onst char *z; in
ee50: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 76  t n;.          v
ee60: 6f 69 64 20 2a 70 20 3d 20 28 76 6f 69 64 2a 29  oid *p = (void*)
ee70: 28 26 70 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53  (&pCsr->aColumnS
ee80: 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ize[i]);.       
ee90: 20 20 20 70 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e     pCsr->aColumn
eea0: 53 69 7a 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Size[i] = 0;.   
eeb0: 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
eec0: 41 70 69 43 6f 6c 75 6d 6e 54 65 78 74 28 70 43  ApiColumnText(pC
eed0: 74 78 2c 20 69 2c 20 26 7a 2c 20 26 6e 29 3b 0a  tx, i, &z, &n);.
eee0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
eef0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ef00: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
ef10: 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e  sqlite3Fts5Token
ef20: 69 7a 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ize(.           
ef30: 20 20 20 20 20 70 43 6f 6e 66 69 67 2c 20 46 54       pConfig, FT
ef40: 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 41 55 58 2c  S5_TOKENIZE_AUX,
ef50: 20 7a 2c 20 6e 2c 20 70 2c 20 66 74 73 35 43 6f   z, n, p, fts5Co
ef60: 6c 75 6d 6e 53 69 7a 65 43 62 0a 20 20 20 20 20  lumnSizeCb.     
ef70: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
ef80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ef90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
efa0: 20 20 43 73 72 46 6c 61 67 43 6c 65 61 72 28 70    CsrFlagClear(p
efb0: 43 73 72 2c 20 46 54 53 35 43 53 52 5f 52 45 51  Csr, FTS5CSR_REQ
efc0: 55 49 52 45 5f 44 4f 43 53 49 5a 45 29 3b 0a 20  UIRE_DOCSIZE);. 
efd0: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20   }.  if( iCol<0 
efe0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
eff0: 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a    *pnToken = 0;.
f000: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
f010: 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20 69 2b  Config->nCol; i+
f020: 2b 29 7b 0a 20 20 20 20 20 20 2a 70 6e 54 6f 6b  +){.      *pnTok
f030: 65 6e 20 2b 3d 20 70 43 73 72 2d 3e 61 43 6f 6c  en += pCsr->aCol
f040: 75 6d 6e 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  umnSize[i];.    
f050: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43  }.  }else if( iC
f060: 6f 6c 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  ol<pConfig->nCol
f070: 20 29 7b 0a 20 20 20 20 2a 70 6e 54 6f 6b 65 6e   ){.    *pnToken
f080: 20 3d 20 70 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e   = pCsr->aColumn
f090: 53 69 7a 65 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65  Size[iCol];.  }e
f0a0: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 54 6f 6b 65  lse{.    *pnToke
f0b0: 6e 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  n = 0;.    rc = 
f0c0: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3b 0a 20 20  SQLITE_RANGE;.  
f0d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f0e0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
f0f0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 53  tation of the xS
f100: 65 74 41 75 78 64 61 74 61 28 29 20 6d 65 74 68  etAuxdata() meth
f110: 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
f120: 74 20 66 74 73 35 41 70 69 53 65 74 41 75 78 64  t fts5ApiSetAuxd
f130: 61 74 61 28 0a 20 20 46 74 73 35 43 6f 6e 74 65  ata(.  Fts5Conte
f140: 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
f150: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 63         /* Fts5 c
f160: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 76 6f 69 64  ontext */.  void
f170: 20 2a 70 50 74 72 2c 20 20 20 20 20 20 20 20 20   *pPtr,         
f180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f190: 6f 69 6e 74 65 72 20 74 6f 20 73 61 76 65 20 61  ointer to save a
f1a0: 73 20 61 75 78 64 61 74 61 20 2a 2f 0a 20 20 76  s auxdata */.  v
f1b0: 6f 69 64 28 2a 78 44 65 6c 65 74 65 29 28 76 6f  oid(*xDelete)(vo
f1c0: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 2f  id*)           /
f1d0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
f1e0: 20 70 50 74 72 20 28 6f 72 20 4e 55 4c 4c 29 20   pPtr (or NULL) 
f1f0: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 75 72 73  */.){.  Fts5Curs
f200: 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35  or *pCsr = (Fts5
f210: 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20  Cursor*)pCtx;.  
f220: 46 74 73 35 41 75 78 64 61 74 61 20 2a 70 44 61  Fts5Auxdata *pDa
f230: 74 61 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68  ta;..  /* Search
f240: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 75 72   through the cur
f250: 73 6f 72 73 20 6c 69 73 74 20 6f 66 20 46 74 73  sors list of Fts
f260: 35 41 75 78 64 61 74 61 20 6f 62 6a 65 63 74 73  5Auxdata objects
f270: 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 0a 20 20   for one that.  
f280: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ** corresponds t
f290: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  o the currently 
f2a0: 65 78 65 63 75 74 69 6e 67 20 61 75 78 69 6c 69  executing auxili
f2b0: 61 72 79 20 66 75 6e 63 74 69 6f 6e 2e 20 20 2a  ary function.  *
f2c0: 2f 0a 20 20 66 6f 72 28 70 44 61 74 61 3d 70 43  /.  for(pData=pC
f2d0: 73 72 2d 3e 70 41 75 78 64 61 74 61 3b 20 70 44  sr->pAuxdata; pD
f2e0: 61 74 61 3b 20 70 44 61 74 61 3d 70 44 61 74 61  ata; pData=pData
f2f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
f300: 28 20 70 44 61 74 61 2d 3e 70 41 75 78 3d 3d 70  ( pData->pAux==p
f310: 43 73 72 2d 3e 70 41 75 78 20 29 20 62 72 65 61  Csr->pAux ) brea
f320: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44  k;.  }..  if( pD
f330: 61 74 61 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ata ){.    if( p
f340: 44 61 74 61 2d 3e 78 44 65 6c 65 74 65 20 29 7b  Data->xDelete ){
f350: 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 78 44  .      pData->xD
f360: 65 6c 65 74 65 28 70 44 61 74 61 2d 3e 70 50 74  elete(pData->pPt
f370: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  r);.    }.  }els
f380: 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
f390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
f3a0: 44 61 74 61 20 3d 20 28 46 74 73 35 41 75 78 64  Data = (Fts5Auxd
f3b0: 61 74 61 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ata*)sqlite3Fts5
f3c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
f3d0: 73 69 7a 65 6f 66 28 46 74 73 35 41 75 78 64 61  sizeof(Fts5Auxda
f3e0: 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70 44  ta));.    if( pD
f3f0: 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
f400: 69 66 28 20 78 44 65 6c 65 74 65 20 29 20 78 44  if( xDelete ) xD
f410: 65 6c 65 74 65 28 70 50 74 72 29 3b 0a 20 20 20  elete(pPtr);.   
f420: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f430: 20 20 7d 0a 20 20 20 20 70 44 61 74 61 2d 3e 70    }.    pData->p
f440: 41 75 78 20 3d 20 70 43 73 72 2d 3e 70 41 75 78  Aux = pCsr->pAux
f450: 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 70 4e 65  ;.    pData->pNe
f460: 78 74 20 3d 20 70 43 73 72 2d 3e 70 41 75 78 64  xt = pCsr->pAuxd
f470: 61 74 61 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70  ata;.    pCsr->p
f480: 41 75 78 64 61 74 61 20 3d 20 70 44 61 74 61 3b  Auxdata = pData;
f490: 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61 2d 3e 78  .  }..  pData->x
f4a0: 44 65 6c 65 74 65 20 3d 20 78 44 65 6c 65 74 65  Delete = xDelete
f4b0: 3b 0a 20 20 70 44 61 74 61 2d 3e 70 50 74 72 20  ;.  pData->pPtr 
f4c0: 3d 20 70 50 74 72 3b 0a 20 20 72 65 74 75 72 6e  = pPtr;.  return
f4d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
f4e0: 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35  tatic void *fts5
f4f0: 41 70 69 47 65 74 41 75 78 64 61 74 61 28 46 74  ApiGetAuxdata(Ft
f500: 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  s5Context *pCtx,
f510: 20 69 6e 74 20 62 43 6c 65 61 72 29 7b 0a 20 20   int bClear){.  
f520: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
f530: 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29   = (Fts5Cursor*)
f540: 70 43 74 78 3b 0a 20 20 46 74 73 35 41 75 78 64  pCtx;.  Fts5Auxd
f550: 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 76 6f  ata *pData;.  vo
f560: 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a 20  id *pRet = 0;.. 
f570: 20 66 6f 72 28 70 44 61 74 61 3d 70 43 73 72 2d   for(pData=pCsr-
f580: 3e 70 41 75 78 64 61 74 61 3b 20 70 44 61 74 61  >pAuxdata; pData
f590: 3b 20 70 44 61 74 61 3d 70 44 61 74 61 2d 3e 70  ; pData=pData->p
f5a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
f5b0: 44 61 74 61 2d 3e 70 41 75 78 3d 3d 70 43 73 72  Data->pAux==pCsr
f5c0: 2d 3e 70 41 75 78 20 29 20 62 72 65 61 6b 3b 0a  ->pAux ) break;.
f5d0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 61 74 61    }..  if( pData
f5e0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 70   ){.    pRet = p
f5f0: 44 61 74 61 2d 3e 70 50 74 72 3b 0a 20 20 20 20  Data->pPtr;.    
f600: 69 66 28 20 62 43 6c 65 61 72 20 29 7b 0a 20 20  if( bClear ){.  
f610: 20 20 20 20 70 44 61 74 61 2d 3e 70 50 74 72 20      pData->pPtr 
f620: 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 61 74 61  = 0;.      pData
f630: 2d 3e 78 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20  ->xDelete = 0;. 
f640: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
f650: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61 74  rn pRet;.}..stat
f660: 69 63 20 76 6f 69 64 20 66 74 73 35 41 70 69 50  ic void fts5ApiP
f670: 68 72 61 73 65 4e 65 78 74 28 0a 20 20 46 74 73  hraseNext(.  Fts
f680: 35 43 6f 6e 74 65 78 74 20 2a 70 55 6e 75 73 65  5Context *pUnuse
f690: 64 2c 20 0a 20 20 46 74 73 35 50 68 72 61 73 65  d, .  Fts5Phrase
f6a0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
f6b0: 69 6e 74 20 2a 70 69 43 6f 6c 2c 20 69 6e 74 20  int *piCol, int 
f6c0: 2a 70 69 4f 66 66 0a 29 7b 0a 20 20 55 4e 55 53  *piOff.){.  UNUS
f6d0: 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64  ED_PARAM(pUnused
f6e0: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  );.  if( pIter->
f6f0: 61 3e 3d 70 49 74 65 72 2d 3e 62 20 29 7b 0a 20  a>=pIter->b ){. 
f700: 20 20 20 2a 70 69 43 6f 6c 20 3d 20 2d 31 3b 0a     *piCol = -1;.
f710: 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b      *piOff = -1;
f720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
f730: 74 20 69 56 61 6c 3b 0a 20 20 20 20 70 49 74 65  t iVal;.    pIte
f740: 72 2d 3e 61 20 2b 3d 20 66 74 73 35 47 65 74 56  r->a += fts5GetV
f750: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 61  arint32(pIter->a
f760: 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  , iVal);.    if(
f770: 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20   iVal==1 ){.    
f780: 20 20 70 49 74 65 72 2d 3e 61 20 2b 3d 20 66 74    pIter->a += ft
f790: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 49  s5GetVarint32(pI
f7a0: 74 65 72 2d 3e 61 2c 20 69 56 61 6c 29 3b 0a 20  ter->a, iVal);. 
f7b0: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 56       *piCol = iV
f7c0: 61 6c 3b 0a 20 20 20 20 20 20 2a 70 69 4f 66 66  al;.      *piOff
f7d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65   = 0;.      pIte
f7e0: 72 2d 3e 61 20 2b 3d 20 66 74 73 35 47 65 74 56  r->a += fts5GetV
f7f0: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 61  arint32(pIter->a
f800: 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iVal);.    }. 
f810: 20 20 20 2a 70 69 4f 66 66 20 2b 3d 20 28 69 56     *piOff += (iV
f820: 61 6c 2d 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  al-2);.  }.}..st
f830: 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 69  atic int fts5Api
f840: 50 68 72 61 73 65 46 69 72 73 74 28 0a 20 20 46  PhraseFirst(.  F
f850: 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ts5Context *pCtx
f860: 2c 20 0a 20 20 69 6e 74 20 69 50 68 72 61 73 65  , .  int iPhrase
f870: 2c 20 0a 20 20 46 74 73 35 50 68 72 61 73 65 49  , .  Fts5PhraseI
f880: 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69  ter *pIter, .  i
f890: 6e 74 20 2a 70 69 43 6f 6c 2c 20 69 6e 74 20 2a  nt *piCol, int *
f8a0: 70 69 4f 66 66 0a 29 7b 0a 20 20 46 74 73 35 43  piOff.){.  Fts5C
f8b0: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
f8c0: 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b  ts5Cursor*)pCtx;
f8d0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
f8e0: 72 63 20 3d 20 66 74 73 35 43 73 72 50 6f 73 6c  rc = fts5CsrPosl
f8f0: 69 73 74 28 70 43 73 72 2c 20 69 50 68 72 61 73  ist(pCsr, iPhras
f900: 65 2c 20 26 70 49 74 65 72 2d 3e 61 2c 20 26 6e  e, &pIter->a, &n
f910: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
f920: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49  ITE_OK ){.    pI
f930: 74 65 72 2d 3e 62 20 3d 20 26 70 49 74 65 72 2d  ter->b = &pIter-
f940: 3e 61 5b 6e 5d 3b 0a 20 20 20 20 2a 70 69 43 6f  >a[n];.    *piCo
f950: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 69 4f 66  l = 0;.    *piOf
f960: 66 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 41  f = 0;.    fts5A
f970: 70 69 50 68 72 61 73 65 4e 65 78 74 28 70 43 74  piPhraseNext(pCt
f980: 78 2c 20 70 49 74 65 72 2c 20 70 69 43 6f 6c 2c  x, pIter, piCol,
f990: 20 70 69 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72   piOff);.  }.  r
f9a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
f9b0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 70 69  tic void fts5Api
f9c0: 50 68 72 61 73 65 4e 65 78 74 43 6f 6c 75 6d 6e  PhraseNextColumn
f9d0: 28 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20  (.  Fts5Context 
f9e0: 2a 70 43 74 78 2c 20 0a 20 20 46 74 73 35 50 68  *pCtx, .  Fts5Ph
f9f0: 72 61 73 65 49 74 65 72 20 2a 70 49 74 65 72 2c  raseIter *pIter,
fa00: 20 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 0a 29   .  int *piCol.)
fa10: 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  {.  Fts5Cursor *
fa20: 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73  pCsr = (Fts5Curs
fa30: 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46 74 73 35  or*)pCtx;.  Fts5
fa40: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
fa50: 3d 20 28 28 46 74 73 35 54 61 62 6c 65 2a 29 28  = ((Fts5Table*)(
fa60: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
fa70: 29 29 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20  ))->pConfig;..  
fa80: 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65  if( pConfig->eDe
fa90: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
faa0: 4c 5f 43 4f 4c 55 4d 4e 53 20 29 7b 0a 20 20 20  L_COLUMNS ){.   
fab0: 20 69 66 28 20 70 49 74 65 72 2d 3e 61 3e 3d 70   if( pIter->a>=p
fac0: 49 74 65 72 2d 3e 62 20 29 7b 0a 20 20 20 20 20  Iter->b ){.     
fad0: 20 2a 70 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   *piCol = -1;.  
fae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
faf0: 6e 74 20 69 49 6e 63 72 3b 0a 20 20 20 20 20 20  nt iIncr;.      
fb00: 70 49 74 65 72 2d 3e 61 20 2b 3d 20 66 74 73 35  pIter->a += fts5
fb10: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
fb20: 65 72 2d 3e 61 5b 30 5d 2c 20 69 49 6e 63 72 29  er->a[0], iIncr)
fb30: 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 2b  ;.      *piCol +
fb40: 3d 20 28 69 49 6e 63 72 2d 32 29 3b 0a 20 20 20  = (iIncr-2);.   
fb50: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
fb60: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
fb70: 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20    int dummy;.   
fb80: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 3e     if( pIter->a>
fb90: 3d 70 49 74 65 72 2d 3e 62 20 29 7b 0a 20 20 20  =pIter->b ){.   
fba0: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 2d 31       *piCol = -1
fbb0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
fbc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fbd0: 69 66 28 20 70 49 74 65 72 2d 3e 61 5b 30 5d 3d  if( pIter->a[0]=
fbe0: 3d 30 78 30 31 20 29 20 62 72 65 61 6b 3b 0a 20  =0x01 ) break;. 
fbf0: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 20 2b 3d       pIter->a +=
fc00: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
fc10: 28 70 49 74 65 72 2d 3e 61 2c 20 64 75 6d 6d 79  (pIter->a, dummy
fc20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  );.    }.    pIt
fc30: 65 72 2d 3e 61 20 2b 3d 20 31 20 2b 20 66 74 73  er->a += 1 + fts
fc40: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
fc50: 74 65 72 2d 3e 61 5b 31 5d 2c 20 2a 70 69 43 6f  ter->a[1], *piCo
fc60: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  l);.  }.}..stati
fc70: 63 20 69 6e 74 20 66 74 73 35 41 70 69 50 68 72  c int fts5ApiPhr
fc80: 61 73 65 46 69 72 73 74 43 6f 6c 75 6d 6e 28 0a  aseFirstColumn(.
fc90: 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70    Fts5Context *p
fca0: 43 74 78 2c 20 0a 20 20 69 6e 74 20 69 50 68 72  Ctx, .  int iPhr
fcb0: 61 73 65 2c 20 0a 20 20 46 74 73 35 50 68 72 61  ase, .  Fts5Phra
fcc0: 73 65 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  seIter *pIter, .
fcd0: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 0a 29 7b 0a    int *piCol.){.
fce0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
fcf0: 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 43 75 72 73  E_OK;.  Fts5Curs
fd00: 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35  or *pCsr = (Fts5
fd10: 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20  Cursor*)pCtx;.  
fd20: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
fd30: 66 69 67 20 3d 20 28 28 46 74 73 35 54 61 62 6c  fig = ((Fts5Tabl
fd40: 65 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e 70  e*)(pCsr->base.p
fd50: 56 74 61 62 29 29 2d 3e 70 43 6f 6e 66 69 67 3b  Vtab))->pConfig;
fd60: 0a 0a 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d  ..  if( pConfig-
fd70: 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
fd80: 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 7b  ETAIL_COLUMNS ){
fd90: 0a 20 20 20 20 46 74 73 35 53 6f 72 74 65 72 20  .    Fts5Sorter 
fda0: 2a 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d  *pSorter = pCsr-
fdb0: 3e 70 53 6f 72 74 65 72 3b 0a 20 20 20 20 69 6e  >pSorter;.    in
fdc0: 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  t n;.    if( pSo
fdd0: 72 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  rter ){.      in
fde0: 74 20 69 31 20 3d 20 28 69 50 68 72 61 73 65 3d  t i1 = (iPhrase=
fdf0: 3d 30 20 3f 20 30 20 3a 20 70 53 6f 72 74 65 72  =0 ? 0 : pSorter
fe00: 2d 3e 61 49 64 78 5b 69 50 68 72 61 73 65 2d 31  ->aIdx[iPhrase-1
fe10: 5d 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 53  ]);.      n = pS
fe20: 6f 72 74 65 72 2d 3e 61 49 64 78 5b 69 50 68 72  orter->aIdx[iPhr
fe30: 61 73 65 5d 20 2d 20 69 31 3b 0a 20 20 20 20 20  ase] - i1;.     
fe40: 20 70 49 74 65 72 2d 3e 61 20 3d 20 26 70 53 6f   pIter->a = &pSo
fe50: 72 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 5b 69  rter->aPoslist[i
fe60: 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1];.    }else{. 
fe70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fe80: 33 46 74 73 35 45 78 70 72 50 68 72 61 73 65 43  3Fts5ExprPhraseC
fe90: 6f 6c 6c 69 73 74 28 70 43 73 72 2d 3e 70 45 78  ollist(pCsr->pEx
fea0: 70 72 2c 20 69 50 68 72 61 73 65 2c 20 26 70 49  pr, iPhrase, &pI
feb0: 74 65 72 2d 3e 61 2c 20 26 6e 29 3b 0a 20 20 20  ter->a, &n);.   
fec0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
fed0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fee0: 20 20 70 49 74 65 72 2d 3e 62 20 3d 20 26 70 49    pIter->b = &pI
fef0: 74 65 72 2d 3e 61 5b 6e 5d 3b 0a 20 20 20 20 20  ter->a[n];.     
ff00: 20 2a 70 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *piCol = 0;.   
ff10: 20 20 20 66 74 73 35 41 70 69 50 68 72 61 73 65     fts5ApiPhrase
ff20: 4e 65 78 74 43 6f 6c 75 6d 6e 28 70 43 74 78 2c  NextColumn(pCtx,
ff30: 20 70 49 74 65 72 2c 20 70 69 43 6f 6c 29 3b 0a   pIter, piCol);.
ff40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
ff50: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 72 63     int n;.    rc
ff60: 20 3d 20 66 74 73 35 43 73 72 50 6f 73 6c 69 73   = fts5CsrPoslis
ff70: 74 28 70 43 73 72 2c 20 69 50 68 72 61 73 65 2c  t(pCsr, iPhrase,
ff80: 20 26 70 49 74 65 72 2d 3e 61 2c 20 26 6e 29 3b   &pIter->a, &n);
ff90: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ffa0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ffb0: 70 49 74 65 72 2d 3e 62 20 3d 20 26 70 49 74 65  pIter->b = &pIte
ffc0: 72 2d 3e 61 5b 6e 5d 3b 0a 20 20 20 20 20 20 69  r->a[n];.      i
ffd0: 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 20  f( n<=0 ){.     
ffe0: 20 20 20 2a 70 69 43 6f 6c 20 3d 20 2d 31 3b 0a     *piCol = -1;.
fff0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10000 70 49 74 65 72 2d 3e 61 5b 30 5d 3d 3d 30 78 30  pIter->a[0]==0x0
10010 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  1 ){.        pIt
10020 65 72 2d 3e 61 20 2b 3d 20 31 20 2b 20 66 74 73  er->a += 1 + fts
10030 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
10040 74 65 72 2d 3e 61 5b 31 5d 2c 20 2a 70 69 43 6f  ter->a[1], *piCo
10050 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
10060 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  .        *piCol 
10070 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
10080 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
10090 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20   rc;.}...static 
100a0 69 6e 74 20 66 74 73 35 41 70 69 51 75 65 72 79  int fts5ApiQuery
100b0 50 68 72 61 73 65 28 46 74 73 35 43 6f 6e 74 65  Phrase(Fts5Conte
100c0 78 74 2a 2c 20 69 6e 74 2c 20 76 6f 69 64 2a 2c  xt*, int, void*,
100d0 20 0a 20 20 20 20 69 6e 74 28 2a 29 28 63 6f 6e   .    int(*)(con
100e0 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f 6e  st Fts5Extension
100f0 41 70 69 2a 2c 20 46 74 73 35 43 6f 6e 74 65 78  Api*, Fts5Contex
10100 74 2a 2c 20 76 6f 69 64 2a 29 0a 29 3b 0a 0a 73  t*, void*).);..s
10110 74 61 74 69 63 20 63 6f 6e 73 74 20 46 74 73 35  tatic const Fts5
10120 45 78 74 65 6e 73 69 6f 6e 41 70 69 20 73 46 74  ExtensionApi sFt
10130 73 35 41 70 69 20 3d 20 7b 0a 20 20 32 2c 20 20  s5Api = {.  2,  
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
10160 72 73 69 6f 6e 20 2a 2f 0a 20 20 66 74 73 35 41  rsion */.  fts5A
10170 70 69 55 73 65 72 44 61 74 61 2c 0a 20 20 66 74  piUserData,.  ft
10180 73 35 41 70 69 43 6f 6c 75 6d 6e 43 6f 75 6e 74  s5ApiColumnCount
10190 2c 0a 20 20 66 74 73 35 41 70 69 52 6f 77 43 6f  ,.  fts5ApiRowCo
101a0 75 6e 74 2c 0a 20 20 66 74 73 35 41 70 69 43 6f  unt,.  fts5ApiCo
101b0 6c 75 6d 6e 54 6f 74 61 6c 53 69 7a 65 2c 0a 20  lumnTotalSize,. 
101c0 20 66 74 73 35 41 70 69 54 6f 6b 65 6e 69 7a 65   fts5ApiTokenize
101d0 2c 0a 20 20 66 74 73 35 41 70 69 50 68 72 61 73  ,.  fts5ApiPhras
101e0 65 43 6f 75 6e 74 2c 0a 20 20 66 74 73 35 41 70  eCount,.  fts5Ap
101f0 69 50 68 72 61 73 65 53 69 7a 65 2c 0a 20 20 66  iPhraseSize,.  f
10200 74 73 35 41 70 69 49 6e 73 74 43 6f 75 6e 74 2c  ts5ApiInstCount,
10210 0a 20 20 66 74 73 35 41 70 69 49 6e 73 74 2c 0a  .  fts5ApiInst,.
10220 20 20 66 74 73 35 41 70 69 52 6f 77 69 64 2c 0a    fts5ApiRowid,.
10230 20 20 66 74 73 35 41 70 69 43 6f 6c 75 6d 6e 54    fts5ApiColumnT
10240 65 78 74 2c 0a 20 20 66 74 73 35 41 70 69 43 6f  ext,.  fts5ApiCo
10250 6c 75 6d 6e 53 69 7a 65 2c 0a 20 20 66 74 73 35  lumnSize,.  fts5
10260 41 70 69 51 75 65 72 79 50 68 72 61 73 65 2c 0a  ApiQueryPhrase,.
10270 20 20 66 74 73 35 41 70 69 53 65 74 41 75 78 64    fts5ApiSetAuxd
10280 61 74 61 2c 0a 20 20 66 74 73 35 41 70 69 47 65  ata,.  fts5ApiGe
10290 74 41 75 78 64 61 74 61 2c 0a 20 20 66 74 73 35  tAuxdata,.  fts5
102a0 41 70 69 50 68 72 61 73 65 46 69 72 73 74 2c 0a  ApiPhraseFirst,.
102b0 20 20 66 74 73 35 41 70 69 50 68 72 61 73 65 4e    fts5ApiPhraseN
102c0 65 78 74 2c 0a 20 20 66 74 73 35 41 70 69 50 68  ext,.  fts5ApiPh
102d0 72 61 73 65 46 69 72 73 74 43 6f 6c 75 6d 6e 2c  raseFirstColumn,
102e0 0a 20 20 66 74 73 35 41 70 69 50 68 72 61 73 65  .  fts5ApiPhrase
102f0 4e 65 78 74 43 6f 6c 75 6d 6e 2c 0a 7d 3b 0a 0a  NextColumn,.};..
10300 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
10310 74 69 6f 6e 20 6f 66 20 41 50 49 20 66 75 6e 63  tion of API func
10320 74 69 6f 6e 20 78 51 75 65 72 79 50 68 72 61 73  tion xQueryPhras
10330 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
10340 6e 74 20 66 74 73 35 41 70 69 51 75 65 72 79 50  nt fts5ApiQueryP
10350 68 72 61 73 65 28 0a 20 20 46 74 73 35 43 6f 6e  hrase(.  Fts5Con
10360 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
10370 6e 74 20 69 50 68 72 61 73 65 2c 20 0a 20 20 76  nt iPhrase, .  v
10380 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
10390 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
103a0 29 28 63 6f 6e 73 74 20 46 74 73 35 45 78 74 65  )(const Fts5Exte
103b0 6e 73 69 6f 6e 41 70 69 2a 2c 20 46 74 73 35 43  nsionApi*, Fts5C
103c0 6f 6e 74 65 78 74 2a 2c 20 76 6f 69 64 2a 29 0a  ontext*, void*).
103d0 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20  ){.  Fts5Cursor 
103e0 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72  *pCsr = (Fts5Cur
103f0 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46 74 73  sor*)pCtx;.  Fts
10400 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  5Table *pTab = (
10410 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72  Fts5Table*)(pCsr
10420 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a 20  ->base.pVtab);. 
10430 20 69 6e 74 20 72 63 3b 0a 20 20 46 74 73 35 43   int rc;.  Fts5C
10440 75 72 73 6f 72 20 2a 70 4e 65 77 20 3d 20 30 3b  ursor *pNew = 0;
10450 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 4f 70 65  ..  rc = fts5Ope
10460 6e 4d 65 74 68 6f 64 28 70 43 73 72 2d 3e 62 61  nMethod(pCsr->ba
10470 73 65 2e 70 56 74 61 62 2c 20 28 73 71 6c 69 74  se.pVtab, (sqlit
10480 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a 2a  e3_vtab_cursor**
10490 29 26 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  )&pNew);.  if( r
104a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
104b0 20 20 20 20 70 4e 65 77 2d 3e 65 50 6c 61 6e 20      pNew->ePlan 
104c0 3d 20 46 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43  = FTS5_PLAN_MATC
104d0 48 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 46 69  H;.    pNew->iFi
104e0 72 73 74 52 6f 77 69 64 20 3d 20 53 4d 41 4c 4c  rstRowid = SMALL
104f0 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 70  EST_INT64;.    p
10500 4e 65 77 2d 3e 69 4c 61 73 74 52 6f 77 69 64 20  New->iLastRowid 
10510 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  = LARGEST_INT64;
10520 0a 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e  .    pNew->base.
10530 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33  pVtab = (sqlite3
10540 5f 76 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 20  _vtab*)pTab;.   
10550 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
10560 35 45 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65  5ExprClonePhrase
10570 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 69 50  (pCsr->pExpr, iP
10580 68 72 61 73 65 2c 20 26 70 4e 65 77 2d 3e 70 45  hrase, &pNew->pE
10590 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  xpr);.  }..  if(
105a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
105b0 7b 0a 20 20 20 20 66 6f 72 28 72 63 20 3d 20 66  {.    for(rc = f
105c0 74 73 35 43 75 72 73 6f 72 46 69 72 73 74 28 70  ts5CursorFirst(p
105d0 54 61 62 2c 20 70 4e 65 77 2c 20 30 29 3b 0a 20  Tab, pNew, 0);. 
105e0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
105f0 45 5f 4f 4b 20 26 26 20 43 73 72 46 6c 61 67 54  E_OK && CsrFlagT
10600 65 73 74 28 70 4e 65 77 2c 20 46 54 53 35 43 53  est(pNew, FTS5CS
10610 52 5f 45 4f 46 29 3d 3d 30 3b 0a 20 20 20 20 20  R_EOF)==0;.     
10620 20 20 20 72 63 20 3d 20 66 74 73 35 4e 65 78 74     rc = fts5Next
10630 4d 65 74 68 6f 64 28 28 73 71 6c 69 74 65 33 5f  Method((sqlite3_
10640 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 70 4e 65  vtab_cursor*)pNe
10650 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  w).    ){.      
10660 72 63 20 3d 20 78 43 61 6c 6c 62 61 63 6b 28 26  rc = xCallback(&
10670 73 46 74 73 35 41 70 69 2c 20 28 46 74 73 35 43  sFts5Api, (Fts5C
10680 6f 6e 74 65 78 74 2a 29 70 4e 65 77 2c 20 70 55  ontext*)pNew, pU
10690 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
106a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
106b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
106c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
106d0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
106e0 4b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  K;.        break
106f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10700 20 20 7d 0a 0a 20 20 66 74 73 35 43 6c 6f 73 65    }..  fts5Close
10710 4d 65 74 68 6f 64 28 28 73 71 6c 69 74 65 33 5f  Method((sqlite3_
10720 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 70 4e 65  vtab_cursor*)pNe
10730 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
10740 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
10750 66 74 73 35 41 70 69 49 6e 76 6f 6b 65 28 0a 20  fts5ApiInvoke(. 
10760 20 46 74 73 35 41 75 78 69 6c 69 61 72 79 20 2a   Fts5Auxiliary *
10770 70 41 75 78 2c 0a 20 20 46 74 73 35 43 75 72 73  pAux,.  Fts5Curs
10780 6f 72 20 2a 70 43 73 72 2c 0a 20 20 73 71 6c 69  or *pCsr,.  sqli
10790 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
107a0 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
107b0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
107c0 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 61 73  e **argv.){.  as
107d0 73 65 72 74 28 20 70 43 73 72 2d 3e 70 41 75 78  sert( pCsr->pAux
107e0 3d 3d 30 20 29 3b 0a 20 20 70 43 73 72 2d 3e 70  ==0 );.  pCsr->p
107f0 41 75 78 20 3d 20 70 41 75 78 3b 0a 20 20 70 41  Aux = pAux;.  pA
10800 75 78 2d 3e 78 46 75 6e 63 28 26 73 46 74 73 35  ux->xFunc(&sFts5
10810 41 70 69 2c 20 28 46 74 73 35 43 6f 6e 74 65 78  Api, (Fts5Contex
10820 74 2a 29 70 43 73 72 2c 20 63 6f 6e 74 65 78 74  t*)pCsr, context
10830 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 20  , argc, argv);. 
10840 20 70 43 73 72 2d 3e 70 41 75 78 20 3d 20 30 3b   pCsr->pAux = 0;
10850 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 43  .}..static Fts5C
10860 75 72 73 6f 72 20 2a 66 74 73 35 43 75 72 73 6f  ursor *fts5Curso
10870 72 46 72 6f 6d 43 73 72 69 64 28 46 74 73 35 47  rFromCsrid(Fts5G
10880 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 20  lobal *pGlobal, 
10890 69 36 34 20 69 43 73 72 49 64 29 7b 0a 20 20 46  i64 iCsrId){.  F
108a0 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 3b  ts5Cursor *pCsr;
108b0 0a 20 20 66 6f 72 28 70 43 73 72 3d 70 47 6c 6f  .  for(pCsr=pGlo
108c0 62 61 6c 2d 3e 70 43 73 72 3b 20 70 43 73 72 3b  bal->pCsr; pCsr;
108d0 20 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78   pCsr=pCsr->pNex
108e0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 73 72  t){.    if( pCsr
108f0 2d 3e 69 43 73 72 49 64 3d 3d 69 43 73 72 49 64  ->iCsrId==iCsrId
10900 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
10910 72 65 74 75 72 6e 20 70 43 73 72 3b 0a 7d 0a 0a  return pCsr;.}..
10920 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
10930 41 70 69 43 61 6c 6c 62 61 63 6b 28 0a 20 20 73  ApiCallback(.  s
10940 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
10950 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
10960 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
10970 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 0a  alue **argv.){..
10980 20 20 46 74 73 35 41 75 78 69 6c 69 61 72 79 20    Fts5Auxiliary 
10990 2a 70 41 75 78 3b 0a 20 20 46 74 73 35 43 75 72  *pAux;.  Fts5Cur
109a0 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 69 36 34  sor *pCsr;.  i64
109b0 20 69 43 73 72 49 64 3b 0a 0a 20 20 61 73 73 65   iCsrId;..  asse
109c0 72 74 28 20 61 72 67 63 3e 3d 31 20 29 3b 0a 20  rt( argc>=1 );. 
109d0 20 70 41 75 78 20 3d 20 28 46 74 73 35 41 75 78   pAux = (Fts5Aux
109e0 69 6c 69 61 72 79 2a 29 73 71 6c 69 74 65 33 5f  iliary*)sqlite3_
109f0 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
10a00 74 29 3b 0a 20 20 69 43 73 72 49 64 20 3d 20 73  t);.  iCsrId = s
10a10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
10a20 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20  64(argv[0]);..  
10a30 70 43 73 72 20 3d 20 66 74 73 35 43 75 72 73 6f  pCsr = fts5Curso
10a40 72 46 72 6f 6d 43 73 72 69 64 28 70 41 75 78 2d  rFromCsrid(pAux-
10a50 3e 70 47 6c 6f 62 61 6c 2c 20 69 43 73 72 49 64  >pGlobal, iCsrId
10a60 29 3b 0a 20 20 69 66 28 20 70 43 73 72 3d 3d 30  );.  if( pCsr==0
10a70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
10a80 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
10a90 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 63 75  intf("no such cu
10aa0 72 73 6f 72 3a 20 25 6c 6c 64 22 2c 20 69 43 73  rsor: %lld", iCs
10ab0 72 49 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rId);.    sqlite
10ac0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
10ad0 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31  ontext, zErr, -1
10ae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10af0 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 7d 65 6c  ree(zErr);.  }el
10b00 73 65 7b 0a 20 20 20 20 66 74 73 35 41 70 69 49  se{.    fts5ApiI
10b10 6e 76 6f 6b 65 28 70 41 75 78 2c 20 70 43 73 72  nvoke(pAux, pCsr
10b20 2c 20 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2d  , context, argc-
10b30 31 2c 20 26 61 72 67 76 5b 31 5d 29 3b 0a 20 20  1, &argv[1]);.  
10b40 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  }.}.../*.** Give
10b50 6e 20 63 75 72 73 6f 72 20 69 64 20 69 49 64 2c  n cursor id iId,
10b60 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
10b70 72 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70  r to the corresp
10b80 6f 6e 64 69 6e 67 20 46 74 73 35 49 6e 64 65 78  onding Fts5Index
10b90 20 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 72 20   .** object. Or 
10ba0 4e 55 4c 4c 20 49 66 20 74 68 65 20 63 75 72 73  NULL If the curs
10bb0 6f 72 20 69 64 20 64 6f 65 73 20 6e 6f 74 20 65  or id does not e
10bc0 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  xist..**.** If s
10bd0 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
10be0 70 70 43 6f 6e 66 69 67 20 74 6f 20 70 6f 69 6e  ppConfig to poin
10bf0 74 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  t to the associa
10c00 74 65 64 20 63 6f 6e 66 69 67 20 6f 62 6a 65 63  ted config objec
10c10 74 20 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  t .** before ret
10c20 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 46 74 73 35 49  urning..*/.Fts5I
10c30 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 74 73  ndex *sqlite3Fts
10c40 35 49 6e 64 65 78 46 72 6f 6d 43 73 72 69 64 28  5IndexFromCsrid(
10c50 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  .  Fts5Global *p
10c60 47 6c 6f 62 61 6c 2c 20 20 20 20 20 20 20 20 20  Global,         
10c70 20 20 20 2f 2a 20 46 54 53 35 20 67 6c 6f 62 61     /* FTS5 globa
10c80 6c 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 64 62  l context for db
10c90 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 36 34   handle */.  i64
10ca0 20 69 43 73 72 49 64 2c 20 20 20 20 20 20 20 20   iCsrId,        
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cc0 49 64 20 6f 66 20 63 75 72 73 6f 72 20 74 6f 20  Id of cursor to 
10cd0 66 69 6e 64 20 2a 2f 0a 20 20 46 74 73 35 43 6f  find */.  Fts5Co
10ce0 6e 66 69 67 20 2a 2a 70 70 43 6f 6e 66 69 67 20  nfig **ppConfig 
10cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
10d00 3a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  : Configuration 
10d10 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
10d20 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 3b  ts5Cursor *pCsr;
10d30 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54  .  Fts5Table *pT
10d40 61 62 3b 0a 0a 20 20 70 43 73 72 20 3d 20 66 74  ab;..  pCsr = ft
10d50 73 35 43 75 72 73 6f 72 46 72 6f 6d 43 73 72 69  s5CursorFromCsri
10d60 64 28 70 47 6c 6f 62 61 6c 2c 20 69 43 73 72 49  d(pGlobal, iCsrI
10d70 64 29 3b 0a 20 20 70 54 61 62 20 3d 20 28 46 74  d);.  pTab = (Ft
10d80 73 35 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62  s5Table*)pCsr->b
10d90 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 2a 70 70  ase.pVtab;.  *pp
10da0 43 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d 3e 70  Config = pTab->p
10db0 43 6f 6e 66 69 67 3b 0a 0a 20 20 72 65 74 75 72  Config;..  retur
10dc0 6e 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  n pTab->pIndex;.
10dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10de0 61 20 22 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  a "position-list
10df0 20 62 6c 6f 62 22 20 63 6f 72 72 65 73 70 6f 6e   blob" correspon
10e00 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72  ding to the curr
10e10 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 0a  ent position of.
10e20 2a 2a 20 63 75 72 73 6f 72 20 70 43 73 72 20 76  ** cursor pCsr v
10e30 69 61 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ia sqlite3_resul
10e40 74 5f 62 6c 6f 62 28 29 2e 20 41 20 70 6f 73 69  t_blob(). A posi
10e50 74 69 6f 6e 2d 6c 69 73 74 20 62 6c 6f 62 20 63  tion-list blob c
10e60 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63  ontains.** the c
10e70 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 2d  urrent position-
10e80 6c 69 73 74 20 66 6f 72 20 65 61 63 68 20 70 68  list for each ph
10e90 72 61 73 65 20 69 6e 20 74 68 65 20 71 75 65 72  rase in the quer
10ea0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
10eb0 68 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43 73 72  h.** cursor pCsr
10ec0 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 73 69 74 69  ..**.** A positi
10ed0 6f 6e 2d 6c 69 73 74 20 62 6c 6f 62 20 62 65 67  on-list blob beg
10ee0 69 6e 73 20 77 69 74 68 20 28 6e 50 68 72 61 73  ins with (nPhras
10ef0 65 2d 31 29 20 76 61 72 69 6e 74 73 2c 20 77 68  e-1) varints, wh
10f00 65 72 65 20 6e 50 68 72 61 73 65 20 69 73 0a 2a  ere nPhrase is.*
10f10 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
10f20 70 68 72 61 73 65 73 20 69 6e 20 74 68 65 20 71  phrases in the q
10f30 75 65 72 79 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  uery. Following 
10f40 74 68 65 20 76 61 72 69 6e 74 73 20 61 72 65 20  the varints are 
10f50 74 68 65 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e 61  the.** concatena
10f60 74 65 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ted position lis
10f70 74 73 20 66 6f 72 20 65 61 63 68 20 70 68 72 61  ts for each phra
10f80 73 65 2c 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a  se, in order..**
10f90 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 61  .** The first va
10fa0 72 69 6e 74 20 28 69 66 20 69 74 20 65 78 69 73  rint (if it exis
10fb0 74 73 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ts) contains the
10fc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 6f 73   size of the pos
10fd0 69 74 69 6f 6e 20 6c 69 73 74 0a 2a 2a 20 66 6f  ition list.** fo
10fe0 72 20 70 68 72 61 73 65 20 30 2e 20 54 68 65 20  r phrase 0. The 
10ff0 73 65 63 6f 6e 64 20 28 73 61 6d 65 20 64 69 73  second (same dis
11000 63 6c 61 69 6d 65 72 29 20 63 6f 6e 74 61 69 6e  claimer) contain
11010 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 70 6f  s the size of po
11020 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 31  sition.** list 1
11030 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 54 68 65  . And so on. The
11040 72 65 20 69 73 20 6e 6f 20 73 69 7a 65 20 66 69  re is no size fi
11050 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69 6e 61  eld for the fina
11060 6c 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c  l position list,
11070 0a 2a 2a 20 61 73 20 69 74 20 63 61 6e 20 62 65  .** as it can be
11080 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68   derived from th
11090 65 20 74 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  e total size of 
110a0 74 68 65 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61  the blob..*/.sta
110b0 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c  tic int fts5Posl
110c0 69 73 74 42 6c 6f 62 28 73 71 6c 69 74 65 33 5f  istBlob(sqlite3_
110d0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 46  context *pCtx, F
110e0 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ts5Cursor *pCsr)
110f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
11100 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11110 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65 20 3d  .  int nPhrase =
11120 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
11130 50 68 72 61 73 65 43 6f 75 6e 74 28 70 43 73 72  PhraseCount(pCsr
11140 2d 3e 70 45 78 70 72 29 3b 0a 20 20 46 74 73 35  ->pExpr);.  Fts5
11150 42 75 66 66 65 72 20 76 61 6c 3b 0a 0a 20 20 6d  Buffer val;..  m
11160 65 6d 73 65 74 28 26 76 61 6c 2c 20 30 2c 20 73  emset(&val, 0, s
11170 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
11180 29 29 3b 0a 20 20 73 77 69 74 63 68 28 20 28 28  ));.  switch( ((
11190 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72  Fts5Table*)(pCsr
111a0 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 29 2d 3e  ->base.pVtab))->
111b0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
111c0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53   ){.    case FTS
111d0 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 3a 0a 0a  5_DETAIL_FULL:..
111e0 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
111f0 74 68 65 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20  the varints */. 
11200 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11210 28 6e 50 68 72 61 73 65 2d 31 29 3b 20 69 2b 2b  (nPhrase-1); i++
11220 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
11230 20 75 38 20 2a 64 75 6d 6d 79 3b 0a 20 20 20 20   u8 *dummy;.    
11240 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
11250 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50  sqlite3Fts5ExprP
11260 6f 73 6c 69 73 74 28 70 43 73 72 2d 3e 70 45 78  oslist(pCsr->pEx
11270 70 72 2c 20 69 2c 20 26 64 75 6d 6d 79 29 3b 0a  pr, i, &dummy);.
11280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
11290 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
112a0 61 72 69 6e 74 28 26 72 63 2c 20 26 76 61 6c 2c  arint(&rc, &val,
112b0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d   nByte);.      }
112c0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  ..      /* Appen
112d0 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  d the position l
112e0 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f  ists */.      fo
112f0 72 28 69 3d 30 3b 20 69 3c 6e 50 68 72 61 73 65  r(i=0; i<nPhrase
11300 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11310 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69  const u8 *pPosli
11320 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  st;.        int 
11330 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20  nPoslist;.      
11340 20 20 6e 50 6f 73 6c 69 73 74 20 3d 20 73 71 6c    nPoslist = sql
11350 69 74 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c  ite3Fts5ExprPosl
11360 69 73 74 28 70 43 73 72 2d 3e 70 45 78 70 72 2c  ist(pCsr->pExpr,
11370 20 69 2c 20 26 70 50 6f 73 6c 69 73 74 29 3b 0a   i, &pPoslist);.
11380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
11390 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
113a0 6c 6f 62 28 26 72 63 2c 20 26 76 61 6c 2c 20 6e  lob(&rc, &val, n
113b0 50 6f 73 6c 69 73 74 2c 20 70 50 6f 73 6c 69 73  Poslist, pPoslis
113c0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
113d0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
113e0 73 65 20 46 54 53 35 5f 44 45 54 41 49 4c 5f 43  se FTS5_DETAIL_C
113f0 4f 4c 55 4d 4e 53 3a 0a 0a 20 20 20 20 20 20 2f  OLUMNS:..      /
11400 2a 20 41 70 70 65 6e 64 20 74 68 65 20 76 61 72  * Append the var
11410 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f  ints */.      fo
11420 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
11430 45 5f 4f 4b 20 26 26 20 69 3c 28 6e 50 68 72 61  E_OK && i<(nPhra
11440 73 65 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  se-1); i++){.   
11450 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 64       const u8 *d
11460 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 69 6e  ummy;.        in
11470 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  t nByte;.       
11480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
11490 35 45 78 70 72 50 68 72 61 73 65 43 6f 6c 6c 69  5ExprPhraseColli
114a0 73 74 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20  st(pCsr->pExpr, 
114b0 69 2c 20 26 64 75 6d 6d 79 2c 20 26 6e 42 79 74  i, &dummy, &nByt
114c0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
114d0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
114e0 65 6e 64 56 61 72 69 6e 74 28 26 72 63 2c 20 26  endVarint(&rc, &
114f0 76 61 6c 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  val, nByte);.   
11500 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
11510 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69  ppend the positi
11520 6f 6e 20 6c 69 73 74 73 20 2a 2f 0a 20 20 20 20  on lists */.    
11530 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
11540 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 50  QLITE_OK && i<nP
11550 68 72 61 73 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  hrase; i++){.   
11560 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
11570 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  Poslist;.       
11580 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 20   int nPoslist;. 
11590 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
115a0 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73  te3Fts5ExprPhras
115b0 65 43 6f 6c 6c 69 73 74 28 70 43 73 72 2d 3e 70  eCollist(pCsr->p
115c0 45 78 70 72 2c 20 69 2c 20 26 70 50 6f 73 6c 69  Expr, i, &pPosli
115d0 73 74 2c 20 26 6e 50 6f 73 6c 69 73 74 29 3b 0a  st, &nPoslist);.
115e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
115f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
11600 6c 6f 62 28 26 72 63 2c 20 26 76 61 6c 2c 20 6e  lob(&rc, &val, n
11610 50 6f 73 6c 69 73 74 2c 20 70 50 6f 73 6c 69 73  Poslist, pPoslis
11620 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
11630 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
11640 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65  fault:.      bre
11650 61 6b 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  ak;.  }..  sqlit
11660 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 70  e3_result_blob(p
11670 43 74 78 2c 20 76 61 6c 2e 70 2c 20 76 61 6c 2e  Ctx, val.p, val.
11680 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  n, sqlite3_free)
11690 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
116a0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 69 73  ../* .** This is
116b0 20 74 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74   the xColumn met
116c0 68 6f 64 2c 20 63 61 6c 6c 65 64 20 62 79 20 53  hod, called by S
116d0 51 4c 69 74 65 20 74 6f 20 72 65 71 75 65 73 74  QLite to request
116e0 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a   a value from.**
116f0 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74 68   the row that th
11700 65 20 73 75 70 70 6c 69 65 64 20 63 75 72 73 6f  e supplied curso
11710 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
11720 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
11730 20 69 6e 74 20 66 74 73 35 43 6f 6c 75 6d 6e 4d   int fts5ColumnM
11740 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33  ethod(.  sqlite3
11750 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
11760 75 72 73 6f 72 2c 20 20 20 2f 2a 20 43 75 72 73  ursor,   /* Curs
11770 6f 72 20 74 6f 20 72 65 74 72 69 65 76 65 20 76  or to retrieve v
11780 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 73  alue from */.  s
11790 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
117a0 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
117b0 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 73 71  * Context for sq
117c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 78 78 78  lite3_result_xxx
117d0 28 29 20 63 61 6c 6c 73 20 2a 2f 0a 20 20 69 6e  () calls */.  in
117e0 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11800 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
11810 20 74 6f 20 72 65 61 64 20 76 61 6c 75 65 20 66   to read value f
11820 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  rom */.){.  Fts5
11830 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
11840 74 73 35 54 61 62 6c 65 2a 29 28 70 43 75 72 73  ts5Table*)(pCurs
11850 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 46 74  or->pVtab);.  Ft
11860 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
11870 67 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69  g = pTab->pConfi
11880 67 3b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20  g;.  Fts5Cursor 
11890 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72  *pCsr = (Fts5Cur
118a0 73 6f 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20  sor*)pCursor;.  
118b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
118c0 4f 4b 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  OK;.  .  assert(
118d0 20 43 73 72 46 6c 61 67 54 65 73 74 28 70 43 73   CsrFlagTest(pCs
118e0 72 2c 20 46 54 53 35 43 53 52 5f 45 4f 46 29 3d  r, FTS5CSR_EOF)=
118f0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 73  =0 );..  if( pCs
11900 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50  r->ePlan==FTS5_P
11910 4c 41 4e 5f 53 50 45 43 49 41 4c 20 29 7b 0a 20  LAN_SPECIAL ){. 
11920 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 43 6f     if( iCol==pCo
11930 6e 66 69 67 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  nfig->nCol ){.  
11940 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
11950 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
11960 43 73 72 2d 3e 69 53 70 65 63 69 61 6c 29 3b 0a  Csr->iSpecial);.
11970 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
11980 20 69 66 28 20 69 43 6f 6c 3d 3d 70 43 6f 6e 66   if( iCol==pConf
11990 69 67 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ig->nCol ){.    
119a0 2f 2a 20 55 73 65 72 20 69 73 20 72 65 71 75 65  /* User is reque
119b0 73 74 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  sting the value 
119c0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  of the special c
119d0 6f 6c 75 6d 6e 20 77 69 74 68 20 74 68 65 20 73  olumn with the s
119e0 61 6d 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  ame name.    ** 
119f0 61 73 20 74 68 65 20 74 61 62 6c 65 2e 20 52 65  as the table. Re
11a00 74 75 72 6e 20 74 68 65 20 63 75 72 73 6f 72 20  turn the cursor 
11a10 69 6e 74 65 67 65 72 20 69 64 20 6e 75 6d 62 65  integer id numbe
11a20 72 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  r. This value is
11a30 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 75 73 65   only.    ** use
11a40 66 75 6c 20 69 6e 20 74 68 61 74 20 69 74 20 6d  ful in that it m
11a50 61 79 20 62 65 20 70 61 73 73 65 64 20 61 73 20  ay be passed as 
11a60 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
11a70 6e 74 20 74 6f 20 61 6e 20 46 54 53 35 0a 20 20  nt to an FTS5.  
11a80 20 20 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 66    ** auxiliary f
11a90 75 6e 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  unction.  */.   
11aa0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
11ab0 69 6e 74 36 34 28 70 43 74 78 2c 20 70 43 73 72  int64(pCtx, pCsr
11ac0 2d 3e 69 43 73 72 49 64 29 3b 0a 20 20 7d 65 6c  ->iCsrId);.  }el
11ad0 73 65 20 69 66 28 20 69 43 6f 6c 3d 3d 70 43 6f  se if( iCol==pCo
11ae0 6e 66 69 67 2d 3e 6e 43 6f 6c 2b 31 20 29 7b 0a  nfig->nCol+1 ){.
11af0 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  .    /* The valu
11b00 65 20 6f 66 20 74 68 65 20 22 72 61 6e 6b 22 20  e of the "rank" 
11b10 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 20 20 69  column. */.    i
11b20 66 28 20 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d  f( pCsr->ePlan==
11b30 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 55 52 43 45  FTS5_PLAN_SOURCE
11b40 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 6f   ){.      fts5Po
11b50 73 6c 69 73 74 42 6c 6f 62 28 70 43 74 78 2c 20  slistBlob(pCtx, 
11b60 70 43 73 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pCsr);.    }else
11b70 20 69 66 28 20 0a 20 20 20 20 20 20 20 20 70 43   if( .        pC
11b80 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35 5f  sr->ePlan==FTS5_
11b90 50 4c 41 4e 5f 4d 41 54 43 48 0a 20 20 20 20 20  PLAN_MATCH.     
11ba0 7c 7c 20 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d  || pCsr->ePlan==
11bb0 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 52 54 45 44  FTS5_PLAN_SORTED
11bc0 5f 4d 41 54 43 48 0a 20 20 20 20 29 7b 0a 20 20  _MATCH.    ){.  
11bd0 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70 52      if( pCsr->pR
11be0 61 6e 6b 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  ank || SQLITE_OK
11bf0 3d 3d 28 72 63 20 3d 20 66 74 73 35 46 69 6e 64  ==(rc = fts5Find
11c00 52 61 6e 6b 46 75 6e 63 74 69 6f 6e 28 70 43 73  RankFunction(pCs
11c10 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  r)) ){.        f
11c20 74 73 35 41 70 69 49 6e 76 6f 6b 65 28 70 43 73  ts5ApiInvoke(pCs
11c30 72 2d 3e 70 52 61 6e 6b 2c 20 70 43 73 72 2c 20  r->pRank, pCsr, 
11c40 70 43 74 78 2c 20 70 43 73 72 2d 3e 6e 52 61 6e  pCtx, pCsr->nRan
11c50 6b 41 72 67 2c 20 70 43 73 72 2d 3e 61 70 52 61  kArg, pCsr->apRa
11c60 6e 6b 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nkArg);.      }.
11c70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
11c80 28 20 21 66 74 73 35 49 73 43 6f 6e 74 65 6e 74  ( !fts5IsContent
11c90 6c 65 73 73 28 70 54 61 62 29 20 29 7b 0a 20 20  less(pTab) ){.  
11ca0 20 20 72 63 20 3d 20 66 74 73 35 53 65 65 6b 43    rc = fts5SeekC
11cb0 75 72 73 6f 72 28 70 43 73 72 2c 20 31 29 3b 0a  ursor(pCsr, 1);.
11cc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11cd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11ce0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
11cf0 6c 75 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65  lue(pCtx, sqlite
11d00 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
11d10 43 73 72 2d 3e 70 53 74 6d 74 2c 20 69 43 6f 6c  Csr->pStmt, iCol
11d20 2b 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  +1));.    }.  }.
11d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11d40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11d50 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
11d60 68 65 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e  he xFindFunction
11d70 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 65 20   method for the 
11d80 46 54 53 33 0a 2a 2a 20 76 69 72 74 75 61 6c 20  FTS3.** virtual 
11d90 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
11da0 20 69 6e 74 20 66 74 73 35 46 69 6e 64 46 75 6e   int fts5FindFun
11db0 63 74 69 6f 6e 4d 65 74 68 6f 64 28 0a 20 20 73  ctionMethod(.  s
11dc0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
11dd0 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab,            /
11de0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
11df0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
11e00 6e 55 6e 75 73 65 64 2c 20 20 20 20 20 20 20 20  nUnused,        
11e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11e20 75 6d 62 65 72 20 6f 66 20 53 51 4c 20 66 75 6e  umber of SQL fun
11e30 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
11e40 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11e50 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
11e60 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11e70 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  SQL function */.
11e80 20 20 76 6f 69 64 20 28 2a 2a 70 78 46 75 6e 63    void (**pxFunc
11e90 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
11ea0 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
11eb0 61 6c 75 65 2a 2a 29 2c 20 2f 2a 20 4f 55 54 3a  alue**), /* OUT:
11ec0 20 52 65 73 75 6c 74 20 2a 2f 0a 20 20 76 6f 69   Result */.  voi
11ed0 64 20 2a 2a 70 70 41 72 67 20 20 20 20 20 20 20  d **ppArg       
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ef0 4f 55 54 3a 20 55 73 65 72 20 64 61 74 61 20 66  OUT: User data f
11f00 6f 72 20 2a 70 78 46 75 6e 63 20 2a 2f 0a 29 7b  or *pxFunc */.){
11f10 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54  .  Fts5Table *pT
11f20 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a  ab = (Fts5Table*
11f30 29 70 56 74 61 62 3b 0a 20 20 46 74 73 35 41 75  )pVtab;.  Fts5Au
11f40 78 69 6c 69 61 72 79 20 2a 70 41 75 78 3b 0a 0a  xiliary *pAux;..
11f50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e    UNUSED_PARAM(n
11f60 55 6e 75 73 65 64 29 3b 0a 20 20 70 41 75 78 20  Unused);.  pAux 
11f70 3d 20 66 74 73 35 46 69 6e 64 41 75 78 69 6c 69  = fts5FindAuxili
11f80 61 72 79 28 70 54 61 62 2c 20 7a 4e 61 6d 65 29  ary(pTab, zName)
11f90 3b 0a 20 20 69 66 28 20 70 41 75 78 20 29 7b 0a  ;.  if( pAux ){.
11fa0 20 20 20 20 2a 70 78 46 75 6e 63 20 3d 20 66 74      *pxFunc = ft
11fb0 73 35 41 70 69 43 61 6c 6c 62 61 63 6b 3b 0a 20  s5ApiCallback;. 
11fc0 20 20 20 2a 70 70 41 72 67 20 3d 20 28 76 6f 69     *ppArg = (voi
11fd0 64 2a 29 70 41 75 78 3b 0a 20 20 20 20 72 65 74  d*)pAux;.    ret
11fe0 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
11ff0 20 4e 6f 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20   No function of 
12000 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6e 61  the specified na
12010 6d 65 20 77 61 73 20 66 6f 75 6e 64 2e 20 52 65  me was found. Re
12020 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74  turn 0. */.  ret
12030 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
12040 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
12050 66 20 46 54 53 35 20 78 52 65 6e 61 6d 65 20 6d  f FTS5 xRename m
12060 65 74 68 6f 64 2e 20 52 65 6e 61 6d 65 20 61 6e  ethod. Rename an
12070 20 66 74 73 35 20 74 61 62 6c 65 2e 0a 2a 2f 0a   fts5 table..*/.
12080 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 52  static int fts5R
12090 65 6e 61 6d 65 4d 65 74 68 6f 64 28 0a 20 20 73  enameMethod(.  s
120a0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
120b0 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab,            /
120c0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
120d0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
120e0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
120f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12100 65 77 20 6e 61 6d 65 20 6f 66 20 74 61 62 6c 65  ew name of table
12110 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 54 61 62   */.){.  Fts5Tab
12120 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
12130 54 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20  Table*)pVtab;.  
12140 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
12150 73 35 53 74 6f 72 61 67 65 52 65 6e 61 6d 65 28  s5StorageRename(
12160 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20  pTab->pStorage, 
12170 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zName);.}../*.**
12180 20 54 68 65 20 78 53 61 76 65 70 6f 69 6e 74 28   The xSavepoint(
12190 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  ) method..**.** 
121a0 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e  Flush the conten
121b0 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ts of the pendin
121c0 67 2d 74 65 72 6d 73 20 74 61 62 6c 65 20 74 6f  g-terms table to
121d0 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
121e0 20 69 6e 74 20 66 74 73 35 53 61 76 65 70 6f 69   int fts5Savepoi
121f0 6e 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  ntMethod(sqlite3
12200 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e  _vtab *pVtab, in
12210 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
12220 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62   Fts5Table *pTab
12230 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29 70   = (Fts5Table*)p
12240 56 74 61 62 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Vtab;.  UNUSED_P
12250 41 52 41 4d 28 69 53 61 76 65 70 6f 69 6e 74 29  ARAM(iSavepoint)
12260 3b 20 20 2f 2a 20 43 61 6c 6c 20 62 65 6c 6f 77  ;  /* Call below
12270 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
12280 4e 44 45 42 55 47 20 62 75 69 6c 64 73 20 2a 2f  NDEBUG builds */
12290 0a 20 20 66 74 73 35 43 68 65 63 6b 54 72 61 6e  .  fts5CheckTran
122a0 73 61 63 74 69 6f 6e 53 74 61 74 65 28 70 54 61  sactionState(pTa
122b0 62 2c 20 46 54 53 35 5f 53 41 56 45 50 4f 49 4e  b, FTS5_SAVEPOIN
122c0 54 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  T, iSavepoint);.
122d0 20 20 66 74 73 35 54 72 69 70 43 75 72 73 6f 72    fts5TripCursor
122e0 73 28 70 54 61 62 29 3b 0a 20 20 72 65 74 75 72  s(pTab);.  retur
122f0 6e 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  n sqlite3Fts5Sto
12300 72 61 67 65 53 79 6e 63 28 70 54 61 62 2d 3e 70  rageSync(pTab->p
12310 53 74 6f 72 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  Storage);.}../*.
12320 2a 2a 20 54 68 65 20 78 52 65 6c 65 61 73 65 28  ** The xRelease(
12330 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  ) method..**.** 
12340 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  This is a no-op.
12350 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12360 74 73 35 52 65 6c 65 61 73 65 4d 65 74 68 6f 64  ts5ReleaseMethod
12370 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
12380 56 74 61 62 2c 20 69 6e 74 20 69 53 61 76 65 70  Vtab, int iSavep
12390 6f 69 6e 74 29 7b 0a 20 20 46 74 73 35 54 61 62  oint){.  Fts5Tab
123a0 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
123b0 54 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20  Table*)pVtab;.  
123c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 69 53 61  UNUSED_PARAM(iSa
123d0 76 65 70 6f 69 6e 74 29 3b 20 20 2f 2a 20 43 61  vepoint);  /* Ca
123e0 6c 6c 20 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f  ll below is a no
123f0 2d 6f 70 20 66 6f 72 20 4e 44 45 42 55 47 20 62  -op for NDEBUG b
12400 75 69 6c 64 73 20 2a 2f 0a 20 20 66 74 73 35 43  uilds */.  fts5C
12410 68 65 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53  heckTransactionS
12420 74 61 74 65 28 70 54 61 62 2c 20 46 54 53 35 5f  tate(pTab, FTS5_
12430 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
12440 69 6e 74 29 3b 0a 20 20 66 74 73 35 54 72 69 70  int);.  fts5Trip
12450 43 75 72 73 6f 72 73 28 70 54 61 62 29 3b 0a 20  Cursors(pTab);. 
12460 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
12470 74 73 35 53 74 6f 72 61 67 65 53 79 6e 63 28 70  ts5StorageSync(p
12480 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a  Tab->pStorage);.
12490 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 52 6f  }../*.** The xRo
124a0 6c 6c 62 61 63 6b 54 6f 28 29 20 6d 65 74 68 6f  llbackTo() metho
124b0 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 63 61 72 64  d..**.** Discard
124c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
124d0 20 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72   the pending ter
124e0 6d 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ms table..*/.sta
124f0 74 69 63 20 69 6e 74 20 66 74 73 35 52 6f 6c 6c  tic int fts5Roll
12500 62 61 63 6b 54 6f 4d 65 74 68 6f 64 28 73 71 6c  backToMethod(sql
12510 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
12520 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
12530 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a  ){.  Fts5Table *
12540 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c  pTab = (Fts5Tabl
12550 65 2a 29 70 56 74 61 62 3b 0a 20 20 55 4e 55 53  e*)pVtab;.  UNUS
12560 45 44 5f 50 41 52 41 4d 28 69 53 61 76 65 70 6f  ED_PARAM(iSavepo
12570 69 6e 74 29 3b 20 20 2f 2a 20 43 61 6c 6c 20 62  int);  /* Call b
12580 65 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 20  elow is a no-op 
12590 66 6f 72 20 4e 44 45 42 55 47 20 62 75 69 6c 64  for NDEBUG build
125a0 73 20 2a 2f 0a 20 20 66 74 73 35 43 68 65 63 6b  s */.  fts5Check
125b0 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65  TransactionState
125c0 28 70 54 61 62 2c 20 46 54 53 35 5f 52 4f 4c 4c  (pTab, FTS5_ROLL
125d0 42 41 43 4b 54 4f 2c 20 69 53 61 76 65 70 6f 69  BACKTO, iSavepoi
125e0 6e 74 29 3b 0a 20 20 66 74 73 35 54 72 69 70 43  nt);.  fts5TripC
125f0 75 72 73 6f 72 73 28 70 54 61 62 29 3b 0a 20 20  ursors(pTab);.  
12600 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
12610 73 35 53 74 6f 72 61 67 65 52 6f 6c 6c 62 61 63  s5StorageRollbac
12620 6b 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65  k(pTab->pStorage
12630 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  );.}../*.** Regi
12640 73 74 65 72 20 61 20 6e 65 77 20 61 75 78 69 6c  ster a new auxil
12650 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 20 77 69  iary function wi
12660 74 68 20 67 6c 6f 62 61 6c 20 63 6f 6e 74 65 78  th global contex
12670 74 20 70 47 6c 6f 62 61 6c 2e 0a 2a 2f 0a 73 74  t pGlobal..*/.st
12680 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 72 65  atic int fts5Cre
12690 61 74 65 41 75 78 28 0a 20 20 66 74 73 35 5f 61  ateAux(.  fts5_a
126a0 70 69 20 2a 70 41 70 69 2c 20 20 20 20 20 20 20  pi *pApi,       
126b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f            /* Glo
126c0 62 61 6c 20 63 6f 6e 74 65 78 74 20 28 6f 6e 65  bal context (one
126d0 20 70 65 72 20 64 62 20 68 61 6e 64 6c 65 29 20   per db handle) 
126e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
126f0 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
12700 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
12710 6e 65 77 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  new function */.
12720 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74    void *pUserDat
12730 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
12740 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20 66    /* User data f
12750 6f 72 20 61 75 78 2e 20 66 75 6e 63 74 69 6f 6e  or aux. function
12760 20 2a 2f 0a 20 20 66 74 73 35 5f 65 78 74 65 6e   */.  fts5_exten
12770 73 69 6f 6e 5f 66 75 6e 63 74 69 6f 6e 20 78 46  sion_function xF
12780 75 6e 63 2c 20 20 2f 2a 20 41 75 78 2e 20 66 75  unc,  /* Aux. fu
12790 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
127a0 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 28  ation */.  void(
127b0 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a  *xDestroy)(void*
127c0 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  )          /* De
127d0 73 74 72 75 63 74 6f 72 20 66 6f 72 20 70 55 73  structor for pUs
127e0 65 72 44 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 46  erData */.){.  F
127f0 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62  ts5Global *pGlob
12800 61 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61 6c  al = (Fts5Global
12810 2a 29 70 41 70 69 3b 0a 20 20 69 6e 74 20 72 63  *)pApi;.  int rc
12820 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c   = sqlite3_overl
12830 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 70 47 6c  oad_function(pGl
12840 6f 62 61 6c 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  obal->db, zName,
12850 20 2d 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d   -1);.  if( rc==
12860 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12870 20 46 74 73 35 41 75 78 69 6c 69 61 72 79 20 2a   Fts5Auxiliary *
12880 70 41 75 78 3b 0a 20 20 20 20 69 6e 74 20 6e 4e  pAux;.    int nN
12890 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
128a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
128b0 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79  e of zName in by
128c0 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 5c  tes, including \
128d0 30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  0 */.    int nBy
128e0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
128f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
12900 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
12910 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 6e  locate */..    n
12920 4e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  Name = (int)strl
12930 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  en(zName) + 1;. 
12940 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
12950 66 28 46 74 73 35 41 75 78 69 6c 69 61 72 79 29  f(Fts5Auxiliary)
12960 20 2b 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 70 41   + nName;.    pA
12970 75 78 20 3d 20 28 46 74 73 35 41 75 78 69 6c 69  ux = (Fts5Auxili
12980 61 72 79 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ary*)sqlite3_mal
12990 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  loc(nByte);.    
129a0 69 66 28 20 70 41 75 78 20 29 7b 0a 20 20 20 20  if( pAux ){.    
129b0 20 20 6d 65 6d 73 65 74 28 70 41 75 78 2c 20 30    memset(pAux, 0
129c0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
129d0 70 41 75 78 2d 3e 7a 46 75 6e 63 20 3d 20 28 63  pAux->zFunc = (c
129e0 68 61 72 2a 29 26 70 41 75 78 5b 31 5d 3b 0a 20  har*)&pAux[1];. 
129f0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 41 75 78       memcpy(pAux
12a00 2d 3e 7a 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20  ->zFunc, zName, 
12a10 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 41  nName);.      pA
12a20 75 78 2d 3e 70 47 6c 6f 62 61 6c 20 3d 20 70 47  ux->pGlobal = pG
12a30 6c 6f 62 61 6c 3b 0a 20 20 20 20 20 20 70 41 75  lobal;.      pAu
12a40 78 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  x->pUserData = p
12a50 55 73 65 72 44 61 74 61 3b 0a 20 20 20 20 20 20  UserData;.      
12a60 70 41 75 78 2d 3e 78 46 75 6e 63 20 3d 20 78 46  pAux->xFunc = xF
12a70 75 6e 63 3b 0a 20 20 20 20 20 20 70 41 75 78 2d  unc;.      pAux-
12a80 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73  >xDestroy = xDes
12a90 74 72 6f 79 3b 0a 20 20 20 20 20 20 70 41 75 78  troy;.      pAux
12aa0 2d 3e 70 4e 65 78 74 20 3d 20 70 47 6c 6f 62 61  ->pNext = pGloba
12ab0 6c 2d 3e 70 41 75 78 3b 0a 20 20 20 20 20 20 70  l->pAux;.      p
12ac0 47 6c 6f 62 61 6c 2d 3e 70 41 75 78 20 3d 20 70  Global->pAux = p
12ad0 41 75 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Aux;.    }else{.
12ae0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12af0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
12b00 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
12b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
12b20 65 72 20 61 20 6e 65 77 20 74 6f 6b 65 6e 69 7a  er a new tokeniz
12b30 65 72 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  er. This is the 
12b40 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
12b50 66 20 74 68 65 20 0a 2a 2a 20 66 74 73 35 5f 61  f the .** fts5_a
12b60 70 69 2e 78 43 72 65 61 74 65 54 6f 6b 65 6e 69  pi.xCreateTokeni
12b70 7a 65 72 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2f  zer() method..*/
12b80 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
12b90 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 28  CreateTokenizer(
12ba0 0a 20 20 66 74 73 35 5f 61 70 69 20 2a 70 41 70  .  fts5_api *pAp
12bb0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i,              
12bc0 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 63 6f 6e     /* Global con
12bd0 74 65 78 74 20 28 6f 6e 65 20 70 65 72 20 64 62  text (one per db
12be0 20 68 61 6e 64 6c 65 29 20 2a 2f 0a 20 20 63 6f   handle) */.  co
12bf0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c10 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20 66 75 6e   Name of new fun
12c20 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
12c30 2a 70 55 73 65 72 44 61 74 61 2c 20 20 20 20 20  *pUserData,     
12c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
12c50 65 72 20 64 61 74 61 20 66 6f 72 20 61 75 78 2e  er data for aux.
12c60 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 66   function */.  f
12c70 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70  ts5_tokenizer *p
12c80 54 6f 6b 65 6e 69 7a 65 72 2c 20 20 20 20 20 2f  Tokenizer,     /
12c90 2a 20 54 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c  * Tokenizer impl
12ca0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
12cb0 76 6f 69 64 28 2a 78 44 65 73 74 72 6f 79 29 28  void(*xDestroy)(
12cc0 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
12cd0 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
12ce0 72 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 29  r pUserData */.)
12cf0 7b 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a  {.  Fts5Global *
12d00 70 47 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35 47  pGlobal = (Fts5G
12d10 6c 6f 62 61 6c 2a 29 70 41 70 69 3b 0a 20 20 46  lobal*)pApi;.  F
12d20 74 73 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75  ts5TokenizerModu
12d30 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  le *pNew;.  int 
12d40 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
12d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12d60 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 61 6e 64  ize of zName and
12d70 20 69 74 73 20 5c 30 20 74 65 72 6d 69 6e 61 74   its \0 terminat
12d80 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  or */.  int nByt
12d90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12da0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
12db0 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
12dc0 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72  ocate */.  int r
12dd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
12de0 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 73    nName = (int)s
12df0 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
12e00 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
12e10 6f 66 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  of(Fts5Tokenizer
12e20 4d 6f 64 75 6c 65 29 20 2b 20 6e 4e 61 6d 65 3b  Module) + nName;
12e30 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 54  .  pNew = (Fts5T
12e40 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 2a 29  okenizerModule*)
12e50 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
12e60 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65  Byte);.  if( pNe
12e70 77 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  w ){.    memset(
12e80 70 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b  pNew, 0, nByte);
12e90 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
12ea0 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
12eb0 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
12ec0 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  New->zName, zNam
12ed0 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70  e, nName);.    p
12ee0 4e 65 77 2d 3e 70 55 73 65 72 44 61 74 61 20 3d  New->pUserData =
12ef0 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 20 20   pUserData;.    
12f00 70 4e 65 77 2d 3e 78 20 3d 20 2a 70 54 6f 6b 65  pNew->x = *pToke
12f10 6e 69 7a 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d  nizer;.    pNew-
12f20 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73  >xDestroy = xDes
12f30 74 72 6f 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  troy;.    pNew->
12f40 70 4e 65 78 74 20 3d 20 70 47 6c 6f 62 61 6c 2d  pNext = pGlobal-
12f50 3e 70 54 6f 6b 3b 0a 20 20 20 20 70 47 6c 6f 62  >pTok;.    pGlob
12f60 61 6c 2d 3e 70 54 6f 6b 20 3d 20 70 4e 65 77 3b  al->pTok = pNew;
12f70 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70  .    if( pNew->p
12f80 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Next==0 ){.     
12f90 20 70 47 6c 6f 62 61 6c 2d 3e 70 44 66 6c 74 54   pGlobal->pDfltT
12fa0 6f 6b 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  ok = pNew;.    }
12fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
12fc0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12fd0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
12fe0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73  c;.}..static Fts
12ff0 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65  5TokenizerModule
13000 20 2a 66 74 73 35 4c 6f 63 61 74 65 54 6f 6b 65   *fts5LocateToke
13010 6e 69 7a 65 72 28 0a 20 20 46 74 73 35 47 6c 6f  nizer(.  Fts5Glo
13020 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 20 0a 20  bal *pGlobal, . 
13030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13040 6d 65 0a 29 7b 0a 20 20 46 74 73 35 54 6f 6b 65  me.){.  Fts5Toke
13050 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70 4d 6f  nizerModule *pMo
13060 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 4e  d = 0;..  if( zN
13070 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4d  ame==0 ){.    pM
13080 6f 64 20 3d 20 70 47 6c 6f 62 61 6c 2d 3e 70 44  od = pGlobal->pD
13090 66 6c 74 54 6f 6b 3b 0a 20 20 7d 65 6c 73 65 7b  fltTok;.  }else{
130a0 0a 20 20 20 20 66 6f 72 28 70 4d 6f 64 3d 70 47  .    for(pMod=pG
130b0 6c 6f 62 61 6c 2d 3e 70 54 6f 6b 3b 20 70 4d 6f  lobal->pTok; pMo
130c0 64 3b 20 70 4d 6f 64 3d 70 4d 6f 64 2d 3e 70 4e  d; pMod=pMod->pN
130d0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
130e0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
130f0 7a 4e 61 6d 65 2c 20 70 4d 6f 64 2d 3e 7a 4e 61  zName, pMod->zNa
13100 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
13110 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
13120 75 72 6e 20 70 4d 6f 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pMod;.}../*.
13130 2a 2a 20 46 69 6e 64 20 61 20 74 6f 6b 65 6e 69  ** Find a tokeni
13140 7a 65 72 2e 20 54 68 69 73 20 69 73 20 74 68 65  zer. This is the
13150 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13160 6f 66 20 74 68 65 20 0a 2a 2a 20 66 74 73 35 5f  of the .** fts5_
13170 61 70 69 2e 78 46 69 6e 64 54 6f 6b 65 6e 69 7a  api.xFindTokeniz
13180 65 72 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  er() method..*/.
13190 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 46  static int fts5F
131a0 69 6e 64 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20  indTokenizer(.  
131b0 66 74 73 35 5f 61 70 69 20 2a 70 41 70 69 2c 20  fts5_api *pApi, 
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131d0 2f 2a 20 47 6c 6f 62 61 6c 20 63 6f 6e 74 65 78  /* Global contex
131e0 74 20 28 6f 6e 65 20 70 65 72 20 64 62 20 68 61  t (one per db ha
131f0 6e 64 6c 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  ndle) */.  const
13200 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
13210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
13220 6d 65 20 6f 66 20 6e 65 77 20 66 75 6e 63 74 69  me of new functi
13230 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  on */.  void **p
13240 70 55 73 65 72 44 61 74 61 2c 0a 20 20 66 74 73  pUserData,.  fts
13250 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  5_tokenizer *pTo
13260 6b 65 6e 69 7a 65 72 20 20 20 20 20 20 2f 2a 20  kenizer      /* 
13270 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62  Populate this ob
13280 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
13290 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
132a0 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  .  Fts5Tokenizer
132b0 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 0a 0a 20  Module *pMod;.. 
132c0 20 70 4d 6f 64 20 3d 20 66 74 73 35 4c 6f 63 61   pMod = fts5Loca
132d0 74 65 54 6f 6b 65 6e 69 7a 65 72 28 28 46 74 73  teTokenizer((Fts
132e0 35 47 6c 6f 62 61 6c 2a 29 70 41 70 69 2c 20 7a  5Global*)pApi, z
132f0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4d 6f  Name);.  if( pMo
13300 64 20 29 7b 0a 20 20 20 20 2a 70 54 6f 6b 65 6e  d ){.    *pToken
13310 69 7a 65 72 20 3d 20 70 4d 6f 64 2d 3e 78 3b 0a  izer = pMod->x;.
13320 20 20 20 20 2a 70 70 55 73 65 72 44 61 74 61 20      *ppUserData 
13330 3d 20 70 4d 6f 64 2d 3e 70 55 73 65 72 44 61 74  = pMod->pUserDat
13340 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
13350 6d 65 6d 73 65 74 28 70 54 6f 6b 65 6e 69 7a 65  memset(pTokenize
13360 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 74 73  r, 0, sizeof(fts
13370 35 5f 74 6f 6b 65 6e 69 7a 65 72 29 29 3b 0a 20  5_tokenizer));. 
13380 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
13390 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
133a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73  urn rc;.}..int s
133b0 71 6c 69 74 65 33 46 74 73 35 47 65 74 54 6f 6b  qlite3Fts5GetTok
133c0 65 6e 69 7a 65 72 28 0a 20 20 46 74 73 35 47 6c  enizer(.  Fts5Gl
133d0 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 20 0a  obal *pGlobal, .
133e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
133f0 7a 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67  zArg,.  int nArg
13400 2c 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ,.  Fts5Tokenize
13410 72 20 2a 2a 70 70 54 6f 6b 2c 0a 20 20 66 74 73  r **ppTok,.  fts
13420 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 2a 70 70  5_tokenizer **pp
13430 54 6f 6b 41 70 69 2c 0a 20 20 63 68 61 72 20 2a  TokApi,.  char *
13440 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 46 74 73 35  *pzErr.){.  Fts5
13450 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20  TokenizerModule 
13460 2a 70 4d 6f 64 3b 0a 20 20 69 6e 74 20 72 63 20  *pMod;.  int rc 
13470 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13480 70 4d 6f 64 20 3d 20 66 74 73 35 4c 6f 63 61 74  pMod = fts5Locat
13490 65 54 6f 6b 65 6e 69 7a 65 72 28 70 47 6c 6f 62  eTokenizer(pGlob
134a0 61 6c 2c 20 6e 41 72 67 3d 3d 30 20 3f 20 30 20  al, nArg==0 ? 0 
134b0 3a 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 69  : azArg[0]);.  i
134c0 66 28 20 70 4d 6f 64 3d 3d 30 20 29 7b 0a 20 20  f( pMod==0 ){.  
134d0 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e 30    assert( nArg>0
134e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   );.    rc = SQL
134f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 2a  ITE_ERROR;.    *
13500 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
13510 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
13520 20 74 6f 6b 65 6e 69 7a 65 72 3a 20 25 73 22 2c   tokenizer: %s",
13530 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 7d 65   azArg[0]);.  }e
13540 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 4d  lse{.    rc = pM
13550 6f 64 2d 3e 78 2e 78 43 72 65 61 74 65 28 70 4d  od->x.xCreate(pM
13560 6f 64 2d 3e 70 55 73 65 72 44 61 74 61 2c 20 26  od->pUserData, &
13570 61 7a 41 72 67 5b 31 5d 2c 20 28 6e 41 72 67 3f  azArg[1], (nArg?
13580 6e 41 72 67 2d 31 3a 30 29 2c 20 70 70 54 6f 6b  nArg-1:0), ppTok
13590 29 3b 0a 20 20 20 20 2a 70 70 54 6f 6b 41 70 69  );.    *ppTokApi
135a0 20 3d 20 26 70 4d 6f 64 2d 3e 78 3b 0a 20 20 20   = &pMod->x;.   
135b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
135c0 4f 4b 20 26 26 20 70 7a 45 72 72 20 29 7b 0a 20  OK && pzErr ){. 
135d0 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
135e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 65  lite3_mprintf("e
135f0 72 72 6f 72 20 69 6e 20 74 6f 6b 65 6e 69 7a 65  rror in tokenize
13600 72 20 63 6f 6e 73 74 72 75 63 74 6f 72 22 29 3b  r constructor");
13610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
13620 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13630 29 7b 0a 20 20 20 20 2a 70 70 54 6f 6b 41 70 69  ){.    *ppTokApi
13640 20 3d 20 30 3b 0a 20 20 20 20 2a 70 70 54 6f 6b   = 0;.    *ppTok
13650 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
13660 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
13670 63 20 76 6f 69 64 20 66 74 73 35 4d 6f 64 75 6c  c void fts5Modul
13680 65 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70  eDestroy(void *p
13690 43 74 78 29 7b 0a 20 20 46 74 73 35 54 6f 6b 65  Ctx){.  Fts5Toke
136a0 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70 54 6f  nizerModule *pTo
136b0 6b 2c 20 2a 70 4e 65 78 74 54 6f 6b 3b 0a 20 20  k, *pNextTok;.  
136c0 46 74 73 35 41 75 78 69 6c 69 61 72 79 20 2a 70  Fts5Auxiliary *p
136d0 41 75 78 2c 20 2a 70 4e 65 78 74 41 75 78 3b 0a  Aux, *pNextAux;.
136e0 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47    Fts5Global *pG
136f0 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35 47 6c 6f  lobal = (Fts5Glo
13700 62 61 6c 2a 29 70 43 74 78 3b 0a 0a 20 20 66 6f  bal*)pCtx;..  fo
13710 72 28 70 41 75 78 3d 70 47 6c 6f 62 61 6c 2d 3e  r(pAux=pGlobal->
13720 70 41 75 78 3b 20 70 41 75 78 3b 20 70 41 75 78  pAux; pAux; pAux
13730 3d 70 4e 65 78 74 41 75 78 29 7b 0a 20 20 20 20  =pNextAux){.    
13740 70 4e 65 78 74 41 75 78 20 3d 20 70 41 75 78 2d  pNextAux = pAux-
13750 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
13760 70 41 75 78 2d 3e 78 44 65 73 74 72 6f 79 20 29  pAux->xDestroy )
13770 20 70 41 75 78 2d 3e 78 44 65 73 74 72 6f 79 28   pAux->xDestroy(
13780 70 41 75 78 2d 3e 70 55 73 65 72 44 61 74 61 29  pAux->pUserData)
13790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
137a0 65 65 28 70 41 75 78 29 3b 0a 20 20 7d 0a 0a 20  ee(pAux);.  }.. 
137b0 20 66 6f 72 28 70 54 6f 6b 3d 70 47 6c 6f 62 61   for(pTok=pGloba
137c0 6c 2d 3e 70 54 6f 6b 3b 20 70 54 6f 6b 3b 20 70  l->pTok; pTok; p
137d0 54 6f 6b 3d 70 4e 65 78 74 54 6f 6b 29 7b 0a 20  Tok=pNextTok){. 
137e0 20 20 20 70 4e 65 78 74 54 6f 6b 20 3d 20 70 54     pNextTok = pT
137f0 6f 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ok->pNext;.    i
13800 66 28 20 70 54 6f 6b 2d 3e 78 44 65 73 74 72 6f  f( pTok->xDestro
13810 79 20 29 20 70 54 6f 6b 2d 3e 78 44 65 73 74 72  y ) pTok->xDestr
13820 6f 79 28 70 54 6f 6b 2d 3e 70 55 73 65 72 44 61  oy(pTok->pUserDa
13830 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
13840 5f 66 72 65 65 28 70 54 6f 6b 29 3b 0a 20 20 7d  _free(pTok);.  }
13850 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
13860 28 70 47 6c 6f 62 61 6c 29 3b 0a 7d 0a 0a 73 74  (pGlobal);.}..st
13870 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 74  atic void fts5Ft
13880 73 35 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  s5Func(.  sqlite
13890 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
138a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
138b0 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
138c0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
138d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
138e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
138f0 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20 20 73  r of args */.  s
13900 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
13910 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 2f  pArg           /
13920 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
13930 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ents */.){.  Fts
13940 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c  5Global *pGlobal
13950 20 3d 20 28 46 74 73 35 47 6c 6f 62 61 6c 2a 29   = (Fts5Global*)
13960 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
13970 61 28 70 43 74 78 29 3b 0a 20 20 66 74 73 35 5f  a(pCtx);.  fts5_
13980 61 70 69 20 2a 2a 70 70 41 70 69 3b 0a 20 20 55  api **ppApi;.  U
13990 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e 41 72 67  NUSED_PARAM(nArg
139a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  );.  assert( nAr
139b0 67 3d 3d 31 20 29 3b 0a 20 20 70 70 41 70 69 20  g==1 );.  ppApi 
139c0 3d 20 28 66 74 73 35 5f 61 70 69 2a 2a 29 73 71  = (fts5_api**)sq
139d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 70 6f 69 6e  lite3_value_poin
139e0 74 65 72 28 61 70 41 72 67 5b 30 5d 2c 20 22 66  ter(apArg[0], "f
139f0 74 73 35 5f 61 70 69 5f 70 74 72 22 29 3b 0a 20  ts5_api_ptr");. 
13a00 20 69 66 28 20 70 70 41 70 69 20 29 20 2a 70 70   if( ppApi ) *pp
13a10 41 70 69 20 3d 20 26 70 47 6c 6f 62 61 6c 2d 3e  Api = &pGlobal->
13a20 61 70 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  api;.}../*.** Im
13a30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
13a40 66 74 73 35 5f 73 6f 75 72 63 65 5f 69 64 28 29  fts5_source_id()
13a50 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
13a60 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 6f  atic void fts5So
13a70 75 72 63 65 49 64 46 75 6e 63 28 0a 20 20 73 71  urceIdFunc(.  sq
13a80 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
13a90 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
13aa0 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
13ab0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
13ac0 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13ae0 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 2a 2f  umber of args */
13af0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
13b00 20 2a 2a 61 70 55 6e 75 73 65 64 20 20 20 20 20   **apUnused     
13b10 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
13b20 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
13b30 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30   assert( nArg==0
13b40 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
13b50 41 4d 32 28 6e 41 72 67 2c 20 61 70 55 6e 75 73  AM2(nArg, apUnus
13b60 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  ed);.  sqlite3_r
13b70 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
13b80 20 22 2d 2d 46 54 53 35 2d 53 4f 55 52 43 45 2d   "--FTS5-SOURCE-
13b90 49 44 2d 2d 22 2c 20 2d 31 2c 20 53 51 4c 49 54  ID--", -1, SQLIT
13ba0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
13bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
13bc0 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Init(sqlite3 *db
13bd0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
13be0 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
13bf0 20 66 74 73 35 4d 6f 64 20 3d 20 7b 0a 20 20 20   fts5Mod = {.   
13c00 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 20 20 20   /* iVersion    
13c10 20 20 2a 2f 20 32 2c 0a 20 20 20 20 2f 2a 20 78    */ 2,.    /* x
13c20 43 72 65 61 74 65 20 20 20 20 20 20 20 2a 2f 20  Create       */ 
13c30 66 74 73 35 43 72 65 61 74 65 4d 65 74 68 6f 64  fts5CreateMethod
13c40 2c 0a 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63  ,.    /* xConnec
13c50 74 20 20 20 20 20 20 2a 2f 20 66 74 73 35 43 6f  t      */ fts5Co
13c60 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 0a 20 20 20  nnectMethod,.   
13c70 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 20   /* xBestIndex  
13c80 20 20 2a 2f 20 66 74 73 35 42 65 73 74 49 6e 64    */ fts5BestInd
13c90 65 78 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a  exMethod,.    /*
13ca0 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 20 20 2a   xDisconnect   *
13cb0 2f 20 66 74 73 35 44 69 73 63 6f 6e 6e 65 63 74  / fts5Disconnect
13cc0 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78  Method,.    /* x
13cd0 44 65 73 74 72 6f 79 20 20 20 20 20 20 2a 2f 20  Destroy      */ 
13ce0 66 74 73 35 44 65 73 74 72 6f 79 4d 65 74 68 6f  fts5DestroyMetho
13cf0 64 2c 0a 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20  d,.    /* xOpen 
13d00 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35 4f          */ fts5O
13d10 70 65 6e 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f  penMethod,.    /
13d20 2a 20 78 43 6c 6f 73 65 20 20 20 20 20 20 20 20  * xClose        
13d30 2a 2f 20 66 74 73 35 43 6c 6f 73 65 4d 65 74 68  */ fts5CloseMeth
13d40 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 46 69 6c 74  od,.    /* xFilt
13d50 65 72 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35  er       */ fts5
13d60 46 69 6c 74 65 72 4d 65 74 68 6f 64 2c 0a 20 20  FilterMethod,.  
13d70 20 20 2f 2a 20 78 4e 65 78 74 20 20 20 20 20 20    /* xNext      
13d80 20 20 20 2a 2f 20 66 74 73 35 4e 65 78 74 4d 65     */ fts5NextMe
13d90 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 45 6f  thod,.    /* xEo
13da0 66 20 20 20 20 20 20 20 20 20 20 2a 2f 20 66 74  f          */ ft
13db0 73 35 45 6f 66 4d 65 74 68 6f 64 2c 0a 20 20 20  s5EofMethod,.   
13dc0 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 20 20 20 20   /* xColumn     
13dd0 20 20 2a 2f 20 66 74 73 35 43 6f 6c 75 6d 6e 4d    */ fts5ColumnM
13de0 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 52  ethod,.    /* xR
13df0 6f 77 69 64 20 20 20 20 20 20 20 20 2a 2f 20 66  owid        */ f
13e00 74 73 35 52 6f 77 69 64 4d 65 74 68 6f 64 2c 0a  ts5RowidMethod,.
13e10 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 20      /* xUpdate  
13e20 20 20 20 20 20 2a 2f 20 66 74 73 35 55 70 64 61       */ fts5Upda
13e30 74 65 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a  teMethod,.    /*
13e40 20 78 42 65 67 69 6e 20 20 20 20 20 20 20 20 2a   xBegin        *
13e50 2f 20 66 74 73 35 42 65 67 69 6e 4d 65 74 68 6f  / fts5BeginMetho
13e60 64 2c 0a 20 20 20 20 2f 2a 20 78 53 79 6e 63 20  d,.    /* xSync 
13e70 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35 53          */ fts5S
13e80 79 6e 63 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f  yncMethod,.    /
13e90 2a 20 78 43 6f 6d 6d 69 74 20 20 20 20 20 20 20  * xCommit       
13ea0 2a 2f 20 66 74 73 35 43 6f 6d 6d 69 74 4d 65 74  */ fts5CommitMet
13eb0 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 52 6f 6c  hod,.    /* xRol
13ec0 6c 62 61 63 6b 20 20 20 20 20 2a 2f 20 66 74 73  lback     */ fts
13ed0 35 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 2c  5RollbackMethod,
13ee0 0a 20 20 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e  .    /* xFindFun
13ef0 63 74 69 6f 6e 20 2a 2f 20 66 74 73 35 46 69 6e  ction */ fts5Fin
13f00 64 46 75 6e 63 74 69 6f 6e 4d 65 74 68 6f 64 2c  dFunctionMethod,
13f10 0a 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20  .    /* xRename 
13f20 20 20 20 20 20 20 2a 2f 20 66 74 73 35 52 65 6e        */ fts5Ren
13f30 61 6d 65 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f  ameMethod,.    /
13f40 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 20 20 20  * xSavepoint    
13f50 2a 2f 20 66 74 73 35 53 61 76 65 70 6f 69 6e 74  */ fts5Savepoint
13f60 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78  Method,.    /* x
13f70 52 65 6c 65 61 73 65 20 20 20 20 20 20 2a 2f 20  Release      */ 
13f80 66 74 73 35 52 65 6c 65 61 73 65 4d 65 74 68 6f  fts5ReleaseMetho
13f90 64 2c 0a 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62  d,.    /* xRollb
13fa0 61 63 6b 54 6f 20 20 20 2a 2f 20 66 74 73 35 52  ackTo   */ fts5R
13fb0 6f 6c 6c 62 61 63 6b 54 6f 4d 65 74 68 6f 64 2c  ollbackToMethod,
13fc0 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 72 63 3b  .  };..  int rc;
13fd0 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  .  Fts5Global *p
13fe0 47 6c 6f 62 61 6c 20 3d 20 30 3b 0a 0a 20 20 70  Global = 0;..  p
13ff0 47 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35 47 6c  Global = (Fts5Gl
14000 6f 62 61 6c 2a 29 73 71 6c 69 74 65 33 5f 6d 61  obal*)sqlite3_ma
14010 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 35  lloc(sizeof(Fts5
14020 47 6c 6f 62 61 6c 29 29 3b 0a 20 20 69 66 28 20  Global));.  if( 
14030 70 47 6c 6f 62 61 6c 3d 3d 30 20 29 7b 0a 20 20  pGlobal==0 ){.  
14040 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14050 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
14060 20 20 76 6f 69 64 20 2a 70 20 3d 20 28 76 6f 69    void *p = (voi
14070 64 2a 29 70 47 6c 6f 62 61 6c 3b 0a 20 20 20 20  d*)pGlobal;.    
14080 6d 65 6d 73 65 74 28 70 47 6c 6f 62 61 6c 2c 20  memset(pGlobal, 
14090 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 47 6c  0, sizeof(Fts5Gl
140a0 6f 62 61 6c 29 29 3b 0a 20 20 20 20 70 47 6c 6f  obal));.    pGlo
140b0 62 61 6c 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  bal->db = db;.  
140c0 20 20 70 47 6c 6f 62 61 6c 2d 3e 61 70 69 2e 69    pGlobal->api.i
140d0 56 65 72 73 69 6f 6e 20 3d 20 32 3b 0a 20 20 20  Version = 2;.   
140e0 20 70 47 6c 6f 62 61 6c 2d 3e 61 70 69 2e 78 43   pGlobal->api.xC
140f0 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 20 3d 20  reateFunction = 
14100 66 74 73 35 43 72 65 61 74 65 41 75 78 3b 0a 20  fts5CreateAux;. 
14110 20 20 20 70 47 6c 6f 62 61 6c 2d 3e 61 70 69 2e     pGlobal->api.
14120 78 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72  xCreateTokenizer
14130 20 3d 20 66 74 73 35 43 72 65 61 74 65 54 6f 6b   = fts5CreateTok
14140 65 6e 69 7a 65 72 3b 0a 20 20 20 20 70 47 6c 6f  enizer;.    pGlo
14150 62 61 6c 2d 3e 61 70 69 2e 78 46 69 6e 64 54 6f  bal->api.xFindTo
14160 6b 65 6e 69 7a 65 72 20 3d 20 66 74 73 35 46 69  kenizer = fts5Fi
14170 6e 64 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20  ndTokenizer;.   
14180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
14190 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64  eate_module_v2(d
141a0 62 2c 20 22 66 74 73 35 22 2c 20 26 66 74 73 35  b, "fts5", &fts5
141b0 4d 6f 64 2c 20 70 2c 20 66 74 73 35 4d 6f 64 75  Mod, p, fts5Modu
141c0 6c 65 44 65 73 74 72 6f 79 29 3b 0a 20 20 20 20  leDestroy);.    
141d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
141e0 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33  K ) rc = sqlite3
141f0 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 64 62  Fts5IndexInit(db
14200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
14210 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
14220 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 49  sqlite3Fts5ExprI
14230 6e 69 74 28 70 47 6c 6f 62 61 6c 2c 20 64 62 29  nit(pGlobal, db)
14240 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14250 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73  LITE_OK ) rc = s
14260 71 6c 69 74 65 33 46 74 73 35 41 75 78 49 6e 69  qlite3Fts5AuxIni
14270 74 28 26 70 47 6c 6f 62 61 6c 2d 3e 61 70 69 29  t(&pGlobal->api)
14280 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14290 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73  LITE_OK ) rc = s
142a0 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69  qlite3Fts5Tokeni
142b0 7a 65 72 49 6e 69 74 28 26 70 47 6c 6f 62 61 6c  zerInit(&pGlobal
142c0 2d 3e 61 70 69 29 3b 0a 20 20 20 20 69 66 28 20  ->api);.    if( 
142d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
142e0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
142f0 56 6f 63 61 62 49 6e 69 74 28 70 47 6c 6f 62 61  VocabInit(pGloba
14300 6c 2c 20 64 62 29 3b 0a 20 20 20 20 69 66 28 20  l, db);.    if( 
14310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14320 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14330 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
14340 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 20 20 64  ion(.          d
14350 62 2c 20 22 66 74 73 35 22 2c 20 31 2c 20 53 51  b, "fts5", 1, SQ
14360 4c 49 54 45 5f 55 54 46 38 2c 20 70 2c 20 66 74  LITE_UTF8, p, ft
14370 73 35 46 74 73 35 46 75 6e 63 2c 20 30 2c 20 30  s5Fts5Func, 0, 0
14380 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
14390 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
143a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
143b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
143c0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
143d0 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35         db, "fts5
143e0 5f 73 6f 75 72 63 65 5f 69 64 22 2c 20 30 2c 20  _source_id", 0, 
143f0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 2c 20  SQLITE_UTF8, p, 
14400 66 74 73 35 53 6f 75 72 63 65 49 64 46 75 6e 63  fts5SourceIdFunc
14410 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  , 0, 0.      );.
14420 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14430 49 66 20 53 51 4c 49 54 45 5f 46 54 53 35 5f 45  If SQLITE_FTS5_E
14440 4e 41 42 4c 45 5f 54 45 53 54 5f 4d 49 20 69 73  NABLE_TEST_MI is
14450 20 64 65 66 69 6e 65 64 2c 20 61 73 73 75 6d 65   defined, assume
14460 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20   that the file. 
14470 20 2a 2a 20 66 74 73 35 5f 74 65 73 74 5f 6d 69   ** fts5_test_mi
14480 2e 63 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 61  .c is compiled a
14490 6e 64 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 74  nd linked into t
144a0 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 20 41  he executable. A
144b0 6e 64 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 74 73  nd call.  ** its
144c0 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 74 6f 20   entry point to 
144d0 65 6e 61 62 6c 65 20 74 68 65 20 6d 61 74 63 68  enable the match
144e0 69 6e 66 6f 28 29 20 64 65 6d 6f 2e 20 20 2a 2f  info() demo.  */
144f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 46  .#ifdef SQLITE_F
14500 54 53 35 5f 45 4e 41 42 4c 45 5f 54 45 53 54 5f  TS5_ENABLE_TEST_
14510 4d 49 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  MI.  if( rc==SQL
14520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
14530 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14540 46 74 73 35 54 65 73 74 52 65 67 69 73 74 65 72  Fts5TestRegister
14550 4d 61 74 63 68 69 6e 66 6f 28 73 71 6c 69 74 65  Matchinfo(sqlite
14560 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
14570 6c 69 74 65 33 46 74 73 35 54 65 73 74 52 65 67  lite3Fts5TestReg
14580 69 73 74 65 72 4d 61 74 63 68 69 6e 66 6f 28 64  isterMatchinfo(d
14590 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
145a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
145b0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
145c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  ing functions ar
145d0 65 20 75 73 65 64 20 74 6f 20 72 65 67 69 73 74  e used to regist
145e0 65 72 20 74 68 65 20 6d 6f 64 75 6c 65 20 77 69  er the module wi
145f0 74 68 20 53 51 4c 69 74 65 2e 20 49 66 0a 2a 2a  th SQLite. If.**
14600 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   this module is 
14610 62 65 69 6e 67 20 62 75 69 6c 74 20 61 73 20 70  being built as p
14620 61 72 74 20 6f 66 20 74 68 65 20 53 51 4c 69 74  art of the SQLit
14630 65 20 63 6f 72 65 20 28 53 51 4c 49 54 45 5f 43  e core (SQLITE_C
14640 4f 52 45 20 69 73 0a 2a 2a 20 64 65 66 69 6e 65  ORE is.** define
14650 64 29 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  d), then sqlite3
14660 5f 6f 70 65 6e 28 29 20 77 69 6c 6c 20 63 61 6c  _open() will cal
14670 6c 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69  l sqlite3Fts5Ini
14680 74 28 29 20 64 69 72 65 63 74 6c 79 2e 0a 2a 2a  t() directly..**
14690 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 69 73 20  .** Or, if this 
146a0 6d 6f 64 75 6c 65 20 69 73 20 62 65 69 6e 67 20  module is being 
146b0 62 75 69 6c 74 20 61 73 20 61 20 6c 6f 61 64 61  built as a loada
146c0 62 6c 65 20 65 78 74 65 6e 73 69 6f 6e 2c 20 0a  ble extension, .
146d0 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ** sqlite3Fts5In
146e0 69 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 20  it() is omitted 
146f0 61 6e 64 20 74 68 65 20 74 77 6f 20 73 74 61 6e  and the two stan
14700 64 61 72 64 20 65 6e 74 72 79 20 70 6f 69 6e 74  dard entry point
14710 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 74 73  s.** sqlite3_fts
14720 5f 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69  _init() and sqli
14730 74 65 33 5f 66 74 73 35 5f 69 6e 69 74 28 29 20  te3_fts5_init() 
14740 64 65 66 69 6e 65 64 20 69 6e 73 74 65 61 64 2e  defined instead.
14750 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14760 54 45 5f 43 4f 52 45 0a 23 69 66 64 65 66 20 5f  TE_CORE.#ifdef _
14770 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
14780 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
14790 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  if.int sqlite3_f
147a0 74 73 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74  ts_init(.  sqlit
147b0 65 33 20 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a  e3 *db,.  char *
147c0 2a 70 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e  *pzErrMsg,.  con
147d0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
147e0 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b  outines *pApi.){
147f0 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
14800 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b  ION_INIT2(pApi);
14810 0a 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73  .  (void)pzErrMs
14820 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61  g;  /* Unused pa
14830 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 72 65 74  rameter */.  ret
14840 75 72 6e 20 66 74 73 35 49 6e 69 74 28 64 62 29  urn fts5Init(db)
14850 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e  ;.}..#ifdef _WIN
14860 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  32.__declspec(dl
14870 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a  lexport).#endif.
14880 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 35  int sqlite3_fts5
14890 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  _init(.  sqlite3
148a0 20 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70   *db,.  char **p
148b0 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74  zErrMsg,.  const
148c0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
148d0 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20  tines *pApi.){. 
148e0 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f   SQLITE_EXTENSIO
148f0 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20  N_INIT2(pApi);. 
14900 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b   (void)pzErrMsg;
14910 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61    /* Unused para
14920 6d 65 74 65 72 20 2a 2f 0a 20 20 72 65 74 75 72  meter */.  retur
14930 6e 20 66 74 73 35 49 6e 69 74 28 64 62 29 3b 0a  n fts5Init(db);.
14940 7d 0a 23 65 6c 73 65 0a 69 6e 74 20 73 71 6c 69  }.#else.int sqli
14950 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
14960 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
14970 72 6e 20 66 74 73 35 49 6e 69 74 28 64 62 29 3b  rn fts5Init(db);
14980 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.