/ Hex Artifact Content
Login

Artifact da46761a7e9b582083fcb9f5a3ee50086205fb91f4e68d984a9946e64218e297:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4a 75 6e 20 30  /*.** 2014 Jun 0
0010: 39 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  9.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 69 73 20 61 6e 20 53 51 4c 69 74 65 20 6d 6f   is an SQLite mo
0190: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  dule implementin
01a0: 67 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72  g full-text sear
01b0: 63 68 2e 0a 2a 2f 0a 0a 0a 23 69 6e 63 6c 75 64  ch..*/...#includ
01c0: 65 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a 2f  e "fts5Int.h"../
01d0: 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62  *.** This variab
01e0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 66 61 6c  le is set to fal
01f0: 73 65 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  se when running 
0200: 74 65 73 74 73 20 66 6f 72 20 77 68 69 63 68 20  tests for which 
0210: 74 68 65 20 6f 6e 20 64 69 73 6b 0a 2a 2a 20 73  the on disk.** s
0220: 74 72 75 63 74 75 72 65 73 20 73 68 6f 75 6c 64  tructures should
0230: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 2e   not be corrupt.
0240: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 72 75 65   Otherwise, true
0250: 2e 20 49 66 20 69 74 20 69 73 20 66 61 6c 73 65  . If it is false
0260: 2c 20 65 78 74 72 61 0a 2a 2a 20 61 73 73 65 72  , extra.** asser
0270: 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69  t() conditions i
0280: 6e 20 74 68 65 20 66 74 73 35 20 63 6f 64 65 20  n the fts5 code 
0290: 61 72 65 20 61 63 74 69 76 61 74 65 64 20 2d 20  are activated - 
02a0: 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
02b0: 61 72 65 0a 2a 2a 20 6f 6e 6c 79 20 74 72 75 65  are.** only true
02c0: 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
02d0: 74 65 65 64 20 74 68 61 74 20 74 68 65 20 66 74  teed that the ft
02e0: 73 35 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  s5 database is n
02f0: 6f 74 20 63 6f 72 72 75 70 74 2e 0a 2a 2f 0a 69  ot corrupt..*/.i
0300: 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 35 5f  nt sqlite3_fts5_
0310: 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 20 3d  may_be_corrupt =
0320: 20 31 3b 0a 0a 0a 74 79 70 65 64 65 66 20 73 74   1;...typedef st
0330: 72 75 63 74 20 46 74 73 35 41 75 78 64 61 74 61  ruct Fts5Auxdata
0340: 20 46 74 73 35 41 75 78 64 61 74 61 3b 0a 74 79   Fts5Auxdata;.ty
0350: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
0360: 35 41 75 78 69 6c 69 61 72 79 20 46 74 73 35 41  5Auxiliary Fts5A
0370: 75 78 69 6c 69 61 72 79 3b 0a 74 79 70 65 64 65  uxiliary;.typede
0380: 66 20 73 74 72 75 63 74 20 46 74 73 35 43 75 72  f struct Fts5Cur
0390: 73 6f 72 20 46 74 73 35 43 75 72 73 6f 72 3b 0a  sor Fts5Cursor;.
03a0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
03b0: 74 73 35 53 6f 72 74 65 72 20 46 74 73 35 53 6f  ts5Sorter Fts5So
03c0: 72 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  rter;.typedef st
03d0: 72 75 63 74 20 46 74 73 35 54 61 62 6c 65 20 46  ruct Fts5Table F
03e0: 74 73 35 54 61 62 6c 65 3b 0a 74 79 70 65 64 65  ts5Table;.typede
03f0: 66 20 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b  f struct Fts5Tok
0400: 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 46 74 73  enizerModule Fts
0410: 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65  5TokenizerModule
0420: 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 53 20 4f  ;../*.** NOTES O
0430: 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 53 3a 20  N TRANSACTIONS: 
0440: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 69 6e  .**.** SQLite in
0450: 76 6f 6b 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  vokes the follow
0460: 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ing virtual tabl
0470: 65 20 6d 65 74 68 6f 64 73 20 61 73 20 74 72 61  e methods as tra
0480: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
0490: 2a 20 6f 70 65 6e 65 64 20 61 6e 64 20 63 6c 6f  * opened and clo
04a0: 73 65 64 20 62 79 20 74 68 65 20 75 73 65 72 3a  sed by the user:
04b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 42 65 67 69  .**.**     xBegi
04c0: 6e 28 29 3a 20 20 20 20 53 74 61 72 74 20 6f 66  n():    Start of
04d0: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
04e0: 6f 6e 2e 0a 2a 2a 20 20 20 20 20 78 53 79 6e 63  on..**     xSync
04f0: 28 29 3a 20 20 20 20 20 49 6e 69 74 69 61 6c 20  ():     Initial 
0500: 70 61 72 74 20 6f 66 20 74 77 6f 2d 70 68 61 73  part of two-phas
0510: 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 20 20 20  e commit..**    
0520: 20 78 43 6f 6d 6d 69 74 28 29 3a 20 20 20 46 69   xCommit():   Fi
0530: 6e 61 6c 20 70 61 72 74 20 6f 66 20 74 77 6f 2d  nal part of two-
0540: 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a  phase commit..**
0550: 20 20 20 20 20 78 52 6f 6c 6c 62 61 63 6b 28 29       xRollback()
0560: 3a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  : Rollback the t
0570: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
0580: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
0590: 69 73 20 72 65 71 75 69 72 65 64 20 61 73 20 70  is required as p
05a0: 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 69 74 20  art of a commit 
05b0: 74 68 61 74 20 6d 61 79 20 66 61 69 6c 20 69 73  that may fail is
05c0: 20 70 65 72 66 6f 72 6d 65 64 0a 2a 2a 20 69 6e   performed.** in
05d0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
05e0: 6c 62 61 63 6b 2e 20 43 75 72 72 65 6e 74 20 76  lback. Current v
05f0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
0600: 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 65 72 72  e ignore any err
0610: 6f 72 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ors .** returned
0620: 20 62 79 20 78 43 6f 6d 6d 69 74 28 29 2e 0a 2a   by xCommit()..*
0630: 2a 0a 2a 2a 20 41 6e 64 20 61 73 20 73 75 62 2d  *.** And as sub-
0640: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
0650: 20 6f 70 65 6e 65 64 2f 63 6c 6f 73 65 64 3a 0a   opened/closed:.
0660: 2a 2a 0a 2a 2a 20 20 20 20 20 78 53 61 76 65 70  **.**     xSavep
0670: 6f 69 6e 74 28 69 6e 74 20 53 29 3a 20 20 4f 70  oint(int S):  Op
0680: 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 53 2e 0a  en savepoint S..
0690: 2a 2a 20 20 20 20 20 78 52 65 6c 65 61 73 65 28  **     xRelease(
06a0: 69 6e 74 20 53 29 3a 20 20 20 20 43 6f 6d 6d 69  int S):    Commi
06b0: 74 20 61 6e 64 20 63 6c 6f 73 65 20 73 61 76 65  t and close save
06c0: 70 6f 69 6e 74 20 53 2e 0a 2a 2a 20 20 20 20 20  point S..**     
06d0: 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 69 6e 74 20  xRollbackTo(int 
06e0: 53 29 3a 20 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  S): Rollback to 
06f0: 73 74 61 72 74 20 6f 66 20 73 61 76 65 70 6f 69  start of savepoi
0700: 6e 74 20 53 2e 0a 2a 2a 0a 2a 2a 20 44 75 72 69  nt S..**.** Duri
0710: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
0720: 61 63 74 69 6f 6e 20 74 68 65 20 66 74 73 35 5f  action the fts5_
0730: 69 6e 64 65 78 2e 63 20 6d 6f 64 75 6c 65 20 6d  index.c module m
0740: 61 79 20 63 61 63 68 65 20 73 6f 6d 65 20 64 61  ay cache some da
0750: 74 61 20 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  ta .** in-memory
0760: 2e 20 49 74 20 69 73 20 66 6c 75 73 68 65 64 20  . It is flushed 
0770: 74 6f 20 64 69 73 6b 20 77 68 65 6e 65 76 65 72  to disk whenever
0780: 20 78 53 79 6e 63 28 29 2c 20 78 52 65 6c 65 61   xSync(), xRelea
0790: 73 65 28 29 20 6f 72 0a 2a 2a 20 78 53 61 76 65  se() or.** xSave
07a0: 70 6f 69 6e 74 28 29 20 69 73 20 63 61 6c 6c 65  point() is calle
07b0: 64 2e 20 41 6e 64 20 64 69 73 63 61 72 64 65 64  d. And discarded
07c0: 20 77 68 65 6e 65 76 65 72 20 78 52 6f 6c 6c 62   whenever xRollb
07d0: 61 63 6b 28 29 20 6f 72 20 78 52 6f 6c 6c 62 61  ack() or xRollba
07e0: 63 6b 54 6f 28 29 20 0a 2a 2a 20 69 73 20 63 61  ckTo() .** is ca
07f0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  lled..**.** Addi
0800: 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 53 51 4c  tionally, if SQL
0810: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
0820: 69 6e 65 64 2c 20 61 6e 20 69 6e 73 74 61 6e 63  ined, an instanc
0830: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0840: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
0850: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0860: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  d the current tr
0870: 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 2e  ansaction state.
0880: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
0890: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  n.** is not requ
08a0: 69 72 65 64 2c 20 62 75 74 20 69 74 20 69 73 20  ired, but it is 
08b0: 75 73 65 64 20 69 6e 20 74 68 65 20 61 73 73 65  used in the asse
08c0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
08d0: 65 78 65 63 75 74 65 64 20 62 79 0a 2a 2a 20 66  executed by.** f
08e0: 75 6e 63 74 69 6f 6e 20 66 74 73 35 43 68 65 63  unction fts5Chec
08f0: 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74  kTransactionStat
0900: 65 28 29 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  e() (see below).
0910: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 54  .*/.struct Fts5T
0920: 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65 20  ransactionState 
0930: 7b 0a 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20  {.  int eState; 
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 2f 2a 20 30 3d 3d 63 6c 6f 73 65 64      /* 0==closed
0960: 2c 20 31 3d 3d 6f 70 65 6e 2c 20 32 3d 3d 73 79  , 1==open, 2==sy
0970: 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53  nced */.  int iS
0980: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
0990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
09a0: 62 65 72 20 6f 66 20 6f 70 65 6e 20 73 61 76 65  ber of open save
09b0: 70 6f 69 6e 74 73 20 28 30 20 2d 3e 20 6e 6f 6e  points (0 -> non
09c0: 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  e) */.};../*.** 
09d0: 41 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20  A single object 
09e0: 6f 66 20 74 68 69 73 20 74 79 70 65 20 69 73 20  of this type is 
09f0: 61 6c 6c 6f 63 61 74 65 64 20 77 68 65 6e 20 74  allocated when t
0a00: 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 69  he FTS5 module i
0a10: 73 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  s .** registered
0a20: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
0a30: 20 68 61 6e 64 6c 65 2e 20 49 74 20 69 73 20 75   handle. It is u
0a40: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 70 6f 69  sed to store poi
0a50: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 61 6c 6c 20  nters to.** all 
0a60: 72 65 67 69 73 74 65 72 65 64 20 46 54 53 35 20  registered FTS5 
0a70: 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 74 6f 6b  extensions - tok
0a80: 65 6e 69 7a 65 72 73 20 61 6e 64 20 61 75 78 69  enizers and auxi
0a90: 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e  liary functions.
0aa0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 47  .*/.struct Fts5G
0ab0: 6c 6f 62 61 6c 20 7b 0a 20 20 66 74 73 35 5f 61  lobal {.  fts5_a
0ac0: 70 69 20 61 70 69 3b 20 20 20 20 20 20 20 20 20  pi api;         
0ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
0ae0: 72 20 76 69 73 69 62 6c 65 20 70 61 72 74 20 6f  r visible part o
0af0: 66 20 6f 62 6a 65 63 74 20 28 73 65 65 20 66 74  f object (see ft
0b00: 73 35 2e 68 29 20 2a 2f 0a 20 20 73 71 6c 69 74  s5.h) */.  sqlit
0b10: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
0b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
0b30: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
0b40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 20  e connection */ 
0b50: 0a 20 20 69 36 34 20 69 4e 65 78 74 49 64 3b 20  .  i64 iNextId; 
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 61 6c     /* Used to al
0b80: 6c 6f 63 61 74 65 20 75 6e 69 71 75 65 20 63 75  locate unique cu
0b90: 72 73 6f 72 20 69 64 73 20 2a 2f 0a 20 20 46 74  rsor ids */.  Ft
0ba0: 73 35 41 75 78 69 6c 69 61 72 79 20 2a 70 41 75  s5Auxiliary *pAu
0bb0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x;            /*
0bc0: 20 46 69 72 73 74 20 69 6e 20 6c 69 73 74 20 6f   First in list o
0bd0: 66 20 61 6c 6c 20 61 75 78 2e 20 66 75 6e 63 74  f all aux. funct
0be0: 69 6f 6e 73 20 2a 2f 0a 20 20 46 74 73 35 54 6f  ions */.  Fts5To
0bf0: 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70  kenizerModule *p
0c00: 54 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 46 69 72  Tok;      /* Fir
0c10: 73 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c  st in list of al
0c20: 6c 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 6f 64 75  l tokenizer modu
0c30: 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 54 6f 6b  les */.  Fts5Tok
0c40: 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70 44  enizerModule *pD
0c50: 66 6c 74 54 6f 6b 3b 20 20 2f 2a 20 44 65 66 61  fltTok;  /* Defa
0c60: 75 6c 74 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 6f  ult tokenizer mo
0c70: 64 75 6c 65 20 2a 2f 0a 20 20 46 74 73 35 43 75  dule */.  Fts5Cu
0c80: 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20  rsor *pCsr;     
0c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
0ca0: 73 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c  st in list of al
0cb0: 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 2a  l open cursors *
0cc0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  /.};../*.** Each
0cd0: 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
0ce0: 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 77  ion registered w
0cf0: 69 74 68 20 74 68 65 20 46 54 53 35 20 6d 6f 64  ith the FTS5 mod
0d00: 75 6c 65 20 69 73 20 72 65 70 72 65 73 65 6e 74  ule is represent
0d10: 65 64 0a 2a 2a 20 62 79 20 61 6e 20 6f 62 6a 65  ed.** by an obje
0d20: 63 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ct of the follow
0d30: 69 6e 67 20 74 79 70 65 2e 20 41 6c 6c 20 73 75  ing type. All su
0d40: 63 68 20 6f 62 6a 65 63 74 73 20 61 72 65 20 73  ch objects are s
0d50: 74 6f 72 65 64 20 61 73 20 70 61 72 74 0a 2a 2a  tored as part.**
0d60: 20 6f 66 20 74 68 65 20 46 74 73 35 47 6c 6f 62   of the Fts5Glob
0d70: 61 6c 2e 70 41 75 78 20 6c 69 73 74 2e 0a 2a 2f  al.pAux list..*/
0d80: 0a 73 74 72 75 63 74 20 46 74 73 35 41 75 78 69  .struct Fts5Auxi
0d90: 6c 69 61 72 79 20 7b 0a 20 20 46 74 73 35 47 6c  liary {.  Fts5Gl
0da0: 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 3b 20 20  obal *pGlobal;  
0db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f            /* Glo
0dc0: 62 61 6c 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  bal context for 
0dd0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
0de0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20  .  char *zFunc; 
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 6e     /* Function n
0e10: 61 6d 65 20 28 6e 75 6c 2d 74 65 72 6d 69 6e 61  ame (nul-termina
0e20: 74 65 64 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ted) */.  void *
0e30: 70 55 73 65 72 44 61 74 61 3b 20 20 20 20 20 20  pUserData;      
0e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
0e50: 72 2d 64 61 74 61 20 70 6f 69 6e 74 65 72 20 2a  r-data pointer *
0e60: 2f 0a 20 20 66 74 73 35 5f 65 78 74 65 6e 73 69  /.  fts5_extensi
0e70: 6f 6e 5f 66 75 6e 63 74 69 6f 6e 20 78 46 75 6e  on_function xFun
0e80: 63 3b 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  c;  /* Callback 
0e90: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
0ea0: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
0eb0: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 2f 2a  oid*);        /*
0ec0: 20 44 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   Destructor func
0ed0: 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 41 75  tion */.  Fts5Au
0ee0: 78 69 6c 69 61 72 79 20 2a 70 4e 65 78 74 3b 20  xiliary *pNext; 
0ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
0f00: 74 20 72 65 67 69 73 74 65 72 65 64 20 61 75 78  t registered aux
0f10: 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 20  iliary function 
0f20: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  */.};../*.** Eac
0f30: 68 20 74 6f 6b 65 6e 69 7a 65 72 20 6d 6f 64 75  h tokenizer modu
0f40: 6c 65 20 72 65 67 69 73 74 65 72 65 64 20 77 69  le registered wi
0f50: 74 68 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75  th the FTS5 modu
0f60: 6c 65 20 69 73 20 72 65 70 72 65 73 65 6e 74 65  le is represente
0f70: 64 0a 2a 2a 20 62 79 20 61 6e 20 6f 62 6a 65 63  d.** by an objec
0f80: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t of the followi
0f90: 6e 67 20 74 79 70 65 2e 20 41 6c 6c 20 73 75 63  ng type. All suc
0fa0: 68 20 6f 62 6a 65 63 74 73 20 61 72 65 20 73 74  h objects are st
0fb0: 6f 72 65 64 20 61 73 20 70 61 72 74 0a 2a 2a 20  ored as part.** 
0fc0: 6f 66 20 74 68 65 20 46 74 73 35 47 6c 6f 62 61  of the Fts5Globa
0fd0: 6c 2e 70 54 6f 6b 20 6c 69 73 74 2e 0a 2a 2f 0a  l.pTok list..*/.
0fe0: 73 74 72 75 63 74 20 46 74 73 35 54 6f 6b 65 6e  struct Fts5Token
0ff0: 69 7a 65 72 4d 6f 64 75 6c 65 20 7b 0a 20 20 63  izerModule {.  c
1000: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1020: 2a 20 4e 61 6d 65 20 6f 66 20 74 6f 6b 65 6e 69  * Name of tokeni
1030: 7a 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  zer */.  void *p
1040: 55 73 65 72 44 61 74 61 3b 20 20 20 20 20 20 20  UserData;       
1050: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
1060: 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20   pointer passed 
1070: 74 6f 20 78 43 72 65 61 74 65 28 29 20 2a 2f 0a  to xCreate() */.
1080: 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72    fts5_tokenizer
1090: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
10a0: 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72 20 66    /* Tokenizer f
10b0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 76 6f  unctions */.  vo
10c0: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
10d0: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 2f 2a  oid*);        /*
10e0: 20 44 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   Destructor func
10f0: 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 54 6f  tion */.  Fts5To
1100: 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70  kenizerModule *p
1110: 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78  Next;     /* Nex
1120: 74 20 72 65 67 69 73 74 65 72 65 64 20 74 6f 6b  t registered tok
1130: 65 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20 2a 2f  enizer module */
1140: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 69 72 74 75  .};../*.** Virtu
1150: 61 6c 2d 74 61 62 6c 65 20 6f 62 6a 65 63 74 2e  al-table object.
1160: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 54  .*/.struct Fts5T
1170: 61 62 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  able {.  sqlite3
1180: 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20 20 20  _vtab base;     
1190: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
11a0: 20 63 6c 61 73 73 20 75 73 65 64 20 62 79 20 53   class used by S
11b0: 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 20 20  QLite core */.  
11c0: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
11d0: 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  fig;            
11e0: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
11f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
1200: 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  /.  Fts5Index *p
1210: 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1220: 20 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74      /* Full-text
1230: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35   index */.  Fts5
1240: 53 74 6f 72 61 67 65 20 2a 70 53 74 6f 72 61 67  Storage *pStorag
1250: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
1260: 6f 63 75 6d 65 6e 74 20 73 74 6f 72 65 20 2a 2f  ocument store */
1270: 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70  .  Fts5Global *p
1280: 47 6c 6f 62 61 6c 3b 20 20 20 20 20 20 20 20 20  Global;         
1290: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 28 63 6f     /* Global (co
12a0: 6e 6e 65 63 74 69 6f 6e 20 77 69 64 65 29 20 64  nnection wide) d
12b0: 61 74 61 20 2a 2f 0a 20 20 46 74 73 35 43 75 72  ata */.  Fts5Cur
12c0: 73 6f 72 20 2a 70 53 6f 72 74 43 73 72 3b 20 20  sor *pSortCsr;  
12d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
12e0: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
12f0: 63 75 72 73 6f 72 20 2a 2f 0a 23 69 66 64 65 66  cursor */.#ifdef
1300: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1310: 73 74 72 75 63 74 20 46 74 73 35 54 72 61 6e 73  struct Fts5Trans
1320: 61 63 74 69 6f 6e 53 74 61 74 65 20 74 73 3b 0a  actionState ts;.
1330: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63  #endif.};..struc
1340: 74 20 46 74 73 35 4d 61 74 63 68 50 68 72 61 73  t Fts5MatchPhras
1350: 65 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72  e {.  Fts5Buffer
1360: 20 2a 70 50 6f 73 6c 69 73 74 3b 20 20 20 20 20   *pPoslist;     
1370: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1380: 20 74 6f 20 63 75 72 72 65 6e 74 20 70 6f 73 6c   to current posl
1390: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ist */.  int nTe
13a0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
13b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13c0: 20 6f 66 20 70 68 72 61 73 65 20 69 6e 20 74 65   of phrase in te
13d0: 72 6d 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  rms */.};../*.**
13e0: 20 70 53 74 6d 74 3a 0a 2a 2a 20 20 20 53 45 4c   pStmt:.**   SEL
13f0: 45 43 54 20 72 6f 77 69 64 2c 20 3c 66 74 73 3e  ECT rowid, <fts>
1400: 20 46 52 4f 4d 20 3c 66 74 73 3e 20 4f 52 44 45   FROM <fts> ORDE
1410: 52 20 42 59 20 2b 72 61 6e 6b 3b 0a 2a 2a 0a 2a  R BY +rank;.**.*
1420: 2a 20 61 49 64 78 5b 5d 3a 0a 2a 2a 20 20 20 54  * aIdx[]:.**   T
1430: 68 65 72 65 20 69 73 20 6f 6e 65 20 65 6e 74 72  here is one entr
1440: 79 20 69 6e 20 74 68 65 20 61 49 64 78 5b 5d 20  y in the aIdx[] 
1450: 61 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 70  array for each p
1460: 68 72 61 73 65 20 69 6e 20 74 68 65 20 71 75 65  hrase in the que
1470: 72 79 2c 0a 2a 2a 20 20 20 74 68 65 20 76 61 6c  ry,.**   the val
1480: 75 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 74  ue of which is t
1490: 68 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  he offset within
14a0: 20 61 50 6f 73 6c 69 73 74 5b 5d 20 66 6f 6c 6c   aPoslist[] foll
14b0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 0a  owing the last .
14c0: 2a 2a 20 20 20 62 79 74 65 20 6f 66 20 74 68 65  **   byte of the
14d0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
14e0: 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
14f0: 64 69 6e 67 20 70 68 72 61 73 65 2e 0a 2a 2f 0a  ding phrase..*/.
1500: 73 74 72 75 63 74 20 46 74 73 35 53 6f 72 74 65  struct Fts5Sorte
1510: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  r {.  sqlite3_st
1520: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 36 34  mt *pStmt;.  i64
1530: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1550: 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f  Current rowid */
1560: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 50 6f  .  const u8 *aPo
1570: 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  slist;          
1580: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c     /* Position l
1590: 69 73 74 73 20 66 6f 72 20 63 75 72 72 65 6e 74  ists for current
15a0: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 49   row */.  int nI
15b0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
15c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15d0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
15e0: 6e 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e  n aIdx[] */.  in
15f0: 74 20 61 49 64 78 5b 31 5d 3b 20 20 20 20 20 20  t aIdx[1];      
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1610: 20 4f 66 66 73 65 74 73 20 69 6e 74 6f 20 61 50   Offsets into aP
1620: 6f 73 6c 69 73 74 20 66 6f 72 20 63 75 72 72 65  oslist for curre
1630: 6e 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  nt row */.};.../
1640: 2a 0a 2a 2a 20 56 69 72 74 75 61 6c 2d 74 61 62  *.** Virtual-tab
1650: 6c 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74  le cursor object
1660: 2e 0a 2a 2a 0a 2a 2a 20 69 53 70 65 63 69 61 6c  ..**.** iSpecial
1670: 3a 0a 2a 2a 20 20 20 49 66 20 74 68 69 73 20 69  :.**   If this i
1680: 73 20 61 20 27 73 70 65 63 69 61 6c 27 20 71 75  s a 'special' qu
1690: 65 72 79 20 28 72 65 66 65 72 20 74 6f 20 66 75  ery (refer to fu
16a0: 6e 63 74 69 6f 6e 20 66 74 73 35 53 70 65 63 69  nction fts5Speci
16b0: 61 6c 4d 61 74 63 68 28 29 29 2c 20 0a 2a 2a 20  alMatch()), .** 
16c0: 20 20 74 68 65 6e 20 74 68 69 73 20 76 61 72 69    then this vari
16d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
16e0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
16f0: 71 75 65 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 69 46  query. .**.** iF
1700: 69 72 73 74 52 6f 77 69 64 2c 20 69 4c 61 73 74  irstRowid, iLast
1710: 52 6f 77 69 64 3a 0a 2a 2a 20 20 20 54 68 65 73  Rowid:.**   Thes
1720: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
1730: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 46 54  only used for FT
1740: 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 20 63 75  S5_PLAN_MATCH cu
1750: 72 73 6f 72 73 2e 20 41 73 73 75 6d 69 6e 67 20  rsors. Assuming 
1760: 74 68 65 0a 2a 2a 20 20 20 63 75 72 73 6f 72 20  the.**   cursor 
1770: 69 74 65 72 61 74 65 73 20 69 6e 20 61 73 63 65  iterates in asce
1780: 6e 64 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 72  nding order of r
1790: 6f 77 69 64 73 2c 20 69 46 69 72 73 74 52 6f 77  owids, iFirstRow
17a0: 69 64 20 69 73 20 74 68 65 20 6c 6f 77 65 72 0a  id is the lower.
17b0: 2a 2a 20 20 20 6c 69 6d 69 74 20 6f 66 20 72 6f  **   limit of ro
17c0: 77 69 64 73 20 74 6f 20 72 65 74 75 72 6e 2c 20  wids to return, 
17d0: 61 6e 64 20 69 4c 61 73 74 52 6f 77 69 64 20 74  and iLastRowid t
17e0: 68 65 20 75 70 70 65 72 2e 20 49 6e 20 6f 74 68  he upper. In oth
17f0: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
1800: 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20     WHERE clause 
1810: 69 6e 20 74 68 65 20 75 73 65 72 27 73 20 71 75  in the user's qu
1820: 65 72 79 20 6d 69 67 68 74 20 68 61 76 65 20 62  ery might have b
1830: 65 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  een:.**.**      
1840: 20 3c 74 62 6c 3e 20 4d 41 54 43 48 20 3c 65 78   <tbl> MATCH <ex
1850: 70 72 3e 20 41 4e 44 20 72 6f 77 69 64 20 42 45  pr> AND rowid BE
1860: 54 57 45 45 4e 20 24 69 46 69 72 73 74 52 6f 77  TWEEN $iFirstRow
1870: 69 64 20 41 4e 44 20 24 69 4c 61 73 74 52 6f 77  id AND $iLastRow
1880: 69 64 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68  id.**.**   If th
1890: 65 20 63 75 72 73 6f 72 20 69 74 65 72 61 74 65  e cursor iterate
18a0: 73 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20  s in descending 
18b0: 6f 72 64 65 72 20 6f 66 20 72 6f 77 69 64 2c 20  order of rowid, 
18c0: 69 46 69 72 73 74 52 6f 77 69 64 0a 2a 2a 20 20  iFirstRowid.**  
18d0: 20 69 73 20 74 68 65 20 75 70 70 65 72 20 6c 69   is the upper li
18e0: 6d 69 74 20 28 69 2e 65 2e 20 74 68 65 20 22 66  mit (i.e. the "f
18f0: 69 72 73 74 22 20 72 6f 77 69 64 20 76 69 73 69  irst" rowid visi
1900: 74 65 64 29 20 61 6e 64 20 69 4c 61 73 74 52 6f  ted) and iLastRo
1910: 77 69 64 0a 2a 2a 20 20 20 74 68 65 20 6c 6f 77  wid.**   the low
1920: 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  er..*/.struct Ft
1930: 73 35 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  s5Cursor {.  sql
1940: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
1950: 20 62 61 73 65 3b 20 20 20 20 20 20 20 2f 2a 20   base;       /* 
1960: 42 61 73 65 20 63 6c 61 73 73 20 75 73 65 64 20  Base class used 
1970: 62 79 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a  by SQLite core *
1980: 2f 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  /.  Fts5Cursor *
1990: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
19a0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 75 72 73      /* Next curs
19b0: 6f 72 20 69 6e 20 46 74 73 35 43 75 72 73 6f 72  or in Fts5Cursor
19c0: 2e 70 43 73 72 20 6c 69 73 74 20 2a 2f 0a 20 20  .pCsr list */.  
19d0: 69 6e 74 20 2a 61 43 6f 6c 75 6d 6e 53 69 7a 65  int *aColumnSize
19e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19f0: 2f 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 78 43  /* Values for xC
1a00: 6f 6c 75 6d 6e 53 69 7a 65 28 29 20 2a 2f 0a 20  olumnSize() */. 
1a10: 20 69 36 34 20 69 43 73 72 49 64 3b 20 20 20 20   i64 iCsrId;    
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 2f 2a 20 43 75 72 73 6f 72 20 69 64 20 2a 2f   /* Cursor id */
1a40: 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 66 72 6f 6d  ..  /* Zero from
1a50: 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 77 61   this point onwa
1a60: 72 64 73 20 6f 6e 20 63 75 72 73 6f 72 20 72 65  rds on cursor re
1a70: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 50 6c  set */.  int ePl
1a80: 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
1a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1aa0: 5f 50 4c 41 4e 5f 58 58 58 20 76 61 6c 75 65 20  _PLAN_XXX value 
1ab0: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 3b 20  */.  int bDesc; 
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1ae0: 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
1af0: 20 44 45 53 43 22 20 71 75 65 72 69 65 73 20 2a   DESC" queries *
1b00: 2f 0a 20 20 69 36 34 20 69 46 69 72 73 74 52 6f  /.  i64 iFirstRo
1b10: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
1b20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6e 6f      /* Return no
1b30: 20 72 6f 77 69 64 73 20 65 61 72 6c 69 65 72 20   rowids earlier 
1b40: 74 68 61 6e 20 74 68 69 73 20 2a 2f 0a 20 20 69  than this */.  i
1b50: 36 34 20 69 4c 61 73 74 52 6f 77 69 64 3b 20 20  64 iLastRowid;  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b70: 2a 20 52 65 74 75 72 6e 20 6e 6f 20 72 6f 77 69  * Return no rowi
1b80: 64 73 20 6c 61 74 65 72 20 74 68 61 6e 20 74 68  ds later than th
1b90: 69 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  is */.  sqlite3_
1ba0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
1bb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
1bc0: 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 72 65 61  ment used to rea
1bd0: 64 20 25 5f 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  d %_content */. 
1be0: 20 46 74 73 35 45 78 70 72 20 2a 70 45 78 70 72   Fts5Expr *pExpr
1bf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c00: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
1c10: 6f 72 20 4d 41 54 43 48 20 71 75 65 72 69 65 73  or MATCH queries
1c20: 20 2a 2f 0a 20 20 46 74 73 35 53 6f 72 74 65 72   */.  Fts5Sorter
1c30: 20 2a 70 53 6f 72 74 65 72 3b 20 20 20 20 20 20   *pSorter;      
1c40: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
1c50: 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 61  for "ORDER BY ra
1c60: 6e 6b 22 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  nk" queries */. 
1c70: 20 69 6e 74 20 63 73 72 66 6c 61 67 73 3b 20 20   int csrflags;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
1ca0: 6f 72 20 66 6c 61 67 73 20 28 73 65 65 20 62 65  or flags (see be
1cb0: 6c 6f 77 29 20 2a 2f 0a 20 20 69 36 34 20 69 53  low) */.  i64 iS
1cc0: 70 65 63 69 61 6c 3b 20 20 20 20 20 20 20 20 20  pecial;         
1cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ce0: 75 6c 74 20 6f 66 20 73 70 65 63 69 61 6c 20 71  ult of special q
1cf0: 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 22 72  uery */..  /* "r
1d00: 61 6e 6b 22 20 66 75 6e 63 74 69 6f 6e 2e 20 50  ank" function. P
1d10: 6f 70 75 6c 61 74 65 64 20 6f 6e 20 64 65 6d 61  opulated on dema
1d20: 6e 64 20 66 72 6f 6d 20 76 74 61 62 2e 78 43 6f  nd from vtab.xCo
1d30: 6c 75 6d 6e 28 29 2e 20 2a 2f 0a 20 20 63 68 61  lumn(). */.  cha
1d40: 72 20 2a 7a 52 61 6e 6b 3b 20 20 20 20 20 20 20  r *zRank;       
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d60: 43 75 73 74 6f 6d 20 72 61 6e 6b 20 66 75 6e 63  Custom rank func
1d70: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
1d80: 7a 52 61 6e 6b 41 72 67 73 3b 20 20 20 20 20 20  zRankArgs;      
1d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 73            /* Cus
1da0: 74 6f 6d 20 72 61 6e 6b 20 66 75 6e 63 74 69 6f  tom rank functio
1db0: 6e 20 61 72 67 73 20 2a 2f 0a 20 20 46 74 73 35  n args */.  Fts5
1dc0: 41 75 78 69 6c 69 61 72 79 20 2a 70 52 61 6e 6b  Auxiliary *pRank
1dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1de0: 61 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 28 6f 72  ank callback (or
1df0: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20   NULL) */.  int 
1e00: 6e 52 61 6e 6b 41 72 67 3b 20 20 20 20 20 20 20  nRankArg;       
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e20: 75 6d 62 65 72 20 6f 66 20 74 72 61 69 6c 69 6e  umber of trailin
1e30: 67 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  g arguments for 
1e40: 72 61 6e 6b 28 29 20 2a 2f 0a 20 20 73 71 6c 69  rank() */.  sqli
1e50: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 52 61  te3_value **apRa
1e60: 6e 6b 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 41  nkArg;      /* A
1e70: 72 72 61 79 20 6f 66 20 74 72 61 69 6c 69 6e 67  rray of trailing
1e80: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1e90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52  sqlite3_stmt *pR
1ea0: 61 6e 6b 41 72 67 53 74 6d 74 3b 20 20 20 20 20  ankArgStmt;     
1eb0: 2f 2a 20 4f 72 69 67 69 6e 20 6f 66 20 6f 62 6a  /* Origin of obj
1ec0: 65 63 74 73 20 69 6e 20 61 70 52 61 6e 6b 41 72  ects in apRankAr
1ed0: 67 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 75 78  g[] */..  /* Aux
1ee0: 69 6c 69 61 72 79 20 64 61 74 61 20 73 74 6f 72  iliary data stor
1ef0: 61 67 65 20 2a 2f 0a 20 20 46 74 73 35 41 75 78  age */.  Fts5Aux
1f00: 69 6c 69 61 72 79 20 2a 70 41 75 78 3b 20 20 20  iliary *pAux;   
1f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1f20: 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67 20  ently executing 
1f30: 65 78 74 65 6e 73 69 6f 6e 20 66 75 6e 63 74 69  extension functi
1f40: 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 41 75 78 64  on */.  Fts5Auxd
1f50: 61 74 61 20 2a 70 41 75 78 64 61 74 61 3b 20 20  ata *pAuxdata;  
1f60: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1f70: 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20   in linked list 
1f80: 6f 66 20 73 61 76 65 64 20 61 75 78 2d 64 61 74  of saved aux-dat
1f90: 61 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 63 68 65  a */..  /* Cache
1fa0: 20 75 73 65 64 20 62 79 20 61 75 78 69 6c 69 61   used by auxilia
1fb0: 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 78 49 6e  ry functions xIn
1fc0: 73 74 28 29 20 61 6e 64 20 78 49 6e 73 74 43 6f  st() and xInstCo
1fd0: 75 6e 74 28 29 20 2a 2f 0a 20 20 46 74 73 35 50  unt() */.  Fts5P
1fe0: 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49  oslistReader *aI
1ff0: 6e 73 74 49 74 65 72 3b 20 20 20 2f 2a 20 4f 6e  nstIter;   /* On
2000: 65 20 66 6f 72 20 65 61 63 68 20 70 68 72 61 73  e for each phras
2010: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 73 74  e */.  int nInst
2020: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
2030: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2040: 66 20 61 49 6e 73 74 5b 5d 20 61 72 72 61 79 20  f aInst[] array 
2050: 28 65 6e 74 72 69 65 73 20 2f 20 33 29 20 2a 2f  (entries / 3) */
2060: 0a 20 20 69 6e 74 20 6e 49 6e 73 74 43 6f 75 6e  .  int nInstCoun
2070: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2080: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2090: 70 68 72 61 73 65 20 69 6e 73 74 61 6e 63 65 73  phrase instances
20a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 49 6e 73 74   */.  int *aInst
20b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c0: 20 20 20 20 20 20 2f 2a 20 33 20 69 6e 74 65 67        /* 3 integ
20d0: 65 72 73 20 70 65 72 20 70 68 72 61 73 65 20 69  ers per phrase i
20e0: 6e 73 74 61 6e 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f  nstance */.};../
20f0: 2a 0a 2a 2a 20 42 69 74 73 20 74 68 61 74 20 6d  *.** Bits that m
2100: 61 6b 65 20 75 70 20 74 68 65 20 22 69 64 78 4e  ake up the "idxN
2110: 75 6d 22 20 70 61 72 61 6d 65 74 65 72 20 70 61  um" parameter pa
2120: 73 73 65 64 20 69 6e 64 69 72 65 63 74 6c 79 20  ssed indirectly 
2130: 62 79 20 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  by .** xBestInde
2140: 78 28 29 20 74 6f 20 78 46 69 6c 74 65 72 28 29  x() to xFilter()
2150: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ..*/.#define FTS
2160: 35 5f 42 49 5f 4d 41 54 43 48 20 20 20 20 20 20  5_BI_MATCH      
2170: 20 20 30 78 30 30 30 31 20 20 20 20 20 20 20 20    0x0001        
2180: 20 2f 2a 20 3c 74 62 6c 3e 20 4d 41 54 43 48 20   /* <tbl> MATCH 
2190: 3f 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ? */.#define FTS
21a0: 35 5f 42 49 5f 52 41 4e 4b 20 20 20 20 20 20 20  5_BI_RANK       
21b0: 20 20 30 78 30 30 30 32 20 20 20 20 20 20 20 20    0x0002        
21c0: 20 2f 2a 20 72 61 6e 6b 20 4d 41 54 43 48 20 3f   /* rank MATCH ?
21d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
21e0: 5f 42 49 5f 52 4f 57 49 44 5f 45 51 20 20 20 20  _BI_ROWID_EQ    
21f0: 20 30 78 30 30 30 34 20 20 20 20 20 20 20 20 20   0x0004         
2200: 2f 2a 20 72 6f 77 69 64 20 3d 3d 20 3f 20 2a 2f  /* rowid == ? */
2210: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 42 49  .#define FTS5_BI
2220: 5f 52 4f 57 49 44 5f 4c 45 20 20 20 20 20 30 78  _ROWID_LE     0x
2230: 30 30 30 38 20 20 20 20 20 20 20 20 20 2f 2a 20  0008         /* 
2240: 72 6f 77 69 64 20 3c 3d 20 3f 20 2a 2f 0a 23 64  rowid <= ? */.#d
2250: 65 66 69 6e 65 20 46 54 53 35 5f 42 49 5f 52 4f  efine FTS5_BI_RO
2260: 57 49 44 5f 47 45 20 20 20 20 20 30 78 30 30 31  WID_GE     0x001
2270: 30 20 20 20 20 20 20 20 20 20 2f 2a 20 72 6f 77  0         /* row
2280: 69 64 20 3e 3d 20 3f 20 2a 2f 0a 0a 23 64 65 66  id >= ? */..#def
2290: 69 6e 65 20 46 54 53 35 5f 42 49 5f 4f 52 44 45  ine FTS5_BI_ORDE
22a0: 52 5f 52 41 4e 4b 20 20 20 30 78 30 30 32 30 0a  R_RANK   0x0020.
22b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 42 49 5f  #define FTS5_BI_
22c0: 4f 52 44 45 52 5f 52 4f 57 49 44 20 20 30 78 30  ORDER_ROWID  0x0
22d0: 30 34 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35  040.#define FTS5
22e0: 5f 42 49 5f 4f 52 44 45 52 5f 44 45 53 43 20 20  _BI_ORDER_DESC  
22f0: 20 30 78 30 30 38 30 0a 0a 2f 2a 0a 2a 2a 20 56   0x0080../*.** V
2300: 61 6c 75 65 73 20 66 6f 72 20 46 74 73 35 43 75  alues for Fts5Cu
2310: 72 73 6f 72 2e 63 73 72 66 6c 61 67 73 0a 2a 2f  rsor.csrflags.*/
2320: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 43 53 52  .#define FTS5CSR
2330: 5f 45 4f 46 20 20 20 20 20 20 20 20 20 20 20 20  _EOF            
2340: 20 20 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20     0x01.#define 
2350: 46 54 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f  FTS5CSR_REQUIRE_
2360: 43 4f 4e 54 45 4e 54 20 20 20 30 78 30 32 0a 23  CONTENT   0x02.#
2370: 64 65 66 69 6e 65 20 46 54 53 35 43 53 52 5f 52  define FTS5CSR_R
2380: 45 51 55 49 52 45 5f 44 4f 43 53 49 5a 45 20 20  EQUIRE_DOCSIZE  
2390: 20 30 78 30 34 0a 23 64 65 66 69 6e 65 20 46 54   0x04.#define FT
23a0: 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f 49 4e  S5CSR_REQUIRE_IN
23b0: 53 54 20 20 20 20 20 20 30 78 30 38 0a 23 64 65  ST      0x08.#de
23c0: 66 69 6e 65 20 46 54 53 35 43 53 52 5f 46 52 45  fine FTS5CSR_FRE
23d0: 45 5f 5a 52 41 4e 4b 20 20 20 20 20 20 20 20 30  E_ZRANK        0
23e0: 78 31 30 0a 23 64 65 66 69 6e 65 20 46 54 53 35  x10.#define FTS5
23f0: 43 53 52 5f 52 45 51 55 49 52 45 5f 52 45 53 45  CSR_REQUIRE_RESE
2400: 45 4b 20 20 20 20 30 78 32 30 0a 23 64 65 66 69  EK    0x20.#defi
2410: 6e 65 20 46 54 53 35 43 53 52 5f 52 45 51 55 49  ne FTS5CSR_REQUI
2420: 52 45 5f 50 4f 53 4c 49 53 54 20 20 20 30 78 34  RE_POSLIST   0x4
2430: 30 0a 0a 23 64 65 66 69 6e 65 20 42 69 74 46 6c  0..#define BitFl
2440: 61 67 41 6c 6c 54 65 73 74 28 78 2c 79 29 20 28  agAllTest(x,y) (
2450: 28 28 78 29 20 26 20 28 79 29 29 3d 3d 28 79 29  ((x) & (y))==(y)
2460: 29 0a 23 64 65 66 69 6e 65 20 42 69 74 46 6c 61  ).#define BitFla
2470: 67 54 65 73 74 28 78 2c 79 29 20 20 20 20 28 28  gTest(x,y)    ((
2480: 28 78 29 20 26 20 28 79 29 29 21 3d 30 29 0a 0a  (x) & (y))!=0)..
2490: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 74 6f  ./*.** Macros to
24a0: 20 53 65 74 28 29 2c 20 43 6c 65 61 72 28 29 20   Set(), Clear() 
24b0: 61 6e 64 20 54 65 73 74 28 29 20 63 75 72 73 6f  and Test() curso
24c0: 72 20 66 6c 61 67 73 2e 0a 2a 2f 0a 23 64 65 66  r flags..*/.#def
24d0: 69 6e 65 20 43 73 72 46 6c 61 67 53 65 74 28 70  ine CsrFlagSet(p
24e0: 43 73 72 2c 20 66 6c 61 67 29 20 20 20 28 28 70  Csr, flag)   ((p
24f0: 43 73 72 29 2d 3e 63 73 72 66 6c 61 67 73 20 7c  Csr)->csrflags |
2500: 3d 20 28 66 6c 61 67 29 29 0a 23 64 65 66 69 6e  = (flag)).#defin
2510: 65 20 43 73 72 46 6c 61 67 43 6c 65 61 72 28 70  e CsrFlagClear(p
2520: 43 73 72 2c 20 66 6c 61 67 29 20 28 28 70 43 73  Csr, flag) ((pCs
2530: 72 29 2d 3e 63 73 72 66 6c 61 67 73 20 26 3d 20  r)->csrflags &= 
2540: 7e 28 66 6c 61 67 29 29 0a 23 64 65 66 69 6e 65  ~(flag)).#define
2550: 20 43 73 72 46 6c 61 67 54 65 73 74 28 70 43 73   CsrFlagTest(pCs
2560: 72 2c 20 66 6c 61 67 29 20 20 28 28 70 43 73 72  r, flag)  ((pCsr
2570: 29 2d 3e 63 73 72 66 6c 61 67 73 20 26 20 28 66  )->csrflags & (f
2580: 6c 61 67 29 29 0a 0a 73 74 72 75 63 74 20 46 74  lag))..struct Ft
2590: 73 35 41 75 78 64 61 74 61 20 7b 0a 20 20 46 74  s5Auxdata {.  Ft
25a0: 73 35 41 75 78 69 6c 69 61 72 79 20 2a 70 41 75  s5Auxiliary *pAu
25b0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x;            /*
25c0: 20 45 78 74 65 6e 73 69 6f 6e 20 74 6f 20 77 68   Extension to wh
25d0: 69 63 68 20 74 68 69 73 20 62 65 6c 6f 6e 67 73  ich this belongs
25e0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 50 74 72   */.  void *pPtr
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2600: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2610: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64   value */.  void
2620: 28 2a 78 44 65 6c 65 74 65 29 28 76 6f 69 64 2a  (*xDelete)(void*
2630: 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  );          /* D
2640: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 46  estructor */.  F
2650: 74 73 35 41 75 78 64 61 74 61 20 2a 70 4e 65 78  ts5Auxdata *pNex
2660: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
2670: 2a 20 4e 65 78 74 20 6f 62 6a 65 63 74 20 69 6e  * Next object in
2680: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
2690: 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  };..#ifdef SQLIT
26a0: 45 5f 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20  E_DEBUG.#define 
26b0: 46 54 53 35 5f 42 45 47 49 4e 20 20 20 20 20 20  FTS5_BEGIN      
26c0: 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  1.#define FTS5_S
26d0: 59 4e 43 20 20 20 20 20 20 20 32 0a 23 64 65 66  YNC       2.#def
26e0: 69 6e 65 20 46 54 53 35 5f 43 4f 4d 4d 49 54 20  ine FTS5_COMMIT 
26f0: 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 46 54      3.#define FT
2700: 53 35 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 34 0a  S5_ROLLBACK   4.
2710: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 41 56  #define FTS5_SAV
2720: 45 50 4f 49 4e 54 20 20 35 0a 23 64 65 66 69 6e  EPOINT  5.#defin
2730: 65 20 46 54 53 35 5f 52 45 4c 45 41 53 45 20 20  e FTS5_RELEASE  
2740: 20 20 36 0a 23 64 65 66 69 6e 65 20 46 54 53 35    6.#define FTS5
2750: 5f 52 4f 4c 4c 42 41 43 4b 54 4f 20 37 0a 73 74  _ROLLBACKTO 7.st
2760: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68  atic void fts5Ch
2770: 65 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74  eckTransactionSt
2780: 61 74 65 28 46 74 73 35 54 61 62 6c 65 20 2a 70  ate(Fts5Table *p
2790: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
27a0: 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 73 77 69  avepoint){.  swi
27b0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
27c0: 61 73 65 20 46 54 53 35 5f 42 45 47 49 4e 3a 0a  ase FTS5_BEGIN:.
27d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
27e0: 3e 74 73 2e 65 53 74 61 74 65 3d 3d 30 20 29 3b  >ts.eState==0 );
27f0: 0a 20 20 20 20 20 20 70 2d 3e 74 73 2e 65 53 74  .      p->ts.eSt
2800: 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
2810: 2d 3e 74 73 2e 69 53 61 76 65 70 6f 69 6e 74 20  ->ts.iSavepoint 
2820: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  = -1;.      brea
2830: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 46 54 53  k;..    case FTS
2840: 35 5f 53 59 4e 43 3a 0a 20 20 20 20 20 20 61 73  5_SYNC:.      as
2850: 73 65 72 74 28 20 70 2d 3e 74 73 2e 65 53 74 61  sert( p->ts.eSta
2860: 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  te==1 );.      p
2870: 2d 3e 74 73 2e 65 53 74 61 74 65 20 3d 20 32 3b  ->ts.eState = 2;
2880: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2890: 20 20 20 63 61 73 65 20 46 54 53 35 5f 43 4f 4d     case FTS5_COM
28a0: 4d 49 54 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MIT:.      asser
28b0: 74 28 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d  t( p->ts.eState=
28c0: 3d 32 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74  =2 );.      p->t
28d0: 73 2e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20  s.eState = 0;.  
28e0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
28f0: 63 61 73 65 20 46 54 53 35 5f 52 4f 4c 4c 42 41  case FTS5_ROLLBA
2900: 43 4b 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  CK:.      assert
2910: 28 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d  ( p->ts.eState==
2920: 31 20 7c 7c 20 70 2d 3e 74 73 2e 65 53 74 61 74  1 || p->ts.eStat
2930: 65 3d 3d 32 20 7c 7c 20 70 2d 3e 74 73 2e 65 53  e==2 || p->ts.eS
2940: 74 61 74 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  tate==0 );.     
2950: 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 20 3d 20   p->ts.eState = 
2960: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
2970: 0a 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 53  .    case FTS5_S
2980: 41 56 45 50 4f 49 4e 54 3a 0a 20 20 20 20 20 20  AVEPOINT:.      
2990: 61 73 73 65 72 74 28 20 70 2d 3e 74 73 2e 65 53  assert( p->ts.eS
29a0: 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  tate==1 );.     
29b0: 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
29c0: 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  int>=0 );.      
29d0: 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
29e0: 6e 74 3e 70 2d 3e 74 73 2e 69 53 61 76 65 70 6f  nt>p->ts.iSavepo
29f0: 69 6e 74 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  int );.      p->
2a00: 74 73 2e 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  ts.iSavepoint = 
2a10: 69 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  iSavepoint;.    
2a20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 0a    break;.      .
2a30: 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 52 45      case FTS5_RE
2a40: 4c 45 41 53 45 3a 0a 20 20 20 20 20 20 61 73 73  LEASE:.      ass
2a50: 65 72 74 28 20 70 2d 3e 74 73 2e 65 53 74 61 74  ert( p->ts.eStat
2a60: 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
2a70: 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
2a80: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >=0 );.      ass
2a90: 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3c  ert( iSavepoint<
2aa0: 3d 70 2d 3e 74 73 2e 69 53 61 76 65 70 6f 69 6e  =p->ts.iSavepoin
2ab0: 74 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74 73  t );.      p->ts
2ac0: 2e 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 53  .iSavepoint = iS
2ad0: 61 76 65 70 6f 69 6e 74 2d 31 3b 0a 20 20 20 20  avepoint-1;.    
2ae0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
2af0: 73 65 20 46 54 53 35 5f 52 4f 4c 4c 42 41 43 4b  se FTS5_ROLLBACK
2b00: 54 4f 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  TO:.      assert
2b10: 28 20 70 2d 3e 74 73 2e 65 53 74 61 74 65 3d 3d  ( p->ts.eState==
2b20: 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
2b30: 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
2b40: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2b50: 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 3d 70 2d  ( iSavepoint<=p-
2b60: 3e 74 73 2e 69 53 61 76 65 70 6f 69 6e 74 20 29  >ts.iSavepoint )
2b70: 3b 0a 20 20 20 20 20 20 70 2d 3e 74 73 2e 69 53  ;.      p->ts.iS
2b80: 61 76 65 70 6f 69 6e 74 20 3d 20 69 53 61 76 65  avepoint = iSave
2b90: 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 62 72 65  point;.      bre
2ba0: 61 6b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  ak;.  }.}.#else.
2bb0: 23 20 64 65 66 69 6e 65 20 66 74 73 35 43 68 65  # define fts5Che
2bc0: 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61  ckTransactionSta
2bd0: 74 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  te(x,y,z).#endif
2be0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2bf0: 72 75 65 20 69 66 20 70 54 61 62 20 69 73 20 61  rue if pTab is a
2c00: 20 63 6f 6e 74 65 6e 74 6c 65 73 73 20 74 61 62   contentless tab
2c10: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2c20: 74 20 66 74 73 35 49 73 43 6f 6e 74 65 6e 74 6c  t fts5IsContentl
2c30: 65 73 73 28 46 74 73 35 54 61 62 6c 65 20 2a 70  ess(Fts5Table *p
2c40: 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Tab){.  return p
2c50: 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 43  Tab->pConfig->eC
2c60: 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43 4f 4e  ontent==FTS5_CON
2c70: 54 45 4e 54 5f 4e 4f 4e 45 3b 0a 7d 0a 0a 2f 2a  TENT_NONE;.}../*
2c80: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 76 69 72  .** Delete a vir
2c90: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
2ca0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  e allocated by f
2cb0: 74 73 35 49 6e 69 74 56 74 61 62 28 29 2e 20 0a  ts5InitVtab(). .
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2cd0: 74 73 35 46 72 65 65 56 74 61 62 28 46 74 73 35  ts5FreeVtab(Fts5
2ce0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
2cf0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
2d00: 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2d10: 43 6c 6f 73 65 28 70 54 61 62 2d 3e 70 49 6e 64  Close(pTab->pInd
2d20: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
2d30: 46 74 73 35 53 74 6f 72 61 67 65 43 6c 6f 73 65  Fts5StorageClose
2d40: 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 29  (pTab->pStorage)
2d50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2d60: 35 43 6f 6e 66 69 67 46 72 65 65 28 70 54 61 62  5ConfigFree(pTab
2d70: 2d 3e 70 43 6f 6e 66 69 67 29 3b 0a 20 20 20 20  ->pConfig);.    
2d80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
2d90: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
2da0: 20 54 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   The xDisconnect
2db0: 28 29 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  () virtual table
2dc0: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
2dd0: 69 63 20 69 6e 74 20 66 74 73 35 44 69 73 63 6f  ic int fts5Disco
2de0: 6e 6e 65 63 74 4d 65 74 68 6f 64 28 73 71 6c 69  nnectMethod(sqli
2df0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
2e00: 7b 0a 20 20 66 74 73 35 46 72 65 65 56 74 61 62  {.  fts5FreeVtab
2e10: 28 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56 74  ((Fts5Table*)pVt
2e20: 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
2e30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2e40: 2a 20 54 68 65 20 78 44 65 73 74 72 6f 79 28 29  * The xDestroy()
2e50: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
2e60: 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
2e70: 20 69 6e 74 20 66 74 73 35 44 65 73 74 72 6f 79   int fts5Destroy
2e80: 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
2e90: 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 46  tab *pVtab){.  F
2ea0: 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts5Table *pTab =
2eb0: 20 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56 74   (Fts5Table*)pVt
2ec0: 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  ab;.  int rc = s
2ed0: 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70 41 6c  qlite3Fts5DropAl
2ee0: 6c 28 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 29  l(pTab->pConfig)
2ef0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2f00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73  TE_OK ){.    fts
2f10: 35 46 72 65 65 56 74 61 62 28 28 46 74 73 35 54  5FreeVtab((Fts5T
2f20: 61 62 6c 65 2a 29 70 56 74 61 62 29 3b 0a 20 20  able*)pVtab);.  
2f30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2f40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2f50: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70  ction is the imp
2f60: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
2f70: 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63 74  oth the xConnect
2f80: 20 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a 20   and xCreate.** 
2f90: 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 46  methods of the F
2fa0: 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS3 virtual tabl
2fb0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67  e..**.** The arg
2fc0: 76 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  v[] array contai
2fd0: 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ns the following
2fe0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30  :.**.**   argv[0
2ff0: 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61  ]   -> module na
3000: 6d 65 20 20 28 22 66 74 73 35 22 29 0a 2a 2a 20  me  ("fts5").** 
3010: 20 20 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64    argv[1]   -> d
3020: 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20  atabase name.** 
3030: 20 20 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74    argv[2]   -> t
3040: 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61  able name.**   a
3050: 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20 22 63 6f 6c  rgv[...] -> "col
3060: 75 6d 6e 20 6e 61 6d 65 22 20 61 6e 64 20 6f 74  umn name" and ot
3070: 68 65 72 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d  her module argum
3080: 65 6e 74 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ent fields..*/.s
3090: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
30a0: 69 74 56 74 61 62 28 0a 20 20 69 6e 74 20 62 43  itVtab(.  int bC
30b0: 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  reate,          
30c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30d0: 65 20 66 6f 72 20 78 43 72 65 61 74 65 2c 20 66  e for xCreate, f
30e0: 61 6c 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65 63  alse for xConnec
30f0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
3100: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
3110: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 51         /* The SQ
3120: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
3130: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  nnection */.  vo
3140: 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20 20  id *pAux,       
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3160: 20 48 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74   Hash table cont
3170: 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 69 7a 65 72  aining tokenizer
3180: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  s */.  int argc,
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
31b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
31c0: 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a 20 20  argv array */.  
31d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
31e0: 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20 20 20  st *argv,       
31f0: 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e  /* xCreate/xConn
3200: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61 72 72  ect argument arr
3210: 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ay */.  sqlite3_
3220: 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 20 20  vtab **ppVTab,  
3230: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
3240: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 76   the resulting v
3250: 74 61 62 20 73 74 72 75 63 74 75 72 65 20 68 65  tab structure he
3260: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  re */.  char **p
3270: 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  zErr            
3280: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
3290: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
32a0: 67 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ge here */.){.  
32b0: 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f  Fts5Global *pGlo
32c0: 62 61 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61  bal = (Fts5Globa
32d0: 6c 2a 29 70 41 75 78 3b 0a 20 20 63 6f 6e 73 74  l*)pAux;.  const
32e0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6e 66 69 67   char **azConfig
32f0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
3300: 29 61 72 67 76 3b 0a 20 20 69 6e 74 20 72 63 20  )argv;.  int rc 
3310: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
3330: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
3340: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
3350: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
3360: 52 65 73 75 6c 74 73 20 6f 66 20 70 61 72 73 69  Results of parsi
3370: 6e 67 20 61 72 67 63 2f 61 72 67 76 20 2a 2f 0a  ng argc/argv */.
3380: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
3390: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
33a0: 20 20 2f 2a 20 4e 65 77 20 76 69 72 74 75 61 6c    /* New virtual
33b0: 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f   table object */
33c0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
33d0: 74 68 65 20 6e 65 77 20 76 74 61 62 20 6f 62 6a  the new vtab obj
33e0: 65 63 74 20 61 6e 64 20 70 61 72 73 65 20 74 68  ect and parse th
33f0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
3400: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 28 46 74 73  */.  pTab = (Fts
3410: 35 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 33 46  5Table*)sqlite3F
3420: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
3430: 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 54 61  c, sizeof(Fts5Ta
3440: 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 72 63 3d  ble));.  if( rc=
3450: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3460: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
3470: 73 35 43 6f 6e 66 69 67 50 61 72 73 65 28 70 47  s5ConfigParse(pG
3480: 6c 6f 62 61 6c 2c 20 64 62 2c 20 61 72 67 63 2c  lobal, db, argc,
3490: 20 61 7a 43 6f 6e 66 69 67 2c 20 26 70 43 6f 6e   azConfig, &pCon
34a0: 66 69 67 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20  fig, pzErr);.   
34b0: 20 61 73 73 65 72 74 28 20 28 72 63 3d 3d 53 51   assert( (rc==SQ
34c0: 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70 7a 45 72  LITE_OK && *pzEr
34d0: 72 3d 3d 30 29 20 7c 7c 20 70 43 6f 6e 66 69 67  r==0) || pConfig
34e0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
34f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3500: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 6f 6e  {.    pTab->pCon
3510: 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20  fig = pConfig;. 
3520: 20 20 20 70 54 61 62 2d 3e 70 47 6c 6f 62 61 6c     pTab->pGlobal
3530: 20 3d 20 70 47 6c 6f 62 61 6c 3b 0a 20 20 7d 0a   = pGlobal;.  }.
3540: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 69  .  /* Open the i
3550: 6e 64 65 78 20 73 75 62 2d 73 79 73 74 65 6d 20  ndex sub-system 
3560: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
3570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
3580: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
3590: 64 65 78 4f 70 65 6e 28 70 43 6f 6e 66 69 67 2c  dexOpen(pConfig,
35a0: 20 62 43 72 65 61 74 65 2c 20 26 70 54 61 62 2d   bCreate, &pTab-
35b0: 3e 70 49 6e 64 65 78 2c 20 70 7a 45 72 72 29 3b  >pIndex, pzErr);
35c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
35d0: 74 68 65 20 73 74 6f 72 61 67 65 20 73 75 62 2d  the storage sub-
35e0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 69 66 28 20  system */.  if( 
35f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3600: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
3610: 33 46 74 73 35 53 74 6f 72 61 67 65 4f 70 65 6e  3Fts5StorageOpen
3620: 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69  (.        pConfi
3630: 67 2c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  g, pTab->pIndex,
3640: 20 62 43 72 65 61 74 65 2c 20 26 70 54 61 62 2d   bCreate, &pTab-
3650: 3e 70 53 74 6f 72 61 67 65 2c 20 70 7a 45 72 72  >pStorage, pzErr
3660: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  .    );.  }..  /
3670: 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 64  * Call sqlite3_d
3680: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 2a 2f  eclare_vtab() */
3690: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
36b0: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
36c0: 69 67 44 65 63 6c 61 72 65 56 74 61 62 28 70 43  igDeclareVtab(pC
36d0: 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  onfig);.  }..  /
36e0: 2a 20 4c 6f 61 64 20 74 68 65 20 69 6e 69 74 69  * Load the initi
36f0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
3700: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
3710: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
3720: 73 73 65 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e  ssert( pConfig->
3730: 70 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20  pzErrmsg==0 );. 
3740: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72     pConfig->pzEr
3750: 72 6d 73 67 20 3d 20 70 7a 45 72 72 3b 0a 20 20  rmsg = pzErr;.  
3760: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
3770: 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69  s5IndexLoadConfi
3780: 67 28 70 54 61 62 2d 3e 70 49 6e 64 65 78 29 3b  g(pTab->pIndex);
3790: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
37a0: 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 70 54  IndexRollback(pT
37b0: 61 62 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20 20  ab->pIndex);.   
37c0: 20 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72 6d   pConfig->pzErrm
37d0: 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  sg = 0;.  }..  i
37e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37f0: 20 29 7b 0a 20 20 20 20 66 74 73 35 46 72 65 65   ){.    fts5Free
3800: 56 74 61 62 28 70 54 61 62 29 3b 0a 20 20 20 20  Vtab(pTab);.    
3810: 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pTab = 0;.  }els
3820: 65 20 69 66 28 20 62 43 72 65 61 74 65 20 29 7b  e if( bCreate ){
3830: 0a 20 20 20 20 66 74 73 35 43 68 65 63 6b 54 72  .    fts5CheckTr
3840: 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65 28 70  ansactionState(p
3850: 54 61 62 2c 20 46 54 53 35 5f 42 45 47 49 4e 2c  Tab, FTS5_BEGIN,
3860: 20 30 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 56 54   0);.  }.  *ppVT
3870: 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74  ab = (sqlite3_vt
3880: 61 62 2a 29 70 54 61 62 3b 0a 20 20 72 65 74 75  ab*)pTab;.  retu
3890: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
38a0: 54 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 20 61  The xConnect() a
38b0: 6e 64 20 78 43 72 65 61 74 65 28 29 20 6d 65 74  nd xCreate() met
38c0: 68 6f 64 73 20 66 6f 72 20 74 68 65 20 76 69 72  hods for the vir
38d0: 74 75 61 6c 20 74 61 62 6c 65 2e 20 41 6c 6c 20  tual table. All 
38e0: 74 68 65 0a 2a 2a 20 77 6f 72 6b 20 69 73 20 64  the.** work is d
38f0: 6f 6e 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  one in function 
3900: 66 74 73 35 49 6e 69 74 56 74 61 62 28 29 2e 0a  fts5InitVtab()..
3910: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
3920: 73 35 43 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28  s5ConnectMethod(
3930: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3950: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
3960: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76  onnection */.  v
3970: 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20  oid *pAux,      
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3990: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 6f 6b  * Pointer to tok
39a0: 65 6e 69 7a 65 72 20 68 61 73 68 20 74 61 62 6c  enizer hash tabl
39b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  e */.  int argc,
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
39e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
39f0: 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a 20 20  argv array */.  
3a00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
3a10: 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20 20 20  st *argv,       
3a20: 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e  /* xCreate/xConn
3a30: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61 72 72  ect argument arr
3a40: 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ay */.  sqlite3_
3a50: 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 20 20  vtab **ppVtab,  
3a60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3a70: 4e 65 77 20 73 71 6c 69 74 65 33 5f 76 74 61 62  New sqlite3_vtab
3a80: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
3a90: 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20  r **pzErr       
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ab0: 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  OUT: sqlite3_mal
3ac0: 6c 6f 63 27 64 20 65 72 72 6f 72 20 6d 65 73 73  loc'd error mess
3ad0: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  age */.){.  retu
3ae0: 72 6e 20 66 74 73 35 49 6e 69 74 56 74 61 62 28  rn fts5InitVtab(
3af0: 30 2c 20 64 62 2c 20 70 41 75 78 2c 20 61 72 67  0, db, pAux, arg
3b00: 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61 62 2c  c, argv, ppVtab,
3b10: 20 70 7a 45 72 72 29 3b 0a 7d 0a 73 74 61 74 69   pzErr);.}.stati
3b20: 63 20 69 6e 74 20 66 74 73 35 43 72 65 61 74 65  c int fts5Create
3b30: 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
3b40: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
3b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
3b60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3b70: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78   */.  void *pAux
3b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b90: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3ba0: 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61   to tokenizer ha
3bb0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  sh table */.  in
3bc0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3be0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3bf0: 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72 72 61  nts in argv arra
3c00: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
3c10: 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67 76 2c  r * const *argv,
3c20: 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
3c30: 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67 75 6d  e/xConnect argum
3c40: 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
3c50: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
3c60: 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  Vtab,          /
3c70: 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c 69 74  * OUT: New sqlit
3c80: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20 2a  e3_vtab object *
3c90: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c 69      /* OUT: sqli
3cc0: 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65 72 72  te3_malloc'd err
3cd0: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b  or message */.){
3ce0: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
3cf0: 69 74 56 74 61 62 28 31 2c 20 64 62 2c 20 70 41  itVtab(1, db, pA
3d00: 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  ux, argc, argv, 
3d10: 70 70 56 74 61 62 2c 20 70 7a 45 72 72 29 3b 0a  ppVtab, pzErr);.
3d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 69 66  }../*.** The dif
3d30: 66 65 72 65 6e 74 20 71 75 65 72 79 20 70 6c 61  ferent query pla
3d40: 6e 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ns..*/.#define F
3d50: 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 20 20  TS5_PLAN_MATCH  
3d60: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
3d70: 2f 2a 20 28 3c 74 62 6c 3e 20 4d 41 54 43 48 20  /* (<tbl> MATCH 
3d80: 3f 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  ?) */.#define FT
3d90: 53 35 5f 50 4c 41 4e 5f 53 4f 55 52 43 45 20 20  S5_PLAN_SOURCE  
3da0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 2f         2       /
3db0: 2a 20 41 20 73 6f 75 72 63 65 20 63 75 72 73 6f  * A source curso
3dc0: 72 20 66 6f 72 20 53 4f 52 54 45 44 5f 4d 41 54  r for SORTED_MAT
3dd0: 43 48 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  CH */.#define FT
3de0: 53 35 5f 50 4c 41 4e 5f 53 50 45 43 49 41 4c 20  S5_PLAN_SPECIAL 
3df0: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 2f         3       /
3e00: 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20 71 75  * An internal qu
3e10: 65 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ery */.#define F
3e20: 54 53 35 5f 50 4c 41 4e 5f 53 4f 52 54 45 44 5f  TS5_PLAN_SORTED_
3e30: 4d 41 54 43 48 20 20 20 34 20 20 20 20 20 20 20  MATCH   4       
3e40: 2f 2a 20 28 3c 74 62 6c 3e 20 4d 41 54 43 48 20  /* (<tbl> MATCH 
3e50: 3f 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 29  ? ORDER BY rank)
3e60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
3e70: 5f 50 4c 41 4e 5f 53 43 41 4e 20 20 20 20 20 20  _PLAN_SCAN      
3e80: 20 20 20 20 20 35 20 20 20 20 20 20 20 2f 2a 20       5       /* 
3e90: 4e 6f 20 75 73 61 62 6c 65 20 63 6f 6e 73 74 72  No usable constr
3ea0: 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  aint */.#define 
3eb0: 46 54 53 35 5f 50 4c 41 4e 5f 52 4f 57 49 44 20  FTS5_PLAN_ROWID 
3ec0: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
3ed0: 20 2f 2a 20 28 72 6f 77 69 64 20 3d 20 3f 29 20   /* (rowid = ?) 
3ee0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  */../*.** Set th
3ef0: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  e SQLITE_INDEX_S
3f00: 43 41 4e 5f 55 4e 49 51 55 45 20 66 6c 61 67 20  CAN_UNIQUE flag 
3f10: 69 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 66 6c 61  in pIdxInfo->fla
3f20: 67 73 2e 20 55 6e 6c 65 73 73 20 74 68 69 73 0a  gs. Unless this.
3f30: 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20  ** extension is 
3f40: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
3f50: 75 73 65 64 20 62 79 20 61 20 76 65 72 73 69 6f  used by a versio
3f60: 6e 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 6f 20  n of SQLite too 
3f70: 6f 6c 64 20 74 6f 0a 2a 2a 20 73 75 70 70 6f 72  old to.** suppor
3f80: 74 20 69 6e 64 65 78 2d 69 6e 66 6f 20 66 6c 61  t index-info fla
3f90: 67 73 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  gs. In that case
3fa0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
3fb0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
3fc0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
3fd0: 74 55 6e 69 71 75 65 46 6c 61 67 28 73 71 6c 69  tUniqueFlag(sqli
3fe0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
3ff0: 70 49 64 78 49 6e 66 6f 29 7b 0a 23 69 66 20 53  pIdxInfo){.#if S
4000: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
4010: 4d 42 45 52 3e 3d 33 30 30 38 30 31 32 0a 23 69  MBER>=3008012.#i
4020: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 52  fndef SQLITE_COR
4030: 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  E.  if( sqlite3_
4040: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
4050: 72 28 29 3e 3d 33 30 30 38 30 31 32 20 29 0a 23  r()>=3008012 ).#
4060: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 70 49  endif.  {.    pI
4070: 64 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73  dxInfo->idxFlags
4080: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58   |= SQLITE_INDEX
4090: 5f 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20  _SCAN_UNIQUE;.  
40a0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
40b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
40c0: 20 6f 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   of the xBestInd
40d0: 65 78 20 6d 65 74 68 6f 64 20 66 6f 72 20 46 54  ex method for FT
40e0: 53 35 20 74 61 62 6c 65 73 2e 20 57 69 74 68 69  S5 tables. Withi
40f0: 6e 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20  n the .** WHERE 
4100: 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69 74 20 73  constraint, it s
4110: 65 61 72 63 68 65 73 20 66 6f 72 20 74 68 65 20  earches for the 
4120: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
4130: 20 20 20 31 2e 20 41 20 4d 41 54 43 48 20 63 6f     1. A MATCH co
4140: 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e 73 74  nstraint against
4150: 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 6c   the special col
4160: 75 6d 6e 2e 0a 2a 2a 20 20 20 32 2e 20 41 20 4d  umn..**   2. A M
4170: 41 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20  ATCH constraint 
4180: 61 67 61 69 6e 73 74 20 74 68 65 20 22 72 61 6e  against the "ran
4190: 6b 22 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  k" column..**   
41a0: 33 2e 20 41 6e 20 3d 3d 20 63 6f 6e 73 74 72 61  3. An == constra
41b0: 69 6e 74 20 61 67 61 69 6e 73 74 20 74 68 65 20  int against the 
41c0: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  rowid column..**
41d0: 20 20 20 34 2e 20 41 20 3c 20 6f 72 20 3c 3d 20     4. A < or <= 
41e0: 63 6f 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e  constraint again
41f0: 73 74 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c  st the rowid col
4200: 75 6d 6e 2e 0a 2a 2a 20 20 20 35 2e 20 41 20 3e  umn..**   5. A >
4210: 20 6f 72 20 3e 3d 20 63 6f 6e 73 74 72 61 69 6e   or >= constrain
4220: 74 20 61 67 61 69 6e 73 74 20 74 68 65 20 72 6f  t against the ro
4230: 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  wid column..**.*
4240: 2a 20 57 69 74 68 69 6e 20 74 68 65 20 4f 52 44  * Within the ORD
4250: 45 52 20 42 59 2c 20 65 69 74 68 65 72 3a 0a 2a  ER BY, either:.*
4260: 2a 0a 2a 2a 20 20 20 35 2e 20 4f 52 44 45 52 20  *.**   5. ORDER 
4270: 42 59 20 72 61 6e 6b 20 5b 41 53 43 7c 44 45 53  BY rank [ASC|DES
4280: 43 5d 0a 2a 2a 20 20 20 36 2e 20 4f 52 44 45 52  C].**   6. ORDER
4290: 20 42 59 20 72 6f 77 69 64 20 5b 41 53 43 7c 44   BY rowid [ASC|D
42a0: 45 53 43 5d 0a 2a 2a 0a 2a 2a 20 43 6f 73 74 73  ESC].**.** Costs
42b0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 61 73   are assigned as
42c0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
42d0: 20 61 29 20 49 66 20 61 6e 20 75 6e 75 73 61 62   a) If an unusab
42e0: 6c 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f  le MATCH operato
42f0: 72 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  r is present in 
4300: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4310: 2c 20 74 68 65 0a 2a 2a 20 20 20 20 20 63 6f 73  , the.**     cos
4320: 74 20 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  t is uncondition
4330: 61 6c 6c 79 20 73 65 74 20 74 6f 20 31 65 35 30  ally set to 1e50
4340: 20 28 61 20 72 65 61 6c 6c 79 20 62 69 67 20 6e   (a really big n
4350: 75 6d 62 65 72 29 2e 0a 2a 2a 0a 2a 2a 20 20 61  umber)..**.**  a
4360: 29 20 49 66 20 61 20 4d 41 54 43 48 20 6f 70 65  ) If a MATCH ope
4370: 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 6e 74  rator is present
4380: 2c 20 74 68 65 20 63 6f 73 74 20 64 65 70 65 6e  , the cost depen
4390: 64 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 0a  ds on the other.
43a0: 2a 2a 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e  **     constrain
43b0: 74 73 20 61 6c 73 6f 20 70 72 65 73 65 6e 74 2e  ts also present.
43c0: 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   As follows:.**.
43d0: 2a 2a 20 20 20 20 20 20 20 2a 20 4e 6f 20 6f 74  **       * No ot
43e0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  her constraints:
43f0: 20 20 20 20 20 20 20 20 20 63 6f 73 74 3d 31 30           cost=10
4400: 30 30 2e 30 0a 2a 2a 20 20 20 20 20 20 20 2a 20  00.0.**       * 
4410: 4f 6e 65 20 72 6f 77 69 64 20 72 61 6e 67 65 20  One rowid range 
4420: 63 6f 6e 73 74 72 61 69 6e 74 3a 20 20 20 63 6f  constraint:   co
4430: 73 74 3d 37 35 30 2e 30 0a 2a 2a 20 20 20 20 20  st=750.0.**     
4440: 20 20 2a 20 42 6f 74 68 20 72 6f 77 69 64 20 72    * Both rowid r
4450: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
4460: 3a 20 63 6f 73 74 3d 35 30 30 2e 30 0a 2a 2a 20  : cost=500.0.** 
4470: 20 20 20 20 20 20 2a 20 41 6e 20 3d 3d 20 72 6f        * An == ro
4480: 77 69 64 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20  wid constraint: 
4490: 20 20 20 20 20 20 63 6f 73 74 3d 31 30 30 2e 30        cost=100.0
44a0: 0a 2a 2a 0a 2a 2a 20 20 62 29 20 4f 74 68 65 72  .**.**  b) Other
44b0: 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69  wise, if there i
44c0: 73 20 6e 6f 20 4d 41 54 43 48 3a 0a 2a 2a 0a 2a  s no MATCH:.**.*
44d0: 2a 20 20 20 20 20 20 20 2a 20 4e 6f 20 6f 74 68  *       * No oth
44e0: 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20  er constraints: 
44f0: 20 20 20 20 20 20 20 20 63 6f 73 74 3d 31 30 30          cost=100
4500: 30 30 30 30 2e 30 0a 2a 2a 20 20 20 20 20 20 20  0000.0.**       
4510: 2a 20 4f 6e 65 20 72 6f 77 69 64 20 72 61 6e 67  * One rowid rang
4520: 65 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20 20 20  e constraint:   
4530: 63 6f 73 74 3d 37 35 30 30 30 30 2e 30 0a 2a 2a  cost=750000.0.**
4540: 20 20 20 20 20 20 20 2a 20 42 6f 74 68 20 72 6f         * Both ro
4550: 77 69 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  wid range constr
4560: 61 69 6e 74 73 3a 20 63 6f 73 74 3d 32 35 30 30  aints: cost=2500
4570: 30 30 2e 30 0a 2a 2a 20 20 20 20 20 20 20 2a 20  00.0.**       * 
4580: 41 6e 20 3d 3d 20 72 6f 77 69 64 20 63 6f 6e 73  An == rowid cons
4590: 74 72 61 69 6e 74 3a 20 20 20 20 20 20 20 63 6f  traint:       co
45a0: 73 74 3d 31 30 2e 30 0a 2a 2a 0a 2a 2a 20 43 6f  st=10.0.**.** Co
45b0: 73 74 73 20 61 72 65 20 6e 6f 74 20 6d 6f 64 69  sts are not modi
45c0: 66 69 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  fied by the ORDE
45d0: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  R BY clause..*/.
45e0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42  static int fts5B
45f0: 65 73 74 49 6e 64 65 78 4d 65 74 68 6f 64 28 73  estIndexMethod(s
4600: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
4610: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
4620: 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  x_info *pInfo){.
4630: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
4640: 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
4650: 70 56 54 61 62 3b 0a 20 20 46 74 73 35 43 6f 6e  pVTab;.  Fts5Con
4660: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
4670: 54 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  Tab->pConfig;.  
4680: 63 6f 6e 73 74 20 69 6e 74 20 6e 43 6f 6c 20 3d  const int nCol =
4690: 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a   pConfig->nCol;.
46a0: 20 20 69 6e 74 20 69 64 78 46 6c 61 67 73 20 3d    int idxFlags =
46b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
46c0: 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 70    /* Parameter p
46d0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
46e0: 20 78 46 69 6c 74 65 72 28 29 20 2a 2f 0a 20 20   xFilter() */.  
46f0: 69 6e 74 20 62 48 61 73 4d 61 74 63 68 3b 0a 20  int bHasMatch;. 
4700: 20 69 6e 74 20 69 4e 65 78 74 3b 0a 20 20 69 6e   int iNext;.  in
4710: 74 20 69 3b 0a 0a 20 20 73 74 72 75 63 74 20 43  t i;..  struct C
4720: 6f 6e 73 74 72 61 69 6e 74 20 7b 0a 20 20 20 20  onstraint {.    
4730: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4750: 20 4d 61 73 6b 20 61 67 61 69 6e 73 74 20 73 71   Mask against sq
4760: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
4770: 74 72 61 69 6e 74 2e 6f 70 20 2a 2f 0a 20 20 20  traint.op */.   
4780: 20 69 6e 74 20 66 74 73 35 6f 70 3b 20 20 20 20   int fts5op;    
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47a0: 2a 20 46 54 53 35 20 6d 61 73 6b 20 66 6f 72 20  * FTS5 mask for 
47b0: 69 64 78 46 6c 61 67 73 20 2a 2f 0a 20 20 20 20  idxFlags */.    
47c0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
47e0: 20 30 3d 3d 72 6f 77 69 64 2c 20 31 3d 3d 74 62   0==rowid, 1==tb
47f0: 6c 2c 20 32 3d 3d 72 61 6e 6b 20 2a 2f 0a 20 20  l, 2==rank */.  
4800: 20 20 69 6e 74 20 6f 6d 69 74 3b 20 20 20 20 20    int omit;     
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
4830: 74 68 69 73 20 69 66 20 66 6f 75 6e 64 20 2a 2f  this if found */
4840: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6e 73 49 6e  .    int iConsIn
4850: 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
4860: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
4870: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
4880: 74 5b 5d 20 2a 2f 0a 20 20 7d 20 61 43 6f 6e 73  t[] */.  } aCons
4890: 74 72 61 69 6e 74 5b 5d 20 3d 20 7b 0a 20 20 20  traint[] = {.   
48a0: 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43   {SQLITE_INDEX_C
48b0: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 7c  ONSTRAINT_MATCH|
48c0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
48d0: 53 54 52 41 49 4e 54 5f 45 51 2c 20 0a 20 20 20  STRAINT_EQ, .   
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 46 54 53 35 5f 42 49 5f 4d 41 54 43 48 2c 20   FTS5_BI_MATCH, 
4910: 20 20 20 31 2c 20 31 2c 20 2d 31 7d 2c 0a 20 20     1, 1, -1},.  
4920: 20 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f    {SQLITE_INDEX_
4930: 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
4940: 7c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  |SQLITE_INDEX_CO
4950: 4e 53 54 52 41 49 4e 54 5f 45 51 2c 20 0a 20 20  NSTRAINT_EQ, .  
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 46 54 53 35 5f 42 49 5f 52 41 4e 4b 2c 20    FTS5_BI_RANK, 
4990: 20 20 20 20 32 2c 20 31 2c 20 2d 31 7d 2c 0a 20      2, 1, -1},. 
49a0: 20 20 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45 58     {SQLITE_INDEX
49b0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 2c 20  _CONSTRAINT_EQ, 
49c0: 20 20 20 46 54 53 35 5f 42 49 5f 52 4f 57 49 44     FTS5_BI_ROWID
49d0: 5f 45 51 2c 20 30 2c 20 30 2c 20 2d 31 7d 2c 0a  _EQ, 0, 0, -1},.
49e0: 20 20 20 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45      {SQLITE_INDE
49f0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 7c  X_CONSTRAINT_LT|
4a00: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
4a10: 53 54 52 41 49 4e 54 5f 4c 45 2c 20 0a 20 20 20  STRAINT_LE, .   
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a40: 20 46 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 4c   FTS5_BI_ROWID_L
4a50: 45 2c 20 30 2c 20 30 2c 20 2d 31 7d 2c 0a 20 20  E, 0, 0, -1},.  
4a60: 20 20 7b 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f    {SQLITE_INDEX_
4a70: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 7c 53 51  CONSTRAINT_GT|SQ
4a80: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
4a90: 52 41 49 4e 54 5f 47 45 2c 20 0a 20 20 20 20 20  RAINT_GE, .     
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
4ac0: 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 47 45 2c  TS5_BI_ROWID_GE,
4ad0: 20 30 2c 20 30 2c 20 2d 31 7d 2c 0a 20 20 7d 3b   0, 0, -1},.  };
4ae0: 0a 0a 20 20 69 6e 74 20 61 43 6f 6c 4d 61 70 5b  ..  int aColMap[
4af0: 33 5d 3b 0a 20 20 61 43 6f 6c 4d 61 70 5b 30 5d  3];.  aColMap[0]
4b00: 20 3d 20 2d 31 3b 0a 20 20 61 43 6f 6c 4d 61 70   = -1;.  aColMap
4b10: 5b 31 5d 20 3d 20 6e 43 6f 6c 3b 0a 20 20 61 43  [1] = nCol;.  aC
4b20: 6f 6c 4d 61 70 5b 32 5d 20 3d 20 6e 43 6f 6c 2b  olMap[2] = nCol+
4b30: 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51  1;..  assert( SQ
4b40: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
4b50: 52 41 49 4e 54 5f 45 51 3c 53 51 4c 49 54 45 5f  RAINT_EQ<SQLITE_
4b60: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
4b70: 5f 4d 41 54 43 48 20 29 3b 0a 20 20 61 73 73 65  _MATCH );.  asse
4b80: 72 74 28 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  rt( SQLITE_INDEX
4b90: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 3c 53  _CONSTRAINT_GT<S
4ba0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
4bb0: 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
4bc0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
4bd0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
4be0: 54 5f 4c 45 3c 53 51 4c 49 54 45 5f 49 4e 44 45  T_LE<SQLITE_INDE
4bf0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
4c00: 43 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CH );.  assert( 
4c10: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
4c20: 53 54 52 41 49 4e 54 5f 47 45 3c 53 51 4c 49 54  STRAINT_GE<SQLIT
4c30: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
4c40: 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 61 73  NT_MATCH );.  as
4c50: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 49 4e 44  sert( SQLITE_IND
4c60: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
4c70: 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  <SQLITE_INDEX_CO
4c80: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
4c90: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 69 64 78 46  ;..  /* Set idxF
4ca0: 6c 61 67 73 20 66 6c 61 67 73 20 66 6f 72 20 61  lags flags for a
4cb0: 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ll WHERE clause 
4cc0: 74 65 72 6d 73 20 74 68 61 74 20 77 69 6c 6c 20  terms that will 
4cd0: 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 66 6f  be used. */.  fo
4ce0: 72 28 69 3d 30 3b 20 69 3c 70 49 6e 66 6f 2d 3e  r(i=0; i<pInfo->
4cf0: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
4d00: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71  ){.    struct sq
4d10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
4d20: 74 72 61 69 6e 74 20 2a 70 20 3d 20 26 70 49 6e  traint *p = &pIn
4d30: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
4d40: 69 5d 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  i];.    int iCol
4d50: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a   = p->iColumn;..
4d60: 20 20 20 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d      if( (p->op==
4d70: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
4d80: 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 26 26  STRAINT_MATCH &&
4d90: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
4da0: 3c 3d 6e 43 6f 6c 29 0a 20 20 20 20 20 7c 7c 20  <=nCol).     || 
4db0: 28 70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  (p->op==SQLITE_I
4dc0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
4dd0: 45 51 20 26 26 20 69 43 6f 6c 3d 3d 6e 43 6f 6c  EQ && iCol==nCol
4de0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
4df0: 2a 20 41 20 4d 41 54 43 48 20 6f 70 65 72 61 74  * A MATCH operat
4e00: 6f 72 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  or or equivalent
4e10: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
4e20: 3e 75 73 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >usable ){.     
4e30: 20 20 20 69 64 78 46 6c 61 67 73 20 3d 20 28 69     idxFlags = (i
4e40: 64 78 46 6c 61 67 73 20 26 20 30 78 46 46 46 46  dxFlags & 0xFFFF
4e50: 29 20 7c 20 46 54 53 35 5f 42 49 5f 4d 41 54 43  ) | FTS5_BI_MATC
4e60: 48 20 7c 20 28 69 43 6f 6c 20 3c 3c 20 31 36 29  H | (iCol << 16)
4e70: 3b 0a 20 20 20 20 20 20 20 20 61 43 6f 6e 73 74  ;.        aConst
4e80: 72 61 69 6e 74 5b 30 5d 2e 69 43 6f 6e 73 49 6e  raint[0].iConsIn
4e90: 64 65 78 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d  dex = i;.      }
4ea0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
4eb0: 20 41 73 20 74 68 65 72 65 20 65 78 69 73 74 73   As there exists
4ec0: 20 61 6e 20 75 6e 75 73 61 62 6c 65 20 4d 41 54   an unusable MAT
4ed0: 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  CH constraint th
4ee0: 69 73 20 69 73 20 61 6e 20 0a 20 20 20 20 20 20  is is an .      
4ef0: 20 20 2a 2a 20 75 6e 75 73 61 62 6c 65 20 70 6c    ** unusable pl
4f00: 61 6e 2e 20 53 65 74 20 61 20 70 72 6f 68 69 62  an. Set a prohib
4f10: 69 74 69 76 65 6c 79 20 68 69 67 68 20 63 6f 73  itively high cos
4f20: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49  t. */.        pI
4f30: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
4f40: 73 74 20 3d 20 31 65 35 30 3b 0a 20 20 20 20 20  st = 1e50;.     
4f50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4f60: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
4f70: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
4f80: 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  <=SQLITE_INDEX_C
4f90: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20  ONSTRAINT_MATCH 
4fa0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ){.      int j;.
4fb0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
4fc0: 3c 41 72 72 61 79 53 69 7a 65 28 61 43 6f 6e 73  <ArraySize(aCons
4fd0: 74 72 61 69 6e 74 29 3b 20 6a 2b 2b 29 7b 0a 20  traint); j++){. 
4fe0: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 43 6f         struct Co
4ff0: 6e 73 74 72 61 69 6e 74 20 2a 70 43 20 3d 20 26  nstraint *pC = &
5000: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 3b 0a  aConstraint[j];.
5010: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
5020: 3d 3d 61 43 6f 6c 4d 61 70 5b 70 43 2d 3e 69 43  ==aColMap[pC->iC
5030: 6f 6c 5d 20 26 26 20 28 70 2d 3e 6f 70 20 26 20  ol] && (p->op & 
5040: 70 43 2d 3e 6f 70 29 20 26 26 20 70 2d 3e 75 73  pC->op) && p->us
5050: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
5060: 20 20 70 43 2d 3e 69 43 6f 6e 73 49 6e 64 65 78    pC->iConsIndex
5070: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
5080: 69 64 78 46 6c 61 67 73 20 7c 3d 20 70 43 2d 3e  idxFlags |= pC->
5090: 66 74 73 35 6f 70 3b 0a 20 20 20 20 20 20 20 20  fts5op;.        
50a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
50b0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 69 64    }..  /* Set id
50c0: 78 46 6c 61 67 73 20 66 6c 61 67 73 20 66 6f 72  xFlags flags for
50d0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
50e0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 49  ause */.  if( pI
50f0: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d 31  nfo->nOrderBy==1
5100: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 6f 72   ){.    int iSor
5110: 74 20 3d 20 70 49 6e 66 6f 2d 3e 61 4f 72 64 65  t = pInfo->aOrde
5120: 72 42 79 5b 30 5d 2e 69 43 6f 6c 75 6d 6e 3b 0a  rBy[0].iColumn;.
5130: 20 20 20 20 69 66 28 20 69 53 6f 72 74 3d 3d 28      if( iSort==(
5140: 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 2b 31 29  pConfig->nCol+1)
5150: 20 26 26 20 42 69 74 46 6c 61 67 54 65 73 74 28   && BitFlagTest(
5160: 69 64 78 46 6c 61 67 73 2c 20 46 54 53 35 5f 42  idxFlags, FTS5_B
5170: 49 5f 4d 41 54 43 48 29 20 29 7b 0a 20 20 20 20  I_MATCH) ){.    
5180: 20 20 69 64 78 46 6c 61 67 73 20 7c 3d 20 46 54    idxFlags |= FT
5190: 53 35 5f 42 49 5f 4f 52 44 45 52 5f 52 41 4e 4b  S5_BI_ORDER_RANK
51a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
51b0: 69 53 6f 72 74 3d 3d 2d 31 20 29 7b 0a 20 20 20  iSort==-1 ){.   
51c0: 20 20 20 69 64 78 46 6c 61 67 73 20 7c 3d 20 46     idxFlags |= F
51d0: 54 53 35 5f 42 49 5f 4f 52 44 45 52 5f 52 4f 57  TS5_BI_ORDER_ROW
51e0: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ID;.    }.    if
51f0: 28 20 42 69 74 46 6c 61 67 54 65 73 74 28 69 64  ( BitFlagTest(id
5200: 78 46 6c 61 67 73 2c 20 46 54 53 35 5f 42 49 5f  xFlags, FTS5_BI_
5210: 4f 52 44 45 52 5f 52 41 4e 4b 7c 46 54 53 35 5f  ORDER_RANK|FTS5_
5220: 42 49 5f 4f 52 44 45 52 5f 52 4f 57 49 44 29 20  BI_ORDER_ROWID) 
5230: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
5240: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
5250: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
5260: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30  Info->aOrderBy[0
5270: 5d 2e 64 65 73 63 20 29 7b 0a 20 20 20 20 20 20  ].desc ){.      
5280: 20 20 69 64 78 46 6c 61 67 73 20 7c 3d 20 46 54    idxFlags |= FT
5290: 53 35 5f 42 49 5f 4f 52 44 45 52 5f 44 45 53 43  S5_BI_ORDER_DESC
52a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
52b0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c    }..  /* Calcul
52c0: 61 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ate the estimate
52d0: 64 20 63 6f 73 74 20 62 61 73 65 64 20 6f 6e 20  d cost based on 
52e0: 74 68 65 20 66 6c 61 67 73 20 73 65 74 20 69 6e  the flags set in
52f0: 20 69 64 78 46 6c 61 67 73 2e 20 2a 2f 0a 20 20   idxFlags. */.  
5300: 62 48 61 73 4d 61 74 63 68 20 3d 20 42 69 74 46  bHasMatch = BitF
5310: 6c 61 67 54 65 73 74 28 69 64 78 46 6c 61 67 73  lagTest(idxFlags
5320: 2c 20 46 54 53 35 5f 42 49 5f 4d 41 54 43 48 29  , FTS5_BI_MATCH)
5330: 3b 0a 20 20 69 66 28 20 42 69 74 46 6c 61 67 54  ;.  if( BitFlagT
5340: 65 73 74 28 69 64 78 46 6c 61 67 73 2c 20 46 54  est(idxFlags, FT
5350: 53 35 5f 42 49 5f 52 4f 57 49 44 5f 45 51 29 20  S5_BI_ROWID_EQ) 
5360: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73  ){.    pInfo->es
5370: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 62 48  timatedCost = bH
5380: 61 73 4d 61 74 63 68 20 3f 20 31 30 30 2e 30 20  asMatch ? 100.0 
5390: 3a 20 31 30 2e 30 3b 0a 20 20 20 20 69 66 28 20  : 10.0;.    if( 
53a0: 62 48 61 73 4d 61 74 63 68 3d 3d 30 20 29 20 66  bHasMatch==0 ) f
53b0: 74 73 35 53 65 74 55 6e 69 71 75 65 46 6c 61 67  ts5SetUniqueFlag
53c0: 28 70 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  (pInfo);.  }else
53d0: 20 69 66 28 20 42 69 74 46 6c 61 67 41 6c 6c 54   if( BitFlagAllT
53e0: 65 73 74 28 69 64 78 46 6c 61 67 73 2c 20 46 54  est(idxFlags, FT
53f0: 53 35 5f 42 49 5f 52 4f 57 49 44 5f 4c 45 7c 46  S5_BI_ROWID_LE|F
5400: 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 47 45 29  TS5_BI_ROWID_GE)
5410: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65   ){.    pInfo->e
5420: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 62  stimatedCost = b
5430: 48 61 73 4d 61 74 63 68 20 3f 20 35 30 30 2e 30  HasMatch ? 500.0
5440: 20 3a 20 32 35 30 30 30 30 2e 30 3b 0a 20 20 7d   : 250000.0;.  }
5450: 65 6c 73 65 20 69 66 28 20 42 69 74 46 6c 61 67  else if( BitFlag
5460: 54 65 73 74 28 69 64 78 46 6c 61 67 73 2c 20 46  Test(idxFlags, F
5470: 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 4c 45 7c  TS5_BI_ROWID_LE|
5480: 46 54 53 35 5f 42 49 5f 52 4f 57 49 44 5f 47 45  FTS5_BI_ROWID_GE
5490: 29 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ) ){.    pInfo->
54a0: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
54b0: 62 48 61 73 4d 61 74 63 68 20 3f 20 37 35 30 2e  bHasMatch ? 750.
54c0: 30 20 3a 20 37 35 30 30 30 30 2e 30 3b 0a 20 20  0 : 750000.0;.  
54d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
54e0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
54f0: 3d 20 62 48 61 73 4d 61 74 63 68 20 3f 20 31 30  = bHasMatch ? 10
5500: 30 30 2e 30 20 3a 20 31 30 30 30 30 30 30 2e 30  00.0 : 1000000.0
5510: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  ;.  }..  /* Assi
5520: 67 6e 20 61 72 67 76 49 6e 64 65 78 20 76 61 6c  gn argvIndex val
5530: 75 65 73 20 74 6f 20 65 61 63 68 20 63 6f 6e 73  ues to each cons
5540: 74 72 61 69 6e 74 20 69 6e 20 75 73 65 2e 20 2a  traint in use. *
5550: 2f 0a 20 20 69 4e 65 78 74 20 3d 20 31 3b 0a 20  /.  iNext = 1;. 
5560: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
5570: 79 53 69 7a 65 28 61 43 6f 6e 73 74 72 61 69 6e  ySize(aConstrain
5580: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  t); i++){.    st
5590: 72 75 63 74 20 43 6f 6e 73 74 72 61 69 6e 74 20  ruct Constraint 
55a0: 2a 70 43 20 3d 20 26 61 43 6f 6e 73 74 72 61 69  *pC = &aConstrai
55b0: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
55c0: 43 2d 3e 69 43 6f 6e 73 49 6e 64 65 78 3e 3d 30  C->iConsIndex>=0
55d0: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
55e0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
55f0: 65 5b 70 43 2d 3e 69 43 6f 6e 73 49 6e 64 65 78  e[pC->iConsIndex
5600: 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69 4e  ].argvIndex = iN
5610: 65 78 74 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ext++;.      pIn
5620: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
5630: 73 61 67 65 5b 70 43 2d 3e 69 43 6f 6e 73 49 6e  sage[pC->iConsIn
5640: 64 65 78 5d 2e 6f 6d 69 74 20 3d 20 28 75 6e 73  dex].omit = (uns
5650: 69 67 6e 65 64 20 63 68 61 72 29 70 43 2d 3e 6f  igned char)pC->o
5660: 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mit;.    }.  }..
5670: 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20    pInfo->idxNum 
5680: 3d 20 69 64 78 46 6c 61 67 73 3b 0a 20 20 72 65  = idxFlags;.  re
5690: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
56a0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
56b0: 73 35 4e 65 77 54 72 61 6e 73 61 63 74 69 6f 6e  s5NewTransaction
56c0: 28 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62  (Fts5Table *pTab
56d0: 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20  ){.  Fts5Cursor 
56e0: 2a 70 43 73 72 3b 0a 20 20 66 6f 72 28 70 43 73  *pCsr;.  for(pCs
56f0: 72 3d 70 54 61 62 2d 3e 70 47 6c 6f 62 61 6c 2d  r=pTab->pGlobal-
5700: 3e 70 43 73 72 3b 20 70 43 73 72 3b 20 70 43 73  >pCsr; pCsr; pCs
5710: 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCsr->pNext){.
5720: 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 62 61      if( pCsr->ba
5730: 73 65 2e 70 56 74 61 62 3d 3d 28 73 71 6c 69 74  se.pVtab==(sqlit
5740: 65 33 5f 76 74 61 62 2a 29 70 54 61 62 20 29 20  e3_vtab*)pTab ) 
5750: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5760: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
5770: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
5780: 65 52 65 73 65 74 28 70 54 61 62 2d 3e 70 53 74  eReset(pTab->pSt
5790: 6f 72 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  orage);.}../*.**
57a0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
57b0: 6f 66 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 2e  of xOpen method.
57c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
57d0: 74 73 35 4f 70 65 6e 4d 65 74 68 6f 64 28 73 71  ts5OpenMethod(sq
57e0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61  lite3_vtab *pVTa
57f0: 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  b, sqlite3_vtab_
5800: 63 75 72 73 6f 72 20 2a 2a 70 70 43 73 72 29 7b  cursor **ppCsr){
5810: 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54  .  Fts5Table *pT
5820: 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a  ab = (Fts5Table*
5830: 29 70 56 54 61 62 3b 0a 20 20 46 74 73 35 43 6f  )pVTab;.  Fts5Co
5840: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
5850: 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20  pTab->pConfig;. 
5860: 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73   Fts5Cursor *pCs
5870: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
5880: 20 2f 2a 20 4e 65 77 20 63 75 72 73 6f 72 20 6f   /* New cursor o
5890: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
58a0: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
58b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
58c0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
58d0: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
58e0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5900: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
5910: 0a 20 20 72 63 20 3d 20 66 74 73 35 4e 65 77 54  .  rc = fts5NewT
5920: 72 61 6e 73 61 63 74 69 6f 6e 28 70 54 61 62 29  ransaction(pTab)
5930: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5940: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 42 79  TE_OK ){.    nBy
5950: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
5960: 43 75 72 73 6f 72 29 20 2b 20 70 43 6f 6e 66 69  Cursor) + pConfi
5970: 67 2d 3e 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f 66  g->nCol * sizeof
5980: 28 69 6e 74 29 3b 0a 20 20 20 20 70 43 73 72 20  (int);.    pCsr 
5990: 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29 73  = (Fts5Cursor*)s
59a0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
59b0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 43  yte);.    if( pC
59c0: 73 72 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  sr ){.      Fts5
59d0: 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 20  Global *pGlobal 
59e0: 3d 20 70 54 61 62 2d 3e 70 47 6c 6f 62 61 6c 3b  = pTab->pGlobal;
59f0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43  .      memset(pC
5a00: 73 72 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  sr, 0, nByte);. 
5a10: 20 20 20 20 20 70 43 73 72 2d 3e 61 43 6f 6c 75       pCsr->aColu
5a20: 6d 6e 53 69 7a 65 20 3d 20 28 69 6e 74 2a 29 26  mnSize = (int*)&
5a30: 70 43 73 72 5b 31 5d 3b 0a 20 20 20 20 20 20 70  pCsr[1];.      p
5a40: 43 73 72 2d 3e 70 4e 65 78 74 20 3d 20 70 47 6c  Csr->pNext = pGl
5a50: 6f 62 61 6c 2d 3e 70 43 73 72 3b 0a 20 20 20 20  obal->pCsr;.    
5a60: 20 20 70 47 6c 6f 62 61 6c 2d 3e 70 43 73 72 20    pGlobal->pCsr 
5a70: 3d 20 70 43 73 72 3b 0a 20 20 20 20 20 20 70 43  = pCsr;.      pC
5a80: 73 72 2d 3e 69 43 73 72 49 64 20 3d 20 2b 2b 70  sr->iCsrId = ++p
5a90: 47 6c 6f 62 61 6c 2d 3e 69 4e 65 78 74 49 64 3b  Global->iNextId;
5aa0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5ab0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5ac0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
5ad0: 20 2a 70 70 43 73 72 20 3d 20 28 73 71 6c 69 74   *ppCsr = (sqlit
5ae0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 2a 29  e3_vtab_cursor*)
5af0: 70 43 73 72 3b 0a 20 20 72 65 74 75 72 6e 20 72  pCsr;.  return r
5b00: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
5b10: 20 66 74 73 35 53 74 6d 74 54 79 70 65 28 46 74   fts5StmtType(Ft
5b20: 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  s5Cursor *pCsr){
5b30: 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65 50 6c  .  if( pCsr->ePl
5b40: 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 53 43  an==FTS5_PLAN_SC
5b50: 41 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  AN ){.    return
5b60: 20 28 70 43 73 72 2d 3e 62 44 65 73 63 29 20 3f   (pCsr->bDesc) ?
5b70: 20 46 54 53 35 5f 53 54 4d 54 5f 53 43 41 4e 5f   FTS5_STMT_SCAN_
5b80: 44 45 53 43 20 3a 20 46 54 53 35 5f 53 54 4d 54  DESC : FTS5_STMT
5b90: 5f 53 43 41 4e 5f 41 53 43 3b 0a 20 20 7d 0a 20  _SCAN_ASC;.  }. 
5ba0: 20 72 65 74 75 72 6e 20 46 54 53 35 5f 53 54 4d   return FTS5_STM
5bb0: 54 5f 4c 4f 4f 4b 55 50 3b 0a 7d 0a 0a 2f 2a 0a  T_LOOKUP;.}../*.
5bc0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5bd0: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
5be0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
5bf0: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
5c00: 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6d 6f  rgument.** is mo
5c10: 76 65 64 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ved to point at 
5c20: 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
5c30: 20 49 74 20 63 6c 65 61 72 73 20 61 6c 6c 20 63   It clears all c
5c40: 61 63 68 65 64 20 64 61 74 61 20 0a 2a 2a 20 73  ached data .** s
5c50: 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 70  pecific to the p
5c60: 72 65 76 69 6f 75 73 20 72 6f 77 20 73 74 6f 72  revious row stor
5c70: 65 64 20 62 79 20 74 68 65 20 63 75 72 73 6f 72  ed by the cursor
5c80: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
5c90: 69 63 20 76 6f 69 64 20 66 74 73 35 43 73 72 4e  ic void fts5CsrN
5ca0: 65 77 72 6f 77 28 46 74 73 35 43 75 72 73 6f 72  ewrow(Fts5Cursor
5cb0: 20 2a 70 43 73 72 29 7b 0a 20 20 43 73 72 46 6c   *pCsr){.  CsrFl
5cc0: 61 67 53 65 74 28 70 43 73 72 2c 20 0a 20 20 20  agSet(pCsr, .   
5cd0: 20 20 20 46 54 53 35 43 53 52 5f 52 45 51 55 49     FTS5CSR_REQUI
5ce0: 52 45 5f 43 4f 4e 54 45 4e 54 20 0a 20 20 20 20  RE_CONTENT .    
5cf0: 7c 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52  | FTS5CSR_REQUIR
5d00: 45 5f 44 4f 43 53 49 5a 45 20 0a 20 20 20 20 7c  E_DOCSIZE .    |
5d10: 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52 45   FTS5CSR_REQUIRE
5d20: 5f 49 4e 53 54 20 0a 20 20 20 20 7c 20 46 54 53  _INST .    | FTS
5d30: 35 43 53 52 5f 52 45 51 55 49 52 45 5f 50 4f 53  5CSR_REQUIRE_POS
5d40: 4c 49 53 54 20 0a 20 20 29 3b 0a 7d 0a 0a 73 74  LIST .  );.}..st
5d50: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 72  atic void fts5Fr
5d60: 65 65 43 75 72 73 6f 72 43 6f 6d 70 6f 6e 65 6e  eeCursorComponen
5d70: 74 73 28 46 74 73 35 43 75 72 73 6f 72 20 2a 70  ts(Fts5Cursor *p
5d80: 43 73 72 29 7b 0a 20 20 46 74 73 35 54 61 62 6c  Csr){.  Fts5Tabl
5d90: 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54  e *pTab = (Fts5T
5da0: 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73  able*)(pCsr->bas
5db0: 65 2e 70 56 74 61 62 29 3b 0a 20 20 46 74 73 35  e.pVtab);.  Fts5
5dc0: 41 75 78 64 61 74 61 20 2a 70 44 61 74 61 3b 0a  Auxdata *pData;.
5dd0: 20 20 46 74 73 35 41 75 78 64 61 74 61 20 2a 70    Fts5Auxdata *p
5de0: 4e 65 78 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Next;..  sqlite3
5df0: 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 49 6e 73  _free(pCsr->aIns
5e00: 74 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  tIter);.  sqlite
5e10: 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 49 6e  3_free(pCsr->aIn
5e20: 73 74 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  st);.  if( pCsr-
5e30: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e  >pStmt ){.    in
5e40: 74 20 65 53 74 6d 74 20 3d 20 66 74 73 35 53 74  t eStmt = fts5St
5e50: 6d 74 54 79 70 65 28 70 43 73 72 29 3b 0a 20 20  mtType(pCsr);.  
5e60: 20 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f    sqlite3Fts5Sto
5e70: 72 61 67 65 53 74 6d 74 52 65 6c 65 61 73 65 28  rageStmtRelease(
5e80: 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20  pTab->pStorage, 
5e90: 65 53 74 6d 74 2c 20 70 43 73 72 2d 3e 70 53 74  eStmt, pCsr->pSt
5ea0: 6d 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  mt);.  }.  if( p
5eb0: 43 73 72 2d 3e 70 53 6f 72 74 65 72 20 29 7b 0a  Csr->pSorter ){.
5ec0: 20 20 20 20 46 74 73 35 53 6f 72 74 65 72 20 2a      Fts5Sorter *
5ed0: 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d 3e  pSorter = pCsr->
5ee0: 70 53 6f 72 74 65 72 3b 0a 20 20 20 20 73 71 6c  pSorter;.    sql
5ef0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
5f00: 6f 72 74 65 72 2d 3e 70 53 74 6d 74 29 3b 0a 20  orter->pStmt);. 
5f10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5f20: 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  pSorter);.  }.. 
5f30: 20 69 66 28 20 70 43 73 72 2d 3e 65 50 6c 61 6e   if( pCsr->ePlan
5f40: 21 3d 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 55 52  !=FTS5_PLAN_SOUR
5f50: 43 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CE ){.    sqlite
5f60: 33 46 74 73 35 45 78 70 72 46 72 65 65 28 70 43  3Fts5ExprFree(pC
5f70: 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  sr->pExpr);.  }.
5f80: 0a 20 20 66 6f 72 28 70 44 61 74 61 3d 70 43 73  .  for(pData=pCs
5f90: 72 2d 3e 70 41 75 78 64 61 74 61 3b 20 70 44 61  r->pAuxdata; pDa
5fa0: 74 61 3b 20 70 44 61 74 61 3d 70 4e 65 78 74 29  ta; pData=pNext)
5fb0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 44  {.    pNext = pD
5fc0: 61 74 61 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ata->pNext;.    
5fd0: 69 66 28 20 70 44 61 74 61 2d 3e 78 44 65 6c 65  if( pData->xDele
5fe0: 74 65 20 29 20 70 44 61 74 61 2d 3e 78 44 65 6c  te ) pData->xDel
5ff0: 65 74 65 28 70 44 61 74 61 2d 3e 70 50 74 72 29  ete(pData->pPtr)
6000: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
6010: 65 65 28 70 44 61 74 61 29 3b 0a 20 20 7d 0a 0a  ee(pData);.  }..
6020: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6030: 7a 65 28 70 43 73 72 2d 3e 70 52 61 6e 6b 41 72  ze(pCsr->pRankAr
6040: 67 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65  gStmt);.  sqlite
6050: 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 70 52  3_free(pCsr->apR
6060: 61 6e 6b 41 72 67 29 3b 0a 0a 20 20 69 66 28 20  ankArg);..  if( 
6070: 43 73 72 46 6c 61 67 54 65 73 74 28 70 43 73 72  CsrFlagTest(pCsr
6080: 2c 20 46 54 53 35 43 53 52 5f 46 52 45 45 5f 5a  , FTS5CSR_FREE_Z
6090: 52 41 4e 4b 29 20 29 7b 0a 20 20 20 20 73 71 6c  RANK) ){.    sql
60a0: 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
60b0: 7a 52 61 6e 6b 29 3b 0a 20 20 20 20 73 71 6c 69  zRank);.    sqli
60c0: 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 7a  te3_free(pCsr->z
60d0: 52 61 6e 6b 41 72 67 73 29 3b 0a 20 20 7d 0a 0a  RankArgs);.  }..
60e0: 20 20 6d 65 6d 73 65 74 28 26 70 43 73 72 2d 3e    memset(&pCsr->
60f0: 65 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66  ePlan, 0, sizeof
6100: 28 46 74 73 35 43 75 72 73 6f 72 29 20 2d 20 28  (Fts5Cursor) - (
6110: 28 75 38 2a 29 26 70 43 73 72 2d 3e 65 50 6c 61  (u8*)&pCsr->ePla
6120: 6e 20 2d 20 28 75 38 2a 29 70 43 73 72 29 29 3b  n - (u8*)pCsr));
6130: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  .}.../*.** Close
6140: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 46 6f   the cursor.  Fo
6150: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
6160: 6f 72 6d 61 74 69 6f 6e 20 73 65 65 20 74 68 65  ormation see the
6170: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a   documentation.*
6180: 2a 20 6f 6e 20 74 68 65 20 78 43 6c 6f 73 65 20  * on the xClose 
6190: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
61a0: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 74 65  rtual table inte
61b0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
61c0: 20 69 6e 74 20 66 74 73 35 43 6c 6f 73 65 4d 65   int fts5CloseMe
61d0: 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
61e0: 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  b_cursor *pCurso
61f0: 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 73 6f  r){.  if( pCurso
6200: 72 20 29 7b 0a 20 20 20 20 46 74 73 35 54 61 62  r ){.    Fts5Tab
6210: 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
6220: 54 61 62 6c 65 2a 29 28 70 43 75 72 73 6f 72 2d  Table*)(pCursor-
6230: 3e 70 56 74 61 62 29 3b 0a 20 20 20 20 46 74 73  >pVtab);.    Fts
6240: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  5Cursor *pCsr = 
6250: 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 75  (Fts5Cursor*)pCu
6260: 72 73 6f 72 3b 0a 20 20 20 20 46 74 73 35 43 75  rsor;.    Fts5Cu
6270: 72 73 6f 72 20 2a 2a 70 70 3b 0a 0a 20 20 20 20  rsor **pp;..    
6280: 66 74 73 35 46 72 65 65 43 75 72 73 6f 72 43 6f  fts5FreeCursorCo
6290: 6d 70 6f 6e 65 6e 74 73 28 70 43 73 72 29 3b 0a  mponents(pCsr);.
62a0: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
62b0: 65 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 74 68  e cursor from th
62c0: 65 20 46 74 73 35 47 6c 6f 62 61 6c 2e 70 43 73  e Fts5Global.pCs
62d0: 72 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 66 6f  r list */.    fo
62e0: 72 28 70 70 3d 26 70 54 61 62 2d 3e 70 47 6c 6f  r(pp=&pTab->pGlo
62f0: 62 61 6c 2d 3e 70 43 73 72 3b 20 28 2a 70 70 29  bal->pCsr; (*pp)
6300: 21 3d 70 43 73 72 3b 20 70 70 3d 26 28 2a 70 70  !=pCsr; pp=&(*pp
6310: 29 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 2a  )->pNext);.    *
6320: 70 70 20 3d 20 70 43 73 72 2d 3e 70 4e 65 78 74  pp = pCsr->pNext
6330: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ;..    sqlite3_f
6340: 72 65 65 28 70 43 73 72 29 3b 0a 20 20 7d 0a 20  ree(pCsr);.  }. 
6350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6360: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
6370: 20 66 74 73 35 53 6f 72 74 65 72 4e 65 78 74 28   fts5SorterNext(
6380: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
6390: 29 7b 0a 20 20 46 74 73 35 53 6f 72 74 65 72 20  ){.  Fts5Sorter 
63a0: 2a 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d  *pSorter = pCsr-
63b0: 3e 70 53 6f 72 74 65 72 3b 0a 20 20 69 6e 74 20  >pSorter;.  int 
63c0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
63d0: 74 65 33 5f 73 74 65 70 28 70 53 6f 72 74 65 72  te3_step(pSorter
63e0: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  ->pStmt);.  if( 
63f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
6400: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
6410: 54 45 5f 4f 4b 3b 0a 20 20 20 20 43 73 72 46 6c  TE_OK;.    CsrFl
6420: 61 67 53 65 74 28 70 43 73 72 2c 20 46 54 53 35  agSet(pCsr, FTS5
6430: 43 53 52 5f 45 4f 46 29 3b 0a 20 20 7d 65 6c 73  CSR_EOF);.  }els
6440: 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
6450: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
6460: 74 20 75 38 20 2a 61 3b 0a 20 20 20 20 63 6f 6e  t u8 *a;.    con
6470: 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 0a 20 20  st u8 *aBlob;.  
6480: 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20 20    int nBlob;.   
6490: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
64a0: 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 72 63  iOff = 0;.    rc
64b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
64c0: 20 20 20 70 53 6f 72 74 65 72 2d 3e 69 52 6f 77     pSorter->iRow
64d0: 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
64e0: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 6f 72 74 65  umn_int64(pSorte
64f0: 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  r->pStmt, 0);.  
6500: 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    nBlob = sqlite
6510: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
6520: 53 6f 72 74 65 72 2d 3e 70 53 74 6d 74 2c 20 31  Sorter->pStmt, 1
6530: 29 3b 0a 20 20 20 20 61 42 6c 6f 62 20 3d 20 61  );.    aBlob = a
6540: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
6550: 6e 5f 62 6c 6f 62 28 70 53 6f 72 74 65 72 2d 3e  n_blob(pSorter->
6560: 70 53 74 6d 74 2c 20 31 29 3b 0a 0a 20 20 20 20  pStmt, 1);..    
6570: 2f 2a 20 6e 42 6c 6f 62 3d 3d 30 20 69 6e 20 64  /* nBlob==0 in d
6580: 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e  etail=none mode.
6590: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 6c 6f   */.    if( nBlo
65a0: 62 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  b>0 ){.      for
65b0: 28 69 3d 30 3b 20 69 3c 28 70 53 6f 72 74 65 72  (i=0; i<(pSorter
65c0: 2d 3e 6e 49 64 78 2d 31 29 3b 20 69 2b 2b 29 7b  ->nIdx-1); i++){
65d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61  .        int iVa
65e0: 6c 3b 0a 20 20 20 20 20 20 20 20 61 20 2b 3d 20  l;.        a += 
65f0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
6600: 61 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  a, iVal);.      
6610: 20 20 69 4f 66 66 20 2b 3d 20 69 56 61 6c 3b 0a    iOff += iVal;.
6620: 20 20 20 20 20 20 20 20 70 53 6f 72 74 65 72 2d          pSorter-
6630: 3e 61 49 64 78 5b 69 5d 20 3d 20 69 4f 66 66 3b  >aIdx[i] = iOff;
6640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
6650: 53 6f 72 74 65 72 2d 3e 61 49 64 78 5b 69 5d 20  Sorter->aIdx[i] 
6660: 3d 20 26 61 42 6c 6f 62 5b 6e 42 6c 6f 62 5d 20  = &aBlob[nBlob] 
6670: 2d 20 61 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  - a;.      pSort
6680: 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 61  er->aPoslist = a
6690: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
66a0: 35 43 73 72 4e 65 77 72 6f 77 28 70 43 73 72 29  5CsrNewrow(pCsr)
66b0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
66c0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  rc;.}.../*.** Se
66d0: 74 20 74 68 65 20 46 54 53 35 43 53 52 5f 52 45  t the FTS5CSR_RE
66e0: 51 55 49 52 45 5f 52 45 53 45 45 4b 20 66 6c 61  QUIRE_RESEEK fla
66f0: 67 20 6f 6e 20 61 6c 6c 20 46 54 53 35 5f 50 4c  g on all FTS5_PL
6700: 41 4e 5f 4d 41 54 43 48 20 63 75 72 73 6f 72 73  AN_MATCH cursors
6710: 20 0a 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 61 62   .** open on tab
6720: 6c 65 20 70 54 61 62 2e 0a 2a 2f 0a 73 74 61 74  le pTab..*/.stat
6730: 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69 70  ic void fts5Trip
6740: 43 75 72 73 6f 72 73 28 46 74 73 35 54 61 62 6c  Cursors(Fts5Tabl
6750: 65 20 2a 70 54 61 62 29 7b 0a 20 20 46 74 73 35  e *pTab){.  Fts5
6760: 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  Cursor *pCsr;.  
6770: 66 6f 72 28 70 43 73 72 3d 70 54 61 62 2d 3e 70  for(pCsr=pTab->p
6780: 47 6c 6f 62 61 6c 2d 3e 70 43 73 72 3b 20 70 43  Global->pCsr; pC
6790: 73 72 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e 70  sr; pCsr=pCsr->p
67a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
67b0: 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35  Csr->ePlan==FTS5
67c0: 5f 50 4c 41 4e 5f 4d 41 54 43 48 0a 20 20 20 20  _PLAN_MATCH.    
67d0: 20 26 26 20 70 43 73 72 2d 3e 62 61 73 65 2e 70   && pCsr->base.p
67e0: 56 74 61 62 3d 3d 28 73 71 6c 69 74 65 33 5f 76  Vtab==(sqlite3_v
67f0: 74 61 62 2a 29 70 54 61 62 20 0a 20 20 20 20 29  tab*)pTab .    )
6800: 7b 0a 20 20 20 20 20 20 43 73 72 46 6c 61 67 53  {.      CsrFlagS
6810: 65 74 28 70 43 73 72 2c 20 46 54 53 35 43 53 52  et(pCsr, FTS5CSR
6820: 5f 52 45 51 55 49 52 45 5f 52 45 53 45 45 4b 29  _REQUIRE_RESEEK)
6830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
6840: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 45 51 55  *.** If the REQU
6850: 49 52 45 5f 52 45 53 45 45 4b 20 66 6c 61 67 20  IRE_RESEEK flag 
6860: 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 63 75  is set on the cu
6870: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
6880: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
6890: 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 64 20  ment, close and 
68a0: 72 65 6f 70 65 6e 20 61 6c 6c 20 46 74 73 35 49  reopen all Fts5I
68b0: 6e 64 65 78 49 74 65 72 20 69 74 65 72 61 74 6f  ndexIter iterato
68c0: 72 73 20 74 68 61 74 20 74 68 65 20 63 75 72 73  rs that the curs
68d0: 6f 72 20 0a 2a 2a 20 69 73 20 75 73 69 6e 67 2e  or .** is using.
68e0: 20 54 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   Then attempt to
68f0: 20 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   move the cursor
6900: 20 74 6f 20 61 20 72 6f 77 69 64 20 65 71 75 61   to a rowid equa
6910: 6c 20 74 6f 20 6f 72 20 6c 61 73 74 65 72 0a 2a  l to or laster.*
6920: 2a 20 28 69 6e 20 74 68 65 20 63 75 72 73 6f 72  * (in the cursor
6930: 73 20 73 6f 72 74 20 6f 72 64 65 72 20 2d 20 41  s sort order - A
6940: 53 43 20 6f 72 20 44 45 53 43 29 20 74 68 61 6e  SC or DESC) than
6950: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
6960: 69 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  id. .**.** If th
6970: 65 20 6e 65 77 20 72 6f 77 69 64 20 69 73 20 6e  e new rowid is n
6980: 6f 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ot equal to the 
6990: 6f 6c 64 2c 20 73 65 74 20 6f 75 74 70 75 74 20  old, set output 
69a0: 70 61 72 61 6d 65 74 65 72 20 2a 70 62 53 6b 69  parameter *pbSki
69b0: 70 0a 2a 2a 20 74 6f 20 31 20 62 65 66 6f 72 65  p.** to 1 before
69c0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65   returning. Othe
69d0: 72 77 69 73 65 2c 20 6c 65 61 76 65 20 69 74 20  rwise, leave it 
69e0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
69f0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
6a00: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  K if successful 
6a10: 6f 72 20 69 66 20 6e 6f 20 72 65 73 65 65 6b 20  or if no reseek 
6a20: 77 61 73 20 72 65 71 75 69 72 65 64 2c 20 6f 72  was required, or
6a30: 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   an .** error co
6a40: 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  de if an error o
6a50: 63 63 75 72 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  ccurred..*/.stat
6a60: 69 63 20 69 6e 74 20 66 74 73 35 43 75 72 73 6f  ic int fts5Curso
6a70: 72 52 65 73 65 65 6b 28 46 74 73 35 43 75 72 73  rReseek(Fts5Curs
6a80: 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a 70  or *pCsr, int *p
6a90: 62 53 6b 69 70 29 7b 0a 20 20 69 6e 74 20 72 63  bSkip){.  int rc
6aa0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6ab0: 61 73 73 65 72 74 28 20 2a 70 62 53 6b 69 70 3d  assert( *pbSkip=
6ac0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 73 72 46  =0 );.  if( CsrF
6ad0: 6c 61 67 54 65 73 74 28 70 43 73 72 2c 20 46 54  lagTest(pCsr, FT
6ae0: 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f 52 45  S5CSR_REQUIRE_RE
6af0: 53 45 45 4b 29 20 29 7b 0a 20 20 20 20 46 74 73  SEEK) ){.    Fts
6b00: 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  5Table *pTab = (
6b10: 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72  Fts5Table*)(pCsr
6b20: 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a 20  ->base.pVtab);. 
6b30: 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20 70     int bDesc = p
6b40: 43 73 72 2d 3e 62 44 65 73 63 3b 0a 20 20 20 20  Csr->bDesc;.    
6b50: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  i64 iRowid = sql
6b60: 69 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69  ite3Fts5ExprRowi
6b70: 64 28 70 43 73 72 2d 3e 70 45 78 70 72 29 3b 0a  d(pCsr->pExpr);.
6b80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6b90: 33 46 74 73 35 45 78 70 72 46 69 72 73 74 28 70  3Fts5ExprFirst(p
6ba0: 43 73 72 2d 3e 70 45 78 70 72 2c 20 70 54 61 62  Csr->pExpr, pTab
6bb0: 2d 3e 70 49 6e 64 65 78 2c 20 69 52 6f 77 69 64  ->pIndex, iRowid
6bc0: 2c 20 62 44 65 73 63 29 3b 0a 20 20 20 20 69 66  , bDesc);.    if
6bd0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6be0: 26 26 20 20 69 52 6f 77 69 64 21 3d 73 71 6c 69  &&  iRowid!=sqli
6bf0: 74 65 33 46 74 73 35 45 78 70 72 52 6f 77 69 64  te3Fts5ExprRowid
6c00: 28 70 43 73 72 2d 3e 70 45 78 70 72 29 20 29 7b  (pCsr->pExpr) ){
6c10: 0a 20 20 20 20 20 20 2a 70 62 53 6b 69 70 20 3d  .      *pbSkip =
6c20: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 43   1;.    }..    C
6c30: 73 72 46 6c 61 67 43 6c 65 61 72 28 70 43 73 72  srFlagClear(pCsr
6c40: 2c 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52  , FTS5CSR_REQUIR
6c50: 45 5f 52 45 53 45 45 4b 29 3b 0a 20 20 20 20 66  E_RESEEK);.    f
6c60: 74 73 35 43 73 72 4e 65 77 72 6f 77 28 70 43 73  ts5CsrNewrow(pCs
6c70: 72 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  r);.    if( sqli
6c80: 74 65 33 46 74 73 35 45 78 70 72 45 6f 66 28 70  te3Fts5ExprEof(p
6c90: 43 73 72 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20  Csr->pExpr) ){. 
6ca0: 20 20 20 20 20 43 73 72 46 6c 61 67 53 65 74 28       CsrFlagSet(
6cb0: 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 45 4f  pCsr, FTS5CSR_EO
6cc0: 46 29 3b 0a 20 20 20 20 20 20 2a 70 62 53 6b 69  F);.      *pbSki
6cd0: 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  p = 1;.    }.  }
6ce0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6cf0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
6d00: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6d10: 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
6d20: 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
6d30: 63 68 65 73 20 74 68 65 20 0a 2a 2a 20 73 65 61  ches the .** sea
6d40: 72 63 68 20 63 72 69 74 65 72 69 61 2e 0a 2a 2a  rch criteria..**
6d50: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
6d60: 45 5f 4f 4b 20 69 66 20 6e 6f 74 68 69 6e 67 20  E_OK if nothing 
6d70: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 53 51 4c  goes wrong.  SQL
6d80: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6d90: 65 64 0a 2a 2a 20 65 76 65 6e 20 69 66 20 77 65  ed.** even if we
6da0: 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69   reach end-of-fi
6db0: 6c 65 2e 20 20 54 68 65 20 66 74 73 35 45 6f 66  le.  The fts5Eof
6dc0: 4d 65 74 68 6f 64 28 29 20 77 69 6c 6c 20 62 65  Method() will be
6dd0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 73 75 62 73 65   called.** subse
6de0: 71 75 65 6e 74 6c 79 20 74 6f 20 64 65 74 65 72  quently to deter
6df0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
6e00: 6e 6f 74 20 61 6e 20 45 4f 46 20 77 61 73 20 68  not an EOF was h
6e10: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
6e20: 74 20 66 74 73 35 4e 65 78 74 4d 65 74 68 6f 64  t fts5NextMethod
6e30: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
6e40: 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a  rsor *pCursor){.
6e50: 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43    Fts5Cursor *pC
6e60: 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72  sr = (Fts5Cursor
6e70: 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  *)pCursor;.  int
6e80: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6e90: 28 70 43 73 72 2d 3e 65 50 6c 61 6e 3c 33 29 3d  (pCsr->ePlan<3)=
6ea0: 3d 0a 20 20 20 20 20 20 20 20 20 20 28 70 43 73  =.          (pCs
6eb0: 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50  r->ePlan==FTS5_P
6ec0: 4c 41 4e 5f 4d 41 54 43 48 20 7c 7c 20 70 43 73  LAN_MATCH || pCs
6ed0: 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50  r->ePlan==FTS5_P
6ee0: 4c 41 4e 5f 53 4f 55 52 43 45 29 20 0a 20 20 29  LAN_SOURCE) .  )
6ef0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 43 73 72  ;.  assert( !Csr
6f00: 46 6c 61 67 54 65 73 74 28 70 43 73 72 2c 20 46  FlagTest(pCsr, F
6f10: 54 53 35 43 53 52 5f 45 4f 46 29 20 29 3b 0a 0a  TS5CSR_EOF) );..
6f20: 20 20 69 66 28 20 70 43 73 72 2d 3e 65 50 6c 61    if( pCsr->ePla
6f30: 6e 3c 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  n<3 ){.    int b
6f40: 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 69 66  Skip = 0;.    if
6f50: 28 20 28 72 63 20 3d 20 66 74 73 35 43 75 72 73  ( (rc = fts5Curs
6f60: 6f 72 52 65 73 65 65 6b 28 70 43 73 72 2c 20 26  orReseek(pCsr, &
6f70: 62 53 6b 69 70 29 29 20 7c 7c 20 62 53 6b 69 70  bSkip)) || bSkip
6f80: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
6f90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
6fa0: 73 35 45 78 70 72 4e 65 78 74 28 70 43 73 72 2d  s5ExprNext(pCsr-
6fb0: 3e 70 45 78 70 72 2c 20 70 43 73 72 2d 3e 69 4c  >pExpr, pCsr->iL
6fc0: 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 43  astRowid);.    C
6fd0: 73 72 46 6c 61 67 53 65 74 28 70 43 73 72 2c 20  srFlagSet(pCsr, 
6fe0: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 45  sqlite3Fts5ExprE
6ff0: 6f 66 28 70 43 73 72 2d 3e 70 45 78 70 72 29 29  of(pCsr->pExpr))
7000: 3b 0a 20 20 20 20 66 74 73 35 43 73 72 4e 65 77  ;.    fts5CsrNew
7010: 72 6f 77 28 70 43 73 72 29 3b 0a 20 20 7d 65 6c  row(pCsr);.  }el
7020: 73 65 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  se{.    switch( 
7030: 70 43 73 72 2d 3e 65 50 6c 61 6e 20 29 7b 0a 20  pCsr->ePlan ){. 
7040: 20 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 50       case FTS5_P
7050: 4c 41 4e 5f 53 50 45 43 49 41 4c 3a 20 7b 0a 20  LAN_SPECIAL: {. 
7060: 20 20 20 20 20 20 20 43 73 72 46 6c 61 67 53 65         CsrFlagSe
7070: 74 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f  t(pCsr, FTS5CSR_
7080: 45 4f 46 29 3b 0a 20 20 20 20 20 20 20 20 72 63  EOF);.        rc
7090: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
70a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
70b0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 63 61     }.  .      ca
70c0: 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 52  se FTS5_PLAN_SOR
70d0: 54 45 44 5f 4d 41 54 43 48 3a 20 7b 0a 20 20 20  TED_MATCH: {.   
70e0: 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 53 6f       rc = fts5So
70f0: 72 74 65 72 4e 65 78 74 28 70 43 73 72 29 3b 0a  rterNext(pCsr);.
7100: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7110: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
7120: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
7130: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
7140: 65 70 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b  ep(pCsr->pStmt);
7150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
7160: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
7170: 20 20 20 20 20 20 20 20 20 43 73 72 46 6c 61 67           CsrFlag
7180: 53 65 74 28 70 43 73 72 2c 20 46 54 53 35 43 53  Set(pCsr, FTS5CS
7190: 52 5f 45 4f 46 29 3b 0a 20 20 20 20 20 20 20 20  R_EOF);.        
71a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
71b0: 65 73 65 74 28 70 43 73 72 2d 3e 70 53 74 6d 74  eset(pCsr->pStmt
71c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
71d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
71e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
71f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
7200: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
7210: 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
7220: 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  ...static int ft
7230: 73 35 50 72 65 70 61 72 65 53 74 61 74 65 6d 65  s5PrepareStateme
7240: 6e 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  nt(.  sqlite3_st
7250: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 46  mt **ppStmt,.  F
7260: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
7270: 69 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  ig, .  const cha
7280: 72 20 2a 7a 46 6d 74 2c 0a 20 20 2e 2e 2e 0a 29  r *zFmt,.  ....)
7290: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
72a0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *pRet = 0;.  in
72b0: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t rc;.  char *zS
72c0: 71 6c 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  ql;.  va_list ap
72d0: 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  ;..  va_start(ap
72e0: 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c 20  , zFmt);.  zSql 
72f0: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
7300: 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
7310: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
7320: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7330: 4f 4d 45 4d 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a  OMEM; .  }else{.
7340: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7350: 5f 70 72 65 70 61 72 65 5f 76 33 28 70 43 6f 6e  _prepare_v3(pCon
7360: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
7370: 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  1, .            
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7390: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50  SQLITE_PREPARE_P
73a0: 45 52 53 49 53 54 45 4e 54 2c 20 26 70 52 65 74  ERSISTENT, &pRet
73b0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
73c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
73d0: 20 20 20 20 20 2a 70 43 6f 6e 66 69 67 2d 3e 70       *pConfig->p
73e0: 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
73f0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
7400: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
7410: 43 6f 6e 66 69 67 2d 3e 64 62 29 29 3b 0a 20 20  Config->db));.  
7420: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
7430: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
7440: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
7450: 20 2a 70 70 53 74 6d 74 20 3d 20 70 52 65 74 3b   *ppStmt = pRet;
7460: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 20  .  return rc;.} 
7470: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
7480: 35 43 75 72 73 6f 72 46 69 72 73 74 53 6f 72 74  5CursorFirstSort
7490: 65 64 28 46 74 73 35 54 61 62 6c 65 20 2a 70 54  ed(Fts5Table *pT
74a0: 61 62 2c 20 46 74 73 35 43 75 72 73 6f 72 20 2a  ab, Fts5Cursor *
74b0: 70 43 73 72 2c 20 69 6e 74 20 62 44 65 73 63 29  pCsr, int bDesc)
74c0: 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
74d0: 70 43 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d 3e  pConfig = pTab->
74e0: 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 53  pConfig;.  Fts5S
74f0: 6f 72 74 65 72 20 2a 70 53 6f 72 74 65 72 3b 0a  orter *pSorter;.
7500: 20 20 69 6e 74 20 6e 50 68 72 61 73 65 3b 0a 20    int nPhrase;. 
7510: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
7520: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
7530: 61 72 20 2a 7a 52 61 6e 6b 20 3d 20 70 43 73 72  ar *zRank = pCsr
7540: 2d 3e 7a 52 61 6e 6b 3b 0a 20 20 63 6f 6e 73 74  ->zRank;.  const
7550: 20 63 68 61 72 20 2a 7a 52 61 6e 6b 41 72 67 73   char *zRankArgs
7560: 20 3d 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 41 72   = pCsr->zRankAr
7570: 67 73 3b 0a 20 20 0a 20 20 6e 50 68 72 61 73 65  gs;.  .  nPhrase
7580: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78   = sqlite3Fts5Ex
7590: 70 72 50 68 72 61 73 65 43 6f 75 6e 74 28 70 43  prPhraseCount(pC
75a0: 73 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20 6e 42  sr->pExpr);.  nB
75b0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
75c0: 35 53 6f 72 74 65 72 29 20 2b 20 73 69 7a 65 6f  5Sorter) + sizeo
75d0: 66 28 69 6e 74 29 20 2a 20 28 6e 50 68 72 61 73  f(int) * (nPhras
75e0: 65 2d 31 29 3b 0a 20 20 70 53 6f 72 74 65 72 20  e-1);.  pSorter 
75f0: 3d 20 28 46 74 73 35 53 6f 72 74 65 72 2a 29 73  = (Fts5Sorter*)s
7600: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
7610: 79 74 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72  yte);.  if( pSor
7620: 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
7630: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7640: 6d 65 6d 73 65 74 28 70 53 6f 72 74 65 72 2c 20  memset(pSorter, 
7650: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 53 6f  0, nByte);.  pSo
7660: 72 74 65 72 2d 3e 6e 49 64 78 20 3d 20 6e 50 68  rter->nIdx = nPh
7670: 72 61 73 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f  rase;..  /* TODO
7680: 3a 20 49 74 20 77 6f 75 6c 64 20 62 65 20 62 65  : It would be be
7690: 74 74 65 72 20 74 6f 20 68 61 76 65 20 73 6f 6d  tter to have som
76a0: 65 20 73 79 73 74 65 6d 20 66 6f 72 20 72 65 75  e system for reu
76b0: 73 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 0a 20  sing statement. 
76c0: 20 2a 2a 20 68 61 6e 64 6c 65 73 20 68 65 72 65   ** handles here
76d0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72  , rather than pr
76e0: 65 70 61 72 69 6e 67 20 61 20 6e 65 77 20 6f 6e  eparing a new on
76f0: 65 20 66 6f 72 20 65 61 63 68 20 71 75 65 72 79  e for each query
7700: 2e 20 42 75 74 20 74 68 61 74 0a 20 20 2a 2a 20  . But that.  ** 
7710: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
7720: 61 73 20 53 51 4c 69 74 65 20 72 65 66 65 72 65  as SQLite refere
7730: 6e 63 65 20 63 6f 75 6e 74 73 20 74 68 65 20 76  nce counts the v
7740: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a  irtual table obj
7750: 65 63 74 73 2e 0a 20 20 2a 2a 20 41 6e 64 20 73  ects..  ** And s
7760: 69 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d 65  ince the stateme
7770: 6e 74 20 72 65 71 75 69 72 65 64 20 68 65 72 65  nt required here
7780: 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 69 73   reads from this
7790: 20 76 65 72 79 20 76 69 72 74 75 61 6c 20 0a 20   very virtual . 
77a0: 20 2a 2a 20 74 61 62 6c 65 2c 20 73 61 76 69 6e   ** table, savin
77b0: 67 20 69 74 20 63 72 65 61 74 65 73 20 61 20 63  g it creates a c
77c0: 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
77d0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
77e0: 53 51 4c 69 74 65 20 61 20 62 75 69 6c 74 2d 69  SQLite a built-i
77f0: 6e 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  n statement cach
7800: 65 2c 20 74 68 69 73 20 77 6f 75 6c 64 6e 27 74  e, this wouldn't
7810: 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 20 2a   be a problem. *
7820: 2f 0a 20 20 72 63 20 3d 20 66 74 73 35 50 72 65  /.  rc = fts5Pre
7830: 70 61 72 65 53 74 61 74 65 6d 65 6e 74 28 26 70  pareStatement(&p
7840: 53 6f 72 74 65 72 2d 3e 70 53 74 6d 74 2c 20 70  Sorter->pStmt, p
7850: 43 6f 6e 66 69 67 2c 0a 20 20 20 20 20 20 22 53  Config,.      "S
7860: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 72 61 6e  ELECT rowid, ran
7870: 6b 20 46 52 4f 4d 20 25 51 2e 25 51 20 4f 52 44  k FROM %Q.%Q ORD
7880: 45 52 20 42 59 20 25 73 28 25 73 25 73 25 73 29  ER BY %s(%s%s%s)
7890: 20 25 73 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e   %s",.      pCon
78a0: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
78b0: 67 2d 3e 7a 4e 61 6d 65 2c 20 7a 52 61 6e 6b 2c  g->zName, zRank,
78c0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c   pConfig->zName,
78d0: 0a 20 20 20 20 20 20 28 7a 52 61 6e 6b 41 72 67  .      (zRankArg
78e0: 73 20 3f 20 22 2c 20 22 20 3a 20 22 22 29 2c 0a  s ? ", " : ""),.
78f0: 20 20 20 20 20 20 28 7a 52 61 6e 6b 41 72 67 73        (zRankArgs
7900: 20 3f 20 7a 52 61 6e 6b 41 72 67 73 20 3a 20 22   ? zRankArgs : "
7910: 22 29 2c 0a 20 20 20 20 20 20 62 44 65 73 63 20  "),.      bDesc 
7920: 3f 20 22 44 45 53 43 22 20 3a 20 22 41 53 43 22  ? "DESC" : "ASC"
7930: 0a 20 20 29 3b 0a 0a 20 20 70 43 73 72 2d 3e 70  .  );..  pCsr->p
7940: 53 6f 72 74 65 72 20 3d 20 70 53 6f 72 74 65 72  Sorter = pSorter
7950: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
7960: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
7970: 65 72 74 28 20 70 54 61 62 2d 3e 70 53 6f 72 74  ert( pTab->pSort
7980: 43 73 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  Csr==0 );.    pT
7990: 61 62 2d 3e 70 53 6f 72 74 43 73 72 20 3d 20 70  ab->pSortCsr = p
79a0: 43 73 72 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  Csr;.    rc = ft
79b0: 73 35 53 6f 72 74 65 72 4e 65 78 74 28 70 43 73  s5SorterNext(pCs
79c0: 72 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 53  r);.    pTab->pS
79d0: 6f 72 74 43 73 72 20 3d 20 30 3b 0a 20 20 7d 0a  ortCsr = 0;.  }.
79e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
79f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
7a00: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 6f  te3_finalize(pSo
7a10: 72 74 65 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  rter->pStmt);.  
7a20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7a30: 53 6f 72 74 65 72 29 3b 0a 20 20 20 20 70 43 73  Sorter);.    pCs
7a40: 72 2d 3e 70 53 6f 72 74 65 72 20 3d 20 30 3b 0a  r->pSorter = 0;.
7a50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
7a60: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
7a70: 66 74 73 35 43 75 72 73 6f 72 46 69 72 73 74 28  fts5CursorFirst(
7a80: 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 2c  Fts5Table *pTab,
7a90: 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73   Fts5Cursor *pCs
7aa0: 72 2c 20 69 6e 74 20 62 44 65 73 63 29 7b 0a 20  r, int bDesc){. 
7ab0: 20 69 6e 74 20 72 63 3b 0a 20 20 46 74 73 35 45   int rc;.  Fts5E
7ac0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 73  xpr *pExpr = pCs
7ad0: 72 2d 3e 70 45 78 70 72 3b 0a 20 20 72 63 20 3d  r->pExpr;.  rc =
7ae0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
7af0: 46 69 72 73 74 28 70 45 78 70 72 2c 20 70 54 61  First(pExpr, pTa
7b00: 62 2d 3e 70 49 6e 64 65 78 2c 20 70 43 73 72 2d  b->pIndex, pCsr-
7b10: 3e 69 46 69 72 73 74 52 6f 77 69 64 2c 20 62 44  >iFirstRowid, bD
7b20: 65 73 63 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  esc);.  if( sqli
7b30: 74 65 33 46 74 73 35 45 78 70 72 45 6f 66 28 70  te3Fts5ExprEof(p
7b40: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 43 73 72  Expr) ){.    Csr
7b50: 46 6c 61 67 53 65 74 28 70 43 73 72 2c 20 46 54  FlagSet(pCsr, FT
7b60: 53 35 43 53 52 5f 45 4f 46 29 3b 0a 20 20 7d 0a  S5CSR_EOF);.  }.
7b70: 20 20 66 74 73 35 43 73 72 4e 65 77 72 6f 77 28    fts5CsrNewrow(
7b80: 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCsr);.  return 
7b90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  rc;.}../*.** Pro
7ba0: 63 65 73 73 20 61 20 22 73 70 65 63 69 61 6c 22  cess a "special"
7bb0: 20 71 75 65 72 79 2e 20 41 20 73 70 65 63 69 61   query. A specia
7bc0: 6c 20 71 75 65 72 79 20 69 73 20 69 64 65 6e 74  l query is ident
7bd0: 69 66 69 65 64 20 61 73 20 6f 6e 65 20 77 69 74  ified as one wit
7be0: 68 20 61 0a 2a 2a 20 4d 41 54 43 48 20 65 78 70  h a.** MATCH exp
7bf0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 62 65 67  ression that beg
7c00: 69 6e 73 20 77 69 74 68 20 61 20 27 2a 27 20 63  ins with a '*' c
7c10: 68 61 72 61 63 74 65 72 2e 20 54 68 65 20 72 65  haracter. The re
7c20: 6d 61 69 6e 64 65 72 20 6f 66 0a 2a 2a 20 74 68  mainder of.** th
7c30: 65 20 74 65 78 74 20 70 61 73 73 65 64 20 74 6f  e text passed to
7c40: 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61   the MATCH opera
7c50: 74 6f 72 20 61 72 65 20 75 73 65 64 20 61 73 20  tor are used as 
7c60: 20 74 68 65 20 73 70 65 63 69 61 6c 20 71 75 65   the special que
7c70: 72 79 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ry.** parameters
7c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7c90: 66 74 73 35 53 70 65 63 69 61 6c 4d 61 74 63 68  fts5SpecialMatch
7ca0: 28 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70  (.  Fts5Table *p
7cb0: 54 61 62 2c 20 0a 20 20 46 74 73 35 43 75 72 73  Tab, .  Fts5Curs
7cc0: 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 63 6f 6e  or *pCsr, .  con
7cd0: 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 0a  st char *zQuery.
7ce0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
7cf0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
7d00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7d10: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
7d20: 68 61 72 20 2a 7a 20 3d 20 7a 51 75 65 72 79 3b  har *z = zQuery;
7d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 65 63           /* Spec
7d40: 69 61 6c 20 71 75 65 72 79 20 74 65 78 74 20 2a  ial query text *
7d50: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d80: 20 62 79 74 65 73 20 69 6e 20 74 65 78 74 20 61   bytes in text a
7d90: 74 20 7a 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28  t z */..  while(
7da0: 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b   z[0]==' ' ) z++
7db0: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e  ;.  for(n=0; z[n
7dc0: 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27 20 27 3b 20  ] && z[n]!=' '; 
7dd0: 6e 2b 2b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  n++);..  assert(
7de0: 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72   pTab->base.zErr
7df0: 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 70 43 73 72  Msg==0 );.  pCsr
7e00: 2d 3e 65 50 6c 61 6e 20 3d 20 46 54 53 35 5f 50  ->ePlan = FTS5_P
7e10: 4c 41 4e 5f 53 50 45 43 49 41 4c 3b 0a 0a 20 20  LAN_SPECIAL;..  
7e20: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
7e30: 74 72 6e 69 63 6d 70 28 22 72 65 61 64 73 22 2c  trnicmp("reads",
7e40: 20 7a 2c 20 6e 29 20 29 7b 0a 20 20 20 20 70 43   z, n) ){.    pC
7e50: 73 72 2d 3e 69 53 70 65 63 69 61 6c 20 3d 20 73  sr->iSpecial = s
7e60: 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
7e70: 65 61 64 73 28 70 54 61 62 2d 3e 70 49 6e 64 65  eads(pTab->pInde
7e80: 78 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69  x);.  }.  else i
7e90: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
7ea0: 72 6e 69 63 6d 70 28 22 69 64 22 2c 20 7a 2c 20  rnicmp("id", z, 
7eb0: 6e 29 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e  n) ){.    pCsr->
7ec0: 69 53 70 65 63 69 61 6c 20 3d 20 70 43 73 72 2d  iSpecial = pCsr-
7ed0: 3e 69 43 73 72 49 64 3b 0a 20 20 7d 0a 20 20 65  >iCsrId;.  }.  e
7ee0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 75  lse{.    /* An u
7ef0: 6e 72 65 63 6f 67 6e 69 7a 65 64 20 64 69 72 65  nrecognized dire
7f00: 63 74 69 76 65 2e 20 52 65 74 75 72 6e 20 61 6e  ctive. Return an
7f10: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
7f20: 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 62 61 73  */.    pTab->bas
7f30: 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  e.zErrMsg = sqli
7f40: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 6b  te3_mprintf("unk
7f50: 6e 6f 77 6e 20 73 70 65 63 69 61 6c 20 71 75 65  nown special que
7f60: 72 79 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20 7a 29  ry: %.*s", n, z)
7f70: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
7f80: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
7f90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7fa0: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
7fb0: 6e 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  n auxiliary func
7fc0: 74 69 6f 6e 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  tion named zName
7fd0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
7fe0: 64 20 77 69 74 68 20 74 61 62 6c 65 0a 2a 2a 20  d with table.** 
7ff0: 70 54 61 62 2e 20 49 66 20 6f 6e 65 20 69 73 20  pTab. If one is 
8000: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
8010: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
8020: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 46 74 73  orresponding Fts
8030: 35 41 75 78 69 6c 69 61 72 79 0a 2a 2a 20 73 74  5Auxiliary.** st
8040: 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69  ructure. Otherwi
8050: 73 65 2c 20 69 66 20 6e 6f 20 73 75 63 68 20 66  se, if no such f
8060: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2c 20  unction exists, 
8070: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
8080: 73 74 61 74 69 63 20 46 74 73 35 41 75 78 69 6c  static Fts5Auxil
8090: 69 61 72 79 20 2a 66 74 73 35 46 69 6e 64 41 75  iary *fts5FindAu
80a0: 78 69 6c 69 61 72 79 28 46 74 73 35 54 61 62 6c  xiliary(Fts5Tabl
80b0: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
80c0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 46  har *zName){.  F
80d0: 74 73 35 41 75 78 69 6c 69 61 72 79 20 2a 70 41  ts5Auxiliary *pA
80e0: 75 78 3b 0a 0a 20 20 66 6f 72 28 70 41 75 78 3d  ux;..  for(pAux=
80f0: 70 54 61 62 2d 3e 70 47 6c 6f 62 61 6c 2d 3e 70  pTab->pGlobal->p
8100: 41 75 78 3b 20 70 41 75 78 3b 20 70 41 75 78 3d  Aux; pAux; pAux=
8110: 70 41 75 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pAux->pNext){.  
8120: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8130: 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 70 41 75  ricmp(zName, pAu
8140: 78 2d 3e 7a 46 75 6e 63 29 3d 3d 30 20 29 20 72  x->zFunc)==0 ) r
8150: 65 74 75 72 6e 20 70 41 75 78 3b 0a 20 20 7d 0a  eturn pAux;.  }.
8160: 0a 20 20 2f 2a 20 4e 6f 20 66 75 6e 63 74 69 6f  .  /* No functio
8170: 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  n of the specifi
8180: 65 64 20 6e 61 6d 65 20 77 61 73 20 66 6f 75 6e  ed name was foun
8190: 64 2e 20 52 65 74 75 72 6e 20 30 2e 20 2a 2f 0a  d. Return 0. */.
81a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
81b0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 46  static int fts5F
81c0: 69 6e 64 52 61 6e 6b 46 75 6e 63 74 69 6f 6e 28  indRankFunction(
81d0: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
81e0: 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a  ){.  Fts5Table *
81f0: 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c  pTab = (Fts5Tabl
8200: 65 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e 70  e*)(pCsr->base.p
8210: 56 74 61 62 29 3b 0a 20 20 46 74 73 35 43 6f 6e  Vtab);.  Fts5Con
8220: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
8230: 54 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  Tab->pConfig;.  
8240: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8250: 4f 4b 3b 0a 20 20 46 74 73 35 41 75 78 69 6c 69  OK;.  Fts5Auxili
8260: 61 72 79 20 2a 70 41 75 78 20 3d 20 30 3b 0a 20  ary *pAux = 0;. 
8270: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 61   const char *zRa
8280: 6e 6b 20 3d 20 70 43 73 72 2d 3e 7a 52 61 6e 6b  nk = pCsr->zRank
8290: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
82a0: 7a 52 61 6e 6b 41 72 67 73 20 3d 20 70 43 73 72  zRankArgs = pCsr
82b0: 2d 3e 7a 52 61 6e 6b 41 72 67 73 3b 0a 0a 20 20  ->zRankArgs;..  
82c0: 69 66 28 20 7a 52 61 6e 6b 41 72 67 73 20 29 7b  if( zRankArgs ){
82d0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
82e0: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72  = sqlite3Fts5Mpr
82f0: 69 6e 74 66 28 26 72 63 2c 20 22 53 45 4c 45 43  intf(&rc, "SELEC
8300: 54 20 25 73 22 2c 20 7a 52 61 6e 6b 41 72 67 73  T %s", zRankArgs
8310: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20  );.    if( zSql 
8320: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8330: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
8340: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
8350: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28  ite3_prepare_v3(
8360: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
8370: 6c 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  l, -1,.         
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45 50       SQLITE_PREP
83a0: 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54 2c 20  ARE_PERSISTENT, 
83b0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
83c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
83d0: 53 71 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Sql);.      asse
83e0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
83f0: 4b 20 7c 7c 20 70 43 73 72 2d 3e 70 52 61 6e 6b  K || pCsr->pRank
8400: 41 72 67 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ArgStmt==0 );.  
8410: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8420: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
8430: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
8440: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
8450: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
8460: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
8470: 20 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 52 61         pCsr->nRa
8480: 6e 6b 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  nkArg = sqlite3_
8490: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
84a0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  mt);.          n
84b0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 73 71  Byte = sizeof(sq
84c0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 2a 70 43  lite3_value*)*pC
84d0: 73 72 2d 3e 6e 52 61 6e 6b 41 72 67 3b 0a 20 20  sr->nRankArg;.  
84e0: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 70          pCsr->ap
84f0: 52 61 6e 6b 41 72 67 20 3d 20 28 73 71 6c 69 74  RankArg = (sqlit
8500: 65 33 5f 76 61 6c 75 65 2a 2a 29 73 71 6c 69 74  e3_value**)sqlit
8510: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
8520: 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  (&rc, nByte);.  
8530: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
8540: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8550: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
8560: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
8570: 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 52 61  i=0; i<pCsr->nRa
8580: 6e 6b 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nkArg; i++){.   
8590: 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d             pCsr-
85a0: 3e 61 70 52 61 6e 6b 41 72 67 5b 69 5d 20 3d 20  >apRankArg[i] = 
85b0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
85c0: 61 6c 75 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  alue(pStmt, i);.
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
85e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
85f0: 20 20 20 20 70 43 73 72 2d 3e 70 52 61 6e 6b 41      pCsr->pRankA
8600: 72 67 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  rgStmt = pStmt;.
8610: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8620: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
8630: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
8640: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
8650: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
8660: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
8670: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8680: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
8690: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
86a0: 20 20 70 41 75 78 20 3d 20 66 74 73 35 46 69 6e    pAux = fts5Fin
86b0: 64 41 75 78 69 6c 69 61 72 79 28 70 54 61 62 2c  dAuxiliary(pTab,
86c0: 20 7a 52 61 6e 6b 29 3b 0a 20 20 20 20 69 66 28   zRank);.    if(
86d0: 20 70 41 75 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pAux==0 ){.    
86e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
86f0: 62 61 73 65 2e 7a 45 72 72 4d 73 67 3d 3d 30 20  base.zErrMsg==0 
8700: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 62  );.      pTab->b
8710: 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ase.zErrMsg = sq
8720: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
8730: 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a  o such function:
8740: 20 25 73 22 2c 20 7a 52 61 6e 6b 29 3b 0a 20 20   %s", zRank);.  
8750: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8760: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
8770: 0a 0a 20 20 70 43 73 72 2d 3e 70 52 61 6e 6b 20  ..  pCsr->pRank 
8780: 3d 20 70 41 75 78 3b 0a 20 20 72 65 74 75 72 6e  = pAux;.  return
8790: 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20   rc;.}...static 
87a0: 69 6e 74 20 66 74 73 35 43 75 72 73 6f 72 50 61  int fts5CursorPa
87b0: 72 73 65 52 61 6e 6b 28 0a 20 20 46 74 73 35 43  rseRank(.  Fts5C
87c0: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 0a  onfig *pConfig,.
87d0: 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43    Fts5Cursor *pC
87e0: 73 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  sr, .  sqlite3_v
87f0: 61 6c 75 65 20 2a 70 52 61 6e 6b 0a 29 7b 0a 20  alue *pRank.){. 
8800: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8810: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52 61 6e 6b  _OK;.  if( pRank
8820: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
8830: 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63  ar *z = (const c
8840: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
8850: 75 65 5f 74 65 78 74 28 70 52 61 6e 6b 29 3b 0a  ue_text(pRank);.
8860: 20 20 20 20 63 68 61 72 20 2a 7a 52 61 6e 6b 20      char *zRank 
8870: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
8880: 52 61 6e 6b 41 72 67 73 20 3d 20 30 3b 0a 0a 20  RankArgs = 0;.. 
8890: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
88a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
88b0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 52 61 6e  _value_type(pRan
88c0: 6b 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  k)==SQLITE_NULL 
88d0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ) rc = SQLITE_ER
88e0: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
88f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8900: 65 33 46 74 73 35 43 6f 6e 66 69 67 50 61 72 73  e3Fts5ConfigPars
8910: 65 52 61 6e 6b 28 7a 2c 20 26 7a 52 61 6e 6b 2c  eRank(z, &zRank,
8920: 20 26 7a 52 61 6e 6b 41 72 67 73 29 3b 0a 20 20   &zRankArgs);.  
8930: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
8940: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8950: 20 20 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 20 3d     pCsr->zRank =
8960: 20 7a 52 61 6e 6b 3b 0a 20 20 20 20 20 20 70 43   zRank;.      pC
8970: 73 72 2d 3e 7a 52 61 6e 6b 41 72 67 73 20 3d 20  sr->zRankArgs = 
8980: 7a 52 61 6e 6b 41 72 67 73 3b 0a 20 20 20 20 20  zRankArgs;.     
8990: 20 43 73 72 46 6c 61 67 53 65 74 28 70 43 73 72   CsrFlagSet(pCsr
89a0: 2c 20 46 54 53 35 43 53 52 5f 46 52 45 45 5f 5a  , FTS5CSR_FREE_Z
89b0: 52 41 4e 4b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  RANK);.    }else
89c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
89d0: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70  ERROR ){.      p
89e0: 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 2d  Csr->base.pVtab-
89f0: 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
8a00: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
8a10: 20 20 20 20 20 20 22 70 61 72 73 65 20 65 72 72        "parse err
8a20: 6f 72 20 69 6e 20 72 61 6e 6b 20 66 75 6e 63 74  or in rank funct
8a30: 69 6f 6e 3a 20 25 73 22 2c 20 7a 0a 20 20 20 20  ion: %s", z.    
8a40: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c    );.    }.  }el
8a50: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  se{.    if( pCon
8a60: 66 69 67 2d 3e 7a 52 61 6e 6b 20 29 7b 0a 20 20  fig->zRank ){.  
8a70: 20 20 20 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 20      pCsr->zRank 
8a80: 3d 20 28 63 68 61 72 2a 29 70 43 6f 6e 66 69 67  = (char*)pConfig
8a90: 2d 3e 7a 52 61 6e 6b 3b 0a 20 20 20 20 20 20 70  ->zRank;.      p
8aa0: 43 73 72 2d 3e 7a 52 61 6e 6b 41 72 67 73 20 3d  Csr->zRankArgs =
8ab0: 20 28 63 68 61 72 2a 29 70 43 6f 6e 66 69 67 2d   (char*)pConfig-
8ac0: 3e 7a 52 61 6e 6b 41 72 67 73 3b 0a 20 20 20 20  >zRankArgs;.    
8ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 73  }else{.      pCs
8ae0: 72 2d 3e 7a 52 61 6e 6b 20 3d 20 28 63 68 61 72  r->zRank = (char
8af0: 2a 29 46 54 53 35 5f 44 45 46 41 55 4c 54 5f 52  *)FTS5_DEFAULT_R
8b00: 41 4e 4b 3b 0a 20 20 20 20 20 20 70 43 73 72 2d  ANK;.      pCsr-
8b10: 3e 7a 52 61 6e 6b 41 72 67 73 20 3d 20 30 3b 0a  >zRankArgs = 0;.
8b20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8b30: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
8b40: 20 69 36 34 20 66 74 73 35 47 65 74 52 6f 77 69   i64 fts5GetRowi
8b50: 64 4c 69 6d 69 74 28 73 71 6c 69 74 65 33 5f 76  dLimit(sqlite3_v
8b60: 61 6c 75 65 20 2a 70 56 61 6c 2c 20 69 36 34 20  alue *pVal, i64 
8b70: 69 44 65 66 61 75 6c 74 29 7b 0a 20 20 69 66 28  iDefault){.  if(
8b80: 20 70 56 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74   pVal ){.    int
8b90: 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
8ba0: 5f 76 61 6c 75 65 5f 6e 75 6d 65 72 69 63 5f 74  _value_numeric_t
8bb0: 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 69  ype(pVal);.    i
8bc0: 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
8bd0: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
8be0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8bf0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61  _value_int64(pVa
8c00: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
8c10: 72 65 74 75 72 6e 20 69 44 65 66 61 75 6c 74 3b  return iDefault;
8c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
8c30: 73 20 74 68 65 20 78 46 69 6c 74 65 72 20 69 6e  s the xFilter in
8c40: 74 65 72 66 61 63 65 20 66 6f 72 20 74 68 65 20  terface for the 
8c50: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
8c60: 53 65 65 0a 2a 2a 20 74 68 65 20 76 69 72 74 75  See.** the virtu
8c70: 61 6c 20 74 61 62 6c 65 20 78 46 69 6c 74 65 72  al table xFilter
8c80: 20 6d 65 74 68 6f 64 20 64 6f 63 75 6d 65 6e 74   method document
8c90: 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ation for additi
8ca0: 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  onal.** informat
8cb0: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 72  ion..** .** Ther
8cc0: 65 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73  e are three poss
8cd0: 69 62 6c 65 20 71 75 65 72 79 20 73 74 72 61 74  ible query strat
8ce0: 65 67 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  egies:.**.**   1
8cf0: 2e 20 46 75 6c 6c 2d 74 65 78 74 20 73 65 61 72  . Full-text sear
8d00: 63 68 20 75 73 69 6e 67 20 61 20 4d 41 54 43 48  ch using a MATCH
8d10: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
8d20: 32 2e 20 41 20 62 79 2d 72 6f 77 69 64 20 6c 6f  2. A by-rowid lo
8d30: 6f 6b 75 70 2e 0a 2a 2a 20 20 20 33 2e 20 41 20  okup..**   3. A 
8d40: 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 2e  full-table scan.
8d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
8d60: 74 73 35 46 69 6c 74 65 72 4d 65 74 68 6f 64 28  ts5FilterMethod(
8d70: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
8d80: 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c  cursor *pCursor,
8d90: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
8da0: 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 71   used for this q
8db0: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 64  uery */.  int id
8dc0: 78 4e 75 6d 2c 20 20 20 20 20 20 20 20 20 20 20  xNum,           
8dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
8de0: 61 74 65 67 79 20 69 6e 64 65 78 20 2a 2f 0a 20  ategy index */. 
8df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e   const char *zUn
8e00: 75 73 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  used,           
8e10: 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
8e20: 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20 20 20  int nVal,       
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
8e50: 6d 65 6e 74 73 20 69 6e 20 61 70 56 61 6c 20 2a  ments in apVal *
8e60: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
8e70: 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
8e80: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
8e90: 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 69 6e   for the indexin
8ea0: 67 20 73 63 68 65 6d 65 20 2a 2f 0a 29 7b 0a 20  g scheme */.){. 
8eb0: 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62   Fts5Table *pTab
8ec0: 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29 28   = (Fts5Table*)(
8ed0: 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b  pCursor->pVtab);
8ee0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
8ef0: 43 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d 3e 70  Config = pTab->p
8f00: 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 43 75  Config;.  Fts5Cu
8f10: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
8f20: 73 35 43 75 72 73 6f 72 2a 29 70 43 75 72 73 6f  s5Cursor*)pCurso
8f30: 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
8f40: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
8f50: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
8f60: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c  de */.  int iVal
8f70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
8f90: 65 72 20 66 6f 72 20 61 70 56 61 6c 5b 5d 20 2a  er for apVal[] *
8fa0: 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 3b 20 20  /.  int bDesc;  
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fc0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 4f      /* True if O
8fd0: 52 44 45 52 20 42 59 20 5b 72 61 6e 6b 7c 72 6f  RDER BY [rank|ro
8fe0: 77 69 64 5d 20 44 45 53 43 20 2a 2f 0a 20 20 69  wid] DESC */.  i
8ff0: 6e 74 20 62 4f 72 64 65 72 42 79 52 61 6e 6b 3b  nt bOrderByRank;
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9010: 2a 20 54 72 75 65 20 69 66 20 4f 52 44 45 52 20  * True if ORDER 
9020: 42 59 20 72 61 6e 6b 20 2a 2f 0a 20 20 73 71 6c  BY rank */.  sql
9030: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4d 61 74  ite3_value *pMat
9040: 63 68 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ch = 0;      /* 
9050: 3c 74 62 6c 3e 20 4d 41 54 43 48 20 3f 20 65 78  <tbl> MATCH ? ex
9060: 70 72 65 73 73 69 6f 6e 20 28 6f 72 20 4e 55 4c  pression (or NUL
9070: 4c 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  L) */.  sqlite3_
9080: 76 61 6c 75 65 20 2a 70 52 61 6e 6b 20 3d 20 30  value *pRank = 0
9090: 3b 20 20 20 20 20 20 20 2f 2a 20 72 61 6e 6b 20  ;       /* rank 
90a0: 4d 41 54 43 48 20 3f 20 65 78 70 72 65 73 73 69  MATCH ? expressi
90b0: 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  on (or NULL) */.
90c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
90d0: 2a 70 52 6f 77 69 64 45 71 20 3d 20 30 3b 20 20  *pRowidEq = 0;  
90e0: 20 20 2f 2a 20 72 6f 77 69 64 20 3d 20 3f 20 65    /* rowid = ? e
90f0: 78 70 72 65 73 73 69 6f 6e 20 28 6f 72 20 4e 55  xpression (or NU
9100: 4c 4c 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  LL) */.  sqlite3
9110: 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 4c 65  _value *pRowidLe
9120: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 72 6f 77 69   = 0;    /* rowi
9130: 64 20 3c 3d 20 3f 20 65 78 70 72 65 73 73 69 6f  d <= ? expressio
9140: 6e 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  n (or NULL) */. 
9150: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9160: 70 52 6f 77 69 64 47 65 20 3d 20 30 3b 20 20 20  pRowidGe = 0;   
9170: 20 2f 2a 20 72 6f 77 69 64 20 3e 3d 20 3f 20 65   /* rowid >= ? e
9180: 78 70 72 65 73 73 69 6f 6e 20 28 6f 72 20 4e 55  xpression (or NU
9190: 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  LL) */.  int iCo
91a0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
91b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
91c0: 6d 6e 20 6f 6e 20 4c 48 53 20 6f 66 20 4d 41 54  mn on LHS of MAT
91d0: 43 48 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  CH operator */. 
91e0: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
91f0: 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72   = pConfig->pzEr
9200: 72 6d 73 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  rmsg;..  UNUSED_
9210: 50 41 52 41 4d 28 7a 55 6e 75 73 65 64 29 3b 0a  PARAM(zUnused);.
9220: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e    UNUSED_PARAM(n
9230: 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20 70 43 73  Val);..  if( pCs
9240: 72 2d 3e 65 50 6c 61 6e 20 29 7b 0a 20 20 20 20  r->ePlan ){.    
9250: 66 74 73 35 46 72 65 65 43 75 72 73 6f 72 43 6f  fts5FreeCursorCo
9260: 6d 70 6f 6e 65 6e 74 73 28 70 43 73 72 29 3b 0a  mponents(pCsr);.
9270: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 43 73 72      memset(&pCsr
9280: 2d 3e 65 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65  ->ePlan, 0, size
9290: 6f 66 28 46 74 73 35 43 75 72 73 6f 72 29 20 2d  of(Fts5Cursor) -
92a0: 20 28 28 75 38 2a 29 26 70 43 73 72 2d 3e 65 50   ((u8*)&pCsr->eP
92b0: 6c 61 6e 2d 28 75 38 2a 29 70 43 73 72 29 29 3b  lan-(u8*)pCsr));
92c0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
92d0: 70 43 73 72 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  pCsr->pStmt==0 )
92e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
92f0: 2d 3e 70 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20  ->pExpr==0 );.  
9300: 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 63 73  assert( pCsr->cs
9310: 72 66 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 61  rflags==0 );.  a
9320: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 52 61  ssert( pCsr->pRa
9330: 6e 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nk==0 );.  asser
9340: 74 28 20 70 43 73 72 2d 3e 7a 52 61 6e 6b 3d 3d  t( pCsr->zRank==
9350: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9360: 43 73 72 2d 3e 7a 52 61 6e 6b 41 72 67 73 3d 3d  Csr->zRankArgs==
9370: 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0 );..  assert( 
9380: 70 7a 45 72 72 6d 73 67 3d 3d 30 20 7c 7c 20 70  pzErrmsg==0 || p
9390: 7a 45 72 72 6d 73 67 3d 3d 26 70 54 61 62 2d 3e  zErrmsg==&pTab->
93a0: 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 29 3b 0a  base.zErrMsg );.
93b0: 20 20 70 43 6f 6e 66 69 67 2d 3e 70 7a 45 72 72    pConfig->pzErr
93c0: 6d 73 67 20 3d 20 26 70 54 61 62 2d 3e 62 61 73  msg = &pTab->bas
93d0: 65 2e 7a 45 72 72 4d 73 67 3b 0a 0a 20 20 2f 2a  e.zErrMsg;..  /*
93e0: 20 44 65 63 6f 64 65 20 74 68 65 20 61 72 67 75   Decode the argu
93f0: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 68 72  ments passed thr
9400: 6f 75 67 68 20 74 6f 20 74 68 69 73 20 66 75 6e  ough to this fun
9410: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ction..  **.  **
9420: 20 4e 6f 74 65 3a 20 54 68 65 20 66 6f 6c 6c 6f   Note: The follo
9430: 77 69 6e 67 20 73 65 74 20 6f 66 20 69 66 28 2e  wing set of if(.
9440: 2e 2e 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  ..) statements m
9450: 75 73 74 20 62 65 20 69 6e 20 74 68 65 20 73 61  ust be in the sa
9460: 6d 65 0a 20 20 2a 2a 20 6f 72 64 65 72 20 61 73  me.  ** order as
9470: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
9480: 6e 67 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ng entries in th
9490: 65 20 73 74 72 75 63 74 20 61 74 20 74 68 65 20  e struct at the 
94a0: 74 6f 70 20 6f 66 0a 20 20 2a 2a 20 66 74 73 35  top of.  ** fts5
94b0: 42 65 73 74 49 6e 64 65 78 4d 65 74 68 6f 64 28  BestIndexMethod(
94c0: 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 42 69 74  ).  */.  if( Bit
94d0: 46 6c 61 67 54 65 73 74 28 69 64 78 4e 75 6d 2c  FlagTest(idxNum,
94e0: 20 46 54 53 35 5f 42 49 5f 4d 41 54 43 48 29 20   FTS5_BI_MATCH) 
94f0: 29 20 70 4d 61 74 63 68 20 3d 20 61 70 56 61 6c  ) pMatch = apVal
9500: 5b 69 56 61 6c 2b 2b 5d 3b 0a 20 20 69 66 28 20  [iVal++];.  if( 
9510: 42 69 74 46 6c 61 67 54 65 73 74 28 69 64 78 4e  BitFlagTest(idxN
9520: 75 6d 2c 20 46 54 53 35 5f 42 49 5f 52 41 4e 4b  um, FTS5_BI_RANK
9530: 29 20 29 20 70 52 61 6e 6b 20 3d 20 61 70 56 61  ) ) pRank = apVa
9540: 6c 5b 69 56 61 6c 2b 2b 5d 3b 0a 20 20 69 66 28  l[iVal++];.  if(
9550: 20 42 69 74 46 6c 61 67 54 65 73 74 28 69 64 78   BitFlagTest(idx
9560: 4e 75 6d 2c 20 46 54 53 35 5f 42 49 5f 52 4f 57  Num, FTS5_BI_ROW
9570: 49 44 5f 45 51 29 20 29 20 70 52 6f 77 69 64 45  ID_EQ) ) pRowidE
9580: 71 20 3d 20 61 70 56 61 6c 5b 69 56 61 6c 2b 2b  q = apVal[iVal++
9590: 5d 3b 0a 20 20 69 66 28 20 42 69 74 46 6c 61 67  ];.  if( BitFlag
95a0: 54 65 73 74 28 69 64 78 4e 75 6d 2c 20 46 54 53  Test(idxNum, FTS
95b0: 35 5f 42 49 5f 52 4f 57 49 44 5f 4c 45 29 20 29  5_BI_ROWID_LE) )
95c0: 20 70 52 6f 77 69 64 4c 65 20 3d 20 61 70 56 61   pRowidLe = apVa
95d0: 6c 5b 69 56 61 6c 2b 2b 5d 3b 0a 20 20 69 66 28  l[iVal++];.  if(
95e0: 20 42 69 74 46 6c 61 67 54 65 73 74 28 69 64 78   BitFlagTest(idx
95f0: 4e 75 6d 2c 20 46 54 53 35 5f 42 49 5f 52 4f 57  Num, FTS5_BI_ROW
9600: 49 44 5f 47 45 29 20 29 20 70 52 6f 77 69 64 47  ID_GE) ) pRowidG
9610: 65 20 3d 20 61 70 56 61 6c 5b 69 56 61 6c 2b 2b  e = apVal[iVal++
9620: 5d 3b 0a 20 20 69 43 6f 6c 20 3d 20 28 69 64 78  ];.  iCol = (idx
9630: 4e 75 6d 3e 3e 31 36 29 3b 0a 20 20 61 73 73 65  Num>>16);.  asse
9640: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  rt( iCol>=0 && i
9650: 43 6f 6c 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 43  Col<=pConfig->nC
9660: 6f 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ol );.  assert( 
9670: 69 56 61 6c 3d 3d 6e 56 61 6c 20 29 3b 0a 20 20  iVal==nVal );.  
9680: 62 4f 72 64 65 72 42 79 52 61 6e 6b 20 3d 20 28  bOrderByRank = (
9690: 28 69 64 78 4e 75 6d 20 26 20 46 54 53 35 5f 42  (idxNum & FTS5_B
96a0: 49 5f 4f 52 44 45 52 5f 52 41 4e 4b 29 20 3f 20  I_ORDER_RANK) ? 
96b0: 31 20 3a 20 30 29 3b 0a 20 20 70 43 73 72 2d 3e  1 : 0);.  pCsr->
96c0: 62 44 65 73 63 20 3d 20 62 44 65 73 63 20 3d 20  bDesc = bDesc = 
96d0: 28 28 69 64 78 4e 75 6d 20 26 20 46 54 53 35 5f  ((idxNum & FTS5_
96e0: 42 49 5f 4f 52 44 45 52 5f 44 45 53 43 29 20 3f  BI_ORDER_DESC) ?
96f0: 20 31 20 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20 53   1 : 0);..  /* S
9700: 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  et the cursor up
9710: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 72 6f  per and lower ro
9720: 77 69 64 20 6c 69 6d 69 74 73 2e 20 4f 6e 6c 79  wid limits. Only
9730: 20 73 6f 6d 65 20 73 74 72 61 74 65 67 69 65 73   some strategies
9740: 20 0a 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20   .  ** actually 
9750: 75 73 65 20 74 68 65 6d 2e 20 54 68 69 73 20 69  use them. This i
9760: 73 20 6f 6b 2c 20 61 73 20 74 68 65 20 78 42 65  s ok, as the xBe
9770: 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64  stIndex() method
9780: 20 6c 65 61 76 65 73 20 74 68 65 0a 20 20 2a 2a   leaves the.  **
9790: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
97a0: 6f 6e 73 74 72 61 69 6e 74 2e 6f 6d 69 74 20 66  onstraint.omit f
97b0: 6c 61 67 20 63 6c 65 61 72 20 66 6f 72 20 72 61  lag clear for ra
97c0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nge constraints.
97d0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 6f 77 69    ** on the rowi
97e0: 64 20 66 69 65 6c 64 2e 20 20 2a 2f 0a 20 20 69  d field.  */.  i
97f0: 66 28 20 70 52 6f 77 69 64 45 71 20 29 7b 0a 20  f( pRowidEq ){. 
9800: 20 20 20 70 52 6f 77 69 64 4c 65 20 3d 20 70 52     pRowidLe = pR
9810: 6f 77 69 64 47 65 20 3d 20 70 52 6f 77 69 64 45  owidGe = pRowidE
9820: 71 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 44 65  q;.  }.  if( bDe
9830: 73 63 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e  sc ){.    pCsr->
9840: 69 46 69 72 73 74 52 6f 77 69 64 20 3d 20 66 74  iFirstRowid = ft
9850: 73 35 47 65 74 52 6f 77 69 64 4c 69 6d 69 74 28  s5GetRowidLimit(
9860: 70 52 6f 77 69 64 4c 65 2c 20 4c 41 52 47 45 53  pRowidLe, LARGES
9870: 54 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 70 43  T_INT64);.    pC
9880: 73 72 2d 3e 69 4c 61 73 74 52 6f 77 69 64 20 3d  sr->iLastRowid =
9890: 20 66 74 73 35 47 65 74 52 6f 77 69 64 4c 69 6d   fts5GetRowidLim
98a0: 69 74 28 70 52 6f 77 69 64 47 65 2c 20 53 4d 41  it(pRowidGe, SMA
98b0: 4c 4c 45 53 54 5f 49 4e 54 36 34 29 3b 0a 20 20  LLEST_INT64);.  
98c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 73 72 2d  }else{.    pCsr-
98d0: 3e 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 66 74  >iLastRowid = ft
98e0: 73 35 47 65 74 52 6f 77 69 64 4c 69 6d 69 74 28  s5GetRowidLimit(
98f0: 70 52 6f 77 69 64 4c 65 2c 20 4c 41 52 47 45 53  pRowidLe, LARGES
9900: 54 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 70 43  T_INT64);.    pC
9910: 73 72 2d 3e 69 46 69 72 73 74 52 6f 77 69 64 20  sr->iFirstRowid 
9920: 3d 20 66 74 73 35 47 65 74 52 6f 77 69 64 4c 69  = fts5GetRowidLi
9930: 6d 69 74 28 70 52 6f 77 69 64 47 65 2c 20 53 4d  mit(pRowidGe, SM
9940: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 3b 0a 20  ALLEST_INT64);. 
9950: 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   }..  if( pTab->
9960: 70 53 6f 72 74 43 73 72 20 29 7b 0a 20 20 20 20  pSortCsr ){.    
9970: 2f 2a 20 49 66 20 70 53 6f 72 74 43 73 72 20 69  /* If pSortCsr i
9980: 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
9990: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 62 65   this call is be
99a0: 69 6e 67 20 6d 61 64 65 20 61 73 20 70 61 72 74  ing made as part
99b0: 20 6f 66 20 0a 20 20 20 20 2a 2a 20 70 72 6f 63   of .    ** proc
99c0: 65 73 73 69 6e 67 20 66 6f 72 20 61 20 22 2e 2e  essing for a "..
99d0: 2e 20 4d 41 54 43 48 20 3c 65 78 70 72 3e 20 4f  . MATCH <expr> O
99e0: 52 44 45 52 20 42 59 20 72 61 6e 6b 22 20 71 75  RDER BY rank" qu
99f0: 65 72 79 20 28 65 50 6c 61 6e 20 69 73 0a 20 20  ery (ePlan is.  
9a00: 20 20 2a 2a 20 73 65 74 20 74 6f 20 46 54 53 35    ** set to FTS5
9a10: 5f 50 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d 41 54  _PLAN_SORTED_MAT
9a20: 43 48 29 2e 20 70 53 6f 72 74 43 73 72 20 69 73  CH). pSortCsr is
9a30: 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 61 74   the cursor that
9a40: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 72 65 74   will.    ** ret
9a50: 75 72 6e 20 72 65 73 75 6c 74 73 20 74 6f 20 74  urn results to t
9a60: 68 65 20 75 73 65 72 20 66 6f 72 20 74 68 69 73  he user for this
9a70: 20 71 75 65 72 79 2e 20 54 68 65 20 63 75 72 72   query. The curr
9a80: 65 6e 74 20 63 75 72 73 6f 72 20 0a 20 20 20 20  ent cursor .    
9a90: 2a 2a 20 28 70 43 75 72 73 6f 72 29 20 69 73 20  ** (pCursor) is 
9aa0: 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  used to execute 
9ab0: 74 68 65 20 71 75 65 72 79 20 69 73 73 75 65 64  the query issued
9ac0: 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20   by function .  
9ad0: 20 20 2a 2a 20 66 74 73 35 43 75 72 73 6f 72 46    ** fts5CursorF
9ae0: 69 72 73 74 53 6f 72 74 65 64 28 29 20 61 62 6f  irstSorted() abo
9af0: 76 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ve.  */.    asse
9b00: 72 74 28 20 70 52 6f 77 69 64 45 71 3d 3d 30 20  rt( pRowidEq==0 
9b10: 26 26 20 70 52 6f 77 69 64 4c 65 3d 3d 30 20 26  && pRowidLe==0 &
9b20: 26 20 70 52 6f 77 69 64 47 65 3d 3d 30 20 26 26  & pRowidGe==0 &&
9b30: 20 70 52 61 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20   pRank==0 );.   
9b40: 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 30   assert( nVal==0
9b50: 20 26 26 20 70 4d 61 74 63 68 3d 3d 30 20 26 26   && pMatch==0 &&
9b60: 20 62 4f 72 64 65 72 42 79 52 61 6e 6b 3d 3d 30   bOrderByRank==0
9b70: 20 26 26 20 62 44 65 73 63 3d 3d 30 20 29 3b 0a   && bDesc==0 );.
9b80: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72      assert( pCsr
9b90: 2d 3e 69 4c 61 73 74 52 6f 77 69 64 3d 3d 4c 41  ->iLastRowid==LA
9ba0: 52 47 45 53 54 5f 49 4e 54 36 34 20 29 3b 0a 20  RGEST_INT64 );. 
9bb0: 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d     assert( pCsr-
9bc0: 3e 69 46 69 72 73 74 52 6f 77 69 64 3d 3d 53 4d  >iFirstRowid==SM
9bd0: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 3b 0a  ALLEST_INT64 );.
9be0: 20 20 20 20 70 43 73 72 2d 3e 65 50 6c 61 6e 20      pCsr->ePlan 
9bf0: 3d 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 55 52  = FTS5_PLAN_SOUR
9c00: 43 45 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 45  CE;.    pCsr->pE
9c10: 78 70 72 20 3d 20 70 54 61 62 2d 3e 70 53 6f 72  xpr = pTab->pSor
9c20: 74 43 73 72 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tCsr->pExpr;.   
9c30: 20 72 63 20 3d 20 66 74 73 35 43 75 72 73 6f 72   rc = fts5Cursor
9c40: 46 69 72 73 74 28 70 54 61 62 2c 20 70 43 73 72  First(pTab, pCsr
9c50: 2c 20 62 44 65 73 63 29 3b 0a 20 20 7d 65 6c 73  , bDesc);.  }els
9c60: 65 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a  e if( pMatch ){.
9c70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9c80: 7a 45 78 70 72 20 3d 20 28 63 6f 6e 73 74 20 63  zExpr = (const c
9c90: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
9ca0: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
9cb0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 72  );.    if( zExpr
9cc0: 3d 3d 30 20 29 20 7a 45 78 70 72 20 3d 20 22 22  ==0 ) zExpr = ""
9cd0: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  ;..    rc = fts5
9ce0: 43 75 72 73 6f 72 50 61 72 73 65 52 61 6e 6b 28  CursorParseRank(
9cf0: 70 43 6f 6e 66 69 67 2c 20 70 43 73 72 2c 20 70  pConfig, pCsr, p
9d00: 52 61 6e 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Rank);.    if( r
9d10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9d20: 20 20 20 20 20 20 69 66 28 20 7a 45 78 70 72 5b        if( zExpr[
9d30: 30 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20  0]=='*' ){.     
9d40: 20 20 20 2f 2a 20 54 68 65 20 75 73 65 72 20 68     /* The user h
9d50: 61 73 20 69 73 73 75 65 64 20 61 20 71 75 65 72  as issued a quer
9d60: 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 4d  y of the form "M
9d70: 41 54 43 48 20 27 2a 2e 2e 2e 27 22 2e 20 54 68  ATCH '*...'". Th
9d80: 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  is.        ** in
9d90: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
9da0: 20 4d 41 54 43 48 20 65 78 70 72 65 73 73 69 6f   MATCH expressio
9db0: 6e 20 69 73 20 6e 6f 74 20 61 20 66 75 6c 6c 20  n is not a full 
9dc0: 74 65 78 74 20 71 75 65 72 79 2c 0a 20 20 20 20  text query,.    
9dd0: 20 20 20 20 2a 2a 20 62 75 74 20 61 20 72 65 71      ** but a req
9de0: 75 65 73 74 20 66 6f 72 20 61 6e 20 69 6e 74 65  uest for an inte
9df0: 72 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2e 20  rnal parameter. 
9e00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
9e10: 20 66 74 73 35 53 70 65 63 69 61 6c 4d 61 74 63   fts5SpecialMatc
9e20: 68 28 70 54 61 62 2c 20 70 43 73 72 2c 20 26 7a  h(pTab, pCsr, &z
9e30: 45 78 70 72 5b 31 5d 29 3b 0a 20 20 20 20 20 20  Expr[1]);.      
9e40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
9e50: 68 61 72 20 2a 2a 70 7a 45 72 72 20 3d 20 26 70  har **pzErr = &p
9e60: 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73  Tab->base.zErrMs
9e70: 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
9e80: 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 4e  sqlite3Fts5ExprN
9e90: 65 77 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6c  ew(pConfig, iCol
9ea0: 2c 20 7a 45 78 70 72 2c 20 26 70 43 73 72 2d 3e  , zExpr, &pCsr->
9eb0: 70 45 78 70 72 2c 20 70 7a 45 72 72 29 3b 0a 20  pExpr, pzErr);. 
9ec0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
9ed0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9ee0: 20 20 20 20 20 20 69 66 28 20 62 4f 72 64 65 72        if( bOrder
9ef0: 42 79 52 61 6e 6b 20 29 7b 0a 20 20 20 20 20 20  ByRank ){.      
9f00: 20 20 20 20 20 20 70 43 73 72 2d 3e 65 50 6c 61        pCsr->ePla
9f10: 6e 20 3d 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f  n = FTS5_PLAN_SO
9f20: 52 54 45 44 5f 4d 41 54 43 48 3b 0a 20 20 20 20  RTED_MATCH;.    
9f30: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
9f40: 35 43 75 72 73 6f 72 46 69 72 73 74 53 6f 72 74  5CursorFirstSort
9f50: 65 64 28 70 54 61 62 2c 20 70 43 73 72 2c 20 62  ed(pTab, pCsr, b
9f60: 44 65 73 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Desc);.         
9f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9f80: 20 20 20 20 70 43 73 72 2d 3e 65 50 6c 61 6e 20      pCsr->ePlan 
9f90: 3d 20 46 54 53 35 5f 50 4c 41 4e 5f 4d 41 54 43  = FTS5_PLAN_MATC
9fa0: 48 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  H;.            r
9fb0: 63 20 3d 20 66 74 73 35 43 75 72 73 6f 72 46 69  c = fts5CursorFi
9fc0: 72 73 74 28 70 54 61 62 2c 20 70 43 73 72 2c 20  rst(pTab, pCsr, 
9fd0: 62 44 65 73 63 29 3b 0a 20 20 20 20 20 20 20 20  bDesc);.        
9fe0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9ff0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
a000: 6c 73 65 20 69 66 28 20 70 43 6f 6e 66 69 67 2d  lse if( pConfig-
a010: 3e 7a 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 7b 0a  >zContent==0 ){.
a020: 20 20 20 20 2a 70 43 6f 6e 66 69 67 2d 3e 70 7a      *pConfig->pz
a030: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
a040: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
a050: 20 20 22 25 73 3a 20 74 61 62 6c 65 20 64 6f 65    "%s: table doe
a060: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 63  s not support sc
a070: 61 6e 6e 69 6e 67 22 2c 20 70 43 6f 6e 66 69 67  anning", pConfig
a080: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
a090: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
a0a0: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
a0b0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 65 69     /* This is ei
a0c0: 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c  ther a full-tabl
a0d0: 65 20 73 63 61 6e 20 28 65 50 6c 61 6e 3d 3d 46  e scan (ePlan==F
a0e0: 54 53 35 5f 50 4c 41 4e 5f 53 43 41 4e 29 20 6f  TS5_PLAN_SCAN) o
a0f0: 72 20 61 20 6c 6f 6f 6b 75 70 0a 20 20 20 20 2a  r a lookup.    *
a100: 2a 20 62 79 20 72 6f 77 69 64 20 28 65 50 6c 61  * by rowid (ePla
a110: 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 52 4f 57  n==FTS5_PLAN_ROW
a120: 49 44 29 2e 20 20 2a 2f 0a 20 20 20 20 70 43 73  ID).  */.    pCs
a130: 72 2d 3e 65 50 6c 61 6e 20 3d 20 28 70 52 6f 77  r->ePlan = (pRow
a140: 69 64 45 71 20 3f 20 46 54 53 35 5f 50 4c 41 4e  idEq ? FTS5_PLAN
a150: 5f 52 4f 57 49 44 20 3a 20 46 54 53 35 5f 50 4c  _ROWID : FTS5_PL
a160: 41 4e 5f 53 43 41 4e 29 3b 0a 20 20 20 20 72 63  AN_SCAN);.    rc
a170: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
a180: 6f 72 61 67 65 53 74 6d 74 28 0a 20 20 20 20 20  orageStmt(.     
a190: 20 20 20 70 54 61 62 2d 3e 70 53 74 6f 72 61 67     pTab->pStorag
a1a0: 65 2c 20 66 74 73 35 53 74 6d 74 54 79 70 65 28  e, fts5StmtType(
a1b0: 70 43 73 72 29 2c 20 26 70 43 73 72 2d 3e 70 53  pCsr), &pCsr->pS
a1c0: 74 6d 74 2c 20 26 70 54 61 62 2d 3e 62 61 73 65  tmt, &pTab->base
a1d0: 2e 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b 0a  .zErrMsg.    );.
a1e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a1f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
a200: 66 28 20 70 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d  f( pCsr->ePlan==
a210: 46 54 53 35 5f 50 4c 41 4e 5f 52 4f 57 49 44 20  FTS5_PLAN_ROWID 
a220: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a230: 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 43  e3_bind_value(pC
a240: 73 72 2d 3e 70 53 74 6d 74 2c 20 31 2c 20 61 70  sr->pStmt, 1, ap
a250: 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  Val[0]);.      }
a260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
a270: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
a280: 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31 2c  (pCsr->pStmt, 1,
a290: 20 70 43 73 72 2d 3e 69 46 69 72 73 74 52 6f 77   pCsr->iFirstRow
a2a0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  id);.        sql
a2b0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
a2c0: 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 32 2c 20  pCsr->pStmt, 2, 
a2d0: 70 43 73 72 2d 3e 69 4c 61 73 74 52 6f 77 69 64  pCsr->iLastRowid
a2e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a2f0: 20 72 63 20 3d 20 66 74 73 35 4e 65 78 74 4d 65   rc = fts5NextMe
a300: 74 68 6f 64 28 70 43 75 72 73 6f 72 29 3b 0a 20  thod(pCursor);. 
a310: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6e     }.  }..  pCon
a320: 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20 3d 20  fig->pzErrmsg = 
a330: 70 7a 45 72 72 6d 73 67 3b 0a 20 20 72 65 74 75  pzErrmsg;.  retu
a340: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
a350: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 6f   This is the xEo
a360: 66 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  f method of the 
a370: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 53  virtual table. S
a380: 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
a390: 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20   .** routine to 
a3a0: 66 69 6e 64 20 6f 75 74 20 69 66 20 69 74 20 68  find out if it h
a3b0: 61 73 20 72 65 61 63 68 65 64 20 74 68 65 20 65  as reached the e
a3c0: 6e 64 20 6f 66 20 61 20 72 65 73 75 6c 74 20 73  nd of a result s
a3d0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
a3e0: 74 20 66 74 73 35 45 6f 66 4d 65 74 68 6f 64 28  t fts5EofMethod(
a3f0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
a400: 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20  sor *pCursor){. 
a410: 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73   Fts5Cursor *pCs
a420: 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a  r = (Fts5Cursor*
a430: 29 70 43 75 72 73 6f 72 3b 0a 20 20 72 65 74 75  )pCursor;.  retu
a440: 72 6e 20 28 43 73 72 46 6c 61 67 54 65 73 74 28  rn (CsrFlagTest(
a450: 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 45 4f  pCsr, FTS5CSR_EO
a460: 46 29 20 3f 20 31 20 3a 20 30 29 3b 0a 7d 0a 0a  F) ? 1 : 0);.}..
a470: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
a480: 20 72 6f 77 69 64 20 74 68 61 74 20 74 68 65 20   rowid that the 
a490: 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
a4a0: 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
a4b0: 74 61 74 69 63 20 69 36 34 20 66 74 73 35 43 75  tatic i64 fts5Cu
a4c0: 72 73 6f 72 52 6f 77 69 64 28 46 74 73 35 43 75  rsorRowid(Fts5Cu
a4d0: 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 61  rsor *pCsr){.  a
a4e0: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65 50 6c  ssert( pCsr->ePl
a4f0: 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f 4d 41  an==FTS5_PLAN_MA
a500: 54 43 48 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  TCH .       || p
a510: 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35  Csr->ePlan==FTS5
a520: 5f 50 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d 41 54  _PLAN_SORTED_MAT
a530: 43 48 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43  CH .       || pC
a540: 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35 5f  sr->ePlan==FTS5_
a550: 50 4c 41 4e 5f 53 4f 55 52 43 45 20 0a 20 20 29  PLAN_SOURCE .  )
a560: 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70 53  ;.  if( pCsr->pS
a570: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  orter ){.    ret
a580: 75 72 6e 20 70 43 73 72 2d 3e 70 53 6f 72 74 65  urn pCsr->pSorte
a590: 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 7d 65 6c  r->iRowid;.  }el
a5a0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  se{.    return s
a5b0: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 52 6f  qlite3Fts5ExprRo
a5c0: 77 69 64 28 70 43 73 72 2d 3e 70 45 78 70 72 29  wid(pCsr->pExpr)
a5d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
a5e0: 54 68 69 73 20 69 73 20 74 68 65 20 78 52 6f 77  This is the xRow
a5f0: 69 64 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 53  id method. The S
a600: 51 4c 69 74 65 20 63 6f 72 65 20 63 61 6c 6c 73  QLite core calls
a610: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
a620: 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65  .** retrieve the
a630: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
a640: 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
a650: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 66 74  e result set. ft
a660: 73 35 0a 2a 2a 20 65 78 70 6f 73 65 73 20 25 5f  s5.** exposes %_
a670: 63 6f 6e 74 65 6e 74 2e 72 6f 77 69 64 20 61 73  content.rowid as
a680: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
a690: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
a6a0: 2e 20 54 68 65 0a 2a 2a 20 72 6f 77 69 64 20 73  . The.** rowid s
a6b0: 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
a6c0: 20 74 6f 20 2a 70 52 6f 77 69 64 2e 0a 2a 2f 0a   to *pRowid..*/.
a6d0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 52  static int fts5R
a6e0: 6f 77 69 64 4d 65 74 68 6f 64 28 73 71 6c 69 74  owidMethod(sqlit
a6f0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
a700: 70 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f  pCursor, sqlite_
a710: 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a  int64 *pRowid){.
a720: 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43    Fts5Cursor *pC
a730: 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72  sr = (Fts5Cursor
a740: 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  *)pCursor;.  int
a750: 20 65 50 6c 61 6e 20 3d 20 70 43 73 72 2d 3e 65   ePlan = pCsr->e
a760: 50 6c 61 6e 3b 0a 20 20 0a 20 20 61 73 73 65 72  Plan;.  .  asser
a770: 74 28 20 43 73 72 46 6c 61 67 54 65 73 74 28 70  t( CsrFlagTest(p
a780: 43 73 72 2c 20 46 54 53 35 43 53 52 5f 45 4f 46  Csr, FTS5CSR_EOF
a790: 29 3d 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68  )==0 );.  switch
a7a0: 28 20 65 50 6c 61 6e 20 29 7b 0a 20 20 20 20 63  ( ePlan ){.    c
a7b0: 61 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f 53 50  ase FTS5_PLAN_SP
a7c0: 45 43 49 41 4c 3a 0a 20 20 20 20 20 20 2a 70 52  ECIAL:.      *pR
a7d0: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  owid = 0;.      
a7e0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a7f0: 20 46 54 53 35 5f 50 4c 41 4e 5f 53 4f 55 52 43   FTS5_PLAN_SOURC
a800: 45 3a 0a 20 20 20 20 63 61 73 65 20 46 54 53 35  E:.    case FTS5
a810: 5f 50 4c 41 4e 5f 4d 41 54 43 48 3a 0a 20 20 20  _PLAN_MATCH:.   
a820: 20 63 61 73 65 20 46 54 53 35 5f 50 4c 41 4e 5f   case FTS5_PLAN_
a830: 53 4f 52 54 45 44 5f 4d 41 54 43 48 3a 0a 20 20  SORTED_MATCH:.  
a840: 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 66 74      *pRowid = ft
a850: 73 35 43 75 72 73 6f 72 52 6f 77 69 64 28 70 43  s5CursorRowid(pC
a860: 73 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  sr);.      break
a870: 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
a880: 20 20 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20        *pRowid = 
a890: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
a8a0: 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74  nt64(pCsr->pStmt
a8b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
a8c0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
a8d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
a8e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
a8f0: 6f 72 20 72 65 71 75 69 72 65 73 20 73 65 65 6b  or requires seek
a900: 69 6e 67 20 28 62 53 65 65 6b 52 65 71 75 69 72  ing (bSeekRequir
a910: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 2c  ed flag is set),
a920: 20 73 65 65 6b 20 69 74 2e 0a 2a 2a 20 52 65 74   seek it..** Ret
a930: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
a940: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
a950: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
a960: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
a970: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ise..**.** If ar
a980: 67 75 6d 65 6e 74 20 62 45 72 72 6f 72 6d 73 67  gument bErrormsg
a990: 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20   is true and an 
a9a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
a9b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
a9c0: 61 79 0a 2a 2a 20 62 65 20 6c 65 66 74 20 69 6e  ay.** be left in
a9d0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
a9e0: 72 72 4d 73 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrMsg..*/.static
a9f0: 20 69 6e 74 20 66 74 73 35 53 65 65 6b 43 75 72   int fts5SeekCur
aa00: 73 6f 72 28 46 74 73 35 43 75 72 73 6f 72 20 2a  sor(Fts5Cursor *
aa10: 70 43 73 72 2c 20 69 6e 74 20 62 45 72 72 6f 72  pCsr, int bError
aa20: 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  msg){.  int rc =
aa30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
aa40: 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
aa50: 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 68 61 76  does not yet hav
aa60: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61  e a statement ha
aa70: 6e 64 6c 65 2c 20 6f 62 74 61 69 6e 20 6f 6e 65  ndle, obtain one
aa80: 20 6e 6f 77 2e 20 2a 2f 20 0a 20 20 69 66 28 20   now. */ .  if( 
aa90: 70 43 73 72 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  pCsr->pStmt==0 )
aaa0: 7b 0a 20 20 20 20 46 74 73 35 54 61 62 6c 65 20  {.    Fts5Table 
aab0: 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62  *pTab = (Fts5Tab
aac0: 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e  le*)(pCsr->base.
aad0: 70 56 74 61 62 29 3b 0a 20 20 20 20 69 6e 74 20  pVtab);.    int 
aae0: 65 53 74 6d 74 20 3d 20 66 74 73 35 53 74 6d 74  eStmt = fts5Stmt
aaf0: 54 79 70 65 28 70 43 73 72 29 3b 0a 20 20 20 20  Type(pCsr);.    
ab00: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
ab10: 53 74 6f 72 61 67 65 53 74 6d 74 28 0a 20 20 20  StorageStmt(.   
ab20: 20 20 20 20 20 70 54 61 62 2d 3e 70 53 74 6f 72       pTab->pStor
ab30: 61 67 65 2c 20 65 53 74 6d 74 2c 20 26 70 43 73  age, eStmt, &pCs
ab40: 72 2d 3e 70 53 74 6d 74 2c 20 28 62 45 72 72 6f  r->pStmt, (bErro
ab50: 72 6d 73 67 3f 26 70 54 61 62 2d 3e 62 61 73 65  rmsg?&pTab->base
ab60: 2e 7a 45 72 72 4d 73 67 3a 30 29 0a 20 20 20 20  .zErrMsg:0).    
ab70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
ab80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
ab90: 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d  pTab->base.zErrM
aba0: 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  sg==0 );.    ass
abb0: 65 72 74 28 20 43 73 72 46 6c 61 67 54 65 73 74  ert( CsrFlagTest
abc0: 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 52  (pCsr, FTS5CSR_R
abd0: 45 51 55 49 52 45 5f 43 4f 4e 54 45 4e 54 29 20  EQUIRE_CONTENT) 
abe0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
abf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 43  ==SQLITE_OK && C
ac00: 73 72 46 6c 61 67 54 65 73 74 28 70 43 73 72 2c  srFlagTest(pCsr,
ac10: 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52 45   FTS5CSR_REQUIRE
ac20: 5f 43 4f 4e 54 45 4e 54 29 20 29 7b 0a 20 20 20  _CONTENT) ){.   
ac30: 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70   assert( pCsr->p
ac40: 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  Expr );.    sqli
ac50: 74 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e  te3_reset(pCsr->
ac60: 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
ac70: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
ac80: 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31 2c 20 66  Csr->pStmt, 1, f
ac90: 74 73 35 43 75 72 73 6f 72 52 6f 77 69 64 28 70  ts5CursorRowid(p
aca0: 43 73 72 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  Csr));.    rc = 
acb0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73  sqlite3_step(pCs
acc0: 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  r->pStmt);.    i
acd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  f( rc==SQLITE_RO
ace0: 57 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  W ){.      rc = 
acf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
ad00: 20 43 73 72 46 6c 61 67 43 6c 65 61 72 28 70 43   CsrFlagClear(pC
ad10: 73 72 2c 20 46 54 53 35 43 53 52 5f 52 45 51 55  sr, FTS5CSR_REQU
ad20: 49 52 45 5f 43 4f 4e 54 45 4e 54 29 3b 0a 20 20  IRE_CONTENT);.  
ad30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
ad40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
ad50: 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a  t(pCsr->pStmt);.
ad60: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
ad70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ad80: 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52     rc = FTS5_COR
ad90: 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
ada0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
adb0: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76   rc;.}..static v
adc0: 6f 69 64 20 66 74 73 35 53 65 74 56 74 61 62 45  oid fts5SetVtabE
add0: 72 72 6f 72 28 46 74 73 35 54 61 62 6c 65 20 2a  rror(Fts5Table *
ade0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
adf0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
ae00: 76 61 5f 6c 69 73 74 20 61 70 3b 20 20 20 20 20  va_list ap;     
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 2f 2a 20 2e 2e 2e 20 70 72 69 6e 74 66 20 61 72  /* ... printf ar
ae30: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 76 61 5f  guments */.  va_
ae40: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
ae50: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  t);.  assert( p-
ae60: 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3d 3d 30  >base.zErrMsg==0
ae70: 20 29 3b 0a 20 20 70 2d 3e 62 61 73 65 2e 7a 45   );.  p->base.zE
ae80: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
ae90: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
aea0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
aeb0: 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ap);.}../*.** Th
aec0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
aed0: 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  alled to handle 
aee0: 61 6e 20 46 54 53 20 49 4e 53 45 52 54 20 63 6f  an FTS INSERT co
aef0: 6d 6d 61 6e 64 2e 20 49 6e 20 6f 74 68 65 72 20  mmand. In other 
af00: 77 6f 72 64 73 2c 0a 2a 2a 20 61 6e 20 49 4e 53  words,.** an INS
af10: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 66  ERT statement of
af20: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
af30: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
af40: 20 66 74 73 28 66 74 73 29 20 56 41 4c 55 45 53   fts(fts) VALUES
af50: 28 24 70 43 6d 64 29 0a 2a 2a 20 20 20 20 20 49  ($pCmd).**     I
af60: 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73 28 66  NSERT INTO fts(f
af70: 74 73 2c 20 72 61 6e 6b 29 20 56 41 4c 55 45 53  ts, rank) VALUES
af80: 28 24 70 43 6d 64 2c 20 24 70 56 61 6c 29 0a 2a  ($pCmd, $pVal).*
af90: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56  *.** Argument pV
afa0: 61 6c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  al is the value 
afb0: 61 73 73 69 67 6e 65 64 20 74 6f 20 63 6f 6c 75  assigned to colu
afc0: 6d 6e 20 22 66 74 73 22 20 62 79 20 74 68 65 20  mn "fts" by the 
afd0: 49 4e 53 45 52 54 20 0a 2a 2a 20 73 74 61 74 65  INSERT .** state
afe0: 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
aff0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
b000: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
b010: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
b020: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
b030: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
b040: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  rs..**.** The co
b050: 6d 6d 61 6e 64 73 20 69 6d 70 6c 65 6d 65 6e 74  mmands implement
b060: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
b070: 69 6f 6e 20 61 72 65 20 64 6f 63 75 6d 65 6e 74  ion are document
b080: 65 64 20 69 6e 20 74 68 65 20 22 53 70 65 63 69  ed in the "Speci
b090: 61 6c 0a 2a 2a 20 49 4e 53 45 52 54 20 44 69 72  al.** INSERT Dir
b0a0: 65 63 74 69 76 65 73 22 20 73 65 63 74 69 6f 6e  ectives" section
b0b0: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
b0c0: 61 74 69 6f 6e 2e 20 49 74 20 73 68 6f 75 6c 64  ation. It should
b0d0: 20 62 65 20 75 70 64 61 74 65 64 20 69 66 0a 2a   be updated if.*
b0e0: 2a 20 6d 6f 72 65 20 63 6f 6d 6d 61 6e 64 73 20  * more commands 
b0f0: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 69  are added to thi
b100: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
b110: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 70  tatic int fts5Sp
b120: 65 63 69 61 6c 49 6e 73 65 72 74 28 0a 20 20 46  ecialInsert(.  F
b130: 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts5Table *pTab, 
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b150: 2a 20 46 74 73 35 20 74 61 62 6c 65 20 6f 62 6a  * Fts5 table obj
b160: 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
b170: 68 61 72 20 2a 7a 43 6d 64 2c 20 20 20 20 20 20  har *zCmd,      
b180: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
b190: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
b1a0: 61 62 6c 65 2d 6e 61 6d 65 20 63 6f 6c 75 6d 6e  able-name column
b1b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
b1c0: 6c 75 65 20 2a 70 56 61 6c 20 20 20 20 20 20 20  lue *pVal       
b1d0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 69        /* Value i
b1e0: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 72 61 6e  nserted into ran
b1f0: 6b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  k column */.){. 
b200: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
b210: 6e 66 69 67 20 3d 20 70 54 61 62 2d 3e 70 43 6f  nfig = pTab->pCo
b220: 6e 66 69 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nfig;.  int rc =
b230: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
b240: 74 20 62 45 72 72 6f 72 20 3d 20 30 3b 0a 0a 20  t bError = 0;.. 
b250: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
b260: 73 74 72 69 63 6d 70 28 22 64 65 6c 65 74 65 2d  stricmp("delete-
b270: 61 6c 6c 22 2c 20 7a 43 6d 64 29 20 29 7b 0a 20  all", zCmd) ){. 
b280: 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
b290: 65 43 6f 6e 74 65 6e 74 3d 3d 46 54 53 35 5f 43  eContent==FTS5_C
b2a0: 4f 4e 54 45 4e 54 5f 4e 4f 52 4d 41 4c 20 29 7b  ONTENT_NORMAL ){
b2b0: 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 56 74  .      fts5SetVt
b2c0: 61 62 45 72 72 6f 72 28 70 54 61 62 2c 20 0a 20  abError(pTab, . 
b2d0: 20 20 20 20 20 20 20 20 20 22 27 64 65 6c 65 74           "'delet
b2e0: 65 2d 61 6c 6c 27 20 6d 61 79 20 6f 6e 6c 79 20  e-all' may only 
b2f0: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 20 22  be used with a "
b300: 0a 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 74  .          "cont
b310: 65 6e 74 6c 65 73 73 20 6f 72 20 65 78 74 65 72  entless or exter
b320: 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 66 74 73 35  nal content fts5
b330: 20 74 61 62 6c 65 22 0a 20 20 20 20 20 20 29 3b   table".      );
b340: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
b350: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  TE_ERROR;.    }e
b360: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
b370: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
b380: 67 65 44 65 6c 65 74 65 41 6c 6c 28 70 54 61 62  geDeleteAll(pTab
b390: 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a 20 20 20  ->pStorage);.   
b3a0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30   }.  }else if( 0
b3b0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
b3c0: 70 28 22 72 65 62 75 69 6c 64 22 2c 20 7a 43 6d  p("rebuild", zCm
b3d0: 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  d) ){.    if( pC
b3e0: 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 3d  onfig->eContent=
b3f0: 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f  =FTS5_CONTENT_NO
b400: 4e 45 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  NE ){.      fts5
b410: 53 65 74 56 74 61 62 45 72 72 6f 72 28 70 54 61  SetVtabError(pTa
b420: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 27  b, .          "'
b430: 72 65 62 75 69 6c 64 27 20 6d 61 79 20 6e 6f 74  rebuild' may not
b440: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 20   be used with a 
b450: 63 6f 6e 74 65 6e 74 6c 65 73 73 20 66 74 73 35  contentless fts5
b460: 20 74 61 62 6c 65 22 0a 20 20 20 20 20 20 29 3b   table".      );
b470: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
b480: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  TE_ERROR;.    }e
b490: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
b4a0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
b4b0: 67 65 52 65 62 75 69 6c 64 28 70 54 61 62 2d 3e  geRebuild(pTab->
b4c0: 70 53 74 6f 72 61 67 65 29 3b 0a 20 20 20 20 7d  pStorage);.    }
b4d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d  .  }else if( 0==
b4e0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
b4f0: 22 6f 70 74 69 6d 69 7a 65 22 2c 20 7a 43 6d 64  "optimize", zCmd
b500: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
b510: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
b520: 4f 70 74 69 6d 69 7a 65 28 70 54 61 62 2d 3e 70  Optimize(pTab->p
b530: 53 74 6f 72 61 67 65 29 3b 0a 20 20 7d 65 6c 73  Storage);.  }els
b540: 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
b550: 5f 73 74 72 69 63 6d 70 28 22 6d 65 72 67 65 22  _stricmp("merge"
b560: 2c 20 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 69  , zCmd) ){.    i
b570: 6e 74 20 6e 4d 65 72 67 65 20 3d 20 73 71 6c 69  nt nMerge = sqli
b580: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56  te3_value_int(pV
b590: 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al);.    rc = sq
b5a0: 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
b5b0: 4d 65 72 67 65 28 70 54 61 62 2d 3e 70 53 74 6f  Merge(pTab->pSto
b5c0: 72 61 67 65 2c 20 6e 4d 65 72 67 65 29 3b 0a 20  rage, nMerge);. 
b5d0: 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71   }else if( 0==sq
b5e0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 69  lite3_stricmp("i
b5f0: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22 2c  ntegrity-check",
b600: 20 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 72 63   zCmd) ){.    rc
b610: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74   = sqlite3Fts5St
b620: 6f 72 61 67 65 49 6e 74 65 67 72 69 74 79 28 70  orageIntegrity(p
b630: 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a  Tab->pStorage);.
b640: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b650: 42 55 47 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  BUG.  }else if( 
b660: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
b670: 6d 70 28 22 70 72 65 66 69 78 2d 69 6e 64 65 78  mp("prefix-index
b680: 22 2c 20 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20  ", zCmd) ){.    
b690: 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69 78  pConfig->bPrefix
b6a0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  Index = sqlite3_
b6b0: 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3b  value_int(pVal);
b6c0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
b6d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b6e0: 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f  3Fts5IndexLoadCo
b6f0: 6e 66 69 67 28 70 54 61 62 2d 3e 70 49 6e 64 65  nfig(pTab->pInde
b700: 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  x);.    if( rc==
b710: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b720: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
b730: 74 73 35 43 6f 6e 66 69 67 53 65 74 56 61 6c 75  ts5ConfigSetValu
b740: 65 28 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2c  e(pTab->pConfig,
b750: 20 7a 43 6d 64 2c 20 70 56 61 6c 2c 20 26 62 45   zCmd, pVal, &bE
b760: 72 72 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rror);.    }.   
b770: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b780: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
b790: 62 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  bError ){.      
b7a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
b7b0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
b7c0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
b7d0: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
b7e0: 65 43 6f 6e 66 69 67 56 61 6c 75 65 28 70 54 61  eConfigValue(pTa
b7f0: 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 7a 43 6d  b->pStorage, zCm
b800: 64 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  d, pVal, 0);.   
b810: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
b820: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
b830: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 70  tatic int fts5Sp
b840: 65 63 69 61 6c 44 65 6c 65 74 65 28 0a 20 20 46  ecialDelete(.  F
b850: 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts5Table *pTab, 
b860: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b870: 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 69 6e   **apVal.){.  in
b880: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b890: 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 31 20 3d  ;.  int eType1 =
b8a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
b8b0: 79 70 65 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ype(apVal[1]);. 
b8c0: 20 69 66 28 20 65 54 79 70 65 31 3d 3d 53 51 4c   if( eType1==SQL
b8d0: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
b8e0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
b8f0: 20 69 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iDel = sqlite3_
b900: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61  value_int64(apVa
b910: 6c 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  l[1]);.    rc = 
b920: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
b930: 67 65 44 65 6c 65 74 65 28 70 54 61 62 2d 3e 70  geDelete(pTab->p
b940: 53 74 6f 72 61 67 65 2c 20 69 44 65 6c 2c 20 26  Storage, iDel, &
b950: 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 7d 0a 20  apVal[2]);.  }. 
b960: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
b970: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
b980: 74 6f 72 61 67 65 49 6e 73 65 72 74 28 0a 20 20  torageInsert(.  
b990: 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73  int *pRc, .  Fts
b9a0: 35 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 0a 20  5Table *pTab, . 
b9b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b9c0: 2a 61 70 56 61 6c 2c 20 0a 20 20 69 36 34 20 2a  *apVal, .  i64 *
b9d0: 70 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74  piRowid.){.  int
b9e0: 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69 66   rc = *pRc;.  if
b9f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ba00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
ba10: 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 43 6f  te3Fts5StorageCo
ba20: 6e 74 65 6e 74 49 6e 73 65 72 74 28 70 54 61 62  ntentInsert(pTab
ba30: 2d 3e 70 53 74 6f 72 61 67 65 2c 20 61 70 56 61  ->pStorage, apVa
ba40: 6c 2c 20 70 69 52 6f 77 69 64 29 3b 0a 20 20 7d  l, piRowid);.  }
ba50: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ba60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
ba70: 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72   sqlite3Fts5Stor
ba80: 61 67 65 49 6e 64 65 78 49 6e 73 65 72 74 28 70  ageIndexInsert(p
ba90: 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 61  Tab->pStorage, a
baa0: 70 56 61 6c 2c 20 2a 70 69 52 6f 77 69 64 29 3b  pVal, *piRowid);
bab0: 0a 20 20 7d 0a 20 20 2a 70 52 63 20 3d 20 72 63  .  }.  *pRc = rc
bac0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
bad0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
bae0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
baf0: 6f 66 20 74 68 65 20 78 55 70 64 61 74 65 20 63  of the xUpdate c
bb00: 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
bb10: 0a 2a 2a 20 46 54 53 33 20 76 69 72 74 75 61 6c  .** FTS3 virtual
bb20: 20 74 61 62 6c 65 73 2e 20 49 74 20 69 73 20 69   tables. It is i
bb30: 6e 76 6f 6b 65 64 20 62 79 20 53 51 4c 69 74 65  nvoked by SQLite
bb40: 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
bb50: 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 73   is to be.** ins
bb60: 65 72 74 65 64 2c 20 75 70 64 61 74 65 64 20 6f  erted, updated o
bb70: 72 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  r deleted..**.**
bb80: 20 41 20 64 65 6c 65 74 65 20 73 70 65 63 69 66   A delete specif
bb90: 69 65 73 20 61 20 73 69 6e 67 6c 65 20 61 72 67  ies a single arg
bba0: 75 6d 65 6e 74 20 2d 20 74 68 65 20 72 6f 77 69  ument - the rowi
bbb0: 64 20 6f 66 20 74 68 65 20 72 6f 77 20 74 6f 20  d of the row to 
bbc0: 72 65 6d 6f 76 65 2e 0a 2a 2a 20 0a 2a 2a 20 55  remove..** .** U
bbd0: 70 64 61 74 65 20 61 6e 64 20 69 6e 73 65 72 74  pdate and insert
bbe0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 70 61 73 73   operations pass
bbf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65  :.**.**   1. The
bc00: 20 22 6f 6c 64 22 20 72 6f 77 69 64 2c 20 6f 72   "old" rowid, or
bc10: 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 32 2e 20 54   NULL..**   2. T
bc20: 68 65 20 22 6e 65 77 22 20 72 6f 77 69 64 2e 0a  he "new" rowid..
bc30: 2a 2a 20 20 20 33 2e 20 56 61 6c 75 65 73 20 66  **   3. Values f
bc40: 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e  or each of the n
bc50: 43 6f 6c 20 6d 61 74 63 68 61 62 6c 65 20 63 6f  Col matchable co
bc60: 6c 75 6d 6e 73 2e 0a 2a 2a 20 20 20 34 2e 20 56  lumns..**   4. V
bc70: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 74 77  alues for the tw
bc80: 6f 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73  o hidden columns
bc90: 20 28 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 61 6e   (<tablename> an
bca0: 64 20 22 72 61 6e 6b 22 29 2e 0a 2a 2f 0a 73 74  d "rank")..*/.st
bcb0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 55 70 64  atic int fts5Upd
bcc0: 61 74 65 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c  ateMethod(.  sql
bcd0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
bce0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
bcf0: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
bd00: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ndle */.  int nA
bd10: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
bd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
bd30: 65 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 61 72  e of argument ar
bd40: 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ray */.  sqlite3
bd50: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20  _value **apVal, 
bd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
bd70: 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  y of arguments *
bd80: 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
bd90: 20 2a 70 52 6f 77 69 64 20 20 20 20 20 20 20 20   *pRowid        
bda0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20      /* OUT: The 
bdb0: 61 66 66 65 63 74 65 64 20 28 6f 72 20 65 66 66  affected (or eff
bdc0: 65 63 74 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a  ected) rowid */.
bdd0: 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a  ){.  Fts5Table *
bde0: 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c  pTab = (Fts5Tabl
bdf0: 65 2a 29 70 56 74 61 62 3b 0a 20 20 46 74 73 35  e*)pVtab;.  Fts5
be00: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
be10: 3d 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 3b  = pTab->pConfig;
be20: 0a 20 20 69 6e 74 20 65 54 79 70 65 30 3b 20 20  .  int eType0;  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 2f 2a 20 76 61 6c 75 65 5f 74 79 70 65     /* value_type
be50: 28 29 20 6f 66 20 61 70 56 61 6c 5b 30 5d 20 2a  () of apVal[0] *
be60: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
be70: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
be80: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
be90: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 74 72  de */..  /* A tr
bea0: 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
beb0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
bec0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20   is called. */. 
bed0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 74   assert( pTab->t
bee0: 73 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 0a  s.eState==1 );..
bef0: 20 20 61 73 73 65 72 74 28 20 70 56 74 61 62 2d    assert( pVtab-
bf00: 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20  >zErrMsg==0 );. 
bf10: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
bf20: 20 7c 7c 20 6e 41 72 67 3d 3d 28 32 2b 70 43 6f   || nArg==(2+pCo
bf30: 6e 66 69 67 2d 3e 6e 43 6f 6c 2b 32 29 20 29 3b  nfig->nCol+2) );
bf40: 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d  .  assert( nArg=
bf50: 3d 31 20 0a 20 20 20 20 20 20 7c 7c 20 73 71 6c  =1 .      || sql
bf60: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
bf70: 61 70 56 61 6c 5b 31 5d 29 3d 3d 53 51 4c 49 54  apVal[1])==SQLIT
bf80: 45 5f 49 4e 54 45 47 45 52 20 0a 20 20 20 20 20  E_INTEGER .     
bf90: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   || sqlite3_valu
bfa0: 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d 29  e_type(apVal[1])
bfb0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20  ==SQLITE_NULL . 
bfc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
bfd0: 61 62 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 7a 45  ab->pConfig->pzE
bfe0: 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 70 54  rrmsg==0 );.  pT
bff0: 61 62 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 7a 45  ab->pConfig->pzE
c000: 72 72 6d 73 67 20 3d 20 26 70 54 61 62 2d 3e 62  rrmsg = &pTab->b
c010: 61 73 65 2e 7a 45 72 72 4d 73 67 3b 0a 0a 20 20  ase.zErrMsg;..  
c020: 2f 2a 20 50 75 74 20 61 6e 79 20 61 63 74 69 76  /* Put any activ
c030: 65 20 63 75 72 73 6f 72 73 20 69 6e 74 6f 20 52  e cursors into R
c040: 45 51 55 49 52 45 5f 53 45 45 4b 20 73 74 61 74  EQUIRE_SEEK stat
c050: 65 2e 20 2a 2f 0a 20 20 66 74 73 35 54 72 69 70  e. */.  fts5Trip
c060: 43 75 72 73 6f 72 73 28 70 54 61 62 29 3b 0a 0a  Cursors(pTab);..
c070: 20 20 65 54 79 70 65 30 20 3d 20 73 71 6c 69 74    eType0 = sqlit
c080: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
c090: 56 61 6c 5b 30 5d 29 3b 0a 20 20 69 66 28 20 65  Val[0]);.  if( e
c0a0: 54 79 70 65 30 3d 3d 53 51 4c 49 54 45 5f 4e 55  Type0==SQLITE_NU
c0b0: 4c 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  LL .   && sqlite
c0c0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
c0d0: 61 6c 5b 32 2b 70 43 6f 6e 66 69 67 2d 3e 6e 43  al[2+pConfig->nC
c0e0: 6f 6c 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  ol])!=SQLITE_NUL
c0f0: 4c 20 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 41  L .  ){.    /* A
c100: 20 22 73 70 65 63 69 61 6c 22 20 49 4e 53 45 52   "special" INSER
c110: 54 20 6f 70 2e 20 54 68 65 73 65 20 61 72 65 20  T op. These are 
c120: 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
c130: 6c 79 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ly. */.    const
c140: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
c150: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
c160: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
c170: 5b 32 2b 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  [2+pConfig->nCol
c180: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ]);.    if( pCon
c190: 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 21 3d 46  fig->eContent!=F
c1a0: 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f 52 4d  TS5_CONTENT_NORM
c1b0: 41 4c 20 0a 20 20 20 20 20 20 26 26 20 30 3d 3d  AL .      && 0==
c1c0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
c1d0: 22 64 65 6c 65 74 65 22 2c 20 7a 29 20 0a 20 20  "delete", z) .  
c1e0: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
c1f0: 66 74 73 35 53 70 65 63 69 61 6c 44 65 6c 65 74  fts5SpecialDelet
c200: 65 28 70 54 61 62 2c 20 61 70 56 61 6c 29 3b 0a  e(pTab, apVal);.
c210: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c220: 20 72 63 20 3d 20 66 74 73 35 53 70 65 63 69 61   rc = fts5Specia
c230: 6c 49 6e 73 65 72 74 28 70 54 61 62 2c 20 7a 2c  lInsert(pTab, z,
c240: 20 61 70 56 61 6c 5b 32 20 2b 20 70 43 6f 6e 66   apVal[2 + pConf
c250: 69 67 2d 3e 6e 43 6f 6c 20 2b 20 31 5d 29 3b 0a  ig->nCol + 1]);.
c260: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c270: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
c280: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
c290: 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
c2a0: 6e 74 2e 20 54 68 65 20 74 72 69 63 6b 20 68 65  nt. The trick he
c2b0: 72 65 20 69 73 20 74 68 61 74 0a 20 20 20 20 2a  re is that.    *
c2c0: 2a 20 61 6e 79 20 63 6f 6e 66 6c 69 63 74 20 6f  * any conflict o
c2d0: 6e 20 74 68 65 20 72 6f 77 69 64 20 76 61 6c 75  n the rowid valu
c2e0: 65 20 6d 75 73 74 20 62 65 20 64 65 74 65 63 74  e must be detect
c2f0: 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 0a 20  ed before any . 
c300: 20 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69     ** modificati
c310: 6f 6e 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ons are made to 
c320: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c330: 65 2e 20 54 68 65 72 65 20 61 72 65 20 34 20 63  e. There are 4 c
c340: 61 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ases:.    **.   
c350: 20 2a 2a 20 20 20 31 29 20 44 45 4c 45 54 45 0a   **   1) DELETE.
c360: 20 20 20 20 2a 2a 20 20 20 32 29 20 55 50 44 41      **   2) UPDA
c370: 54 45 20 28 72 6f 77 69 64 20 6e 6f 74 20 6d 6f  TE (rowid not mo
c380: 64 69 66 69 65 64 29 0a 20 20 20 20 2a 2a 20 20  dified).    **  
c390: 20 33 29 20 55 50 44 41 54 45 20 28 72 6f 77 69   3) UPDATE (rowi
c3a0: 64 20 6d 6f 64 69 66 69 65 64 29 0a 20 20 20 20  d modified).    
c3b0: 2a 2a 20 20 20 34 29 20 49 4e 53 45 52 54 0a 20  **   4) INSERT. 
c3c0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73     **.    ** Cas
c3d0: 65 73 20 33 20 61 6e 64 20 34 20 6d 61 79 20 76  es 3 and 4 may v
c3e0: 69 6f 6c 61 74 65 20 74 68 65 20 72 6f 77 69 64  iolate the rowid
c3f0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20   constraint..   
c400: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 43 6f 6e   */.    int eCon
c410: 66 6c 69 63 74 20 3d 20 53 51 4c 49 54 45 5f 41  flict = SQLITE_A
c420: 42 4f 52 54 3b 0a 20 20 20 20 69 66 28 20 70 43  BORT;.    if( pC
c430: 6f 6e 66 69 67 2d 3e 65 43 6f 6e 74 65 6e 74 3d  onfig->eContent=
c440: 3d 46 54 53 35 5f 43 4f 4e 54 45 4e 54 5f 4e 4f  =FTS5_CONTENT_NO
c450: 52 4d 41 4c 20 29 7b 0a 20 20 20 20 20 20 65 43  RMAL ){.      eC
c460: 6f 6e 66 6c 69 63 74 20 3d 20 73 71 6c 69 74 65  onflict = sqlite
c470: 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69  3_vtab_on_confli
c480: 63 74 28 70 43 6f 6e 66 69 67 2d 3e 64 62 29 3b  ct(pConfig->db);
c490: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
c4a0: 72 74 28 20 65 54 79 70 65 30 3d 3d 53 51 4c 49  rt( eType0==SQLI
c4b0: 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65 54  TE_INTEGER || eT
c4c0: 79 70 65 30 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  ype0==SQLITE_NUL
c4d0: 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  L );.    assert(
c4e0: 20 6e 41 72 67 21 3d 31 20 7c 7c 20 65 54 79 70   nArg!=1 || eTyp
c4f0: 65 30 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  e0==SQLITE_INTEG
c500: 45 52 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  ER );..    /* Fi
c510: 6c 74 65 72 20 6f 75 74 20 61 74 74 65 6d 70 74  lter out attempt
c520: 73 20 74 6f 20 72 75 6e 20 55 50 44 41 54 45 20  s to run UPDATE 
c530: 6f 72 20 44 45 4c 45 54 45 20 6f 6e 20 63 6f 6e  or DELETE on con
c540: 74 65 6e 74 6c 65 73 73 20 74 61 62 6c 65 73 2e  tentless tables.
c550: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
c560: 6e 6f 74 20 73 75 70 6f 72 74 65 64 2e 20 20 2a  not suported.  *
c570: 2f 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 30  /.    if( eType0
c580: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
c590: 20 26 26 20 66 74 73 35 49 73 43 6f 6e 74 65 6e   && fts5IsConten
c5a0: 74 6c 65 73 73 28 70 54 61 62 29 20 29 7b 0a 20  tless(pTab) ){. 
c5b0: 20 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e       pTab->base.
c5c0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
c5d0: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
c5e0: 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 25 73 20       "cannot %s 
c5f0: 63 6f 6e 74 65 6e 74 6c 65 73 73 20 66 74 73 35  contentless fts5
c600: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 0a 20 20   table: %s", .  
c610: 20 20 20 20 20 20 20 20 28 6e 41 72 67 3e 31 20          (nArg>1 
c620: 3f 20 22 55 50 44 41 54 45 22 20 3a 20 22 44 45  ? "UPDATE" : "DE
c630: 4c 45 54 45 20 66 72 6f 6d 22 29 2c 20 70 43 6f  LETE from"), pCo
c640: 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
c650: 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20    );.      rc = 
c660: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
c670: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 45 4c 45    }..    /* DELE
c680: 54 45 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  TE */.    else i
c690: 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  f( nArg==1 ){.  
c6a0: 20 20 20 20 69 36 34 20 69 44 65 6c 20 3d 20 73      i64 iDel = s
c6b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
c6c0: 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 20 20 2f  64(apVal[0]);  /
c6d0: 2a 20 52 6f 77 69 64 20 74 6f 20 64 65 6c 65 74  * Rowid to delet
c6e0: 65 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  e */.      rc = 
c6f0: 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61  sqlite3Fts5Stora
c700: 67 65 44 65 6c 65 74 65 28 70 54 61 62 2d 3e 70  geDelete(pTab->p
c710: 53 74 6f 72 61 67 65 2c 20 69 44 65 6c 2c 20 30  Storage, iDel, 0
c720: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c730: 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 20 20 65   INSERT */.    e
c740: 6c 73 65 20 69 66 28 20 65 54 79 70 65 30 21 3d  lse if( eType0!=
c750: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
c760: 7b 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  {     .      /* 
c770: 49 66 20 74 68 69 73 20 69 73 20 61 20 52 45 50  If this is a REP
c780: 4c 41 43 45 2c 20 66 69 72 73 74 20 72 65 6d 6f  LACE, first remo
c790: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  ve the current e
c7a0: 6e 74 72 79 20 28 69 66 20 61 6e 79 29 20 2a 2f  ntry (if any) */
c7b0: 0a 20 20 20 20 20 20 69 66 28 20 65 43 6f 6e 66  .      if( eConf
c7c0: 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f 52 45 50  lict==SQLITE_REP
c7d0: 4c 41 43 45 20 0a 20 20 20 20 20 20 20 26 26 20  LACE .       && 
c7e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
c7f0: 70 65 28 61 70 56 61 6c 5b 31 5d 29 3d 3d 53 51  pe(apVal[1])==SQ
c800: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 0a 20 20  LITE_INTEGER .  
c810: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
c820: 36 34 20 69 4e 65 77 20 3d 20 73 71 6c 69 74 65  64 iNew = sqlite
c830: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
c840: 56 61 6c 5b 31 5d 29 3b 20 20 2f 2a 20 52 6f 77  Val[1]);  /* Row
c850: 69 64 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  id to delete */.
c860: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c870: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 44  ite3Fts5StorageD
c880: 65 6c 65 74 65 28 70 54 61 62 2d 3e 70 53 74 6f  elete(pTab->pSto
c890: 72 61 67 65 2c 20 69 4e 65 77 2c 20 30 29 3b 0a  rage, iNew, 0);.
c8a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
c8b0: 73 35 53 74 6f 72 61 67 65 49 6e 73 65 72 74 28  s5StorageInsert(
c8c0: 26 72 63 2c 20 70 54 61 62 2c 20 61 70 56 61 6c  &rc, pTab, apVal
c8d0: 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , pRowid);.    }
c8e0: 0a 0a 20 20 20 20 2f 2a 20 55 50 44 41 54 45 20  ..    /* UPDATE 
c8f0: 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
c900: 20 20 20 69 36 34 20 69 4f 6c 64 20 3d 20 73 71     i64 iOld = sq
c910: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
c920: 34 28 61 70 56 61 6c 5b 30 5d 29 3b 20 20 2f 2a  4(apVal[0]);  /*
c930: 20 4f 6c 64 20 72 6f 77 69 64 20 2a 2f 0a 20 20   Old rowid */.  
c940: 20 20 20 20 69 36 34 20 69 4e 65 77 20 3d 20 73      i64 iNew = s
c950: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
c960: 36 34 28 61 70 56 61 6c 5b 31 5d 29 3b 20 20 2f  64(apVal[1]);  /
c970: 2a 20 4e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20  * New rowid */. 
c980: 20 20 20 20 20 69 66 28 20 69 4f 6c 64 21 3d 69       if( iOld!=i
c990: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  New ){.        i
c9a0: 66 28 20 65 43 6f 6e 66 6c 69 63 74 3d 3d 53 51  f( eConflict==SQ
c9b0: 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a  LITE_REPLACE ){.
c9c0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
c9d0: 71 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67  qlite3Fts5Storag
c9e0: 65 44 65 6c 65 74 65 28 70 54 61 62 2d 3e 70 53  eDelete(pTab->pS
c9f0: 74 6f 72 61 67 65 2c 20 69 4f 6c 64 2c 20 30 29  torage, iOld, 0)
ca00: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ca10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ca20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
ca30: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53 74 6f  = sqlite3Fts5Sto
ca40: 72 61 67 65 44 65 6c 65 74 65 28 70 54 61 62 2d  rageDelete(pTab-
ca50: 3e 70 53 74 6f 72 61 67 65 2c 20 69 4e 65 77 2c  >pStorage, iNew,
ca60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
ca70: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
ca80: 74 6f 72 61 67 65 49 6e 73 65 72 74 28 26 72 63  torageInsert(&rc
ca90: 2c 20 70 54 61 62 2c 20 61 70 56 61 6c 2c 20 70  , pTab, apVal, p
caa0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
cab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
cac0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
cad0: 35 53 74 6f 72 61 67 65 43 6f 6e 74 65 6e 74 49  5StorageContentI
cae0: 6e 73 65 72 74 28 70 54 61 62 2d 3e 70 53 74 6f  nsert(pTab->pSto
caf0: 72 61 67 65 2c 20 61 70 56 61 6c 2c 20 70 52 6f  rage, apVal, pRo
cb00: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
cb10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cb20: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
cb30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
cb40: 35 53 74 6f 72 61 67 65 44 65 6c 65 74 65 28 70  5StorageDelete(p
cb50: 54 61 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69  Tab->pStorage, i
cb60: 4f 6c 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Old, 0);.       
cb70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
cb80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
cb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
cba0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
cbb0: 53 74 6f 72 61 67 65 49 6e 64 65 78 49 6e 73 65  StorageIndexInse
cbc0: 72 74 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67  rt(pTab->pStorag
cbd0: 65 2c 20 61 70 56 61 6c 2c 20 2a 70 52 6f 77 69  e, apVal, *pRowi
cbe0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
cbf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cc00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
cc10: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 53  c = sqlite3Fts5S
cc20: 74 6f 72 61 67 65 44 65 6c 65 74 65 28 70 54 61  torageDelete(pTa
cc30: 62 2d 3e 70 53 74 6f 72 61 67 65 2c 20 69 4f 6c  b->pStorage, iOl
cc40: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  d, 0);.        f
cc50: 74 73 35 53 74 6f 72 61 67 65 49 6e 73 65 72 74  ts5StorageInsert
cc60: 28 26 72 63 2c 20 70 54 61 62 2c 20 61 70 56 61  (&rc, pTab, apVa
cc70: 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  l, pRowid);.    
cc80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
cc90: 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 2d 3e   pTab->pConfig->
cca0: 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20 20  pzErrmsg = 0;.  
ccb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ccc0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
ccd0: 6f 6e 20 6f 66 20 78 53 79 6e 63 28 29 20 6d 65  on of xSync() me
cce0: 74 68 6f 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  thod. .*/.static
ccf0: 20 69 6e 74 20 66 74 73 35 53 79 6e 63 4d 65 74   int fts5SyncMet
cd00: 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
cd10: 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 6e 74 20   *pVtab){.  int 
cd20: 72 63 3b 0a 20 20 46 74 73 35 54 61 62 6c 65 20  rc;.  Fts5Table 
cd30: 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62  *pTab = (Fts5Tab
cd40: 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 66 74 73  le*)pVtab;.  fts
cd50: 35 43 68 65 63 6b 54 72 61 6e 73 61 63 74 69 6f  5CheckTransactio
cd60: 6e 53 74 61 74 65 28 70 54 61 62 2c 20 46 54 53  nState(pTab, FTS
cd70: 35 5f 53 59 4e 43 2c 20 30 29 3b 0a 20 20 70 54  5_SYNC, 0);.  pT
cd80: 61 62 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 7a 45  ab->pConfig->pzE
cd90: 72 72 6d 73 67 20 3d 20 26 70 54 61 62 2d 3e 62  rrmsg = &pTab->b
cda0: 61 73 65 2e 7a 45 72 72 4d 73 67 3b 0a 20 20 66  ase.zErrMsg;.  f
cdb0: 74 73 35 54 72 69 70 43 75 72 73 6f 72 73 28 70  ts5TripCursors(p
cdc0: 54 61 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Tab);.  rc = sql
cdd0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 53  ite3Fts5StorageS
cde0: 79 6e 63 28 70 54 61 62 2d 3e 70 53 74 6f 72 61  ync(pTab->pStora
cdf0: 67 65 29 3b 0a 20 20 70 54 61 62 2d 3e 70 43 6f  ge);.  pTab->pCo
ce00: 6e 66 69 67 2d 3e 70 7a 45 72 72 6d 73 67 20 3d  nfig->pzErrmsg =
ce10: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
ce20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
ce30: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 42 65 67  entation of xBeg
ce40: 69 6e 28 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2f  in() method. .*/
ce50: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
ce60: 42 65 67 69 6e 4d 65 74 68 6f 64 28 73 71 6c 69  BeginMethod(sqli
ce70: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
ce80: 7b 0a 20 20 66 74 73 35 43 68 65 63 6b 54 72 61  {.  fts5CheckTra
ce90: 6e 73 61 63 74 69 6f 6e 53 74 61 74 65 28 28 46  nsactionState((F
cea0: 74 73 35 54 61 62 6c 65 2a 29 70 56 74 61 62 2c  ts5Table*)pVtab,
ceb0: 20 46 54 53 35 5f 42 45 47 49 4e 2c 20 30 29 3b   FTS5_BEGIN, 0);
cec0: 0a 20 20 66 74 73 35 4e 65 77 54 72 61 6e 73 61  .  fts5NewTransa
ced0: 63 74 69 6f 6e 28 28 46 74 73 35 54 61 62 6c 65  ction((Fts5Table
cee0: 2a 29 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75  *)pVtab);.  retu
cef0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
cf00: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
cf10: 61 74 69 6f 6e 20 6f 66 20 78 43 6f 6d 6d 69 74  ation of xCommit
cf20: 28 29 20 6d 65 74 68 6f 64 2e 20 54 68 69 73 20  () method. This 
cf30: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
cf40: 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74  contents of.** t
cf50: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
cf60: 20 68 61 73 68 2d 74 61 62 6c 65 20 68 61 76 65   hash-table have
cf70: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 6c   already been fl
cf80: 75 73 68 65 64 20 69 6e 74 6f 20 74 68 65 20 64  ushed into the d
cf90: 61 74 61 62 61 73 65 0a 2a 2a 20 62 79 20 66 74  atabase.** by ft
cfa0: 73 35 53 79 6e 63 4d 65 74 68 6f 64 28 29 2e 0a  s5SyncMethod()..
cfb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
cfc0: 73 35 43 6f 6d 6d 69 74 4d 65 74 68 6f 64 28 73  s5CommitMethod(s
cfd0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
cfe0: 61 62 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ab){.  UNUSED_PA
cff0: 52 41 4d 28 70 56 74 61 62 29 3b 20 20 2f 2a 20  RAM(pVtab);  /* 
d000: 43 61 6c 6c 20 62 65 6c 6f 77 20 69 73 20 61 20  Call below is a 
d010: 6e 6f 2d 6f 70 20 66 6f 72 20 4e 44 45 42 55 47  no-op for NDEBUG
d020: 20 62 75 69 6c 64 73 20 2a 2f 0a 20 20 66 74 73   builds */.  fts
d030: 35 43 68 65 63 6b 54 72 61 6e 73 61 63 74 69 6f  5CheckTransactio
d040: 6e 53 74 61 74 65 28 28 46 74 73 35 54 61 62 6c  nState((Fts5Tabl
d050: 65 2a 29 70 56 74 61 62 2c 20 46 54 53 35 5f 43  e*)pVtab, FTS5_C
d060: 4f 4d 4d 49 54 2c 20 30 29 3b 0a 20 20 72 65 74  OMMIT, 0);.  ret
d070: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d080: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
d090: 74 61 74 69 6f 6e 20 6f 66 20 78 52 6f 6c 6c 62  tation of xRollb
d0a0: 61 63 6b 28 29 2e 20 44 69 73 63 61 72 64 20 74  ack(). Discard t
d0b0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
d0c0: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
d0d0: 0a 2a 2a 20 68 61 73 68 2d 74 61 62 6c 65 2e 20  .** hash-table. 
d0e0: 41 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  Any changes made
d0f0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d100: 20 61 72 65 20 72 65 76 65 72 74 65 64 20 62 79   are reverted by
d110: 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74   SQLite..*/.stat
d120: 69 63 20 69 6e 74 20 66 74 73 35 52 6f 6c 6c 62  ic int fts5Rollb
d130: 61 63 6b 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  ackMethod(sqlite
d140: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
d150: 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 74 73 35    int rc;.  Fts5
d160: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
d170: 74 73 35 54 61 62 6c 65 2a 29 70 56 74 61 62 3b  ts5Table*)pVtab;
d180: 0a 20 20 66 74 73 35 43 68 65 63 6b 54 72 61 6e  .  fts5CheckTran
d190: 73 61 63 74 69 6f 6e 53 74 61 74 65 28 70 54 61  sactionState(pTa
d1a0: 62 2c 20 46 54 53 35 5f 52 4f 4c 4c 42 41 43 4b  b, FTS5_ROLLBACK
d1b0: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
d1c0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
d1d0: 6f 6c 6c 62 61 63 6b 28 70 54 61 62 2d 3e 70 53  ollback(pTab->pS
d1e0: 74 6f 72 61 67 65 29 3b 0a 20 20 72 65 74 75 72  torage);.  retur
d1f0: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
d200: 69 6e 74 20 66 74 73 35 43 73 72 50 6f 73 6c 69  int fts5CsrPosli
d210: 73 74 28 46 74 73 35 43 75 72 73 6f 72 2a 2c 20  st(Fts5Cursor*, 
d220: 69 6e 74 2c 20 63 6f 6e 73 74 20 75 38 2a 2a 2c  int, const u8**,
d230: 20 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20   int*);..static 
d240: 76 6f 69 64 20 2a 66 74 73 35 41 70 69 55 73 65  void *fts5ApiUse
d250: 72 44 61 74 61 28 46 74 73 35 43 6f 6e 74 65 78  rData(Fts5Contex
d260: 74 20 2a 70 43 74 78 29 7b 0a 20 20 46 74 73 35  t *pCtx){.  Fts5
d270: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
d280: 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78  Fts5Cursor*)pCtx
d290: 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 73 72 2d  ;.  return pCsr-
d2a0: 3e 70 41 75 78 2d 3e 70 55 73 65 72 44 61 74 61  >pAux->pUserData
d2b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
d2c0: 66 74 73 35 41 70 69 43 6f 6c 75 6d 6e 43 6f 75  fts5ApiColumnCou
d2d0: 6e 74 28 46 74 73 35 43 6f 6e 74 65 78 74 20 2a  nt(Fts5Context *
d2e0: 70 43 74 78 29 7b 0a 20 20 46 74 73 35 43 75 72  pCtx){.  Fts5Cur
d2f0: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73  sor *pCsr = (Fts
d300: 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20  5Cursor*)pCtx;. 
d310: 20 72 65 74 75 72 6e 20 28 28 46 74 73 35 54 61   return ((Fts5Ta
d320: 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73 65  ble*)(pCsr->base
d330: 2e 70 56 74 61 62 29 29 2d 3e 70 43 6f 6e 66 69  .pVtab))->pConfi
d340: 67 2d 3e 6e 43 6f 6c 3b 0a 7d 0a 0a 73 74 61 74  g->nCol;.}..stat
d350: 69 63 20 69 6e 74 20 66 74 73 35 41 70 69 43 6f  ic int fts5ApiCo
d360: 6c 75 6d 6e 54 6f 74 61 6c 53 69 7a 65 28 0a 20  lumnTotalSize(. 
d370: 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43   Fts5Context *pC
d380: 74 78 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  tx, .  int iCol,
d390: 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   .  sqlite3_int6
d3a0: 34 20 2a 70 6e 54 6f 6b 65 6e 0a 29 7b 0a 20 20  4 *pnToken.){.  
d3b0: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
d3c0: 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29   = (Fts5Cursor*)
d3d0: 70 43 74 78 3b 0a 20 20 46 74 73 35 54 61 62 6c  pCtx;.  Fts5Tabl
d3e0: 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54  e *pTab = (Fts5T
d3f0: 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73  able*)(pCsr->bas
d400: 65 2e 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75  e.pVtab);.  retu
d410: 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  rn sqlite3Fts5St
d420: 6f 72 61 67 65 53 69 7a 65 28 70 54 61 62 2d 3e  orageSize(pTab->
d430: 70 53 74 6f 72 61 67 65 2c 20 69 43 6f 6c 2c 20  pStorage, iCol, 
d440: 70 6e 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a 73 74 61  pnToken);.}..sta
d450: 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 69 52  tic int fts5ApiR
d460: 6f 77 43 6f 75 6e 74 28 46 74 73 35 43 6f 6e 74  owCount(Fts5Cont
d470: 65 78 74 20 2a 70 43 74 78 2c 20 69 36 34 20 2a  ext *pCtx, i64 *
d480: 70 6e 52 6f 77 29 7b 0a 20 20 46 74 73 35 43 75  pnRow){.  Fts5Cu
d490: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
d4a0: 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a  s5Cursor*)pCtx;.
d4b0: 20 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61    Fts5Table *pTa
d4c0: 62 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29  b = (Fts5Table*)
d4d0: 28 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  (pCsr->base.pVta
d4e0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b);.  return sql
d4f0: 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65 52  ite3Fts5StorageR
d500: 6f 77 43 6f 75 6e 74 28 70 54 61 62 2d 3e 70 53  owCount(pTab->pS
d510: 74 6f 72 61 67 65 2c 20 70 6e 52 6f 77 29 3b 0a  torage, pnRow);.
d520: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
d530: 73 35 41 70 69 54 6f 6b 65 6e 69 7a 65 28 0a 20  s5ApiTokenize(. 
d540: 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43   Fts5Context *pC
d550: 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  tx, .  const cha
d560: 72 20 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54  r *pText, int nT
d570: 65 78 74 2c 20 0a 20 20 76 6f 69 64 20 2a 70 55  ext, .  void *pU
d580: 73 65 72 44 61 74 61 2c 0a 20 20 69 6e 74 20 28  serData,.  int (
d590: 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20  *xToken)(void*, 
d5a0: 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  int, const char*
d5b0: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29  , int, int, int)
d5c0: 0a 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72  .){.  Fts5Cursor
d5d0: 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43 75   *pCsr = (Fts5Cu
d5e0: 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46 74  rsor*)pCtx;.  Ft
d5f0: 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  s5Table *pTab = 
d600: 28 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73  (Fts5Table*)(pCs
d610: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 3b 0a  r->base.pVtab);.
d620: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d630: 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28 0a 20 20  Fts5Tokenize(.  
d640: 20 20 20 20 70 54 61 62 2d 3e 70 43 6f 6e 66 69      pTab->pConfi
d650: 67 2c 20 46 54 53 35 5f 54 4f 4b 45 4e 49 5a 45  g, FTS5_TOKENIZE
d660: 5f 41 55 58 2c 20 70 54 65 78 74 2c 20 6e 54 65  _AUX, pText, nTe
d670: 78 74 2c 20 70 55 73 65 72 44 61 74 61 2c 20 78  xt, pUserData, x
d680: 54 6f 6b 65 6e 0a 20 20 29 3b 0a 7d 0a 0a 73 74  Token.  );.}..st
d690: 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 69  atic int fts5Api
d6a0: 50 68 72 61 73 65 43 6f 75 6e 74 28 46 74 73 35  PhraseCount(Fts5
d6b0: 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  Context *pCtx){.
d6c0: 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43    Fts5Cursor *pC
d6d0: 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72  sr = (Fts5Cursor
d6e0: 2a 29 70 43 74 78 3b 0a 20 20 72 65 74 75 72 6e  *)pCtx;.  return
d6f0: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
d700: 50 68 72 61 73 65 43 6f 75 6e 74 28 70 43 73 72  PhraseCount(pCsr
d710: 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 73 74 61  ->pExpr);.}..sta
d720: 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 69 50  tic int fts5ApiP
d730: 68 72 61 73 65 53 69 7a 65 28 46 74 73 35 43 6f  hraseSize(Fts5Co
d740: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74  ntext *pCtx, int
d750: 20 69 50 68 72 61 73 65 29 7b 0a 20 20 46 74 73   iPhrase){.  Fts
d760: 35 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  5Cursor *pCsr = 
d770: 28 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74  (Fts5Cursor*)pCt
d780: 78 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  x;.  return sqli
d790: 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61 73  te3Fts5ExprPhras
d7a0: 65 53 69 7a 65 28 70 43 73 72 2d 3e 70 45 78 70  eSize(pCsr->pExp
d7b0: 72 2c 20 69 50 68 72 61 73 65 29 3b 0a 7d 0a 0a  r, iPhrase);.}..
d7c0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41  static int fts5A
d7d0: 70 69 43 6f 6c 75 6d 6e 54 65 78 74 28 0a 20 20  piColumnText(.  
d7e0: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
d7f0: 78 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20  x, .  int iCol, 
d800: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
d810: 70 7a 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 0a 29  pz, .  int *pn.)
d820: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d830: 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 43 75  ITE_OK;.  Fts5Cu
d840: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
d850: 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a  s5Cursor*)pCtx;.
d860: 20 20 69 66 28 20 66 74 73 35 49 73 43 6f 6e 74    if( fts5IsCont
d870: 65 6e 74 6c 65 73 73 28 28 46 74 73 35 54 61 62  entless((Fts5Tab
d880: 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e  le*)(pCsr->base.
d890: 70 56 74 61 62 29 29 20 29 7b 0a 20 20 20 20 2a  pVtab)) ){.    *
d8a0: 70 7a 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 20  pz = 0;.    *pn 
d8b0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
d8c0: 20 20 72 63 20 3d 20 66 74 73 35 53 65 65 6b 43    rc = fts5SeekC
d8d0: 75 72 73 6f 72 28 70 43 73 72 2c 20 30 29 3b 0a  ursor(pCsr, 0);.
d8e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d8f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
d900: 70 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  pz = (const char
d910: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
d920: 5f 74 65 78 74 28 70 43 73 72 2d 3e 70 53 74 6d  _text(pCsr->pStm
d930: 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  t, iCol+1);.    
d940: 20 20 2a 70 6e 20 3d 20 73 71 6c 69 74 65 33 5f    *pn = sqlite3_
d950: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 43 73  column_bytes(pCs
d960: 72 2d 3e 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31  r->pStmt, iCol+1
d970: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
d980: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
d990: 74 69 63 20 69 6e 74 20 66 74 73 35 43 73 72 50  tic int fts5CsrP
d9a0: 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 43 75  oslist(.  Fts5Cu
d9b0: 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 69  rsor *pCsr, .  i
d9c0: 6e 74 20 69 50 68 72 61 73 65 2c 20 0a 20 20 63  nt iPhrase, .  c
d9d0: 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 0a 20 20  onst u8 **pa,.  
d9e0: 69 6e 74 20 2a 70 6e 0a 29 7b 0a 20 20 46 74 73  int *pn.){.  Fts
d9f0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
da00: 20 3d 20 28 28 46 74 73 35 54 61 62 6c 65 2a 29   = ((Fts5Table*)
da10: 28 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  (pCsr->base.pVta
da20: 62 29 29 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  b))->pConfig;.  
da30: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
da40: 4f 4b 3b 0a 20 20 69 6e 74 20 62 4c 69 76 65 20  OK;.  int bLive 
da50: 3d 20 28 70 43 73 72 2d 3e 70 53 6f 72 74 65 72  = (pCsr->pSorter
da60: 3d 3d 30 29 3b 0a 0a 20 20 69 66 28 20 43 73 72  ==0);..  if( Csr
da70: 46 6c 61 67 54 65 73 74 28 70 43 73 72 2c 20 46  FlagTest(pCsr, F
da80: 54 53 35 43 53 52 5f 52 45 51 55 49 52 45 5f 50  TS5CSR_REQUIRE_P
da90: 4f 53 4c 49 53 54 29 20 29 7b 0a 0a 20 20 20 20  OSLIST) ){..    
daa0: 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65  if( pConfig->eDe
dab0: 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
dac0: 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  L_FULL ){.      
dad0: 46 74 73 35 50 6f 73 6c 69 73 74 50 6f 70 75 6c  Fts5PoslistPopul
dae0: 61 74 6f 72 20 2a 61 50 6f 70 75 6c 61 74 6f 72  ator *aPopulator
daf0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
db00: 20 20 20 20 20 61 50 6f 70 75 6c 61 74 6f 72 20       aPopulator 
db10: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  = sqlite3Fts5Exp
db20: 72 43 6c 65 61 72 50 6f 73 6c 69 73 74 73 28 70  rClearPoslists(p
db30: 43 73 72 2d 3e 70 45 78 70 72 2c 20 62 4c 69 76  Csr->pExpr, bLiv
db40: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 50  e);.      if( aP
db50: 6f 70 75 6c 61 74 6f 72 3d 3d 30 20 29 20 72 63  opulator==0 ) rc
db60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
db70: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
db80: 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20  i<pConfig->nCol 
db90: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
dba0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
dbb0: 69 6e 74 20 6e 3b 20 63 6f 6e 73 74 20 63 68 61  int n; const cha
dbc0: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 72 63  r *z;.        rc
dbd0: 20 3d 20 66 74 73 35 41 70 69 43 6f 6c 75 6d 6e   = fts5ApiColumn
dbe0: 54 65 78 74 28 28 46 74 73 35 43 6f 6e 74 65 78  Text((Fts5Contex
dbf0: 74 2a 29 70 43 73 72 2c 20 69 2c 20 26 7a 2c 20  t*)pCsr, i, &z, 
dc00: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  &n);.        if(
dc10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
dc20: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
dc30: 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70 72   sqlite3Fts5Expr
dc40: 50 6f 70 75 6c 61 74 65 50 6f 73 6c 69 73 74 73  PopulatePoslists
dc50: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
dc60: 70 43 6f 6e 66 69 67 2c 20 70 43 73 72 2d 3e 70  pConfig, pCsr->p
dc70: 45 78 70 72 2c 20 61 50 6f 70 75 6c 61 74 6f 72  Expr, aPopulator
dc80: 2c 20 69 2c 20 7a 2c 20 6e 0a 20 20 20 20 20 20  , i, z, n.      
dc90: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
dca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
dcb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 50 6f 70  qlite3_free(aPop
dcc0: 75 6c 61 74 6f 72 29 3b 0a 0a 20 20 20 20 20 20  ulator);..      
dcd0: 69 66 28 20 70 43 73 72 2d 3e 70 53 6f 72 74 65  if( pCsr->pSorte
dce0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
dcf0: 69 74 65 33 46 74 73 35 45 78 70 72 43 68 65 63  ite3Fts5ExprChec
dd00: 6b 50 6f 73 6c 69 73 74 73 28 70 43 73 72 2d 3e  kPoslists(pCsr->
dd10: 70 45 78 70 72 2c 20 70 43 73 72 2d 3e 70 53 6f  pExpr, pCsr->pSo
dd20: 72 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  rter->iRowid);. 
dd30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dd40: 20 43 73 72 46 6c 61 67 43 6c 65 61 72 28 70 43   CsrFlagClear(pC
dd50: 73 72 2c 20 46 54 53 35 43 53 52 5f 52 45 51 55  sr, FTS5CSR_REQU
dd60: 49 52 45 5f 50 4f 53 4c 49 53 54 29 3b 0a 20 20  IRE_POSLIST);.  
dd70: 7d 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70  }..  if( pCsr->p
dd80: 53 6f 72 74 65 72 20 26 26 20 70 43 6f 6e 66 69  Sorter && pConfi
dd90: 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
dda0: 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a  _DETAIL_FULL ){.
ddb0: 20 20 20 20 46 74 73 35 53 6f 72 74 65 72 20 2a      Fts5Sorter *
ddc0: 70 53 6f 72 74 65 72 20 3d 20 70 43 73 72 2d 3e  pSorter = pCsr->
ddd0: 70 53 6f 72 74 65 72 3b 0a 20 20 20 20 69 6e 74  pSorter;.    int
dde0: 20 69 31 20 3d 20 28 69 50 68 72 61 73 65 3d 3d   i1 = (iPhrase==
ddf0: 30 20 3f 20 30 20 3a 20 70 53 6f 72 74 65 72 2d  0 ? 0 : pSorter-
de00: 3e 61 49 64 78 5b 69 50 68 72 61 73 65 2d 31 5d  >aIdx[iPhrase-1]
de10: 29 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 53 6f  );.    *pn = pSo
de20: 72 74 65 72 2d 3e 61 49 64 78 5b 69 50 68 72 61  rter->aIdx[iPhra
de30: 73 65 5d 20 2d 20 69 31 3b 0a 20 20 20 20 2a 70  se] - i1;.    *p
de40: 61 20 3d 20 26 70 53 6f 72 74 65 72 2d 3e 61 50  a = &pSorter->aP
de50: 6f 73 6c 69 73 74 5b 69 31 5d 3b 0a 20 20 7d 65  oslist[i1];.  }e
de60: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 20 3d 20 73  lse{.    *pn = s
de70: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 6f  qlite3Fts5ExprPo
de80: 73 6c 69 73 74 28 70 43 73 72 2d 3e 70 45 78 70  slist(pCsr->pExp
de90: 72 2c 20 69 50 68 72 61 73 65 2c 20 70 61 29 3b  r, iPhrase, pa);
dea0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
deb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
dec0: 72 65 20 74 68 61 74 20 74 68 65 20 46 74 73 35  re that the Fts5
ded0: 43 75 72 73 6f 72 2e 6e 49 6e 73 74 43 6f 75 6e  Cursor.nInstCoun
dee0: 74 20 61 6e 64 20 61 49 6e 73 74 5b 5d 20 76 61  t and aInst[] va
def0: 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75  riables are popu
df00: 6c 61 74 65 64 0a 2a 2a 20 63 6f 72 72 65 63 74  lated.** correct
df10: 6c 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ly for the curre
df20: 6e 74 20 76 69 65 77 2e 20 52 65 74 75 72 6e 20  nt view. Return 
df30: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
df40: 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 0a 2a  cessful, or an.*
df50: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
df60: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
df70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
df80: 35 43 61 63 68 65 49 6e 73 74 41 72 72 61 79 28  5CacheInstArray(
df90: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
dfa0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
dfb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 50  LITE_OK;.  Fts5P
dfc0: 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 61 49  oslistReader *aI
dfd0: 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ter;       /* On
dfe0: 65 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 65  e iterator for e
dff0: 61 63 68 20 70 68 72 61 73 65 20 2a 2f 0a 20 20  ach phrase */.  
e000: 69 6e 74 20 6e 49 74 65 72 3b 20 20 20 20 20 20  int nIter;      
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 74 65  /* Number of ite
e030: 72 61 74 6f 72 73 2f 70 68 72 61 73 65 73 20 2a  rators/phrases *
e040: 2f 0a 20 20 0a 20 20 6e 49 74 65 72 20 3d 20 73  /.  .  nIter = s
e050: 71 6c 69 74 65 33 46 74 73 35 45 78 70 72 50 68  qlite3Fts5ExprPh
e060: 72 61 73 65 43 6f 75 6e 74 28 70 43 73 72 2d 3e  raseCount(pCsr->
e070: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 43  pExpr);.  if( pC
e080: 73 72 2d 3e 61 49 6e 73 74 49 74 65 72 3d 3d 30  sr->aInstIter==0
e090: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
e0a0: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 50  e = sizeof(Fts5P
e0b0: 6f 73 6c 69 73 74 52 65 61 64 65 72 29 20 2a 20  oslistReader) * 
e0c0: 6e 49 74 65 72 3b 0a 20 20 20 20 70 43 73 72 2d  nIter;.    pCsr-
e0d0: 3e 61 49 6e 73 74 49 74 65 72 20 3d 20 28 46 74  >aInstIter = (Ft
e0e0: 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 2a  s5PoslistReader*
e0f0: 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
e100: 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74  ocZero(&rc, nByt
e110: 65 29 3b 0a 20 20 7d 0a 20 20 61 49 74 65 72 20  e);.  }.  aIter 
e120: 3d 20 70 43 73 72 2d 3e 61 49 6e 73 74 49 74 65  = pCsr->aInstIte
e130: 72 3b 0a 0a 20 20 69 66 28 20 61 49 74 65 72 20  r;..  if( aIter 
e140: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 73 74  ){.    int nInst
e150: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e160: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 69       /* Number i
e170: 6e 73 74 61 6e 63 65 73 20 73 65 65 6e 20 73 6f  nstances seen so
e180: 20 66 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20   far */.    int 
e190: 69 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  i;..    /* Initi
e1a0: 61 6c 69 7a 65 20 61 6c 6c 20 69 74 65 72 61 74  alize all iterat
e1b0: 6f 72 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ors */.    for(i
e1c0: 3d 30 3b 20 69 3c 6e 49 74 65 72 20 26 26 20 72  =0; i<nIter && r
e1d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
e1e0: 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
e1f0: 75 38 20 2a 61 3b 0a 20 20 20 20 20 20 69 6e 74  u8 *a;.      int
e200: 20 6e 3b 20 0a 20 20 20 20 20 20 72 63 20 3d 20   n; .      rc = 
e210: 66 74 73 35 43 73 72 50 6f 73 6c 69 73 74 28 70  fts5CsrPoslist(p
e220: 43 73 72 2c 20 69 2c 20 26 61 2c 20 26 6e 29 3b  Csr, i, &a, &n);
e230: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
e240: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e250: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
e260: 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
e270: 28 61 2c 20 6e 2c 20 26 61 49 74 65 72 5b 69 5d  (a, n, &aIter[i]
e280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e290: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
e2a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e2b0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
e2c0: 20 20 20 20 20 69 6e 74 20 2a 61 49 6e 73 74 3b       int *aInst;
e2d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 42 65  .        int iBe
e2e0: 73 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  st = -1;.       
e2f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 74 65   for(i=0; i<nIte
e300: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
e310: 20 20 20 69 66 28 20 28 61 49 74 65 72 5b 69 5d     if( (aIter[i]
e320: 2e 62 45 6f 66 3d 3d 30 29 20 0a 20 20 20 20 20  .bEof==0) .     
e330: 20 20 20 20 20 20 20 20 20 26 26 20 28 69 42 65           && (iBe
e340: 73 74 3c 30 20 7c 7c 20 61 49 74 65 72 5b 69 5d  st<0 || aIter[i]
e350: 2e 69 50 6f 73 3c 61 49 74 65 72 5b 69 42 65 73  .iPos<aIter[iBes
e360: 74 5d 2e 69 50 6f 73 29 20 0a 20 20 20 20 20 20  t].iPos) .      
e370: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e380: 20 20 20 20 20 69 42 65 73 74 20 3d 20 69 3b 0a       iBest = i;.
e390: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
e3b0: 28 20 69 42 65 73 74 3c 30 20 29 20 62 72 65 61  ( iBest<0 ) brea
e3c0: 6b 3b 0a 0a 20 20 20 20 20 20 20 20 6e 49 6e 73  k;..        nIns
e3d0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t++;.        if(
e3e0: 20 6e 49 6e 73 74 3e 3d 70 43 73 72 2d 3e 6e 49   nInst>=pCsr->nI
e3f0: 6e 73 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  nstAlloc ){.    
e400: 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 49 6e 73        pCsr->nIns
e410: 74 41 6c 6c 6f 63 20 3d 20 70 43 73 72 2d 3e 6e  tAlloc = pCsr->n
e420: 49 6e 73 74 41 6c 6c 6f 63 20 3f 20 70 43 73 72  InstAlloc ? pCsr
e430: 2d 3e 6e 49 6e 73 74 41 6c 6c 6f 63 2a 32 20 3a  ->nInstAlloc*2 :
e440: 20 33 32 3b 0a 20 20 20 20 20 20 20 20 20 20 61   32;.          a
e450: 49 6e 73 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c  Inst = (int*)sql
e460: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
e470: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
e480: 2d 3e 61 49 6e 73 74 2c 20 70 43 73 72 2d 3e 6e  ->aInst, pCsr->n
e490: 49 6e 73 74 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  InstAlloc*sizeof
e4a0: 28 69 6e 74 29 2a 33 0a 20 20 20 20 20 20 20 20  (int)*3.        
e4b0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
e4c0: 20 20 20 69 66 28 20 61 49 6e 73 74 20 29 7b 0a     if( aInst ){.
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
e4e0: 2d 3e 61 49 6e 73 74 20 3d 20 61 49 6e 73 74 3b  ->aInst = aInst;
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e500: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
e510: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
e530: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
e540: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
e550: 20 20 20 61 49 6e 73 74 20 3d 20 26 70 43 73 72     aInst = &pCsr
e560: 2d 3e 61 49 6e 73 74 5b 33 20 2a 20 28 6e 49 6e  ->aInst[3 * (nIn
e570: 73 74 2d 31 29 5d 3b 0a 20 20 20 20 20 20 20 20  st-1)];.        
e580: 61 49 6e 73 74 5b 30 5d 20 3d 20 69 42 65 73 74  aInst[0] = iBest
e590: 3b 0a 20 20 20 20 20 20 20 20 61 49 6e 73 74 5b  ;.        aInst[
e5a0: 31 5d 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f  1] = FTS5_POS2CO
e5b0: 4c 55 4d 4e 28 61 49 74 65 72 5b 69 42 65 73 74  LUMN(aIter[iBest
e5c0: 5d 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  ].iPos);.       
e5d0: 20 61 49 6e 73 74 5b 32 5d 20 3d 20 46 54 53 35   aInst[2] = FTS5
e5e0: 5f 50 4f 53 32 4f 46 46 53 45 54 28 61 49 74 65  _POS2OFFSET(aIte
e5f0: 72 5b 69 42 65 73 74 5d 2e 69 50 6f 73 29 3b 0a  r[iBest].iPos);.
e600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
e610: 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
e620: 4e 65 78 74 28 26 61 49 74 65 72 5b 69 42 65 73  Next(&aIter[iBes
e630: 74 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t]);.      }.   
e640: 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 49   }..    pCsr->nI
e650: 6e 73 74 43 6f 75 6e 74 20 3d 20 6e 49 6e 73 74  nstCount = nInst
e660: 3b 0a 20 20 20 20 43 73 72 46 6c 61 67 43 6c 65  ;.    CsrFlagCle
e670: 61 72 28 70 43 73 72 2c 20 46 54 53 35 43 53 52  ar(pCsr, FTS5CSR
e680: 5f 52 45 51 55 49 52 45 5f 49 4e 53 54 29 3b 0a  _REQUIRE_INST);.
e690: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e6a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
e6b0: 74 73 35 41 70 69 49 6e 73 74 43 6f 75 6e 74 28  ts5ApiInstCount(
e6c0: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
e6d0: 78 2c 20 69 6e 74 20 2a 70 6e 49 6e 73 74 29 7b  x, int *pnInst){
e6e0: 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70  .  Fts5Cursor *p
e6f0: 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f  Csr = (Fts5Curso
e700: 72 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72  r*)pCtx;.  int r
e710: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e720: 20 69 66 28 20 43 73 72 46 6c 61 67 54 65 73 74   if( CsrFlagTest
e730: 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 52  (pCsr, FTS5CSR_R
e740: 45 51 55 49 52 45 5f 49 4e 53 54 29 3d 3d 30 20  EQUIRE_INST)==0 
e750: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
e760: 3d 3d 28 72 63 20 3d 20 66 74 73 35 43 61 63 68  ==(rc = fts5Cach
e770: 65 49 6e 73 74 41 72 72 61 79 28 70 43 73 72 29  eInstArray(pCsr)
e780: 29 20 29 7b 0a 20 20 20 20 2a 70 6e 49 6e 73 74  ) ){.    *pnInst
e790: 20 3d 20 70 43 73 72 2d 3e 6e 49 6e 73 74 43 6f   = pCsr->nInstCo
e7a0: 75 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  unt;.  }.  retur
e7b0: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
e7c0: 69 6e 74 20 66 74 73 35 41 70 69 49 6e 73 74 28  int fts5ApiInst(
e7d0: 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a  .  Fts5Context *
e7e0: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 69 49 64  pCtx, .  int iId
e7f0: 78 2c 20 0a 20 20 69 6e 74 20 2a 70 69 50 68 72  x, .  int *piPhr
e800: 61 73 65 2c 20 0a 20 20 69 6e 74 20 2a 70 69 43  ase, .  int *piC
e810: 6f 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69 4f 66  ol, .  int *piOf
e820: 66 0a 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f  f.){.  Fts5Curso
e830: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43  r *pCsr = (Fts5C
e840: 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 69  ursor*)pCtx;.  i
e850: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e860: 4b 3b 0a 20 20 69 66 28 20 43 73 72 46 6c 61 67  K;.  if( CsrFlag
e870: 54 65 73 74 28 70 43 73 72 2c 20 46 54 53 35 43  Test(pCsr, FTS5C
e880: 53 52 5f 52 45 51 55 49 52 45 5f 49 4e 53 54 29  SR_REQUIRE_INST)
e890: 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ==0 .   || SQLIT
e8a0: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 66 74 73 35  E_OK==(rc = fts5
e8b0: 43 61 63 68 65 49 6e 73 74 41 72 72 61 79 28 70  CacheInstArray(p
e8c0: 43 73 72 29 29 20 0a 20 20 29 7b 0a 20 20 20 20  Csr)) .  ){.    
e8d0: 69 66 28 20 69 49 64 78 3c 30 20 7c 7c 20 69 49  if( iIdx<0 || iI
e8e0: 64 78 3e 3d 70 43 73 72 2d 3e 6e 49 6e 73 74 43  dx>=pCsr->nInstC
e8f0: 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  ount ){.      rc
e900: 20 3d 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3b   = SQLITE_RANGE;
e910: 0a 23 69 66 20 30 0a 20 20 20 20 7d 65 6c 73 65  .#if 0.    }else
e920: 20 69 66 28 20 66 74 73 35 49 73 4f 66 66 73 65   if( fts5IsOffse
e930: 74 6c 65 73 73 28 28 46 74 73 35 54 61 62 6c 65  tless((Fts5Table
e940: 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  *)pCsr->base.pVt
e950: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 69  ab) ){.      *pi
e960: 50 68 72 61 73 65 20 3d 20 70 43 73 72 2d 3e 61  Phrase = pCsr->a
e970: 49 6e 73 74 5b 69 49 64 78 2a 33 5d 3b 0a 20 20  Inst[iIdx*3];.  
e980: 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 70 43 73      *piCol = pCs
e990: 72 2d 3e 61 49 6e 73 74 5b 69 49 64 78 2a 33 20  r->aInst[iIdx*3 
e9a0: 2b 20 32 5d 3b 0a 20 20 20 20 20 20 2a 70 69 4f  + 2];.      *piO
e9b0: 66 66 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a  ff = -1;.#endif.
e9c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e9d0: 20 2a 70 69 50 68 72 61 73 65 20 3d 20 70 43 73   *piPhrase = pCs
e9e0: 72 2d 3e 61 49 6e 73 74 5b 69 49 64 78 2a 33 5d  r->aInst[iIdx*3]
e9f0: 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d  ;.      *piCol =
ea00: 20 70 43 73 72 2d 3e 61 49 6e 73 74 5b 69 49 64   pCsr->aInst[iId
ea10: 78 2a 33 20 2b 20 31 5d 3b 0a 20 20 20 20 20 20  x*3 + 1];.      
ea20: 2a 70 69 4f 66 66 20 3d 20 70 43 73 72 2d 3e 61  *piOff = pCsr->a
ea30: 49 6e 73 74 5b 69 49 64 78 2a 33 20 2b 20 32 5d  Inst[iIdx*3 + 2]
ea40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
ea50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
ea60: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
ea70: 20 66 74 73 35 41 70 69 52 6f 77 69 64 28 46 74   fts5ApiRowid(Ft
ea80: 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  s5Context *pCtx)
ea90: 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 43  {.  return fts5C
eaa0: 75 72 73 6f 72 52 6f 77 69 64 28 28 46 74 73 35  ursorRowid((Fts5
eab0: 43 75 72 73 6f 72 2a 29 70 43 74 78 29 3b 0a 7d  Cursor*)pCtx);.}
eac0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
ead0: 35 43 6f 6c 75 6d 6e 53 69 7a 65 43 62 28 0a 20  5ColumnSizeCb(. 
eae0: 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 69   /* Pointer to i
eb10: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 74 66 6c 61  nt */.  int tfla
eb20: 67 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  gs,.  const char
eb30: 20 2a 70 55 6e 75 73 65 64 2c 20 20 20 20 20 20   *pUnused,      
eb40: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
eb50: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e  containing token
eb60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 6e 75 73 65   */.  int nUnuse
eb70: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
eb80: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
eb90: 20 74 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20   token in bytes 
eba0: 2a 2f 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64  */.  int iUnused
ebb0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
ebc0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
ebd0: 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f  fset of token */
ebe0: 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64 32 20  .  int iUnused2 
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 66 73 65 74     /* End offset
ec10: 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a   of token */.){.
ec20: 20 20 69 6e 74 20 2a 70 43 6e 74 20 3d 20 28 69    int *pCnt = (i
ec30: 6e 74 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20  nt*)pContext;.  
ec40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28 70 55  UNUSED_PARAM2(pU
ec50: 6e 75 73 65 64 2c 20 6e 55 6e 75 73 65 64 29 3b  nused, nUnused);
ec60: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32  .  UNUSED_PARAM2
ec70: 28 69 55 6e 75 73 65 64 31 2c 20 69 55 6e 75 73  (iUnused1, iUnus
ec80: 65 64 32 29 3b 0a 20 20 69 66 28 20 28 74 66 6c  ed2);.  if( (tfl
ec90: 61 67 73 20 26 20 46 54 53 35 5f 54 4f 4b 45 4e  ags & FTS5_TOKEN
eca0: 5f 43 4f 4c 4f 43 41 54 45 44 29 3d 3d 30 20 29  _COLOCATED)==0 )
ecb0: 7b 0a 20 20 20 20 28 2a 70 43 6e 74 29 2b 2b 3b  {.    (*pCnt)++;
ecc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
ecd0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
ece0: 69 63 20 69 6e 74 20 66 74 73 35 41 70 69 43 6f  ic int fts5ApiCo
ecf0: 6c 75 6d 6e 53 69 7a 65 28 46 74 73 35 43 6f 6e  lumnSize(Fts5Con
ed00: 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20  text *pCtx, int 
ed10: 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 6e 54 6f 6b  iCol, int *pnTok
ed20: 65 6e 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f  en){.  Fts5Curso
ed30: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43  r *pCsr = (Fts5C
ed40: 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46  ursor*)pCtx;.  F
ed50: 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts5Table *pTab =
ed60: 20 28 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43   (Fts5Table*)(pC
ed70: 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 3b  sr->base.pVtab);
ed80: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
ed90: 43 6f 6e 66 69 67 20 3d 20 70 54 61 62 2d 3e 70  Config = pTab->p
eda0: 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 72 63  Config;.  int rc
edb0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
edc0: 20 69 66 28 20 43 73 72 46 6c 61 67 54 65 73 74   if( CsrFlagTest
edd0: 28 70 43 73 72 2c 20 46 54 53 35 43 53 52 5f 52  (pCsr, FTS5CSR_R
ede0: 45 51 55 49 52 45 5f 44 4f 43 53 49 5a 45 29 20  EQUIRE_DOCSIZE) 
edf0: 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66  ){.    if( pConf
ee00: 69 67 2d 3e 62 43 6f 6c 75 6d 6e 73 69 7a 65 20  ig->bColumnsize 
ee10: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
ee20: 77 69 64 20 3d 20 66 74 73 35 43 75 72 73 6f 72  wid = fts5Cursor
ee30: 52 6f 77 69 64 28 70 43 73 72 29 3b 0a 20 20 20  Rowid(pCsr);.   
ee40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
ee50: 74 73 35 53 74 6f 72 61 67 65 44 6f 63 73 69 7a  ts5StorageDocsiz
ee60: 65 28 70 54 61 62 2d 3e 70 53 74 6f 72 61 67 65  e(pTab->pStorage
ee70: 2c 20 69 52 6f 77 69 64 2c 20 70 43 73 72 2d 3e  , iRowid, pCsr->
ee80: 61 43 6f 6c 75 6d 6e 53 69 7a 65 29 3b 0a 20 20  aColumnSize);.  
ee90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e    }else if( pCon
eea0: 66 69 67 2d 3e 7a 43 6f 6e 74 65 6e 74 3d 3d 30  fig->zContent==0
eeb0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
eec0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
eed0: 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b  i<pConfig->nCol;
eee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
eef0: 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 62 55 6e  f( pConfig->abUn
ef00: 69 6e 64 65 78 65 64 5b 69 5d 3d 3d 30 20 29 7b  indexed[i]==0 ){
ef10: 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d  .          pCsr-
ef20: 3e 61 43 6f 6c 75 6d 6e 53 69 7a 65 5b 69 5d 20  >aColumnSize[i] 
ef30: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = -1;.        }.
ef40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
ef50: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
ef60: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
ef70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ef80: 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b  i<pConfig->nCol;
ef90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
efa0: 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 62 55 6e  f( pConfig->abUn
efb0: 69 6e 64 65 78 65 64 5b 69 5d 3d 3d 30 20 29 7b  indexed[i]==0 ){
efc0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
efd0: 20 63 68 61 72 20 2a 7a 3b 20 69 6e 74 20 6e 3b   char *z; int n;
efe0: 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
eff0: 2a 70 20 3d 20 28 76 6f 69 64 2a 29 28 26 70 43  *p = (void*)(&pC
f000: 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53 69 7a 65 5b  sr->aColumnSize[
f010: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  i]);.          p
f020: 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53 69 7a 65  Csr->aColumnSize
f030: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [i] = 0;.       
f040: 20 20 20 72 63 20 3d 20 66 74 73 35 41 70 69 43     rc = fts5ApiC
f050: 6f 6c 75 6d 6e 54 65 78 74 28 70 43 74 78 2c 20  olumnText(pCtx, 
f060: 69 2c 20 26 7a 2c 20 26 6e 29 3b 0a 20 20 20 20  i, &z, &n);.    
f070: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f080: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f090: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f0a0: 74 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 28  te3Fts5Tokenize(
f0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f0c0: 20 70 43 6f 6e 66 69 67 2c 20 46 54 53 35 5f 54   pConfig, FTS5_T
f0d0: 4f 4b 45 4e 49 5a 45 5f 41 55 58 2c 20 7a 2c 20  OKENIZE_AUX, z, 
f0e0: 6e 2c 20 70 2c 20 66 74 73 35 43 6f 6c 75 6d 6e  n, p, fts5Column
f0f0: 53 69 7a 65 43 62 0a 20 20 20 20 20 20 20 20 20  SizeCb.         
f100: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
f110: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
f120: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 43 73    }.    }.    Cs
f130: 72 46 6c 61 67 43 6c 65 61 72 28 70 43 73 72 2c  rFlagClear(pCsr,
f140: 20 46 54 53 35 43 53 52 5f 52 45 51 55 49 52 45   FTS5CSR_REQUIRE
f150: 5f 44 4f 43 53 49 5a 45 29 3b 0a 20 20 7d 0a 20  _DOCSIZE);.  }. 
f160: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
f170: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70     int i;.    *p
f180: 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nToken = 0;.    
f190: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66  for(i=0; i<pConf
f1a0: 69 67 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ig->nCol; i++){.
f1b0: 20 20 20 20 20 20 2a 70 6e 54 6f 6b 65 6e 20 2b        *pnToken +
f1c0: 3d 20 70 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53  = pCsr->aColumnS
f1d0: 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ize[i];.    }.  
f1e0: 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 70  }else if( iCol<p
f1f0: 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 20 29 7b 0a  Config->nCol ){.
f200: 20 20 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 70      *pnToken = p
f210: 43 73 72 2d 3e 61 43 6f 6c 75 6d 6e 53 69 7a 65  Csr->aColumnSize
f220: 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b  [iCol];.  }else{
f230: 0a 20 20 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20  .    *pnToken = 
f240: 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  0;.    rc = SQLI
f250: 54 45 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a 20 20  TE_RANGE;.  }.  
f260: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f270: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
f280: 6f 6e 20 6f 66 20 74 68 65 20 78 53 65 74 41 75  on of the xSetAu
f290: 78 64 61 74 61 28 29 20 6d 65 74 68 6f 64 2e 0a  xdata() method..
f2a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
f2b0: 73 35 41 70 69 53 65 74 41 75 78 64 61 74 61 28  s5ApiSetAuxdata(
f2c0: 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74 20 2a  .  Fts5Context *
f2d0: 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
f2e0: 20 20 20 2f 2a 20 46 74 73 35 20 63 6f 6e 74 65     /* Fts5 conte
f2f0: 78 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 50  xt */.  void *pP
f300: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
f310: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f320: 65 72 20 74 6f 20 73 61 76 65 20 61 73 20 61 75  er to save as au
f330: 78 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 28  xdata */.  void(
f340: 2a 78 44 65 6c 65 74 65 29 28 76 6f 69 64 2a 29  *xDelete)(void*)
f350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
f360: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 70 50 74  structor for pPt
f370: 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 29  r (or NULL) */.)
f380: 7b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  {.  Fts5Cursor *
f390: 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73  pCsr = (Fts5Curs
f3a0: 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46 74 73 35  or*)pCtx;.  Fts5
f3b0: 41 75 78 64 61 74 61 20 2a 70 44 61 74 61 3b 0a  Auxdata *pData;.
f3c0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72  .  /* Search thr
f3d0: 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72 73  ough the cursors
f3e0: 20 6c 69 73 74 20 6f 66 20 46 74 73 35 41 75 78   list of Fts5Aux
f3f0: 64 61 74 61 20 6f 62 6a 65 63 74 73 20 66 6f 72  data objects for
f400: 20 6f 6e 65 20 74 68 61 74 0a 20 20 2a 2a 20 63   one that.  ** c
f410: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
f420: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 65 63  e currently exec
f430: 75 74 69 6e 67 20 61 75 78 69 6c 69 61 72 79 20  uting auxiliary 
f440: 66 75 6e 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  function.  */.  
f450: 66 6f 72 28 70 44 61 74 61 3d 70 43 73 72 2d 3e  for(pData=pCsr->
f460: 70 41 75 78 64 61 74 61 3b 20 70 44 61 74 61 3b  pAuxdata; pData;
f470: 20 70 44 61 74 61 3d 70 44 61 74 61 2d 3e 70 4e   pData=pData->pN
f480: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 44  ext){.    if( pD
f490: 61 74 61 2d 3e 70 41 75 78 3d 3d 70 43 73 72 2d  ata->pAux==pCsr-
f4a0: 3e 70 41 75 78 20 29 20 62 72 65 61 6b 3b 0a 20  >pAux ) break;. 
f4b0: 20 7d 0a 0a 20 20 69 66 28 20 70 44 61 74 61 20   }..  if( pData 
f4c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  ){.    if( pData
f4d0: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
f4e0: 20 20 20 70 44 61 74 61 2d 3e 78 44 65 6c 65 74     pData->xDelet
f4f0: 65 28 70 44 61 74 61 2d 3e 70 50 74 72 29 3b 0a  e(pData->pPtr);.
f500: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
f510: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
f520: 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 44 61 74 61  TE_OK;.    pData
f530: 20 3d 20 28 46 74 73 35 41 75 78 64 61 74 61 2a   = (Fts5Auxdata*
f540: 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
f550: 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
f560: 6f 66 28 46 74 73 35 41 75 78 64 61 74 61 29 29  of(Fts5Auxdata))
f570: 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 3d  ;.    if( pData=
f580: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
f590: 78 44 65 6c 65 74 65 20 29 20 78 44 65 6c 65 74  xDelete ) xDelet
f5a0: 65 28 70 50 74 72 29 3b 0a 20 20 20 20 20 20 72  e(pPtr);.      r
f5b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f5c0: 20 20 20 20 70 44 61 74 61 2d 3e 70 41 75 78 20      pData->pAux 
f5d0: 3d 20 70 43 73 72 2d 3e 70 41 75 78 3b 0a 20 20  = pCsr->pAux;.  
f5e0: 20 20 70 44 61 74 61 2d 3e 70 4e 65 78 74 20 3d    pData->pNext =
f5f0: 20 70 43 73 72 2d 3e 70 41 75 78 64 61 74 61 3b   pCsr->pAuxdata;
f600: 0a 20 20 20 20 70 43 73 72 2d 3e 70 41 75 78 64  .    pCsr->pAuxd
f610: 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 7d  ata = pData;.  }
f620: 0a 0a 20 20 70 44 61 74 61 2d 3e 78 44 65 6c 65  ..  pData->xDele
f630: 74 65 20 3d 20 78 44 65 6c 65 74 65 3b 0a 20 20  te = xDelete;.  
f640: 70 44 61 74 61 2d 3e 70 50 74 72 20 3d 20 70 50  pData->pPtr = pP
f650: 74 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  tr;.  return SQL
f660: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  ITE_OK;.}..stati
f670: 63 20 76 6f 69 64 20 2a 66 74 73 35 41 70 69 47  c void *fts5ApiG
f680: 65 74 41 75 78 64 61 74 61 28 46 74 73 35 43 6f  etAuxdata(Fts5Co
f690: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74  ntext *pCtx, int
f6a0: 20 62 43 6c 65 61 72 29 7b 0a 20 20 46 74 73 35   bClear){.  Fts5
f6b0: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
f6c0: 46 74 73 35 43 75 72 73 6f 72 2a 29 70 43 74 78  Fts5Cursor*)pCtx
f6d0: 3b 0a 20 20 46 74 73 35 41 75 78 64 61 74 61 20  ;.  Fts5Auxdata 
f6e0: 2a 70 44 61 74 61 3b 0a 20 20 76 6f 69 64 20 2a  *pData;.  void *
f6f0: 70 52 65 74 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  pRet = 0;..  for
f700: 28 70 44 61 74 61 3d 70 43 73 72 2d 3e 70 41 75  (pData=pCsr->pAu
f710: 78 64 61 74 61 3b 20 70 44 61 74 61 3b 20 70 44  xdata; pData; pD
f720: 61 74 61 3d 70 44 61 74 61 2d 3e 70 4e 65 78 74  ata=pData->pNext
f730: 29 7b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  ){.    if( pData
f740: 2d 3e 70 41 75 78 3d 3d 70 43 73 72 2d 3e 70 41  ->pAux==pCsr->pA
f750: 75 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ux ) break;.  }.
f760: 0a 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a  .  if( pData ){.
f770: 20 20 20 20 70 52 65 74 20 3d 20 70 44 61 74 61      pRet = pData
f780: 2d 3e 70 50 74 72 3b 0a 20 20 20 20 69 66 28 20  ->pPtr;.    if( 
f790: 62 43 6c 65 61 72 20 29 7b 0a 20 20 20 20 20 20  bClear ){.      
f7a0: 70 44 61 74 61 2d 3e 70 50 74 72 20 3d 20 30 3b  pData->pPtr = 0;
f7b0: 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 78 44  .      pData->xD
f7c0: 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 7d  elete = 0;.    }
f7d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
f7e0: 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  Ret;.}..static v
f7f0: 6f 69 64 20 66 74 73 35 41 70 69 50 68 72 61 73  oid fts5ApiPhras
f800: 65 4e 65 78 74 28 0a 20 20 46 74 73 35 43 6f 6e  eNext(.  Fts5Con
f810: 74 65 78 74 20 2a 70 55 6e 75 73 65 64 2c 20 0a  text *pUnused, .
f820: 20 20 46 74 73 35 50 68 72 61 73 65 49 74 65 72    Fts5PhraseIter
f830: 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 6e 74 20   *pIter, .  int 
f840: 2a 70 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 69 4f  *piCol, int *piO
f850: 66 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ff.){.  UNUSED_P
f860: 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20  ARAM(pUnused);. 
f870: 20 69 66 28 20 70 49 74 65 72 2d 3e 61 3e 3d 70   if( pIter->a>=p
f880: 49 74 65 72 2d 3e 62 20 29 7b 0a 20 20 20 20 2a  Iter->b ){.    *
f890: 70 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  piCol = -1;.    
f8a0: 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 7d  *piOff = -1;.  }
f8b0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 56  else{.    int iV
f8c0: 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  al;.    pIter->a
f8d0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
f8e0: 74 33 32 28 70 49 74 65 72 2d 3e 61 2c 20 69 56  t32(pIter->a, iV
f8f0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 56 61  al);.    if( iVa
f900: 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 49  l==1 ){.      pI
f910: 74 65 72 2d 3e 61 20 2b 3d 20 66 74 73 35 47 65  ter->a += fts5Ge
f920: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d  tVarint32(pIter-
f930: 3e 61 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20  >a, iVal);.     
f940: 20 2a 70 69 43 6f 6c 20 3d 20 69 56 61 6c 3b 0a   *piCol = iVal;.
f950: 20 20 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 30        *piOff = 0
f960: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61  ;.      pIter->a
f970: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
f980: 74 33 32 28 70 49 74 65 72 2d 3e 61 2c 20 69 56  t32(pIter->a, iV
f990: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  al);.    }.    *
f9a0: 70 69 4f 66 66 20 2b 3d 20 28 69 56 61 6c 2d 32  piOff += (iVal-2
f9b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
f9c0: 20 69 6e 74 20 66 74 73 35 41 70 69 50 68 72 61   int fts5ApiPhra
f9d0: 73 65 46 69 72 73 74 28 0a 20 20 46 74 73 35 43  seFirst(.  Fts5C
f9e0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
f9f0: 20 69 6e 74 20 69 50 68 72 61 73 65 2c 20 0a 20   int iPhrase, . 
fa00: 20 46 74 73 35 50 68 72 61 73 65 49 74 65 72 20   Fts5PhraseIter 
fa10: 2a 70 49 74 65 72 2c 20 0a 20 20 69 6e 74 20 2a  *pIter, .  int *
fa20: 70 69 43 6f 6c 2c 20 69 6e 74 20 2a 70 69 4f 66  piCol, int *piOf
fa30: 66 0a 29 7b 0a 20 20 46 74 73 35 43 75 72 73 6f  f.){.  Fts5Curso
fa40: 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 35 43  r *pCsr = (Fts5C
fa50: 75 72 73 6f 72 2a 29 70 43 74 78 3b 0a 20 20 69  ursor*)pCtx;.  i
fa60: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt n;.  int rc =
fa70: 20 66 74 73 35 43 73 72 50 6f 73 6c 69 73 74 28   fts5CsrPoslist(
fa80: 70 43 73 72 2c 20 69 50 68 72 61 73 65 2c 20 26  pCsr, iPhrase, &
fa90: 70 49 74 65 72 2d 3e 61 2c 20 26 6e 29 3b 0a 20  pIter->a, &n);. 
faa0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fab0: 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  OK ){.    pIter-
fac0: 3e 62 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b 6e  >b = &pIter->a[n
fad0: 5d 3b 0a 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20  ];.    *piCol = 
fae0: 30 3b 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20  0;.    *piOff = 
faf0: 30 3b 0a 20 20 20 20 66 74 73 35 41 70 69 50 68  0;.    fts5ApiPh
fb00: 72 61 73 65 4e 65 78 74 28 70 43 74 78 2c 20 70  raseNext(pCtx, p
fb10: 49 74 65 72 2c 20 70 69 43 6f 6c 2c 20 70 69 4f  Iter, piCol, piO
fb20: 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
fb30: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
fb40: 76 6f 69 64 20 66 74 73 35 41 70 69 50 68 72 61  void fts5ApiPhra
fb50: 73 65 4e 65 78 74 43 6f 6c 75 6d 6e 28 0a 20 20  seNextColumn(.  
fb60: 46 74 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74  Fts5Context *pCt
fb70: 78 2c 20 0a 20 20 46 74 73 35 50 68 72 61 73 65  x, .  Fts5Phrase
fb80: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
fb90: 69 6e 74 20 2a 70 69 43 6f 6c 0a 29 7b 0a 20 20  int *piCol.){.  
fba0: 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts5Cursor *pCsr
fbb0: 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a 29   = (Fts5Cursor*)
fbc0: 70 43 74 78 3b 0a 20 20 46 74 73 35 43 6f 6e 66  pCtx;.  Fts5Conf
fbd0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 28 28  ig *pConfig = ((
fbe0: 46 74 73 35 54 61 62 6c 65 2a 29 28 70 43 73 72  Fts5Table*)(pCsr
fbf0: 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 29 2d 3e  ->base.pVtab))->
fc00: 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 69 66 28 20  pConfig;..  if( 
fc10: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
fc20: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f  ==FTS5_DETAIL_CO
fc30: 4c 55 4d 4e 53 20 29 7b 0a 20 20 20 20 69 66 28  LUMNS ){.    if(
fc40: 20 70 49 74 65 72 2d 3e 61 3e 3d 70 49 74 65 72   pIter->a>=pIter
fc50: 2d 3e 62 20 29 7b 0a 20 20 20 20 20 20 2a 70 69  ->b ){.      *pi
fc60: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  Col = -1;.    }e
fc70: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
fc80: 49 6e 63 72 3b 0a 20 20 20 20 20 20 70 49 74 65  Incr;.      pIte
fc90: 72 2d 3e 61 20 2b 3d 20 66 74 73 35 47 65 74 56  r->a += fts5GetV
fca0: 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
fcb0: 61 5b 30 5d 2c 20 69 49 6e 63 72 29 3b 0a 20 20  a[0], iIncr);.  
fcc0: 20 20 20 20 2a 70 69 43 6f 6c 20 2b 3d 20 28 69      *piCol += (i
fcd0: 49 6e 63 72 2d 32 29 3b 0a 20 20 20 20 7d 0a 20  Incr-2);.    }. 
fce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
fcf0: 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  e( 1 ){.      in
fd00: 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69  t dummy;.      i
fd10: 66 28 20 70 49 74 65 72 2d 3e 61 3e 3d 70 49 74  f( pIter->a>=pIt
fd20: 65 72 2d 3e 62 20 29 7b 0a 20 20 20 20 20 20 20  er->b ){.       
fd30: 20 2a 70 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   *piCol = -1;.  
fd40: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
fd50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
fd60: 70 49 74 65 72 2d 3e 61 5b 30 5d 3d 3d 30 78 30  pIter->a[0]==0x0
fd70: 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  1 ) break;.     
fd80: 20 70 49 74 65 72 2d 3e 61 20 2b 3d 20 66 74 73   pIter->a += fts
fd90: 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74  5GetVarint32(pIt
fda0: 65 72 2d 3e 61 2c 20 64 75 6d 6d 79 29 3b 0a 20  er->a, dummy);. 
fdb0: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
fdc0: 61 20 2b 3d 20 31 20 2b 20 66 74 73 35 47 65 74  a += 1 + fts5Get
fdd0: 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
fde0: 3e 61 5b 31 5d 2c 20 2a 70 69 43 6f 6c 29 3b 0a  >a[1], *piCol);.
fdf0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e    }.}..static in
fe00: 74 20 66 74 73 35 41 70 69 50 68 72 61 73 65 46  t fts5ApiPhraseF
fe10: 69 72 73 74 43 6f 6c 75 6d 6e 28 0a 20 20 46 74  irstColumn(.  Ft
fe20: 73 35 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  s5Context *pCtx,
fe30: 20 0a 20 20 69 6e 74 20 69 50 68 72 61 73 65 2c   .  int iPhrase,
fe40: 20 0a 20 20 46 74 73 35 50 68 72 61 73 65 49 74   .  Fts5PhraseIt
fe50: 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 6e  er *pIter, .  in
fe60: 74 20 2a 70 69 43 6f 6c 0a 29 7b 0a 20 20 69 6e  t *piCol.){.  in
fe70: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fe80: 3b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  ;.  Fts5Cursor *
fe90: 70 43 73 72 20 3d 20 28 46 74 73 35 43 75 72 73  pCsr = (Fts5Curs
fea0: 6f 72 2a 29 70 43 74 78 3b 0a 20 20 46 74 73 35  or*)pCtx;.  Fts5
feb0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
fec0: 3d 20 28 28 46 74 73 35 54 61 62 6c 65 2a 29 28  = ((Fts5Table*)(
fed0: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
fee0: 29 29 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20  ))->pConfig;..  
fef0: 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65  if( pConfig->eDe
ff00: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
ff10: 4c 5f 43 4f 4c 55 4d 4e 53 20 29 7b 0a 20 20 20  L_COLUMNS ){.   
ff20: 20 46 74 73 35 53 6f 72 74 65 72 20 2a 70 53 6f   Fts5Sorter *pSo
ff30: 72 74 65 72 20 3d 20 70 43 73 72 2d 3e 70 53 6f  rter = pCsr->pSo
ff40: 72 74 65 72 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  rter;.    int n;
ff50: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 65 72  .    if( pSorter
ff60: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 31   ){.      int i1
ff70: 20 3d 20 28 69 50 68 72 61 73 65 3d 3d 30 20 3f   = (iPhrase==0 ?
ff80: 20 30 20 3a 20 70 53 6f 72 74 65 72 2d 3e 61 49   0 : pSorter->aI
ff90: 64 78 5b 69 50 68 72 61 73 65 2d 31 5d 29 3b 0a  dx[iPhrase-1]);.
ffa0: 20 20 20 20 20 20 6e 20 3d 20 70 53 6f 72 74 65        n = pSorte
ffb0: 72 2d 3e 61 49 64 78 5b 69 50 68 72 61 73 65 5d  r->aIdx[iPhrase]
ffc0: 20 2d 20 69 31 3b 0a 20 20 20 20 20 20 70 49 74   - i1;.      pIt
ffd0: 65 72 2d 3e 61 20 3d 20 26 70 53 6f 72 74 65 72  er->a = &pSorter
ffe0: 2d 3e 61 50 6f 73 6c 69 73 74 5b 69 31 5d 3b 0a  ->aPoslist[i1];.
fff0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
10010 35 45 78 70 72 50 68 72 61 73 65 43 6f 6c 6c 69  5ExprPhraseColli
10020 73 74 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20  st(pCsr->pExpr, 
10030 69 50 68 72 61 73 65 2c 20 26 70 49 74 65 72 2d  iPhrase, &pIter-
10040 3e 61 2c 20 26 6e 29 3b 0a 20 20 20 20 7d 0a 20  >a, &n);.    }. 
10050 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
10070 74 65 72 2d 3e 62 20 3d 20 26 70 49 74 65 72 2d  ter->b = &pIter-
10080 3e 61 5b 6e 5d 3b 0a 20 20 20 20 20 20 2a 70 69  >a[n];.      *pi
10090 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Col = 0;.      f
100a0 74 73 35 41 70 69 50 68 72 61 73 65 4e 65 78 74  ts5ApiPhraseNext
100b0 43 6f 6c 75 6d 6e 28 70 43 74 78 2c 20 70 49 74  Column(pCtx, pIt
100c0 65 72 2c 20 70 69 43 6f 6c 29 3b 0a 20 20 20 20  er, piCol);.    
100d0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
100e0 6e 74 20 6e 3b 0a 20 20 20 20 72 63 20 3d 20 66  nt n;.    rc = f
100f0 74 73 35 43 73 72 50 6f 73 6c 69 73 74 28 70 43  ts5CsrPoslist(pC
10100 73 72 2c 20 69 50 68 72 61 73 65 2c 20 26 70 49  sr, iPhrase, &pI
10110 74 65 72 2d 3e 61 2c 20 26 6e 29 3b 0a 20 20 20  ter->a, &n);.   
10120 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10130 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  OK ){.      pIte
10140 72 2d 3e 62 20 3d 20 26 70 49 74 65 72 2d 3e 61  r->b = &pIter->a
10150 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  [n];.      if( n
10160 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  <=0 ){.        *
10170 70 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  piCol = -1;.    
10180 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
10190 72 2d 3e 61 5b 30 5d 3d 3d 30 78 30 31 20 29 7b  r->a[0]==0x01 ){
101a0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
101b0 61 20 2b 3d 20 31 20 2b 20 66 74 73 35 47 65 74  a += 1 + fts5Get
101c0 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
101d0 3e 61 5b 31 5d 2c 20 2a 70 69 43 6f 6c 29 3b 0a  >a[1], *piCol);.
101e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
101f0 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 30 3b       *piCol = 0;
10200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10210 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
10220 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .}...static int 
10230 66 74 73 35 41 70 69 51 75 65 72 79 50 68 72 61  fts5ApiQueryPhra
10240 73 65 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c  se(Fts5Context*,
10250 20 69 6e 74 2c 20 76 6f 69 64 2a 2c 20 0a 20 20   int, void*, .  
10260 20 20 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 46    int(*)(const F
10270 74 73 35 45 78 74 65 6e 73 69 6f 6e 41 70 69 2a  ts5ExtensionApi*
10280 2c 20 46 74 73 35 43 6f 6e 74 65 78 74 2a 2c 20  , Fts5Context*, 
10290 76 6f 69 64 2a 29 0a 29 3b 0a 0a 73 74 61 74 69  void*).);..stati
102a0 63 20 63 6f 6e 73 74 20 46 74 73 35 45 78 74 65  c const Fts5Exte
102b0 6e 73 69 6f 6e 41 70 69 20 73 46 74 73 35 41 70  nsionApi sFts5Ap
102c0 69 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20  i = {.  2,      
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
102f0 6e 20 2a 2f 0a 20 20 66 74 73 35 41 70 69 55 73  n */.  fts5ApiUs
10300 65 72 44 61 74 61 2c 0a 20 20 66 74 73 35 41 70  erData,.  fts5Ap
10310 69 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 0a 20 20  iColumnCount,.  
10320 66 74 73 35 41 70 69 52 6f 77 43 6f 75 6e 74 2c  fts5ApiRowCount,
10330 0a 20 20 66 74 73 35 41 70 69 43 6f 6c 75 6d 6e  .  fts5ApiColumn
10340 54 6f 74 61 6c 53 69 7a 65 2c 0a 20 20 66 74 73  TotalSize,.  fts
10350 35 41 70 69 54 6f 6b 65 6e 69 7a 65 2c 0a 20 20  5ApiTokenize,.  
10360 66 74 73 35 41 70 69 50 68 72 61 73 65 43 6f 75  fts5ApiPhraseCou
10370 6e 74 2c 0a 20 20 66 74 73 35 41 70 69 50 68 72  nt,.  fts5ApiPhr
10380 61 73 65 53 69 7a 65 2c 0a 20 20 66 74 73 35 41  aseSize,.  fts5A
10390 70 69 49 6e 73 74 43 6f 75 6e 74 2c 0a 20 20 66  piInstCount,.  f
103a0 74 73 35 41 70 69 49 6e 73 74 2c 0a 20 20 66 74  ts5ApiInst,.  ft
103b0 73 35 41 70 69 52 6f 77 69 64 2c 0a 20 20 66 74  s5ApiRowid,.  ft
103c0 73 35 41 70 69 43 6f 6c 75 6d 6e 54 65 78 74 2c  s5ApiColumnText,
103d0 0a 20 20 66 74 73 35 41 70 69 43 6f 6c 75 6d 6e  .  fts5ApiColumn
103e0 53 69 7a 65 2c 0a 20 20 66 74 73 35 41 70 69 51  Size,.  fts5ApiQ
103f0 75 65 72 79 50 68 72 61 73 65 2c 0a 20 20 66 74  ueryPhrase,.  ft
10400 73 35 41 70 69 53 65 74 41 75 78 64 61 74 61 2c  s5ApiSetAuxdata,
10410 0a 20 20 66 74 73 35 41 70 69 47 65 74 41 75 78  .  fts5ApiGetAux
10420 64 61 74 61 2c 0a 20 20 66 74 73 35 41 70 69 50  data,.  fts5ApiP
10430 68 72 61 73 65 46 69 72 73 74 2c 0a 20 20 66 74  hraseFirst,.  ft
10440 73 35 41 70 69 50 68 72 61 73 65 4e 65 78 74 2c  s5ApiPhraseNext,
10450 0a 20 20 66 74 73 35 41 70 69 50 68 72 61 73 65  .  fts5ApiPhrase
10460 46 69 72 73 74 43 6f 6c 75 6d 6e 2c 0a 20 20 66  FirstColumn,.  f
10470 74 73 35 41 70 69 50 68 72 61 73 65 4e 65 78 74  ts5ApiPhraseNext
10480 43 6f 6c 75 6d 6e 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  Column,.};../*.*
10490 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
104a0 20 6f 66 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   of API function
104b0 20 78 51 75 65 72 79 50 68 72 61 73 65 28 29 2e   xQueryPhrase().
104c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
104d0 74 73 35 41 70 69 51 75 65 72 79 50 68 72 61 73  ts5ApiQueryPhras
104e0 65 28 0a 20 20 46 74 73 35 43 6f 6e 74 65 78 74  e(.  Fts5Context
104f0 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 69   *pCtx, .  int i
10500 50 68 72 61 73 65 2c 20 0a 20 20 76 6f 69 64 20  Phrase, .  void 
10510 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 69 6e  *pUserData,.  in
10520 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 63 6f  t(*xCallback)(co
10530 6e 73 74 20 46 74 73 35 45 78 74 65 6e 73 69 6f  nst Fts5Extensio
10540 6e 41 70 69 2a 2c 20 46 74 73 35 43 6f 6e 74 65  nApi*, Fts5Conte
10550 78 74 2a 2c 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  xt*, void*).){. 
10560 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73   Fts5Cursor *pCs
10570 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a  r = (Fts5Cursor*
10580 29 70 43 74 78 3b 0a 20 20 46 74 73 35 54 61 62  )pCtx;.  Fts5Tab
10590 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35  le *pTab = (Fts5
105a0 54 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61  Table*)(pCsr->ba
105b0 73 65 2e 70 56 74 61 62 29 3b 0a 20 20 69 6e 74  se.pVtab);.  int
105c0 20 72 63 3b 0a 20 20 46 74 73 35 43 75 72 73 6f   rc;.  Fts5Curso
105d0 72 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20  r *pNew = 0;..  
105e0 72 63 20 3d 20 66 74 73 35 4f 70 65 6e 4d 65 74  rc = fts5OpenMet
105f0 68 6f 64 28 70 43 73 72 2d 3e 62 61 73 65 2e 70  hod(pCsr->base.p
10600 56 74 61 62 2c 20 28 73 71 6c 69 74 65 33 5f 76  Vtab, (sqlite3_v
10610 74 61 62 5f 63 75 72 73 6f 72 2a 2a 29 26 70 4e  tab_cursor**)&pN
10620 65 77 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ew);.  if( rc==S
10630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10640 70 4e 65 77 2d 3e 65 50 6c 61 6e 20 3d 20 46 54  pNew->ePlan = FT
10650 53 35 5f 50 4c 41 4e 5f 4d 41 54 43 48 3b 0a 20  S5_PLAN_MATCH;. 
10660 20 20 20 70 4e 65 77 2d 3e 69 46 69 72 73 74 52     pNew->iFirstR
10670 6f 77 69 64 20 3d 20 53 4d 41 4c 4c 45 53 54 5f  owid = SMALLEST_
10680 49 4e 54 36 34 3b 0a 20 20 20 20 70 4e 65 77 2d  INT64;.    pNew-
10690 3e 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 4c 41  >iLastRowid = LA
106a0 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20  RGEST_INT64;.   
106b0 20 70 4e 65 77 2d 3e 62 61 73 65 2e 70 56 74 61   pNew->base.pVta
106c0 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  b = (sqlite3_vta
106d0 62 2a 29 70 54 61 62 3b 0a 20 20 20 20 72 63 20  b*)pTab;.    rc 
106e0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  = sqlite3Fts5Exp
106f0 72 43 6c 6f 6e 65 50 68 72 61 73 65 28 70 43 73  rClonePhrase(pCs
10700 72 2d 3e 70 45 78 70 72 2c 20 69 50 68 72 61 73  r->pExpr, iPhras
10710 65 2c 20 26 70 4e 65 77 2d 3e 70 45 78 70 72 29  e, &pNew->pExpr)
10720 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
10730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10740 20 20 66 6f 72 28 72 63 20 3d 20 66 74 73 35 43    for(rc = fts5C
10750 75 72 73 6f 72 46 69 72 73 74 28 70 54 61 62 2c  ursorFirst(pTab,
10760 20 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20   pNew, 0);.     
10770 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
10780 20 26 26 20 43 73 72 46 6c 61 67 54 65 73 74 28   && CsrFlagTest(
10790 70 4e 65 77 2c 20 46 54 53 35 43 53 52 5f 45 4f  pNew, FTS5CSR_EO
107a0 46 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 72  F)==0;.        r
107b0 63 20 3d 20 66 74 73 35 4e 65 78 74 4d 65 74 68  c = fts5NextMeth
107c0 6f 64 28 28 73 71 6c 69 74 65 33 5f 76 74 61 62  od((sqlite3_vtab
107d0 5f 63 75 72 73 6f 72 2a 29 70 4e 65 77 29 0a 20  _cursor*)pNew). 
107e0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
107f0 20 78 43 61 6c 6c 62 61 63 6b 28 26 73 46 74 73   xCallback(&sFts
10800 35 41 70 69 2c 20 28 46 74 73 35 43 6f 6e 74 65  5Api, (Fts5Conte
10810 78 74 2a 29 70 4e 65 77 2c 20 70 55 73 65 72 44  xt*)pNew, pUserD
10820 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ata);.      if( 
10830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10840 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
10850 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
10860 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10870 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10880 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10890 0a 20 20 66 74 73 35 43 6c 6f 73 65 4d 65 74 68  .  fts5CloseMeth
108a0 6f 64 28 28 73 71 6c 69 74 65 33 5f 76 74 61 62  od((sqlite3_vtab
108b0 5f 63 75 72 73 6f 72 2a 29 70 4e 65 77 29 3b 0a  _cursor*)pNew);.
108c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
108d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
108e0 41 70 69 49 6e 76 6f 6b 65 28 0a 20 20 46 74 73  ApiInvoke(.  Fts
108f0 35 41 75 78 69 6c 69 61 72 79 20 2a 70 41 75 78  5Auxiliary *pAux
10900 2c 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20 2a  ,.  Fts5Cursor *
10910 70 43 73 72 2c 0a 20 20 73 71 6c 69 74 65 33 5f  pCsr,.  sqlite3_
10920 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
10930 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
10940 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
10950 61 72 67 76 0a 29 7b 0a 20 20 61 73 73 65 72 74  argv.){.  assert
10960 28 20 70 43 73 72 2d 3e 70 41 75 78 3d 3d 30 20  ( pCsr->pAux==0 
10970 29 3b 0a 20 20 70 43 73 72 2d 3e 70 41 75 78 20  );.  pCsr->pAux 
10980 3d 20 70 41 75 78 3b 0a 20 20 70 41 75 78 2d 3e  = pAux;.  pAux->
10990 78 46 75 6e 63 28 26 73 46 74 73 35 41 70 69 2c  xFunc(&sFts5Api,
109a0 20 28 46 74 73 35 43 6f 6e 74 65 78 74 2a 29 70   (Fts5Context*)p
109b0 43 73 72 2c 20 63 6f 6e 74 65 78 74 2c 20 61 72  Csr, context, ar
109c0 67 63 2c 20 61 72 67 76 29 3b 0a 20 20 70 43 73  gc, argv);.  pCs
109d0 72 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 7d 0a 0a  r->pAux = 0;.}..
109e0 73 74 61 74 69 63 20 46 74 73 35 43 75 72 73 6f  static Fts5Curso
109f0 72 20 2a 66 74 73 35 43 75 72 73 6f 72 46 72 6f  r *fts5CursorFro
10a00 6d 43 73 72 69 64 28 46 74 73 35 47 6c 6f 62 61  mCsrid(Fts5Globa
10a10 6c 20 2a 70 47 6c 6f 62 61 6c 2c 20 69 36 34 20  l *pGlobal, i64 
10a20 69 43 73 72 49 64 29 7b 0a 20 20 46 74 73 35 43  iCsrId){.  Fts5C
10a30 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 66  ursor *pCsr;.  f
10a40 6f 72 28 70 43 73 72 3d 70 47 6c 6f 62 61 6c 2d  or(pCsr=pGlobal-
10a50 3e 70 43 73 72 3b 20 70 43 73 72 3b 20 70 43 73  >pCsr; pCsr; pCs
10a60 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCsr->pNext){.
10a70 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69 43      if( pCsr->iC
10a80 73 72 49 64 3d 3d 69 43 73 72 49 64 20 29 20 62  srId==iCsrId ) b
10a90 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
10aa0 72 6e 20 70 43 73 72 3b 0a 7d 0a 0a 73 74 61 74  rn pCsr;.}..stat
10ab0 69 63 20 76 6f 69 64 20 66 74 73 35 41 70 69 43  ic void fts5ApiC
10ac0 61 6c 6c 62 61 63 6b 28 0a 20 20 73 71 6c 69 74  allback(.  sqlit
10ad0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
10ae0 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
10af0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
10b00 20 2a 2a 61 72 67 76 0a 29 7b 0a 0a 20 20 46 74   **argv.){..  Ft
10b10 73 35 41 75 78 69 6c 69 61 72 79 20 2a 70 41 75  s5Auxiliary *pAu
10b20 78 3b 0a 20 20 46 74 73 35 43 75 72 73 6f 72 20  x;.  Fts5Cursor 
10b30 2a 70 43 73 72 3b 0a 20 20 69 36 34 20 69 43 73  *pCsr;.  i64 iCs
10b40 72 49 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rId;..  assert( 
10b50 61 72 67 63 3e 3d 31 20 29 3b 0a 20 20 70 41 75  argc>=1 );.  pAu
10b60 78 20 3d 20 28 46 74 73 35 41 75 78 69 6c 69 61  x = (Fts5Auxilia
10b70 72 79 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  ry*)sqlite3_user
10b80 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
10b90 20 20 69 43 73 72 49 64 20 3d 20 73 71 6c 69 74    iCsrId = sqlit
10ba0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
10bb0 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 70 43 73 72  rgv[0]);..  pCsr
10bc0 20 3d 20 66 74 73 35 43 75 72 73 6f 72 46 72 6f   = fts5CursorFro
10bd0 6d 43 73 72 69 64 28 70 41 75 78 2d 3e 70 47 6c  mCsrid(pAux->pGl
10be0 6f 62 61 6c 2c 20 69 43 73 72 49 64 29 3b 0a 20  obal, iCsrId);. 
10bf0 20 69 66 28 20 70 43 73 72 3d 3d 30 20 29 7b 0a   if( pCsr==0 ){.
10c00 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d      char *zErr =
10c10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10c20 28 22 6e 6f 20 73 75 63 68 20 63 75 72 73 6f 72  ("no such cursor
10c30 3a 20 25 6c 6c 64 22 2c 20 69 43 73 72 49 64 29  : %lld", iCsrId)
10c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
10c50 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
10c60 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20  xt, zErr, -1);. 
10c70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10c80 7a 45 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zErr);.  }else{.
10c90 20 20 20 20 66 74 73 35 41 70 69 49 6e 76 6f 6b      fts5ApiInvok
10ca0 65 28 70 41 75 78 2c 20 70 43 73 72 2c 20 63 6f  e(pAux, pCsr, co
10cb0 6e 74 65 78 74 2c 20 61 72 67 63 2d 31 2c 20 26  ntext, argc-1, &
10cc0 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a  argv[1]);.  }.}.
10cd0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 63 75  ../*.** Given cu
10ce0 72 73 6f 72 20 69 64 20 69 49 64 2c 20 72 65 74  rsor id iId, ret
10cf0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
10d00 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
10d10 6e 67 20 46 74 73 35 49 6e 64 65 78 20 0a 2a 2a  ng Fts5Index .**
10d20 20 6f 62 6a 65 63 74 2e 20 4f 72 20 4e 55 4c 4c   object. Or NULL
10d30 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
10d40 64 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  d does not exist
10d50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
10d60 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 43 6f  ssful, set *ppCo
10d70 6e 66 69 67 20 74 6f 20 70 6f 69 6e 74 20 74 6f  nfig to point to
10d80 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
10d90 63 6f 6e 66 69 67 20 6f 62 6a 65 63 74 20 0a 2a  config object .*
10da0 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
10db0 6e 67 2e 0a 2a 2f 0a 46 74 73 35 49 6e 64 65 78  ng..*/.Fts5Index
10dc0 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64   *sqlite3Fts5Ind
10dd0 65 78 46 72 6f 6d 43 73 72 69 64 28 0a 20 20 46  exFromCsrid(.  F
10de0 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62  ts5Global *pGlob
10df0 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  al,            /
10e00 2a 20 46 54 53 35 20 67 6c 6f 62 61 6c 20 63 6f  * FTS5 global co
10e10 6e 74 65 78 74 20 66 6f 72 20 64 62 20 68 61 6e  ntext for db han
10e20 64 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 43 73  dle */.  i64 iCs
10e30 72 49 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  rId,            
10e40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
10e50 66 20 63 75 72 73 6f 72 20 74 6f 20 66 69 6e 64  f cursor to find
10e60 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
10e70 20 2a 2a 70 70 43 6f 6e 66 69 67 20 20 20 20 20   **ppConfig     
10e80 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f        /* OUT: Co
10e90 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
10ea0 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43  ct */.){.  Fts5C
10eb0 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 46  ursor *pCsr;.  F
10ec0 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  ts5Table *pTab;.
10ed0 0a 20 20 70 43 73 72 20 3d 20 66 74 73 35 43 75  .  pCsr = fts5Cu
10ee0 72 73 6f 72 46 72 6f 6d 43 73 72 69 64 28 70 47  rsorFromCsrid(pG
10ef0 6c 6f 62 61 6c 2c 20 69 43 73 72 49 64 29 3b 0a  lobal, iCsrId);.
10f00 20 20 70 54 61 62 20 3d 20 28 46 74 73 35 54 61    pTab = (Fts5Ta
10f10 62 6c 65 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  ble*)pCsr->base.
10f20 70 56 74 61 62 3b 0a 20 20 2a 70 70 43 6f 6e 66  pVtab;.  *ppConf
10f30 69 67 20 3d 20 70 54 61 62 2d 3e 70 43 6f 6e 66  ig = pTab->pConf
10f40 69 67 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54  ig;..  return pT
10f50 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 7d 0a 0a 2f  ab->pIndex;.}../
10f60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 22 70  *.** Return a "p
10f70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 62 6c 6f  osition-list blo
10f80 62 22 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  b" corresponding
10f90 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
10fa0 70 6f 73 69 74 69 6f 6e 20 6f 66 0a 2a 2a 20 63  position of.** c
10fb0 75 72 73 6f 72 20 70 43 73 72 20 76 69 61 20 73  ursor pCsr via s
10fc0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
10fd0 6f 62 28 29 2e 20 41 20 70 6f 73 69 74 69 6f 6e  ob(). A position
10fe0 2d 6c 69 73 74 20 62 6c 6f 62 20 63 6f 6e 74 61  -list blob conta
10ff0 69 6e 73 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  ins.** the curre
11000 6e 74 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  nt position-list
11010 20 66 6f 72 20 65 61 63 68 20 70 68 72 61 73 65   for each phrase
11020 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 61 73   in the query as
11030 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
11040 20 63 75 72 73 6f 72 20 70 43 73 72 2e 0a 2a 2a   cursor pCsr..**
11050 0a 2a 2a 20 41 20 70 6f 73 69 74 69 6f 6e 2d 6c  .** A position-l
11060 69 73 74 20 62 6c 6f 62 20 62 65 67 69 6e 73 20  ist blob begins 
11070 77 69 74 68 20 28 6e 50 68 72 61 73 65 2d 31 29  with (nPhrase-1)
11080 20 76 61 72 69 6e 74 73 2c 20 77 68 65 72 65 20   varints, where 
11090 6e 50 68 72 61 73 65 20 69 73 0a 2a 2a 20 74 68  nPhrase is.** th
110a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 68 72 61  e number of phra
110b0 73 65 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  ses in the query
110c0 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  . Following the 
110d0 76 61 72 69 6e 74 73 20 61 72 65 20 74 68 65 0a  varints are the.
110e0 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 20  ** concatenated 
110f0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 20 66  position lists f
11100 6f 72 20 65 61 63 68 20 70 68 72 61 73 65 2c 20  or each phrase, 
11110 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  in order..**.** 
11120 54 68 65 20 66 69 72 73 74 20 76 61 72 69 6e 74  The first varint
11130 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
11140 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
11150 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  e of the positio
11160 6e 20 6c 69 73 74 0a 2a 2a 20 66 6f 72 20 70 68  n list.** for ph
11170 72 61 73 65 20 30 2e 20 54 68 65 20 73 65 63 6f  rase 0. The seco
11180 6e 64 20 28 73 61 6d 65 20 64 69 73 63 6c 61 69  nd (same disclai
11190 6d 65 72 29 20 63 6f 6e 74 61 69 6e 73 20 74 68  mer) contains th
111a0 65 20 73 69 7a 65 20 6f 66 20 70 6f 73 69 74 69  e size of positi
111b0 6f 6e 0a 2a 2a 20 6c 69 73 74 20 31 2e 20 41 6e  on.** list 1. An
111c0 64 20 73 6f 20 6f 6e 2e 20 54 68 65 72 65 20 69  d so on. There i
111d0 73 20 6e 6f 20 73 69 7a 65 20 66 69 65 6c 64 20  s no size field 
111e0 66 6f 72 20 74 68 65 20 66 69 6e 61 6c 20 70 6f  for the final po
111f0 73 69 74 69 6f 6e 20 6c 69 73 74 2c 0a 2a 2a 20  sition list,.** 
11200 61 73 20 69 74 20 63 61 6e 20 62 65 20 64 65 72  as it can be der
11210 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 74 6f  ived from the to
11220 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
11230 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blob..*/.static 
11240 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73 74 42  int fts5PoslistB
11250 6c 6f 62 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  lob(sqlite3_cont
11260 65 78 74 20 2a 70 43 74 78 2c 20 46 74 73 35 43  ext *pCtx, Fts5C
11270 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
11280 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
11290 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
112a0 6e 74 20 6e 50 68 72 61 73 65 20 3d 20 73 71 6c  nt nPhrase = sql
112b0 69 74 65 33 46 74 73 35 45 78 70 72 50 68 72 61  ite3Fts5ExprPhra
112c0 73 65 43 6f 75 6e 74 28 70 43 73 72 2d 3e 70 45  seCount(pCsr->pE
112d0 78 70 72 29 3b 0a 20 20 46 74 73 35 42 75 66 66  xpr);.  Fts5Buff
112e0 65 72 20 76 61 6c 3b 0a 0a 20 20 6d 65 6d 73 65  er val;..  memse
112f0 74 28 26 76 61 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(&val, 0, sizeo
11300 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
11310 20 20 73 77 69 74 63 68 28 20 28 28 46 74 73 35    switch( ((Fts5
11320 54 61 62 6c 65 2a 29 28 70 43 73 72 2d 3e 62 61  Table*)(pCsr->ba
11330 73 65 2e 70 56 74 61 62 29 29 2d 3e 70 43 6f 6e  se.pVtab))->pCon
11340 66 69 67 2d 3e 65 44 65 74 61 69 6c 20 29 7b 0a  fig->eDetail ){.
11350 20 20 20 20 63 61 73 65 20 46 54 53 35 5f 44 45      case FTS5_DE
11360 54 41 49 4c 5f 46 55 4c 4c 3a 0a 0a 20 20 20 20  TAIL_FULL:..    
11370 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
11380 76 61 72 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  varints */.     
11390 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 50 68   for(i=0; i<(nPh
113a0 72 61 73 65 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20  rase-1); i++){. 
113b0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20         const u8 
113c0 2a 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20  *dummy;.        
113d0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69  int nByte = sqli
113e0 74 65 33 46 74 73 35 45 78 70 72 50 6f 73 6c 69  te3Fts5ExprPosli
113f0 73 74 28 70 43 73 72 2d 3e 70 45 78 70 72 2c 20  st(pCsr->pExpr, 
11400 69 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  i, &dummy);.    
11410 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
11420 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
11430 74 28 26 72 63 2c 20 26 76 61 6c 2c 20 6e 42 79  t(&rc, &val, nBy
11440 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  te);.      }..  
11450 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
11460 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  e position lists
11470 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
11480 30 3b 20 69 3c 6e 50 68 72 61 73 65 3b 20 69 2b  0; i<nPhrase; i+
11490 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
114a0 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 3b 0a  t u8 *pPoslist;.
114b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
114c0 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 50  list;.        nP
114d0 6f 73 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  oslist = sqlite3
114e0 46 74 73 35 45 78 70 72 50 6f 73 6c 69 73 74 28  Fts5ExprPoslist(
114f0 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 69 2c 20  pCsr->pExpr, i, 
11500 26 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  &pPoslist);.    
11510 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
11520 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
11530 26 72 63 2c 20 26 76 61 6c 2c 20 6e 50 6f 73 6c  &rc, &val, nPosl
11540 69 73 74 2c 20 70 50 6f 73 6c 69 73 74 29 3b 0a  ist, pPoslist);.
11550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11560 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 46  eak;..    case F
11570 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d  TS5_DETAIL_COLUM
11580 4e 53 3a 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70  NS:..      /* Ap
11590 70 65 6e 64 20 74 68 65 20 76 61 72 69 6e 74 73  pend the varints
115a0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
115b0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
115c0 20 26 26 20 69 3c 28 6e 50 68 72 61 73 65 2d 31   && i<(nPhrase-1
115d0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
115e0 20 63 6f 6e 73 74 20 75 38 20 2a 64 75 6d 6d 79   const u8 *dummy
115f0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  ;.        int nB
11600 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
11610 3d 20 73 71 6c 69 74 65 33 46 74 73 35 45 78 70  = sqlite3Fts5Exp
11620 72 50 68 72 61 73 65 43 6f 6c 6c 69 73 74 28 70  rPhraseCollist(p
11630 43 73 72 2d 3e 70 45 78 70 72 2c 20 69 2c 20 26  Csr->pExpr, i, &
11640 64 75 6d 6d 79 2c 20 26 6e 42 79 74 65 29 3b 0a  dummy, &nByte);.
11650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
11660 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
11670 61 72 69 6e 74 28 26 72 63 2c 20 26 76 61 6c 2c  arint(&rc, &val,
11680 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d   nByte);.      }
11690 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  ..      /* Appen
116a0 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  d the position l
116b0 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f  ists */.      fo
116c0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
116d0 45 5f 4f 4b 20 26 26 20 69 3c 6e 50 68 72 61 73  E_OK && i<nPhras
116e0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
116f0 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c   const u8 *pPosl
11700 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ist;.        int
11710 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20   nPoslist;.     
11720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
11730 74 73 35 45 78 70 72 50 68 72 61 73 65 43 6f 6c  ts5ExprPhraseCol
11740 6c 69 73 74 28 70 43 73 72 2d 3e 70 45 78 70 72  list(pCsr->pExpr
11750 2c 20 69 2c 20 26 70 50 6f 73 6c 69 73 74 2c 20  , i, &pPoslist, 
11760 26 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  &nPoslist);.    
11770 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
11780 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
11790 26 72 63 2c 20 26 76 61 6c 2c 20 6e 50 6f 73 6c  &rc, &val, nPosl
117a0 69 73 74 2c 20 70 50 6f 73 6c 69 73 74 29 3b 0a  ist, pPoslist);.
117b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
117c0 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
117d0 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t:.      break;.
117e0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72    }..  sqlite3_r
117f0 65 73 75 6c 74 5f 62 6c 6f 62 28 70 43 74 78 2c  esult_blob(pCtx,
11800 20 76 61 6c 2e 70 2c 20 76 61 6c 2e 6e 2c 20 73   val.p, val.n, s
11810 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
11820 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11830 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65   .** This is the
11840 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 2c   xColumn method,
11850 20 63 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74   called by SQLit
11860 65 20 74 6f 20 72 65 71 75 65 73 74 20 61 20 76  e to request a v
11870 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  alue from.** the
11880 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 73 75   row that the su
11890 70 70 6c 69 65 64 20 63 75 72 73 6f 72 20 63 75  pplied cursor cu
118a0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
118b0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
118c0 20 66 74 73 35 43 6f 6c 75 6d 6e 4d 65 74 68 6f   fts5ColumnMetho
118d0 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  d(.  sqlite3_vta
118e0 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  b_cursor *pCurso
118f0 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74  r,   /* Cursor t
11900 6f 20 72 65 74 72 69 65 76 65 20 76 61 6c 75 65  o retrieve value
11910 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74   from */.  sqlit
11920 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
11930 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
11940 6e 74 65 78 74 20 66 6f 72 20 73 71 6c 69 74 65  ntext for sqlite
11950 33 5f 72 65 73 75 6c 74 5f 78 78 78 28 29 20 63  3_result_xxx() c
11960 61 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  alls */.  int iC
11970 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
11980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11990 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f 20  ex of column to 
119a0 72 65 61 64 20 76 61 6c 75 65 20 66 72 6f 6d 20  read value from 
119b0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 54 61 62 6c  */.){.  Fts5Tabl
119c0 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 35 54  e *pTab = (Fts5T
119d0 61 62 6c 65 2a 29 28 70 43 75 72 73 6f 72 2d 3e  able*)(pCursor->
119e0 70 56 74 61 62 29 3b 0a 20 20 46 74 73 35 43 6f  pVtab);.  Fts5Co
119f0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
11a00 70 54 61 62 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20  pTab->pConfig;. 
11a10 20 46 74 73 35 43 75 72 73 6f 72 20 2a 70 43 73   Fts5Cursor *pCs
11a20 72 20 3d 20 28 46 74 73 35 43 75 72 73 6f 72 2a  r = (Fts5Cursor*
11a30 29 70 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  )pCursor;.  int 
11a40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11a50 20 20 0a 20 20 61 73 73 65 72 74 28 20 43 73 72    .  assert( Csr
11a60 46 6c 61 67 54 65 73 74 28 70 43 73 72 2c 20 46  FlagTest(pCsr, F
11a70 54 53 35 43 53 52 5f 45 4f 46 29 3d 3d 30 20 29  TS5CSR_EOF)==0 )
11a80 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 65  ;..  if( pCsr->e
11a90 50 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e 5f  Plan==FTS5_PLAN_
11aa0 53 50 45 43 49 41 4c 20 29 7b 0a 20 20 20 20 69  SPECIAL ){.    i
11ab0 66 28 20 69 43 6f 6c 3d 3d 70 43 6f 6e 66 69 67  f( iCol==pConfig
11ac0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
11ad0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
11ae0 6e 74 36 34 28 70 43 74 78 2c 20 70 43 73 72 2d  nt64(pCtx, pCsr-
11af0 3e 69 53 70 65 63 69 61 6c 29 3b 0a 20 20 20 20  >iSpecial);.    
11b00 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
11b10 20 69 43 6f 6c 3d 3d 70 43 6f 6e 66 69 67 2d 3e   iCol==pConfig->
11b20 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 55  nCol ){.    /* U
11b30 73 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e  ser is requestin
11b40 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  g the value of t
11b50 68 65 20 73 70 65 63 69 61 6c 20 63 6f 6c 75 6d  he special colum
11b60 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
11b70 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 61 73 20 74  name.    ** as t
11b80 68 65 20 74 61 62 6c 65 2e 20 52 65 74 75 72 6e  he table. Return
11b90 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 65   the cursor inte
11ba0 67 65 72 20 69 64 20 6e 75 6d 62 65 72 2e 20 54  ger id number. T
11bb0 68 69 73 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  his value is onl
11bc0 79 0a 20 20 20 20 2a 2a 20 75 73 65 66 75 6c 20  y.    ** useful 
11bd0 69 6e 20 74 68 61 74 20 69 74 20 6d 61 79 20 62  in that it may b
11be0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
11bf0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
11c00 6f 20 61 6e 20 46 54 53 35 0a 20 20 20 20 2a 2a  o an FTS5.    **
11c10 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74   auxiliary funct
11c20 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ion.  */.    sql
11c30 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
11c40 34 28 70 43 74 78 2c 20 70 43 73 72 2d 3e 69 43  4(pCtx, pCsr->iC
11c50 73 72 49 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  srId);.  }else i
11c60 66 28 20 69 43 6f 6c 3d 3d 70 43 6f 6e 66 69 67  f( iCol==pConfig
11c70 2d 3e 6e 43 6f 6c 2b 31 20 29 7b 0a 0a 20 20 20  ->nCol+1 ){..   
11c80 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
11c90 20 74 68 65 20 22 72 61 6e 6b 22 20 63 6f 6c 75   the "rank" colu
11ca0 6d 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  mn. */.    if( p
11cb0 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35  Csr->ePlan==FTS5
11cc0 5f 50 4c 41 4e 5f 53 4f 55 52 43 45 20 29 7b 0a  _PLAN_SOURCE ){.
11cd0 20 20 20 20 20 20 66 74 73 35 50 6f 73 6c 69 73        fts5Poslis
11ce0 74 42 6c 6f 62 28 70 43 74 78 2c 20 70 43 73 72  tBlob(pCtx, pCsr
11cf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
11d00 20 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e   .        pCsr->
11d10 65 50 6c 61 6e 3d 3d 46 54 53 35 5f 50 4c 41 4e  ePlan==FTS5_PLAN
11d20 5f 4d 41 54 43 48 0a 20 20 20 20 20 7c 7c 20 70  _MATCH.     || p
11d30 43 73 72 2d 3e 65 50 6c 61 6e 3d 3d 46 54 53 35  Csr->ePlan==FTS5
11d40 5f 50 4c 41 4e 5f 53 4f 52 54 45 44 5f 4d 41 54  _PLAN_SORTED_MAT
11d50 43 48 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  CH.    ){.      
11d60 69 66 28 20 70 43 73 72 2d 3e 70 52 61 6e 6b 20  if( pCsr->pRank 
11d70 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  || SQLITE_OK==(r
11d80 63 20 3d 20 66 74 73 35 46 69 6e 64 52 61 6e 6b  c = fts5FindRank
11d90 46 75 6e 63 74 69 6f 6e 28 70 43 73 72 29 29 20  Function(pCsr)) 
11da0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 41  ){.        fts5A
11db0 70 69 49 6e 76 6f 6b 65 28 70 43 73 72 2d 3e 70  piInvoke(pCsr->p
11dc0 52 61 6e 6b 2c 20 70 43 73 72 2c 20 70 43 74 78  Rank, pCsr, pCtx
11dd0 2c 20 70 43 73 72 2d 3e 6e 52 61 6e 6b 41 72 67  , pCsr->nRankArg
11de0 2c 20 70 43 73 72 2d 3e 61 70 52 61 6e 6b 41 72  , pCsr->apRankAr
11df0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
11e00 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 66  }.  }else if( !f
11e10 74 73 35 49 73 43 6f 6e 74 65 6e 74 6c 65 73 73  ts5IsContentless
11e20 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 72 63  (pTab) ){.    rc
11e30 20 3d 20 66 74 73 35 53 65 65 6b 43 75 72 73 6f   = fts5SeekCurso
11e40 72 28 70 43 73 72 2c 20 31 29 3b 0a 20 20 20 20  r(pCsr, 1);.    
11e50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11e60 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11e70 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
11e80 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f  pCtx, sqlite3_co
11e90 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d  lumn_value(pCsr-
11ea0 3e 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 29  >pStmt, iCol+1))
11eb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11ec0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
11ed0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11ee0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 78  implements the x
11ef0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 6d 65 74  FindFunction met
11f00 68 6f 64 20 66 6f 72 20 74 68 65 20 46 54 53 33  hod for the FTS3
11f10 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
11f20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11f30 20 66 74 73 35 46 69 6e 64 46 75 6e 63 74 69 6f   fts5FindFunctio
11f40 6e 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  nMethod(.  sqlit
11f50 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
11f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
11f70 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
11f80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 6e 75  le */.  int nUnu
11f90 73 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  sed,            
11fa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11fb0 72 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f  r of SQL functio
11fc0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
11fd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
11fe0 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
11ff0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 53 51 4c 20   /* Name of SQL 
12000 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
12010 69 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71  id (**pxFunc)(sq
12020 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
12030 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
12040 2a 2a 29 2c 20 2f 2a 20 4f 55 54 3a 20 52 65 73  **), /* OUT: Res
12050 75 6c 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a  ult */.  void **
12060 70 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  ppArg           
12070 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
12080 20 55 73 65 72 20 64 61 74 61 20 66 6f 72 20 2a   User data for *
12090 70 78 46 75 6e 63 20 2a 2f 0a 29 7b 0a 20 20 46  pxFunc */.){.  F
120a0 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts5Table *pTab =
120b0 20 28 46 74 73 35 54 61 62 6c 65 2a 29 70 56 74   (Fts5Table*)pVt
120c0 61 62 3b 0a 20 20 46 74 73 35 41 75 78 69 6c 69  ab;.  Fts5Auxili
120d0 61 72 79 20 2a 70 41 75 78 3b 0a 0a 20 20 55 4e  ary *pAux;..  UN
120e0 55 53 45 44 5f 50 41 52 41 4d 28 6e 55 6e 75 73  USED_PARAM(nUnus
120f0 65 64 29 3b 0a 20 20 70 41 75 78 20 3d 20 66 74  ed);.  pAux = ft
12100 73 35 46 69 6e 64 41 75 78 69 6c 69 61 72 79 28  s5FindAuxiliary(
12110 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  pTab, zName);.  
12120 69 66 28 20 70 41 75 78 20 29 7b 0a 20 20 20 20  if( pAux ){.    
12130 2a 70 78 46 75 6e 63 20 3d 20 66 74 73 35 41 70  *pxFunc = fts5Ap
12140 69 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 2a  iCallback;.    *
12150 70 70 41 72 67 20 3d 20 28 76 6f 69 64 2a 29 70  ppArg = (void*)p
12160 41 75 78 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Aux;.    return 
12170 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20  1;.  }..  /* No 
12180 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
12190 73 70 65 63 69 66 69 65 64 20 6e 61 6d 65 20 77  specified name w
121a0 61 73 20 66 6f 75 6e 64 2e 20 52 65 74 75 72 6e  as found. Return
121b0 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20   0. */.  return 
121c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  0;.}../*.** Impl
121d0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 46 54  ementation of FT
121e0 53 35 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f  S5 xRename metho
121f0 64 2e 20 52 65 6e 61 6d 65 20 61 6e 20 66 74 73  d. Rename an fts
12200 35 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  5 table..*/.stat
12210 69 63 20 69 6e 74 20 66 74 73 35 52 65 6e 61 6d  ic int fts5Renam
12220 65 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  eMethod(.  sqlit
12230 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20  e3_vtab *pVtab, 
12240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
12250 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
12260 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
12270 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20  ar *zName       
12280 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6e          /* New n
12290 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a  ame of table */.
122a0 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a  ){.  Fts5Table *
122b0 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c  pTab = (Fts5Tabl
122c0 65 2a 29 70 56 74 61 62 3b 0a 20 20 72 65 74 75  e*)pVtab;.  retu
122d0 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  rn sqlite3Fts5St
122e0 6f 72 61 67 65 52 65 6e 61 6d 65 28 70 54 61 62  orageRename(pTab
122f0 2d 3e 70 53 74 6f 72 61 67 65 2c 20 7a 4e 61 6d  ->pStorage, zNam
12300 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
12310 20 78 53 61 76 65 70 6f 69 6e 74 28 29 20 6d 65   xSavepoint() me
12320 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 75 73  thod..**.** Flus
12330 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
12340 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
12350 72 6d 73 20 74 61 62 6c 65 20 74 6f 20 64 69 73  rms table to dis
12360 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
12370 20 66 74 73 35 53 61 76 65 70 6f 69 6e 74 4d 65   fts5SavepointMe
12380 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
12390 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 20 69 53  b *pVtab, int iS
123a0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 46 74 73  avepoint){.  Fts
123b0 35 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  5Table *pTab = (
123c0 46 74 73 35 54 61 62 6c 65 2a 29 70 56 74 61 62  Fts5Table*)pVtab
123d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
123e0 28 69 53 61 76 65 70 6f 69 6e 74 29 3b 20 20 2f  (iSavepoint);  /
123f0 2a 20 43 61 6c 6c 20 62 65 6c 6f 77 20 69 73 20  * Call below is 
12400 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 4e 44 45 42  a no-op for NDEB
12410 55 47 20 62 75 69 6c 64 73 20 2a 2f 0a 20 20 66  UG builds */.  f
12420 74 73 35 43 68 65 63 6b 54 72 61 6e 73 61 63 74  ts5CheckTransact
12430 69 6f 6e 53 74 61 74 65 28 70 54 61 62 2c 20 46  ionState(pTab, F
12440 54 53 35 5f 53 41 56 45 50 4f 49 4e 54 2c 20 69  TS5_SAVEPOINT, i
12450 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 66 74  Savepoint);.  ft
12460 73 35 54 72 69 70 43 75 72 73 6f 72 73 28 70 54  s5TripCursors(pT
12470 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ab);.  return sq
12480 6c 69 74 65 33 46 74 73 35 53 74 6f 72 61 67 65  lite3Fts5Storage
12490 53 79 6e 63 28 70 54 61 62 2d 3e 70 53 74 6f 72  Sync(pTab->pStor
124a0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
124b0 68 65 20 78 52 65 6c 65 61 73 65 28 29 20 6d 65  he xRelease() me
124c0 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  thod..**.** This
124d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
124e0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 52  static int fts5R
124f0 65 6c 65 61 73 65 4d 65 74 68 6f 64 28 73 71 6c  eleaseMethod(sql
12500 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
12510 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
12520 29 7b 0a 20 20 46 74 73 35 54 61 62 6c 65 20 2a  ){.  Fts5Table *
12530 70 54 61 62 20 3d 20 28 46 74 73 35 54 61 62 6c  pTab = (Fts5Tabl
12540 65 2a 29 70 56 74 61 62 3b 0a 20 20 55 4e 55 53  e*)pVtab;.  UNUS
12550 45 44 5f 50 41 52 41 4d 28 69 53 61 76 65 70 6f  ED_PARAM(iSavepo
12560 69 6e 74 29 3b 20 20 2f 2a 20 43 61 6c 6c 20 62  int);  /* Call b
12570 65 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 20  elow is a no-op 
12580 66 6f 72 20 4e 44 45 42 55 47 20 62 75 69 6c 64  for NDEBUG build
12590 73 20 2a 2f 0a 20 20 66 74 73 35 43 68 65 63 6b  s */.  fts5Check
125a0 54 72 61 6e 73 61 63 74 69 6f 6e 53 74 61 74 65  TransactionState
125b0 28 70 54 61 62 2c 20 46 54 53 35 5f 52 45 4c 45  (pTab, FTS5_RELE
125c0 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
125d0 3b 0a 20 20 66 74 73 35 54 72 69 70 43 75 72 73  ;.  fts5TripCurs
125e0 6f 72 73 28 70 54 61 62 29 3b 0a 20 20 72 65 74  ors(pTab);.  ret
125f0 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 53  urn sqlite3Fts5S
12600 74 6f 72 61 67 65 53 79 6e 63 28 70 54 61 62 2d  torageSync(pTab-
12610 3e 70 53 74 6f 72 61 67 65 29 3b 0a 7d 0a 0a 2f  >pStorage);.}../
12620 2a 0a 2a 2a 20 54 68 65 20 78 52 6f 6c 6c 62 61  *.** The xRollba
12630 63 6b 54 6f 28 29 20 6d 65 74 68 6f 64 2e 0a 2a  ckTo() method..*
12640 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
12650 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12660 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 74   pending terms t
12670 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
12680 69 6e 74 20 66 74 73 35 52 6f 6c 6c 62 61 63 6b  int fts5Rollback
12690 54 6f 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  ToMethod(sqlite3
126a0 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e  _vtab *pVtab, in
126b0 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
126c0 20 46 74 73 35 54 61 62 6c 65 20 2a 70 54 61 62   Fts5Table *pTab
126d0 20 3d 20 28 46 74 73 35 54 61 62 6c 65 2a 29 70   = (Fts5Table*)p
126e0 56 74 61 62 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Vtab;.  UNUSED_P
126f0 41 52 41 4d 28 69 53 61 76 65 70 6f 69 6e 74 29  ARAM(iSavepoint)
12700 3b 20 20 2f 2a 20 43 61 6c 6c 20 62 65 6c 6f 77  ;  /* Call below
12710 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
12720 4e 44 45 42 55 47 20 62 75 69 6c 64 73 20 2a 2f  NDEBUG builds */
12730 0a 20 20 66 74 73 35 43 68 65 63 6b 54 72 61 6e  .  fts5CheckTran
12740 73 61 63 74 69 6f 6e 53 74 61 74 65 28 70 54 61  sactionState(pTa
12750 62 2c 20 46 54 53 35 5f 52 4f 4c 4c 42 41 43 4b  b, FTS5_ROLLBACK
12760 54 4f 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  TO, iSavepoint);
12770 0a 20 20 66 74 73 35 54 72 69 70 43 75 72 73 6f  .  fts5TripCurso
12780 72 73 28 70 54 61 62 29 3b 0a 20 20 72 65 74 75  rs(pTab);.  retu
12790 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35 53 74  rn sqlite3Fts5St
127a0 6f 72 61 67 65 52 6f 6c 6c 62 61 63 6b 28 70 54  orageRollback(pT
127b0 61 62 2d 3e 70 53 74 6f 72 61 67 65 29 3b 0a 7d  ab->pStorage);.}
127c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
127d0 20 61 20 6e 65 77 20 61 75 78 69 6c 69 61 72 79   a new auxiliary
127e0 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 67   function with g
127f0 6c 6f 62 61 6c 20 63 6f 6e 74 65 78 74 20 70 47  lobal context pG
12800 6c 6f 62 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  lobal..*/.static
12810 20 69 6e 74 20 66 74 73 35 43 72 65 61 74 65 41   int fts5CreateA
12820 75 78 28 0a 20 20 66 74 73 35 5f 61 70 69 20 2a  ux(.  fts5_api *
12830 70 41 70 69 2c 20 20 20 20 20 20 20 20 20 20 20  pApi,           
12840 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
12850 63 6f 6e 74 65 78 74 20 28 6f 6e 65 20 70 65 72  context (one per
12860 20 64 62 20 68 61 6e 64 6c 65 29 20 2a 2f 0a 20   db handle) */. 
12870 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
12880 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
12890 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20   /* Name of new 
128a0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
128b0 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 20 20  id *pUserData,  
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
128d0 20 55 73 65 72 20 64 61 74 61 20 66 6f 72 20 61   User data for a
128e0 75 78 2e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ux. function */.
128f0 20 20 66 74 73 35 5f 65 78 74 65 6e 73 69 6f 6e    fts5_extension
12900 5f 66 75 6e 63 74 69 6f 6e 20 78 46 75 6e 63 2c  _function xFunc,
12910 20 20 2f 2a 20 41 75 78 2e 20 66 75 6e 63 74 69    /* Aux. functi
12920 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  on implementatio
12930 6e 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 44 65  n */.  void(*xDe
12940 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 20 20 20  stroy)(void*)   
12950 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
12960 63 74 6f 72 20 66 6f 72 20 70 55 73 65 72 44 61  ctor for pUserDa
12970 74 61 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 47  ta */.){.  Fts5G
12980 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 20 3d  lobal *pGlobal =
12990 20 28 46 74 73 35 47 6c 6f 62 61 6c 2a 29 70 41   (Fts5Global*)pA
129a0 70 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  pi;.  int rc = s
129b0 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
129c0 66 75 6e 63 74 69 6f 6e 28 70 47 6c 6f 62 61 6c  function(pGlobal
129d0 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29  ->db, zName, -1)
129e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
129f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
12a00 35 41 75 78 69 6c 69 61 72 79 20 2a 70 41 75 78  5Auxiliary *pAux
12a10 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  ;.    int nName;
12a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a30 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12a40 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c   zName in bytes,
12a50 20 69 6e 63 6c 75 64 69 6e 67 20 5c 30 20 2a 2f   including \0 */
12a60 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
12a90 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
12aa0 74 65 20 2a 2f 0a 0a 20 20 20 20 6e 4e 61 6d 65  te */..    nName
12ab0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
12ac0 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 6e  Name) + 1;.    n
12ad0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
12ae0 73 35 41 75 78 69 6c 69 61 72 79 29 20 2b 20 6e  s5Auxiliary) + n
12af0 4e 61 6d 65 3b 0a 20 20 20 20 70 41 75 78 20 3d  Name;.    pAux =
12b00 20 28 46 74 73 35 41 75 78 69 6c 69 61 72 79 2a   (Fts5Auxiliary*
12b10 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
12b20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
12b30 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 6d 65  pAux ){.      me
12b40 6d 73 65 74 28 70 41 75 78 2c 20 30 2c 20 6e 42  mset(pAux, 0, nB
12b50 79 74 65 29 3b 0a 20 20 20 20 20 20 70 41 75 78  yte);.      pAux
12b60 2d 3e 7a 46 75 6e 63 20 3d 20 28 63 68 61 72 2a  ->zFunc = (char*
12b70 29 26 70 41 75 78 5b 31 5d 3b 0a 20 20 20 20 20  )&pAux[1];.     
12b80 20 6d 65 6d 63 70 79 28 70 41 75 78 2d 3e 7a 46   memcpy(pAux->zF
12b90 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  unc, zName, nNam
12ba0 65 29 3b 0a 20 20 20 20 20 20 70 41 75 78 2d 3e  e);.      pAux->
12bb0 70 47 6c 6f 62 61 6c 20 3d 20 70 47 6c 6f 62 61  pGlobal = pGloba
12bc0 6c 3b 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70  l;.      pAux->p
12bd0 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
12be0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 41 75 78  Data;.      pAux
12bf0 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b  ->xFunc = xFunc;
12c00 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65  .      pAux->xDe
12c10 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
12c20 3b 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 4e  ;.      pAux->pN
12c30 65 78 74 20 3d 20 70 47 6c 6f 62 61 6c 2d 3e 70  ext = pGlobal->p
12c40 41 75 78 3b 0a 20 20 20 20 20 20 70 47 6c 6f 62  Aux;.      pGlob
12c50 61 6c 2d 3e 70 41 75 78 20 3d 20 70 41 75 78 3b  al->pAux = pAux;
12c60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12c70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12c80 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
12c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12ca0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
12cb0 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 2e 20   new tokenizer. 
12cc0 54 68 69 73 20 69 73 20 74 68 65 20 69 6d 70 6c  This is the impl
12cd0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
12ce0 65 20 0a 2a 2a 20 66 74 73 35 5f 61 70 69 2e 78  e .** fts5_api.x
12cf0 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 28  CreateTokenizer(
12d00 29 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  ) method..*/.sta
12d10 74 69 63 20 69 6e 74 20 66 74 73 35 43 72 65 61  tic int fts5Crea
12d20 74 65 54 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 66  teTokenizer(.  f
12d30 74 73 35 5f 61 70 69 20 2a 70 41 70 69 2c 20 20  ts5_api *pApi,  
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d50 2a 20 47 6c 6f 62 61 6c 20 63 6f 6e 74 65 78 74  * Global context
12d60 20 28 6f 6e 65 20 70 65 72 20 64 62 20 68 61 6e   (one per db han
12d70 64 6c 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dle) */.  const 
12d80 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
12d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
12da0 65 20 6f 66 20 6e 65 77 20 66 75 6e 63 74 69 6f  e of new functio
12db0 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 55 73  n */.  void *pUs
12dc0 65 72 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  erData,         
12dd0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64         /* User d
12de0 61 74 61 20 66 6f 72 20 61 75 78 2e 20 66 75 6e  ata for aux. fun
12df0 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 74 73 35 5f  ction */.  fts5_
12e00 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65  tokenizer *pToke
12e10 6e 69 7a 65 72 2c 20 20 20 20 20 2f 2a 20 54 6f  nizer,     /* To
12e20 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e  kenizer implemen
12e30 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  tation */.  void
12e40 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
12e50 2a 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  *)          /* D
12e60 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 70 55  estructor for pU
12e70 73 65 72 44 61 74 61 20 2a 2f 0a 29 7b 0a 20 20  serData */.){.  
12e80 46 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f  Fts5Global *pGlo
12e90 62 61 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61  bal = (Fts5Globa
12ea0 6c 2a 29 70 41 70 69 3b 0a 20 20 46 74 73 35 54  l*)pApi;.  Fts5T
12eb0 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a  okenizerModule *
12ec0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  pNew;.  int nNam
12ed0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12ee0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
12ef0 6f 66 20 7a 4e 61 6d 65 20 61 6e 64 20 69 74 73  of zName and its
12f00 20 5c 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a   \0 terminator *
12f10 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
12f40 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
12f50 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
12f60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 6e 4e  SQLITE_OK;..  nN
12f70 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
12f80 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  n(zName) + 1;.  
12f90 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
12fa0 74 73 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75  ts5TokenizerModu
12fb0 6c 65 29 20 2b 20 6e 4e 61 6d 65 3b 0a 20 20 70  le) + nName;.  p
12fc0 4e 65 77 20 3d 20 28 46 74 73 35 54 6f 6b 65 6e  New = (Fts5Token
12fd0 69 7a 65 72 4d 6f 64 75 6c 65 2a 29 73 71 6c 69  izerModule*)sqli
12fe0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
12ff0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
13000 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
13010 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
13020 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28   pNew->zName = (
13030 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
13040 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d      memcpy(pNew-
13050 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
13060 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Name);.    pNew-
13070 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
13080 65 72 44 61 74 61 3b 0a 20 20 20 20 70 4e 65 77  erData;.    pNew
13090 2d 3e 78 20 3d 20 2a 70 54 6f 6b 65 6e 69 7a 65  ->x = *pTokenize
130a0 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78 44 65  r;.    pNew->xDe
130b0 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
130c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ;.    pNew->pNex
130d0 74 20 3d 20 70 47 6c 6f 62 61 6c 2d 3e 70 54 6f  t = pGlobal->pTo
130e0 6b 3b 0a 20 20 20 20 70 47 6c 6f 62 61 6c 2d 3e  k;.    pGlobal->
130f0 70 54 6f 6b 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pTok = pNew;.   
13100 20 69 66 28 20 70 4e 65 77 2d 3e 70 4e 65 78 74   if( pNew->pNext
13110 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 47 6c  ==0 ){.      pGl
13120 6f 62 61 6c 2d 3e 70 44 66 6c 74 54 6f 6b 20 3d  obal->pDfltTok =
13130 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d   pNew;.    }.  }
13140 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
13150 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
13160 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
13170 0a 0a 73 74 61 74 69 63 20 46 74 73 35 54 6f 6b  ..static Fts5Tok
13180 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 66 74  enizerModule *ft
13190 73 35 4c 6f 63 61 74 65 54 6f 6b 65 6e 69 7a 65  s5LocateTokenize
131a0 72 28 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c 20  r(.  Fts5Global 
131b0 2a 70 47 6c 6f 62 61 6c 2c 20 0a 20 20 63 6f 6e  *pGlobal, .  con
131c0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
131d0 7b 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  {.  Fts5Tokenize
131e0 72 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20  rModule *pMod = 
131f0 30 3b 0a 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  0;..  if( zName=
13200 3d 30 20 29 7b 0a 20 20 20 20 70 4d 6f 64 20 3d  =0 ){.    pMod =
13210 20 70 47 6c 6f 62 61 6c 2d 3e 70 44 66 6c 74 54   pGlobal->pDfltT
13220 6f 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ok;.  }else{.   
13230 20 66 6f 72 28 70 4d 6f 64 3d 70 47 6c 6f 62 61   for(pMod=pGloba
13240 6c 2d 3e 70 54 6f 6b 3b 20 70 4d 6f 64 3b 20 70  l->pTok; pMod; p
13250 4d 6f 64 3d 70 4d 6f 64 2d 3e 70 4e 65 78 74 29  Mod=pMod->pNext)
13260 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
13270 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d  te3_stricmp(zNam
13280 65 2c 20 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 29 3d  e, pMod->zName)=
13290 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
132a0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
132b0 70 4d 6f 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pMod;.}../*.** F
132c0 69 6e 64 20 61 20 74 6f 6b 65 6e 69 7a 65 72 2e  ind a tokenizer.
132d0 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6d 70   This is the imp
132e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
132f0 68 65 20 0a 2a 2a 20 66 74 73 35 5f 61 70 69 2e  he .** fts5_api.
13300 78 46 69 6e 64 54 6f 6b 65 6e 69 7a 65 72 28 29  xFindTokenizer()
13310 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
13320 69 63 20 69 6e 74 20 66 74 73 35 46 69 6e 64 54  ic int fts5FindT
13330 6f 6b 65 6e 69 7a 65 72 28 0a 20 20 66 74 73 35  okenizer(.  fts5
13340 5f 61 70 69 20 2a 70 41 70 69 2c 20 20 20 20 20  _api *pApi,     
13350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
13360 6c 6f 62 61 6c 20 63 6f 6e 74 65 78 74 20 28 6f  lobal context (o
13370 6e 65 20 70 65 72 20 64 62 20 68 61 6e 64 6c 65  ne per db handle
13380 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ) */.  const cha
13390 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
133a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
133b0 66 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 20 2a  f new function *
133c0 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 55 73 65  /.  void **ppUse
133d0 72 44 61 74 61 2c 0a 20 20 66 74 73 35 5f 74 6f  rData,.  fts5_to
133e0 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69  kenizer *pTokeni
133f0 7a 65 72 20 20 20 20 20 20 2f 2a 20 50 6f 70 75  zer      /* Popu
13400 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74  late this object
13410 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13420 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
13430 74 73 35 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75  ts5TokenizerModu
13440 6c 65 20 2a 70 4d 6f 64 3b 0a 0a 20 20 70 4d 6f  le *pMod;..  pMo
13450 64 20 3d 20 66 74 73 35 4c 6f 63 61 74 65 54 6f  d = fts5LocateTo
13460 6b 65 6e 69 7a 65 72 28 28 46 74 73 35 47 6c 6f  kenizer((Fts5Glo
13470 62 61 6c 2a 29 70 41 70 69 2c 20 7a 4e 61 6d 65  bal*)pApi, zName
13480 29 3b 0a 20 20 69 66 28 20 70 4d 6f 64 20 29 7b  );.  if( pMod ){
13490 0a 20 20 20 20 2a 70 54 6f 6b 65 6e 69 7a 65 72  .    *pTokenizer
134a0 20 3d 20 70 4d 6f 64 2d 3e 78 3b 0a 20 20 20 20   = pMod->x;.    
134b0 2a 70 70 55 73 65 72 44 61 74 61 20 3d 20 70 4d  *ppUserData = pM
134c0 6f 64 2d 3e 70 55 73 65 72 44 61 74 61 3b 0a 20  od->pUserData;. 
134d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
134e0 65 74 28 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 30  et(pTokenizer, 0
134f0 2c 20 73 69 7a 65 6f 66 28 66 74 73 35 5f 74 6f  , sizeof(fts5_to
13500 6b 65 6e 69 7a 65 72 29 29 3b 0a 20 20 20 20 72  kenizer));.    r
13510 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
13520 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
13530 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
13540 65 33 46 74 73 35 47 65 74 54 6f 6b 65 6e 69 7a  e3Fts5GetTokeniz
13550 65 72 28 0a 20 20 46 74 73 35 47 6c 6f 62 61 6c  er(.  Fts5Global
13560 20 2a 70 47 6c 6f 62 61 6c 2c 20 0a 20 20 63 6f   *pGlobal, .  co
13570 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  nst char **azArg
13580 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
13590 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 2a  Fts5Tokenizer **
135a0 70 70 54 6f 6b 2c 0a 20 20 66 74 73 35 5f 74 6f  ppTok,.  fts5_to
135b0 6b 65 6e 69 7a 65 72 20 2a 2a 70 70 54 6f 6b 41  kenizer **ppTokA
135c0 70 69 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  pi,.  char **pzE
135d0 72 72 0a 29 7b 0a 20 20 46 74 73 35 54 6f 6b 65  rr.){.  Fts5Toke
135e0 6e 69 7a 65 72 4d 6f 64 75 6c 65 20 2a 70 4d 6f  nizerModule *pMo
135f0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
13600 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 4d 6f 64  LITE_OK;..  pMod
13610 20 3d 20 66 74 73 35 4c 6f 63 61 74 65 54 6f 6b   = fts5LocateTok
13620 65 6e 69 7a 65 72 28 70 47 6c 6f 62 61 6c 2c 20  enizer(pGlobal, 
13630 6e 41 72 67 3d 3d 30 20 3f 20 30 20 3a 20 61 7a  nArg==0 ? 0 : az
13640 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70  Arg[0]);.  if( p
13650 4d 6f 64 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Mod==0 ){.    as
13660 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29 3b 0a  sert( nArg>0 );.
13670 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13680 45 52 52 4f 52 3b 0a 20 20 20 20 2a 70 7a 45 72  ERROR;.    *pzEr
13690 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
136a0 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 74 6f 6b  ntf("no such tok
136b0 65 6e 69 7a 65 72 3a 20 25 73 22 2c 20 61 7a 41  enizer: %s", azA
136c0 72 67 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  rg[0]);.  }else{
136d0 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 2d 3e  .    rc = pMod->
136e0 78 2e 78 43 72 65 61 74 65 28 70 4d 6f 64 2d 3e  x.xCreate(pMod->
136f0 70 55 73 65 72 44 61 74 61 2c 20 26 61 7a 41 72  pUserData, &azAr
13700 67 5b 31 5d 2c 20 28 6e 41 72 67 3f 6e 41 72 67  g[1], (nArg?nArg
13710 2d 31 3a 30 29 2c 20 70 70 54 6f 6b 29 3b 0a 20  -1:0), ppTok);. 
13720 20 20 20 2a 70 70 54 6f 6b 41 70 69 20 3d 20 26     *ppTokApi = &
13730 70 4d 6f 64 2d 3e 78 3b 0a 20 20 20 20 69 66 28  pMod->x;.    if(
13740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
13750 26 20 70 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  & pzErr ){.     
13760 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
13770 33 5f 6d 70 72 69 6e 74 66 28 22 65 72 72 6f 72  3_mprintf("error
13780 20 69 6e 20 74 6f 6b 65 6e 69 7a 65 72 20 63 6f   in tokenizer co
13790 6e 73 74 72 75 63 74 6f 72 22 29 3b 0a 20 20 20  nstructor");.   
137a0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
137b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
137c0 20 20 20 2a 70 70 54 6f 6b 41 70 69 20 3d 20 30     *ppTokApi = 0
137d0 3b 0a 20 20 20 20 2a 70 70 54 6f 6b 20 3d 20 30  ;.    *ppTok = 0
137e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
137f0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  rc;.}..static vo
13800 69 64 20 66 74 73 35 4d 6f 64 75 6c 65 44 65 73  id fts5ModuleDes
13810 74 72 6f 79 28 76 6f 69 64 20 2a 70 43 74 78 29  troy(void *pCtx)
13820 7b 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  {.  Fts5Tokenize
13830 72 4d 6f 64 75 6c 65 20 2a 70 54 6f 6b 2c 20 2a  rModule *pTok, *
13840 70 4e 65 78 74 54 6f 6b 3b 0a 20 20 46 74 73 35  pNextTok;.  Fts5
13850 41 75 78 69 6c 69 61 72 79 20 2a 70 41 75 78 2c  Auxiliary *pAux,
13860 20 2a 70 4e 65 78 74 41 75 78 3b 0a 20 20 46 74   *pNextAux;.  Ft
13870 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62 61  s5Global *pGloba
13880 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61 6c 2a  l = (Fts5Global*
13890 29 70 43 74 78 3b 0a 0a 20 20 66 6f 72 28 70 41  )pCtx;..  for(pA
138a0 75 78 3d 70 47 6c 6f 62 61 6c 2d 3e 70 41 75 78  ux=pGlobal->pAux
138b0 3b 20 70 41 75 78 3b 20 70 41 75 78 3d 70 4e 65  ; pAux; pAux=pNe
138c0 78 74 41 75 78 29 7b 0a 20 20 20 20 70 4e 65 78  xtAux){.    pNex
138d0 74 41 75 78 20 3d 20 70 41 75 78 2d 3e 70 4e 65  tAux = pAux->pNe
138e0 78 74 3b 0a 20 20 20 20 69 66 28 20 70 41 75 78  xt;.    if( pAux
138f0 2d 3e 78 44 65 73 74 72 6f 79 20 29 20 70 41 75  ->xDestroy ) pAu
13900 78 2d 3e 78 44 65 73 74 72 6f 79 28 70 41 75 78  x->xDestroy(pAux
13910 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20  ->pUserData);.  
13920 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13930 41 75 78 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  Aux);.  }..  for
13940 28 70 54 6f 6b 3d 70 47 6c 6f 62 61 6c 2d 3e 70  (pTok=pGlobal->p
13950 54 6f 6b 3b 20 70 54 6f 6b 3b 20 70 54 6f 6b 3d  Tok; pTok; pTok=
13960 70 4e 65 78 74 54 6f 6b 29 7b 0a 20 20 20 20 70  pNextTok){.    p
13970 4e 65 78 74 54 6f 6b 20 3d 20 70 54 6f 6b 2d 3e  NextTok = pTok->
13980 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
13990 54 6f 6b 2d 3e 78 44 65 73 74 72 6f 79 20 29 20  Tok->xDestroy ) 
139a0 70 54 6f 6b 2d 3e 78 44 65 73 74 72 6f 79 28 70  pTok->xDestroy(p
139b0 54 6f 6b 2d 3e 70 55 73 65 72 44 61 74 61 29 3b  Tok->pUserData);
139c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
139d0 65 28 70 54 6f 6b 29 3b 0a 20 20 7d 0a 0a 20 20  e(pTok);.  }..  
139e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 47 6c  sqlite3_free(pGl
139f0 6f 62 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  obal);.}..static
13a00 20 76 6f 69 64 20 66 74 73 35 46 74 73 35 46 75   void fts5Fts5Fu
13a10 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
13a20 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
13a30 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
13a40 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
13a50 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13a80 20 61 72 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74   args */.  sqlit
13a90 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
13aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
13ab0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
13ac0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 47 6c 6f   */.){.  Fts5Glo
13ad0 62 61 6c 20 2a 70 47 6c 6f 62 61 6c 20 3d 20 28  bal *pGlobal = (
13ae0 46 74 73 35 47 6c 6f 62 61 6c 2a 29 73 71 6c 69  Fts5Global*)sqli
13af0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
13b00 74 78 29 3b 0a 20 20 66 74 73 35 5f 61 70 69 20  tx);.  fts5_api 
13b10 2a 2a 70 70 41 70 69 3b 0a 20 20 55 4e 55 53 45  **ppApi;.  UNUSE
13b20 44 5f 50 41 52 41 4d 28 6e 41 72 67 29 3b 0a 20  D_PARAM(nArg);. 
13b30 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
13b40 20 29 3b 0a 20 20 70 70 41 70 69 20 3d 20 28 66   );.  ppApi = (f
13b50 74 73 35 5f 61 70 69 2a 2a 29 73 71 6c 69 74 65  ts5_api**)sqlite
13b60 33 5f 76 61 6c 75 65 5f 70 6f 69 6e 74 65 72 28  3_value_pointer(
13b70 61 70 41 72 67 5b 30 5d 2c 20 22 66 74 73 35 5f  apArg[0], "fts5_
13b80 61 70 69 5f 70 74 72 22 29 3b 0a 20 20 69 66 28  api_ptr");.  if(
13b90 20 70 70 41 70 69 20 29 20 2a 70 70 41 70 69 20   ppApi ) *ppApi 
13ba0 3d 20 26 70 47 6c 6f 62 61 6c 2d 3e 61 70 69 3b  = &pGlobal->api;
13bb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
13bc0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 66 74 73 35  entation of fts5
13bd0 5f 73 6f 75 72 63 65 5f 69 64 28 29 20 66 75 6e  _source_id() fun
13be0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
13bf0 20 76 6f 69 64 20 66 74 73 35 53 6f 75 72 63 65   void fts5Source
13c00 49 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  IdFunc(.  sqlite
13c10 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
13c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
13c30 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
13c40 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
13c50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13c60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13c70 72 20 6f 66 20 61 72 67 73 20 2a 2f 0a 20 20 73  r of args */.  s
13c80 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
13c90 70 55 6e 75 73 65 64 20 20 20 20 20 20 20 20 2f  pUnused        /
13ca0 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
13cb0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ents */.){.  ass
13cc0 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 29 3b 0a  ert( nArg==0 );.
13cd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28    UNUSED_PARAM2(
13ce0 6e 41 72 67 2c 20 61 70 55 6e 75 73 65 64 29 3b  nArg, apUnused);
13cf0 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
13d00 74 5f 74 65 78 74 28 70 43 74 78 2c 20 22 2d 2d  t_text(pCtx, "--
13d10 46 54 53 35 2d 53 4f 55 52 43 45 2d 49 44 2d 2d  FTS5-SOURCE-ID--
13d20 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ", -1, SQLITE_TR
13d30 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 73 74 61  ANSIENT);.}..sta
13d40 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 69 74  tic int fts5Init
13d50 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
13d60 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
13d70 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 66 74 73  lite3_module fts
13d80 35 4d 6f 64 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  5Mod = {.    /* 
13d90 69 56 65 72 73 69 6f 6e 20 20 20 20 20 20 2a 2f  iVersion      */
13da0 20 32 2c 0a 20 20 20 20 2f 2a 20 78 43 72 65 61   2,.    /* xCrea
13db0 74 65 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35  te       */ fts5
13dc0 43 72 65 61 74 65 4d 65 74 68 6f 64 2c 0a 20 20  CreateMethod,.  
13dd0 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 20 20    /* xConnect   
13de0 20 20 20 2a 2f 20 66 74 73 35 43 6f 6e 6e 65 63     */ fts5Connec
13df0 74 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20  tMethod,.    /* 
13e00 78 42 65 73 74 49 6e 64 65 78 20 20 20 20 2a 2f  xBestIndex    */
13e10 20 66 74 73 35 42 65 73 74 49 6e 64 65 78 4d 65   fts5BestIndexMe
13e20 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 44 69  thod,.    /* xDi
13e30 73 63 6f 6e 6e 65 63 74 20 20 20 2a 2f 20 66 74  sconnect   */ ft
13e40 73 35 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68  s5DisconnectMeth
13e50 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 44 65 73 74  od,.    /* xDest
13e60 72 6f 79 20 20 20 20 20 20 2a 2f 20 66 74 73 35  roy      */ fts5
13e70 44 65 73 74 72 6f 79 4d 65 74 68 6f 64 2c 0a 20  DestroyMethod,. 
13e80 20 20 20 2f 2a 20 78 4f 70 65 6e 20 20 20 20 20     /* xOpen     
13e90 20 20 20 20 2a 2f 20 66 74 73 35 4f 70 65 6e 4d      */ fts5OpenM
13ea0 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 43  ethod,.    /* xC
13eb0 6c 6f 73 65 20 20 20 20 20 20 20 20 2a 2f 20 66  lose        */ f
13ec0 74 73 35 43 6c 6f 73 65 4d 65 74 68 6f 64 2c 0a  ts5CloseMethod,.
13ed0 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 20      /* xFilter  
13ee0 20 20 20 20 20 2a 2f 20 66 74 73 35 46 69 6c 74       */ fts5Filt
13ef0 65 72 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a  erMethod,.    /*
13f00 20 78 4e 65 78 74 20 20 20 20 20 20 20 20 20 2a   xNext         *
13f10 2f 20 66 74 73 35 4e 65 78 74 4d 65 74 68 6f 64  / fts5NextMethod
13f20 2c 0a 20 20 20 20 2f 2a 20 78 45 6f 66 20 20 20  ,.    /* xEof   
13f30 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35 45 6f         */ fts5Eo
13f40 66 4d 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20  fMethod,.    /* 
13f50 78 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 2a 2f  xColumn       */
13f60 20 66 74 73 35 43 6f 6c 75 6d 6e 4d 65 74 68 6f   fts5ColumnMetho
13f70 64 2c 0a 20 20 20 20 2f 2a 20 78 52 6f 77 69 64  d,.    /* xRowid
13f80 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 35 52          */ fts5R
13f90 6f 77 69 64 4d 65 74 68 6f 64 2c 0a 20 20 20 20  owidMethod,.    
13fa0 2f 2a 20 78 55 70 64 61 74 65 20 20 20 20 20 20  /* xUpdate      
13fb0 20 2a 2f 20 66 74 73 35 55 70 64 61 74 65 4d 65   */ fts5UpdateMe
13fc0 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 42 65  thod,.    /* xBe
13fd0 67 69 6e 20 20 20 20 20 20 20 20 2a 2f 20 66 74  gin        */ ft
13fe0 73 35 42 65 67 69 6e 4d 65 74 68 6f 64 2c 0a 20  s5BeginMethod,. 
13ff0 20 20 20 2f 2a 20 78 53 79 6e 63 20 20 20 20 20     /* xSync     
14000 20 20 20 20 2a 2f 20 66 74 73 35 53 79 6e 63 4d      */ fts5SyncM
14010 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 43  ethod,.    /* xC
14020 6f 6d 6d 69 74 20 20 20 20 20 20 20 2a 2f 20 66  ommit       */ f
14030 74 73 35 43 6f 6d 6d 69 74 4d 65 74 68 6f 64 2c  ts5CommitMethod,
14040 0a 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63  .    /* xRollbac
14050 6b 20 20 20 20 20 2a 2f 20 66 74 73 35 52 6f 6c  k     */ fts5Rol
14060 6c 62 61 63 6b 4d 65 74 68 6f 64 2c 0a 20 20 20  lbackMethod,.   
14070 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f   /* xFindFunctio
14080 6e 20 2a 2f 20 66 74 73 35 46 69 6e 64 46 75 6e  n */ fts5FindFun
14090 63 74 69 6f 6e 4d 65 74 68 6f 64 2c 0a 20 20 20  ctionMethod,.   
140a0 20 2f 2a 20 78 52 65 6e 61 6d 65 20 20 20 20 20   /* xRename     
140b0 20 20 2a 2f 20 66 74 73 35 52 65 6e 61 6d 65 4d    */ fts5RenameM
140c0 65 74 68 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 53  ethod,.    /* xS
140d0 61 76 65 70 6f 69 6e 74 20 20 20 20 2a 2f 20 66  avepoint    */ f
140e0 74 73 35 53 61 76 65 70 6f 69 6e 74 4d 65 74 68  ts5SavepointMeth
140f0 6f 64 2c 0a 20 20 20 20 2f 2a 20 78 52 65 6c 65  od,.    /* xRele
14100 61 73 65 20 20 20 20 20 20 2a 2f 20 66 74 73 35  ase      */ fts5
14110 52 65 6c 65 61 73 65 4d 65 74 68 6f 64 2c 0a 20  ReleaseMethod,. 
14120 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54     /* xRollbackT
14130 6f 20 20 20 2a 2f 20 66 74 73 35 52 6f 6c 6c 62  o   */ fts5Rollb
14140 61 63 6b 54 6f 4d 65 74 68 6f 64 2c 0a 20 20 7d  ackToMethod,.  }
14150 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  ;..  int rc;.  F
14160 74 73 35 47 6c 6f 62 61 6c 20 2a 70 47 6c 6f 62  ts5Global *pGlob
14170 61 6c 20 3d 20 30 3b 0a 0a 20 20 70 47 6c 6f 62  al = 0;..  pGlob
14180 61 6c 20 3d 20 28 46 74 73 35 47 6c 6f 62 61 6c  al = (Fts5Global
14190 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
141a0 28 73 69 7a 65 6f 66 28 46 74 73 35 47 6c 6f 62  (sizeof(Fts5Glob
141b0 61 6c 29 29 3b 0a 20 20 69 66 28 20 70 47 6c 6f  al));.  if( pGlo
141c0 62 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  bal==0 ){.    rc
141d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
141e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 6f  .  }else{.    vo
141f0 69 64 20 2a 70 20 3d 20 28 76 6f 69 64 2a 29 70  id *p = (void*)p
14200 47 6c 6f 62 61 6c 3b 0a 20 20 20 20 6d 65 6d 73  Global;.    mems
14210 65 74 28 70 47 6c 6f 62 61 6c 2c 20 30 2c 20 73  et(pGlobal, 0, s
14220 69 7a 65 6f 66 28 46 74 73 35 47 6c 6f 62 61 6c  izeof(Fts5Global
14230 29 29 3b 0a 20 20 20 20 70 47 6c 6f 62 61 6c 2d  ));.    pGlobal-
14240 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 47  >db = db;.    pG
14250 6c 6f 62 61 6c 2d 3e 61 70 69 2e 69 56 65 72 73  lobal->api.iVers
14260 69 6f 6e 20 3d 20 32 3b 0a 20 20 20 20 70 47 6c  ion = 2;.    pGl
14270 6f 62 61 6c 2d 3e 61 70 69 2e 78 43 72 65 61 74  obal->api.xCreat
14280 65 46 75 6e 63 74 69 6f 6e 20 3d 20 66 74 73 35  eFunction = fts5
14290 43 72 65 61 74 65 41 75 78 3b 0a 20 20 20 20 70  CreateAux;.    p
142a0 47 6c 6f 62 61 6c 2d 3e 61 70 69 2e 78 43 72 65  Global->api.xCre
142b0 61 74 65 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 66  ateTokenizer = f
142c0 74 73 35 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a  ts5CreateTokeniz
142d0 65 72 3b 0a 20 20 20 20 70 47 6c 6f 62 61 6c 2d  er;.    pGlobal-
142e0 3e 61 70 69 2e 78 46 69 6e 64 54 6f 6b 65 6e 69  >api.xFindTokeni
142f0 7a 65 72 20 3d 20 66 74 73 35 46 69 6e 64 54 6f  zer = fts5FindTo
14300 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20 72 63 20  kenizer;.    rc 
14310 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
14320 5f 6d 6f 64 75 6c 65 5f 76 32 28 64 62 2c 20 22  _module_v2(db, "
14330 66 74 73 35 22 2c 20 26 66 74 73 35 4d 6f 64 2c  fts5", &fts5Mod,
14340 20 70 2c 20 66 74 73 35 4d 6f 64 75 6c 65 44 65   p, fts5ModuleDe
14350 73 74 72 6f 79 29 3b 0a 20 20 20 20 69 66 28 20  stroy);.    if( 
14360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
14370 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
14380 49 6e 64 65 78 49 6e 69 74 28 64 62 29 3b 0a 20  IndexInit(db);. 
14390 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
143a0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69  E_OK ) rc = sqli
143b0 74 65 33 46 74 73 35 45 78 70 72 49 6e 69 74 28  te3Fts5ExprInit(
143c0 70 47 6c 6f 62 61 6c 2c 20 64 62 29 3b 0a 20 20  pGlobal, db);.  
143d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
143e0 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74  _OK ) rc = sqlit
143f0 65 33 46 74 73 35 41 75 78 49 6e 69 74 28 26 70  e3Fts5AuxInit(&p
14400 47 6c 6f 62 61 6c 2d 3e 61 70 69 29 3b 0a 20 20  Global->api);.  
14410 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14420 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74  _OK ) rc = sqlit
14430 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49  e3Fts5TokenizerI
14440 6e 69 74 28 26 70 47 6c 6f 62 61 6c 2d 3e 61 70  nit(&pGlobal->ap
14450 69 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  i);.    if( rc==
14460 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
14470 20 73 71 6c 69 74 65 33 46 74 73 35 56 6f 63 61   sqlite3Fts5Voca
14480 62 49 6e 69 74 28 70 47 6c 6f 62 61 6c 2c 20 64  bInit(pGlobal, d
14490 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  b);.    if( rc==
144a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
144b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
144c0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
144d0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 22  .          db, "
144e0 66 74 73 35 22 2c 20 31 2c 20 53 51 4c 49 54 45  fts5", 1, SQLITE
144f0 5f 55 54 46 38 2c 20 70 2c 20 66 74 73 35 46 74  _UTF8, p, fts5Ft
14500 73 35 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20  s5Func, 0, 0.   
14510 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
14520 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14530 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
14540 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14550 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20  unction(.       
14560 20 20 20 64 62 2c 20 22 66 74 73 35 5f 73 6f 75     db, "fts5_sou
14570 72 63 65 5f 69 64 22 2c 20 30 2c 20 53 51 4c 49  rce_id", 0, SQLI
14580 54 45 5f 55 54 46 38 2c 20 70 2c 20 66 74 73 35  TE_UTF8, p, fts5
14590 53 6f 75 72 63 65 49 64 46 75 6e 63 2c 20 30 2c  SourceIdFunc, 0,
145a0 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
145b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 53  }.  }..  /* If S
145c0 51 4c 49 54 45 5f 46 54 53 35 5f 45 4e 41 42 4c  QLITE_FTS5_ENABL
145d0 45 5f 54 45 53 54 5f 4d 49 20 69 73 20 64 65 66  E_TEST_MI is def
145e0 69 6e 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  ined, assume tha
145f0 74 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  t the file.  ** 
14600 66 74 73 35 5f 74 65 73 74 5f 6d 69 2e 63 20 69  fts5_test_mi.c i
14610 73 20 63 6f 6d 70 69 6c 65 64 20 61 6e 64 20 6c  s compiled and l
14620 69 6e 6b 65 64 20 69 6e 74 6f 20 74 68 65 20 65  inked into the e
14630 78 65 63 75 74 61 62 6c 65 2e 20 41 6e 64 20 63  xecutable. And c
14640 61 6c 6c 0a 20 20 2a 2a 20 69 74 73 20 65 6e 74  all.  ** its ent
14650 72 79 20 70 6f 69 6e 74 20 74 6f 20 65 6e 61 62  ry point to enab
14660 6c 65 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f  le the matchinfo
14670 28 29 20 64 65 6d 6f 2e 20 20 2a 2f 0a 23 69 66  () demo.  */.#if
14680 64 65 66 20 53 51 4c 49 54 45 5f 46 54 53 35 5f  def SQLITE_FTS5_
14690 45 4e 41 42 4c 45 5f 54 45 53 54 5f 4d 49 0a 20  ENABLE_TEST_MI. 
146a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
146b0 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  OK ){.    extern
146c0 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35   int sqlite3Fts5
146d0 54 65 73 74 52 65 67 69 73 74 65 72 4d 61 74 63  TestRegisterMatc
146e0 68 69 6e 66 6f 28 73 71 6c 69 74 65 33 2a 29 3b  hinfo(sqlite3*);
146f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14700 33 46 74 73 35 54 65 73 74 52 65 67 69 73 74 65  3Fts5TestRegiste
14710 72 4d 61 74 63 68 69 6e 66 6f 28 64 62 29 3b 0a  rMatchinfo(db);.
14720 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
14730 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14740 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
14750 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73  functions are us
14760 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20 74  ed to register t
14770 68 65 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 53  he module with S
14780 51 4c 69 74 65 2e 20 49 66 0a 2a 2a 20 74 68 69  QLite. If.** thi
14790 73 20 6d 6f 64 75 6c 65 20 69 73 20 62 65 69 6e  s module is bein
147a0 67 20 62 75 69 6c 74 20 61 73 20 70 61 72 74 20  g built as part 
147b0 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  of the SQLite co
147c0 72 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 45 20  re (SQLITE_CORE 
147d0 69 73 0a 2a 2a 20 64 65 66 69 6e 65 64 29 2c 20  is.** defined), 
147e0 74 68 65 6e 20 73 71 6c 69 74 65 33 5f 6f 70 65  then sqlite3_ope
147f0 6e 28 29 20 77 69 6c 6c 20 63 61 6c 6c 20 73 71  n() will call sq
14800 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28 29 20  lite3Fts5Init() 
14810 64 69 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  directly..**.** 
14820 4f 72 2c 20 69 66 20 74 68 69 73 20 6d 6f 64 75  Or, if this modu
14830 6c 65 20 69 73 20 62 65 69 6e 67 20 62 75 69 6c  le is being buil
14840 74 20 61 73 20 61 20 6c 6f 61 64 61 62 6c 65 20  t as a loadable 
14850 65 78 74 65 6e 73 69 6f 6e 2c 20 0a 2a 2a 20 73  extension, .** s
14860 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28 29  qlite3Fts5Init()
14870 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
14880 74 68 65 20 74 77 6f 20 73 74 61 6e 64 61 72 64  the two standard
14890 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
148a0 20 73 71 6c 69 74 65 33 5f 66 74 73 5f 69 6e 69   sqlite3_fts_ini
148b0 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  t() and sqlite3_
148c0 66 74 73 35 5f 69 6e 69 74 28 29 20 64 65 66 69  fts5_init() defi
148d0 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ned instead..*/.
148e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 43  #ifndef SQLITE_C
148f0 4f 52 45 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  ORE.#ifdef _WIN3
14900 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  2.__declspec(dll
14910 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69  export).#endif.i
14920 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 5f 69  nt sqlite3_fts_i
14930 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  nit(.  sqlite3 *
14940 64 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  db,.  char **pzE
14950 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73  rrMsg,.  const s
14960 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
14970 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53  nes *pApi.){.  S
14980 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
14990 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28  INIT2(pApi);.  (
149a0 76 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b 20 20  void)pzErrMsg;  
149b0 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65  /* Unused parame
149c0 74 65 72 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ter */.  return 
149d0 66 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 7d 0a  fts5Init(db);.}.
149e0 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f  .#ifdef _WIN32._
149f0 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
14a00 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20  ort).#endif.int 
14a10 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 69 6e 69  sqlite3_fts5_ini
14a20 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
14a30 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
14a40 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73 71 6c  Msg,.  const sql
14a50 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
14a60 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c  s *pApi.){.  SQL
14a70 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
14a80 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28 76 6f  IT2(pApi);.  (vo
14a90 69 64 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a  id)pzErrMsg;  /*
14aa0 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65   Unused paramete
14ab0 72 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 66 74  r */.  return ft
14ac0 73 35 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23 65  s5Init(db);.}.#e
14ad0 6c 73 65 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  lse.int sqlite3F
14ae0 74 73 35 49 6e 69 74 28 73 71 6c 69 74 65 33 20  ts5Init(sqlite3 
14af0 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  *db){.  return f
14b00 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23  ts5Init(db);.}.#
14b10 65 6e 64 69 66 0a                                endif.