/ Hex Artifact Content
Login

Artifact 7be86d17525cfae6ed462fc3c519efc44488ac329890f77491c8f82871f57e17:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 30 34 2d 31 39  /*.** 2018-04-19
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 74 61 62  implements a tab
0190: 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
01a0: 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 70  on:.**.**      p
01b0: 72 65 66 69 78 65 73 28 27 61 62 63 64 65 66 67  refixes('abcdefg
01c0: 27 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e  ').**.** The fun
01d0: 63 74 69 6f 6e 20 68 61 73 20 61 20 73 69 6e 67  ction has a sing
01e0: 6c 65 20 28 6e 6f 6e 2d 48 49 44 44 45 4e 29 20  le (non-HIDDEN) 
01f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 70 72 65  column named pre
0200: 66 69 78 20 74 68 61 74 20 74 61 6b 65 73 0a 2a  fix that takes.*
0210: 2a 20 6f 6e 20 61 6c 6c 20 70 72 65 66 69 78 65  * on all prefixe
0220: 73 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  s of the string 
0230: 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2c  in its argument,
0240: 20 69 6e 63 6c 75 64 69 6e 67 20 61 6e 20 65 6d   including an em
0250: 70 74 79 20 73 74 72 69 6e 67 0a 2a 2a 20 61 6e  pty string.** an
0260: 64 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  d the input stri
0270: 6e 67 20 69 74 73 65 6c 66 2e 20 20 54 68 65 20  ng itself.  The 
0280: 6f 72 64 65 72 20 6f 66 20 70 72 65 66 69 78 65  order of prefixe
0290: 73 20 69 73 20 66 72 6f 6d 20 6c 6f 6e 67 65 73  s is from longes
02a0: 74 0a 2a 2a 20 74 6f 20 73 68 6f 72 74 65 73 74  t.** to shortest
02b0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
02c0: 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c  d(SQLITE_CORE) |
02d0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
02e0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
02f0: 42 4c 45 29 0a 23 69 66 20 21 64 65 66 69 6e 65  BLE).#if !define
0300: 64 28 53 51 4c 49 54 45 49 4e 54 5f 48 29 0a 23  d(SQLITEINT_H).#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0320: 65 78 74 2e 68 22 0a 23 65 6e 64 69 66 0a 53 51  ext.h".#endif.SQ
0330: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
0340: 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65 20 3c 73  NIT1.#include <s
0350: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
0360: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a  e <assert.h>../*
0370: 20 70 72 65 66 69 78 65 73 5f 76 74 61 62 20 69   prefixes_vtab i
0380: 73 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20  s a subclass of 
0390: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 77 68 69  sqlite3_vtab whi
03a0: 63 68 20 69 73 0a 2a 2a 20 75 6e 64 65 72 6c 79  ch is.** underly
03b0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
03c0: 6f 6e 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  on of the virtua
03d0: 6c 20 74 61 62 6c 65 0a 2a 2f 0a 74 79 70 65 64  l table.*/.typed
03e0: 65 66 20 73 74 72 75 63 74 20 70 72 65 66 69 78  ef struct prefix
03f0: 65 73 5f 76 74 61 62 20 70 72 65 66 69 78 65 73  es_vtab prefixes
0400: 5f 76 74 61 62 3b 0a 73 74 72 75 63 74 20 70 72  _vtab;.struct pr
0410: 65 66 69 78 65 73 5f 76 74 61 62 20 7b 0a 20 20  efixes_vtab {.  
0420: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73  sqlite3_vtab bas
0430: 65 3b 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73  e;  /* Base clas
0440: 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73  s - must be firs
0450: 74 20 2a 2f 0a 20 20 2f 2a 20 4e 6f 20 61 64 64  t */.  /* No add
0460: 69 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 61  itional fields a
0470: 72 65 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  re necessary */.
0480: 7d 3b 0a 0a 2f 2a 20 70 72 65 66 69 78 65 73 5f  };../* prefixes_
0490: 63 75 72 73 6f 72 20 69 73 20 61 20 73 75 62 63  cursor is a subc
04a0: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
04b0: 76 74 61 62 5f 63 75 72 73 6f 72 20 77 68 69 63  vtab_cursor whic
04c0: 68 20 77 69 6c 6c 0a 2a 2a 20 73 65 72 76 65 20  h will.** serve 
04d0: 61 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  as the underlyin
04e0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
04f0: 20 6f 66 20 61 20 63 75 72 73 6f 72 20 74 68 61   of a cursor tha
0500: 74 20 73 63 61 6e 73 0a 2a 2a 20 6f 76 65 72 20  t scans.** over 
0510: 72 6f 77 73 20 6f 66 20 74 68 65 20 72 65 73 75  rows of the resu
0520: 6c 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  lt.*/.typedef st
0530: 72 75 63 74 20 70 72 65 66 69 78 65 73 5f 63 75  ruct prefixes_cu
0540: 72 73 6f 72 20 70 72 65 66 69 78 65 73 5f 63 75  rsor prefixes_cu
0550: 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 70 72 65  rsor;.struct pre
0560: 66 69 78 65 73 5f 63 75 72 73 6f 72 20 7b 0a 20  fixes_cursor {. 
0570: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
0580: 72 73 6f 72 20 62 61 73 65 3b 20 20 2f 2a 20 42  rsor base;  /* B
0590: 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74  ase class - must
05a0: 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73   be first */.  s
05b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f  qlite3_int64 iRo
05c0: 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  wid;      /* The
05d0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 63 68 61 72   rowid */.  char
05e0: 20 2a 7a 53 74 72 3b 20 20 20 20 20 20 20 20 20   *zStr;         
05f0: 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
0600: 61 6c 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  al string to be 
0610: 70 72 65 66 69 78 65 64 20 2a 2f 0a 20 20 69 6e  prefixed */.  in
0620: 74 20 6e 53 74 72 3b 20 20 20 20 20 20 20 20 20  t nStr;         
0630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
0640: 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  th of the string
0650: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a   in bytes */.};.
0660: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 65 66 69  ./*.** The prefi
0670: 78 65 73 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74  xesConnect() met
0680: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  hod is invoked t
0690: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a  o create a new.*
06a0: 2a 20 74 65 6d 70 6c 61 74 65 20 76 69 72 74 75  * template virtu
06b0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
06c0: 54 68 69 6e 6b 20 6f 66 20 74 68 69 73 20 72 6f  Think of this ro
06d0: 75 74 69 6e 65 20 61 73 20 74 68 65 20 63 6f 6e  utine as the con
06e0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 70 72 65  structor for pre
06f0: 66 69 78 65 73 5f 76 74 61 62 20 6f 62 6a 65 63  fixes_vtab objec
0700: 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  ts..**.** All th
0710: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
0720: 20 74 6f 20 64 6f 20 69 73 3a 0a 2a 2a 0a 2a 2a   to do is:.**.**
0730: 20 20 20 20 28 31 29 20 41 6c 6c 6f 63 61 74 65      (1) Allocate
0740: 20 74 68 65 20 70 72 65 66 69 78 65 73 5f 76 74   the prefixes_vt
0750: 61 62 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 6e  ab object and in
0760: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 66 69 65  itialize all fie
0770: 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  lds..**.**    (2
0780: 29 20 54 65 6c 6c 20 53 51 4c 69 74 65 20 28 76  ) Tell SQLite (v
0790: 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 5f 64  ia the sqlite3_d
07a0: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 69 6e  eclare_vtab() in
07b0: 74 65 72 66 61 63 65 29 20 77 68 61 74 20 74 68  terface) what th
07c0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 75  e.**        resu
07d0: 6c 74 20 73 65 74 20 6f 66 20 71 75 65 72 69 65  lt set of querie
07e0: 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 69  s against the vi
07f0: 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  rtual table will
0800: 20 6c 6f 6f 6b 20 6c 69 6b 65 2e 0a 2a 2f 0a 73   look like..*/.s
0810: 74 61 74 69 63 20 69 6e 74 20 70 72 65 66 69 78  tatic int prefix
0820: 65 73 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c  esConnect(.  sql
0830: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
0840: 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
0850: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
0860: 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
0870: 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
0880: 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tab,.  char **pz
0890: 45 72 72 0a 29 7b 0a 20 20 70 72 65 66 69 78 65  Err.){.  prefixe
08a0: 73 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20 20  s_vtab *pNew;.  
08b0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
08c0: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
08d0: 76 74 61 62 28 64 62 2c 0a 20 20 20 20 20 20 20  vtab(db,.       
08e0: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
08f0: 45 20 70 72 65 66 69 78 65 73 28 70 72 65 66 69  E prefixes(prefi
0900: 78 20 54 45 58 54 2c 20 6f 72 69 67 69 6e 61 6c  x TEXT, original
0910: 5f 73 74 72 69 6e 67 20 54 45 58 54 20 48 49 44  _string TEXT HID
0920: 44 45 4e 29 22 0a 20 20 20 20 20 20 20 29 3b 0a  DEN)".       );.
0930: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
0940: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  _OK ){.    pNew 
0950: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
0960: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
0970: 29 3b 0a 20 20 20 20 2a 70 70 56 74 61 62 20 3d  );.    *ppVtab =
0980: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 29   (sqlite3_vtab*)
0990: 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 70 4e  pNew;.    if( pN
09a0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
09b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
09c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
09d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
09e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
09f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0a00: 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 64 65  method is the de
0a10: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 70 72 65  structor for pre
0a20: 66 69 78 65 73 5f 76 74 61 62 20 6f 62 6a 65 63  fixes_vtab objec
0a30: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
0a40: 74 20 70 72 65 66 69 78 65 73 44 69 73 63 6f 6e  t prefixesDiscon
0a50: 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61  nect(sqlite3_vta
0a60: 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 70 72 65  b *pVtab){.  pre
0a70: 66 69 78 65 73 5f 76 74 61 62 20 2a 70 20 3d 20  fixes_vtab *p = 
0a80: 28 70 72 65 66 69 78 65 73 5f 76 74 61 62 2a 29  (prefixes_vtab*)
0a90: 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVtab;.  sqlite3
0aa0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
0ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
0ac0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
0ad0: 6f 72 20 66 6f 72 20 61 20 6e 65 77 20 70 72 65  or for a new pre
0ae0: 66 69 78 65 73 5f 63 75 72 73 6f 72 20 6f 62 6a  fixes_cursor obj
0af0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
0b00: 6e 74 20 70 72 65 66 69 78 65 73 4f 70 65 6e 28  nt prefixesOpen(
0b10: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 2c  sqlite3_vtab *p,
0b20: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
0b30: 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
0b40: 7b 0a 20 20 70 72 65 66 69 78 65 73 5f 63 75 72  {.  prefixes_cur
0b50: 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75  sor *pCur;.  pCu
0b60: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
0b70: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  oc( sizeof(*pCur
0b80: 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d  ) );.  if( pCur=
0b90: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
0ba0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
0bb0: 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69 7a 65  et(pCur, 0, size
0bc0: 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 2a 70  of(*pCur));.  *p
0bd0: 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d  pCursor = &pCur-
0be0: 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  >base;.  return 
0bf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
0c00: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66  .** Destructor f
0c10: 6f 72 20 61 20 70 72 65 66 69 78 65 73 5f 63 75  or a prefixes_cu
0c20: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
0c30: 69 6e 74 20 70 72 65 66 69 78 65 73 43 6c 6f 73  int prefixesClos
0c40: 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  e(sqlite3_vtab_c
0c50: 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 70  ursor *cur){.  p
0c60: 72 65 66 69 78 65 73 5f 63 75 72 73 6f 72 20 2a  refixes_cursor *
0c70: 70 43 75 72 20 3d 20 28 70 72 65 66 69 78 65 73  pCur = (prefixes
0c80: 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  _cursor*)cur;.  
0c90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
0ca0: 72 2d 3e 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69  r->zStr);.  sqli
0cb0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a  te3_free(pCur);.
0cc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0cd0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  OK;.}.../*.** Ad
0ce0: 76 61 6e 63 65 20 61 20 70 72 65 66 69 78 65 73  vance a prefixes
0cf0: 5f 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 6e  _cursor to its n
0d00: 65 78 74 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  ext row of outpu
0d10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
0d20: 20 70 72 65 66 69 78 65 73 4e 65 78 74 28 73 71   prefixesNext(sq
0d30: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
0d40: 72 20 2a 63 75 72 29 7b 0a 20 20 70 72 65 66 69  r *cur){.  prefi
0d50: 78 65 73 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  xes_cursor *pCur
0d60: 20 3d 20 28 70 72 65 66 69 78 65 73 5f 63 75 72   = (prefixes_cur
0d70: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 70 43 75 72  sor*)cur;.  pCur
0d80: 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 72 65  ->iRowid++;.  re
0d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0db0: 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e  values of column
0dc0: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74  s for the row at
0dd0: 20 77 68 69 63 68 20 74 68 65 20 70 72 65 66 69   which the prefi
0de0: 78 65 73 5f 63 75 72 73 6f 72 0a 2a 2a 20 69 73  xes_cursor.** is
0df0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
0e00: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
0e10: 6e 74 20 70 72 65 66 69 78 65 73 43 6f 6c 75 6d  nt prefixesColum
0e20: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  n(.  sqlite3_vta
0e30: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 20  b_cursor *cur,  
0e40: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 2a   /* The cursor *
0e50: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  /.  sqlite3_cont
0e60: 65 78 74 20 2a 63 74 78 2c 20 20 20 20 20 20 20  ext *ctx,       
0e70: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
0e80: 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73  t to sqlite3_res
0e90: 75 6c 74 5f 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69  ult_...() */.  i
0ea0: 6e 74 20 69 20 20 20 20 20 20 20 20 20 20 20 20  nt i            
0eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
0ec0: 69 63 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65  ich column to re
0ed0: 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 70 72 65  turn */.){.  pre
0ee0: 66 69 78 65 73 5f 63 75 72 73 6f 72 20 2a 70 43  fixes_cursor *pC
0ef0: 75 72 20 3d 20 28 70 72 65 66 69 78 65 73 5f 63  ur = (prefixes_c
0f00: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 73 77  ursor*)cur;.  sw
0f10: 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20 63  itch( i ){.    c
0f20: 61 73 65 20 30 3a 0a 20 20 20 20 20 20 73 71 6c  ase 0:.      sql
0f30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
0f40: 28 63 74 78 2c 20 70 43 75 72 2d 3e 7a 53 74 72  (ctx, pCur->zStr
0f50: 2c 20 70 43 75 72 2d 3e 6e 53 74 72 20 2d 20 28  , pCur->nStr - (
0f60: 69 6e 74 29 70 43 75 72 2d 3e 69 52 6f 77 69 64  int)pCur->iRowid
0f70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 20              0); 
0f90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0fa0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
0fb0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0fc0: 74 65 78 74 28 63 74 78 2c 20 70 43 75 72 2d 3e  text(ctx, pCur->
0fd0: 7a 53 74 72 2c 20 70 43 75 72 2d 3e 6e 53 74 72  zStr, pCur->nStr
0fe0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
0ff0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1000: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1010: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1020: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72  owid for the cur
1030: 72 65 6e 74 20 72 6f 77 2e 20 20 49 6e 20 74 68  rent row.  In th
1040: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
1050: 6e 2c 20 74 68 65 0a 2a 2a 20 72 6f 77 69 64 20  n, the.** rowid 
1060: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1070: 68 65 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  he output value.
1080: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1090: 72 65 66 69 78 65 73 52 6f 77 69 64 28 73 71 6c  refixesRowid(sql
10a0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
10b0: 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e   *cur, sqlite_in
10c0: 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20  t64 *pRowid){.  
10d0: 70 72 65 66 69 78 65 73 5f 63 75 72 73 6f 72 20  prefixes_cursor 
10e0: 2a 70 43 75 72 20 3d 20 28 70 72 65 66 69 78 65  *pCur = (prefixe
10f0: 73 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  s_cursor*)cur;. 
1100: 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72 2d   *pRowid = pCur-
1110: 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72  >iRowid;.  retur
1120: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1130: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1140: 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
1150: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 6f  has been moved o
1160: 66 66 20 6f 66 20 74 68 65 20 6c 61 73 74 0a 2a  ff of the last.*
1170: 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
1180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1190: 72 65 66 69 78 65 73 45 6f 66 28 73 71 6c 69 74  refixesEof(sqlit
11a0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
11b0: 63 75 72 29 7b 0a 20 20 70 72 65 66 69 78 65 73  cur){.  prefixes
11c0: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
11d0: 28 70 72 65 66 69 78 65 73 5f 63 75 72 73 6f 72  (prefixes_cursor
11e0: 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20  *)cur;.  return 
11f0: 70 43 75 72 2d 3e 69 52 6f 77 69 64 3e 70 43 75  pCur->iRowid>pCu
1200: 72 2d 3e 6e 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->nStr;.}../*.*
1210: 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73  * This method is
1220: 20 63 61 6c 6c 65 64 20 74 6f 20 22 72 65 77 69   called to "rewi
1230: 6e 64 22 20 74 68 65 20 70 72 65 66 69 78 65 73  nd" the prefixes
1240: 5f 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 62  _cursor object b
1250: 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ack.** to the fi
1260: 72 73 74 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  rst row of outpu
1270: 74 2e 20 20 54 68 69 73 20 6d 65 74 68 6f 64 20  t.  This method 
1280: 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64  is always called
1290: 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 63   at least.** onc
12a0: 65 20 70 72 69 6f 72 20 74 6f 20 61 6e 79 20 63  e prior to any c
12b0: 61 6c 6c 20 74 6f 20 70 72 65 66 69 78 65 73 43  all to prefixesC
12c0: 6f 6c 75 6d 6e 28 29 20 6f 72 20 70 72 65 66 69  olumn() or prefi
12d0: 78 65 73 52 6f 77 69 64 28 29 20 6f 72 20 0a 2a  xesRowid() or .*
12e0: 2a 20 70 72 65 66 69 78 65 73 45 6f 66 28 29 2e  * prefixesEof().
12f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1300: 72 65 66 69 78 65 73 46 69 6c 74 65 72 28 0a 20  refixesFilter(. 
1310: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
1320: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
1330: 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
1340: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
1350: 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
1360: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
1370: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 70 72 65 66  **argv.){.  pref
1380: 69 78 65 73 5f 63 75 72 73 6f 72 20 2a 70 43 75  ixes_cursor *pCu
1390: 72 20 3d 20 28 70 72 65 66 69 78 65 73 5f 63 75  r = (prefixes_cu
13a0: 72 73 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73  rsor *)pVtabCurs
13b0: 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  or;.  sqlite3_fr
13c0: 65 65 28 70 43 75 72 2d 3e 7a 53 74 72 29 3b 0a  ee(pCur->zStr);.
13d0: 20 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b 0a    if( argc>0 ){.
13e0: 20 20 20 20 70 43 75 72 2d 3e 7a 53 74 72 20 3d      pCur->zStr =
13f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1400: 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76  ("%s", sqlite3_v
1410: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
1420: 5d 29 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e  ]));.    pCur->n
1430: 53 74 72 20 3d 20 70 43 75 72 2d 3e 7a 53 74 72  Str = pCur->zStr
1440: 20 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70   ? (int)strlen(p
1450: 43 75 72 2d 3e 7a 53 74 72 29 20 3a 20 30 3b 0a  Cur->zStr) : 0;.
1460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
1470: 72 2d 3e 7a 53 74 72 20 3d 20 30 3b 0a 20 20 20  r->zStr = 0;.   
1480: 20 70 43 75 72 2d 3e 6e 53 74 72 20 3d 20 30 3b   pCur->nStr = 0;
1490: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 52 6f  .  }.  pCur->iRo
14a0: 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  wid = 0;.  retur
14b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14c0: 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c  /*.** SQLite wil
14d0: 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6d 65  l invoke this me
14e0: 74 68 6f 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  thod one or more
14f0: 20 74 69 6d 65 73 20 77 68 69 6c 65 20 70 6c 61   times while pla
1500: 6e 6e 69 6e 67 20 61 20 71 75 65 72 79 0a 2a 2a  nning a query.**
1510: 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 76   that uses the v
1520: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
1530: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
1540: 73 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 61  s to create.** a
1550: 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
1560: 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20  each invocation 
1570: 61 6e 64 20 63 6f 6d 70 75 74 65 20 61 6e 20 65  and compute an e
1580: 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 66 6f  stimated cost fo
1590: 72 20 74 68 61 74 0a 2a 2a 20 70 6c 61 6e 2e 0a  r that.** plan..
15a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
15b0: 65 66 69 78 65 73 42 65 73 74 49 6e 64 65 78 28  efixesBestIndex(
15c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
15d0: 2a 74 61 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f  *tab,.  sqlite3_
15e0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
15f0: 49 6e 66 6f 0a 29 7b 0a 20 20 2f 2a 20 53 65 61  Info.){.  /* Sea
1600: 72 63 68 20 66 6f 72 20 61 20 75 73 61 62 6c 65  rch for a usable
1610: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1620: 61 69 6e 74 20 61 67 61 69 6e 73 74 20 63 6f 6c  aint against col
1630: 75 6d 6e 20 31 20 0a 20 20 2a 2a 20 28 6f 72 69  umn 1 .  ** (ori
1640: 67 69 6e 61 6c 5f 73 74 72 69 6e 67 29 20 61 6e  ginal_string) an
1650: 64 20 75 73 65 20 69 74 20 69 66 20 61 74 20 61  d use it if at a
1660: 6c 6c 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  ll possible */. 
1670: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
1680: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
1690: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
16a0: 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
16b0: 70 3d 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  p=pIdxInfo->aCon
16c0: 73 74 72 61 69 6e 74 3b 20 69 3c 70 49 64 78 49  straint; i<pIdxI
16d0: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
16e0: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
16f0: 20 69 66 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21   if( p->iColumn!
1700: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =1 ) continue;. 
1710: 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 53 51     if( p->op!=SQ
1720: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
1730: 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69  RAINT_EQ ) conti
1740: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 70 2d  nue;.    if( !p-
1750: 3e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  >usable ) contin
1760: 75 65 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  ue;.    pIdxInfo
1770: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
1780: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
1790: 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 1;.    pIdxInf
17a0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
17b0: 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b  age[i].omit = 1;
17c0: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
17d0: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28  stimatedCost = (
17e0: 64 6f 75 62 6c 65 29 31 30 3b 0a 20 20 20 20 70  double)10;.    p
17f0: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1800: 65 64 52 6f 77 73 20 3d 20 31 30 3b 0a 20 20 20  edRows = 10;.   
1810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1820: 4b 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66  K;.  }.  pIdxInf
1830: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
1840: 20 3d 20 28 64 6f 75 62 6c 65 29 31 30 30 30 30   = (double)10000
1850: 30 30 30 30 30 3b 0a 20 20 70 49 64 78 49 6e 66  00000;.  pIdxInf
1860: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
1870: 20 3d 20 31 30 30 30 30 30 30 30 30 30 3b 0a 20   = 1000000000;. 
1880: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1890: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
18a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
18b0: 74 75 72 65 20 64 65 66 69 6e 65 73 20 61 6c 6c  ture defines all
18c0: 20 74 68 65 20 6d 65 74 68 6f 64 73 20 66 6f 72   the methods for
18d0: 20 74 68 65 20 0a 2a 2a 20 76 69 72 74 75 61 6c   the .** virtual
18e0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
18f0: 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  c sqlite3_module
1900: 20 70 72 65 66 69 78 65 73 4d 6f 64 75 6c 65 20   prefixesModule 
1910: 3d 20 7b 0a 20 20 2f 2a 20 69 56 65 72 73 69 6f  = {.  /* iVersio
1920: 6e 20 20 20 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20  n    */ 0,.  /* 
1930: 78 43 72 65 61 74 65 20 20 20 20 20 2a 2f 20 30  xCreate     */ 0
1940: 2c 0a 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20  ,.  /* xConnect 
1950: 20 20 20 2a 2f 20 70 72 65 66 69 78 65 73 43 6f     */ prefixesCo
1960: 6e 6e 65 63 74 2c 0a 20 20 2f 2a 20 78 42 65 73  nnect,.  /* xBes
1970: 74 49 6e 64 65 78 20 20 2a 2f 20 70 72 65 66 69  tIndex  */ prefi
1980: 78 65 73 42 65 73 74 49 6e 64 65 78 2c 0a 20 20  xesBestIndex,.  
1990: 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a  /* xDisconnect *
19a0: 2f 20 70 72 65 66 69 78 65 73 44 69 73 63 6f 6e  / prefixesDiscon
19b0: 6e 65 63 74 2c 0a 20 20 2f 2a 20 78 44 65 73 74  nect,.  /* xDest
19c0: 72 6f 79 20 20 20 20 2a 2f 20 30 2c 0a 20 20 2f  roy    */ 0,.  /
19d0: 2a 20 78 4f 70 65 6e 20 20 20 20 20 20 20 2a 2f  * xOpen       */
19e0: 20 70 72 65 66 69 78 65 73 4f 70 65 6e 2c 0a 20   prefixesOpen,. 
19f0: 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20 20 20 20   /* xClose      
1a00: 2a 2f 20 70 72 65 66 69 78 65 73 43 6c 6f 73 65  */ prefixesClose
1a10: 2c 0a 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 20  ,.  /* xFilter  
1a20: 20 20 20 2a 2f 20 70 72 65 66 69 78 65 73 46 69     */ prefixesFi
1a30: 6c 74 65 72 2c 0a 20 20 2f 2a 20 78 4e 65 78 74  lter,.  /* xNext
1a40: 20 20 20 20 20 20 20 2a 2f 20 70 72 65 66 69 78         */ prefix
1a50: 65 73 4e 65 78 74 2c 0a 20 20 2f 2a 20 78 45 6f  esNext,.  /* xEo
1a60: 66 20 20 20 20 20 20 20 20 2a 2f 20 70 72 65 66  f        */ pref
1a70: 69 78 65 73 45 6f 66 2c 0a 20 20 2f 2a 20 78 43  ixesEof,.  /* xC
1a80: 6f 6c 75 6d 6e 20 20 20 20 20 2a 2f 20 70 72 65  olumn     */ pre
1a90: 66 69 78 65 73 43 6f 6c 75 6d 6e 2c 0a 20 20 2f  fixesColumn,.  /
1aa0: 2a 20 78 52 6f 77 69 64 20 20 20 20 20 20 2a 2f  * xRowid      */
1ab0: 20 70 72 65 66 69 78 65 73 52 6f 77 69 64 2c 0a   prefixesRowid,.
1ac0: 20 20 2f 2a 20 78 55 70 64 61 74 65 20 20 20 20    /* xUpdate    
1ad0: 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78 42 65 67   */ 0,.  /* xBeg
1ae0: 69 6e 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20  in      */ 0,.  
1af0: 2f 2a 20 78 53 79 6e 63 20 20 20 20 20 20 20 2a  /* xSync       *
1b00: 2f 20 30 2c 0a 20 20 2f 2a 20 78 43 6f 6d 6d 69  / 0,.  /* xCommi
1b10: 74 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 2f 2a  t     */ 0,.  /*
1b20: 20 78 52 6f 6c 6c 62 61 63 6b 20 20 20 2a 2f 20   xRollback   */ 
1b30: 30 2c 0a 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74  0,.  /* xFindMet
1b40: 68 6f 64 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78  hod */ 0,.  /* x
1b50: 52 65 6e 61 6d 65 20 20 20 20 20 2a 2f 20 30 2c  Rename     */ 0,
1b60: 0a 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74  .  /* xSavepoint
1b70: 20 20 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78 52 65    */ 0,.  /* xRe
1b80: 6c 65 61 73 65 20 20 20 20 2a 2f 20 30 2c 0a 20  lease    */ 0,. 
1b90: 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20   /* xRollbackTo 
1ba0: 2a 2f 20 30 2c 0a 20 20 2f 2a 20 78 53 68 61 64  */ 0,.  /* xShad
1bb0: 6f 77 4e 61 6d 65 20 2a 2f 20 30 0a 7d 3b 0a 0a  owName */ 0.};..
1bc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
1bd0: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 51 4c 49  copy of the SQLI
1be0: 54 45 5f 53 4b 49 50 5f 55 54 46 38 28 7a 49 6e  TE_SKIP_UTF8(zIn
1bf0: 29 20 6d 61 63 72 6f 20 69 6e 20 73 71 6c 69 74  ) macro in sqlit
1c00: 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 41 73  eInt.h..**.** As
1c10: 73 75 6d 69 6e 67 20 7a 49 6e 20 70 6f 69 6e 74  suming zIn point
1c20: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
1c30: 79 74 65 20 6f 66 20 61 20 55 54 46 2d 38 20 63  yte of a UTF-8 c
1c40: 68 61 72 61 63 74 65 72 2c 0a 2a 2a 20 61 64 76  haracter,.** adv
1c50: 61 6e 63 65 20 7a 49 6e 20 74 6f 20 70 6f 69 6e  ance zIn to poin
1c60: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  t to the first b
1c70: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 78 74 20  yte of the next 
1c80: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e  UTF-8 character.
1c90: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 45 46  .*/.#define PREF
1ca0: 49 58 5f 53 4b 49 50 5f 55 54 46 38 28 7a 49 6e  IX_SKIP_UTF8(zIn
1cb0: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
1cc0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
1cd0: 66 28 20 28 2a 28 7a 49 6e 2b 2b 29 29 3e 3d 30  f( (*(zIn++))>=0
1ce0: 78 63 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  xc0 ){          
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 5c 0a 20 20 20 20 77 68 69 6c 65 28      \.    while(
1d10: 20 28 2a 7a 49 6e 20 26 20 30 78 63 30 29 3d 3d   (*zIn & 0xc0)==
1d20: 30 78 38 30 20 29 7b 20 7a 49 6e 2b 2b 3b 20 7d  0x80 ){ zIn++; }
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1d40: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
1d80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1d90: 6f 66 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 66  of function pref
1da0: 69 78 5f 6c 65 6e 67 74 68 28 29 2e 20 54 68 69  ix_length(). Thi
1db0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 63 63 65 70  s function accep
1dc0: 74 73 20 74 77 6f 0a 2a 2a 20 73 74 72 69 6e 67  ts two.** string
1dd0: 73 20 61 73 20 61 72 67 75 6d 65 6e 74 73 20 61  s as arguments a
1de0: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 6c  nd returns the l
1df0: 65 6e 67 74 68 20 69 6e 20 63 68 61 72 61 63 74  ength in charact
1e00: 65 72 73 20 28 6e 6f 74 20 62 79 74 65 73 29 2c  ers (not bytes),
1e10: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6e 67   .** of the long
1e20: 65 73 74 20 70 72 65 66 69 78 20 73 68 61 72 65  est prefix share
1e30: 64 20 62 79 20 74 68 65 20 74 77 6f 20 73 74 72  d by the two str
1e40: 69 6e 67 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ings. For exampl
1e50: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 70 72 65 66 69  e:.**.**   prefi
1e60: 78 5f 6c 65 6e 67 74 68 28 27 61 62 63 64 78 78  x_length('abcdxx
1e70: 78 27 2c 20 27 61 62 63 79 79 27 29 20 3d 3d 20  x', 'abcyy') == 
1e80: 33 0a 2a 2a 20 20 20 70 72 65 66 69 78 5f 6c 65  3.**   prefix_le
1e90: 6e 67 74 68 28 27 61 62 63 64 78 78 78 27 2c 20  ngth('abcdxxx', 
1ea0: 27 62 63 79 79 79 27 29 20 3d 3d 20 30 0a 2a 2a  'bcyyy') == 0.**
1eb0: 20 20 20 70 72 65 66 69 78 5f 6c 65 6e 67 74 68     prefix_length
1ec0: 28 27 61 62 63 64 78 78 78 27 2c 20 27 61 62 27  ('abcdxxx', 'ab'
1ed0: 29 20 20 20 20 3d 3d 20 32 0a 2a 2a 20 20 20 70  )    == 2.**   p
1ee0: 72 65 66 69 78 5f 6c 65 6e 67 74 68 28 27 61 62  refix_length('ab
1ef0: 27 2c 20 20 20 20 20 20 27 61 62 63 64 27 29 20  ',      'abcd') 
1f00: 20 3d 3d 20 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73   == 2.**.** This
1f10: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
1f20: 73 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 77  s the input is w
1f30: 65 6c 6c 2d 66 6f 72 6d 65 64 20 75 74 66 2d 38  ell-formed utf-8
1f40: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a  . If it is not,.
1f50: 2a 2a 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  ** it is possibl
1f60: 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  e for this funct
1f70: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2d 31  ion to return -1
1f80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f90: 20 70 72 65 66 69 78 4c 65 6e 67 74 68 46 75 6e   prefixLengthFun
1fa0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
1fb0: 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74  text *ctx,.  int
1fc0: 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33   nVal,.  sqlite3
1fd0: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29  _value **apVal.)
1fe0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  {.  int nByte;  
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2010: 20 62 79 74 65 73 20 74 6f 20 63 6f 6d 70 61 72   bytes to compar
2020: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 20  e */.  int nRet 
2030: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2040: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2050: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73   value */.  cons
2060: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2070: 2a 7a 4c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  *zL = sqlite3_va
2080: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
2090: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ]);.  const unsi
20a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 52 20 3d 20  gned char *zR = 
20b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
20c0: 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  xt(apVal[1]);.  
20d0: 69 6e 74 20 6e 4c 20 3d 20 73 71 6c 69 74 65 33  int nL = sqlite3
20e0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56  _value_bytes(apV
20f0: 61 6c 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52  al[0]);.  int nR
2100: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2110: 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29  _bytes(apVal[1])
2120: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 42  ;.  int i;..  nB
2130: 79 74 65 20 3d 20 28 6e 4c 20 3e 20 6e 52 20 3f  yte = (nL > nR ?
2140: 20 6e 4c 20 3a 20 6e 52 29 3b 0a 20 20 66 6f 72   nL : nR);.  for
2150: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
2160: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 4c 5b  ++){.    if( zL[
2170: 69 5d 21 3d 7a 52 5b 69 5d 20 29 20 62 72 65 61  i]!=zR[i] ) brea
2180: 6b 3b 0a 20 20 20 20 69 66 28 20 28 7a 4c 5b 69  k;.    if( (zL[i
2190: 5d 20 26 20 30 78 43 30 29 21 3d 30 78 38 30 20  ] & 0xC0)!=0x80 
21a0: 29 20 6e 52 65 74 2b 2b 3b 0a 20 20 7d 0a 0a 20  ) nRet++;.  }.. 
21b0: 20 69 66 28 20 28 7a 4c 5b 69 5d 20 26 20 30 78   if( (zL[i] & 0x
21c0: 43 30 29 3d 3d 30 78 38 30 20 29 20 6e 52 65 74  C0)==0x80 ) nRet
21d0: 2d 2d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  --;.  sqlite3_re
21e0: 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 6e 52  sult_int(ctx, nR
21f0: 65 74 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f  et);.}..#ifdef _
2200: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
2210: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
2220: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  if.int sqlite3_p
2230: 72 65 66 69 78 65 73 5f 69 6e 69 74 28 0a 20 20  refixes_init(.  
2240: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
2250: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c  char **pzErrMsg,
2260: 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65   .  const sqlite
2270: 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a  3_api_routines *
2280: 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63  pApi.){.  int rc
2290: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22a0: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
22b0: 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20  _INIT2(pApi);.  
22c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
22d0: 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22  ate_module(db, "
22e0: 70 72 65 66 69 78 65 73 22 2c 20 26 70 72 65 66  prefixes", &pref
22f0: 69 78 65 73 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a  ixesModule, 0);.
2300: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2310: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2320: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2330: 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20  unction(.       
2340: 20 64 62 2c 20 22 70 72 65 66 69 78 5f 6c 65 6e   db, "prefix_len
2350: 67 74 68 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  gth", 2, SQLITE_
2360: 55 54 46 38 2c 20 30 2c 20 70 72 65 66 69 78 4c  UTF8, 0, prefixL
2370: 65 6e 67 74 68 46 75 6e 63 2c 20 30 2c 20 30 0a  engthFunc, 0, 0.
2380: 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74      );.  }.  ret
2390: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
23a0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
23b0: 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 21 64 65  ITE_CORE) || !de
23c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23d0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
23e0: 2a 2f 0a                                         */.