/ Hex Artifact Content
Login

Artifact 0569cd9fc18f3b56f6eeac601836df8ed5fb54cb:


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 52 45 51 55 49 52 45 5f 43 4f 4e 54 45 4e 54  _REQUIRE_CONTENT
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: 44 4f 43 53 49 5a 45 20 20 20 30 78 30 32 0a 23  DOCSIZE   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 49 4e 53 54 20 20 20 20 20  EQUIRE_INST     
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 45 4f 46 20 20 20 20 20 20 20  S5CSR_EOF       
23b0: 20 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65          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 0a 23 64 65 66  EK    0x20..#def
2410: 69 6e 65 20 42 69 74 46 6c 61 67 41 6c 6c 54 65  ine BitFlagAllTe
2420: 73 74 28 78 2c 79 29 20 28 28 28 78 29 20 26 20  st(x,y) (((x) & 
2430: 28 79 29 29 3d 3d 28 79 29 29 0a 23 64 65 66 69  (y))==(y)).#defi
2440: 6e 65 20 42 69 74 46 6c 61 67 54 65 73 74 28 78  ne BitFlagTest(x
2450: 2c 79 29 20 20 20 20 28 28 28 78 29 20 26 20 28  ,y)    (((x) & (
2460: 79 29 29 21 3d 30 29 0a 0a 0a 2f 2a 0a 2a 2a 20  y))!=0).../*.** 
2470: 4d 61 63 72 6f 73 20 74 6f 20 53 65 74 28 29 2c  Macros to Set(),
2480: 20 43 6c 65 61 72 28 29 20 61 6e 64 20 54 65 73   Clear() and Tes
2490: 74 28 29 20 63 75 72 73 6f 72 20 66 6c 61 67 73  t() cursor flags
24a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 73 72  ..*/.#define Csr
24b0: 46 6c 61 67 53 65 74 28 70 43 73 72 2c 20 66 6c  FlagSet(pCsr, fl
24c0: 61 67 29 20 20 20 28 28 70 43 73 72 29 2d 3e 63  ag)   ((pCsr)->c
24d0: 73 72 66 6c 61 67 73 20 7c 3d 20 28 66 6c 61 67  srflags |= (flag
24e0: 29 29 0a 23 64 65 66 69 6e 65 20 43 73 72 46 6c  )).#define CsrFl
24f0: 61 67 43 6c 65 61 72 28 70 43 73 72 2c 20 66 6c  agClear(pCsr, fl
2500: 61 67 29 20 28 28 70 43 73 72 29 2d 3e 63 73 72  ag) ((pCsr)->csr
2510: 66 6c 61 67 73 20 26 3d 20 7e 28 66 6c 61 67 29  flags &= ~(flag)
2520: 29 0a 23 64 65 66 69 6e 65 20 43 73 72 46 6c 61  ).#define CsrFla
2530: 67 54 65 73 74 28 70 43 73 72 2c 20 66 6c 61 67  gTest(pCsr, flag
2540: 29 20 20 28 28 70 43 73 72 29 2d 3e 63 73 72 66  )  ((pCsr)->csrf
2550: 6c 61 67 73 20 26 20 28 66 6c 61 67 29 29 0a 0a  lags & (flag))..
2560: 73 74 72 75 63 74 20 46 74 73 35 41 75 78 64 61  struct Fts5Auxda
2570: 74 61 20 7b 0a 20 20 46 74 73 35 41 75 78 69 6c  ta {.  Fts5Auxil
2580: 69 61 72 79 20 2a 70 41 75 78 3b 20 20 20 20 20  iary *pAux;     
2590: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 65 6e 73         /* Extens
25a0: 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 74 68 69  ion to which thi
25b0: 73 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 76  s belongs */.  v
25c0: 6f 69 64 20 2a 70 50 74 72 3b 20 20 20 20 20 20  oid *pPtr;      
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 50 6f 69 6e 74 65 72 20 76 61 6c 75 65 20  * Pointer value 
25f0: 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 65  */.  void(*xDele
2600: 74 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  te)(void*);     
2610: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
2620: 6f 72 20 2a 2f 0a 20 20 46 74 73 35 41 75 78 64  or */.  Fts5Auxd
2630: 61 74 61 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ata *pNext;     
2640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
2650: 6f 62 6a 65 63 74 20 69 6e 20 6c 69 6e 6b 65 64  object in linked
2660: 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 23 69 66   list */.};..#if
2670: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2680: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 42 45  .#define FTS5_BE
2690: 47 49 4e 20 20 20 20 20 20 31 0a 23 64 65 66 69  GIN      1.#defi
26a0: 6e 65 20 46 54 53 35 5f 53 59 4e 43 20 20 20 20  ne FTS5_SYNC    
26b0: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 46 54 53     2.#define FTS
26c0: 35 5f 43 4f 4d 4d 49 54 20 20 20 20 20 33 0a 23  5_COMMIT     3.#
26d0: 64 65 66 69 6e 65 20 46 54 53 35 5f 52 4f 4c 4c  define FTS5_ROLL
26e0: 42 41 43 4b 20 20 20 34 0a 23 64 65 66 69 6e 65  BACK   4.#define
26f0: 20 46 54 53 35 5f 53 41 56 45 50 4f 49 4e 54 20   FTS5_SAVEPOINT 
2700: 20 35 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f   5.#define FTS5_
2710: 52 45 4c 45 41 53 45 20 20 20 20 36 0a 23 64 65  RELEASE    6.#de
2720: 66 69 6e 65 20 46 54 53 35 5f 52 4f 4c 4c 42 41  fine FTS5_ROLLBA
2730: 43 4b 54 4f 20 37 0a 73 74 61 74 69 63 20 76 6f  CKTO 7.static vo
2740: 69 64 20 66 74 73 35 43 68 65 63 6b 54 72 61 6e  id fts5CheckTran
2750: 73 61 63 74 69 6f 6e 53 74 61 74 65 28 46 74 73  sactionState(Fts
2760: 35 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 6f  5Table *p, int o
2770: 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
2780: 74 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  t){.  switch( op
2790: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 46 54 53   ){.    case FTS
27a0: 35 5f 42 45 47 49 4e 3a 0a 20 20 20 20 20 20 61  5_BEGIN:.      a
27b0: 73 73 65 72 74 28 20 70 2d 3e 74 73 2e 65 53 74  ssert( p->ts.eSt
27c0: 61 74 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ate==0 );.      
27d0: 70 2d 3e 74 73 2e 65 53 74 61 74 65 20 3d 20 31  p->ts.eState = 1
27e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 74 73 2e 69 53  ;.      p->ts.iS
27f0: 61 76 65 70 6f 69 6e 74 20 3d 20 2d 31 3b 0a 20  avepoint = -1;. 
2800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2810: 20 63 61 73 65 20 46 54 53 35 5f 53 59 4e 43 3a   case FTS5_SYNC:
2820: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2830: 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d 31 20 29  ->ts.eState==1 )
2840: 3b 0a 20 20 20 20 20 20 70 2d 3e 74 73 2e 65 53  ;.      p->ts.eS
2850: 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20  tate = 2;.      
2860: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
2870: 20 46 54 53 35 5f 43 4f 4d 4d 49 54 3a 0a 20 20   FTS5_COMMIT:.  
2880: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74      assert( p->t
2890: 73 2e 65 53 74 61 74 65 3d 3d 32 20 29 3b 0a 20  s.eState==2 );. 
28a0: 20 20 20 20 20 70 2d 3e 74 73 2e 65 53 74 61 74       p->ts.eStat
28b0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  e = 0;.      bre
28c0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 46 54  ak;..    case FT
28d0: 53 35 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20  S5_ROLLBACK:.   
28e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 73     assert( p->ts
28f0: 2e 65 53 74 61 74 65 3d 3d 31 20 7c 7c 20 70 2d  .eState==1 || p-
2900: 3e 74 73 2e 65 53 74 61 74 65 3d 3d 32 20 7c 7c  >ts.eState==2 ||
2910: 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d 30   p->ts.eState==0
2920: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74 73 2e   );.      p->ts.
2930: 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
2940: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
2950: 73 65 20 46 54 53 35 5f 53 41 56 45 50 4f 49 4e  se FTS5_SAVEPOIN
2960: 54 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  T:.      assert(
2970: 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d 31   p->ts.eState==1
2980: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2990: 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
29a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29b0: 20 69 53 61 76 65 70 6f 69 6e 74 3e 70 2d 3e 74   iSavepoint>p->t
29c0: 73 2e 69 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  s.iSavepoint );.
29d0: 20 20 20 20 20 20 70 2d 3e 74 73 2e 69 53 61 76        p->ts.iSav
29e0: 65 70 6f 69 6e 74 20 3d 20 69 53 61 76 65 70 6f  epoint = iSavepo
29f0: 69 6e 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  int;.      break
2a00: 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 63 61 73  ;.      .    cas
2a10: 65 20 46 54 53 35 5f 52 45 4c 45 41 53 45 3a 0a  e FTS5_RELEASE:.
2a20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2a30: 3e 74 73 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b  >ts.eState==1 );
2a40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2a50: 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a  Savepoint>=0 );.
2a60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
2a70: 61 76 65 70 6f 69 6e 74 3c 3d 70 2d 3e 74 73 2e  avepoint<=p->ts.
2a80: 69 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  iSavepoint );.  
2a90: 20 20 20 20 70 2d 3e 74 73 2e 69 53 61 76 65 70      p->ts.iSavep
2aa0: 6f 69 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e  oint = iSavepoin
2ab0: 74 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  t-1;.      break
2ac0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35  ;..    case FTS5
2ad0: 5f 52 4f 4c 4c 42 41 43 4b 54 4f 3a 0a 20 20 20  _ROLLBACKTO:.   
2ae0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 73     assert( p->ts
2af0: 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20  .eState==1 );.  
2b00: 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
2b10: 65 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20  epoint>=0 );.   
2b20: 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
2b30: 70 6f 69 6e 74 3c 3d 70 2d 3e 74 73 2e 69 53 61  point<=p->ts.iSa
2b40: 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20 20  vepoint );.     
2b50: 20 70 2d 3e 74 73 2e 69 53 61 76 65 70 6f 69 6e   p->ts.iSavepoin
2b60: 74 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 3b 0a  t = iSavepoint;.
2b70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
2b80: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
2b90: 65 20 66 74 73 35 43 68 65 63 6b 54 72 61 6e 73  e fts5CheckTrans
2ba0: 61 63 74 69 6f 6e 53 74 61 74 65 28 78 2c 79 2c  actionState(x,y,
2bb0: 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
2bc0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2bd0: 70 54 61 62 20 69 73 20 61 20 63 6f 6e 74 65 6e  pTab is a conten
2be0: 74 6c 65 73 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a  tless table..*/.
2bf0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
2c00: 73 43 6f 6e 74 65 6e 74 6c 65 73 73 28 46 74 73  sContentless(Fts
2c10: 35 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20  5Table *pTab){. 
2c20: 20 72 65 74 75 72 6e 20 70 54 61 62 2d 3e 70 43   return pTab->pC
2c30: 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 3d  onfig->eContent=
2c40: 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f  =FTS5_CONTENT_NO
2c50: 4e 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  NE;.}../*.** Del
2c60: 65 74 65 20 61 20 76 69 72 74 75 61 6c 20 74 61  ete a virtual ta
2c70: 62 6c 65 20 68 61 6e 64 6c 65 20 61 6c 6c 6f 63  ble handle alloc
2c80: 61 74 65 64 20 62 79 20 66 74 73 35 49 6e 69 74  ated by fts5Init
2c90: 56 74 61 62 28 29 2e 20 0a 2a 2f 0a 73 74 61 74  Vtab(). .*/.stat
2ca0: 69 63 20 76 6f 69 64 20 66 74 73 35 46 72 65 65  ic void fts5Free
2cb0: 56 74 61 62 28 46 74 73 35 54 61 62 6c 65 20 2a  Vtab(Fts5Table *
2cc0: 70 54 61 62 29 7b 0a 20 20 69 66 28 20 70 54 61  pTab){.  if( pTa
2cd0: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
2ce0: 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 70  Fts5IndexClose(p
2cf0: 54 61 62 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20  Tab->pIndex);.  
2d00: 20 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f    sqlite3Fts5Sto
2d10: 72 61 67 65 43 6c 6f 73 65 28 70 54 61 62 2d 3e  rageClose(pTab->
2d20: 70 53 74 6f 72 61 67 65 29 3b 0a 20 20 20 20 73  pStorage);.    s
2d30: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
2d40: 46 72 65 65 28 70 54 61 62 2d 3e 70 43 6f 6e 66  Free(pTab->pConf
2d50: 69 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ig);.    sqlite3
2d60: 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 7d  _free(pTab);.  }
2d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 44  .}../*.** The xD
2d80: 69 73 63 6f 6e 6e 65 63 74 28 29 20 76 69 72 74  isconnect() virt
2d90: 75 61 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64  ual table method
2da0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2db0: 66 74 73 35 44 69 73 63 6f 6e 6e 65 63 74 4d 65  fts5DisconnectMe
2dc0: 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
2dd0: 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 66 74 73  b *pVtab){.  fts
2de0: 35 46 72 65 65 56 74 61 62 28 28 46 74 73 35 54  5FreeVtab((Fts5T
2df0: 61 62 6c 65 2a 29 70 56 74 61 62 29 3b 0a 20 20  able*)pVtab);.  
2e00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  ;.}../*.** The x
2e20: 44 65 73 74 72 6f 79 28 29 20 76 69 72 74 75 61  Destroy() virtua
2e30: 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a  l table method..
2e40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
2e50: 73 35 44 65 73 74 72 6f 79 4d 65 74 68 6f 64 28  s5DestroyMethod(
2e60: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
2e70: 74 61 62 29 7b 0a 20 20 46 74 73 35 54 61 62 6c  tab){.  Fts5Tabl
2e80: 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54  e *pTab = (Fts5T
2e90: 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 69  able*)pVtab;.  i
2ea0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  nt rc = sqlite3F
2eb0: 74 73 35 44 72 6f 70 41 6c 6c 28 70 54 61 62 2d  ts5DropAll(pTab-
2ec0: 3e 70 43 6f 6e 66 69 67 29 3b 0a 20 20 69 66 28  >pConfig);.  if(
2ed0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ee0: 7b 0a 20 20 20 20 66 74 73 35 46 72 65 65 56 74  {.    fts5FreeVt
2ef0: 61 62 28 28 46 74 73 35 54 61 62 6c 65 2a 29 70  ab((Fts5Table*)p
2f00: 56 74 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Vtab);.  }.  ret
2f10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f30: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
2f40: 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20 74 68 65  tion of both the
2f50: 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43   xConnect and xC
2f60: 72 65 61 74 65 0a 2a 2a 20 6d 65 74 68 6f 64 73  reate.** methods
2f70: 20 6f 66 20 74 68 65 20 46 54 53 33 20 76 69 72   of the FTS3 vir
2f80: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
2f90: 2a 20 54 68 65 20 61 72 67 76 5b 5d 20 61 72 72  * The argv[] arr
2fa0: 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ay contains the 
2fb0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
2fc0: 20 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20     argv[0]   -> 
2fd0: 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28 22 66  module name  ("f
2fe0: 74 73 35 22 29 0a 2a 2a 20 20 20 61 72 67 76 5b  ts5").**   argv[
2ff0: 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65  1]   -> database
3000: 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b   name.**   argv[
3010: 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61  2]   -> table na
3020: 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e 2e  me.**   argv[...
3030: 5d 20 2d 3e 20 22 63 6f 6c 75 6d 6e 20 6e 61 6d  ] -> "column nam
3040: 65 22 20 61 6e 64 20 6f 74 68 65 72 20 6d 6f 64  e" and other mod
3050: 75 6c 65 20 61 72 67 75 6d 65 6e 74 20 66 69 65  ule argument fie
3060: 6c 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lds..*/.static i
3070: 6e 74 20 66 74 73 35 49 6e 69 74 56 74 61 62 28  nt fts5InitVtab(
3080: 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20  .  int bCreate, 
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 78     /* True for x
30b0: 43 72 65 61 74 65 2c 20 66 61 6c 73 65 20 66 6f  Create, false fo
30c0: 72 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20  r xConnect */.  
30d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 2f 2a 20 54 68 65 20 53 51 4c 69 74 65 20 64 61  /* The SQLite da
3100: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3110: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75  n */.  void *pAu
3120: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
3130: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
3140: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
3150: 74 6f 6b 65 6e 69 7a 65 72 73 20 2a 2f 0a 20 20  tokenizers */.  
3160: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
3190: 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72  ments in argv ar
31a0: 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ray */.  const c
31b0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67  har * const *arg
31c0: 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65  v,       /* xCre
31d0: 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67  ate/xConnect arg
31e0: 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
31f0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
3200: 70 70 56 54 61 62 2c 20 20 20 20 20 20 20 20 20  ppVTab,         
3210: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
3220: 73 75 6c 74 69 6e 67 20 76 74 61 62 20 73 74 72  sulting vtab str
3230: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
3240: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3260: 20 2f 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72   /* Write any er
3270: 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72 65  ror message here
3280: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 47 6c 6f   */.){.  Fts5Glo
3290: 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 20 3d 20 28  bal *pGlobal = (
32a0: 46 74 73 35 47 6c 6f 62 61 6c 2a 29 70 41 75 78  Fts5Global*)pAux
32b0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
32c0: 2a 61 7a 43 6f 6e 66 69 67 20 3d 20 28 63 6f 6e  *azConfig = (con
32d0: 73 74 20 63 68 61 72 2a 2a 29 61 72 67 76 3b 0a  st char**)argv;.
32e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32f0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
3300: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
3310: 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
3320: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 30 3b 20 20   *pConfig = 0;  
3330: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
3340: 20 6f 66 20 70 61 72 73 69 6e 67 20 61 72 67 63   of parsing argc
3350: 2f 61 72 67 76 20 2a 2f 0a 20 20 46 74 73 35 54  /argv */.  Fts5T
3360: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
3380: 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  w virtual table 
3390: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2f 2a 20  object */..  /* 
33a0: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 6e 65 77  Allocate the new
33b0: 20 76 74 61 62 20 6f 62 6a 65 63 74 20 61 6e 64   vtab object and
33c0: 20 70 61 72 73 65 20 74 68 65 20 63 6f 6e 66 69   parse the confi
33d0: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 70 54  guration */.  pT
33e0: 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a  ab = (Fts5Table*
33f0: 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
3400: 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
3410: 6f 66 28 46 74 73 35 54 61 62 6c 65 29 29 3b 0a  of(Fts5Table));.
3420: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3430: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
3440: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
3450: 67 50 61 72 73 65 28 70 47 6c 6f 62 61 6c 2c 20  gParse(pGlobal, 
3460: 64 62 2c 20 61 72 67 63 2c 20 61 7a 43 6f 6e 66  db, argc, azConf
3470: 69 67 2c 20 26 70 43 6f 6e 66 69 67 2c 20 70 7a  ig, &pConfig, pz
3480: 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
3490: 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
34a0: 20 26 26 20 2a 70 7a 45 72 72 3d 3d 30 29 20 7c   && *pzErr==0) |
34b0: 7c 20 70 43 6f 6e 66 69 67 3d 3d 30 20 29 3b 0a  | pConfig==0 );.
34c0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
34d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
34e0: 54 61 62 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70  Tab->pConfig = p
34f0: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 54 61 62  Config;.    pTab
3500: 2d 3e 70 47 6c 6f 62 61 6c 20 3d 20 70 47 6c 6f  ->pGlobal = pGlo
3510: 62 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  bal;.  }..  /* O
3520: 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20 73 75  pen the index su
3530: 62 2d 73 79 73 74 65 6d 20 2a 2f 0a 20 20 69 66  b-system */.  if
3540: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3550: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
3560: 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
3570: 28 70 43 6f 6e 66 69 67 2c 20 62 43 72 65 61 74  (pConfig, bCreat
3580: 65 2c 20 26 70 54 61 62 2d 3e 70 49 6e 64 65 78  e, &pTab->pIndex
3590: 2c 20 70 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a 20  , pzErr);.  }.. 
35a0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 74 6f   /* Open the sto
35b0: 72 61 67 65 20 73 75 62 2d 73 79 73 74 65 6d 20  rage sub-system 
35c0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
35d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
35e0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
35f0: 6f 72 61 67 65 4f 70 65 6e 28 0a 20 20 20 20 20  orageOpen(.     
3600: 20 20 20 70 43 6f 6e 66 69 67 2c 20 70 54 61 62     pConfig, pTab
3610: 2d 3e 70 49 6e 64 65 78 2c 20 62 43 72 65 61 74  ->pIndex, bCreat
3620: 65 2c 20 26 70 54 61 62 2d 3e 70 53 74 6f 72 61  e, &pTab->pStora
3630: 67 65 2c 20 70 7a 45 72 72 0a 20 20 20 20 29 3b  ge, pzErr.    );
3640: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20  .  }..  /* Call 
3650: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
3660: 76 74 61 62 28 29 20 2a 2f 0a 20 20 69 66 28 20  vtab() */.  if( 
3670: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3680: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
3690: 33 46 74 73 35 43 6f 6e 66 69 67 44 65 63 6c 61  3Fts5ConfigDecla
36a0: 72 65 56 74 61 62 28 70 43 6f 6e 66 69 67 29 3b  reVtab(pConfig);
36b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  .  }..  /* Load 
36c0: 74 68 65 20 69 6e 69 74 69 61 6c 20 63 6f 6e 66  the initial conf
36d0: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  iguration */.  i
36e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3700: 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73  pConfig->pzErrms
3710: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43 6f 6e  g==0 );.    pCon
3720: 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20 3d 20  fig->pzErrmsg = 
3730: 70 7a 45 72 72 3b 0a 20 20 20 20 72 63 20 3d 20  pzErr;.    rc = 
3740: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
3750: 4c 6f 61 64 43 6f 6e 66 69 67 28 70 54 61 62 2d  LoadConfig(pTab-
3760: 3e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71  >pIndex);.    sq
3770: 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f  lite3Fts5IndexRo
3780: 6c 6c 62 61 63 6b 28 70 54 61 62 2d 3e 70 49 6e  llback(pTab->pIn
3790: 64 65 78 29 3b 0a 20 20 20 20 70 43 6f 6e 66 69  dex);.    pConfi
37a0: 67 2d 3e 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b  g->pzErrmsg = 0;
37b0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
37c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37d0: 20 66 74 73 35 46 72 65 65 56 74 61 62 28 70 54   fts5FreeVtab(pT
37e0: 61 62 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  ab);.    pTab = 
37f0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  0;.  }else if( b
3800: 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 66 74  Create ){.    ft
3810: 73 35 43 68 65 63 6b 54 72 61 6e 73 61 63 74 69  s5CheckTransacti
3820: 6f 6e 53 74 61 74 65 28 70 54 61 62 2c 20 46 54  onState(pTab, FT
3830: 53 35 5f 42 45 47 49 4e 2c 20 30 29 3b 0a 20 20  S5_BEGIN, 0);.  
3840: 7d 0a 20 20 2a 70 70 56 54 61 62 20 3d 20 28 73  }.  *ppVTab = (s
3850: 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 54 61  qlite3_vtab*)pTa
3860: 62 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  b;.  return rc;.
3870: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 43 6f  }../*.** The xCo
3880: 6e 6e 65 63 74 28 29 20 61 6e 64 20 78 43 72 65  nnect() and xCre
3890: 61 74 65 28 29 20 6d 65 74 68 6f 64 73 20 66 6f  ate() methods fo
38a0: 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  r the virtual ta
38b0: 62 6c 65 2e 20 41 6c 6c 20 74 68 65 0a 2a 2a 20  ble. All the.** 
38c0: 77 6f 72 6b 20 69 73 20 64 6f 6e 65 20 69 6e 20  work is done in 
38d0: 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 49 6e 69  function fts5Ini
38e0: 74 56 74 61 62 28 29 2e 0a 2a 2f 0a 73 74 61 74  tVtab()..*/.stat
38f0: 69 63 20 69 6e 74 20 66 74 73 35 43 6f 6e 6e 65  ic int fts5Conne
3900: 63 74 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69  ctMethod(.  sqli
3910: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
3920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3930: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3940: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
3950: 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ux,             
3960: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
3970: 65 72 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 72 20  er to tokenizer 
3980: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
3990: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
39c0: 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72  ments in argv ar
39d0: 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ray */.  const c
39e0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67  har * const *arg
39f0: 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65  v,       /* xCre
3a00: 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67  ate/xConnect arg
3a10: 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
3a20: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
3a30: 70 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20  ppVtab,         
3a40: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c   /* OUT: New sql
3a50: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
3a60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
3a70: 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
3a80: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71        /* OUT: sq
3a90: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65  lite3_malloc'd e
3aa0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
3ab0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ){.  return fts5
3ac0: 49 6e 69 74 56 74 61 62 28 30 2c 20 64 62 2c 20  InitVtab(0, db, 
3ad0: 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76  pAux, argc, argv
3ae0: 2c 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72 29  , ppVtab, pzErr)
3af0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
3b00: 74 73 35 43 72 65 61 74 65 4d 65 74 68 6f 64 28  ts5CreateMethod(
3b10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
3b40: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76  onnection */.  v
3b50: 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20  oid *pAux,      
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 6f 6b  * Pointer to tok
3b80: 65 6e 69 7a 65 72 20 68 61 73 68 20 74 61 62 6c  enizer hash tabl
3b90: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  e */.  int argc,
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3bc0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
3bd0: 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a 20 20  argv array */.  
3be0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
3bf0: 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20 20 20  st *argv,       
3c00: 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e  /* xCreate/xConn
3c10: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61 72 72  ect argument arr
3c20: 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ay */.  sqlite3_
3c30: 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 20 20  vtab **ppVtab,  
3c40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3c50: 4e 65 77 20 73 71 6c 69 74 65 33 5f 76 74 61 62  New sqlite3_vtab
3c60: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
3c70: 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20  r **pzErr       
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c90: 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  OUT: sqlite3_mal
3ca0: 6c 6f 63 27 64 20 65 72 72 6f 72 20 6d 65 73 73  loc'd error mess
3cb0: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  age */.){.  retu
3cc0: 72 6e 20 66 74 73 35 49 6e 69 74 56 74 61 62 28  rn fts5InitVtab(
3cd0: 31 2c 20 64 62 2c 20 70 41 75 78 2c 20 61 72 67  1, db, pAux, arg
3ce0: 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c  c, argv, ppVtab,
3cf0: 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzErr);.}../*.*
3d00: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 74 20  * The different 
3d10: 71 75 65 72 79 20 70 6c 61 6e 73 2e 0a 2a 2f 0a  query plans..*/.
3d20: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4c 41  #define FTS5_PLA
3d30: 4e 5f 4d 41 54 43 48 20 20 20 20 20 20 20 20 20  N_MATCH         
3d40: 20 31 20 20 20 20 20 20 20 2f 2a 20 28 3c 74 62   1       /* (<tb
3d50: 6c 3e 20 4d 41 54 43 48 20 3f 29 20 2a 2f 0a 23  l> MATCH ?) */.#
3d60: 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4c 41 4e  define FTS5_PLAN
3d70: 5f 53 4f 55 52 43 45 20 20 20 20 20 20 20 20 20  _SOURCE         
3d80: 32 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 75  2       /* A sou
3d90: 72 63 65 20 63 75 72 73 6f 72 20 66 6f 72 20 53  rce cursor for S
3da0: 4f 52 54 45 44 5f 4d 41 54 43 48 20 2a 2f 0a 23  ORTED_MATCH */.#
3db0: 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4c 41 4e  define FTS5_PLAN
3dc0: 5f 53 50 45 43 49 41 4c 20 20 20 20 20 20 20 20  _SPECIAL        
3dd0: 33 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e  3       /* An in
3de0: 74 65 72 6e 61 6c 20 71 75 65 72 79 20 2a 2f 0a  ternal query */.
3df0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4c 41  #define FTS5_PLA
3e00: 4e 5f 53 4f 52 54 45 44 5f 4d 41 54 43 48 20 20  N_SORTED_MATCH  
3e10: 20 34 20 20 20 20 20 20 20 2f 2a 20 28 3c 74 62   4       /* (<tb
3e20: 6c 3e 20 4d 41 54 43 48 20 3f 20 4f 52 44 45 52  l> MATCH ? ORDER
3e30: 20 42 59 20 72 61 6e 6b 29 20 2a 2f 0a 23 64 65   BY rank) */.#de
3e40: 66 69 6e 65 20 46 54 53 35 5f 50 4c 41 4e 5f 53  fine FTS5_PLAN_S
3e50: 43 41 4e 20 20 20 20 20 20 20 20 20 20 20 35 20  CAN           5 
3e60: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 75 73 61 62        /* No usab
3e70: 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  le constraint */
3e80: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4c  .#define FTS5_PL
3e90: 41 4e 5f 52 4f 57 49 44 20 20 20 20 20 20 20 20  AN_ROWID        
3ea0: 20 20 36 20 20 20 20 20 20 20 2f 2a 20 28 72 6f    6       /* (ro
3eb0: 77 69 64 20 3d 20 3f 29 20 2a 2f 0a 0a 2f 2a 0a  wid = ?) */../*.
3ec0: 2a 2a 20 53 65 74 20 74 68 65 20 53 51 4c 49 54  ** Set the SQLIT
3ed0: 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
3ee0: 51 55 45 20 66 6c 61 67 20 69 6e 20 70 49 64 78  QUE flag in pIdx
3ef0: 49 6e 66 6f 2d 3e 66 6c 61 67 73 2e 20 55 6e 6c  Info->flags. Unl
3f00: 65 73 73 20 74 68 69 73 0a 2a 2a 20 65 78 74 65  ess this.** exte
3f10: 6e 73 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  nsion is current
3f20: 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
3f30: 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51   a version of SQ
3f40: 4c 69 74 65 20 74 6f 6f 20 6f 6c 64 20 74 6f 0a  Lite too old to.
3f50: 2a 2a 20 73 75 70 70 6f 72 74 20 69 6e 64 65 78  ** support index
3f60: 2d 69 6e 66 6f 20 66 6c 61 67 73 2e 20 49 6e 20  -info flags. In 
3f70: 74 68 61 74 20 63 61 73 65 20 74 68 69 73 20 66  that case this f
3f80: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
3f90: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
3fa0: 69 64 20 66 74 73 35 53 65 74 55 6e 69 71 75 65  id fts5SetUnique
3fb0: 46 6c 61 67 28 73 71 6c 69 74 65 33 5f 69 6e 64  Flag(sqlite3_ind
3fc0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
3fd0: 6f 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 56  o){.#if SQLITE_V
3fe0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3e 3d 33  ERSION_NUMBER>=3
3ff0: 30 30 38 30 31 32 0a 23 69 66 6e 64 65 66 20 53  008012.#ifndef S
4000: 51 4c 49 54 45 5f 43 4f 52 45 0a 20 20 69 66 28  QLITE_CORE.  if(
4010: 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
4020: 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 3e 3d 33 30  ion_number()>=30
4030: 30 38 30 31 32 20 29 0a 23 65 6e 64 69 66 0a 20  08012 ).#endif. 
4040: 20 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d   {.    pIdxInfo-
4050: 3e 69 64 78 46 6c 61 67 73 20 7c 3d 20 53 51 4c  >idxFlags |= SQL
4060: 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
4070: 4e 49 51 55 45 3b 0a 20 20 7d 0a 23 65 6e 64 69  NIQUE;.  }.#endi
4080: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  f.}../*.** Imple
4090: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
40a0: 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
40b0: 6f 64 20 66 6f 72 20 46 54 53 35 20 74 61 62 6c  od for FTS5 tabl
40c0: 65 73 2e 20 57 69 74 68 69 6e 20 74 68 65 20 0a  es. Within the .
40d0: 2a 2a 20 57 48 45 52 45 20 63 6f 6e 73 74 72 61  ** WHERE constra
40e0: 69 6e 74 2c 20 69 74 20 73 65 61 72 63 68 65 73  int, it searches
40f0: 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69   for the followi
4100: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 41  ng:.**.**   1. A
4110: 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e   MATCH constrain
4120: 74 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 70  t against the sp
4130: 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  ecial column..**
4140: 20 20 20 32 2e 20 41 20 4d 41 54 43 48 20 63 6f     2. A MATCH co
4150: 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e 73 74  nstraint against
4160: 20 74 68 65 20 22 72 61 6e 6b 22 20 63 6f 6c 75   the "rank" colu
4170: 6d 6e 2e 0a 2a 2a 20 20 20 33 2e 20 41 6e 20 3d  mn..**   3. An =
4180: 3d 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 67 61  = constraint aga
4190: 69 6e 73 74 20 74 68 65 20 72 6f 77 69 64 20 63  inst the rowid c
41a0: 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 34 2e 20 41  olumn..**   4. A
41b0: 20 3c 20 6f 72 20 3c 3d 20 63 6f 6e 73 74 72 61   < or <= constra
41c0: 69 6e 74 20 61 67 61 69 6e 73 74 20 74 68 65 20  int against the 
41d0: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  rowid column..**
41e0: 20 20 20 35 2e 20 41 20 3e 20 6f 72 20 3e 3d 20     5. A > or >= 
41f0: 63 6f 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e  constraint again
4200: 73 74 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c  st the rowid col
4210: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  umn..**.** Withi
4220: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2c 20  n the ORDER BY, 
4230: 65 69 74 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  either:.**.**   
4240: 35 2e 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b  5. ORDER BY rank
4250: 20 5b 41 53 43 7c 44 45 53 43 5d 0a 2a 2a 20 20   [ASC|DESC].**  
4260: 20 36 2e 20 4f 52 44 45 52 20 42 59 20 72 6f 77   6. ORDER BY row
4270: 69 64 20 5b 41 53 43 7c 44 45 53 43 5d 0a 2a 2a  id [ASC|DESC].**
4280: 0a 2a 2a 20 43 6f 73 74 73 20 61 72 65 20 61 73  .** Costs are as
4290: 73 69 67 6e 65 64 20 61 73 20 66 6f 6c 6c 6f 77  signed as follow
42a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 61 29 20 49 66 20  s:.**.**  a) If 
42b0: 61 6e 20 75 6e 75 73 61 62 6c 65 20 4d 41 54 43  an unusable MATC
42c0: 48 20 6f 70 65 72 61 74 6f 72 20 69 73 20 70 72  H operator is pr
42d0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 57 48 45  esent in the WHE
42e0: 52 45 20 63 6c 61 75 73 65 2c 20 74 68 65 0a 2a  RE clause, the.*
42f0: 2a 20 20 20 20 20 63 6f 73 74 20 69 73 20 75 6e  *     cost is un
4300: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 73 65  conditionally se
4310: 74 20 74 6f 20 31 65 35 30 20 28 61 20 72 65 61  t to 1e50 (a rea
4320: 6c 6c 79 20 62 69 67 20 6e 75 6d 62 65 72 29 2e  lly big number).
4330: 0a 2a 2a 0a 2a 2a 20 20 61 29 20 49 66 20 61 20  .**.**  a) If a 
4340: 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 69  MATCH operator i
4350: 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 20 63  s present, the c
4360: 6f 73 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ost depends on t
4370: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  he other.**     
4380: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6c 73 6f  constraints also
4390: 20 70 72 65 73 65 6e 74 2e 20 41 73 20 66 6f 6c   present. As fol
43a0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
43b0: 20 20 2a 20 4e 6f 20 6f 74 68 65 72 20 63 6f 6e    * No other con
43c0: 73 74 72 61 69 6e 74 73 3a 20 20 20 20 20 20 20  straints:       
43d0: 20 20 63 6f 73 74 3d 31 30 30 30 2e 30 0a 2a 2a    cost=1000.0.**
43e0: 20 20 20 20 20 20 20 2a 20 4f 6e 65 20 72 6f 77         * One row
43f0: 69 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  id range constra
4400: 69 6e 74 3a 20 20 20 63 6f 73 74 3d 37 35 30 2e  int:   cost=750.
4410: 30 0a 2a 2a 20 20 20 20 20 20 20 2a 20 42 6f 74  0.**       * Bot
4420: 68 20 72 6f 77 69 64 20 72 61 6e 67 65 20 63 6f  h rowid range co
4430: 6e 73 74 72 61 69 6e 74 73 3a 20 63 6f 73 74 3d  nstraints: cost=
4440: 35 30 30 2e 30 0a 2a 2a 20 20 20 20 20 20 20 2a  500.0.**       *
4450: 20 41 6e 20 3d 3d 20 72 6f 77 69 64 20 63 6f 6e   An == rowid con
4460: 73 74 72 61 69 6e 74 3a 20 20 20 20 20 20 20 63  straint:       c
4470: 6f 73 74 3d 31 30 30 2e 30 0a 2a 2a 0a 2a 2a 20  ost=100.0.**.** 
4480: 20 62 29 20 4f 74 68 65 72 77 69 73 65 2c 20 69   b) Otherwise, i
4490: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4d 41  f there is no MA
44a0: 54 43 48 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  TCH:.**.**      
44b0: 20 2a 20 4e 6f 20 6f 74 68 65 72 20 63 6f 6e 73   * No other cons
44c0: 74 72 61 69 6e 74 73 3a 20 20 20 20 20 20 20 20  traints:        
44d0: 20 63 6f 73 74 3d 31 30 30 30 30 30 30 2e 30 0a   cost=1000000.0.
44e0: 2a 2a 20 20 20 20 20 20 20 2a 20 4f 6e 65 20 72  **       * One r
44f0: 6f 77 69 64 20 72 61 6e 67 65 20 63 6f 6e 73 74  owid range const
4500: 72 61 69 6e 74 3a 20 20 20 63 6f 73 74 3d 37 35  raint:   cost=75
4510: 30 30 30 30 2e 30 0a 2a 2a 20 20 20 20 20 20 20  0000.0.**       
4520: 2a 20 42 6f 74 68 20 72 6f 77 69 64 20 72 61 6e  * Both rowid ran
4530: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20  ge constraints: 
4540: 63 6f 73 74 3d 32 35 30 30 30 30 2e 30 0a 2a 2a  cost=250000.0.**
4550: 20 20 20 20 20 20 20 2a 20 41 6e 20 3d 3d 20 72         * An == r
4560: 6f 77 69 64 20 63 6f 6e 73 74 72 61 69 6e 74 3a  owid constraint:
4570: 20 20 20 20 20 20 20 63 6f 73 74 3d 31 30 2e 30         cost=10.0
4580: 0a 2a 2a 0a 2a 2a 20 43 6f 73 74 73 20 61 72 65  .**.** Costs are
4590: 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20 62 79   not modified by
45a0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
45b0: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
45c0: 69 6e 74 20 66 74 73 35 42 65 73 74 49 6e 64 65  int fts5BestInde
45d0: 78 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  xMethod(sqlite3_
45e0: 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c  vtab *pVTab, sql
45f0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
4600: 2a 70 49 6e 66 6f 29 7b 0a 20 20 46 74 73 35 54  *pInfo){.  Fts5T
4610: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74  able *pTab = (Ft
4620: 73 35 54 61 62 6c 65 2a 29 70 56 54 61 62 3b 0a  s5Table*)pVTab;.
4630: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
4640: 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d 3e 70 43  onfig = pTab->pC
4650: 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 64 78  onfig;.  int idx
4660: 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
4670: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 61           /* Para
4680: 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 68 72  meter passed thr
4690: 6f 75 67 68 20 74 6f 20 78 46 69 6c 74 65 72 28  ough to xFilter(
46a0: 29 20 2a 2f 0a 20 20 69 6e 74 20 62 48 61 73 4d  ) */.  int bHasM
46b0: 61 74 63 68 3b 0a 20 20 69 6e 74 20 69 4e 65 78  atch;.  int iNex
46c0: 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 73  t;.  int i;..  s
46d0: 74 72 75 63 74 20 43 6f 6e 73 74 72 61 69 6e 74  truct Constraint
46e0: 20 7b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20   {.    int op;  
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 61 67 61       /* Mask aga
4710: 69 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  inst sqlite3_ind
4720: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2e 6f 70  ex_constraint.op
4730: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 74 73 35   */.    int fts5
4740: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
4750: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 6d 61        /* FTS5 ma
4760: 73 6b 20 66 6f 72 20 69 64 78 46 6c 61 67 73 20  sk for idxFlags 
4770: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  */.    int iCol;
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 20 20 20 2f 2a 20 30 3d 3d 72 6f 77 69 64       /* 0==rowid
47a0: 2c 20 31 3d 3d 74 62 6c 2c 20 32 3d 3d 72 61 6e  , 1==tbl, 2==ran
47b0: 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69  k */.    int omi
47c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
47d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
47e0: 6f 20 6f 6d 69 74 20 74 68 69 73 20 69 66 20 66  o omit this if f
47f0: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ound */.    int 
4800: 69 43 6f 6e 73 49 6e 64 65 78 3b 20 20 20 20 20  iConsIndex;     
4810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
4820: 65 78 20 69 6e 20 70 49 6e 66 6f 2d 3e 61 43 6f  ex in pInfo->aCo
4830: 6e 73 74 72 61 69 6e 74 5b 5d 20 2a 2f 0a 20 20  nstraint[] */.  
4840: 7d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 20  } aConstraint[] 
4850: 3d 20 7b 0a 20 20 20 20 7b 53 51 4c 49 54 45 5f  = {.    {SQLITE_
4860: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
4870: 5f 4d 41 54 43 48 7c 53 51 4c 49 54 45 5f 49 4e  _MATCH|SQLITE_IN
4880: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
4890: 51 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Q, .            
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48b0: 20 20 20 20 20 20 20 20 46 54 53 35 5f 42 49 5f          FTS5_BI_
48c0: 4d 41 54 43 48 2c 20 20 20 20 31 2c 20 31 2c 20  MATCH,    1, 1, 
48d0: 2d 31 7d 2c 0a 20 20 20 20 7b 53 51 4c 49 54 45  -1},.    {SQLITE
48e0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
48f0: 54 5f 4d 41 54 43 48 7c 53 51 4c 49 54 45 5f 49  T_MATCH|SQLITE_I
4900: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
4910: 45 51 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  EQ, .           
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4930: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 42 49           FTS5_BI
4940: 5f 52 41 4e 4b 2c 20 20 20 20 20 32 2c 20 31 2c  _RANK,     2, 1,
4950: 20 2d 31 7d 2c 0a 20 20 20 20 7b 53 51 4c 49 54   -1},.    {SQLIT
4960: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
4970: 4e 54 5f 45 51 2c 20 20 20 20 46 54 53 35 5f 42  NT_EQ,    FTS5_B
4980: 49 5f 52 4f 57 49 44 5f 45 51 2c 20 30 2c 20 30  I_ROWID_EQ, 0, 0
4990: 2c 20 2d 31 7d 2c 0a 20 20 20 20 7b 53 51 4c 49  , -1},.    {SQLI
49a0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
49b0: 49 4e 54 5f 4c 54 7c 53 51 4c 49 54 45 5f 49 4e  INT_LT|SQLITE_IN
49c0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
49d0: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49f0: 20 20 20 20 20 20 20 20 46 54 53 35 5f 42 49 5f          FTS5_BI_
4a00: 52 4f 57 49 44 5f 4c 45 2c 20 30 2c 20 30 2c 20  ROWID_LE, 0, 0, 
4a10: 2d 31 7d 2c 0a 20 20 20 20 7b 53 51 4c 49 54 45  -1},.    {SQLITE
4a20: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
4a30: 54 5f 47 54 7c 53 51 4c 49 54 45 5f 49 4e 44 45  T_GT|SQLITE_INDE
4a40: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 2c  X_CONSTRAINT_GE,
4a50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 20 46 54 53 35 5f 42 49 5f 52 4f        FTS5_BI_RO
4a80: 57 49 44 5f 47 45 2c 20 30 2c 20 30 2c 20 2d 31  WID_GE, 0, 0, -1
4a90: 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 61  },.  };..  int a
4aa0: 43 6f 6c 4d 61 70 5b 33 5d 3b 0a 20 20 61 43 6f  ColMap[3];.  aCo
4ab0: 6c 4d 61 70 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  lMap[0] = -1;.  
4ac0: 61 43 6f 6c 4d 61 70 5b 31 5d 20 3d 20 70 43 6f  aColMap[1] = pCo
4ad0: 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 61 43  nfig->nCol;.  aC
4ae0: 6f 6c 4d 61 70 5b 32 5d 20 3d 20 70 43 6f 6e 66  olMap[2] = pConf
4af0: 69 67 2d 3e 6e 43 6f 6c 2b 31 3b 0a 0a 20 20 2f  ig->nCol+1;..  /
4b00: 2a 20 53 65 74 20 69 64 78 46 6c 61 67 73 20 66  * Set idxFlags f
4b10: 6c 61 67 73 20 66 6f 72 20 61 6c 6c 20 57 48 45  lags for all WHE
4b20: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
4b30: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
4b40: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  d. */.  for(i=0;
4b50: 20 69 3c 70 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74   i<pInfo->nConst
4b60: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
4b70: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
4b80: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
4b90: 20 2a 70 20 3d 20 26 70 49 6e 66 6f 2d 3e 61 43   *p = &pInfo->aC
4ba0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 3b 0a 20 20  onstraint[i];.  
4bb0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72    int j;.    for
4bc0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 61  (j=0; j<sizeof(a
4bd0: 43 6f 6e 73 74 72 61 69 6e 74 29 2f 73 69 7a 65  Constraint)/size
4be0: 6f 66 28 61 43 6f 6e 73 74 72 61 69 6e 74 5b 30  of(aConstraint[0
4bf0: 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); j++){.      
4c00: 73 74 72 75 63 74 20 43 6f 6e 73 74 72 61 69 6e  struct Constrain
4c10: 74 20 2a 70 43 20 3d 20 26 61 43 6f 6e 73 74 72  t *pC = &aConstr
4c20: 61 69 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  aint[j];.      i
4c30: 66 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 61  f( p->iColumn==a
4c40: 43 6f 6c 4d 61 70 5b 70 43 2d 3e 69 43 6f 6c 5d  ColMap[pC->iCol]
4c50: 20 26 26 20 70 2d 3e 6f 70 20 26 20 70 43 2d 3e   && p->op & pC->
4c60: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  op ){.        if
4c70: 28 20 70 2d 3e 75 73 61 62 6c 65 20 29 7b 0a 20  ( p->usable ){. 
4c80: 20 20 20 20 20 20 20 20 20 70 43 2d 3e 69 43 6f           pC->iCo
4c90: 6e 73 49 6e 64 65 78 20 3d 20 69 3b 0a 20 20 20  nsIndex = i;.   
4ca0: 20 20 20 20 20 20 20 69 64 78 46 6c 61 67 73 20         idxFlags 
4cb0: 7c 3d 20 70 43 2d 3e 66 74 73 35 6f 70 3b 0a 20  |= pC->fts5op;. 
4cc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
4cd0: 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j==0 ){.       
4ce0: 20 20 20 2f 2a 20 41 73 20 74 68 65 72 65 20 65     /* As there e
4cf0: 78 69 73 74 73 20 61 6e 20 75 6e 75 73 61 62 6c  xists an unusabl
4d00: 65 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69  e MATCH constrai
4d10: 6e 74 20 74 68 69 73 20 69 73 20 61 6e 20 0a 20  nt this is an . 
4d20: 20 20 20 20 20 20 20 20 20 2a 2a 20 75 6e 75 73           ** unus
4d30: 61 62 6c 65 20 70 6c 61 6e 2e 20 53 65 74 20 61  able plan. Set a
4d40: 20 70 72 6f 68 69 62 69 74 69 76 65 6c 79 20 68   prohibitively h
4d50: 69 67 68 20 63 6f 73 74 2e 20 2a 2f 0a 20 20 20  igh cost. */.   
4d60: 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73         pInfo->es
4d70: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 65  timatedCost = 1e
4d80: 35 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  50;.          re
4d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4da0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4db0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
4dc0: 2a 20 53 65 74 20 69 64 78 46 6c 61 67 73 20 66  * Set idxFlags f
4dd0: 6c 61 67 73 20 66 6f 72 20 74 68 65 20 4f 52 44  lags for the ORD
4de0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4df0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4f 72    if( pInfo->nOr
4e00: 64 65 72 42 79 3d 3d 31 20 29 7b 0a 20 20 20 20  derBy==1 ){.    
4e10: 69 6e 74 20 69 53 6f 72 74 20 3d 20 70 49 6e 66  int iSort = pInf
4e20: 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e 69  o->aOrderBy[0].i
4e30: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20  Column;.    if( 
4e40: 69 53 6f 72 74 3d 3d 28 70 43 6f 6e 66 69 67 2d  iSort==(pConfig-
4e50: 3e 6e 43 6f 6c 2b 31 29 20 26 26 20 42 69 74 46  >nCol+1) && BitF
4e60: 6c 61 67 54 65 73 74 28 69 64 78 46 6c 61 67 73  lagTest(idxFlags
4e70: 2c 20 46 54 53 35 5f 42 49 5f 4d 41 54 43 48 29  , FTS5_BI_MATCH)
4e80: 20 29 7b 0a 20 20 20 20 20 20 69 64 78 46 6c 61   ){.      idxFla
4e90: 67 73 20 7c 3d 20 46 54 53 35 5f 42 49 5f 4f 52  gs |= FTS5_BI_OR
4ea0: 44 45 52 5f 52 41 4e 4b 3b 0a 20 20 20 20 7d 65  DER_RANK;.    }e
4eb0: 6c 73 65 20 69 66 28 20 69 53 6f 72 74 3d 3d 2d  lse if( iSort==-
4ec0: 31 20 29 7b 0a 20 20 20 20 20 20 69 64 78 46 6c  1 ){.      idxFl
4ed0: 61 67 73 20 7c 3d 20 46 54 53 35 5f 42 49 5f 4f  ags |= FTS5_BI_O
4ee0: 52 44 45 52 5f 52 4f 57 49 44 3b 0a 20 20 20 20  RDER_ROWID;.    
4ef0: 7d 0a 20 20 20 20 69 66 28 20 42 69 74 46 6c 61  }.    if( BitFla
4f00: 67 54 65 73 74 28 69 64 78 46 6c 61 67 73 2c 20  gTest(idxFlags, 
4f10: 46 54 53 35 5f 42 49 5f 4f 52 44 45 52 5f 52 41  FTS5_BI_ORDER_RA
4f20: 4e 4b 7c 46 54 53 35 5f 42 49 5f 4f 52 44 45 52  NK|FTS5_BI_ORDER
4f30: 5f 52 4f 57 49 44 29 20 29 7b 0a 20 20 20 20 20  _ROWID) ){.     
4f40: 20 70 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43   pInfo->orderByC
4f50: 6f 6e 73 75 6d 65 64 20 3d 20 31 3b 0a 20 20 20  onsumed = 1;.   
4f60: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 61 4f     if( pInfo->aO
4f70: 72 64 65 72 42 79 5b 30 5d 2e 64 65 73 63 20 29  rderBy[0].desc )
4f80: 7b 0a 20 20 20 20 20 20 20 20 69 64 78 46 6c 61  {.        idxFla
4f90: 67 73 20 7c 3d 20 46 54 53 35 5f 42 49 5f 4f 52  gs |= FTS5_BI_OR
4fa0: 44 45 52 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  DER_DESC;.      
4fb0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
4fc0: 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20  * Calculate the 
4fd0: 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 62  estimated cost b
4fe0: 61 73 65 64 20 6f 6e 20 74 68 65 20 66 6c 61 67  ased on the flag
4ff0: 73 20 73 65 74 20 69 6e 20 69 64 78 46 6c 61 67  s set in idxFlag
5000: 73 2e 20 2a 2f 0a 20 20 62 48 61 73 4d 61 74 63  s. */.  bHasMatc
5010: 68 20 3d 20 42 69 74 46 6c 61 67 54 65 73 74 28  h = BitFlagTest(
5020: 69 64 78 46 6c 61 67 73 2c 20 46 54 53 35 5f 42  idxFlags, FTS5_B
5030: 49 5f 4d 41 54 43 48 29 3b 0a 20 20 69 66 28 20  I_MATCH);.  if( 
5040: 42 69 74 46 6c 61 67 54 65 73 74 28 69 64 78 46  BitFlagTest(idxF
5050: 6c 61 67 73 2c 20 46 54 53 35 5f 42 49 5f 52 4f  lags, FTS5_BI_RO
5060: 57 49 44 5f 45 51 29 20 29 7b 0a 20 20 20 20 70  WID_EQ) ){.    p
5070: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
5080: 6f 73 74 20 3d 20 62 48 61 73 4d 61 74 63 68 20  ost = bHasMatch 
5090: 3f 20 31 30 30 2e 30 20 3a 20 31 30 2e 30 3b 0a  ? 100.0 : 10.0;.
50a0: 20 20 20 20 69 66 28 20 62 48 61 73 4d 61 74 63      if( bHasMatc
50b0: 68 3d 3d 30 20 29 20 66 74 73 35 53 65 74 55 6e  h==0 ) fts5SetUn
50c0: 69 71 75 65 46 6c 61 67 28 70 49 6e 66 6f 29 3b  iqueFlag(pInfo);
50d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 42 69 74  .  }else if( Bit
50e0: 46 6c 61 67 41 6c 6c 54 65 73 74 28 69 64 78 46  FlagAllTest(idxF
50f0: 6c 61 67 73 2c 20 46 54 53 35 5f 42 49 5f 52 4f  lags, FTS5_BI_RO
5100: 57 49 44 5f 4c 45 7c 46 54 53 35 5f 42 49 5f 52  WID_LE|FTS5_BI_R
5110: 4f 57 49 44 5f 47 45 29 20 29 7b 0a 20 20 20 20  OWID_GE) ){.    
5120: 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  pInfo->estimated
5130: 43 6f 73 74 20 3d 20 62 48 61 73 4d 61 74 63 68  Cost = bHasMatch
5140: 20 3f 20 35 30 30 2e 30 20 3a 20 32 35 30 30 30   ? 500.0 : 25000
5150: 30 2e 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  0.0;.  }else if(
5160: 20 42 69 74 46 6c 61 67 54 65 73 74 28 69 64 78   BitFlagTest(idx
5170: 46 6c 61 67 73 2c 20 46 54 53 35 5f 42 49 5f 52  Flags, FTS5_BI_R
5180: 4f 57 49 44 5f 4c 45 7c 46 54 53 35 5f 42 49 5f  OWID_LE|FTS5_BI_
5190: 52 4f 57 49 44 5f 47 45 29 20 29 7b 0a 20 20 20  ROWID_GE) ){.   
51a0: 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65   pInfo->estimate
51b0: 64 43 6f 73 74 20 3d 20 62 48 61 73 4d 61 74 63  dCost = bHasMatc
51c0: 68 20 3f 20 37 35 30 2e 30 20 3a 20 37 35 30 30  h ? 750.0 : 7500
51d0: 30 30 2e 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  00.0;.  }else{. 
51e0: 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61     pInfo->estima
51f0: 74 65 64 43 6f 73 74 20 3d 20 62 48 61 73 4d 61  tedCost = bHasMa
5200: 74 63 68 20 3f 20 31 30 30 30 2e 30 20 3a 20 31  tch ? 1000.0 : 1
5210: 30 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 0a 20  000000.0;.  }.. 
5220: 20 2f 2a 20 41 73 73 69 67 6e 20 61 72 67 76 49   /* Assign argvI
5230: 6e 64 65 78 20 76 61 6c 75 65 73 20 74 6f 20 65  ndex values to e
5240: 61 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  ach constraint i
5250: 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 4e 65 78  n use. */.  iNex
5260: 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 1;.  for(i=0
5270: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6f 6e 73  ; i<sizeof(aCons
5280: 74 72 61 69 6e 74 29 2f 73 69 7a 65 6f 66 28 61  traint)/sizeof(a
5290: 43 6f 6e 73 74 72 61 69 6e 74 5b 30 5d 29 3b 20  Constraint[0]); 
52a0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
52b0: 20 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 20   Constraint *pC 
52c0: 3d 20 26 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  = &aConstraint[i
52d0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69  ];.    if( pC->i
52e0: 43 6f 6e 73 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  ConsIndex>=0 ){.
52f0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
5300: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 70 43  nstraintUsage[pC
5310: 2d 3e 69 43 6f 6e 73 49 6e 64 65 78 5d 2e 61 72  ->iConsIndex].ar
5320: 67 76 49 6e 64 65 78 20 3d 20 69 4e 65 78 74 2b  gvIndex = iNext+
5330: 2b 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  +;.      pInfo->
5340: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
5350: 5b 70 43 2d 3e 69 43 6f 6e 73 49 6e 64 65 78 5d  [pC->iConsIndex]
5360: 2e 6f 6d 69 74 20 3d 20 70 43 2d 3e 6f 6d 69 74  .omit = pC->omit
5370: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
5380: 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 69  Info->idxNum = i
5390: 64 78 46 6c 61 67 73 3b 0a 20 20 72 65 74 75 72  dxFlags;.  retur
53a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
53b0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
53c0: 74 69 6f 6e 20 6f 66 20 78 4f 70 65 6e 20 6d 65  tion of xOpen me
53d0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
53e0: 69 6e 74 20 66 74 73 35 4f 70 65 6e 4d 65 74 68  int fts5OpenMeth
53f0: 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  od(sqlite3_vtab 
5400: 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVTab, sqlite3_
5410: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
5420: 43 73 72 29 7b 0a 20 20 46 74 73 35 54 61 62 6c  Csr){.  Fts5Tabl
5430: 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54  e *pTab = (Fts5T
5440: 61 62 6c 65 2a 29 70 56 54 61 62 3b 0a 20 20 46  able*)pVTab;.  F
5450: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
5460: 69 67 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6e 66  ig = pTab->pConf
5470: 69 67 3b 0a 20 20 46 74 73 35 43 75 72 73 6f 72  ig;.  Fts5Cursor
5480: 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20   *pCsr;         
5490: 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 75 72        /* New cur
54a0: 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
54b0: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54d0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
54e0: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  e to allocate */
54f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5500: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
5510: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
5520: 65 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20  e */..  nByte = 
5530: 73 69 7a 65 6f 66 28 46 74 73 35 43 75 72 73 6f  sizeof(Fts5Curso
5540: 72 29 20 2b 20 70 43 6f 6e 66 69 67 2d 3e 6e 43  r) + pConfig->nC
5550: 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 69 6e 74 29  ol * sizeof(int)
5560: 3b 0a 20 20 70 43 73 72 20 3d 20 28 46 74 73 35  ;.  pCsr = (Fts5
5570: 43 75 72 73 6f 72 2a 29 73 71 6c 69 74 65 33 5f  Cursor*)sqlite3_
5580: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
5590: 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20   if( pCsr ){.   
55a0: 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c   Fts5Global *pGl
55b0: 6f 62 61 6c 20 3d 20 70 54 61 62 2d 3e 70 47 6c  obal = pTab->pGl
55c0: 6f 62 61 6c 3b 0a 20 20 20 20 6d 65 6d 73 65 74  obal;.    memset
55d0: 28 70 43 73 72 2c 20 30 2c 20 6e 42 79 74 65 29  (pCsr, 0, nByte)
55e0: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 43 6f 6c  ;.    pCsr->aCol
55f0: 75 6d 6e 53 69 7a 65 20 3d 20 28 69 6e 74 2a 29  umnSize = (int*)
5600: 26 70 43 73 72 5b 31 5d 3b 0a 20 20 20 20 70 43  &pCsr[1];.    pC
5610: 73 72 2d 3e 70 4e 65 78 74 20 3d 20 70 47 6c 6f  sr->pNext = pGlo
5620: 62 61 6c 2d 3e 70 43 73 72 3b 0a 20 20 20 20 70  bal->pCsr;.    p
5630: 47 6c 6f 62 61 6c 2d 3e 70 43 73 72 20 3d 20 70  Global->pCsr = p
5640: 43 73 72 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69  Csr;.    pCsr->i
5650: 43 73 72 49 64 20 3d 20 2b 2b 70 47 6c 6f 62 61  CsrId = ++pGloba
5660: 6c 2d 3e 69 4e 65 78 74 49 64 3b 0a 20 20 7d 65  l->iNextId;.  }e
5670: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
5680: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
5690: 20 20 2a 70 70 43 73 72 20 3d 20 28 73 71 6c 69    *ppCsr = (sqli
56a0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a  te3_vtab_cursor*
56b0: 29 70 43 73 72 3b 0a 20 20 72 65 74 75 72 6e 20  )pCsr;.  return 
56c0: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
56d0: 74 20 66 74 73 35 53 74 6d 74 54 79 70 65 28 46  t fts5StmtType(F
56e0: 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ts5Cursor *pCsr)
56f0: 7b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 50  {.  if( pCsr->eP
5700: 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 53  lan==FTS5_PLAN_S
5710: 43 41 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  CAN ){.    retur
5720: 6e 20 28 70 43 73 72 2d 3e 62 44 65 73 63 29 20  n (pCsr->bDesc) 
5730: 3f 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e  ? FTS5_STMT_SCAN
5740: 5f 44 45 53 43 20 3a 20 46 54 53 35 5f 53 54 4d  _DESC : FTS5_STM
5750: 54 5f 53 43 41 4e 5f 41 53 43 3b 0a 20 20 7d 0a  T_SCAN_ASC;.  }.
5760: 20 20 72 65 74 75 72 6e 20 46 54 53 35 5f 53 54    return FTS5_ST
5770: 4d 54 5f 4c 4f 4f 4b 55 50 3b 0a 7d 0a 0a 2f 2a  MT_LOOKUP;.}../*
5780: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5790: 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
57a0: 72 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73  r the cursor pas
57b0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
57c0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6d  argument.** is m
57d0: 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 20 61 74  oved to point at
57e0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
57f0: 2e 20 49 74 20 63 6c 65 61 72 73 20 61 6c 6c 20  . It clears all 
5800: 63 61 63 68 65 64 20 64 61 74 61 20 0a 2a 2a 20  cached data .** 
5810: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20  specific to the 
5820: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 73 74 6f  previous row sto
5830: 72 65 64 20 62 79 20 74 68 65 20 63 75 72 73 6f  red by the curso
5840: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
5850: 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 73 72  tic void fts5Csr
5860: 4e 65 77 72 6f 77 28 46 74 73 35 43 75 72 73 6f  Newrow(Fts5Curso
5870: 72 20 2a 70 43 73 72 29 7b 0a 20 20 43 73 72 46  r *pCsr){.  CsrF
5880: 6c 61 67 53 65 74 28 70 43 73 72 2c 20 0a 20 20  lagSet(pCsr, .  
5890: 20 20 20 20 46 54 53 35 43 53 52 5f 52 45 51 55      FTS5CSR_REQU
58a0: 49 52 45 5f 43 4f 4e 54 45 4e 54 20 0a 20 20 20  IRE_CONTENT .   
58b0: 20 7c 20 46 54 53 35 43 53 52 5f 52 45 51 55 49   | FTS5CSR_REQUI
58c0: 52 45 5f 44 4f 43 53 49 5a 45 20 0a 20 20 20 20  RE_DOCSIZE .    
58d0: 7c 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52  | FTS5CSR_REQUIR
58e0: 45 5f 49 4e 53 54 20 0a 20 20 29 3b 0a 7d 0a 0a  E_INST .  );.}..
58f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
5900: 46 72 65 65 43 75 72 73 6f 72 43 6f 6d 70 6f 6e  FreeCursorCompon
5910: 65 6e 74 73 28 46 74 73 35 43 75 72 73 6f 72 20  ents(Fts5Cursor 
5920: 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 35 54 61  *pCsr){.  Fts5Ta
5930: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73  ble *pTab = (Fts
5940: 35 54 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62  5Table*)(pCsr->b
5950: 61 73 65 2e 70 56 74 61 62 29 3b 0a 20 20 46 74  ase.pVtab);.  Ft
5960: 73 35 41 75 78 64 61 74 61 20 2a 70 44 61 74 61  s5Auxdata *pData
5970: 3b 0a 20 20 46 74 73 35 41 75 78 64 61 74 61 20  ;.  Fts5Auxdata 
5980: 2a 70 4e 65 78 74 3b 0a 0a 20 20 73 71 6c 69 74  *pNext;..  sqlit
5990: 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 49  e3_free(pCsr->aI
59a0: 6e 73 74 49 74 65 72 29 3b 0a 20 20 73 71 6c 69  nstIter);.  sqli
59b0: 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
59c0: 49 6e 73 74 29 3b 0a 20 20 69 66 28 20 70 43 73  Inst);.  if( pCs
59d0: 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  r->pStmt ){.    
59e0: 69 6e 74 20 65 53 74 6d 74 20 3d 20 66 74 73 35  int eStmt = fts5
59f0: 53 74 6d 74 54 79 70 65 28 70 43 73 72 29 3b 0a  StmtType(pCsr);.
5a00: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 53      sqlite3Fts5S
5a10: 74 6f 72 61 67 65 53 74 6d 74 52 65 6c 65 61 73  torageStmtReleas
5a20: 65 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65  e(pTab->pStorage
5a30: 2c 20 65 53 74 6d 74 2c 20 70 43 73 72 2d 3e 70  , eStmt, pCsr->p
5a40: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Stmt);.  }.  if(
5a50: 20 70 43 73 72 2d 3e 70 53 6f 72 74 65 72 20 29   pCsr->pSorter )
5a60: 7b 0a 20 20 20 20 46 74 73 35 53 6f 72 74 65 72  {.    Fts5Sorter
5a70: 20 2a 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72   *pSorter = pCsr
5a80: 2d 3e 70 53 6f 72 74 65 72 3b 0a 20 20 20 20 73  ->pSorter;.    s
5a90: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
5aa0: 70 53 6f 72 74 65 72 2d 3e 70 53 74 6d 74 29 3b  pSorter->pStmt);
5ab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5ac0: 65 28 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d 0a  e(pSorter);.  }.
5ad0: 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 50 6c  .  if( pCsr->ePl
5ae0: 61 6e 21 3d 46 54 53 35 5f 50 4c 41 4e 5f 53 4f  an!=FTS5_PLAN_SO
5af0: 55 52 43 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  URCE ){.    sqli
5b00: 74 65 33 46 74 73 35 45 78 70 72 46 72 65 65 28  te3Fts5ExprFree(
5b10: 70 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20  pCsr->pExpr);.  
5b20: 7d 0a 0a 20 20 66 6f 72 28 70 44 61 74 61 3d 70  }..  for(pData=p
5b30: 43 73 72 2d 3e 70 41 75 78 64 61 74 61 3b 20 70  Csr->pAuxdata; p
5b40: 44 61 74 61 3b 20 70 44 61 74 61 3d 70 4e 65 78  Data; pData=pNex
5b50: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
5b60: 70 44 61 74 61 2d 3e 70 4e 65 78 74 3b 0a 20 20  pData->pNext;.  
5b70: 20 20 69 66 28 20 70 44 61 74 61 2d 3e 78 44 65    if( pData->xDe
5b80: 6c 65 74 65 20 29 20 70 44 61 74 61 2d 3e 78 44  lete ) pData->xD
5b90: 65 6c 65 74 65 28 70 44 61 74 61 2d 3e 70 50 74  elete(pData->pPt
5ba0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
5bb0: 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 7d  free(pData);.  }
5bc0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ..  sqlite3_fina
5bd0: 6c 69 7a 65 28 70 43 73 72 2d 3e 70 52 61 6e 6b  lize(pCsr->pRank
5be0: 41 72 67 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69  ArgStmt);.  sqli
5bf0: 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61  te3_free(pCsr->a
5c00: 70 52 61 6e 6b 41 72 67 29 3b 0a 0a 20 20 69 66  pRankArg);..  if
5c10: 28 20 43 73 72 46 6c 61 67 54 65 73 74 28 70 43  ( CsrFlagTest(pC
5c20: 73 72 2c 20 46 54 53 35 43 53 52 5f 46 52 45 45  sr, FTS5CSR_FREE
5c30: 5f 5a 52 41 4e 4b 29 20 29 7b 0a 20 20 20 20 73  _ZRANK) ){.    s
5c40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72  qlite3_free(pCsr
5c50: 2d 3e 7a 52 61 6e 6b 29 3b 0a 20 20 20 20 73 71  ->zRank);.    sq
5c60: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d  lite3_free(pCsr-
5c70: 3e 7a 52 61 6e 6b 41 72 67 73 29 3b 0a 20 20 7d  >zRankArgs);.  }
5c80: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 70 43 73 72  ..  memset(&pCsr
5c90: 2d 3e 65 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65  ->ePlan, 0, size
5ca0: 6f 66 28 46 74 73 35 43 75 72 73 6f 72 29 20 2d  of(Fts5Cursor) -
5cb0: 20 28 28 75 38 2a 29 26 70 43 73 72 2d 3e 65 50   ((u8*)&pCsr->eP
5cc0: 6c 61 6e 20 2d 20 28 75 38 2a 29 70 43 73 72 29  lan - (u8*)pCsr)
5cd0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  );.}.../*.** Clo
5ce0: 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  se the cursor.  
5cf0: 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  For additional i
5d00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 65 65 20 74  nformation see t
5d10: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
5d20: 0a 2a 2a 20 6f 6e 20 74 68 65 20 78 43 6c 6f 73  .** on the xClos
5d30: 65 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  e method of the 
5d40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
5d50: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
5d60: 69 63 20 69 6e 74 20 66 74 73 35 43 6c 6f 73 65  ic int fts5Close
5d70: 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
5d80: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tab_cursor *pCur
5d90: 73 6f 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  sor){.  if( pCur
5da0: 73 6f 72 20 29 7b 0a 20 20 20 20 46 74 73 35 54  sor ){.    Fts5T
5db0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74  able *pTab = (Ft
5dc0: 73 35 54 61 62 6c 65 2a 29 28 70 43 75 72 73 6f  s5Table*)(pCurso
5dd0: 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20 20 46  r->pVtab);.    F
5de0: 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts5Cursor *pCsr 
5df0: 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70  = (Fts5Cursor*)p
5e00: 43 75 72 73 6f 72 3b 0a 20 20 20 20 46 74 73 35  Cursor;.    Fts5
5e10: 43 75 72 73 6f 72 20 2a 2a 70 70 3b 0a 0a 20 20  Cursor **pp;..  
5e20: 20 20 66 74 73 35 46 72 65 65 43 75 72 73 6f 72    fts5FreeCursor
5e30: 43 6f 6d 70 6f 6e 65 6e 74 73 28 70 43 73 72 29  Components(pCsr)
5e40: 3b 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ;.    /* Remove 
5e50: 74 68 65 20 63 75 72 73 6f 72 20 66 72 6f 6d 20  the cursor from 
5e60: 74 68 65 20 46 74 73 35 47 6c 6f 62 61 6c 2e 70  the Fts5Global.p
5e70: 43 73 72 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  Csr list */.    
5e80: 66 6f 72 28 70 70 3d 26 70 54 61 62 2d 3e 70 47  for(pp=&pTab->pG
5e90: 6c 6f 62 61 6c 2d 3e 70 43 73 72 3b 20 28 2a 70  lobal->pCsr; (*p
5ea0: 70 29 21 3d 70 43 73 72 3b 20 70 70 3d 26 28 2a  p)!=pCsr; pp=&(*
5eb0: 70 70 29 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20  pp)->pNext);.   
5ec0: 20 2a 70 70 20 3d 20 70 43 73 72 2d 3e 70 4e 65   *pp = pCsr->pNe
5ed0: 78 74 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  xt;..    sqlite3
5ee0: 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20 7d  _free(pCsr);.  }
5ef0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5f00: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
5f10: 6e 74 20 66 74 73 35 53 6f 72 74 65 72 4e 65 78  nt fts5SorterNex
5f20: 74 28 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43  t(Fts5Cursor *pC
5f30: 73 72 29 7b 0a 20 20 46 74 73 35 53 6f 72 74 65  sr){.  Fts5Sorte
5f40: 72 20 2a 70 53 6f 72 74 65 72 20 3d 20 70 43 73  r *pSorter = pCs
5f50: 72 2d 3e 70 53 6f 72 74 65 72 3b 0a 20 20 69 6e  r->pSorter;.  in
5f60: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  t rc;..  rc = sq
5f70: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 6f 72 74  lite3_step(pSort
5f80: 65 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 69 66  er->pStmt);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
5fa0: 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  E ){.    rc = SQ
5fb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 43 73 72  LITE_OK;.    Csr
5fc0: 46 6c 61 67 53 65 74 28 70 43 73 72 2c 20 46 54  FlagSet(pCsr, FT
5fd0: 53 35 43 53 52 5f 45 4f 46 29 3b 0a 20 20 7d 65  S5CSR_EOF);.  }e
5fe0: 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
5ff0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
6000: 6e 73 74 20 75 38 20 2a 61 3b 0a 20 20 20 20 63  nst u8 *a;.    c
6010: 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 0a  onst u8 *aBlob;.
6020: 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20      int nBlob;. 
6030: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
6040: 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  t iOff = 0;.    
6050: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6060: 0a 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 69 52  .    pSorter->iR
6070: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  owid = sqlite3_c
6080: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 6f 72  olumn_int64(pSor
6090: 74 65 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  ter->pStmt, 0);.
60a0: 20 20 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69      nBlob = sqli
60b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
60c0: 28 70 53 6f 72 74 65 72 2d 3e 70 53 74 6d 74 2c  (pSorter->pStmt,
60d0: 20 31 29 3b 0a 20 20 20 20 61 42 6c 6f 62 20 3d   1);.    aBlob =
60e0: 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   a = sqlite3_col
60f0: 75 6d 6e 5f 62 6c 6f 62 28 70 53 6f 72 74 65 72  umn_blob(pSorter
6100: 2d 3e 70 53 74 6d 74 2c 20 31 29 3b 0a 0a 20 20  ->pStmt, 1);..  
6110: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 70 53    for(i=0; i<(pS
6120: 6f 72 74 65 72 2d 3e 6e 49 64 78 2d 31 29 3b 20  orter->nIdx-1); 
6130: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
6140: 69 56 61 6c 3b 0a 20 20 20 20 20 20 61 20 2b 3d  iVal;.      a +=
6150: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
6160: 28 61 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20  (a, iVal);.     
6170: 20 69 4f 66 66 20 2b 3d 20 69 56 61 6c 3b 0a 20   iOff += iVal;. 
6180: 20 20 20 20 20 70 53 6f 72 74 65 72 2d 3e 61 49       pSorter->aI
6190: 64 78 5b 69 5d 20 3d 20 69 4f 66 66 3b 0a 20 20  dx[i] = iOff;.  
61a0: 20 20 7d 0a 20 20 20 20 70 53 6f 72 74 65 72 2d    }.    pSorter-
61b0: 3e 61 49 64 78 5b 69 5d 20 3d 20 26 61 42 6c 6f  >aIdx[i] = &aBlo
61c0: 62 5b 6e 42 6c 6f 62 5d 20 2d 20 61 3b 0a 0a 20  b[nBlob] - a;.. 
61d0: 20 20 20 70 53 6f 72 74 65 72 2d 3e 61 50 6f 73     pSorter->aPos
61e0: 6c 69 73 74 20 3d 20 61 3b 0a 20 20 20 20 66 74  list = a;.    ft
61f0: 73 35 43 73 72 4e 65 77 72 6f 77 28 70 43 73 72  s5CsrNewrow(pCsr
6200: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
6210: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
6220: 65 74 20 74 68 65 20 46 54 53 35 43 53 52 5f 52  et the FTS5CSR_R
6230: 45 51 55 49 52 45 5f 52 45 53 45 45 4b 20 66 6c  EQUIRE_RESEEK fl
6240: 61 67 20 6f 6e 20 61 6c 6c 20 46 54 53 35 5f 50  ag on all FTS5_P
6250: 4c 41 4e 5f 4d 41 54 43 48 20 63 75 72 73 6f 72  LAN_MATCH cursor
6260: 73 20 0a 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 61  s .** open on ta
6270: 62 6c 65 20 70 54 61 62 2e 0a 2a 2f 0a 73 74 61  ble pTab..*/.sta
6280: 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69  tic void fts5Tri
6290: 70 43 75 72 73 6f 72 73 28 46 74 73 35 54 61 62  pCursors(Fts5Tab
62a0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 46 74 73  le *pTab){.  Fts
62b0: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20  5Cursor *pCsr;. 
62c0: 20 66 6f 72 28 70 43 73 72 3d 70 54 61 62 2d 3e   for(pCsr=pTab->
62d0: 70 47 6c 6f 62 61 6c 2d 3e 70 43 73 72 3b 20 70  pGlobal->pCsr; p
62e0: 43 73 72 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e  Csr; pCsr=pCsr->
62f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6300: 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53  pCsr->ePlan==FTS
6310: 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 0a 20 20 20  5_PLAN_MATCH.   
6320: 20 20 26 26 20 70 43 73 72 2d 3e 62 61 73 65 2e    && pCsr->base.
6330: 70 56 74 61 62 3d 3d 28 73 71 6c 69 74 65 33 5f  pVtab==(sqlite3_
6340: 76 74 61 62 2a 29 70 54 61 62 20 0a 20 20 20 20  vtab*)pTab .    
6350: 29 7b 0a 20 20 20 20 20 20 43 73 72 46 6c 61 67  ){.      CsrFlag
6360: 53 65 74 28 70 43 73 72 2c 20 46 54 53 35 43 53  Set(pCsr, FTS5CS
6370: 52 5f 52 45 51 55 49 52 45 5f 52 45 53 45 45 4b  R_REQUIRE_RESEEK
6380: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
6390: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 45 51  /*.** If the REQ
63a0: 55 49 52 45 5f 52 45 53 45 45 4b 20 66 6c 61 67  UIRE_RESEEK flag
63b0: 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 63   is set on the c
63c0: 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20  ursor passed as 
63d0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
63e0: 75 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 64  ument, close and
63f0: 20 72 65 6f 70 65 6e 20 61 6c 6c 20 46 74 73 35   reopen all Fts5
6400: 49 6e 64 65 78 49 74 65 72 20 69 74 65 72 61 74  IndexIter iterat
6410: 6f 72 73 20 74 68 61 74 20 74 68 65 20 63 75 72  ors that the cur
6420: 73 6f 72 20 0a 2a 2a 20 69 73 20 75 73 69 6e 67  sor .** is using
6430: 2e 20 54 68 65 6e 20 61 74 74 65 6d 70 74 20 74  . Then attempt t
6440: 6f 20 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  o move the curso
6450: 72 20 74 6f 20 61 20 72 6f 77 69 64 20 65 71 75  r to a rowid equ
6460: 61 6c 20 74 6f 20 6f 72 20 6c 61 73 74 65 72 0a  al to or laster.
6470: 2a 2a 20 28 69 6e 20 74 68 65 20 63 75 72 73 6f  ** (in the curso
6480: 72 73 20 73 6f 72 74 20 6f 72 64 65 72 20 2d 20  rs sort order - 
6490: 41 53 43 20 6f 72 20 44 45 53 43 29 20 74 68 61  ASC or DESC) tha
64a0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
64b0: 77 69 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  wid. .**.** If t
64c0: 68 65 20 6e 65 77 20 72 6f 77 69 64 20 69 73 20  he new rowid is 
64d0: 6e 6f 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  not equal to the
64e0: 20 6f 6c 64 2c 20 73 65 74 20 6f 75 74 70 75 74   old, set output
64f0: 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62 53 6b   parameter *pbSk
6500: 69 70 0a 2a 2a 20 74 6f 20 31 20 62 65 66 6f 72  ip.** to 1 befor
6510: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68  e returning. Oth
6520: 65 72 77 69 73 65 2c 20 6c 65 61 76 65 20 69 74  erwise, leave it
6530: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
6540: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
6550: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
6560: 20 6f 72 20 69 66 20 6e 6f 20 72 65 73 65 65 6b   or if no reseek
6570: 20 77 61 73 20 72 65 71 75 69 72 65 64 2c 20 6f   was required, o
6580: 72 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 63  r an .** error c
6590: 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ode if an error 
65a0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2f 0a 73 74 61  occurred..*/.sta
65b0: 74 69 63 20 69 6e 74 20 66 74 73 35 43 75 72 73  tic int fts5Curs
65c0: 6f 72 52 65 73 65 65 6b 28 46 74 73 35 43 75 72  orReseek(Fts5Cur
65d0: 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a  sor *pCsr, int *
65e0: 70 62 53 6b 69 70 29 7b 0a 20 20 69 6e 74 20 72  pbSkip){.  int r
65f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6600: 20 61 73 73 65 72 74 28 20 2a 70 62 53 6b 69 70   assert( *pbSkip
6610: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 73 72  ==0 );.  if( Csr
6620: 46 6c 61 67 54 65 73 74 28 70 43 73 72 2c 20 46  FlagTest(pCsr, F
6630: 54 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f 52  TS5CSR_REQUIRE_R
6640: 45 53 45 45 4b 29 20 29 7b 0a 20 20 20 20 46 74  ESEEK) ){.    Ft
6650: 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  s5Table *pTab = 
6660: 28 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73  (Fts5Table*)(pCs
6670: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a  r->base.pVtab);.
6680: 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20      int bDesc = 
6690: 70 43 73 72 2d 3e 62 44 65 73 63 3b 0a 20 20 20  pCsr->bDesc;.   
66a0: 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71   i64 iRowid = sq
66b0: 6c 69 74 65 33 46 74 73 35 45 78 70 72 52 6f 77  lite3Fts5ExprRow
66c0: 69 64 28 70 43 73 72 2d 3e 70 45 78 70 72 29 3b  id(pCsr->pExpr);
66d0: 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
66e0: 65 33 46 74 73 35 45 78 70 72 46 69 72 73 74 28  e3Fts5ExprFirst(
66f0: 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 70 54 61  pCsr->pExpr, pTa
6700: 62 2d 3e 70 49 6e 64 65 78 2c 20 69 52 6f 77 69  b->pIndex, iRowi
6710: 64 2c 20 62 44 65 73 63 29 3b 0a 20 20 20 20 69  d, bDesc);.    i
6720: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6730: 20 26 26 20 69 52 6f 77 69 64 21 3d 73 71 6c 69   && iRowid!=sqli
6740: 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69 64  te3Fts5ExprRowid
6750: 28 70 43 73 72 2d 3e 70 45 78 70 72 29 20 29 7b  (pCsr->pExpr) ){
6760: 0a 20 20 20 20 20 20 2a 70 62 53 6b 69 70 20 3d  .      *pbSkip =
6770: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 43   1;.    }..    C
6780: 73 72 46 6c 61 67 43 6c 65 61 72 28 70 43 73 72  srFlagClear(pCsr
6790: 2c 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52  , FTS5CSR_REQUIR
67a0: 45 5f 52 45 53 45 45 4b 29 3b 0a 20 20 20 20 66  E_RESEEK);.    f
67b0: 74 73 35 43 73 72 4e 65 77 72 6f 77 28 70 43 73  ts5CsrNewrow(pCs
67c0: 72 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  r);.    if( sqli
67d0: 74 65 33 46 74 73 35 45 78 70 72 45 6f 66 28 70  te3Fts5ExprEof(p
67e0: 43 73 72 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20  Csr->pExpr) ){. 
67f0: 20 20 20 20 20 43 73 72 46 6c 61 67 53 65 74 28       CsrFlagSet(
6800: 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 45 4f  pCsr, FTS5CSR_EO
6810: 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  F);.    }.  }.  
6820: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
6830: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
6840: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
6850: 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 74  ext row in the t
6860: 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 65  able that matche
6870: 73 20 74 68 65 20 0a 2a 2a 20 73 65 61 72 63 68  s the .** search
6880: 20 63 72 69 74 65 72 69 61 2e 0a 2a 2a 0a 2a 2a   criteria..**.**
6890: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
68a0: 4b 20 69 66 20 6e 6f 74 68 69 6e 67 20 67 6f 65  K if nothing goe
68b0: 73 20 77 72 6f 6e 67 2e 20 20 53 51 4c 49 54 45  s wrong.  SQLITE
68c0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
68d0: 2a 2a 20 65 76 65 6e 20 69 66 20 77 65 20 72 65  ** even if we re
68e0: 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e  ach end-of-file.
68f0: 20 20 54 68 65 20 66 74 73 35 45 6f 66 4d 65 74    The fts5EofMet
6900: 68 6f 64 28 29 20 77 69 6c 6c 20 62 65 20 63 61  hod() will be ca
6910: 6c 6c 65 64 0a 2a 2a 20 73 75 62 73 65 71 75 65  lled.** subseque
6920: 6e 74 6c 79 20 74 6f 20 64 65 74 65 72 6d 69 6e  ntly to determin
6930: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
6940: 20 61 6e 20 45 4f 46 20 77 61 73 20 68 69 74 2e   an EOF was hit.
6950: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
6960: 74 73 35 4e 65 78 74 4d 65 74 68 6f 64 28 73 71  ts5NextMethod(sq
6970: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
6980: 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 46  r *pCursor){.  F
6990: 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts5Cursor *pCsr 
69a0: 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70  = (Fts5Cursor*)p
69b0: 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63  Cursor;.  int rc
69c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
69d0: 20 61 73 73 65 72 74 28 20 28 70 43 73 72 2d 3e   assert( (pCsr->
69e0: 65 50 6c 61 6e 3c 33 29 3d 3d 0a 20 20 20 20 20  ePlan<3)==.     
69f0: 20 20 20 20 20 28 70 43 73 72 2d 3e 65 50 6c 61       (pCsr->ePla
6a00: 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 4d 41 54  n==FTS5_PLAN_MAT
6a10: 43 48 20 7c 7c 20 70 43 73 72 2d 3e 65 50 6c 61  CH || pCsr->ePla
6a20: 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 55  n==FTS5_PLAN_SOU
6a30: 52 43 45 29 20 0a 20 20 29 3b 0a 0a 20 20 69 66  RCE) .  );..  if
6a40: 28 20 70 43 73 72 2d 3e 65 50 6c 61 6e 3c 33 20  ( pCsr->ePlan<3 
6a50: 29 7b 0a 20 20 20 20 69 6e 74 20 62 53 6b 69 70  ){.    int bSkip
6a60: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 72   = 0;.    if( (r
6a70: 63 20 3d 20 66 74 73 35 43 75 72 73 6f 72 52 65  c = fts5CursorRe
6a80: 73 65 65 6b 28 70 43 73 72 2c 20 26 62 53 6b 69  seek(pCsr, &bSki
6a90: 70 29 29 20 7c 7c 20 62 53 6b 69 70 20 29 20 72  p)) || bSkip ) r
6aa0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
6ab0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78   = sqlite3Fts5Ex
6ac0: 70 72 4e 65 78 74 28 70 43 73 72 2d 3e 70 45 78  prNext(pCsr->pEx
6ad0: 70 72 2c 20 70 43 73 72 2d 3e 69 4c 61 73 74 52  pr, pCsr->iLastR
6ae0: 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 73  owid);.    if( s
6af0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 45 6f  qlite3Fts5ExprEo
6b00: 66 28 70 43 73 72 2d 3e 70 45 78 70 72 29 20 29  f(pCsr->pExpr) )
6b10: 7b 0a 20 20 20 20 20 20 43 73 72 46 6c 61 67 53  {.      CsrFlagS
6b20: 65 74 28 70 43 73 72 2c 20 46 54 53 35 43 53 52  et(pCsr, FTS5CSR
6b30: 5f 45 4f 46 29 3b 0a 20 20 20 20 7d 0a 20 20 20  _EOF);.    }.   
6b40: 20 66 74 73 35 43 73 72 4e 65 77 72 6f 77 28 70   fts5CsrNewrow(p
6b50: 43 73 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Csr);.  }else{. 
6b60: 20 20 20 73 77 69 74 63 68 28 20 70 43 73 72 2d     switch( pCsr-
6b70: 3e 65 50 6c 61 6e 20 29 7b 0a 20 20 20 20 20 20  >ePlan ){.      
6b80: 63 61 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f 53  case FTS5_PLAN_S
6b90: 50 45 43 49 41 4c 3a 20 7b 0a 20 20 20 20 20 20  PECIAL: {.      
6ba0: 20 20 43 73 72 46 6c 61 67 53 65 74 28 70 43 73    CsrFlagSet(pCs
6bb0: 72 2c 20 46 54 53 35 43 53 52 5f 45 4f 46 29 3b  r, FTS5CSR_EOF);
6bc0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6bd0: 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
6be0: 20 63 61 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f   case FTS5_PLAN_
6bf0: 53 4f 52 54 45 44 5f 4d 41 54 43 48 3a 20 7b 0a  SORTED_MATCH: {.
6c00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
6c10: 35 53 6f 72 74 65 72 4e 65 78 74 28 70 43 73 72  5SorterNext(pCsr
6c20: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
6c30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
6c40: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
6c50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6c60: 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 53 74 6d  _step(pCsr->pStm
6c70: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
6c80: 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
6c90: 7b 0a 20 20 20 20 20 20 20 20 20 20 43 73 72 46  {.          CsrF
6ca0: 6c 61 67 53 65 74 28 70 43 73 72 2c 20 46 54 53  lagSet(pCsr, FTS
6cb0: 35 43 53 52 5f 45 4f 46 29 3b 0a 20 20 20 20 20  5CSR_EOF);.     
6cc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6cd0: 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70 53  3_reset(pCsr->pS
6ce0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tmt);.        }e
6cf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
6d00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6d10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6d30: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  }.  .  return rc
6d40: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 73 71 6c  ;.}...static sql
6d50: 69 74 65 33 5f 73 74 6d 74 20 2a 66 74 73 35 50  ite3_stmt *fts5P
6d60: 72 65 70 61 72 65 53 74 61 74 65 6d 65 6e 74 28  repareStatement(
6d70: 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46  .  int *pRc,.  F
6d80: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
6d90: 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  ig, .  const cha
6da0: 72 20 2a 7a 46 6d 74 2c 0a 20 20 2e 2e 2e 0a 29  r *zFmt,.  ....)
6db0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
6dc0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 76 61   *pRet = 0;.  va
6dd0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
6de0: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
6df0: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
6e00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
6e10: 74 20 72 63 3b 0a 20 20 20 20 63 68 61 72 20 2a  t rc;.    char *
6e20: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  zSql = sqlite3_v
6e30: 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70  mprintf(zFmt, ap
6e40: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
6e50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
6e60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20 0a   SQLITE_NOMEM; .
6e70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6e80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
6e90: 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67  epare_v2(pConfig
6ea0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
6eb0: 26 70 52 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  &pRet, 0);.     
6ec0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6ed0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  OK ){.        *p
6ee0: 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67  Config->pzErrmsg
6ef0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
6f00: 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
6f10: 5f 65 72 72 6d 73 67 28 70 43 6f 6e 66 69 67 2d  _errmsg(pConfig-
6f20: 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >db));.      }. 
6f30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6f40: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
6f50: 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
6f60: 7d 0a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  }..  va_end(ap);
6f70: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
6f80: 7d 20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  } ..static int f
6f90: 74 73 35 43 75 72 73 6f 72 46 69 72 73 74 53 6f  ts5CursorFirstSo
6fa0: 72 74 65 64 28 46 74 73 35 54 61 62 6c 65 20 2a  rted(Fts5Table *
6fb0: 70 54 61 62 2c 20 46 74 73 35 43 75 72 73 6f 72  pTab, Fts5Cursor
6fc0: 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 44 65 73   *pCsr, int bDes
6fd0: 63 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  c){.  Fts5Config
6fe0: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 54 61 62   *pConfig = pTab
6ff0: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73  ->pConfig;.  Fts
7000: 35 53 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72  5Sorter *pSorter
7010: 3b 0a 20 20 69 6e 74 20 6e 50 68 72 61 73 65 3b  ;.  int nPhrase;
7020: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
7030: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
7040: 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  OK;.  char *zSql
7050: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7060: 7a 52 61 6e 6b 20 3d 20 70 43 73 72 2d 3e 7a 52  zRank = pCsr->zR
7070: 61 6e 6b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ank;.  const cha
7080: 72 20 2a 7a 52 61 6e 6b 41 72 67 73 20 3d 20 70  r *zRankArgs = p
7090: 43 73 72 2d 3e 7a 52 61 6e 6b 41 72 67 73 3b 0a  Csr->zRankArgs;.
70a0: 20 20 0a 20 20 6e 50 68 72 61 73 65 20 3d 20 73    .  nPhrase = s
70b0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 68  qlite3Fts5ExprPh
70c0: 72 61 73 65 43 6f 75 6e 74 28 70 43 73 72 2d 3e  raseCount(pCsr->
70d0: 70 45 78 70 72 29 3b 0a 20 20 6e 42 79 74 65 20  pExpr);.  nByte 
70e0: 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 53 6f 72  = sizeof(Fts5Sor
70f0: 74 65 72 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e  ter) + sizeof(in
7100: 74 29 20 2a 20 28 6e 50 68 72 61 73 65 2d 31 29  t) * (nPhrase-1)
7110: 3b 0a 20 20 70 53 6f 72 74 65 72 20 3d 20 28 46  ;.  pSorter = (F
7120: 74 73 35 53 6f 72 74 65 72 2a 29 73 71 6c 69 74  ts5Sorter*)sqlit
7130: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
7140: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 65 72 3d  ;.  if( pSorter=
7150: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
7160: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
7170: 65 74 28 70 53 6f 72 74 65 72 2c 20 30 2c 20 6e  et(pSorter, 0, n
7180: 42 79 74 65 29 3b 0a 20 20 70 53 6f 72 74 65 72  Byte);.  pSorter
7190: 2d 3e 6e 49 64 78 20 3d 20 6e 50 68 72 61 73 65  ->nIdx = nPhrase
71a0: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 74  ;..  /* TODO: It
71b0: 20 77 6f 75 6c 64 20 62 65 20 62 65 74 74 65 72   would be better
71c0: 20 74 6f 20 68 61 76 65 20 73 6f 6d 65 20 73 79   to have some sy
71d0: 73 74 65 6d 20 66 6f 72 20 72 65 75 73 69 6e 67  stem for reusing
71e0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
71f0: 68 61 6e 64 6c 65 73 20 68 65 72 65 2c 20 72 61  handles here, ra
7200: 74 68 65 72 20 74 68 61 6e 20 70 72 65 70 61 72  ther than prepar
7210: 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 66 6f  ing a new one fo
7220: 72 20 65 61 63 68 20 71 75 65 72 79 2e 20 42 75  r each query. Bu
7230: 74 20 74 68 61 74 0a 20 20 2a 2a 20 69 73 20 6e  t that.  ** is n
7240: 6f 74 20 70 6f 73 73 69 62 6c 65 20 61 73 20 53  ot possible as S
7250: 51 4c 69 74 65 20 72 65 66 65 72 65 6e 63 65 20  QLite reference 
7260: 63 6f 75 6e 74 73 20 74 68 65 20 76 69 72 74 75  counts the virtu
7270: 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 73  al table objects
7280: 2e 0a 20 20 2a 2a 20 41 6e 64 20 73 69 6e 63 65  ..  ** And since
7290: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
72a0: 65 71 75 69 72 65 64 20 68 65 72 65 20 72 65 61  equired here rea
72b0: 64 73 20 66 72 6f 6d 20 74 68 69 73 20 76 65 72  ds from this ver
72c0: 79 20 76 69 72 74 75 61 6c 20 0a 20 20 2a 2a 20  y virtual .  ** 
72d0: 74 61 62 6c 65 2c 20 73 61 76 69 6e 67 20 69 74  table, saving it
72e0: 20 63 72 65 61 74 65 73 20 61 20 63 69 72 63 75   creates a circu
72f0: 6c 61 72 20 72 65 66 65 72 65 6e 63 65 2e 0a 20  lar reference.. 
7300: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 69   **.  ** If SQLi
7310: 74 65 20 61 20 62 75 69 6c 74 2d 69 6e 20 73 74  te a built-in st
7320: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 74  atement cache, t
7330: 68 69 73 20 77 6f 75 6c 64 6e 27 74 20 62 65 20  his wouldn't be 
7340: 61 20 70 72 6f 62 6c 65 6d 2e 20 2a 2f 0a 20 20  a problem. */.  
7350: 70 53 6f 72 74 65 72 2d 3e 70 53 74 6d 74 20 3d  pSorter->pStmt =
7360: 20 66 74 73 35 50 72 65 70 61 72 65 53 74 61 74   fts5PrepareStat
7370: 65 6d 65 6e 74 28 26 72 63 2c 20 70 43 6f 6e 66  ement(&rc, pConf
7380: 69 67 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  ig,.      "SELEC
7390: 54 20 72 6f 77 69 64 2c 20 72 61 6e 6b 20 46 52  T rowid, rank FR
73a0: 4f 4d 20 25 51 2e 25 51 20 4f 52 44 45 52 20 42  OM %Q.%Q ORDER B
73b0: 59 20 25 73 28 25 73 25 73 25 73 29 20 25 73 22  Y %s(%s%s%s) %s"
73c0: 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ,.      pConfig-
73d0: 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
73e0: 4e 61 6d 65 2c 20 7a 52 61 6e 6b 2c 20 70 43 6f  Name, zRank, pCo
73f0: 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  nfig->zName,.   
7400: 20 20 20 28 7a 52 61 6e 6b 41 72 67 73 20 3f 20     (zRankArgs ? 
7410: 22 2c 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20  ", " : ""),.    
7420: 20 20 28 7a 52 61 6e 6b 41 72 67 73 20 3f 20 7a    (zRankArgs ? z
7430: 52 61 6e 6b 41 72 67 73 20 3a 20 22 22 29 2c 0a  RankArgs : ""),.
7440: 20 20 20 20 20 20 62 44 65 73 63 20 3f 20 22 44        bDesc ? "D
7450: 45 53 43 22 20 3a 20 22 41 53 43 22 0a 20 20 29  ESC" : "ASC".  )
7460: 3b 0a 0a 20 20 70 43 73 72 2d 3e 70 53 6f 72 74  ;..  pCsr->pSort
7470: 65 72 20 3d 20 70 53 6f 72 74 65 72 3b 0a 20 20  er = pSorter;.  
7480: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7490: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
74a0: 20 70 54 61 62 2d 3e 70 53 6f 72 74 43 73 72 3d   pTab->pSortCsr=
74b0: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  =0 );.    pTab->
74c0: 70 53 6f 72 74 43 73 72 20 3d 20 70 43 73 72 3b  pSortCsr = pCsr;
74d0: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 53 6f  .    rc = fts5So
74e0: 72 74 65 72 4e 65 78 74 28 70 43 73 72 29 3b 0a  rterNext(pCsr);.
74f0: 20 20 20 20 70 54 61 62 2d 3e 70 53 6f 72 74 43      pTab->pSortC
7500: 73 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  sr = 0;.  }..  i
7510: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7520: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7530: 66 69 6e 61 6c 69 7a 65 28 70 53 6f 72 74 65 72  finalize(pSorter
7540: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  ->pStmt);.    sq
7550: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6f 72 74  lite3_free(pSort
7560: 65 72 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70  er);.    pCsr->p
7570: 53 6f 72 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  Sorter = 0;.  }.
7580: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7590: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
75a0: 43 75 72 73 6f 72 46 69 72 73 74 28 46 74 73 35  CursorFirst(Fts5
75b0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 46 74 73  Table *pTab, Fts
75c0: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69  5Cursor *pCsr, i
75d0: 6e 74 20 62 44 65 73 63 29 7b 0a 20 20 69 6e 74  nt bDesc){.  int
75e0: 20 72 63 3b 0a 20 20 46 74 73 35 45 78 70 72 20   rc;.  Fts5Expr 
75f0: 2a 70 45 78 70 72 20 3d 20 70 43 73 72 2d 3e 70  *pExpr = pCsr->p
7600: 45 78 70 72 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Expr;.  rc = sql
7610: 69 74 65 33 46 74 73 35 45 78 70 72 46 69 72 73  ite3Fts5ExprFirs
7620: 74 28 70 45 78 70 72 2c 20 70 54 61 62 2d 3e 70  t(pExpr, pTab->p
7630: 49 6e 64 65 78 2c 20 70 43 73 72 2d 3e 69 46 69  Index, pCsr->iFi
7640: 72 73 74 52 6f 77 69 64 2c 20 62 44 65 73 63 29  rstRowid, bDesc)
7650: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
7660: 74 73 35 45 78 70 72 45 6f 66 28 70 45 78 70 72  ts5ExprEof(pExpr
7670: 29 20 29 7b 0a 20 20 20 20 43 73 72 46 6c 61 67  ) ){.    CsrFlag
7680: 53 65 74 28 70 43 73 72 2c 20 46 54 53 35 43 53  Set(pCsr, FTS5CS
7690: 52 5f 45 4f 46 29 3b 0a 20 20 7d 0a 20 20 66 74  R_EOF);.  }.  ft
76a0: 73 35 43 73 72 4e 65 77 72 6f 77 28 70 43 73 72  s5CsrNewrow(pCsr
76b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
76c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
76d0: 20 61 20 22 73 70 65 63 69 61 6c 22 20 71 75 65   a "special" que
76e0: 72 79 2e 20 41 20 73 70 65 63 69 61 6c 20 71 75  ry. A special qu
76f0: 65 72 79 20 69 73 20 69 64 65 6e 74 69 66 69 65  ery is identifie
7700: 64 20 61 73 20 6f 6e 65 20 77 69 74 68 20 61 0a  d as one with a.
7710: 2a 2a 20 4d 41 54 43 48 20 65 78 70 72 65 73 73  ** MATCH express
7720: 69 6f 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ion that begins 
7730: 77 69 74 68 20 61 20 27 2a 27 20 63 68 61 72 61  with a '*' chara
7740: 63 74 65 72 2e 20 54 68 65 20 72 65 6d 61 69 6e  cter. The remain
7750: 64 65 72 20 6f 66 0a 2a 2a 20 74 68 65 20 74 65  der of.** the te
7760: 78 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  xt passed to the
7770: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
7780: 61 72 65 20 75 73 65 64 20 61 73 20 20 74 68 65  are used as  the
7790: 20 73 70 65 63 69 61 6c 20 71 75 65 72 79 0a 2a   special query.*
77a0: 2a 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2f  * parameters..*/
77b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
77c0: 53 70 65 63 69 61 6c 4d 61 74 63 68 28 0a 20 20  SpecialMatch(.  
77d0: 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 2c  Fts5Table *pTab,
77e0: 20 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a   .  Fts5Cursor *
77f0: 70 43 73 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pCsr, .  const c
7800: 68 61 72 20 2a 7a 51 75 65 72 79 0a 29 7b 0a 20  har *zQuery.){. 
7810: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7820: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
7830: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7840: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7850: 2a 7a 20 3d 20 7a 51 75 65 72 79 3b 20 20 20 20  *z = zQuery;    
7860: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20       /* Special 
7870: 71 75 65 72 79 20 74 65 78 74 20 2a 2f 0a 20 20  query text */.  
7880: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
78b0: 65 73 20 69 6e 20 74 65 78 74 20 61 74 20 7a 20  es in text at z 
78c0: 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30  */..  while( z[0
78d0: 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]==' ' ) z++;.  
78e0: 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 26 26  for(n=0; z[n] &&
78f0: 20 7a 5b 6e 5d 21 3d 27 20 27 3b 20 6e 2b 2b 29   z[n]!=' '; n++)
7900: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
7910: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3d  b->base.zErrMsg=
7920: 3d 30 20 29 3b 0a 20 20 70 43 73 72 2d 3e 65 50  =0 );.  pCsr->eP
7930: 6c 61 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 5f  lan = FTS5_PLAN_
7940: 53 50 45 43 49 41 4c 3b 0a 0a 20 20 69 66 28 20  SPECIAL;..  if( 
7950: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
7960: 63 6d 70 28 22 72 65 61 64 73 22 2c 20 7a 2c 20  cmp("reads", z, 
7970: 6e 29 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e  n) ){.    pCsr->
7980: 69 53 70 65 63 69 61 6c 20 3d 20 73 71 6c 69 74  iSpecial = sqlit
7990: 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73  e3Fts5IndexReads
79a0: 28 70 54 61 62 2d 3e 70 49 6e 64 65 78 29 3b 0a  (pTab->pIndex);.
79b0: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 30    }.  else if( 0
79c0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
79d0: 6d 70 28 22 69 64 22 2c 20 7a 2c 20 6e 29 20 29  mp("id", z, n) )
79e0: 7b 0a 20 20 20 20 70 43 73 72 2d 3e 69 53 70 65  {.    pCsr->iSpe
79f0: 63 69 61 6c 20 3d 20 70 43 73 72 2d 3e 69 43 73  cial = pCsr->iCs
7a00: 72 49 64 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 7b  rId;.  }.  else{
7a10: 0a 20 20 20 20 2f 2a 20 41 6e 20 75 6e 72 65 63  .    /* An unrec
7a20: 6f 67 6e 69 7a 65 64 20 64 69 72 65 63 74 69 76  ognized directiv
7a30: 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
7a40: 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a 2f 0a 20  or message. */. 
7a50: 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45     pTab->base.zE
7a60: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
7a70: 6d 70 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e  mprintf("unknown
7a80: 20 73 70 65 63 69 61 6c 20 71 75 65 72 79 3a 20   special query: 
7a90: 25 2e 2a 73 22 2c 20 6e 2c 20 7a 29 3b 0a 20 20  %.*s", n, z);.  
7aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
7ab0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
7ac0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7ad0: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 61 75  Search for an au
7ae0: 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
7af0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 74 68 61   named zName tha
7b00: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  t can be used wi
7b10: 74 68 20 74 61 62 6c 65 0a 2a 2a 20 70 54 61 62  th table.** pTab
7b20: 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  . If one is foun
7b30: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
7b40: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ter to the corre
7b50: 73 70 6f 6e 64 69 6e 67 20 46 74 73 35 41 75 78  sponding Fts5Aux
7b60: 69 6c 69 61 72 79 0a 2a 2a 20 73 74 72 75 63 74  iliary.** struct
7b70: 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ure. Otherwise, 
7b80: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
7b90: 69 6f 6e 20 65 78 69 73 74 73 2c 20 72 65 74 75  ion exists, retu
7ba0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
7bb0: 69 63 20 46 74 73 35 41 75 78 69 6c 69 61 72 79  ic Fts5Auxiliary
7bc0: 20 2a 66 74 73 35 46 69 6e 64 41 75 78 69 6c 69   *fts5FindAuxili
7bd0: 61 72 79 28 46 74 73 35 54 61 62 6c 65 20 2a 70  ary(Fts5Table *p
7be0: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
7bf0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 46 74 73 35 41  *zName){.  Fts5A
7c00: 75 78 69 6c 69 61 72 79 20 2a 70 41 75 78 3b 0a  uxiliary *pAux;.
7c10: 0a 20 20 66 6f 72 28 70 41 75 78 3d 70 54 61 62  .  for(pAux=pTab
7c20: 2d 3e 70 47 6c 6f 62 61 6c 2d 3e 70 41 75 78 3b  ->pGlobal->pAux;
7c30: 20 70 41 75 78 3b 20 70 41 75 78 3d 70 41 75 78   pAux; pAux=pAux
7c40: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
7c50: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
7c60: 70 28 7a 4e 61 6d 65 2c 20 70 41 75 78 2d 3e 7a  p(zName, pAux->z
7c70: 46 75 6e 63 29 3d 3d 30 20 29 20 72 65 74 75 72  Func)==0 ) retur
7c80: 6e 20 70 41 75 78 3b 0a 20 20 7d 0a 0a 20 20 2f  n pAux;.  }..  /
7c90: 2a 20 4e 6f 20 66 75 6e 63 74 69 6f 6e 20 6f 66  * No function of
7ca0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6e   the specified n
7cb0: 61 6d 65 20 77 61 73 20 66 6f 75 6e 64 2e 20 52  ame was found. R
7cc0: 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65  eturn 0. */.  re
7cd0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 73 74 61 74  turn 0;.}...stat
7ce0: 69 63 20 69 6e 74 20 66 74 73 35 46 69 6e 64 52  ic int fts5FindR
7cf0: 61 6e 6b 46 75 6e 63 74 69 6f 6e 28 46 74 73 35  ankFunction(Fts5
7d00: 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
7d10: 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62   Fts5Table *pTab
7d20: 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29 28   = (Fts5Table*)(
7d30: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
7d40: 29 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  );.  Fts5Config 
7d50: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d  *pConfig = pTab-
7d60: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20  >pConfig;.  int 
7d70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
7d80: 20 20 46 74 73 35 41 75 78 69 6c 69 61 72 79 20    Fts5Auxiliary 
7d90: 2a 70 41 75 78 20 3d 20 30 3b 0a 20 20 63 6f 6e  *pAux = 0;.  con
7da0: 73 74 20 63 68 61 72 20 2a 7a 52 61 6e 6b 20 3d  st char *zRank =
7db0: 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 3b 0a 20 20   pCsr->zRank;.  
7dc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 61 6e  const char *zRan
7dd0: 6b 41 72 67 73 20 3d 20 70 43 73 72 2d 3e 7a 52  kArgs = pCsr->zR
7de0: 61 6e 6b 41 72 67 73 3b 0a 0a 20 20 69 66 28 20  ankArgs;..  if( 
7df0: 7a 52 61 6e 6b 41 72 67 73 20 29 7b 0a 20 20 20  zRankArgs ){.   
7e00: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
7e10: 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66  lite3Fts5Mprintf
7e20: 28 26 72 63 2c 20 22 53 45 4c 45 43 54 20 25 73  (&rc, "SELECT %s
7e30: 22 2c 20 7a 52 61 6e 6b 41 72 67 73 29 3b 0a 20  ", zRankArgs);. 
7e40: 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20     if( zSql ){. 
7e50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
7e60: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
7e70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7e80: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e  _prepare_v2(pCon
7e90: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
7ea0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
7eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7ec0: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 61  e(zSql);.      a
7ed0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
7ee0: 45 5f 4f 4b 20 7c 7c 20 70 43 73 72 2d 3e 70 52  E_OK || pCsr->pR
7ef0: 61 6e 6b 41 72 67 53 74 6d 74 3d 3d 30 20 29 3b  ankArgStmt==0 );
7f00: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
7f10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7f20: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
7f30: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
7f40: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
7f50: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a       int nByte;.
7f60: 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e            pCsr->
7f70: 6e 52 61 6e 6b 41 72 67 20 3d 20 73 71 6c 69 74  nRankArg = sqlit
7f80: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
7f90: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
7fa0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
7fb0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
7fc0: 2a 70 43 73 72 2d 3e 6e 52 61 6e 6b 41 72 67 3b  *pCsr->nRankArg;
7fd0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d  .          pCsr-
7fe0: 3e 61 70 52 61 6e 6b 41 72 67 20 3d 20 28 73 71  >apRankArg = (sq
7ff0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 73 71  lite3_value**)sq
8000: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
8010: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
8020: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
8030: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8040: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
8050: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  i;.            f
8060: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e  or(i=0; i<pCsr->
8070: 6e 52 61 6e 6b 41 72 67 3b 20 69 2b 2b 29 7b 0a  nRankArg; i++){.
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
8090: 73 72 2d 3e 61 70 52 61 6e 6b 41 72 67 5b 69 5d  sr->apRankArg[i]
80a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
80b0: 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69  n_value(pStmt, i
80c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
80d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
80e0: 20 20 20 20 20 20 20 70 43 73 72 2d 3e 70 52 61         pCsr->pRa
80f0: 6e 6b 41 72 67 53 74 6d 74 20 3d 20 70 53 74 6d  nkArgStmt = pStm
8100: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
8110: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
8120: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
8130: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
8140: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
8150: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
8160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8170: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
8180: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8190: 0a 20 20 20 20 70 41 75 78 20 3d 20 66 74 73 35  .    pAux = fts5
81a0: 46 69 6e 64 41 75 78 69 6c 69 61 72 79 28 70 54  FindAuxiliary(pT
81b0: 61 62 2c 20 7a 52 61 6e 6b 29 3b 0a 20 20 20 20  ab, zRank);.    
81c0: 69 66 28 20 70 41 75 78 3d 3d 30 20 29 7b 0a 20  if( pAux==0 ){. 
81d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
81e0: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3d  b->base.zErrMsg=
81f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
8200: 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d  ->base.zErrMsg =
8210: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8220: 28 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69  ("no such functi
8230: 6f 6e 3a 20 25 73 22 2c 20 7a 52 61 6e 6b 29 3b  on: %s", zRank);
8240: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
8250: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
8260: 20 20 7d 0a 0a 20 20 70 43 73 72 2d 3e 70 52 61    }..  pCsr->pRa
8270: 6e 6b 20 3d 20 70 41 75 78 3b 0a 20 20 72 65 74  nk = pAux;.  ret
8280: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74  urn rc;.}...stat
8290: 69 63 20 69 6e 74 20 66 74 73 35 43 75 72 73 6f  ic int fts5Curso
82a0: 72 50 61 72 73 65 52 61 6e 6b 28 0a 20 20 46 74  rParseRank(.  Ft
82b0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
82c0: 67 2c 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20  g,.  Fts5Cursor 
82d0: 2a 70 43 73 72 2c 20 0a 20 20 73 71 6c 69 74 65  *pCsr, .  sqlite
82e0: 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e 6b 0a 29  3_value *pRank.)
82f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
8300: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52  ITE_OK;.  if( pR
8310: 61 6e 6b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ank ){.    const
8320: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
8330: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
8340: 76 61 6c 75 65 5f 74 65 78 74 28 70 52 61 6e 6b  value_text(pRank
8350: 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 61  );.    char *zRa
8360: 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nk = 0;.    char
8370: 20 2a 7a 52 61 6e 6b 41 72 67 73 20 3d 20 30 3b   *zRankArgs = 0;
8380: 0a 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ..    if( z==0 )
8390: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
83a0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
83b0: 52 61 6e 6b 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  Rank)==SQLITE_NU
83c0: 4c 4c 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  LL ) rc = SQLITE
83d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
83e0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
83f0: 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 50  lite3Fts5ConfigP
8400: 61 72 73 65 52 61 6e 6b 28 7a 2c 20 26 7a 52 61  arseRank(z, &zRa
8410: 6e 6b 2c 20 26 7a 52 61 6e 6b 41 72 67 73 29 3b  nk, &zRankArgs);
8420: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
8430: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8440: 20 20 20 20 20 20 70 43 73 72 2d 3e 7a 52 61 6e        pCsr->zRan
8450: 6b 20 3d 20 7a 52 61 6e 6b 3b 0a 20 20 20 20 20  k = zRank;.     
8460: 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 41 72 67 73   pCsr->zRankArgs
8470: 20 3d 20 7a 52 61 6e 6b 41 72 67 73 3b 0a 20 20   = zRankArgs;.  
8480: 20 20 20 20 43 73 72 46 6c 61 67 53 65 74 28 70      CsrFlagSet(p
8490: 43 73 72 2c 20 46 54 53 35 43 53 52 5f 46 52 45  Csr, FTS5CSR_FRE
84a0: 45 5f 5a 52 41 4e 4b 29 3b 0a 20 20 20 20 7d 65  E_ZRANK);.    }e
84b0: 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
84c0: 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  TE_ERROR ){.    
84d0: 20 20 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74    pCsr->base.pVt
84e0: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ab->zErrMsg = sq
84f0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
8500: 20 20 20 20 20 20 20 20 20 22 70 61 72 73 65 20           "parse 
8510: 65 72 72 6f 72 20 69 6e 20 72 61 6e 6b 20 66 75  error in rank fu
8520: 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 0a 20  nction: %s", z. 
8530: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
8540: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
8550: 43 6f 6e 66 69 67 2d 3e 7a 52 61 6e 6b 20 29 7b  Config->zRank ){
8560: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 7a 52 61  .      pCsr->zRa
8570: 6e 6b 20 3d 20 28 63 68 61 72 2a 29 70 43 6f 6e  nk = (char*)pCon
8580: 66 69 67 2d 3e 7a 52 61 6e 6b 3b 0a 20 20 20 20  fig->zRank;.    
8590: 20 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 41 72 67    pCsr->zRankArg
85a0: 73 20 3d 20 28 63 68 61 72 2a 29 70 43 6f 6e 66  s = (char*)pConf
85b0: 69 67 2d 3e 7a 52 61 6e 6b 41 72 67 73 3b 0a 20  ig->zRankArgs;. 
85c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
85d0: 70 43 73 72 2d 3e 7a 52 61 6e 6b 20 3d 20 28 63  pCsr->zRank = (c
85e0: 68 61 72 2a 29 46 54 53 35 5f 44 45 46 41 55 4c  har*)FTS5_DEFAUL
85f0: 54 5f 52 41 4e 4b 3b 0a 20 20 20 20 20 20 70 43  T_RANK;.      pC
8600: 73 72 2d 3e 7a 52 61 6e 6b 41 72 67 73 20 3d 20  sr->zRankArgs = 
8610: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
8620: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
8630: 74 69 63 20 69 36 34 20 66 74 73 35 47 65 74 52  tic i64 fts5GetR
8640: 6f 77 69 64 4c 69 6d 69 74 28 73 71 6c 69 74 65  owidLimit(sqlite
8650: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 69  3_value *pVal, i
8660: 36 34 20 69 44 65 66 61 75 6c 74 29 7b 0a 20 20  64 iDefault){.  
8670: 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20  if( pVal ){.    
8680: 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69  int eType = sqli
8690: 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69  te3_value_numeri
86a0: 63 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20  c_type(pVal);.  
86b0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
86c0: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
86d0: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
86e0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
86f0: 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pVal);.    }.  }
8700: 0a 20 20 72 65 74 75 72 6e 20 69 44 65 66 61 75  .  return iDefau
8710: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lt;.}../*.** Thi
8720: 73 20 69 73 20 74 68 65 20 78 46 69 6c 74 65 72  s is the xFilter
8730: 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 74   interface for t
8740: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
8750: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 76 69  .  See.** the vi
8760: 72 74 75 61 6c 20 74 61 62 6c 65 20 78 46 69 6c  rtual table xFil
8770: 74 65 72 20 6d 65 74 68 6f 64 20 64 6f 63 75 6d  ter method docum
8780: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64  entation for add
8790: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72  itional.** infor
87a0: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54  mation..** .** T
87b0: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 70  here are three p
87c0: 6f 73 73 69 62 6c 65 20 71 75 65 72 79 20 73 74  ossible query st
87d0: 72 61 74 65 67 69 65 73 3a 0a 2a 2a 0a 2a 2a 20  rategies:.**.** 
87e0: 20 20 31 2e 20 46 75 6c 6c 2d 74 65 78 74 20 73    1. Full-text s
87f0: 65 61 72 63 68 20 75 73 69 6e 67 20 61 20 4d 41  earch using a MA
8800: 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  TCH operator..**
8810: 20 20 20 32 2e 20 41 20 62 79 2d 72 6f 77 69 64     2. A by-rowid
8820: 20 6c 6f 6f 6b 75 70 2e 0a 2a 2a 20 20 20 33 2e   lookup..**   3.
8830: 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   A full-table sc
8840: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
8850: 74 20 66 74 73 35 46 69 6c 74 65 72 4d 65 74 68  t fts5FilterMeth
8860: 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
8870: 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  ab_cursor *pCurs
8880: 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75 72  or,   /* The cur
8890: 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74 68 69  sor used for thi
88a0: 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
88b0: 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20 20 20   idxNum,        
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88d0: 53 74 72 61 74 65 67 79 20 69 6e 64 65 78 20 2a  Strategy index *
88e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
88f0: 69 64 78 53 74 72 2c 20 20 20 20 20 20 20 20 20  idxStr,         
8900: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f      /* Unused */
8910: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20  .  int nVal,    
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8940: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70 56 61  elements in apVa
8950: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  l */.  sqlite3_v
8960: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
8970: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
8980: 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e 64 65  nts for the inde
8990: 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f 0a 29  xing scheme */.)
89a0: 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70  {.  Fts5Table *p
89b0: 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65  Tab = (Fts5Table
89c0: 2a 29 28 70 43 75 72 73 6f 72 2d 3e 70 56 74 61  *)(pCursor->pVta
89d0: 62 29 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  b);.  Fts5Config
89e0: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 54 61 62   *pConfig = pTab
89f0: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73  ->pConfig;.  Fts
8a00: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  5Cursor *pCsr = 
8a10: 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 75  (Fts5Cursor*)pCu
8a20: 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  rsor;.  int rc =
8a30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
8a40: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
8a50: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
8a60: 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Val = 0;        
8a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8a80: 75 6e 74 65 72 20 66 6f 72 20 61 70 56 61 6c 5b  unter for apVal[
8a90: 5d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  ] */.  int bDesc
8aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8ab0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
8ac0: 66 20 4f 52 44 45 52 20 42 59 20 5b 72 61 6e 6b  f ORDER BY [rank
8ad0: 7c 72 6f 77 69 64 5d 20 44 45 53 43 20 2a 2f 0a  |rowid] DESC */.
8ae0: 20 20 69 6e 74 20 62 4f 72 64 65 72 42 79 52 61    int bOrderByRa
8af0: 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nk;             
8b00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 4f 52 44    /* True if ORD
8b10: 45 52 20 42 59 20 72 61 6e 6b 20 2a 2f 0a 20 20  ER BY rank */.  
8b20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
8b30: 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20 20  Match = 0;      
8b40: 2f 2a 20 3c 74 62 6c 3e 20 4d 41 54 43 48 20 3f  /* <tbl> MATCH ?
8b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 28 6f 72 20   expression (or 
8b60: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 71 6c 69 74  NULL) */.  sqlit
8b70: 65 33 5f 76 61 6c 75 65 20 2a 70 52 61 6e 6b 20  e3_value *pRank 
8b80: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 72 61  = 0;       /* ra
8b90: 6e 6b 20 4d 41 54 43 48 20 3f 20 65 78 70 72 65  nk MATCH ? expre
8ba0: 73 73 69 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29 20  ssion (or NULL) 
8bb0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
8bc0: 75 65 20 2a 70 52 6f 77 69 64 45 71 20 3d 20 30  ue *pRowidEq = 0
8bd0: 3b 20 20 20 20 2f 2a 20 72 6f 77 69 64 20 3d 20  ;    /* rowid = 
8be0: 3f 20 65 78 70 72 65 73 73 69 6f 6e 20 28 6f 72  ? expression (or
8bf0: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 71 6c 69   NULL) */.  sqli
8c00: 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69  te3_value *pRowi
8c10: 64 4c 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 72  dLe = 0;    /* r
8c20: 6f 77 69 64 20 3c 3d 20 3f 20 65 78 70 72 65 73  owid <= ? expres
8c30: 73 69 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  sion (or NULL) *
8c40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
8c50: 65 20 2a 70 52 6f 77 69 64 47 65 20 3d 20 30 3b  e *pRowidGe = 0;
8c60: 20 20 20 20 2f 2a 20 72 6f 77 69 64 20 3e 3d 20      /* rowid >= 
8c70: 3f 20 65 78 70 72 65 73 73 69 6f 6e 20 28 6f 72  ? expression (or
8c80: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 68 61 72   NULL) */.  char
8c90: 20 2a 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 43   **pzErrmsg = pC
8ca0: 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 3b  onfig->pzErrmsg;
8cb0: 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 50  ..  if( pCsr->eP
8cc0: 6c 61 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 46  lan ){.    fts5F
8cd0: 72 65 65 43 75 72 73 6f 72 43 6f 6d 70 6f 6e 65  reeCursorCompone
8ce0: 6e 74 73 28 70 43 73 72 29 3b 0a 20 20 20 20 6d  nts(pCsr);.    m
8cf0: 65 6d 73 65 74 28 26 70 43 73 72 2d 3e 65 50 6c  emset(&pCsr->ePl
8d00: 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  an, 0, sizeof(Ft
8d10: 73 35 43 75 72 73 6f 72 29 20 2d 20 28 28 75 38  s5Cursor) - ((u8
8d20: 2a 29 26 70 43 73 72 2d 3e 65 50 6c 61 6e 2d 28  *)&pCsr->ePlan-(
8d30: 75 38 2a 29 70 43 73 72 29 29 3b 0a 20 20 7d 0a  u8*)pCsr));.  }.
8d40: 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
8d50: 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 61  >pStmt==0 );.  a
8d60: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 45 78  ssert( pCsr->pEx
8d70: 70 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pr==0 );.  asser
8d80: 74 28 20 70 43 73 72 2d 3e 63 73 72 66 6c 61 67  t( pCsr->csrflag
8d90: 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s==0 );.  assert
8da0: 28 20 70 43 73 72 2d 3e 70 52 61 6e 6b 3d 3d 30  ( pCsr->pRank==0
8db0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
8dc0: 73 72 2d 3e 7a 52 61 6e 6b 3d 3d 30 20 29 3b 0a  sr->zRank==0 );.
8dd0: 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
8de0: 7a 52 61 6e 6b 41 72 67 73 3d 3d 30 20 29 3b 0a  zRankArgs==0 );.
8df0: 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72 72  .  assert( pzErr
8e00: 6d 73 67 3d 3d 30 20 7c 7c 20 70 7a 45 72 72 6d  msg==0 || pzErrm
8e10: 73 67 3d 3d 26 70 54 61 62 2d 3e 62 61 73 65 2e  sg==&pTab->base.
8e20: 7a 45 72 72 4d 73 67 20 29 3b 0a 20 20 70 43 6f  zErrMsg );.  pCo
8e30: 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20 3d  nfig->pzErrmsg =
8e40: 20 26 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72   &pTab->base.zEr
8e50: 72 4d 73 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 6f  rMsg;..  /* Deco
8e60: 64 65 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  de the arguments
8e70: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
8e80: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
8e90: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
8ea0: 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  : The following 
8eb0: 73 65 74 20 6f 66 20 69 66 28 2e 2e 2e 29 20 73  set of if(...) s
8ec0: 74 61 74 65 6d 65 6e 74 73 20 6d 75 73 74 20 62  tatements must b
8ed0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 0a 20 20  e in the same.  
8ee0: 2a 2a 20 6f 72 64 65 72 20 61 73 20 74 68 65 20  ** order as the 
8ef0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e  corresponding en
8f00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 74 72  tries in the str
8f10: 75 63 74 20 61 74 20 74 68 65 20 74 6f 70 20 6f  uct at the top o
8f20: 66 0a 20 20 2a 2a 20 66 74 73 35 42 65 73 74 49  f.  ** fts5BestI
8f30: 6e 64 65 78 4d 65 74 68 6f 64 28 29 2e 20 20 2a  ndexMethod().  *
8f40: 2f 0a 20 20 69 66 28 20 42 69 74 46 6c 61 67 54  /.  if( BitFlagT
8f50: 65 73 74 28 69 64 78 4e 75 6d 2c 20 46 54 53 35  est(idxNum, FTS5
8f60: 5f 42 49 5f 4d 41 54 43 48 29 20 29 20 70 4d 61  _BI_MATCH) ) pMa
8f70: 74 63 68 20 3d 20 61 70 56 61 6c 5b 69 56 61 6c  tch = apVal[iVal
8f80: 2b 2b 5d 3b 0a 20 20 69 66 28 20 42 69 74 46 6c  ++];.  if( BitFl
8f90: 61 67 54 65 73 74 28 69 64 78 4e 75 6d 2c 20 46  agTest(idxNum, F
8fa0: 54 53 35 5f 42 49 5f 52 41 4e 4b 29 20 29 20 70  TS5_BI_RANK) ) p
8fb0: 52 61 6e 6b 20 3d 20 61 70 56 61 6c 5b 69 56 61  Rank = apVal[iVa
8fc0: 6c 2b 2b 5d 3b 0a 20 20 69 66 28 20 42 69 74 46  l++];.  if( BitF
8fd0: 6c 61 67 54 65 73 74 28 69 64 78 4e 75 6d 2c 20  lagTest(idxNum, 
8fe0: 46 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 45 51  FTS5_BI_ROWID_EQ
8ff0: 29 20 29 20 70 52 6f 77 69 64 45 71 20 3d 20 61  ) ) pRowidEq = a
9000: 70 56 61 6c 5b 69 56 61 6c 2b 2b 5d 3b 0a 20 20  pVal[iVal++];.  
9010: 69 66 28 20 42 69 74 46 6c 61 67 54 65 73 74 28  if( BitFlagTest(
9020: 69 64 78 4e 75 6d 2c 20 46 54 53 35 5f 42 49 5f  idxNum, FTS5_BI_
9030: 52 4f 57 49 44 5f 4c 45 29 20 29 20 70 52 6f 77  ROWID_LE) ) pRow
9040: 69 64 4c 65 20 3d 20 61 70 56 61 6c 5b 69 56 61  idLe = apVal[iVa
9050: 6c 2b 2b 5d 3b 0a 20 20 69 66 28 20 42 69 74 46  l++];.  if( BitF
9060: 6c 61 67 54 65 73 74 28 69 64 78 4e 75 6d 2c 20  lagTest(idxNum, 
9070: 46 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 47 45  FTS5_BI_ROWID_GE
9080: 29 20 29 20 70 52 6f 77 69 64 47 65 20 3d 20 61  ) ) pRowidGe = a
9090: 70 56 61 6c 5b 69 56 61 6c 2b 2b 5d 3b 0a 20 20  pVal[iVal++];.  
90a0: 61 73 73 65 72 74 28 20 69 56 61 6c 3d 3d 6e 56  assert( iVal==nV
90b0: 61 6c 20 29 3b 0a 20 20 62 4f 72 64 65 72 42 79  al );.  bOrderBy
90c0: 52 61 6e 6b 20 3d 20 28 28 69 64 78 4e 75 6d 20  Rank = ((idxNum 
90d0: 26 20 46 54 53 35 5f 42 49 5f 4f 52 44 45 52 5f  & FTS5_BI_ORDER_
90e0: 52 41 4e 4b 29 20 3f 20 31 20 3a 20 30 29 3b 0a  RANK) ? 1 : 0);.
90f0: 20 20 70 43 73 72 2d 3e 62 44 65 73 63 20 3d 20    pCsr->bDesc = 
9100: 62 44 65 73 63 20 3d 20 28 28 69 64 78 4e 75 6d  bDesc = ((idxNum
9110: 20 26 20 46 54 53 35 5f 42 49 5f 4f 52 44 45 52   & FTS5_BI_ORDER
9120: 5f 44 45 53 43 29 20 3f 20 31 20 3a 20 30 29 3b  _DESC) ? 1 : 0);
9130: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63  ..  /* Set the c
9140: 75 72 73 6f 72 20 75 70 70 65 72 20 61 6e 64 20  ursor upper and 
9150: 6c 6f 77 65 72 20 72 6f 77 69 64 20 6c 69 6d 69  lower rowid limi
9160: 74 73 2e 20 4f 6e 6c 79 20 73 6f 6d 65 20 73 74  ts. Only some st
9170: 72 61 74 65 67 69 65 73 20 0a 20 20 2a 2a 20 61  rategies .  ** a
9180: 63 74 75 61 6c 6c 79 20 75 73 65 20 74 68 65 6d  ctually use them
9190: 2e 20 54 68 69 73 20 69 73 20 6f 6b 2c 20 61 73  . This is ok, as
91a0: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28   the xBestIndex(
91b0: 29 20 6d 65 74 68 6f 64 20 6c 65 61 76 65 73 20  ) method leaves 
91c0: 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
91d0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
91e0: 74 2e 6f 6d 69 74 20 66 6c 61 67 20 63 6c 65 61  t.omit flag clea
91f0: 72 20 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73  r for range cons
9200: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20  traints.  ** on 
9210: 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
9220: 20 20 2a 2f 0a 20 20 69 66 28 20 70 52 6f 77 69    */.  if( pRowi
9230: 64 45 71 20 29 7b 0a 20 20 20 20 70 52 6f 77 69  dEq ){.    pRowi
9240: 64 4c 65 20 3d 20 70 52 6f 77 69 64 47 65 20 3d  dLe = pRowidGe =
9250: 20 70 52 6f 77 69 64 45 71 3b 0a 20 20 7d 0a 20   pRowidEq;.  }. 
9260: 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20   if( bDesc ){.  
9270: 20 20 70 43 73 72 2d 3e 69 46 69 72 73 74 52 6f    pCsr->iFirstRo
9280: 77 69 64 20 3d 20 66 74 73 35 47 65 74 52 6f 77  wid = fts5GetRow
9290: 69 64 4c 69 6d 69 74 28 70 52 6f 77 69 64 4c 65  idLimit(pRowidLe
92a0: 2c 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 29  , LARGEST_INT64)
92b0: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69 4c 61 73  ;.    pCsr->iLas
92c0: 74 52 6f 77 69 64 20 3d 20 66 74 73 35 47 65 74  tRowid = fts5Get
92d0: 52 6f 77 69 64 4c 69 6d 69 74 28 70 52 6f 77 69  RowidLimit(pRowi
92e0: 64 47 65 2c 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  dGe, SMALLEST_IN
92f0: 54 36 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  T64);.  }else{. 
9300: 20 20 20 70 43 73 72 2d 3e 69 4c 61 73 74 52 6f     pCsr->iLastRo
9310: 77 69 64 20 3d 20 66 74 73 35 47 65 74 52 6f 77  wid = fts5GetRow
9320: 69 64 4c 69 6d 69 74 28 70 52 6f 77 69 64 4c 65  idLimit(pRowidLe
9330: 2c 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 29  , LARGEST_INT64)
9340: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69 46 69 72  ;.    pCsr->iFir
9350: 73 74 52 6f 77 69 64 20 3d 20 66 74 73 35 47 65  stRowid = fts5Ge
9360: 74 52 6f 77 69 64 4c 69 6d 69 74 28 70 52 6f 77  tRowidLimit(pRow
9370: 69 64 47 65 2c 20 53 4d 41 4c 4c 45 53 54 5f 49  idGe, SMALLEST_I
9380: 4e 54 36 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  NT64);.  }..  if
9390: 28 20 70 54 61 62 2d 3e 70 53 6f 72 74 43 73 72  ( pTab->pSortCsr
93a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 70 53   ){.    /* If pS
93b0: 6f 72 74 43 73 72 20 69 73 20 6e 6f 6e 2d 4e 55  ortCsr is non-NU
93c0: 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  LL, then this ca
93d0: 6c 6c 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  ll is being made
93e0: 20 61 73 20 70 61 72 74 20 6f 66 20 0a 20 20 20   as part of .   
93f0: 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 66   ** processing f
9400: 6f 72 20 61 20 22 2e 2e 2e 20 4d 41 54 43 48 20  or a "... MATCH 
9410: 3c 65 78 70 72 3e 20 4f 52 44 45 52 20 42 59 20  <expr> ORDER BY 
9420: 72 61 6e 6b 22 20 71 75 65 72 79 20 28 65 50 6c  rank" query (ePl
9430: 61 6e 20 69 73 0a 20 20 20 20 2a 2a 20 73 65 74  an is.    ** set
9440: 20 74 6f 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f   to FTS5_PLAN_SO
9450: 52 54 45 44 5f 4d 41 54 43 48 29 2e 20 70 53 6f  RTED_MATCH). pSo
9460: 72 74 43 73 72 20 69 73 20 74 68 65 20 63 75 72  rtCsr is the cur
9470: 73 6f 72 20 74 68 61 74 20 77 69 6c 6c 0a 20 20  sor that will.  
9480: 20 20 2a 2a 20 72 65 74 75 72 6e 20 72 65 73 75    ** return resu
9490: 6c 74 73 20 74 6f 20 74 68 65 20 75 73 65 72 20  lts to the user 
94a0: 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 20  for this query. 
94b0: 54 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  The current curs
94c0: 6f 72 20 0a 20 20 20 20 2a 2a 20 28 70 43 75 72  or .    ** (pCur
94d0: 73 6f 72 29 20 69 73 20 75 73 65 64 20 74 6f 20  sor) is used to 
94e0: 65 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72  execute the quer
94f0: 79 20 69 73 73 75 65 64 20 62 79 20 66 75 6e 63  y issued by func
9500: 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 66 74 73  tion .    ** fts
9510: 35 43 75 72 73 6f 72 46 69 72 73 74 53 6f 72 74  5CursorFirstSort
9520: 65 64 28 29 20 61 62 6f 76 65 2e 20 20 2a 2f 0a  ed() above.  */.
9530: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 77      assert( pRow
9540: 69 64 45 71 3d 3d 30 20 26 26 20 70 52 6f 77 69  idEq==0 && pRowi
9550: 64 4c 65 3d 3d 30 20 26 26 20 70 52 6f 77 69 64  dLe==0 && pRowid
9560: 47 65 3d 3d 30 20 26 26 20 70 52 61 6e 6b 3d 3d  Ge==0 && pRank==
9570: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
9580: 20 6e 56 61 6c 3d 3d 30 20 26 26 20 70 4d 61 74   nVal==0 && pMat
9590: 63 68 3d 3d 30 20 26 26 20 62 4f 72 64 65 72 42  ch==0 && bOrderB
95a0: 79 52 61 6e 6b 3d 3d 30 20 26 26 20 62 44 65 73  yRank==0 && bDes
95b0: 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
95c0: 72 74 28 20 70 43 73 72 2d 3e 69 4c 61 73 74 52  rt( pCsr->iLastR
95d0: 6f 77 69 64 3d 3d 4c 41 52 47 45 53 54 5f 49 4e  owid==LARGEST_IN
95e0: 54 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T64 );.    asser
95f0: 74 28 20 70 43 73 72 2d 3e 69 46 69 72 73 74 52  t( pCsr->iFirstR
9600: 6f 77 69 64 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49  owid==SMALLEST_I
9610: 4e 54 36 34 20 29 3b 0a 20 20 20 20 70 43 73 72  NT64 );.    pCsr
9620: 2d 3e 65 50 6c 61 6e 20 3d 20 46 54 53 35 5f 50  ->ePlan = FTS5_P
9630: 4c 41 4e 5f 53 4f 55 52 43 45 3b 0a 20 20 20 20  LAN_SOURCE;.    
9640: 70 43 73 72 2d 3e 70 45 78 70 72 20 3d 20 70 54  pCsr->pExpr = pT
9650: 61 62 2d 3e 70 53 6f 72 74 43 73 72 2d 3e 70 45  ab->pSortCsr->pE
9660: 78 70 72 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  xpr;.    rc = ft
9670: 73 35 43 75 72 73 6f 72 46 69 72 73 74 28 70 54  s5CursorFirst(pT
9680: 61 62 2c 20 70 43 73 72 2c 20 62 44 65 73 63 29  ab, pCsr, bDesc)
9690: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d  ;.  }else if( pM
96a0: 61 74 63 68 20 29 7b 0a 20 20 20 20 63 6f 6e 73  atch ){.    cons
96b0: 74 20 63 68 61 72 20 2a 7a 45 78 70 72 20 3d 20  t char *zExpr = 
96c0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
96d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
96e0: 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69  apVal[0]);.    i
96f0: 66 28 20 7a 45 78 70 72 3d 3d 30 20 29 20 7a 45  f( zExpr==0 ) zE
9700: 78 70 72 20 3d 20 22 22 3b 0a 0a 20 20 20 20 72  xpr = "";..    r
9710: 63 20 3d 20 66 74 73 35 43 75 72 73 6f 72 50 61  c = fts5CursorPa
9720: 72 73 65 52 61 6e 6b 28 70 43 6f 6e 66 69 67 2c  rseRank(pConfig,
9730: 20 70 43 73 72 2c 20 70 52 61 6e 6b 29 3b 0a 20   pCsr, pRank);. 
9740: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9750: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
9760: 28 20 7a 45 78 70 72 5b 30 5d 3d 3d 27 2a 27 20  ( zExpr[0]=='*' 
9770: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
9780: 65 20 75 73 65 72 20 68 61 73 20 69 73 73 75 65  e user has issue
9790: 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
97a0: 20 66 6f 72 6d 20 22 4d 41 54 43 48 20 27 2a 2e   form "MATCH '*.
97b0: 2e 2e 27 22 2e 20 54 68 69 73 0a 20 20 20 20 20  ..'". This.     
97c0: 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20     ** indicates 
97d0: 74 68 61 74 20 74 68 65 20 4d 41 54 43 48 20 65  that the MATCH e
97e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
97f0: 20 61 20 66 75 6c 6c 20 74 65 78 74 20 71 75 65   a full text que
9800: 72 79 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ry,.        ** b
9810: 75 74 20 61 20 72 65 71 75 65 73 74 20 66 6f 72  ut a request for
9820: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 72   an internal par
9830: 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20  ameter.  */.    
9840: 20 20 20 20 72 63 20 3d 20 66 74 73 35 53 70 65      rc = fts5Spe
9850: 63 69 61 6c 4d 61 74 63 68 28 70 54 61 62 2c 20  cialMatch(pTab, 
9860: 70 43 73 72 2c 20 26 7a 45 78 70 72 5b 31 5d 29  pCsr, &zExpr[1])
9870: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9880: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 70 7a         char **pz
9890: 45 72 72 20 3d 20 26 70 54 61 62 2d 3e 62 61 73  Err = &pTab->bas
98a0: 65 2e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 20  e.zErrMsg;.     
98b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
98c0: 74 73 35 45 78 70 72 4e 65 77 28 70 43 6f 6e 66  ts5ExprNew(pConf
98d0: 69 67 2c 20 7a 45 78 70 72 2c 20 26 70 43 73 72  ig, zExpr, &pCsr
98e0: 2d 3e 70 45 78 70 72 2c 20 70 7a 45 72 72 29 3b  ->pExpr, pzErr);
98f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
9900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9910: 20 20 20 20 20 20 20 20 69 66 28 20 62 4f 72 64          if( bOrd
9920: 65 72 42 79 52 61 6e 6b 20 29 7b 0a 20 20 20 20  erByRank ){.    
9930: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 65 50          pCsr->eP
9940: 6c 61 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 5f  lan = FTS5_PLAN_
9950: 53 4f 52 54 45 44 5f 4d 41 54 43 48 3b 0a 20 20  SORTED_MATCH;.  
9960: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
9970: 74 73 35 43 75 72 73 6f 72 46 69 72 73 74 53 6f  ts5CursorFirstSo
9980: 72 74 65 64 28 70 54 61 62 2c 20 70 43 73 72 2c  rted(pTab, pCsr,
9990: 20 62 44 65 73 63 29 3b 0a 20 20 20 20 20 20 20   bDesc);.       
99a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
99b0: 20 20 20 20 20 20 70 43 73 72 2d 3e 65 50 6c 61        pCsr->ePla
99c0: 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 5f 4d 41  n = FTS5_PLAN_MA
99d0: 54 43 48 3b 0a 20 20 20 20 20 20 20 20 20 20 20  TCH;.           
99e0: 20 72 63 20 3d 20 66 74 73 35 43 75 72 73 6f 72   rc = fts5Cursor
99f0: 46 69 72 73 74 28 70 54 61 62 2c 20 70 43 73 72  First(pTab, pCsr
9a00: 2c 20 62 44 65 73 63 29 3b 0a 20 20 20 20 20 20  , bDesc);.      
9a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
9a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a30: 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 66 69  }else if( pConfi
9a40: 67 2d 3e 7a 43 6f 6e 74 65 6e 74 3d 3d 30 20 29  g->zContent==0 )
9a50: 7b 0a 20 20 20 20 2a 70 43 6f 6e 66 69 67 2d 3e  {.    *pConfig->
9a60: 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  pzErrmsg = sqlit
9a70: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
9a80: 20 20 20 20 22 25 73 3a 20 74 61 62 6c 65 20 64      "%s: table d
9a90: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
9aa0: 73 63 61 6e 6e 69 6e 67 22 2c 20 70 43 6f 6e 66  scanning", pConf
9ab0: 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ig->zName.    );
9ac0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9ad0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
9ae0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
9af0: 65 69 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61  either a full-ta
9b00: 62 6c 65 20 73 63 61 6e 20 28 65 50 6c 61 6e 3d  ble scan (ePlan=
9b10: 3d 46 54 53 35 5f 50 4c 41 4e 5f 53 43 41 4e 29  =FTS5_PLAN_SCAN)
9b20: 20 6f 72 20 61 20 6c 6f 6f 6b 75 70 0a 20 20 20   or a lookup.   
9b30: 20 2a 2a 20 62 79 20 72 6f 77 69 64 20 28 65 50   ** by rowid (eP
9b40: 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 52  lan==FTS5_PLAN_R
9b50: 4f 57 49 44 29 2e 20 20 2a 2f 0a 20 20 20 20 70  OWID).  */.    p
9b60: 43 73 72 2d 3e 65 50 6c 61 6e 20 3d 20 28 70 52  Csr->ePlan = (pR
9b70: 6f 77 69 64 45 71 20 3f 20 46 54 53 35 5f 50 4c  owidEq ? FTS5_PL
9b80: 41 4e 5f 52 4f 57 49 44 20 3a 20 46 54 53 35 5f  AN_ROWID : FTS5_
9b90: 50 4c 41 4e 5f 53 43 41 4e 29 3b 0a 20 20 20 20  PLAN_SCAN);.    
9ba0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
9bb0: 53 74 6f 72 61 67 65 53 74 6d 74 28 0a 20 20 20  StorageStmt(.   
9bc0: 20 20 20 20 20 70 54 61 62 2d 3e 70 53 74 6f 72       pTab->pStor
9bd0: 61 67 65 2c 20 66 74 73 35 53 74 6d 74 54 79 70  age, fts5StmtTyp
9be0: 65 28 70 43 73 72 29 2c 20 26 70 43 73 72 2d 3e  e(pCsr), &pCsr->
9bf0: 70 53 74 6d 74 2c 20 26 70 54 61 62 2d 3e 62 61  pStmt, &pTab->ba
9c00: 73 65 2e 7a 45 72 72 4d 73 67 0a 20 20 20 20 29  se.zErrMsg.    )
9c10: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9c20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9c30: 20 69 66 28 20 70 43 73 72 2d 3e 65 50 6c 61 6e   if( pCsr->ePlan
9c40: 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 52 4f 57 49  ==FTS5_PLAN_ROWI
9c50: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
9c60: 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
9c70: 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31 2c 20  pCsr->pStmt, 1, 
9c80: 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 20  apVal[0]);.     
9c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9ca0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9cb0: 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  64(pCsr->pStmt, 
9cc0: 31 2c 20 70 43 73 72 2d 3e 69 46 69 72 73 74 52  1, pCsr->iFirstR
9cd0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 73  owid);.        s
9ce0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
9cf0: 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 32  4(pCsr->pStmt, 2
9d00: 2c 20 70 43 73 72 2d 3e 69 4c 61 73 74 52 6f 77  , pCsr->iLastRow
9d10: 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id);.      }.   
9d20: 20 20 20 72 63 20 3d 20 66 74 73 35 4e 65 78 74     rc = fts5Next
9d30: 4d 65 74 68 6f 64 28 70 43 75 72 73 6f 72 29 3b  Method(pCursor);
9d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
9d50: 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20  onfig->pzErrmsg 
9d60: 3d 20 70 7a 45 72 72 6d 73 67 3b 0a 20 20 72 65  = pzErrmsg;.  re
9d70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
9d80: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
9d90: 45 6f 66 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  Eof method of th
9da0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
9db0: 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
9dc0: 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  is .** routine t
9dd0: 6f 20 66 69 6e 64 20 6f 75 74 20 69 66 20 69 74  o find out if it
9de0: 20 68 61 73 20 72 65 61 63 68 65 64 20 74 68 65   has reached the
9df0: 20 65 6e 64 20 6f 66 20 61 20 72 65 73 75 6c 74   end of a result
9e00: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
9e10: 69 6e 74 20 66 74 73 35 45 6f 66 4d 65 74 68 6f  int fts5EofMetho
9e20: 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  d(sqlite3_vtab_c
9e30: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b  ursor *pCursor){
9e40: 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70  .  Fts5Cursor *p
9e50: 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f  Csr = (Fts5Curso
9e60: 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 72 65  r*)pCursor;.  re
9e70: 74 75 72 6e 20 28 43 73 72 46 6c 61 67 54 65 73  turn (CsrFlagTes
9e80: 74 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f  t(pCsr, FTS5CSR_
9e90: 45 4f 46 29 20 3f 20 31 20 3a 20 30 29 3b 0a 7d  EOF) ? 1 : 0);.}
9ea0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9eb0: 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 74 68  he rowid that th
9ec0: 65 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  e cursor current
9ed0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  ly points to..*/
9ee0: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
9ef0: 43 75 72 73 6f 72 52 6f 77 69 64 28 46 74 73 35  CursorRowid(Fts5
9f00: 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
9f10: 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65   assert( pCsr->e
9f20: 50 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f  Plan==FTS5_PLAN_
9f30: 4d 41 54 43 48 20 0a 20 20 20 20 20 20 20 7c 7c  MATCH .       ||
9f40: 20 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54   pCsr->ePlan==FT
9f50: 53 35 5f 50 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d  S5_PLAN_SORTED_M
9f60: 41 54 43 48 20 0a 20 20 20 20 20 20 20 7c 7c 20  ATCH .       || 
9f70: 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53  pCsr->ePlan==FTS
9f80: 35 5f 50 4c 41 4e 5f 53 4f 55 52 43 45 20 0a 20  5_PLAN_SOURCE . 
9f90: 20 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e   );.  if( pCsr->
9fa0: 70 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 72  pSorter ){.    r
9fb0: 65 74 75 72 6e 20 70 43 73 72 2d 3e 70 53 6f 72  eturn pCsr->pSor
9fc0: 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 7d  ter->iRowid;.  }
9fd0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
9fe0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
9ff0: 52 6f 77 69 64 28 70 43 73 72 2d 3e 70 45 78 70  Rowid(pCsr->pExp
a000: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  r);.  }.}../* .*
a010: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 52  * This is the xR
a020: 6f 77 69 64 20 6d 65 74 68 6f 64 2e 20 54 68 65  owid method. The
a030: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 63 61 6c   SQLite core cal
a040: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
a050: 74 6f 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74  to.** retrieve t
a060: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
a070: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
a080: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
a090: 66 74 73 35 0a 2a 2a 20 65 78 70 6f 73 65 73 20  fts5.** exposes 
a0a0: 25 5f 63 6f 6e 74 65 6e 74 2e 72 6f 77 69 64 20  %_content.rowid 
a0b0: 61 73 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  as the rowid for
a0c0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
a0d0: 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 77 69 64  le. The.** rowid
a0e0: 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
a0f0: 65 6e 20 74 6f 20 2a 70 52 6f 77 69 64 2e 0a 2a  en to *pRowid..*
a100: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
a110: 35 52 6f 77 69 64 4d 65 74 68 6f 64 28 73 71 6c  5RowidMethod(sql
a120: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
a130: 20 2a 70 43 75 72 73 6f 72 2c 20 73 71 6c 69 74   *pCursor, sqlit
a140: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29  e_int64 *pRowid)
a150: 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  {.  Fts5Cursor *
a160: 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73  pCsr = (Fts5Curs
a170: 6f 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 69  or*)pCursor;.  i
a180: 6e 74 20 65 50 6c 61 6e 20 3d 20 70 43 73 72 2d  nt ePlan = pCsr-
a190: 3e 65 50 6c 61 6e 3b 0a 20 20 0a 20 20 61 73 73  >ePlan;.  .  ass
a1a0: 65 72 74 28 20 43 73 72 46 6c 61 67 54 65 73 74  ert( CsrFlagTest
a1b0: 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 45  (pCsr, FTS5CSR_E
a1c0: 4f 46 29 3d 3d 30 20 29 3b 0a 20 20 73 77 69 74  OF)==0 );.  swit
a1d0: 63 68 28 20 65 50 6c 61 6e 20 29 7b 0a 20 20 20  ch( ePlan ){.   
a1e0: 20 63 61 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f   case FTS5_PLAN_
a1f0: 53 50 45 43 49 41 4c 3a 0a 20 20 20 20 20 20 2a  SPECIAL:.      *
a200: 70 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  pRowid = 0;.    
a210: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a220: 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 55  se FTS5_PLAN_SOU
a230: 52 43 45 3a 0a 20 20 20 20 63 61 73 65 20 46 54  RCE:.    case FT
a240: 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 3a 0a 20  S5_PLAN_MATCH:. 
a250: 20 20 20 63 61 73 65 20 46 54 53 35 5f 50 4c 41     case FTS5_PLA
a260: 4e 5f 53 4f 52 54 45 44 5f 4d 41 54 43 48 3a 0a  N_SORTED_MATCH:.
a270: 20 20 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20        *pRowid = 
a280: 66 74 73 35 43 75 72 73 6f 72 52 6f 77 69 64 28  fts5CursorRowid(
a290: 70 43 73 72 29 3b 0a 20 20 20 20 20 20 62 72 65  pCsr);.      bre
a2a0: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
a2b0: 3a 0a 20 20 20 20 20 20 2a 70 52 6f 77 69 64 20  :.      *pRowid 
a2c0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
a2d0: 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74  _int64(pCsr->pSt
a2e0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  mt, 0);.      br
a2f0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  eak;.  }..  retu
a300: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a310: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  ./*.** If the cu
a320: 72 73 6f 72 20 72 65 71 75 69 72 65 73 20 73 65  rsor requires se
a330: 65 6b 69 6e 67 20 28 62 53 65 65 6b 52 65 71 75  eking (bSeekRequ
a340: 69 72 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ired flag is set
a350: 29 2c 20 73 65 65 6b 20 69 74 2e 0a 2a 2a 20 52  ), seek it..** R
a360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
a370: 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
a380: 72 73 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  rs, or an SQLite
a390: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
a3a0: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
a3b0: 61 72 67 75 6d 65 6e 74 20 62 45 72 72 6f 72 6d  argument bErrorm
a3c0: 73 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61  sg is true and a
a3d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
a3e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a3f0: 20 6d 61 79 0a 2a 2a 20 62 65 20 6c 65 66 74 20   may.** be left 
a400: 69 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  in sqlite3_vtab.
a410: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 73 74 61 74  zErrMsg..*/.stat
a420: 69 63 20 69 6e 74 20 66 74 73 35 53 65 65 6b 43  ic int fts5SeekC
a430: 75 72 73 6f 72 28 46 74 73 35 43 75 72 73 6f 72  ursor(Fts5Cursor
a440: 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 45 72 72   *pCsr, int bErr
a450: 6f 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  ormsg){.  int rc
a460: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
a470: 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
a480: 72 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 68  r does not yet h
a490: 61 76 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ave a statement 
a4a0: 68 61 6e 64 6c 65 2c 20 6f 62 74 61 69 6e 20 6f  handle, obtain o
a4b0: 6e 65 20 6e 6f 77 2e 20 2a 2f 20 0a 20 20 69 66  ne now. */ .  if
a4c0: 28 20 70 43 73 72 2d 3e 70 53 74 6d 74 3d 3d 30  ( pCsr->pStmt==0
a4d0: 20 29 7b 0a 20 20 20 20 46 74 73 35 54 61 62 6c   ){.    Fts5Tabl
a4e0: 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54  e *pTab = (Fts5T
a4f0: 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73  able*)(pCsr->bas
a500: 65 2e 70 56 74 61 62 29 3b 0a 20 20 20 20 69 6e  e.pVtab);.    in
a510: 74 20 65 53 74 6d 74 20 3d 20 66 74 73 35 53 74  t eStmt = fts5St
a520: 6d 74 54 79 70 65 28 70 43 73 72 29 3b 0a 20 20  mtType(pCsr);.  
a530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
a540: 73 35 53 74 6f 72 61 67 65 53 74 6d 74 28 0a 20  s5StorageStmt(. 
a550: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 70 53 74         pTab->pSt
a560: 6f 72 61 67 65 2c 20 65 53 74 6d 74 2c 20 26 70  orage, eStmt, &p
a570: 43 73 72 2d 3e 70 53 74 6d 74 2c 20 28 62 45 72  Csr->pStmt, (bEr
a580: 72 6f 72 6d 73 67 3f 26 70 54 61 62 2d 3e 62 61  rormsg?&pTab->ba
a590: 73 65 2e 7a 45 72 72 4d 73 67 3a 30 29 0a 20 20  se.zErrMsg:0).  
a5a0: 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
a5b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a5c0: 7c 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72  | pTab->base.zEr
a5d0: 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rMsg==0 );.    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 52 45 51 55 49 52 45 5f 43 4f 4e 54 45 4e 54  _REQUIRE_CONTENT
a610: 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ) );.  }..  if( 
a620: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
a630: 20 43 73 72 46 6c 61 67 54 65 73 74 28 70 43 73   CsrFlagTest(pCs
a640: 72 2c 20 46 54 53 35 43 53 52 5f 52 45 51 55 49  r, FTS5CSR_REQUI
a650: 52 45 5f 43 4f 4e 54 45 4e 54 29 20 29 7b 0a 20  RE_CONTENT) ){. 
a660: 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
a670: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71  >pExpr );.    sq
a680: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72  lite3_reset(pCsr
a690: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  ->pStmt);.    sq
a6a0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
a6b0: 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31 2c  (pCsr->pStmt, 1,
a6c0: 20 66 74 73 35 43 75 72 73 6f 72 52 6f 77 69 64   fts5CursorRowid
a6d0: 28 70 43 73 72 29 29 3b 0a 20 20 20 20 72 63 20  (pCsr));.    rc 
a6e0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
a6f0: 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  Csr->pStmt);.   
a700: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a710: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ROW ){.      rc 
a720: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
a730: 20 20 20 43 73 72 46 6c 61 67 43 6c 65 61 72 28     CsrFlagClear(
a740: 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 52 45  pCsr, FTS5CSR_RE
a750: 51 55 49 52 45 5f 43 4f 4e 54 45 4e 54 29 3b 0a  QUIRE_CONTENT);.
a760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a770: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
a780: 73 65 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29  set(pCsr->pStmt)
a790: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
a7a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a7b0: 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43       rc = FTS5_C
a7c0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
a7d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a7e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
a7f0: 20 76 6f 69 64 20 66 74 73 35 53 65 74 56 74 61   void fts5SetVta
a800: 62 45 72 72 6f 72 28 46 74 73 35 54 61 62 6c 65  bError(Fts5Table
a810: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
a820: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
a830: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 20 20 20    va_list ap;   
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 20 20 2f 2a 20 2e 2e 2e 20 70 72 69 6e 74 66 20    /* ... printf 
a860: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 76  arguments */.  v
a870: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
a880: 6d 61 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mat);.  assert( 
a890: 70 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3d  p->base.zErrMsg=
a8a0: 3d 30 20 29 3b 0a 20 20 70 2d 3e 62 61 73 65 2e  =0 );.  p->base.
a8b0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
a8c0: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
a8d0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
a8e0: 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d(ap);.}../*.** 
a8f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
a900: 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
a910: 65 20 61 6e 20 46 54 53 20 49 4e 53 45 52 54 20  e an FTS INSERT 
a920: 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 6f 74 68 65  command. In othe
a930: 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 61 6e 20 49  r words,.** an I
a940: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20  NSERT statement 
a950: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
a960: 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
a970: 54 4f 20 66 74 73 28 66 74 73 29 20 56 41 4c 55  TO fts(fts) VALU
a980: 45 53 28 24 70 43 6d 64 29 0a 2a 2a 20 20 20 20  ES($pCmd).**    
a990: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73   INSERT INTO fts
a9a0: 28 66 74 73 2c 20 72 61 6e 6b 29 20 56 41 4c 55  (fts, rank) VALU
a9b0: 45 53 28 24 70 43 6d 64 2c 20 24 70 56 61 6c 29  ES($pCmd, $pVal)
a9c0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
a9d0: 70 56 61 6c 20 69 73 20 74 68 65 20 76 61 6c 75  pVal is the valu
a9e0: 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 63 6f  e assigned to co
a9f0: 6c 75 6d 6e 20 22 66 74 73 22 20 62 79 20 74 68  lumn "fts" by th
aa00: 65 20 49 4e 53 45 52 54 20 0a 2a 2a 20 73 74 61  e INSERT .** sta
aa10: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e  tement. This fun
aa20: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
aa30: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
aa40: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
aa50: 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  ite.** error cod
aa60: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
aa70: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
aa80: 63 6f 6d 6d 61 6e 64 73 20 69 6d 70 6c 65 6d 65  commands impleme
aa90: 6e 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  nted by this fun
aaa0: 63 74 69 6f 6e 20 61 72 65 20 64 6f 63 75 6d 65  ction are docume
aab0: 6e 74 65 64 20 69 6e 20 74 68 65 20 22 53 70 65  nted in the "Spe
aac0: 63 69 61 6c 0a 2a 2a 20 49 4e 53 45 52 54 20 44  cial.** INSERT D
aad0: 69 72 65 63 74 69 76 65 73 22 20 73 65 63 74 69  irectives" secti
aae0: 6f 6e 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65  on of the docume
aaf0: 6e 74 61 74 69 6f 6e 2e 20 49 74 20 73 68 6f 75  ntation. It shou
ab00: 6c 64 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ld be updated if
ab10: 0a 2a 2a 20 6d 6f 72 65 20 63 6f 6d 6d 61 6e 64  .** more command
ab20: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
ab30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
ab40: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
ab50: 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28 0a 20  SpecialInsert(. 
ab60: 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62   Fts5Table *pTab
ab70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ab80: 20 2f 2a 20 46 74 73 35 20 74 61 62 6c 65 20 6f   /* Fts5 table o
ab90: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
aba0: 20 63 68 61 72 20 2a 7a 43 6d 64 2c 20 20 20 20   char *zCmd,    
abb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
abc0: 78 74 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  xt inserted into
abd0: 20 74 61 62 6c 65 2d 6e 61 6d 65 20 63 6f 6c 75   table-name colu
abe0: 6d 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  mn */.  sqlite3_
abf0: 76 61 6c 75 65 20 2a 70 56 61 6c 20 20 20 20 20  value *pVal     
ac00: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
ac10: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 72   inserted into r
ac20: 61 6e 6b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b  ank column */.){
ac30: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
ac40: 43 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d 3e 70  Config = pTab->p
ac50: 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 72 63  Config;.  int rc
ac60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ac70: 69 6e 74 20 62 45 72 72 6f 72 20 3d 20 30 3b 0a  int bError = 0;.
ac80: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
ac90: 33 5f 73 74 72 69 63 6d 70 28 22 64 65 6c 65 74  3_stricmp("delet
aca0: 65 2d 61 6c 6c 22 2c 20 7a 43 6d 64 29 20 29 7b  e-all", zCmd) ){
acb0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
acc0: 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35  ->eContent==FTS5
acd0: 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20  _CONTENT_NORMAL 
ace0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74  ){.      fts5Set
acf0: 56 74 61 62 45 72 72 6f 72 28 70 54 61 62 2c 20  VtabError(pTab, 
ad00: 0a 20 20 20 20 20 20 20 20 20 20 22 27 64 65 6c  .          "'del
ad10: 65 74 65 2d 61 6c 6c 27 20 6d 61 79 20 6f 6e 6c  ete-all' may onl
ad20: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
ad30: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 63 6f   ".          "co
ad40: 6e 74 65 6e 74 6c 65 73 73 20 6f 72 20 65 78 74  ntentless or ext
ad50: 65 72 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 66 74  ernal content ft
ad60: 73 35 20 74 61 62 6c 65 22 0a 20 20 20 20 20 20  s5 table".      
ad70: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
ad80: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ad90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
ada0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  = sqlite3Fts5Sto
adb0: 72 61 67 65 44 65 6c 65 74 65 41 6c 6c 28 70 54  rageDeleteAll(pT
adc0: 61 62 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a 20  ab->pStorage);. 
add0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
ade0: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
adf0: 63 6d 70 28 22 72 65 62 75 69 6c 64 22 2c 20 7a  cmp("rebuild", z
ae00: 43 6d 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Cmd) ){.    if( 
ae10: 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e  pConfig->eConten
ae20: 74 3d 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f  t==FTS5_CONTENT_
ae30: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 66 74  NONE ){.      ft
ae40: 73 35 53 65 74 56 74 61 62 45 72 72 6f 72 28 70  s5SetVtabError(p
ae50: 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Tab, .          
ae60: 22 27 72 65 62 75 69 6c 64 27 20 6d 61 79 20 6e  "'rebuild' may n
ae70: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
ae80: 61 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20 66 74  a contentless ft
ae90: 73 35 20 74 61 62 6c 65 22 0a 20 20 20 20 20 20  s5 table".      
aea0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
aeb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
aec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
aed0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  = sqlite3Fts5Sto
aee0: 72 61 67 65 52 65 62 75 69 6c 64 28 70 54 61 62  rageRebuild(pTab
aef0: 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a 20 20 20  ->pStorage);.   
af00: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30   }.  }else if( 0
af10: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
af20: 70 28 22 6f 70 74 69 6d 69 7a 65 22 2c 20 7a 43  p("optimize", zC
af30: 6d 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  md) ){.    rc = 
af40: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
af50: 67 65 4f 70 74 69 6d 69 7a 65 28 70 54 61 62 2d  geOptimize(pTab-
af60: 3e 70 53 74 6f 72 61 67 65 29 3b 0a 20 20 7d 65  >pStorage);.  }e
af70: 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  lse if( 0==sqlit
af80: 65 33 5f 73 74 72 69 63 6d 70 28 22 6d 65 72 67  e3_stricmp("merg
af90: 65 22 2c 20 7a 43 6d 64 29 20 29 7b 0a 20 20 20  e", zCmd) ){.   
afa0: 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 73 71   int nMerge = sq
afb0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
afc0: 70 56 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  pVal);.    rc = 
afd0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
afe0: 67 65 4d 65 72 67 65 28 70 54 61 62 2d 3e 70 53  geMerge(pTab->pS
aff0: 74 6f 72 61 67 65 2c 20 6e 4d 65 72 67 65 29 3b  torage, nMerge);
b000: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d  .  }else if( 0==
b010: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
b020: 22 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b  "integrity-check
b030: 22 2c 20 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20  ", zCmd) ){.    
b040: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
b050: 53 74 6f 72 61 67 65 49 6e 74 65 67 72 69 74 79  StorageIntegrity
b060: 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 29  (pTab->pStorage)
b070: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
b080: 44 45 42 55 47 0a 20 20 7d 65 6c 73 65 20 69 66  DEBUG.  }else if
b090: 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
b0a0: 69 63 6d 70 28 22 70 72 65 66 69 78 2d 69 6e 64  icmp("prefix-ind
b0b0: 65 78 22 2c 20 7a 43 6d 64 29 20 29 7b 0a 20 20  ex", zCmd) ){.  
b0c0: 20 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66    pConfig->bPref
b0d0: 69 78 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  ixIndex = sqlite
b0e0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
b0f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
b100: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
b110: 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64  te3Fts5IndexLoad
b120: 43 6f 6e 66 69 67 28 70 54 61 62 2d 3e 70 49 6e  Config(pTab->pIn
b130: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dex);.    if( rc
b140: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b150: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b160: 33 46 74 73 35 43 6f 6e 66 69 67 53 65 74 56 61  3Fts5ConfigSetVa
b170: 6c 75 65 28 70 54 61 62 2d 3e 70 43 6f 6e 66 69  lue(pTab->pConfi
b180: 67 2c 20 7a 43 6d 64 2c 20 70 56 61 6c 2c 20 26  g, zCmd, pVal, &
b190: 62 45 72 72 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  bError);.    }. 
b1a0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b1b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
b1c0: 28 20 62 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( bError ){.    
b1d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b1e0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
b1f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
b200: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
b210: 61 67 65 43 6f 6e 66 69 67 56 61 6c 75 65 28 70  ageConfigValue(p
b220: 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 7a  Tab->pStorage, z
b230: 43 6d 64 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20  Cmd, pVal, 0);. 
b240: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b250: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b260: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b270: 53 70 65 63 69 61 6c 44 65 6c 65 74 65 28 0a 20  SpecialDelete(. 
b280: 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62   Fts5Table *pTab
b290: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
b2a0: 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20 20 73  ue **apVal, .  s
b2b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
b2c0: 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 72  Rowid.){.  int r
b2d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b2e0: 20 69 6e 74 20 65 54 79 70 65 31 20 3d 20 73 71   int eType1 = sq
b2f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
b300: 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 69 66  (apVal[1]);.  if
b310: 28 20 65 54 79 70 65 31 3d 3d 53 51 4c 49 54 45  ( eType1==SQLITE
b320: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
b330: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
b340: 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  el = sqlite3_val
b350: 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 31  ue_int64(apVal[1
b360: 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ]);.    rc = sql
b370: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
b380: 70 65 63 69 61 6c 44 65 6c 65 74 65 28 70 54 61  pecialDelete(pTa
b390: 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69 44 65  b->pStorage, iDe
b3a0: 6c 2c 20 26 61 70 56 61 6c 5b 32 5d 29 3b 0a 20  l, &apVal[2]);. 
b3b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b3c0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
b3d0: 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65 72 74  ts5StorageInsert
b3e0: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
b3f0: 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62   Fts5Table *pTab
b400: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
b410: 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20 20 69  ue **apVal, .  i
b420: 36 34 20 2a 70 69 52 6f 77 69 64 0a 29 7b 0a 20  64 *piRowid.){. 
b430: 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a   int rc = *pRc;.
b440: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b450: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
b460: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
b470: 67 65 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 28  geContentInsert(
b480: 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20  pTab->pStorage, 
b490: 61 70 56 61 6c 2c 20 70 69 52 6f 77 69 64 29 3b  apVal, piRowid);
b4a0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
b4b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b4c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
b4d0: 53 74 6f 72 61 67 65 49 6e 64 65 78 49 6e 73 65  StorageIndexInse
b4e0: 72 74 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67  rt(pTab->pStorag
b4f0: 65 2c 20 61 70 56 61 6c 2c 20 2a 70 69 52 6f 77  e, apVal, *piRow
b500: 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 63 20  id);.  }.  *pRc 
b510: 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  = rc;.}../* .** 
b520: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
b530: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
b540: 69 6f 6e 20 6f 66 20 74 68 65 20 78 55 70 64 61  ion of the xUpda
b550: 74 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  te callback used
b560: 20 62 79 20 0a 2a 2a 20 46 54 53 33 20 76 69 72   by .** FTS3 vir
b570: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 49 74 20  tual tables. It 
b580: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 53 51  is invoked by SQ
b590: 4c 69 74 65 20 65 61 63 68 20 74 69 6d 65 20 61  Lite each time a
b5a0: 20 72 6f 77 20 69 73 20 74 6f 20 62 65 0a 2a 2a   row is to be.**
b5b0: 20 69 6e 73 65 72 74 65 64 2c 20 75 70 64 61 74   inserted, updat
b5c0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 2a  ed or deleted..*
b5d0: 2a 0a 2a 2a 20 41 20 64 65 6c 65 74 65 20 73 70  *.** A delete sp
b5e0: 65 63 69 66 69 65 73 20 61 20 73 69 6e 67 6c 65  ecifies a single
b5f0: 20 61 72 67 75 6d 65 6e 74 20 2d 20 74 68 65 20   argument - the 
b600: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77  rowid of the row
b610: 20 74 6f 20 72 65 6d 6f 76 65 2e 0a 2a 2a 20 0a   to remove..** .
b620: 2a 2a 20 55 70 64 61 74 65 20 61 6e 64 20 69 6e  ** Update and in
b630: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20  sert operations 
b640: 70 61 73 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  pass:.**.**   1.
b650: 20 54 68 65 20 22 6f 6c 64 22 20 72 6f 77 69 64   The "old" rowid
b660: 2c 20 6f 72 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20  , or NULL..**   
b670: 32 2e 20 54 68 65 20 22 6e 65 77 22 20 72 6f 77  2. The "new" row
b680: 69 64 2e 0a 2a 2a 20 20 20 33 2e 20 56 61 6c 75  id..**   3. Valu
b690: 65 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  es for each of t
b6a0: 68 65 20 6e 43 6f 6c 20 6d 61 74 63 68 61 62 6c  he nCol matchabl
b6b0: 65 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20 20 20  e columns..**   
b6c0: 34 2e 20 56 61 6c 75 65 73 20 66 6f 72 20 74 68  4. Values for th
b6d0: 65 20 74 77 6f 20 68 69 64 64 65 6e 20 63 6f 6c  e two hidden col
b6e0: 75 6d 6e 73 20 28 3c 74 61 62 6c 65 6e 61 6d 65  umns (<tablename
b6f0: 3e 20 61 6e 64 20 22 72 61 6e 6b 22 29 2e 0a 2a  > and "rank")..*
b700: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b710: 35 55 70 64 61 74 65 4d 65 74 68 6f 64 28 0a 20  5UpdateMethod(. 
b720: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
b730: 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  Vtab,           
b740: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
b750: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
b760: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b780: 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e   Size of argumen
b790: 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c  t array */.  sql
b7a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
b7b0: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al,          /* 
b7c0: 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
b7d0: 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69  ts */.  sqlite_i
b7e0: 6e 74 36 34 20 2a 70 52 6f 77 69 64 20 20 20 20  nt64 *pRowid    
b7f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
b800: 54 68 65 20 61 66 66 65 63 74 65 64 20 28 6f 72  The affected (or
b810: 20 65 66 66 65 63 74 65 64 29 20 72 6f 77 69 64   effected) rowid
b820: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 54 61 62   */.){.  Fts5Tab
b830: 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
b840: 54 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20  Table*)pVtab;.  
b850: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
b860: 66 69 67 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6e  fig = pTab->pCon
b870: 66 69 67 3b 0a 20 20 69 6e 74 20 65 54 79 70 65  fig;.  int eType
b880: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b890: 20 20 20 20 20 20 20 2f 2a 20 76 61 6c 75 65 5f         /* value_
b8a0: 74 79 70 65 28 29 20 6f 66 20 61 70 56 61 6c 5b  type() of apVal[
b8b0: 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  0] */.  int rc =
b8c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
b8d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b8e0: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
b8f0: 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
b900: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
b910: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
b920: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
b930: 62 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d 31 20  b->ts.eState==1 
b940: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
b950: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20  tab->zErrMsg==0 
b960: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  );.  assert( nAr
b970: 67 3d 3d 31 20 7c 7c 20 6e 41 72 67 3d 3d 28 32  g==1 || nArg==(2
b980: 2b 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 2b 32  +pConfig->nCol+2
b990: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
b9a0: 41 72 67 3d 3d 31 20 0a 20 20 20 20 20 20 7c 7c  Arg==1 .      ||
b9b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
b9c0: 79 70 65 28 61 70 56 61 6c 5b 31 5d 29 3d 3d 53  ype(apVal[1])==S
b9d0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 0a 20  QLITE_INTEGER . 
b9e0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
b9f0: 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
ba00: 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [1])==SQLITE_NUL
ba10: 4c 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  L .  );.  assert
ba20: 28 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2d  ( pTab->pConfig-
ba30: 3e 70 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a  >pzErrmsg==0 );.
ba40: 20 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2d    pTab->pConfig-
ba50: 3e 70 7a 45 72 72 6d 73 67 20 3d 20 26 70 54 61  >pzErrmsg = &pTa
ba60: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3b  b->base.zErrMsg;
ba70: 0a 0a 20 20 2f 2a 20 50 75 74 20 61 6e 79 20 61  ..  /* Put any a
ba80: 63 74 69 76 65 20 63 75 72 73 6f 72 73 20 69 6e  ctive cursors in
ba90: 74 6f 20 52 45 51 55 49 52 45 5f 53 45 45 4b 20  to REQUIRE_SEEK 
baa0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 66 74 73 35  state. */.  fts5
bab0: 54 72 69 70 43 75 72 73 6f 72 73 28 70 54 61 62  TripCursors(pTab
bac0: 29 3b 0a 0a 20 20 65 54 79 70 65 30 20 3d 20 73  );..  eType0 = s
bad0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
bae0: 65 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 69  e(apVal[0]);.  i
baf0: 66 28 20 65 54 79 70 65 30 3d 3d 53 51 4c 49 54  f( eType0==SQLIT
bb00: 45 5f 4e 55 4c 4c 20 0a 20 20 20 26 26 20 73 71  E_NULL .   && sq
bb10: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
bb20: 28 61 70 56 61 6c 5b 32 2b 70 43 6f 6e 66 69 67  (apVal[2+pConfig
bb30: 2d 3e 6e 43 6f 6c 5d 29 21 3d 53 51 4c 49 54 45  ->nCol])!=SQLITE
bb40: 5f 4e 55 4c 4c 20 0a 20 20 29 7b 0a 20 20 20 20  _NULL .  ){.    
bb50: 2f 2a 20 41 20 22 73 70 65 63 69 61 6c 22 20 49  /* A "special" I
bb60: 4e 53 45 52 54 20 6f 70 2e 20 54 68 65 73 65 20  NSERT op. These 
bb70: 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
bb80: 72 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 63  rately. */.    c
bb90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
bba0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
bbb0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
bbc0: 70 56 61 6c 5b 32 2b 70 43 6f 6e 66 69 67 2d 3e  pVal[2+pConfig->
bbd0: 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 69 66 28 20  nCol]);.    if( 
bbe0: 70 43 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e  pConfig->eConten
bbf0: 74 21 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f  t!=FTS5_CONTENT_
bc00: 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 26 26  NORMAL .      &&
bc10: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
bc20: 63 6d 70 28 22 64 65 6c 65 74 65 22 2c 20 7a 29  cmp("delete", z)
bc30: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72   .    ){.      r
bc40: 63 20 3d 20 66 74 73 35 53 70 65 63 69 61 6c 44  c = fts5SpecialD
bc50: 65 6c 65 74 65 28 70 54 61 62 2c 20 61 70 56 61  elete(pTab, apVa
bc60: 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  l, pRowid);.    
bc70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
bc80: 3d 20 66 74 73 35 53 70 65 63 69 61 6c 49 6e 73  = fts5SpecialIns
bc90: 65 72 74 28 70 54 61 62 2c 20 7a 2c 20 61 70 56  ert(pTab, z, apV
bca0: 61 6c 5b 32 20 2b 20 70 43 6f 6e 66 69 67 2d 3e  al[2 + pConfig->
bcb0: 6e 43 6f 6c 20 2b 20 31 5d 29 3b 0a 20 20 20 20  nCol + 1]);.    
bcc0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
bcd0: 2a 20 41 20 72 65 67 75 6c 61 72 20 49 4e 53 45  * A regular INSE
bce0: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
bcf0: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  LETE statement. 
bd00: 54 68 65 20 74 72 69 63 6b 20 68 65 72 65 20 69  The trick here i
bd10: 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6e  s that.    ** an
bd20: 79 20 63 6f 6e 66 6c 69 63 74 20 6f 6e 20 74 68  y conflict on th
bd30: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6d 75  e rowid value mu
bd40: 73 74 20 62 65 20 64 65 74 65 63 74 65 64 20 62  st be detected b
bd50: 65 66 6f 72 65 20 61 6e 79 20 0a 20 20 20 20 2a  efore any .    *
bd60: 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  * modifications 
bd70: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
bd80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
bd90: 68 65 72 65 20 61 72 65 20 34 20 63 61 73 65 73  here are 4 cases
bda0: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
bdb0: 20 20 31 29 20 44 45 4c 45 54 45 0a 20 20 20 20    1) DELETE.    
bdc0: 2a 2a 20 20 20 32 29 20 55 50 44 41 54 45 20 28  **   2) UPDATE (
bdd0: 72 6f 77 69 64 20 6e 6f 74 20 6d 6f 64 69 66 69  rowid not modifi
bde0: 65 64 29 0a 20 20 20 20 2a 2a 20 20 20 33 29 20  ed).    **   3) 
bdf0: 55 50 44 41 54 45 20 28 72 6f 77 69 64 20 6d 6f  UPDATE (rowid mo
be00: 64 69 66 69 65 64 29 0a 20 20 20 20 2a 2a 20 20  dified).    **  
be10: 20 34 29 20 49 4e 53 45 52 54 0a 20 20 20 20 2a   4) INSERT.    *
be20: 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 33  *.    ** Cases 3
be30: 20 61 6e 64 20 34 20 6d 61 79 20 76 69 6f 6c 61   and 4 may viola
be40: 74 65 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6e  te the rowid con
be50: 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 2a 2f 0a  straint..    */.
be60: 20 20 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63      int eConflic
be70: 74 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  t = SQLITE_ABORT
be80: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69  ;.    if( pConfi
be90: 67 2d 3e 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53  g->eContent==FTS
bea0: 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c  5_CONTENT_NORMAL
beb0: 20 29 7b 0a 20 20 20 20 20 20 65 43 6f 6e 66 6c   ){.      eConfl
bec0: 69 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 74  ict = sqlite3_vt
bed0: 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28 70  ab_on_conflict(p
bee0: 43 6f 6e 66 69 67 2d 3e 64 62 29 3b 0a 20 20 20  Config->db);.   
bef0: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
bf00: 65 54 79 70 65 30 3d 3d 53 51 4c 49 54 45 5f 49  eType0==SQLITE_I
bf10: 4e 54 45 47 45 52 20 7c 7c 20 65 54 79 70 65 30  NTEGER || eType0
bf20: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 3b  ==SQLITE_NULL );
bf30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72  .    assert( nAr
bf40: 67 21 3d 31 20 7c 7c 20 65 54 79 70 65 30 3d 3d  g!=1 || eType0==
bf50: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
bf60: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 74 65 72  ;..    /* Filter
bf70: 20 6f 75 74 20 61 74 74 65 6d 70 74 73 20 74 6f   out attempts to
bf80: 20 72 75 6e 20 55 50 44 41 54 45 20 6f 72 20 44   run UPDATE or D
bf90: 45 4c 45 54 45 20 6f 6e 20 63 6f 6e 74 65 6e 74  ELETE on content
bfa0: 6c 65 73 73 20 74 61 62 6c 65 73 2e 0a 20 20 20  less tables..   
bfb0: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
bfc0: 73 75 70 6f 72 74 65 64 2e 20 20 2a 2f 0a 20 20  suported.  */.  
bfd0: 20 20 69 66 28 20 65 54 79 70 65 30 3d 3d 53 51    if( eType0==SQ
bfe0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 26 26 20  LITE_INTEGER && 
bff0: 66 74 73 35 49 73 43 6f 6e 74 65 6e 74 6c 65 73  fts5IsContentles
c000: 73 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  s(pTab) ){.     
c010: 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72   pTab->base.zErr
c020: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
c030: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
c040: 20 22 63 61 6e 6e 6f 74 20 25 73 20 63 6f 6e 74   "cannot %s cont
c050: 65 6e 74 6c 65 73 73 20 66 74 73 35 20 74 61 62  entless fts5 tab
c060: 6c 65 3a 20 25 73 22 2c 20 0a 20 20 20 20 20 20  le: %s", .      
c070: 20 20 20 20 28 6e 41 72 67 3e 31 20 3f 20 22 55      (nArg>1 ? "U
c080: 50 44 41 54 45 22 20 3a 20 22 44 45 4c 45 54 45  PDATE" : "DELETE
c090: 20 66 72 6f 6d 22 29 2c 20 70 43 6f 6e 66 69 67   from"), pConfig
c0a0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
c0b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c0c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
c0d0: 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
c0e0: 44 45 4c 45 54 45 20 2a 2f 0a 20 20 20 20 65 6c  DELETE */.    el
c0f0: 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29  se if( nArg==1 )
c100: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
c110: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c120: 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29  _int64(apVal[0])
c130: 3b 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 64  ;  /* Rowid to d
c140: 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  elete */.      r
c150: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53  c = sqlite3Fts5S
c160: 74 6f 72 61 67 65 44 65 6c 65 74 65 28 70 54 61  torageDelete(pTa
c170: 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69 44 65  b->pStorage, iDe
c180: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  l);.    }..    /
c190: 2a 20 43 61 73 65 20 32 3a 20 49 4e 53 45 52 54  * Case 2: INSERT
c1a0: 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
c1b0: 20 65 54 79 70 65 30 21 3d 53 51 4c 49 54 45 5f   eType0!=SQLITE_
c1c0: 49 4e 54 45 47 45 52 20 29 7b 20 20 20 20 20 0a  INTEGER ){     .
c1d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
c1e0: 20 69 73 20 61 20 52 45 50 4c 41 43 45 2c 20 66   is a REPLACE, f
c1f0: 69 72 73 74 20 72 65 6d 6f 76 65 20 74 68 65 20  irst remove the 
c200: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 28 69  current entry (i
c210: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 20 20 20 20  f any) */.      
c220: 69 66 28 20 65 43 6f 6e 66 6c 69 63 74 3d 3d 53  if( eConflict==S
c230: 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 0a 20  QLITE_REPLACE . 
c240: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
c250: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
c260: 6c 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 49 4e  l[1])==SQLITE_IN
c270: 54 45 47 45 52 20 0a 20 20 20 20 20 20 29 7b 0a  TEGER .      ){.
c280: 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 77          i64 iNew
c290: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c2a0: 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 31 5d 29  _int64(apVal[1])
c2b0: 3b 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 64  ;  /* Rowid to d
c2c0: 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 20 20 20  elete */.       
c2d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
c2e0: 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 28 70  5StorageDelete(p
c2f0: 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69  Tab->pStorage, i
c300: 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
c310: 20 20 20 20 66 74 73 35 53 74 6f 72 61 67 65 49      fts5StorageI
c320: 6e 73 65 72 74 28 26 72 63 2c 20 70 54 61 62 2c  nsert(&rc, pTab,
c330: 20 61 70 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b   apVal, pRowid);
c340: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
c350: 61 73 65 20 32 3a 20 55 50 44 41 54 45 20 2a 2f  ase 2: UPDATE */
c360: 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
c370: 20 69 36 34 20 69 4f 6c 64 20 3d 20 73 71 6c 69   i64 iOld = sqli
c380: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
c390: 61 70 56 61 6c 5b 30 5d 29 3b 20 20 2f 2a 20 4f  apVal[0]);  /* O
c3a0: 6c 64 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  ld rowid */.    
c3b0: 20 20 69 36 34 20 69 4e 65 77 20 3d 20 73 71 6c    i64 iNew = sql
c3c0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
c3d0: 28 61 70 56 61 6c 5b 31 5d 29 3b 20 20 2f 2a 20  (apVal[1]);  /* 
c3e0: 4e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20  New rowid */.   
c3f0: 20 20 20 69 66 28 20 69 4f 6c 64 21 3d 69 4e 65     if( iOld!=iNe
c400: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  w ){.        if(
c410: 20 65 43 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49   eConflict==SQLI
c420: 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20  TE_REPLACE ){.  
c430: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c440: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44  ite3Fts5StorageD
c450: 65 6c 65 74 65 28 70 54 61 62 2d 3e 70 53 74 6f  elete(pTab->pSto
c460: 72 61 67 65 2c 20 69 4f 6c 64 29 3b 0a 20 20 20  rage, iOld);.   
c470: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
c480: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c490: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c4a0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44  ite3Fts5StorageD
c4b0: 65 6c 65 74 65 28 70 54 61 62 2d 3e 70 53 74 6f  elete(pTab->pSto
c4c0: 72 61 67 65 2c 20 69 4e 65 77 29 3b 0a 20 20 20  rage, iNew);.   
c4d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c4e0: 20 20 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e     fts5StorageIn
c4f0: 73 65 72 74 28 26 72 63 2c 20 70 54 61 62 2c 20  sert(&rc, pTab, 
c500: 61 70 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a  apVal, pRowid);.
c510: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c520: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
c530: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
c540: 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 28 70 54  ContentInsert(pT
c550: 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 61 70  ab->pStorage, ap
c560: 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20  Val, pRowid);.  
c570: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
c580: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c590: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
c5a0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
c5b0: 44 65 6c 65 74 65 28 70 54 61 62 2d 3e 70 53 74  Delete(pTab->pSt
c5c0: 6f 72 61 67 65 2c 20 69 4f 6c 64 29 3b 0a 20 20  orage, iOld);.  
c5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c5e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c5f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c600: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c610: 33 46 74 73 35 53 74 6f 72 61 67 65 49 6e 64 65  3Fts5StorageInde
c620: 78 49 6e 73 65 72 74 28 70 54 61 62 2d 3e 70 53  xInsert(pTab->pS
c630: 74 6f 72 61 67 65 2c 20 61 70 56 61 6c 2c 20 2a  torage, apVal, *
c640: 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  pRowid);.       
c650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
c660: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c670: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c680: 46 74 73 35 53 74 6f 72 61 67 65 44 65 6c 65 74  Fts5StorageDelet
c690: 65 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65  e(pTab->pStorage
c6a0: 2c 20 69 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20  , iOld);.       
c6b0: 20 66 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65   fts5StorageInse
c6c0: 72 74 28 26 72 63 2c 20 70 54 61 62 2c 20 61 70  rt(&rc, pTab, ap
c6d0: 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20  Val, pRowid);.  
c6e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c6f0: 0a 20 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67  .  pTab->pConfig
c700: 2d 3e 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a  ->pzErrmsg = 0;.
c710: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c720: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
c730: 74 69 6f 6e 20 6f 66 20 78 53 79 6e 63 28 29 20  tion of xSync() 
c740: 6d 65 74 68 6f 64 2e 20 0a 2a 2f 0a 73 74 61 74  method. .*/.stat
c750: 69 63 20 69 6e 74 20 66 74 73 35 53 79 6e 63 4d  ic int fts5SyncM
c760: 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74  ethod(sqlite3_vt
c770: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 6e  ab *pVtab){.  in
c780: 74 20 72 63 3b 0a 20 20 46 74 73 35 54 61 62 6c  t rc;.  Fts5Tabl
c790: 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54  e *pTab = (Fts5T
c7a0: 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 66  able*)pVtab;.  f
c7b0: 74 73 35 43 68 65 63 6b 54 72 61 6e 73 61 63 74  ts5CheckTransact
c7c0: 69 6f 6e 53 74 61 74 65 28 70 54 61 62 2c 20 46  ionState(pTab, F
c7d0: 54 53 35 5f 53 59 4e 43 2c 20 30 29 3b 0a 20 20  TS5_SYNC, 0);.  
c7e0: 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  pTab->pConfig->p
c7f0: 7a 45 72 72 6d 73 67 20 3d 20 26 70 54 61 62 2d  zErrmsg = &pTab-
c800: 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3b 0a 20  >base.zErrMsg;. 
c810: 20 66 74 73 35 54 72 69 70 43 75 72 73 6f 72 73   fts5TripCursors
c820: 28 70 54 61 62 29 3b 0a 20 20 72 63 20 3d 20 73  (pTab);.  rc = s
c830: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
c840: 65 53 79 6e 63 28 70 54 61 62 2d 3e 70 53 74 6f  eSync(pTab->pSto
c850: 72 61 67 65 2c 20 31 29 3b 0a 20 20 70 54 61 62  rage, 1);.  pTab
c860: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72  ->pConfig->pzErr
c870: 6d 73 67 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  msg = 0;.  retur
c880: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
c890: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
c8a0: 20 78 42 65 67 69 6e 28 29 20 6d 65 74 68 6f 64   xBegin() method
c8b0: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
c8c0: 20 66 74 73 35 42 65 67 69 6e 4d 65 74 68 6f 64   fts5BeginMethod
c8d0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
c8e0: 56 74 61 62 29 7b 0a 20 20 66 74 73 35 43 68 65  Vtab){.  fts5Che
c8f0: 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61  ckTransactionSta
c900: 74 65 28 28 46 74 73 35 54 61 62 6c 65 2a 29 70  te((Fts5Table*)p
c910: 56 74 61 62 2c 20 46 54 53 35 5f 42 45 47 49 4e  Vtab, FTS5_BEGIN
c920: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
c930: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c940: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
c950: 6e 20 6f 66 20 78 43 6f 6d 6d 69 74 28 29 20 6d  n of xCommit() m
c960: 65 74 68 6f 64 2e 20 54 68 69 73 20 69 73 20 61  ethod. This is a
c970: 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 63 6f 6e 74   no-op. The cont
c980: 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70  ents of.** the p
c990: 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73  ending-terms has
c9a0: 68 2d 74 61 62 6c 65 20 68 61 76 65 20 61 6c 72  h-table have alr
c9b0: 65 61 64 79 20 62 65 65 6e 20 66 6c 75 73 68 65  eady been flushe
c9c0: 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  d into the datab
c9d0: 61 73 65 0a 2a 2a 20 62 79 20 66 74 73 35 53 79  ase.** by fts5Sy
c9e0: 6e 63 4d 65 74 68 6f 64 28 29 2e 0a 2a 2f 0a 73  ncMethod()..*/.s
c9f0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f  tatic int fts5Co
ca00: 6d 6d 69 74 4d 65 74 68 6f 64 28 73 71 6c 69 74  mmitMethod(sqlit
ca10: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
ca20: 0a 20 20 66 74 73 35 43 68 65 63 6b 54 72 61 6e  .  fts5CheckTran
ca30: 73 61 63 74 69 6f 6e 53 74 61 74 65 28 28 46 74  sactionState((Ft
ca40: 73 35 54 61 62 6c 65 2a 29 70 56 74 61 62 2c 20  s5Table*)pVtab, 
ca50: 46 54 53 35 5f 43 4f 4d 4d 49 54 2c 20 30 29 3b  FTS5_COMMIT, 0);
ca60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ca70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
ca80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
ca90: 78 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 44 69 73  xRollback(). Dis
caa0: 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
cab0: 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
cac0: 2d 74 65 72 6d 73 0a 2a 2a 20 68 61 73 68 2d 74  -terms.** hash-t
cad0: 61 62 6c 65 2e 20 41 6e 79 20 63 68 61 6e 67 65  able. Any change
cae0: 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
caf0: 74 61 62 61 73 65 20 61 72 65 20 72 65 76 65 72  tabase are rever
cb00: 74 65 64 20 62 79 20 53 51 4c 69 74 65 2e 0a 2a  ted by SQLite..*
cb10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
cb20: 35 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 28  5RollbackMethod(
cb30: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
cb40: 74 61 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  tab){.  int rc;.
cb50: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
cb60: 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
cb70: 70 56 74 61 62 3b 0a 20 20 66 74 73 35 43 68 65  pVtab;.  fts5Che
cb80: 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61  ckTransactionSta
cb90: 74 65 28 70 54 61 62 2c 20 46 54 53 35 5f 52 4f  te(pTab, FTS5_RO
cba0: 4c 4c 42 41 43 4b 2c 20 30 29 3b 0a 20 20 72 63  LLBACK, 0);.  rc
cbb0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
cbc0: 6f 72 61 67 65 52 6f 6c 6c 62 61 63 6b 28 70 54  orageRollback(pT
cbd0: 61 62 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a 20  ab->pStorage);. 
cbe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
cbf0: 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35  tatic void *fts5
cc00: 41 70 69 55 73 65 72 44 61 74 61 28 46 74 73 35  ApiUserData(Fts5
cc10: 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  Context *pCtx){.
cc20: 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43    Fts5Cursor *pC
cc30: 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72  sr = (Fts5Cursor
cc40: 2a 29 70 43 74 78 3b 0a 20 20 72 65 74 75 72 6e  *)pCtx;.  return
cc50: 20 70 43 73 72 2d 3e 70 41 75 78 2d 3e 70 55 73   pCsr->pAux->pUs
cc60: 65 72 44 61 74 61 3b 0a 7d 0a 0a 73 74 61 74 69  erData;.}..stati
cc70: 63 20 69 6e 74 20 66 74 73 35 41 70 69 43 6f 6c  c int fts5ApiCol
cc80: 75 6d 6e 43 6f 75 6e 74 28 46 74 73 35 43 6f 6e  umnCount(Fts5Con
cc90: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 46  text *pCtx){.  F
cca0: 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts5Cursor *pCsr 
ccb0: 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70  = (Fts5Cursor*)p
ccc0: 43 74 78 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  Ctx;.  return ((
ccd0: 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72  Fts5Table*)(pCsr
cce0: 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 29 2d 3e  ->base.pVtab))->
ccf0: 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 7d  pConfig->nCol;.}
cd00: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
cd10: 35 41 70 69 43 6f 6c 75 6d 6e 54 6f 74 61 6c 53  5ApiColumnTotalS
cd20: 69 7a 65 28 0a 20 20 46 74 73 35 43 6f 6e 74 65  ize(.  Fts5Conte
cd30: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
cd40: 20 69 43 6f 6c 2c 20 0a 20 20 73 71 6c 69 74 65   iCol, .  sqlite
cd50: 33 5f 69 6e 74 36 34 20 2a 70 6e 54 6f 6b 65 6e  3_int64 *pnToken
cd60: 0a 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72  .){.  Fts5Cursor
cd70: 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75   *pCsr = (Fts5Cu
cd80: 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46 74  rsor*)pCtx;.  Ft
cd90: 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  s5Table *pTab = 
cda0: 28 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73  (Fts5Table*)(pCs
cdb0: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a  r->base.pVtab);.
cdc0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
cdd0: 46 74 73 35 53 74 6f 72 61 67 65 53 69 7a 65 28  Fts5StorageSize(
cde0: 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20  pTab->pStorage, 
cdf0: 69 43 6f 6c 2c 20 70 6e 54 6f 6b 65 6e 29 3b 0a  iCol, pnToken);.
ce00: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
ce10: 73 35 41 70 69 52 6f 77 43 6f 75 6e 74 28 46 74  s5ApiRowCount(Ft
ce20: 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  s5Context *pCtx,
ce30: 20 69 36 34 20 2a 70 6e 52 6f 77 29 7b 0a 20 20   i64 *pnRow){.  
ce40: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
ce50: 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29   = (Fts5Cursor*)
ce60: 70 43 74 78 3b 0a 20 20 46 74 73 35 54 61 62 6c  pCtx;.  Fts5Tabl
ce70: 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54  e *pTab = (Fts5T
ce80: 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73  able*)(pCsr->bas
ce90: 65 2e 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75  e.pVtab);.  retu
cea0: 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  rn sqlite3Fts5St
ceb0: 6f 72 61 67 65 52 6f 77 43 6f 75 6e 74 28 70 54  orageRowCount(pT
cec0: 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 70 6e  ab->pStorage, pn
ced0: 52 6f 77 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Row);.}..static 
cee0: 69 6e 74 20 66 74 73 35 41 70 69 54 6f 6b 65 6e  int fts5ApiToken
cef0: 69 7a 65 28 0a 20 20 46 74 73 35 43 6f 6e 74 65  ize(.  Fts5Conte
cf00: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e  xt *pCtx, .  con
cf10: 73 74 20 63 68 61 72 20 2a 70 54 65 78 74 2c 20  st char *pText, 
cf20: 69 6e 74 20 6e 54 65 78 74 2c 20 0a 20 20 76 6f  int nText, .  vo
cf30: 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20  id *pUserData,. 
cf40: 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76   int (*xToken)(v
cf50: 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74  oid*, int, const
cf60: 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e 74   char*, int, int
cf70: 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 46 74 73 35  , int).){.  Fts5
cf80: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
cf90: 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78  Fts5Cursor*)pCtx
cfa0: 3b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70  ;.  Fts5Table *p
cfb0: 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65  Tab = (Fts5Table
cfc0: 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e 70 56  *)(pCsr->base.pV
cfd0: 74 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  tab);.  return s
cfe0: 71 6c 69 74 65 33 46 74 73 35 54 6f 6b 65 6e 69  qlite3Fts5Tokeni
cff0: 7a 65 28 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ze(.      pTab->
d000: 70 43 6f 6e 66 69 67 2c 20 46 54 53 35 5f 54 4f  pConfig, FTS5_TO
d010: 4b 45 4e 49 5a 45 5f 41 55 58 2c 20 70 54 65 78  KENIZE_AUX, pTex
d020: 74 2c 20 6e 54 65 78 74 2c 20 70 55 73 65 72 44  t, nText, pUserD
d030: 61 74 61 2c 20 78 54 6f 6b 65 6e 0a 20 20 29 3b  ata, xToken.  );
d040: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
d050: 74 73 35 41 70 69 50 68 72 61 73 65 43 6f 75 6e  ts5ApiPhraseCoun
d060: 74 28 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70  t(Fts5Context *p
d070: 43 74 78 29 7b 0a 20 20 46 74 73 35 43 75 72 73  Ctx){.  Fts5Curs
d080: 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35  or *pCsr = (Fts5
d090: 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20  Cursor*)pCtx;.  
d0a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
d0b0: 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 75 6e  s5ExprPhraseCoun
d0c0: 74 28 70 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a  t(pCsr->pExpr);.
d0d0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
d0e0: 73 35 41 70 69 50 68 72 61 73 65 53 69 7a 65 28  s5ApiPhraseSize(
d0f0: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
d100: 78 2c 20 69 6e 74 20 69 50 68 72 61 73 65 29 7b  x, int iPhrase){
d110: 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70  .  Fts5Cursor *p
d120: 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f  Csr = (Fts5Curso
d130: 72 2a 29 70 43 74 78 3b 0a 20 20 72 65 74 75 72  r*)pCtx;.  retur
d140: 6e 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  n sqlite3Fts5Exp
d150: 72 50 68 72 61 73 65 53 69 7a 65 28 70 43 73 72  rPhraseSize(pCsr
d160: 2d 3e 70 45 78 70 72 2c 20 69 50 68 72 61 73 65  ->pExpr, iPhrase
d170: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
d180: 20 66 74 73 35 43 73 72 50 6f 73 6c 69 73 74 28   fts5CsrPoslist(
d190: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
d1a0: 2c 20 69 6e 74 20 69 50 68 72 61 73 65 2c 20 63  , int iPhrase, c
d1b0: 6f 6e 73 74 20 75 38 20 2a 2a 70 61 29 7b 0a 20  onst u8 **pa){. 
d1c0: 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70 43   int n;.  if( pC
d1d0: 73 72 2d 3e 70 53 6f 72 74 65 72 20 29 7b 0a 20  sr->pSorter ){. 
d1e0: 20 20 20 46 74 73 35 53 6f 72 74 65 72 20 2a 70     Fts5Sorter *p
d1f0: 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d 3e 70  Sorter = pCsr->p
d200: 53 6f 72 74 65 72 3b 0a 20 20 20 20 69 6e 74 20  Sorter;.    int 
d210: 69 31 20 3d 20 28 69 50 68 72 61 73 65 3d 3d 30  i1 = (iPhrase==0
d220: 20 3f 20 30 20 3a 20 70 53 6f 72 74 65 72 2d 3e   ? 0 : pSorter->
d230: 61 49 64 78 5b 69 50 68 72 61 73 65 2d 31 5d 29  aIdx[iPhrase-1])
d240: 3b 0a 20 20 20 20 6e 20 3d 20 70 53 6f 72 74 65  ;.    n = pSorte
d250: 72 2d 3e 61 49 64 78 5b 69 50 68 72 61 73 65 5d  r->aIdx[iPhrase]
d260: 20 2d 20 69 31 3b 0a 20 20 20 20 2a 70 61 20 3d   - i1;.    *pa =
d270: 20 26 70 53 6f 72 74 65 72 2d 3e 61 50 6f 73 6c   &pSorter->aPosl
d280: 69 73 74 5b 69 31 5d 3b 0a 20 20 7d 65 6c 73 65  ist[i1];.  }else
d290: 7b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  {.    n = sqlite
d2a0: 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73 74  3Fts5ExprPoslist
d2b0: 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 69 50  (pCsr->pExpr, iP
d2c0: 68 72 61 73 65 2c 20 70 61 29 3b 0a 20 20 7d 0a  hrase, pa);.  }.
d2d0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
d2e0: 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
d2f0: 20 74 68 65 20 46 74 73 35 43 75 72 73 6f 72 2e   the Fts5Cursor.
d300: 6e 49 6e 73 74 43 6f 75 6e 74 20 61 6e 64 20 61  nInstCount and a
d310: 49 6e 73 74 5b 5d 20 76 61 72 69 61 62 6c 65 73  Inst[] variables
d320: 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 0a 2a   are populated.*
d330: 2a 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20  * correctly for 
d340: 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 65 77  the current view
d350: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
d360: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
d370: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74  , or an.** SQLit
d380: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
d390: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
d3a0: 63 20 69 6e 74 20 66 74 73 35 43 61 63 68 65 49  c int fts5CacheI
d3b0: 6e 73 74 41 72 72 61 79 28 46 74 73 35 43 75 72  nstArray(Fts5Cur
d3c0: 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
d3d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d3e0: 3b 0a 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52  ;.  Fts5PoslistR
d3f0: 65 61 64 65 72 20 2a 61 49 74 65 72 3b 20 20 20  eader *aIter;   
d400: 20 20 20 20 2f 2a 20 4f 6e 65 20 69 74 65 72 61      /* One itera
d410: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 70 68 72  tor for each phr
d420: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 74  ase */.  int nIt
d430: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
d440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d450: 65 72 20 6f 66 20 69 74 65 72 61 74 6f 72 73 2f  er of iterators/
d460: 70 68 72 61 73 65 73 20 2a 2f 0a 20 20 0a 20 20  phrases */.  .  
d470: 6e 49 74 65 72 20 3d 20 73 71 6c 69 74 65 33 46  nIter = sqlite3F
d480: 74 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 75  ts5ExprPhraseCou
d490: 6e 74 28 70 43 73 72 2d 3e 70 45 78 70 72 29 3b  nt(pCsr->pExpr);
d4a0: 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 49 6e  .  if( pCsr->aIn
d4b0: 73 74 49 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  stIter==0 ){.   
d4c0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
d4d0: 65 6f 66 28 46 74 73 35 50 6f 73 6c 69 73 74 52  eof(Fts5PoslistR
d4e0: 65 61 64 65 72 29 20 2a 20 6e 49 74 65 72 3b 0a  eader) * nIter;.
d4f0: 20 20 20 20 70 43 73 72 2d 3e 61 49 6e 73 74 49      pCsr->aInstI
d500: 74 65 72 20 3d 20 28 46 74 73 35 50 6f 73 6c 69  ter = (Fts5Posli
d510: 73 74 52 65 61 64 65 72 2a 29 73 71 6c 69 74 65  stReader*)sqlite
d520: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
d530: 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  &rc, nByte);.  }
d540: 0a 20 20 61 49 74 65 72 20 3d 20 70 43 73 72 2d  .  aIter = pCsr-
d550: 3e 61 49 6e 73 74 49 74 65 72 3b 0a 0a 20 20 69  >aInstIter;..  i
d560: 66 28 20 61 49 74 65 72 20 29 7b 0a 20 20 20 20  f( aIter ){.    
d570: 69 6e 74 20 6e 49 6e 73 74 20 3d 20 30 3b 20 20  int nInst = 0;  
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d590: 20 4e 75 6d 62 65 72 20 69 6e 73 74 61 6e 63 65   Number instance
d5a0: 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  s seen so far */
d5b0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
d5c0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61   /* Initialize a
d5d0: 6c 6c 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a  ll iterators */.
d5e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d5f0: 49 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Iter; i++){.    
d600: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 0a 20    const u8 *a;. 
d610: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 66 74 73       int n = fts
d620: 35 43 73 72 50 6f 73 6c 69 73 74 28 70 43 73 72  5CsrPoslist(pCsr
d630: 2c 20 69 2c 20 26 61 29 3b 0a 20 20 20 20 20 20  , i, &a);.      
d640: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
d650: 73 74 52 65 61 64 65 72 49 6e 69 74 28 61 2c 20  stReaderInit(a, 
d660: 6e 2c 20 26 61 49 74 65 72 5b 69 5d 29 3b 0a 20  n, &aIter[i]);. 
d670: 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28     }..    while(
d680: 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   1 ){.      int 
d690: 2a 61 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e  *aInst;.      in
d6a0: 74 20 69 42 65 73 74 20 3d 20 2d 31 3b 0a 20 20  t iBest = -1;.  
d6b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d6c0: 49 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Iter; i++){.    
d6d0: 20 20 20 20 69 66 28 20 28 61 49 74 65 72 5b 69      if( (aIter[i
d6e0: 5d 2e 62 45 6f 66 3d 3d 30 29 20 0a 20 20 20 20  ].bEof==0) .    
d6f0: 20 20 20 20 20 26 26 20 28 69 42 65 73 74 3c 30       && (iBest<0
d700: 20 7c 7c 20 61 49 74 65 72 5b 69 5d 2e 69 50 6f   || aIter[i].iPo
d710: 73 3c 61 49 74 65 72 5b 69 42 65 73 74 5d 2e 69  s<aIter[iBest].i
d720: 50 6f 73 29 20 0a 20 20 20 20 20 20 20 20 29 7b  Pos) .        ){
d730: 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74  .          iBest
d740: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = i;.        }.
d750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d760: 28 20 69 42 65 73 74 3c 30 20 29 20 62 72 65 61  ( iBest<0 ) brea
d770: 6b 3b 0a 0a 20 20 20 20 20 20 6e 49 6e 73 74 2b  k;..      nInst+
d780: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 49 6e  +;.      if( nIn
d790: 73 74 3e 3d 70 43 73 72 2d 3e 6e 49 6e 73 74 41  st>=pCsr->nInstA
d7a0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
d7b0: 70 43 73 72 2d 3e 6e 49 6e 73 74 41 6c 6c 6f 63  pCsr->nInstAlloc
d7c0: 20 3d 20 70 43 73 72 2d 3e 6e 49 6e 73 74 41 6c   = pCsr->nInstAl
d7d0: 6c 6f 63 20 3f 20 70 43 73 72 2d 3e 6e 49 6e 73  loc ? pCsr->nIns
d7e0: 74 41 6c 6c 6f 63 2a 32 20 3a 20 33 32 3b 0a 20  tAlloc*2 : 32;. 
d7f0: 20 20 20 20 20 20 20 61 49 6e 73 74 20 3d 20 28         aInst = (
d800: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
d810: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
d820: 20 20 70 43 73 72 2d 3e 61 49 6e 73 74 2c 20 70    pCsr->aInst, p
d830: 43 73 72 2d 3e 6e 49 6e 73 74 41 6c 6c 6f 63 2a  Csr->nInstAlloc*
d840: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 33 0a 20 20  sizeof(int)*3.  
d850: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
d860: 20 69 66 28 20 61 49 6e 73 74 20 29 7b 0a 20 20   if( aInst ){.  
d870: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 49          pCsr->aI
d880: 6e 73 74 20 3d 20 61 49 6e 73 74 3b 0a 20 20 20  nst = aInst;.   
d890: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d8a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d8b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
d8c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d8d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
d8e0: 20 20 20 61 49 6e 73 74 20 3d 20 26 70 43 73 72     aInst = &pCsr
d8f0: 2d 3e 61 49 6e 73 74 5b 33 20 2a 20 28 6e 49 6e  ->aInst[3 * (nIn
d900: 73 74 2d 31 29 5d 3b 0a 20 20 20 20 20 20 61 49  st-1)];.      aI
d910: 6e 73 74 5b 30 5d 20 3d 20 69 42 65 73 74 3b 0a  nst[0] = iBest;.
d920: 20 20 20 20 20 20 61 49 6e 73 74 5b 31 5d 20 3d        aInst[1] =
d930: 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
d940: 28 61 49 74 65 72 5b 69 42 65 73 74 5d 2e 69 50  (aIter[iBest].iP
d950: 6f 73 29 3b 0a 20 20 20 20 20 20 61 49 6e 73 74  os);.      aInst
d960: 5b 32 5d 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f  [2] = FTS5_POS2O
d970: 46 46 53 45 54 28 61 49 74 65 72 5b 69 42 65 73  FFSET(aIter[iBes
d980: 74 5d 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  t].iPos);.      
d990: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
d9a0: 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 61 49  stReaderNext(&aI
d9b0: 74 65 72 5b 69 42 65 73 74 5d 29 3b 0a 20 20 20  ter[iBest]);.   
d9c0: 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 49   }..    pCsr->nI
d9d0: 6e 73 74 43 6f 75 6e 74 20 3d 20 6e 49 6e 73 74  nstCount = nInst
d9e0: 3b 0a 20 20 20 20 43 73 72 46 6c 61 67 43 6c 65  ;.    CsrFlagCle
d9f0: 61 72 28 70 43 73 72 2c 20 46 54 53 35 43 53 52  ar(pCsr, FTS5CSR
da00: 5f 52 45 51 55 49 52 45 5f 49 4e 53 54 29 3b 0a  _REQUIRE_INST);.
da10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
da20: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
da30: 74 73 35 41 70 69 49 6e 73 74 43 6f 75 6e 74 28  ts5ApiInstCount(
da40: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
da50: 78 2c 20 69 6e 74 20 2a 70 6e 49 6e 73 74 29 7b  x, int *pnInst){
da60: 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70  .  Fts5Cursor *p
da70: 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f  Csr = (Fts5Curso
da80: 72 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72  r*)pCtx;.  int r
da90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
daa0: 20 69 66 28 20 43 73 72 46 6c 61 67 54 65 73 74   if( CsrFlagTest
dab0: 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 52  (pCsr, FTS5CSR_R
dac0: 45 51 55 49 52 45 5f 49 4e 53 54 29 3d 3d 30 20  EQUIRE_INST)==0 
dad0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
dae0: 3d 3d 28 72 63 20 3d 20 66 74 73 35 43 61 63 68  ==(rc = fts5Cach
daf0: 65 49 6e 73 74 41 72 72 61 79 28 70 43 73 72 29  eInstArray(pCsr)
db00: 29 20 29 7b 0a 20 20 20 20 2a 70 6e 49 6e 73 74  ) ){.    *pnInst
db10: 20 3d 20 70 43 73 72 2d 3e 6e 49 6e 73 74 43 6f   = pCsr->nInstCo
db20: 75 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  unt;.  }.  retur
db30: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
db40: 69 6e 74 20 66 74 73 35 41 70 69 49 6e 73 74 28  int fts5ApiInst(
db50: 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a  .  Fts5Context *
db60: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 69 49 64  pCtx, .  int iId
db70: 78 2c 20 0a 20 20 69 6e 74 20 2a 70 69 50 68 72  x, .  int *piPhr
db80: 61 73 65 2c 20 0a 20 20 69 6e 74 20 2a 70 69 43  ase, .  int *piC
db90: 6f 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69 4f 66  ol, .  int *piOf
dba0: 66 0a 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f  f.){.  Fts5Curso
dbb0: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43  r *pCsr = (Fts5C
dbc0: 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 69  ursor*)pCtx;.  i
dbd0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dbe0: 4b 3b 0a 20 20 69 66 28 20 43 73 72 46 6c 61 67  K;.  if( CsrFlag
dbf0: 54 65 73 74 28 70 43 73 72 2c 20 46 54 53 35 43  Test(pCsr, FTS5C
dc00: 53 52 5f 52 45 51 55 49 52 45 5f 49 4e 53 54 29  SR_REQUIRE_INST)
dc10: 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ==0 .   || SQLIT
dc20: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 66 74 73 35  E_OK==(rc = fts5
dc30: 43 61 63 68 65 49 6e 73 74 41 72 72 61 79 28 70  CacheInstArray(p
dc40: 43 73 72 29 29 20 0a 20 20 29 7b 0a 20 20 20 20  Csr)) .  ){.    
dc50: 69 66 28 20 69 49 64 78 3c 30 20 7c 7c 20 69 49  if( iIdx<0 || iI
dc60: 64 78 3e 3d 70 43 73 72 2d 3e 6e 49 6e 73 74 43  dx>=pCsr->nInstC
dc70: 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  ount ){.      rc
dc80: 20 3d 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3b   = SQLITE_RANGE;
dc90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dca0: 20 20 2a 70 69 50 68 72 61 73 65 20 3d 20 70 43    *piPhrase = pC
dcb0: 73 72 2d 3e 61 49 6e 73 74 5b 69 49 64 78 2a 33  sr->aInst[iIdx*3
dcc0: 5d 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  ];.      *piCol 
dcd0: 3d 20 70 43 73 72 2d 3e 61 49 6e 73 74 5b 69 49  = pCsr->aInst[iI
dce0: 64 78 2a 33 20 2b 20 31 5d 3b 0a 20 20 20 20 20  dx*3 + 1];.     
dcf0: 20 2a 70 69 4f 66 66 20 3d 20 70 43 73 72 2d 3e   *piOff = pCsr->
dd00: 61 49 6e 73 74 5b 69 49 64 78 2a 33 20 2b 20 32  aInst[iIdx*3 + 2
dd10: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  ];.    }.  }.  r
dd20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
dd30: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  tic sqlite3_int6
dd40: 34 20 66 74 73 35 41 70 69 52 6f 77 69 64 28 46  4 fts5ApiRowid(F
dd50: 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ts5Context *pCtx
dd60: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ){.  return fts5
dd70: 43 75 72 73 6f 72 52 6f 77 69 64 28 28 46 74 73  CursorRowid((Fts
dd80: 35 43 75 72 73 6f 72 2a 29 70 43 74 78 29 3b 0a  5Cursor*)pCtx);.
dd90: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
dda0: 73 35 41 70 69 43 6f 6c 75 6d 6e 54 65 78 74 28  s5ApiColumnText(
ddb0: 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a  .  Fts5Context *
ddc0: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 69 43 6f  pCtx, .  int iCo
ddd0: 6c 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l, .  const char
dde0: 20 2a 2a 70 7a 2c 20 0a 20 20 69 6e 74 20 2a 70   **pz, .  int *p
ddf0: 6e 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  n.){.  int rc = 
de00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
de10: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  5Cursor *pCsr = 
de20: 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74  (Fts5Cursor*)pCt
de30: 78 3b 0a 20 20 69 66 28 20 66 74 73 35 49 73 43  x;.  if( fts5IsC
de40: 6f 6e 74 65 6e 74 6c 65 73 73 28 28 46 74 73 35  ontentless((Fts5
de50: 54 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61  Table*)(pCsr->ba
de60: 73 65 2e 70 56 74 61 62 29 29 20 29 7b 0a 20 20  se.pVtab)) ){.  
de70: 20 20 2a 70 7a 20 3d 20 30 3b 0a 20 20 20 20 2a    *pz = 0;.    *
de80: 70 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  pn = 0;.  }else{
de90: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 53 65  .    rc = fts5Se
dea0: 65 6b 43 75 72 73 6f 72 28 70 43 73 72 2c 20 30  ekCursor(pCsr, 0
deb0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
dec0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ded0: 20 20 2a 70 7a 20 3d 20 28 63 6f 6e 73 74 20 63    *pz = (const c
dee0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
def0: 75 6d 6e 5f 74 65 78 74 28 70 43 73 72 2d 3e 70  umn_text(pCsr->p
df00: 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20  Stmt, iCol+1);. 
df10: 20 20 20 20 20 2a 70 6e 20 3d 20 73 71 6c 69 74       *pn = sqlit
df20: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
df30: 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 69 43 6f  pCsr->pStmt, iCo
df40: 6c 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l+1);.    }.  }.
df50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
df60: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43  static int fts5C
df70: 6f 6c 75 6d 6e 53 69 7a 65 43 62 28 0a 20 20 76  olumnSizeCb(.  v
df80: 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20  oid *pContext,  
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dfa0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e 74  * Pointer to int
dfb0: 20 2a 2f 0a 20 20 69 6e 74 20 74 66 6c 61 67 73   */.  int tflags
dfc0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
dfd0: 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  pToken,         
dfe0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
dff0: 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a  ntaining token *
e000: 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  /.  int nToken, 
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
e030: 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  oken in bytes */
e040: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 66 73     /* Start offs
e070: 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0a 20  et of token */. 
e080: 20 69 6e 74 20 69 45 6e 64 20 20 20 20 20 20 20   int iEnd       
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 2f 2a 20 45 6e 64 20 6f 66 66 73 65 74 20 6f   /* End offset o
e0b0: 66 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20  f token */.){.  
e0c0: 69 6e 74 20 2a 70 43 6e 74 20 3d 20 28 69 6e 74  int *pCnt = (int
e0d0: 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66  *)pContext;.  if
e0e0: 28 20 28 74 66 6c 61 67 73 20 26 20 46 54 53 35  ( (tflags & FTS5
e0f0: 5f 54 4f 4b 45 4e 5f 43 4f 4c 4f 43 41 54 45 44  _TOKEN_COLOCATED
e100: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 28 2a 70 43  )==0 ){.    (*pC
e110: 6e 74 29 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  nt)++;.  }.  ret
e120: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e130: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
e140: 35 41 70 69 43 6f 6c 75 6d 6e 53 69 7a 65 28 46  5ApiColumnSize(F
e150: 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ts5Context *pCtx
e160: 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
e170: 2a 70 6e 54 6f 6b 65 6e 29 7b 0a 20 20 46 74 73  *pnToken){.  Fts
e180: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  5Cursor *pCsr = 
e190: 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74  (Fts5Cursor*)pCt
e1a0: 78 3b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a  x;.  Fts5Table *
e1b0: 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c  pTab = (Fts5Tabl
e1c0: 65 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e 70  e*)(pCsr->base.p
e1d0: 56 74 61 62 29 3b 0a 20 20 46 74 73 35 43 6f 6e  Vtab);.  Fts5Con
e1e0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
e1f0: 54 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  Tab->pConfig;.  
e200: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e210: 4f 4b 3b 0a 0a 20 20 69 66 28 20 43 73 72 46 6c  OK;..  if( CsrFl
e220: 61 67 54 65 73 74 28 70 43 73 72 2c 20 46 54 53  agTest(pCsr, FTS
e230: 35 43 53 52 5f 52 45 51 55 49 52 45 5f 44 4f 43  5CSR_REQUIRE_DOC
e240: 53 49 5a 45 29 20 29 7b 0a 20 20 20 20 69 66 28  SIZE) ){.    if(
e250: 20 70 43 6f 6e 66 69 67 2d 3e 62 43 6f 6c 75 6d   pConfig->bColum
e260: 6e 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  nsize ){.      i
e270: 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
e280: 43 75 72 73 6f 72 52 6f 77 69 64 28 70 43 73 72  CursorRowid(pCsr
e290: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
e2a0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
e2b0: 44 6f 63 73 69 7a 65 28 70 54 61 62 2d 3e 70 53  Docsize(pTab->pS
e2c0: 74 6f 72 61 67 65 2c 20 69 52 6f 77 69 64 2c 20  torage, iRowid, 
e2d0: 70 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53 69 7a  pCsr->aColumnSiz
e2e0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
e2f0: 28 20 70 43 6f 6e 66 69 67 2d 3e 7a 43 6f 6e 74  ( pConfig->zCont
e300: 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent==0 ){.      
e310: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
e320: 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
e330: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
e340: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67       if( pConfig
e350: 2d 3e 61 62 55 6e 69 6e 64 65 78 65 64 5b 69 5d  ->abUnindexed[i]
e360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e370: 20 70 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53 69   pCsr->aColumnSi
e380: 7a 65 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  ze[i] = -1;.    
e390: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e3a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
e3b0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
e3c0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e3d0: 4f 4b 20 26 26 20 69 3c 70 43 6f 6e 66 69 67 2d  OK && i<pConfig-
e3e0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
e3f0: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67       if( pConfig
e400: 2d 3e 61 62 55 6e 69 6e 64 65 78 65 64 5b 69 5d  ->abUnindexed[i]
e410: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20   const char *z; 
e430: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  int n;.         
e440: 20 76 6f 69 64 20 2a 70 20 3d 20 28 76 6f 69 64   void *p = (void
e450: 2a 29 28 26 70 43 73 72 2d 3e 61 43 6f 6c 75 6d  *)(&pCsr->aColum
e460: 6e 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20  nSize[i]);.     
e470: 20 20 20 20 20 70 43 73 72 2d 3e 61 43 6f 6c 75       pCsr->aColu
e480: 6d 6e 53 69 7a 65 5b 69 5d 20 3d 20 30 3b 0a 20  mnSize[i] = 0;. 
e490: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74           rc = ft
e4a0: 73 35 41 70 69 43 6f 6c 75 6d 6e 54 65 78 74 28  s5ApiColumnText(
e4b0: 70 43 74 78 2c 20 69 2c 20 26 7a 2c 20 26 6e 29  pCtx, i, &z, &n)
e4c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e4d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e4e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
e4f0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b  = sqlite3Fts5Tok
e500: 65 6e 69 7a 65 28 0a 20 20 20 20 20 20 20 20 20  enize(.         
e510: 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2c 20         pConfig, 
e520: 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45 5f 41 55  FTS5_TOKENIZE_AU
e530: 58 2c 20 7a 2c 20 6e 2c 20 70 2c 20 66 74 73 35  X, z, n, p, fts5
e540: 43 6f 6c 75 6d 6e 53 69 7a 65 43 62 0a 20 20 20  ColumnSizeCb.   
e550: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
e560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e570: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
e580: 20 20 20 20 43 73 72 46 6c 61 67 43 6c 65 61 72      CsrFlagClear
e590: 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 52  (pCsr, FTS5CSR_R
e5a0: 45 51 55 49 52 45 5f 44 4f 43 53 49 5a 45 29 3b  EQUIRE_DOCSIZE);
e5b0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c  .  }.  if( iCol<
e5c0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
e5d0: 20 20 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 30      *pnToken = 0
e5e0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
e5f0: 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 20  <pConfig->nCol; 
e600: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 70 6e 54  i++){.      *pnT
e610: 6f 6b 65 6e 20 2b 3d 20 70 43 73 72 2d 3e 61 43  oken += pCsr->aC
e620: 6f 6c 75 6d 6e 53 69 7a 65 5b 69 5d 3b 0a 20 20  olumnSize[i];.  
e630: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
e640: 69 43 6f 6c 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43  iCol<pConfig->nC
e650: 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 54 6f 6b  ol ){.    *pnTok
e660: 65 6e 20 3d 20 70 43 73 72 2d 3e 61 43 6f 6c 75  en = pCsr->aColu
e670: 6d 6e 53 69 7a 65 5b 69 43 6f 6c 5d 3b 0a 20 20  mnSize[iCol];.  
e680: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 54 6f  }else{.    *pnTo
e690: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ken = 0;.    rc 
e6a0: 3d 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3b 0a  = SQLITE_RANGE;.
e6b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
e6d0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
e6e0: 78 53 65 74 41 75 78 64 61 74 61 28 29 20 6d 65  xSetAuxdata() me
e6f0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
e700: 69 6e 74 20 66 74 73 35 41 70 69 53 65 74 41 75  int fts5ApiSetAu
e710: 78 64 61 74 61 28 0a 20 20 46 74 73 35 43 6f 6e  xdata(.  Fts5Con
e720: 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
e730: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35           /* Fts5
e740: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 76 6f   context */.  vo
e750: 69 64 20 2a 70 50 74 72 2c 20 20 20 20 20 20 20  id *pPtr,       
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e770: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 61 76 65   Pointer to save
e780: 20 61 73 20 61 75 78 64 61 74 61 20 2a 2f 0a 20   as auxdata */. 
e790: 20 76 6f 69 64 28 2a 78 44 65 6c 65 74 65 29 28   void(*xDelete)(
e7a0: 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
e7b0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
e7c0: 6f 72 20 70 50 74 72 20 28 6f 72 20 4e 55 4c 4c  or pPtr (or NULL
e7d0: 29 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 75  ) */.){.  Fts5Cu
e7e0: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
e7f0: 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a  s5Cursor*)pCtx;.
e800: 20 20 46 74 73 35 41 75 78 64 61 74 61 20 2a 70    Fts5Auxdata *p
e810: 44 61 74 61 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  Data;..  /* Sear
e820: 63 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  ch through the c
e830: 75 72 73 6f 72 73 20 6c 69 73 74 20 6f 66 20 46  ursors list of F
e840: 74 73 35 41 75 78 64 61 74 61 20 6f 62 6a 65 63  ts5Auxdata objec
e850: 74 73 20 66 6f 72 20 6f 6e 65 20 74 68 61 74 0a  ts for one that.
e860: 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73    ** corresponds
e870: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 6c   to the currentl
e880: 79 20 65 78 65 63 75 74 69 6e 67 20 61 75 78 69  y executing auxi
e890: 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 2e 20  liary function. 
e8a0: 20 2a 2f 0a 20 20 66 6f 72 28 70 44 61 74 61 3d   */.  for(pData=
e8b0: 70 43 73 72 2d 3e 70 41 75 78 64 61 74 61 3b 20  pCsr->pAuxdata; 
e8c0: 70 44 61 74 61 3b 20 70 44 61 74 61 3d 70 44 61  pData; pData=pDa
e8d0: 74 61 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ta->pNext){.    
e8e0: 69 66 28 20 70 44 61 74 61 2d 3e 70 41 75 78 3d  if( pData->pAux=
e8f0: 3d 70 43 73 72 2d 3e 70 41 75 78 20 29 20 62 72  =pCsr->pAux ) br
e900: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
e910: 70 44 61 74 61 20 29 7b 0a 20 20 20 20 69 66 28  pData ){.    if(
e920: 20 70 44 61 74 61 2d 3e 78 44 65 6c 65 74 65 20   pData->xDelete 
e930: 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e  ){.      pData->
e940: 78 44 65 6c 65 74 65 28 70 44 61 74 61 2d 3e 70  xDelete(pData->p
e950: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Ptr);.    }.  }e
e960: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
e970: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
e980: 20 70 44 61 74 61 20 3d 20 28 46 74 73 35 41 75   pData = (Fts5Au
e990: 78 64 61 74 61 2a 29 73 71 6c 69 74 65 33 46 74  xdata*)sqlite3Ft
e9a0: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
e9b0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 41 75 78  , sizeof(Fts5Aux
e9c0: 64 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20  data));.    if( 
e9d0: 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  pData==0 ){.    
e9e0: 20 20 69 66 28 20 78 44 65 6c 65 74 65 20 29 20    if( xDelete ) 
e9f0: 78 44 65 6c 65 74 65 28 70 50 74 72 29 3b 0a 20  xDelete(pPtr);. 
ea00: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ea10: 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 2d      }.    pData-
ea20: 3e 70 41 75 78 20 3d 20 70 43 73 72 2d 3e 70 41  >pAux = pCsr->pA
ea30: 75 78 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 70  ux;.    pData->p
ea40: 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e 70 41 75  Next = pCsr->pAu
ea50: 78 64 61 74 61 3b 0a 20 20 20 20 70 43 73 72 2d  xdata;.    pCsr-
ea60: 3e 70 41 75 78 64 61 74 61 20 3d 20 70 44 61 74  >pAuxdata = pDat
ea70: 61 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61 2d  a;.  }..  pData-
ea80: 3e 78 44 65 6c 65 74 65 20 3d 20 78 44 65 6c 65  >xDelete = xDele
ea90: 74 65 3b 0a 20 20 70 44 61 74 61 2d 3e 70 50 74  te;.  pData->pPt
eaa0: 72 20 3d 20 70 50 74 72 3b 0a 20 20 72 65 74 75  r = pPtr;.  retu
eab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
eac0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
ead0: 73 35 41 70 69 47 65 74 41 75 78 64 61 74 61 28  s5ApiGetAuxdata(
eae0: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
eaf0: 78 2c 20 69 6e 74 20 62 43 6c 65 61 72 29 7b 0a  x, int bClear){.
eb00: 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43    Fts5Cursor *pC
eb10: 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72  sr = (Fts5Cursor
eb20: 2a 29 70 43 74 78 3b 0a 20 20 46 74 73 35 41 75  *)pCtx;.  Fts5Au
eb30: 78 64 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20  xdata *pData;.  
eb40: 76 6f 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a  void *pRet = 0;.
eb50: 0a 20 20 66 6f 72 28 70 44 61 74 61 3d 70 43 73  .  for(pData=pCs
eb60: 72 2d 3e 70 41 75 78 64 61 74 61 3b 20 70 44 61  r->pAuxdata; pDa
eb70: 74 61 3b 20 70 44 61 74 61 3d 70 44 61 74 61 2d  ta; pData=pData-
eb80: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
eb90: 20 70 44 61 74 61 2d 3e 70 41 75 78 3d 3d 70 43   pData->pAux==pC
eba0: 73 72 2d 3e 70 41 75 78 20 29 20 62 72 65 61 6b  sr->pAux ) break
ebb0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 61  ;.  }..  if( pDa
ebc0: 74 61 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  ta ){.    pRet =
ebd0: 20 70 44 61 74 61 2d 3e 70 50 74 72 3b 0a 20 20   pData->pPtr;.  
ebe0: 20 20 69 66 28 20 62 43 6c 65 61 72 20 29 7b 0a    if( bClear ){.
ebf0: 20 20 20 20 20 20 70 44 61 74 61 2d 3e 70 50 74        pData->pPt
ec00: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 61  r = 0;.      pDa
ec10: 74 61 2d 3e 78 44 65 6c 65 74 65 20 3d 20 30 3b  ta->xDelete = 0;
ec20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
ec30: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74  turn pRet;.}..st
ec40: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 70  atic void fts5Ap
ec50: 69 50 68 72 61 73 65 4e 65 78 74 28 0a 20 20 46  iPhraseNext(.  F
ec60: 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ts5Context *pCtx
ec70: 2c 20 0a 20 20 46 74 73 35 50 68 72 61 73 65 49  , .  Fts5PhraseI
ec80: 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69  ter *pIter, .  i
ec90: 6e 74 20 2a 70 69 43 6f 6c 2c 20 69 6e 74 20 2a  nt *piCol, int *
eca0: 70 69 4f 66 66 0a 29 7b 0a 20 20 69 66 28 20 70  piOff.){.  if( p
ecb0: 49 74 65 72 2d 3e 61 3e 3d 70 49 74 65 72 2d 3e  Iter->a>=pIter->
ecc0: 62 20 29 7b 0a 20 20 20 20 2a 70 69 43 6f 6c 20  b ){.    *piCol 
ecd0: 3d 20 2d 31 3b 0a 20 20 20 20 2a 70 69 4f 66 66  = -1;.    *piOff
ece0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
ecf0: 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20      int iVal;.  
ed00: 20 20 70 49 74 65 72 2d 3e 61 20 2b 3d 20 66 74    pIter->a += ft
ed10: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 49  s5GetVarint32(pI
ed20: 74 65 72 2d 3e 61 2c 20 69 56 61 6c 29 3b 0a 20  ter->a, iVal);. 
ed30: 20 20 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29     if( iVal==1 )
ed40: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61  {.      pIter->a
ed50: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
ed60: 74 33 32 28 70 49 74 65 72 2d 3e 61 2c 20 69 56  t32(pIter->a, iV
ed70: 61 6c 29 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f  al);.      *piCo
ed80: 6c 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  l = iVal;.      
ed90: 2a 70 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  *piOff = 0;.    
eda0: 20 20 70 49 74 65 72 2d 3e 61 20 2b 3d 20 66 74    pIter->a += ft
edb0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 49  s5GetVarint32(pI
edc0: 74 65 72 2d 3e 61 2c 20 69 56 61 6c 29 3b 0a 20  ter->a, iVal);. 
edd0: 20 20 20 7d 0a 20 20 20 20 2a 70 69 4f 66 66 20     }.    *piOff 
ede0: 2b 3d 20 28 69 56 61 6c 2d 32 29 3b 0a 20 20 7d  += (iVal-2);.  }
edf0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
ee00: 66 74 73 35 41 70 69 50 68 72 61 73 65 46 69 72  fts5ApiPhraseFir
ee10: 73 74 28 0a 20 20 46 74 73 35 43 6f 6e 74 65 78  st(.  Fts5Contex
ee20: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
ee30: 69 50 68 72 61 73 65 2c 20 0a 20 20 46 74 73 35  iPhrase, .  Fts5
ee40: 50 68 72 61 73 65 49 74 65 72 20 2a 70 49 74 65  PhraseIter *pIte
ee50: 72 2c 20 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c  r, .  int *piCol
ee60: 2c 20 69 6e 74 20 2a 70 69 4f 66 66 0a 29 7b 0a  , int *piOff.){.
ee70: 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43    Fts5Cursor *pC
ee80: 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72  sr = (Fts5Cursor
ee90: 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 6e 20  *)pCtx;.  int n 
eea0: 3d 20 66 74 73 35 43 73 72 50 6f 73 6c 69 73 74  = fts5CsrPoslist
eeb0: 28 70 43 73 72 2c 20 69 50 68 72 61 73 65 2c 20  (pCsr, iPhrase, 
eec0: 26 70 49 74 65 72 2d 3e 61 29 3b 0a 20 20 70 49  &pIter->a);.  pI
eed0: 74 65 72 2d 3e 62 20 3d 20 26 70 49 74 65 72 2d  ter->b = &pIter-
eee0: 3e 61 5b 6e 5d 3b 0a 20 20 2a 70 69 43 6f 6c 20  >a[n];.  *piCol 
eef0: 3d 20 30 3b 0a 20 20 2a 70 69 4f 66 66 20 3d 20  = 0;.  *piOff = 
ef00: 30 3b 0a 20 20 66 74 73 35 41 70 69 50 68 72 61  0;.  fts5ApiPhra
ef10: 73 65 4e 65 78 74 28 70 43 74 78 2c 20 70 49 74  seNext(pCtx, pIt
ef20: 65 72 2c 20 70 69 43 6f 6c 2c 20 70 69 4f 66 66  er, piCol, piOff
ef30: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
ef40: 20 66 74 73 35 41 70 69 51 75 65 72 79 50 68 72   fts5ApiQueryPhr
ef50: 61 73 65 28 46 74 73 35 43 6f 6e 74 65 78 74 2a  ase(Fts5Context*
ef60: 2c 20 69 6e 74 2c 20 76 6f 69 64 2a 2c 20 0a 20  , int, void*, . 
ef70: 20 20 20 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20     int(*)(const 
ef80: 46 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70 69  Fts5ExtensionApi
ef90: 2a 2c 20 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c  *, Fts5Context*,
efa0: 20 76 6f 69 64 2a 29 0a 29 3b 0a 0a 73 74 61 74   void*).);..stat
efb0: 69 63 20 63 6f 6e 73 74 20 46 74 73 35 45 78 74  ic const Fts5Ext
efc0: 65 6e 73 69 6f 6e 41 70 69 20 73 46 74 73 35 41  ensionApi sFts5A
efd0: 70 69 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20  pi = {.  2,     
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
f000: 6f 6e 20 2a 2f 0a 20 20 66 74 73 35 41 70 69 55  on */.  fts5ApiU
f010: 73 65 72 44 61 74 61 2c 0a 20 20 66 74 73 35 41  serData,.  fts5A
f020: 70 69 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 0a 20  piColumnCount,. 
f030: 20 66 74 73 35 41 70 69 52 6f 77 43 6f 75 6e 74   fts5ApiRowCount
f040: 2c 0a 20 20 66 74 73 35 41 70 69 43 6f 6c 75 6d  ,.  fts5ApiColum
f050: 6e 54 6f 74 61 6c 53 69 7a 65 2c 0a 20 20 66 74  nTotalSize,.  ft
f060: 73 35 41 70 69 54 6f 6b 65 6e 69 7a 65 2c 0a 20  s5ApiTokenize,. 
f070: 20 66 74 73 35 41 70 69 50 68 72 61 73 65 43 6f   fts5ApiPhraseCo
f080: 75 6e 74 2c 0a 20 20 66 74 73 35 41 70 69 50 68  unt,.  fts5ApiPh
f090: 72 61 73 65 53 69 7a 65 2c 0a 20 20 66 74 73 35  raseSize,.  fts5
f0a0: 41 70 69 49 6e 73 74 43 6f 75 6e 74 2c 0a 20 20  ApiInstCount,.  
f0b0: 66 74 73 35 41 70 69 49 6e 73 74 2c 0a 20 20 66  fts5ApiInst,.  f
f0c0: 74 73 35 41 70 69 52 6f 77 69 64 2c 0a 20 20 66  ts5ApiRowid,.  f
f0d0: 74 73 35 41 70 69 43 6f 6c 75 6d 6e 54 65 78 74  ts5ApiColumnText
f0e0: 2c 0a 20 20 66 74 73 35 41 70 69 43 6f 6c 75 6d  ,.  fts5ApiColum
f0f0: 6e 53 69 7a 65 2c 0a 20 20 66 74 73 35 41 70 69  nSize,.  fts5Api
f100: 51 75 65 72 79 50 68 72 61 73 65 2c 0a 20 20 66  QueryPhrase,.  f
f110: 74 73 35 41 70 69 53 65 74 41 75 78 64 61 74 61  ts5ApiSetAuxdata
f120: 2c 0a 20 20 66 74 73 35 41 70 69 47 65 74 41 75  ,.  fts5ApiGetAu
f130: 78 64 61 74 61 2c 0a 20 20 66 74 73 35 41 70 69  xdata,.  fts5Api
f140: 50 68 72 61 73 65 46 69 72 73 74 2c 0a 20 20 66  PhraseFirst,.  f
f150: 74 73 35 41 70 69 50 68 72 61 73 65 4e 65 78 74  ts5ApiPhraseNext
f160: 2c 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  ,.};.../*.** Imp
f170: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 41  lementation of A
f180: 50 49 20 66 75 6e 63 74 69 6f 6e 20 78 51 75 65  PI function xQue
f190: 72 79 50 68 72 61 73 65 28 29 2e 0a 2a 2f 0a 73  ryPhrase()..*/.s
f1a0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 70  tatic int fts5Ap
f1b0: 69 51 75 65 72 79 50 68 72 61 73 65 28 0a 20 20  iQueryPhrase(.  
f1c0: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
f1d0: 78 2c 20 0a 20 20 69 6e 74 20 69 50 68 72 61 73  x, .  int iPhras
f1e0: 65 2c 20 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  e, .  void *pUse
f1f0: 72 44 61 74 61 2c 0a 20 20 69 6e 74 28 2a 78 43  rData,.  int(*xC
f200: 61 6c 6c 62 61 63 6b 29 28 63 6f 6e 73 74 20 46  allback)(const F
f210: 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70 69 2a  ts5ExtensionApi*
f220: 2c 20 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20  , Fts5Context*, 
f230: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 46 74 73 35  void*).){.  Fts5
f240: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
f250: 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78  Fts5Cursor*)pCtx
f260: 3b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70  ;.  Fts5Table *p
f270: 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65  Tab = (Fts5Table
f280: 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e 70 56  *)(pCsr->base.pV
f290: 74 61 62 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  tab);.  int rc;.
f2a0: 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 4e    Fts5Cursor *pN
f2b0: 65 77 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  ew = 0;..  rc = 
f2c0: 66 74 73 35 4f 70 65 6e 4d 65 74 68 6f 64 28 70  fts5OpenMethod(p
f2d0: 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 2c  Csr->base.pVtab,
f2e0: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63   (sqlite3_vtab_c
f2f0: 75 72 73 6f 72 2a 2a 29 26 70 4e 65 77 29 3b 0a  ursor**)&pNew);.
f300: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f310: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43  _OK ){.    Fts5C
f320: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 20 3d 20 70  onfig *pConf = p
f330: 54 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  Tab->pConfig;.  
f340: 20 20 70 4e 65 77 2d 3e 65 50 6c 61 6e 20 3d 20    pNew->ePlan = 
f350: 46 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 3b  FTS5_PLAN_MATCH;
f360: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 46 69 72 73  .    pNew->iFirs
f370: 74 52 6f 77 69 64 20 3d 20 53 4d 41 4c 4c 45 53  tRowid = SMALLES
f380: 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 70 4e 65  T_INT64;.    pNe
f390: 77 2d 3e 69 4c 61 73 74 52 6f 77 69 64 20 3d 20  w->iLastRowid = 
f3a0: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20  LARGEST_INT64;. 
f3b0: 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 70 56     pNew->base.pV
f3c0: 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  tab = (sqlite3_v
f3d0: 74 61 62 2a 29 70 54 61 62 3b 0a 20 20 20 20 72  tab*)pTab;.    r
f3e0: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45  c = sqlite3Fts5E
f3f0: 78 70 72 43 6c 6f 6e 65 50 68 72 61 73 65 28 70  xprClonePhrase(p
f400: 43 6f 6e 66 2c 20 70 43 73 72 2d 3e 70 45 78 70  Conf, pCsr->pExp
f410: 72 2c 20 69 50 68 72 61 73 65 2c 20 26 70 4e 65  r, iPhrase, &pNe
f420: 77 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  w->pExpr);.  }..
f430: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f440: 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 72  _OK ){.    for(r
f450: 63 20 3d 20 66 74 73 35 43 75 72 73 6f 72 46 69  c = fts5CursorFi
f460: 72 73 74 28 70 54 61 62 2c 20 70 4e 65 77 2c 20  rst(pTab, pNew, 
f470: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  0);.        rc==
f480: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 43 73 72  SQLITE_OK && Csr
f490: 46 6c 61 67 54 65 73 74 28 70 4e 65 77 2c 20 46  FlagTest(pNew, F
f4a0: 54 53 35 43 53 52 5f 45 4f 46 29 3d 3d 30 3b 0a  TS5CSR_EOF)==0;.
f4b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
f4c0: 35 4e 65 78 74 4d 65 74 68 6f 64 28 28 73 71 6c  5NextMethod((sql
f4d0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
f4e0: 2a 29 70 4e 65 77 29 0a 20 20 20 20 29 7b 0a 20  *)pNew).    ){. 
f4f0: 20 20 20 20 20 72 63 20 3d 20 78 43 61 6c 6c 62       rc = xCallb
f500: 61 63 6b 28 26 73 46 74 73 35 41 70 69 2c 20 28  ack(&sFts5Api, (
f510: 46 74 73 35 43 6f 6e 74 65 78 74 2a 29 70 4e 65  Fts5Context*)pNe
f520: 77 2c 20 70 55 73 65 72 44 61 74 61 29 3b 0a 20  w, pUserData);. 
f530: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
f540: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f550: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f560: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
f570: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
f580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
f590: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
f5a0: 43 6c 6f 73 65 4d 65 74 68 6f 64 28 28 73 71 6c  CloseMethod((sql
f5b0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
f5c0: 2a 29 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  *)pNew);.  retur
f5d0: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
f5e0: 76 6f 69 64 20 66 74 73 35 41 70 69 49 6e 76 6f  void fts5ApiInvo
f5f0: 6b 65 28 0a 20 20 46 74 73 35 41 75 78 69 6c 69  ke(.  Fts5Auxili
f600: 61 72 79 20 2a 70 41 75 78 2c 0a 20 20 46 74 73  ary *pAux,.  Fts
f610: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 0a 20  5Cursor *pCsr,. 
f620: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
f630: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
f640: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
f650: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
f660: 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
f670: 3e 70 41 75 78 3d 3d 30 20 29 3b 0a 20 20 70 43  >pAux==0 );.  pC
f680: 73 72 2d 3e 70 41 75 78 20 3d 20 70 41 75 78 3b  sr->pAux = pAux;
f690: 0a 20 20 70 41 75 78 2d 3e 78 46 75 6e 63 28 26  .  pAux->xFunc(&
f6a0: 73 46 74 73 35 41 70 69 2c 20 28 46 74 73 35 43  sFts5Api, (Fts5C
f6b0: 6f 6e 74 65 78 74 2a 29 70 43 73 72 2c 20 63 6f  ontext*)pCsr, co
f6c0: 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
f6d0: 76 29 3b 0a 20 20 70 43 73 72 2d 3e 70 41 75 78  v);.  pCsr->pAux
f6e0: 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 0;.}..static 
f6f0: 46 74 73 35 43 75 72 73 6f 72 20 2a 66 74 73 35  Fts5Cursor *fts5
f700: 43 75 72 73 6f 72 46 72 6f 6d 43 73 72 69 64 28  CursorFromCsrid(
f710: 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f  Fts5Global *pGlo
f720: 62 61 6c 2c 20 69 36 34 20 69 43 73 72 49 64 29  bal, i64 iCsrId)
f730: 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  {.  Fts5Cursor *
f740: 70 43 73 72 3b 0a 20 20 66 6f 72 28 70 43 73 72  pCsr;.  for(pCsr
f750: 3d 70 47 6c 6f 62 61 6c 2d 3e 70 43 73 72 3b 20  =pGlobal->pCsr; 
f760: 70 43 73 72 3b 20 70 43 73 72 3d 70 43 73 72 2d  pCsr; pCsr=pCsr-
f770: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
f780: 20 70 43 73 72 2d 3e 69 43 73 72 49 64 3d 3d 69   pCsr->iCsrId==i
f790: 43 73 72 49 64 20 29 20 62 72 65 61 6b 3b 0a 20  CsrId ) break;. 
f7a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 73 72   }.  return pCsr
f7b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
f7c0: 20 66 74 73 35 41 70 69 43 61 6c 6c 62 61 63 6b   fts5ApiCallback
f7d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
f7e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
f7f0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
f800: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
f810: 0a 29 7b 0a 0a 20 20 46 74 73 35 41 75 78 69 6c  .){..  Fts5Auxil
f820: 69 61 72 79 20 2a 70 41 75 78 3b 0a 20 20 46 74  iary *pAux;.  Ft
f830: 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a  s5Cursor *pCsr;.
f840: 20 20 69 36 34 20 69 43 73 72 49 64 3b 0a 0a 20    i64 iCsrId;.. 
f850: 20 61 73 73 65 72 74 28 20 61 72 67 63 3e 3d 31   assert( argc>=1
f860: 20 29 3b 0a 20 20 70 41 75 78 20 3d 20 28 46 74   );.  pAux = (Ft
f870: 73 35 41 75 78 69 6c 69 61 72 79 2a 29 73 71 6c  s5Auxiliary*)sql
f880: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
f890: 6f 6e 74 65 78 74 29 3b 0a 20 20 69 43 73 72 49  ontext);.  iCsrI
f8a0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
f8b0: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
f8c0: 3b 0a 0a 20 20 70 43 73 72 20 3d 20 66 74 73 35  ;..  pCsr = fts5
f8d0: 43 75 72 73 6f 72 46 72 6f 6d 43 73 72 69 64 28  CursorFromCsrid(
f8e0: 70 41 75 78 2d 3e 70 47 6c 6f 62 61 6c 2c 20 69  pAux->pGlobal, i
f8f0: 43 73 72 49 64 29 3b 0a 20 20 69 66 28 20 70 43  CsrId);.  if( pC
f900: 73 72 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  sr==0 ){.    cha
f910: 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  r *zErr = sqlite
f920: 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
f930: 63 68 20 63 75 72 73 6f 72 3a 20 25 6c 6c 64 22  ch cursor: %lld"
f940: 2c 20 69 43 73 72 49 64 29 3b 0a 20 20 20 20 73  , iCsrId);.    s
f950: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
f960: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72  ror(context, zEr
f970: 72 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  r, -1);.    sqli
f980: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
f990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
f9a0: 35 41 70 69 49 6e 76 6f 6b 65 28 70 41 75 78 2c  5ApiInvoke(pAux,
f9b0: 20 70 43 73 72 2c 20 63 6f 6e 74 65 78 74 2c 20   pCsr, context, 
f9c0: 61 72 67 63 2d 31 2c 20 26 61 72 67 76 5b 31 5d  argc-1, &argv[1]
f9d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
f9e0: 20 47 69 76 65 6e 20 63 75 72 73 6f 72 20 69 64   Given cursor id
f9f0: 20 69 49 64 2c 20 72 65 74 75 72 6e 20 61 20 70   iId, return a p
fa00: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
fa10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 46 74 73 35  rresponding Fts5
fa20: 49 6e 64 65 78 20 0a 2a 2a 20 6f 62 6a 65 63 74  Index .** object
fa30: 2e 20 4f 72 20 4e 55 4c 4c 20 49 66 20 74 68 65  . Or NULL If the
fa40: 20 63 75 72 73 6f 72 20 69 64 20 64 6f 65 73 20   cursor id does 
fa50: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  not exist..**.**
fa60: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
fa70: 73 65 74 20 2a 70 70 43 6f 6e 66 69 67 20 74 6f  set *ppConfig to
fa80: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 73   point to the as
fa90: 73 6f 63 69 61 74 65 64 20 63 6f 6e 66 69 67 20  sociated config 
faa0: 6f 62 6a 65 63 74 20 0a 2a 2a 20 62 65 66 6f 72  object .** befor
fab0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
fac0: 46 74 73 35 49 6e 64 65 78 20 2a 73 71 6c 69 74  Fts5Index *sqlit
fad0: 65 33 46 74 73 35 49 6e 64 65 78 46 72 6f 6d 43  e3Fts5IndexFromC
fae0: 73 72 69 64 28 0a 20 20 46 74 73 35 47 6c 6f 62  srid(.  Fts5Glob
faf0: 61 6c 20 2a 70 47 6c 6f 62 61 6c 2c 20 20 20 20  al *pGlobal,    
fb00: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
fb10: 67 6c 6f 62 61 6c 20 63 6f 6e 74 65 78 74 20 66  global context f
fb20: 6f 72 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  or db handle */.
fb30: 20 20 69 36 34 20 69 43 73 72 49 64 2c 20 20 20    i64 iCsrId,   
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 2f 2a 20 49 64 20 6f 66 20 63 75 72 73 6f    /* Id of curso
fb60: 72 20 74 6f 20 66 69 6e 64 20 2a 2f 0a 20 20 46  r to find */.  F
fb70: 74 73 35 43 6f 6e 66 69 67 20 2a 2a 70 70 43 6f  ts5Config **ppCo
fb80: 6e 66 69 67 20 20 20 20 20 20 20 20 20 20 20 2f  nfig           /
fb90: 2a 20 4f 55 54 3a 20 43 6f 6e 66 69 67 75 72 61  * OUT: Configura
fba0: 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  tion object */.)
fbb0: 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  {.  Fts5Cursor *
fbc0: 70 43 73 72 3b 0a 20 20 46 74 73 35 54 61 62 6c  pCsr;.  Fts5Tabl
fbd0: 65 20 2a 70 54 61 62 3b 0a 0a 20 20 70 43 73 72  e *pTab;..  pCsr
fbe0: 20 3d 20 66 74 73 35 43 75 72 73 6f 72 46 72 6f   = fts5CursorFro
fbf0: 6d 43 73 72 69 64 28 70 47 6c 6f 62 61 6c 2c 20  mCsrid(pGlobal, 
fc00: 69 43 73 72 49 64 29 3b 0a 20 20 70 54 61 62 20  iCsrId);.  pTab 
fc10: 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29 70 43  = (Fts5Table*)pC
fc20: 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
fc30: 20 20 2a 70 70 43 6f 6e 66 69 67 20 3d 20 70 54    *ppConfig = pT
fc40: 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20  ab->pConfig;..  
fc50: 72 65 74 75 72 6e 20 70 54 61 62 2d 3e 70 49 6e  return pTab->pIn
fc60: 64 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  dex;.}../*.** Re
fc70: 74 75 72 6e 20 61 20 22 70 6f 73 69 74 69 6f 6e  turn a "position
fc80: 2d 6c 69 73 74 20 62 6c 6f 62 22 20 63 6f 72 72  -list blob" corr
fc90: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
fca0: 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
fcb0: 6e 20 6f 66 0a 2a 2a 20 63 75 72 73 6f 72 20 70  n of.** cursor p
fcc0: 43 73 72 20 76 69 61 20 73 71 6c 69 74 65 33 5f  Csr via sqlite3_
fcd0: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 29 2e 20 41  result_blob(). A
fce0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 62   position-list b
fcf0: 6c 6f 62 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  lob contains.** 
fd00: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
fd10: 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72 20 65 61  tion-list for ea
fd20: 63 68 20 70 68 72 61 73 65 20 69 6e 20 74 68 65  ch phrase in the
fd30: 20 71 75 65 72 79 20 61 73 73 6f 63 69 61 74 65   query associate
fd40: 64 20 77 69 74 68 0a 2a 2a 20 63 75 72 73 6f 72  d with.** cursor
fd50: 20 70 43 73 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 70   pCsr..**.** A p
fd60: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 62 6c 6f  osition-list blo
fd70: 62 20 62 65 67 69 6e 73 20 77 69 74 68 20 28 6e  b begins with (n
fd80: 50 68 72 61 73 65 2d 31 29 20 76 61 72 69 6e 74  Phrase-1) varint
fd90: 73 2c 20 77 68 65 72 65 20 6e 50 68 72 61 73 65  s, where nPhrase
fda0: 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   is.** the numbe
fdb0: 72 20 6f 66 20 70 68 72 61 73 65 73 20 69 6e 20  r of phrases in 
fdc0: 74 68 65 20 71 75 65 72 79 2e 20 46 6f 6c 6c 6f  the query. Follo
fdd0: 77 69 6e 67 20 74 68 65 20 76 61 72 69 6e 74 73  wing the varints
fde0: 20 61 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 63   are the.** conc
fdf0: 61 74 65 6e 61 74 65 64 20 70 6f 73 69 74 69 6f  atenated positio
fe00: 6e 20 6c 69 73 74 73 20 66 6f 72 20 65 61 63 68  n lists for each
fe10: 20 70 68 72 61 73 65 2c 20 69 6e 20 6f 72 64 65   phrase, in orde
fe20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  r..**.** The fir
fe30: 73 74 20 76 61 72 69 6e 74 20 28 69 66 20 69 74  st varint (if it
fe40: 20 65 78 69 73 74 73 29 20 63 6f 6e 74 61 69 6e   exists) contain
fe50: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
fe60: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 0a  e position list.
fe70: 2a 2a 20 66 6f 72 20 70 68 72 61 73 65 20 30 2e  ** for phrase 0.
fe80: 20 54 68 65 20 73 65 63 6f 6e 64 20 28 73 61 6d   The second (sam
fe90: 65 20 64 69 73 63 6c 61 69 6d 65 72 29 20 63 6f  e disclaimer) co
fea0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
feb0: 6f 66 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c  of position.** l
fec0: 69 73 74 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e  ist 1. And so on
fed0: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73 69  . There is no si
fee0: 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ze field for the
fef0: 20 66 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20   final position 
ff00: 6c 69 73 74 2c 0a 2a 2a 20 61 73 20 69 74 20 63  list,.** as it c
ff10: 61 6e 20 62 65 20 64 65 72 69 76 65 64 20 66 72  an be derived fr
ff20: 6f 6d 20 74 68 65 20 74 6f 74 61 6c 20 73 69 7a  om the total siz
ff30: 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 2e 0a 2a  e of the blob..*
ff40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ff50: 35 50 6f 73 6c 69 73 74 42 6c 6f 62 28 73 71 6c  5PoslistBlob(sql
ff60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
ff70: 74 78 2c 20 46 74 73 35 43 75 72 73 6f 72 20 2a  tx, Fts5Cursor *
ff80: 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCsr){.  int i;.
ff90: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ffa0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 50 68 72  E_OK;.  int nPhr
ffb0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  ase = sqlite3Fts
ffc0: 35 45 78 70 72 50 68 72 61 73 65 43 6f 75 6e 74  5ExprPhraseCount
ffd0: 28 70 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20  (pCsr->pExpr);. 
ffe0: 20 46 74 73 35 42 75 66 66 65 72 20 76 61 6c 3b   Fts5Buffer val;
fff0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 76 61 6c 2c  ..  memset(&val,
10000 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
10010 75 66 66 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 41  uffer));..  /* A
10020 70 70 65 6e 64 20 74 68 65 20 76 61 72 69 6e 74  ppend the varint
10030 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
10040 69 3c 28 6e 50 68 72 61 73 65 2d 31 29 3b 20 69  i<(nPhrase-1); i
10050 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ++){.    const u
10060 38 20 2a 64 75 6d 6d 79 3b 0a 20 20 20 20 69 6e  8 *dummy;.    in
10070 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
10080 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73 74  3Fts5ExprPoslist
10090 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 69 2c  (pCsr->pExpr, i,
100a0 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 73 71   &dummy);.    sq
100b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
100c0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 72 63 2c  ppendVarint(&rc,
100d0 20 26 76 61 6c 2c 20 6e 42 79 74 65 29 3b 0a 20   &val, nByte);. 
100e0 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
100f0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
10100 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ts */.  for(i=0;
10110 20 69 3c 6e 50 68 72 61 73 65 3b 20 69 2b 2b 29   i<nPhrase; i++)
10120 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
10130 70 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 69 6e  pPoslist;.    in
10140 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  t nPoslist;.    
10150 6e 50 6f 73 6c 69 73 74 20 3d 20 73 71 6c 69 74  nPoslist = sqlit
10160 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73  e3Fts5ExprPoslis
10170 74 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 69  t(pCsr->pExpr, i
10180 2c 20 26 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20  , &pPoslist);.  
10190 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
101a0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
101b0 63 2c 20 26 76 61 6c 2c 20 6e 50 6f 73 6c 69 73  c, &val, nPoslis
101c0 74 2c 20 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20  t, pPoslist);.  
101d0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  }..  sqlite3_res
101e0 75 6c 74 5f 62 6c 6f 62 28 70 43 74 78 2c 20 76  ult_blob(pCtx, v
101f0 61 6c 2e 70 2c 20 76 61 6c 2e 6e 2c 20 73 71 6c  al.p, val.n, sql
10200 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 72 65  ite3_free);.  re
10210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
10220 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
10230 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 2c 20 63  Column method, c
10240 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65 20  alled by SQLite 
10250 74 6f 20 72 65 71 75 65 73 74 20 61 20 76 61 6c  to request a val
10260 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 72  ue from.** the r
10270 6f 77 20 74 68 61 74 20 74 68 65 20 73 75 70 70  ow that the supp
10280 6c 69 65 64 20 63 75 72 73 6f 72 20 63 75 72 72  lied cursor curr
10290 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
102a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
102b0 74 73 35 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 28  ts5ColumnMethod(
102c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
102d0 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c  cursor *pCursor,
102e0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
102f0 72 65 74 72 69 65 76 65 20 76 61 6c 75 65 20 66  retrieve value f
10300 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rom */.  sqlite3
10310 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
10320 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
10330 65 78 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ext for sqlite3_
10340 72 65 73 75 6c 74 5f 78 78 78 28 29 20 63 61 6c  result_xxx() cal
10350 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ls */.  int iCol
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10380 20 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65   of column to re
10390 61 64 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f  ad value from */
103a0 0a 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20  .){.  Fts5Table 
103b0 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62  *pTab = (Fts5Tab
103c0 6c 65 2a 29 28 70 43 75 72 73 6f 72 2d 3e 70 56  le*)(pCursor->pV
103d0 74 61 62 29 3b 0a 20 20 46 74 73 35 43 6f 6e 66  tab);.  Fts5Conf
103e0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 54  ig *pConfig = pT
103f0 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46  ab->pConfig;.  F
10400 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts5Cursor *pCsr 
10410 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70  = (Fts5Cursor*)p
10420 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 72 63  Cursor;.  int rc
10430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10440 0a 20 20 61 73 73 65 72 74 28 20 43 73 72 46 6c  .  assert( CsrFl
10450 61 67 54 65 73 74 28 70 43 73 72 2c 20 46 54 53  agTest(pCsr, FTS
10460 35 43 53 52 5f 45 4f 46 29 3d 3d 30 20 29 3b 0a  5CSR_EOF)==0 );.
10470 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 50 6c  .  if( pCsr->ePl
10480 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 53 50  an==FTS5_PLAN_SP
10490 45 43 49 41 4c 20 29 7b 0a 20 20 20 20 69 66 28  ECIAL ){.    if(
104a0 20 69 43 6f 6c 3d 3d 70 43 6f 6e 66 69 67 2d 3e   iCol==pConfig->
104b0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
104c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
104d0 36 34 28 70 43 74 78 2c 20 70 43 73 72 2d 3e 69  64(pCtx, pCsr->i
104e0 53 70 65 63 69 61 6c 29 3b 0a 20 20 20 20 7d 0a  Special);.    }.
104f0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 69    }else..  if( i
10500 43 6f 6c 3d 3d 70 43 6f 6e 66 69 67 2d 3e 6e 43  Col==pConfig->nC
10510 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 55 73 65  ol ){.    /* Use
10520 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20  r is requesting 
10530 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
10540 20 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d 6e 20   special column 
10550 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
10560 6d 65 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65  me.    ** as the
10570 20 74 61 62 6c 65 2e 20 52 65 74 75 72 6e 20 74   table. Return t
10580 68 65 20 63 75 72 73 6f 72 20 69 6e 74 65 67 65  he cursor intege
10590 72 20 69 64 20 6e 75 6d 62 65 72 2e 20 54 68 69  r id number. Thi
105a0 73 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a  s value is only.
105b0 20 20 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e      ** useful in
105c0 20 74 68 61 74 20 69 74 20 6d 61 79 20 62 65 20   that it may be 
105d0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
105e0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
105f0 61 6e 20 46 54 53 35 0a 20 20 20 20 2a 2a 20 61  an FTS5.    ** a
10600 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f  uxiliary functio
10610 6e 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  n.  */.    sqlit
10620 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
10630 70 43 74 78 2c 20 70 43 73 72 2d 3e 69 43 73 72  pCtx, pCsr->iCsr
10640 49 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Id);.  }else if(
10650 20 69 43 6f 6c 3d 3d 70 43 6f 6e 66 69 67 2d 3e   iCol==pConfig->
10660 6e 43 6f 6c 2b 31 20 29 7b 0a 0a 20 20 20 20 2f  nCol+1 ){..    /
10670 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * The value of t
10680 68 65 20 22 72 61 6e 6b 22 20 63 6f 6c 75 6d 6e  he "rank" column
10690 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 73  . */.    if( pCs
106a0 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50  r->ePlan==FTS5_P
106b0 4c 41 4e 5f 53 4f 55 52 43 45 20 29 7b 0a 20 20  LAN_SOURCE ){.  
106c0 20 20 20 20 66 74 73 35 50 6f 73 6c 69 73 74 42      fts5PoslistB
106d0 6c 6f 62 28 70 43 74 78 2c 20 70 43 73 72 29 3b  lob(pCtx, pCsr);
106e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 0a  .    }else if( .
106f0 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 65 50          pCsr->eP
10700 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 4d  lan==FTS5_PLAN_M
10710 41 54 43 48 0a 20 20 20 20 20 7c 7c 20 70 43 73  ATCH.     || pCs
10720 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50  r->ePlan==FTS5_P
10730 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d 41 54 43 48  LAN_SORTED_MATCH
10740 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
10750 28 20 70 43 73 72 2d 3e 70 52 61 6e 6b 20 7c 7c  ( pCsr->pRank ||
10760 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
10770 3d 20 66 74 73 35 46 69 6e 64 52 61 6e 6b 46 75  = fts5FindRankFu
10780 6e 63 74 69 6f 6e 28 70 43 73 72 29 29 20 29 7b  nction(pCsr)) ){
10790 0a 20 20 20 20 20 20 20 20 66 74 73 35 41 70 69  .        fts5Api
107a0 49 6e 76 6f 6b 65 28 70 43 73 72 2d 3e 70 52 61  Invoke(pCsr->pRa
107b0 6e 6b 2c 20 70 43 73 72 2c 20 70 43 74 78 2c 20  nk, pCsr, pCtx, 
107c0 70 43 73 72 2d 3e 6e 52 61 6e 6b 41 72 67 2c 20  pCsr->nRankArg, 
107d0 70 43 73 72 2d 3e 61 70 52 61 6e 6b 41 72 67 29  pCsr->apRankArg)
107e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
107f0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 66 74 73    }else if( !fts
10800 35 49 73 43 6f 6e 74 65 6e 74 6c 65 73 73 28 70  5IsContentless(p
10810 54 61 62 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  Tab) ){.    rc =
10820 20 66 74 73 35 53 65 65 6b 43 75 72 73 6f 72 28   fts5SeekCursor(
10830 70 43 73 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  pCsr, 1);.    if
10840 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10850 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10860 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43  _result_value(pC
10870 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  tx, sqlite3_colu
10880 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70  mn_value(pCsr->p
10890 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 29 3b 0a  Stmt, iCol+1));.
108a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
108b0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
108c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
108d0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 78 46 69  plements the xFi
108e0 6e 64 46 75 6e 63 74 69 6f 6e 20 6d 65 74 68 6f  ndFunction metho
108f0 64 20 66 6f 72 20 74 68 65 20 46 54 53 33 0a 2a  d for the FTS3.*
10900 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  * virtual table.
10910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
10920 74 73 35 46 69 6e 64 46 75 6e 63 74 69 6f 6e 4d  ts5FindFunctionM
10930 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33  ethod(.  sqlite3
10940 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20  _vtab *pVtab,   
10950 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
10960 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
10970 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
109a0 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  of SQL function 
109b0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
109c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
109d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
109e0 2a 20 4e 61 6d 65 20 6f 66 20 53 51 4c 20 66 75  * Name of SQL fu
109f0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
10a00 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c 69   (**pxFunc)(sqli
10a10 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
10a20 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
10a30 29 2c 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c  ), /* OUT: Resul
10a40 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70  t */.  void **pp
10a50 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
10a60 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 55         /* OUT: U
10a70 73 65 72 20 64 61 74 61 20 66 6f 72 20 2a 70 78  ser data for *px
10a80 46 75 6e 63 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  Func */.){.  Fts
10a90 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  5Table *pTab = (
10aa0 46 74 73 35 54 61 62 6c 65 2a 29 70 56 74 61 62  Fts5Table*)pVtab
10ab0 3b 0a 20 20 46 74 73 35 41 75 78 69 6c 69 61 72  ;.  Fts5Auxiliar
10ac0 79 20 2a 70 41 75 78 3b 0a 0a 20 20 70 41 75 78  y *pAux;..  pAux
10ad0 20 3d 20 66 74 73 35 46 69 6e 64 41 75 78 69 6c   = fts5FindAuxil
10ae0 69 61 72 79 28 70 54 61 62 2c 20 7a 4e 61 6d 65  iary(pTab, zName
10af0 29 3b 0a 20 20 69 66 28 20 70 41 75 78 20 29 7b  );.  if( pAux ){
10b00 0a 20 20 20 20 2a 70 78 46 75 6e 63 20 3d 20 66  .    *pxFunc = f
10b10 74 73 35 41 70 69 43 61 6c 6c 62 61 63 6b 3b 0a  ts5ApiCallback;.
10b20 20 20 20 20 2a 70 70 41 72 67 20 3d 20 28 76 6f      *ppArg = (vo
10b30 69 64 2a 29 70 41 75 78 3b 0a 20 20 20 20 72 65  id*)pAux;.    re
10b40 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
10b50 2a 20 4e 6f 20 66 75 6e 63 74 69 6f 6e 20 6f 66  * No function of
10b60 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6e   the specified n
10b70 61 6d 65 20 77 61 73 20 66 6f 75 6e 64 2e 20 52  ame was found. R
10b80 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65  eturn 0. */.  re
10b90 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10ba0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
10bb0 6f 66 20 46 54 53 35 20 78 52 65 6e 61 6d 65 20  of FTS5 xRename 
10bc0 6d 65 74 68 6f 64 2e 20 52 65 6e 61 6d 65 20 61  method. Rename a
10bd0 6e 20 66 74 73 35 20 74 61 62 6c 65 2e 0a 2a 2f  n fts5 table..*/
10be0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
10bf0 52 65 6e 61 6d 65 4d 65 74 68 6f 64 28 0a 20 20  RenameMethod(.  
10c00 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
10c10 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  tab,            
10c20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
10c30 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
10c40 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c60 4e 65 77 20 6e 61 6d 65 20 6f 66 20 74 61 62 6c  New name of tabl
10c70 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 54 61  e */.){.  Fts5Ta
10c80 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73  ble *pTab = (Fts
10c90 35 54 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20  5Table*)pVtab;. 
10ca0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
10cb0 74 73 35 53 74 6f 72 61 67 65 52 65 6e 61 6d 65  ts5StorageRename
10cc0 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c  (pTab->pStorage,
10cd0 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zName);.}../*.*
10ce0 2a 20 54 68 65 20 78 53 61 76 65 70 6f 69 6e 74  * The xSavepoint
10cf0 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  () method..**.**
10d00 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65   Flush the conte
10d10 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69  nts of the pendi
10d20 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c 65 20 74  ng-terms table t
10d30 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
10d40 63 20 69 6e 74 20 66 74 73 35 53 61 76 65 70 6f  c int fts5Savepo
10d50 69 6e 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  intMethod(sqlite
10d60 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69  3_vtab *pVtab, i
10d70 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
10d80 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
10d90 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
10da0 70 56 74 61 62 3b 0a 20 20 66 74 73 35 43 68 65  pVtab;.  fts5Che
10db0 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61  ckTransactionSta
10dc0 74 65 28 70 54 61 62 2c 20 46 54 53 35 5f 53 41  te(pTab, FTS5_SA
10dd0 56 45 50 4f 49 4e 54 2c 20 69 53 61 76 65 70 6f  VEPOINT, iSavepo
10de0 69 6e 74 29 3b 0a 20 20 66 74 73 35 54 72 69 70  int);.  fts5Trip
10df0 43 75 72 73 6f 72 73 28 70 54 61 62 29 3b 0a 20  Cursors(pTab);. 
10e00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
10e10 74 73 35 53 74 6f 72 61 67 65 53 79 6e 63 28 70  ts5StorageSync(p
10e20 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 30  Tab->pStorage, 0
10e30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
10e40 78 52 65 6c 65 61 73 65 28 29 20 6d 65 74 68 6f  xRelease() metho
10e50 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
10e60 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10e70 74 69 63 20 69 6e 74 20 66 74 73 35 52 65 6c 65  tic int fts5Rele
10e80 61 73 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  aseMethod(sqlite
10e90 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69  3_vtab *pVtab, i
10ea0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
10eb0 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
10ec0 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
10ed0 70 56 74 61 62 3b 0a 20 20 66 74 73 35 43 68 65  pVtab;.  fts5Che
10ee0 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61  ckTransactionSta
10ef0 74 65 28 70 54 61 62 2c 20 46 54 53 35 5f 52 45  te(pTab, FTS5_RE
10f00 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
10f10 74 29 3b 0a 20 20 66 74 73 35 54 72 69 70 43 75  t);.  fts5TripCu
10f20 72 73 6f 72 73 28 70 54 61 62 29 3b 0a 20 20 72  rsors(pTab);.  r
10f30 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73  eturn sqlite3Fts
10f40 35 53 74 6f 72 61 67 65 53 79 6e 63 28 70 54 61  5StorageSync(pTa
10f50 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 30 29 3b  b->pStorage, 0);
10f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 52  .}../*.** The xR
10f70 6f 6c 6c 62 61 63 6b 54 6f 28 29 20 6d 65 74 68  ollbackTo() meth
10f80 6f 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 63 61 72  od..**.** Discar
10f90 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
10fa0 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65  f the pending te
10fb0 72 6d 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  rms table..*/.st
10fc0 61 74 69 63 20 69 6e 74 20 66 74 73 35 52 6f 6c  atic int fts5Rol
10fd0 6c 62 61 63 6b 54 6f 4d 65 74 68 6f 64 28 73 71  lbackToMethod(sq
10fe0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
10ff0 62 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  b, int iSavepoin
11000 74 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20  t){.  Fts5Table 
11010 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62  *pTab = (Fts5Tab
11020 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 66 74 73  le*)pVtab;.  fts
11030 35 43 68 65 63 6b 54 72 61 6e 73 61 63 74 69 6f  5CheckTransactio
11040 6e 53 74 61 74 65 28 70 54 61 62 2c 20 46 54 53  nState(pTab, FTS
11050 35 5f 52 4f 4c 4c 42 41 43 4b 54 4f 2c 20 69 53  5_ROLLBACKTO, iS
11060 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 66 74 73  avepoint);.  fts
11070 35 54 72 69 70 43 75 72 73 6f 72 73 28 70 54 61  5TripCursors(pTa
11080 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b);.  return sql
11090 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
110a0 6f 6c 6c 62 61 63 6b 28 70 54 61 62 2d 3e 70 53  ollback(pTab->pS
110b0 74 6f 72 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  torage);.}../*.*
110c0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
110d0 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
110e0 69 6f 6e 20 77 69 74 68 20 67 6c 6f 62 61 6c 20  ion with global 
110f0 63 6f 6e 74 65 78 74 20 70 47 6c 6f 62 61 6c 2e  context pGlobal.
11100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
11110 74 73 35 43 72 65 61 74 65 41 75 78 28 0a 20 20  ts5CreateAux(.  
11120 66 74 73 35 5f 61 70 69 20 2a 70 41 70 69 2c 20  fts5_api *pApi, 
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 2f 2a 20 47 6c 6f 62 61 6c 20 63 6f 6e 74 65 78  /* Global contex
11150 74 20 28 6f 6e 65 20 70 65 72 20 64 62 20 68 61  t (one per db ha
11160 6e 64 6c 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  ndle) */.  const
11170 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
11180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
11190 6d 65 20 6f 66 20 6e 65 77 20 66 75 6e 63 74 69  me of new functi
111a0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 55  on */.  void *pU
111b0 73 65 72 44 61 74 61 2c 20 20 20 20 20 20 20 20  serData,        
111c0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20          /* User 
111d0 64 61 74 61 20 66 6f 72 20 61 75 78 2e 20 66 75  data for aux. fu
111e0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 74 73 35  nction */.  fts5
111f0 5f 65 78 74 65 6e 73 69 6f 6e 5f 66 75 6e 63 74  _extension_funct
11200 69 6f 6e 20 78 46 75 6e 63 2c 20 20 2f 2a 20 41  ion xFunc,  /* A
11210 75 78 2e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  ux. function imp
11220 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
11230 20 76 6f 69 64 28 2a 78 44 65 73 74 72 6f 79 29   void(*xDestroy)
11240 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
11250 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
11260 6f 72 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  or pUserData */.
11270 29 7b 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20  ){.  Fts5Global 
11280 2a 70 47 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35  *pGlobal = (Fts5
11290 47 6c 6f 62 61 6c 2a 29 70 41 70 69 3b 0a 20 20  Global*)pApi;.  
112a0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
112b0 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
112c0 6f 6e 28 70 47 6c 6f 62 61 6c 2d 3e 64 62 2c 20  on(pGlobal->db, 
112d0 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 69 66  zName, -1);.  if
112e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
112f0 29 7b 0a 20 20 20 20 46 74 73 35 41 75 78 69 6c  ){.    Fts5Auxil
11300 69 61 72 79 20 2a 70 41 75 78 3b 0a 20 20 20 20  iary *pAux;.    
11310 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65  /* Size of zName
11340 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75   in bytes, inclu
11350 64 69 6e 67 20 5c 30 20 2a 2f 0a 20 20 20 20 69  ding \0 */.    i
11360 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11380 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
11390 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
113a0 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e  .    nName = (in
113b0 74 29 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  t)strlen(zName) 
113c0 2b 20 31 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  + 1;.    nByte =
113d0 20 73 69 7a 65 6f 66 28 46 74 73 35 41 75 78 69   sizeof(Fts5Auxi
113e0 6c 69 61 72 79 29 20 2b 20 6e 4e 61 6d 65 3b 0a  liary) + nName;.
113f0 20 20 20 20 70 41 75 78 20 3d 20 28 46 74 73 35      pAux = (Fts5
11400 41 75 78 69 6c 69 61 72 79 2a 29 73 71 6c 69 74  Auxiliary*)sqlit
11410 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
11420 3b 0a 20 20 20 20 69 66 28 20 70 41 75 78 20 29  ;.    if( pAux )
11430 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
11440 41 75 78 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Aux, 0, nByte);.
11450 20 20 20 20 20 20 70 41 75 78 2d 3e 7a 46 75 6e        pAux->zFun
11460 63 20 3d 20 28 63 68 61 72 2a 29 26 70 41 75 78  c = (char*)&pAux
11470 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  [1];.      memcp
11480 79 28 70 41 75 78 2d 3e 7a 46 75 6e 63 2c 20 7a  y(pAux->zFunc, z
11490 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
114a0 20 20 20 20 70 41 75 78 2d 3e 70 47 6c 6f 62 61      pAux->pGloba
114b0 6c 20 3d 20 70 47 6c 6f 62 61 6c 3b 0a 20 20 20  l = pGlobal;.   
114c0 20 20 20 70 41 75 78 2d 3e 70 55 73 65 72 44 61     pAux->pUserDa
114d0 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
114e0 20 20 20 20 20 20 70 41 75 78 2d 3e 78 46 75 6e        pAux->xFun
114f0 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 20 20 20  c = xFunc;.     
11500 20 70 41 75 78 2d 3e 78 44 65 73 74 72 6f 79 20   pAux->xDestroy 
11510 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20  = xDestroy;.    
11520 20 20 70 41 75 78 2d 3e 70 4e 65 78 74 20 3d 20    pAux->pNext = 
11530 70 47 6c 6f 62 61 6c 2d 3e 70 41 75 78 3b 0a 20  pGlobal->pAux;. 
11540 20 20 20 20 20 70 47 6c 6f 62 61 6c 2d 3e 70 41       pGlobal->pA
11550 75 78 20 3d 20 70 41 75 78 3b 0a 20 20 20 20 7d  ux = pAux;.    }
11560 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
11570 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11580 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
11590 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
115a0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 74  Register a new t
115b0 6f 6b 65 6e 69 7a 65 72 2e 20 54 68 69 73 20 69  okenizer. This i
115c0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
115d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  tion of the .** 
115e0 66 74 73 35 5f 61 70 69 2e 78 43 72 65 61 74 65  fts5_api.xCreate
115f0 54 6f 6b 65 6e 69 7a 65 72 28 29 20 6d 65 74 68  Tokenizer() meth
11600 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
11610 74 20 66 74 73 35 43 72 65 61 74 65 54 6f 6b 65  t fts5CreateToke
11620 6e 69 7a 65 72 28 0a 20 20 66 74 73 35 5f 61 70  nizer(.  fts5_ap
11630 69 20 2a 70 41 70 69 2c 20 20 20 20 20 20 20 20  i *pApi,        
11640 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62           /* Glob
11650 61 6c 20 63 6f 6e 74 65 78 74 20 28 6f 6e 65 20  al context (one 
11660 70 65 72 20 64 62 20 68 61 6e 64 6c 65 29 20 2a  per db handle) *
11670 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11680 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
11690 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6e      /* Name of n
116a0 65 77 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ew function */. 
116b0 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61   void *pUserData
116c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
116d0 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20 66 6f   /* User data fo
116e0 72 20 61 75 78 2e 20 66 75 6e 63 74 69 6f 6e 20  r aux. function 
116f0 2a 2f 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69  */.  fts5_tokeni
11700 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c  zer *pTokenizer,
11710 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65       /* Tokenize
11720 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
11730 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 44 65 73   */.  void(*xDes
11740 74 72 6f 79 29 28 76 6f 69 64 2a 29 20 20 20 20  troy)(void*)    
11750 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
11760 74 6f 72 20 66 6f 72 20 70 55 73 65 72 44 61 74  tor for pUserDat
11770 61 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 47 6c  a */.){.  Fts5Gl
11780 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 20 3d 20  obal *pGlobal = 
11790 28 46 74 73 35 47 6c 6f 62 61 6c 2a 29 70 41 70  (Fts5Global*)pAp
117a0 69 3b 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  i;.  Fts5Tokeniz
117b0 65 72 4d 6f 64 75 6c 65 20 2a 70 4e 65 77 3b 0a  erModule *pNew;.
117c0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
117f0 6d 65 20 61 6e 64 20 69 74 73 20 5c 30 20 74 65  me and its \0 te
11800 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  rminator */.  in
11810 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11830 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
11840 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
11850 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11860 5f 4f 4b 3b 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20  _OK;..  nName = 
11870 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 61 6d  (int)strlen(zNam
11880 65 29 20 2b 20 31 3b 0a 20 20 6e 42 79 74 65 20  e) + 1;.  nByte 
11890 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 54 6f 6b  = sizeof(Fts5Tok
118a0 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 29 20 2b 20  enizerModule) + 
118b0 6e 4e 61 6d 65 3b 0a 20 20 70 4e 65 77 20 3d 20  nName;.  pNew = 
118c0 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f  (Fts5TokenizerMo
118d0 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 5f 6d 61  dule*)sqlite3_ma
118e0 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69  lloc(nByte);.  i
118f0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
11900 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 6e  emset(pNew, 0, n
11910 42 79 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Byte);.    pNew-
11920 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
11930 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 6d 65  &pNew[1];.    me
11940 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65  mcpy(pNew->zName
11950 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
11960 0a 20 20 20 20 70 4e 65 77 2d 3e 70 55 73 65 72  .    pNew->pUser
11970 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61  Data = pUserData
11980 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78 20 3d 20  ;.    pNew->x = 
11990 2a 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20  *pTokenizer;.   
119a0 20 70 4e 65 77 2d 3e 78 44 65 73 74 72 6f 79 20   pNew->xDestroy 
119b0 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20  = xDestroy;.    
119c0 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 47  pNew->pNext = pG
119d0 6c 6f 62 61 6c 2d 3e 70 54 6f 6b 3b 0a 20 20 20  lobal->pTok;.   
119e0 20 70 47 6c 6f 62 61 6c 2d 3e 70 54 6f 6b 20 3d   pGlobal->pTok =
119f0 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 70   pNew;.    if( p
11a00 4e 65 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b  New->pNext==0 ){
11a10 0a 20 20 20 20 20 20 70 47 6c 6f 62 61 6c 2d 3e  .      pGlobal->
11a20 70 44 66 6c 74 54 6f 6b 20 3d 20 70 4e 65 77 3b  pDfltTok = pNew;
11a30 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
11a40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11a50 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65  NOMEM;.  }..  re
11a60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
11a70 69 63 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  ic Fts5Tokenizer
11a80 4d 6f 64 75 6c 65 20 2a 66 74 73 35 4c 6f 63 61  Module *fts5Loca
11a90 74 65 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 46  teTokenizer(.  F
11aa0 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62  ts5Global *pGlob
11ab0 61 6c 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  al, .  const cha
11ac0 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 46 74  r *zName.){.  Ft
11ad0 73 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c  s5TokenizerModul
11ae0 65 20 2a 70 4d 6f 64 20 3d 20 30 3b 0a 0a 20 20  e *pMod = 0;..  
11af0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
11b00 20 20 20 20 70 4d 6f 64 20 3d 20 70 47 6c 6f 62      pMod = pGlob
11b10 61 6c 2d 3e 70 44 66 6c 74 54 6f 6b 3b 0a 20 20  al->pDfltTok;.  
11b20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
11b30 4d 6f 64 3d 70 47 6c 6f 62 61 6c 2d 3e 70 54 6f  Mod=pGlobal->pTo
11b40 6b 3b 20 70 4d 6f 64 3b 20 70 4d 6f 64 3d 70 4d  k; pMod; pMod=pM
11b50 6f 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  od->pNext){.    
11b60 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
11b70 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 70 4d 6f  ricmp(zName, pMo
11b80 64 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  d->zName)==0 ) b
11b90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
11ba0 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 3b 0a  .  return pMod;.
11bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
11bc0 74 6f 6b 65 6e 69 7a 65 72 2e 20 54 68 69 73 20  tokenizer. This 
11bd0 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
11be0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  ation of the .**
11bf0 20 66 74 73 35 5f 61 70 69 2e 78 46 69 6e 64 54   fts5_api.xFindT
11c00 6f 6b 65 6e 69 7a 65 72 28 29 20 6d 65 74 68 6f  okenizer() metho
11c10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
11c20 20 66 74 73 35 46 69 6e 64 54 6f 6b 65 6e 69 7a   fts5FindTokeniz
11c30 65 72 28 0a 20 20 66 74 73 35 5f 61 70 69 20 2a  er(.  fts5_api *
11c40 70 41 70 69 2c 20 20 20 20 20 20 20 20 20 20 20  pApi,           
11c50 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
11c60 63 6f 6e 74 65 78 74 20 28 6f 6e 65 20 70 65 72  context (one per
11c70 20 64 62 20 68 61 6e 64 6c 65 29 20 2a 2f 0a 20   db handle) */. 
11c80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
11c90 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
11ca0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20   /* Name of new 
11cb0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
11cc0 69 64 20 2a 2a 70 70 55 73 65 72 44 61 74 61 2c  id **ppUserData,
11cd0 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  .  fts5_tokenize
11ce0 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 20 20  r *pTokenizer   
11cf0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
11d00 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
11d10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11d20 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 54 6f 6b  TE_OK;.  Fts5Tok
11d30 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70 4d  enizerModule *pM
11d40 6f 64 3b 0a 0a 20 20 70 4d 6f 64 20 3d 20 66 74  od;..  pMod = ft
11d50 73 35 4c 6f 63 61 74 65 54 6f 6b 65 6e 69 7a 65  s5LocateTokenize
11d60 72 28 28 46 74 73 35 47 6c 6f 62 61 6c 2a 29 70  r((Fts5Global*)p
11d70 41 70 69 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  Api, zName);.  i
11d80 66 28 20 70 4d 6f 64 20 29 7b 0a 20 20 20 20 2a  f( pMod ){.    *
11d90 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 4d 6f  pTokenizer = pMo
11da0 64 2d 3e 78 3b 0a 20 20 20 20 2a 70 70 55 73 65  d->x;.    *ppUse
11db0 72 44 61 74 61 20 3d 20 70 4d 6f 64 2d 3e 70 55  rData = pMod->pU
11dc0 73 65 72 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65  serData;.  }else
11dd0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6f  {.    memset(pTo
11de0 6b 65 6e 69 7a 65 72 2c 20 30 2c 20 73 69 7a 65  kenizer, 0, size
11df0 6f 66 28 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  of(fts5_tokenize
11e00 72 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r));.    rc = SQ
11e10 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
11e20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11e30 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
11e40 47 65 74 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20  GetTokenizer(.  
11e50 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f  Fts5Global *pGlo
11e60 62 61 6c 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  bal, .  const ch
11e70 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69 6e  ar **azArg,.  in
11e80 74 20 6e 41 72 67 2c 0a 20 20 46 74 73 35 54 6f  t nArg,.  Fts5To
11e90 6b 65 6e 69 7a 65 72 20 2a 2a 70 70 54 6f 6b 2c  kenizer **ppTok,
11ea0 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  .  fts5_tokenize
11eb0 72 20 2a 2a 70 70 54 6f 6b 41 70 69 2c 0a 20 20  r **ppTokApi,.  
11ec0 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
11ed0 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 4d    Fts5TokenizerM
11ee0 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 0a 20 20 69  odule *pMod;.  i
11ef0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11f00 4b 3b 0a 0a 20 20 70 4d 6f 64 20 3d 20 66 74 73  K;..  pMod = fts
11f10 35 4c 6f 63 61 74 65 54 6f 6b 65 6e 69 7a 65 72  5LocateTokenizer
11f20 28 70 47 6c 6f 62 61 6c 2c 20 6e 41 72 67 3d 3d  (pGlobal, nArg==
11f30 30 20 3f 20 30 20 3a 20 61 7a 41 72 67 5b 30 5d  0 ? 0 : azArg[0]
11f40 29 3b 0a 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30  );.  if( pMod==0
11f50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11f60 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 72 63  nArg>0 );.    rc
11f70 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
11f80 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71  .    *pzErr = sq
11f90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
11fa0 6f 20 73 75 63 68 20 74 6f 6b 65 6e 69 7a 65 72  o such tokenizer
11fb0 3a 20 25 73 22 2c 20 61 7a 41 72 67 5b 30 5d 29  : %s", azArg[0])
11fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
11fd0 63 20 3d 20 70 4d 6f 64 2d 3e 78 2e 78 43 72 65  c = pMod->x.xCre
11fe0 61 74 65 28 70 4d 6f 64 2d 3e 70 55 73 65 72 44  ate(pMod->pUserD
11ff0 61 74 61 2c 20 26 61 7a 41 72 67 5b 31 5d 2c 20  ata, &azArg[1], 
12000 28 6e 41 72 67 3f 6e 41 72 67 2d 31 3a 30 29 2c  (nArg?nArg-1:0),
12010 20 70 70 54 6f 6b 29 3b 0a 20 20 20 20 2a 70 70   ppTok);.    *pp
12020 54 6f 6b 41 70 69 20 3d 20 26 70 4d 6f 64 2d 3e  TokApi = &pMod->
12030 78 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  x;.    if( rc!=S
12040 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 7a 45 72  QLITE_OK && pzEr
12050 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  r ){.      *pzEr
12060 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
12070 6e 74 66 28 22 65 72 72 6f 72 20 69 6e 20 74 6f  ntf("error in to
12080 6b 65 6e 69 7a 65 72 20 63 6f 6e 73 74 72 75 63  kenizer construc
12090 74 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tor");.    }.  }
120a0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
120b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70  TE_OK ){.    *pp
120c0 54 6f 6b 41 70 69 20 3d 20 30 3b 0a 20 20 20 20  TokApi = 0;.    
120d0 2a 70 70 54 6f 6b 20 3d 20 30 3b 0a 20 20 7d 0a  *ppTok = 0;.  }.
120e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
120f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12100 35 4d 6f 64 75 6c 65 44 65 73 74 72 6f 79 28 76  5ModuleDestroy(v
12110 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 46 74  oid *pCtx){.  Ft
12120 73 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c  s5TokenizerModul
12130 65 20 2a 70 54 6f 6b 2c 20 2a 70 4e 65 78 74 54  e *pTok, *pNextT
12140 6f 6b 3b 0a 20 20 46 74 73 35 41 75 78 69 6c 69  ok;.  Fts5Auxili
12150 61 72 79 20 2a 70 41 75 78 2c 20 2a 70 4e 65 78  ary *pAux, *pNex
12160 74 41 75 78 3b 0a 20 20 46 74 73 35 47 6c 6f 62  tAux;.  Fts5Glob
12170 61 6c 20 2a 70 47 6c 6f 62 61 6c 20 3d 20 28 46  al *pGlobal = (F
12180 74 73 35 47 6c 6f 62 61 6c 2a 29 70 43 74 78 3b  ts5Global*)pCtx;
12190 0a 0a 20 20 66 6f 72 28 70 41 75 78 3d 70 47 6c  ..  for(pAux=pGl
121a0 6f 62 61 6c 2d 3e 70 41 75 78 3b 20 70 41 75 78  obal->pAux; pAux
121b0 3b 20 70 41 75 78 3d 70 4e 65 78 74 41 75 78 29  ; pAux=pNextAux)
121c0 7b 0a 20 20 20 20 70 4e 65 78 74 41 75 78 20 3d  {.    pNextAux =
121d0 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
121e0 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 73    if( pAux->xDes
121f0 74 72 6f 79 20 29 20 70 41 75 78 2d 3e 78 44 65  troy ) pAux->xDe
12200 73 74 72 6f 79 28 70 41 75 78 2d 3e 70 55 73 65  stroy(pAux->pUse
12210 72 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  rData);.    sqli
12220 74 65 33 5f 66 72 65 65 28 70 41 75 78 29 3b 0a  te3_free(pAux);.
12230 20 20 7d 0a 0a 20 20 66 6f 72 28 70 54 6f 6b 3d    }..  for(pTok=
12240 70 47 6c 6f 62 61 6c 2d 3e 70 54 6f 6b 3b 20 70  pGlobal->pTok; p
12250 54 6f 6b 3b 20 70 54 6f 6b 3d 70 4e 65 78 74 54  Tok; pTok=pNextT
12260 6f 6b 29 7b 0a 20 20 20 20 70 4e 65 78 74 54 6f  ok){.    pNextTo
12270 6b 20 3d 20 70 54 6f 6b 2d 3e 70 4e 65 78 74 3b  k = pTok->pNext;
12280 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 2d 3e 78  .    if( pTok->x
12290 44 65 73 74 72 6f 79 20 29 20 70 54 6f 6b 2d 3e  Destroy ) pTok->
122a0 78 44 65 73 74 72 6f 79 28 70 54 6f 6b 2d 3e 70  xDestroy(pTok->p
122b0 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 73  UserData);.    s
122c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 6f 6b  qlite3_free(pTok
122d0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
122e0 33 5f 66 72 65 65 28 70 47 6c 6f 62 61 6c 29 3b  3_free(pGlobal);
122f0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
12300 66 74 73 35 46 74 73 35 46 75 6e 63 28 0a 20 20  fts5Fts5Func(.  
12310 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
12320 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
12330 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  /* Function call
12340 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
12350 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12370 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   Number of args 
12380 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
12390 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
123a0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
123b0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
123c0 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  .  Fts5Global *p
123d0 47 6c 6f 62 61 6c 20 3d 20 28 46 74 73 35 47 6c  Global = (Fts5Gl
123e0 6f 62 61 6c 2a 29 73 71 6c 69 74 65 33 5f 75 73  obal*)sqlite3_us
123f0 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
12400 20 63 68 61 72 20 62 75 66 5b 38 5d 3b 0a 20 20   char buf[8];.  
12410 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20  assert( nArg==0 
12420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
12430 65 6f 66 28 62 75 66 29 3e 3d 73 69 7a 65 6f 66  eof(buf)>=sizeof
12440 28 70 47 6c 6f 62 61 6c 29 20 29 3b 0a 20 20 6d  (pGlobal) );.  m
12450 65 6d 63 70 79 28 62 75 66 2c 20 28 76 6f 69 64  emcpy(buf, (void
12460 2a 29 26 70 47 6c 6f 62 61 6c 2c 20 73 69 7a 65  *)&pGlobal, size
12470 6f 66 28 70 47 6c 6f 62 61 6c 29 29 3b 0a 20 20  of(pGlobal));.  
12480 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
12490 6c 6f 62 28 70 43 74 78 2c 20 62 75 66 2c 20 73  lob(pCtx, buf, s
124a0 69 7a 65 6f 66 28 70 47 6c 6f 62 61 6c 29 2c 20  izeof(pGlobal), 
124b0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
124c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
124d0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 66 74  ementation of ft
124e0 73 35 5f 73 6f 75 72 63 65 5f 69 64 28 29 20 66  s5_source_id() f
124f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
12500 69 63 20 76 6f 69 64 20 66 74 73 35 53 6f 75 72  ic void fts5Sour
12510 63 65 49 64 46 75 6e 63 28 0a 20 20 73 71 6c 69  ceIdFunc(.  sqli
12520 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
12530 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
12540 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
12550 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
12560 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
12570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12580 62 65 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20  ber of args */. 
12590 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
125a0 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
125b0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
125c0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 61  uments */.){.  a
125d0 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 29  ssert( nArg==0 )
125e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
125f0 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 22 2d  lt_text(pCtx, "-
12600 2d 46 54 53 35 2d 53 4f 55 52 43 45 2d 49 44 2d  -FTS5-SOURCE-ID-
12610 2d 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  -", -1, SQLITE_T
12620 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 73 74  RANSIENT);.}..st
12630 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 69  atic int fts5Ini
12640 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
12650 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
12660 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 66 74  qlite3_module ft
12670 73 35 4d 6f 64 20 3d 20 7b 0a 20 20 20 20 2f 2a  s5Mod = {.    /*
12680 20 69 56 65 72 73 69 6f 6e 20 20 20 20 20 20 2a   iVersion      *
12690 2f 20 32 2c 0a 20 20 20 20 2f 2a 20 78 43 72 65  / 2,.    /* xCre
126a0 61 74 65 20 20 20 20 20 20 20 2a 2f 20 66 74 73  ate       */ fts
126b0 35 43 72 65 61 74 65 4d 65 74 68 6f 64 2c 0a 20  5CreateMethod,. 
126c0 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 20     /* xConnect  
126d0 20 20 20 20 2a 2f 20 66 74 73 35 43 6f 6e 6e 65      */ fts5Conne
126e0 63 74 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a  ctMethod,.    /*
126f0 20 78 42 65 73 74 49 6e 64 65 78 20 20 20 20 2a   xBestIndex    *
12700 2f 20 66 74 73 35 42 65 73 74 49 6e 64 65 78 4d  / fts5BestIndexM
12710 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 44  ethod,.    /* xD
12720 69 73 63 6f 6e 6e 65 63 74 20 20 20 2a 2f 20 66  isconnect   */ f
12730 74 73 35 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74  ts5DisconnectMet
12740 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 44 65 73  hod,.    /* xDes
12750 74 72 6f 79 20 20 20 20 20 20 2a 2f 20 66 74 73  troy      */ fts
12760 35 44 65 73 74 72 6f 79 4d 65 74 68 6f 64 2c 0a  5DestroyMethod,.
12770 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 20 20 20      /* xOpen    
12780 20 20 20 20 20 2a 2f 20 66 74 73 35 4f 70 65 6e       */ fts5Open
12790 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78  Method,.    /* x
127a0 43 6c 6f 73 65 20 20 20 20 20 20 20 20 2a 2f 20  Close        */ 
127b0 66 74 73 35 43 6c 6f 73 65 4d 65 74 68 6f 64 2c  fts5CloseMethod,
127c0 0a 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20  .    /* xFilter 
127d0 20 20 20 20 20 20 2a 2f 20 66 74 73 35 46 69 6c        */ fts5Fil
127e0 74 65 72 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f  terMethod,.    /
127f0 2a 20 78 4e 65 78 74 20 20 20 20 20 20 20 20 20  * xNext         
12800 2a 2f 20 66 74 73 35 4e 65 78 74 4d 65 74 68 6f  */ fts5NextMetho
12810 64 2c 0a 20 20 20 20 2f 2a 20 78 45 6f 66 20 20  d,.    /* xEof  
12820 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35 45          */ fts5E
12830 6f 66 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a  ofMethod,.    /*
12840 20 78 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 2a   xColumn       *
12850 2f 20 66 74 73 35 43 6f 6c 75 6d 6e 4d 65 74 68  / fts5ColumnMeth
12860 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 52 6f 77 69  od,.    /* xRowi
12870 64 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35  d        */ fts5
12880 52 6f 77 69 64 4d 65 74 68 6f 64 2c 0a 20 20 20  RowidMethod,.   
12890 20 2f 2a 20 78 55 70 64 61 74 65 20 20 20 20 20   /* xUpdate     
128a0 20 20 2a 2f 20 66 74 73 35 55 70 64 61 74 65 4d    */ fts5UpdateM
128b0 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 42  ethod,.    /* xB
128c0 65 67 69 6e 20 20 20 20 20 20 20 20 2a 2f 20 66  egin        */ f
128d0 74 73 35 42 65 67 69 6e 4d 65 74 68 6f 64 2c 0a  ts5BeginMethod,.
128e0 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 20 20 20      /* xSync    
128f0 20 20 20 20 20 2a 2f 20 66 74 73 35 53 79 6e 63       */ fts5Sync
12900 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78  Method,.    /* x
12910 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 2a 2f 20  Commit       */ 
12920 66 74 73 35 43 6f 6d 6d 69 74 4d 65 74 68 6f 64  fts5CommitMethod
12930 2c 0a 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61  ,.    /* xRollba
12940 63 6b 20 20 20 20 20 2a 2f 20 66 74 73 35 52 6f  ck     */ fts5Ro
12950 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 2c 0a 20 20  llbackMethod,.  
12960 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69    /* xFindFuncti
12970 6f 6e 20 2a 2f 20 66 74 73 35 46 69 6e 64 46 75  on */ fts5FindFu
12980 6e 63 74 69 6f 6e 4d 65 74 68 6f 64 2c 0a 20 20  nctionMethod,.  
12990 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 20 20 20    /* xRename    
129a0 20 20 20 2a 2f 20 66 74 73 35 52 65 6e 61 6d 65     */ fts5Rename
129b0 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78  Method,.    /* x
129c0 53 61 76 65 70 6f 69 6e 74 20 20 20 20 2a 2f 20  Savepoint    */ 
129d0 66 74 73 35 53 61 76 65 70 6f 69 6e 74 4d 65 74  fts5SavepointMet
129e0 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 52 65 6c  hod,.    /* xRel
129f0 65 61 73 65 20 20 20 20 20 20 2a 2f 20 66 74 73  ease      */ fts
12a00 35 52 65 6c 65 61 73 65 4d 65 74 68 6f 64 2c 0a  5ReleaseMethod,.
12a10 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
12a20 54 6f 20 20 20 2a 2f 20 66 74 73 35 52 6f 6c 6c  To   */ fts5Roll
12a30 62 61 63 6b 54 6f 4d 65 74 68 6f 64 2c 0a 20 20  backToMethod,.  
12a40 7d 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  };..  int rc;.  
12a50 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f  Fts5Global *pGlo
12a60 62 61 6c 20 3d 20 30 3b 0a 0a 20 20 70 47 6c 6f  bal = 0;..  pGlo
12a70 62 61 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61  bal = (Fts5Globa
12a80 6c 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  l*)sqlite3_mallo
12a90 63 28 73 69 7a 65 6f 66 28 46 74 73 35 47 6c 6f  c(sizeof(Fts5Glo
12aa0 62 61 6c 29 29 3b 0a 20 20 69 66 28 20 70 47 6c  bal));.  if( pGl
12ab0 6f 62 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  obal==0 ){.    r
12ac0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
12ad0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
12ae0 6f 69 64 20 2a 70 20 3d 20 28 76 6f 69 64 2a 29  oid *p = (void*)
12af0 70 47 6c 6f 62 61 6c 3b 0a 20 20 20 20 6d 65 6d  pGlobal;.    mem
12b00 73 65 74 28 70 47 6c 6f 62 61 6c 2c 20 30 2c 20  set(pGlobal, 0, 
12b10 73 69 7a 65 6f 66 28 46 74 73 35 47 6c 6f 62 61  sizeof(Fts5Globa
12b20 6c 29 29 3b 0a 20 20 20 20 70 47 6c 6f 62 61 6c  l));.    pGlobal
12b30 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70  ->db = db;.    p
12b40 47 6c 6f 62 61 6c 2d 3e 61 70 69 2e 69 56 65 72  Global->api.iVer
12b50 73 69 6f 6e 20 3d 20 32 3b 0a 20 20 20 20 70 47  sion = 2;.    pG
12b60 6c 6f 62 61 6c 2d 3e 61 70 69 2e 78 43 72 65 61  lobal->api.xCrea
12b70 74 65 46 75 6e 63 74 69 6f 6e 20 3d 20 66 74 73  teFunction = fts
12b80 35 43 72 65 61 74 65 41 75 78 3b 0a 20 20 20 20  5CreateAux;.    
12b90 70 47 6c 6f 62 61 6c 2d 3e 61 70 69 2e 78 43 72  pGlobal->api.xCr
12ba0 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 20 3d 20  eateTokenizer = 
12bb0 66 74 73 35 43 72 65 61 74 65 54 6f 6b 65 6e 69  fts5CreateTokeni
12bc0 7a 65 72 3b 0a 20 20 20 20 70 47 6c 6f 62 61 6c  zer;.    pGlobal
12bd0 2d 3e 61 70 69 2e 78 46 69 6e 64 54 6f 6b 65 6e  ->api.xFindToken
12be0 69 7a 65 72 20 3d 20 66 74 73 35 46 69 6e 64 54  izer = fts5FindT
12bf0 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20 72 63  okenizer;.    rc
12c00 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
12c10 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20  e_module_v2(db, 
12c20 22 66 74 73 35 22 2c 20 26 66 74 73 35 4d 6f 64  "fts5", &fts5Mod
12c30 2c 20 70 2c 20 66 74 73 35 4d 6f 64 75 6c 65 44  , p, fts5ModuleD
12c40 65 73 74 72 6f 79 29 3b 0a 20 20 20 20 69 66 28  estroy);.    if(
12c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12c60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
12c70 35 49 6e 64 65 78 49 6e 69 74 28 64 62 29 3b 0a  5IndexInit(db);.
12c80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12c90 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c  TE_OK ) rc = sql
12ca0 69 74 65 33 46 74 73 35 45 78 70 72 49 6e 69 74  ite3Fts5ExprInit
12cb0 28 70 47 6c 6f 62 61 6c 2c 20 64 62 29 3b 0a 20  (pGlobal, db);. 
12cc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12cd0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69  E_OK ) rc = sqli
12ce0 74 65 33 46 74 73 35 41 75 78 49 6e 69 74 28 26  te3Fts5AuxInit(&
12cf0 70 47 6c 6f 62 61 6c 2d 3e 61 70 69 29 3b 0a 20  pGlobal->api);. 
12d00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12d10 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69  E_OK ) rc = sqli
12d20 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  te3Fts5Tokenizer
12d30 49 6e 69 74 28 26 70 47 6c 6f 62 61 6c 2d 3e 61  Init(&pGlobal->a
12d40 70 69 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  pi);.    if( rc=
12d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
12d60 3d 20 73 71 6c 69 74 65 33 46 74 73 35 56 6f 63  = sqlite3Fts5Voc
12d70 61 62 49 6e 69 74 28 70 47 6c 6f 62 61 6c 2c 20  abInit(pGlobal, 
12d80 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  db);.    if( rc=
12d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12da0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12db0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12dc0 28 0a 20 20 20 20 20 20 20 20 20 20 64 62 2c 20  (.          db, 
12dd0 22 66 74 73 35 22 2c 20 30 2c 20 53 51 4c 49 54  "fts5", 0, SQLIT
12de0 45 5f 55 54 46 38 2c 20 70 2c 20 66 74 73 35 46  E_UTF8, p, fts5F
12df0 74 73 35 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20  ts5Func, 0, 0.  
12e00 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
12e10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12e20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
12e30 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12e40 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20  function(.      
12e50 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 73 6f      db, "fts5_so
12e60 75 72 63 65 5f 69 64 22 2c 20 30 2c 20 53 51 4c  urce_id", 0, SQL
12e70 49 54 45 5f 55 54 46 38 2c 20 70 2c 20 66 74 73  ITE_UTF8, p, fts
12e80 35 53 6f 75 72 63 65 49 64 46 75 6e 63 2c 20 30  5SourceIdFunc, 0
12e90 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
12ea0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12eb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
12ec0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
12ed0 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 74 6f  ions are used to
12ee0 20 72 65 67 69 73 74 65 72 20 74 68 65 20 6d 6f   register the mo
12ef0 64 75 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65  dule with SQLite
12f00 2e 20 49 66 0a 2a 2a 20 74 68 69 73 20 6d 6f 64  . If.** this mod
12f10 75 6c 65 20 69 73 20 62 65 69 6e 67 20 62 75 69  ule is being bui
12f20 6c 74 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  lt as part of th
12f30 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 28 53  e SQLite core (S
12f40 51 4c 49 54 45 5f 43 4f 52 45 20 69 73 0a 2a 2a  QLITE_CORE is.**
12f50 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
12f60 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 77  sqlite3_open() w
12f70 69 6c 6c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ill call sqlite3
12f80 46 74 73 35 49 6e 69 74 28 29 20 64 69 72 65 63  Fts5Init() direc
12f90 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  tly..**.** Or, i
12fa0 66 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  f this module is
12fb0 20 62 65 69 6e 67 20 62 75 69 6c 74 20 61 73 20   being built as 
12fc0 61 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e  a loadable exten
12fd0 73 69 6f 6e 2c 20 0a 2a 2a 20 73 71 6c 69 74 65  sion, .** sqlite
12fe0 33 46 74 73 35 49 6e 69 74 28 29 20 69 73 20 6f  3Fts5Init() is o
12ff0 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 74  mitted and the t
13000 77 6f 20 73 74 61 6e 64 61 72 64 20 65 6e 74 72  wo standard entr
13010 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 73 71 6c 69  y points.** sqli
13020 74 65 33 5f 66 74 73 5f 69 6e 69 74 28 29 20 61  te3_fts_init() a
13030 6e 64 20 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  nd sqlite3_fts5_
13040 69 6e 69 74 28 29 20 64 65 66 69 6e 65 64 20 69  init() defined i
13050 6e 73 74 65 61 64 2e 0a 2a 2f 0a 23 69 66 6e 64  nstead..*/.#ifnd
13060 65 66 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a 23  ef SQLITE_CORE.#
13070 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64  ifdef _WIN32.__d
13080 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
13090 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71  t).#endif.int sq
130a0 6c 69 74 65 33 5f 66 74 73 5f 69 6e 69 74 28 0a  lite3_fts_init(.
130b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
130c0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
130d0 2c 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  ,.  const sqlite
130e0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a  3_api_routines *
130f0 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45  pApi.){.  SQLITE
13100 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32  _EXTENSION_INIT2
13110 28 70 41 70 69 29 3b 0a 20 20 28 76 6f 69 64 29  (pApi);.  (void)
13120 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55 6e  pzErrMsg;  /* Un
13130 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 20 2a  used parameter *
13140 2f 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  /.  return fts5I
13150 6e 69 74 28 64 62 29 3b 0a 7d 0a 0a 23 69 66 64  nit(db);.}..#ifd
13160 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c  ef _WIN32.__decl
13170 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a  spec(dllexport).
13180 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74  #endif.int sqlit
13190 65 33 5f 66 74 73 35 5f 69 6e 69 74 28 0a 20 20  e3_fts5_init(.  
131a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
131b0 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a  har **pzErrMsg,.
131c0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
131d0 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41  api_routines *pA
131e0 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45 5f 45  pi.){.  SQLITE_E
131f0 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70  XTENSION_INIT2(p
13200 41 70 69 29 3b 0a 20 20 28 76 6f 69 64 29 70 7a  Api);.  (void)pz
13210 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55 6e 75 73  ErrMsg;  /* Unus
13220 65 64 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ed parameter */.
13230 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 69    return fts5Ini
13240 74 28 64 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 69  t(db);.}.#else.i
13250 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
13260 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
13270 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
13280 69 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  it(db);.}.#endif
13290 0a                                               .