/ Hex Artifact Content
Login

Artifact babb0dc2bf116029e3e7c9a618b8a1377045303e:


0000: 2f 2a 0a 2a 2a 20 32 30 31 33 2d 30 36 2d 31 32  /*.** 2013-06-12
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 41 20 73 68 69 6d 20 74 68 61  **.** A shim tha
0180: 74 20 73 69 74 73 20 62 65 74 77 65 65 6e 20 74  t sits between t
0190: 68 65 20 53 51 4c 69 74 65 20 76 69 72 74 75 61  he SQLite virtua
01a0: 6c 20 74 61 62 6c 65 20 69 6e 74 65 72 66 61 63  l table interfac
01b0: 65 20 61 6e 64 0a 2a 2a 20 72 75 6e 74 69 6d 65  e and.** runtime
01c0: 73 20 77 69 74 68 20 67 61 72 62 61 67 65 20 63  s with garbage c
01d0: 6f 6c 6c 65 63 74 6f 72 20 62 61 73 65 64 20 6d  ollector based m
01e0: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
01f0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0200: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 53 51 4c  qlite3ext.h".SQL
0210: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
0220: 49 54 31 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  IT1.#include <as
0230: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
0240: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 23 69 66   <string.h>..#if
0250: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0260: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f  _VIRTUALTABLE../
0270: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
0280: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
0290: 73 74 72 75 63 74 20 76 74 73 68 69 6d 5f 61 75  struct vtshim_au
02a0: 78 20 76 74 73 68 69 6d 5f 61 75 78 3b 0a 74 79  x vtshim_aux;.ty
02b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 76 74 73  pedef struct vts
02c0: 68 69 6d 5f 76 74 61 62 20 76 74 73 68 69 6d 5f  him_vtab vtshim_
02d0: 76 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74  vtab;.typedef st
02e0: 72 75 63 74 20 76 74 73 68 69 6d 5f 63 75 72 73  ruct vtshim_curs
02f0: 6f 72 20 76 74 73 68 69 6d 5f 63 75 72 73 6f 72  or vtshim_cursor
0300: 3b 0a 0a 0a 2f 2a 20 54 68 65 20 76 74 73 68 69  ;.../* The vtshi
0310: 6d 5f 61 75 78 20 61 72 67 75 6d 65 6e 74 20 69  m_aux argument i
0320: 73 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  s the auxiliary 
0330: 70 61 72 61 6d 65 74 65 72 20 74 68 61 74 20 69  parameter that i
0340: 73 20 70 61 73 73 65 64 0a 2a 2a 20 69 6e 74 6f  s passed.** into
0350: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
0360: 6d 6f 64 75 6c 65 5f 76 32 28 29 2e 0a 2a 2f 0a  module_v2()..*/.
0370: 73 74 72 75 63 74 20 76 74 73 68 69 6d 5f 61 75  struct vtshim_au
0380: 78 20 7b 0a 20 20 76 6f 69 64 20 2a 70 43 68 69  x {.  void *pChi
0390: 6c 64 41 75 78 3b 20 20 20 20 20 20 20 20 20 20  ldAux;          
03a0: 20 20 20 20 2f 2a 20 70 41 75 78 20 66 6f 72 20      /* pAux for 
03b0: 63 68 69 6c 64 20 76 69 72 74 75 61 6c 20 74 61  child virtual ta
03c0: 62 6c 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  bles */.  void (
03d0: 2a 78 43 68 69 6c 64 44 65 73 74 72 6f 79 29 28  *xChildDestroy)(
03e0: 76 6f 69 64 2a 29 3b 20 2f 2a 20 44 65 73 74 72  void*); /* Destr
03f0: 75 63 74 6f 72 20 66 6f 72 20 70 43 68 69 6c 64  uctor for pChild
0400: 41 75 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  Aux */.  sqlite3
0410: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 20 20  _module *pMod;  
0420: 20 20 20 20 20 20 20 2f 2a 20 4d 65 74 68 6f 64         /* Method
0430: 73 20 66 6f 72 20 63 68 69 6c 64 20 76 69 72 74  s for child virt
0440: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
0450: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0470: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   The database to
0480: 20 77 68 69 63 68 20 77 65 20 61 72 65 20 61 74   which we are at
0490: 74 61 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72  tached */.  char
04a0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
04b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
04c0: 65 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 20  e of the module 
04d0: 2a 2f 0a 20 20 69 6e 74 20 62 44 69 73 70 6f 73  */.  int bDispos
04e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
04f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 69     /* True if di
0500: 73 70 6f 73 65 64 20 2a 2f 0a 20 20 76 74 73 68  sposed */.  vtsh
0510: 69 6d 5f 76 74 61 62 20 2a 70 41 6c 6c 56 74 61  im_vtab *pAllVta
0520: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  b;        /* Lis
0530: 74 20 6f 66 20 61 6c 6c 20 76 74 73 68 69 6d 5f  t of all vtshim_
0540: 76 74 61 62 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  vtab objects */.
0550: 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65    sqlite3_module
0560: 20 73 53 65 6c 66 3b 20 20 20 20 20 20 20 20 20   sSelf;         
0570: 2f 2a 20 4d 65 74 68 6f 64 73 20 75 73 65 64 20  /* Methods used 
0580: 62 79 20 74 68 69 73 20 73 68 69 6d 20 2a 2f 0a  by this shim */.
0590: 7d 3b 0a 0a 2f 2a 20 41 20 76 74 73 68 69 6d 20  };../* A vtshim 
05a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
05b0: 6a 65 63 74 20 2a 2f 0a 73 74 72 75 63 74 20 76  ject */.struct v
05c0: 74 73 68 69 6d 5f 76 74 61 62 20 7b 0a 20 20 73  tshim_vtab {.  s
05d0: 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73 65  qlite3_vtab base
05e0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20  ;       /* Base 
05f0: 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20  class - must be 
0600: 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
0610: 65 33 5f 76 74 61 62 20 2a 70 43 68 69 6c 64 3b  e3_vtab *pChild;
0620: 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 76 69 72      /* Child vir
0630: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
0640: 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41 75 78  vtshim_aux *pAux
0650: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ;        /* Poin
0660: 74 65 72 20 74 6f 20 76 74 73 68 69 6d 5f 61 75  ter to vtshim_au
0670: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 76 74  x object */.  vt
0680: 73 68 69 6d 5f 63 75 72 73 6f 72 20 2a 70 41 6c  shim_cursor *pAl
0690: 6c 43 75 72 3b 20 20 2f 2a 20 4c 69 73 74 20 6f  lCur;  /* List o
06a0: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  f all cursors */
06b0: 0a 20 20 76 74 73 68 69 6d 5f 76 74 61 62 20 2a  .  vtshim_vtab *
06c0: 2a 70 70 50 72 65 76 3b 20 20 20 20 2f 2a 20 50  *ppPrev;    /* P
06d0: 72 65 76 69 6f 75 73 20 6f 6e 20 6c 69 73 74 20  revious on list 
06e0: 2a 2f 0a 20 20 76 74 73 68 69 6d 5f 76 74 61 62  */.  vtshim_vtab
06f0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a   *pNext;      /*
0700: 20 4e 65 78 74 20 6f 6e 20 6c 69 73 74 20 2a 2f   Next on list */
0710: 0a 7d 3b 0a 0a 2f 2a 20 41 20 76 74 73 68 69 6d  .};../* A vtshim
0720: 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   cursor object *
0730: 2f 0a 73 74 72 75 63 74 20 76 74 73 68 69 6d 5f  /.struct vtshim_
0740: 63 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  cursor {.  sqlit
0750: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
0760: 61 73 65 3b 20 20 20 20 2f 2a 20 42 61 73 65 20  ase;    /* Base 
0770: 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20  class - must be 
0780: 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
0790: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
07a0: 70 43 68 69 6c 64 3b 20 2f 2a 20 43 75 72 73 6f  pChild; /* Curso
07b0: 72 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  r generated by t
07c0: 68 65 20 6d 61 6e 61 67 65 64 20 73 75 62 63 6c  he managed subcl
07d0: 61 73 73 20 2a 2f 0a 20 20 76 74 73 68 69 6d 5f  ass */.  vtshim_
07e0: 63 75 72 73 6f 72 20 2a 2a 70 70 50 72 65 76 3b  cursor **ppPrev;
07f0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
0800: 73 20 6f 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  s on list of all
0810: 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 76 74   cursors */.  vt
0820: 73 68 69 6d 5f 63 75 72 73 6f 72 20 2a 70 4e 65  shim_cursor *pNe
0830: 78 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  xt;        /* Ne
0840: 78 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 61 6c  xt on list of al
0850: 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 7d 3b 0a  l cursors */.};.
0860: 0a 2f 2a 20 4d 61 63 72 6f 20 75 73 65 64 20 74  ./* Macro used t
0870: 6f 20 63 6f 70 79 20 74 68 65 20 63 68 69 6c 64  o copy the child
0880: 20 76 74 61 62 6c 65 20 65 72 72 6f 72 20 6d 65   vtable error me
0890: 73 73 61 67 65 20 74 6f 20 6f 75 74 65 72 20 76  ssage to outer v
08a0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
08b0: 20 56 54 53 48 49 4d 5f 43 4f 50 59 5f 45 52 52   VTSHIM_COPY_ERR
08c0: 4d 53 47 28 29 20 20 20 20 20 20 20 20 20 20 20  MSG()           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 5c 0a 20 20 64 6f 20 7b 20 20 20 20 20 20    \.  do {      
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
0940: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
0950: 70 56 74 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72  pVtab->base.zErr
0960: 4d 73 67 29 3b 20 20 20 20 20 20 20 20 20 20 20  Msg);           
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 56          \.    pV
0990: 74 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73  tab->base.zErrMs
09a0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
09b0: 6e 74 66 28 22 25 73 22 2c 20 70 56 74 61 62 2d  ntf("%s", pVtab-
09c0: 3e 70 43 68 69 6c 64 2d 3e 7a 45 72 72 4d 73 67  >pChild->zErrMsg
09d0: 29 3b 20 5c 0a 20 20 7d 20 77 68 69 6c 65 20 28  ); \.  } while (
09e0: 30 29 0a 0a 2f 2a 20 4d 65 74 68 6f 64 73 20 66  0)../* Methods f
09f0: 6f 72 20 74 68 65 20 76 74 73 68 69 6d 20 6d 6f  or the vtshim mo
0a00: 64 75 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  dule */.static i
0a10: 6e 74 20 76 74 73 68 69 6d 43 72 65 61 74 65 28  nt vtshimCreate(
0a20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
0a30: 20 20 76 6f 69 64 20 2a 70 70 41 75 78 2c 0a 20    void *ppAux,. 
0a40: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 6f 6e   int argc,.  con
0a50: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
0a60: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
0a70: 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20  tab **ppVtab,.  
0a80: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
0a90: 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41    vtshim_aux *pA
0aa0: 75 78 20 3d 20 28 76 74 73 68 69 6d 5f 61 75 78  ux = (vtshim_aux
0ab0: 2a 29 70 70 41 75 78 3b 0a 20 20 76 74 73 68 69  *)ppAux;.  vtshi
0ac0: 6d 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20 20  m_vtab *pNew;.  
0ad0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
0ae0: 74 28 20 64 62 3d 3d 70 41 75 78 2d 3e 64 62 20  t( db==pAux->db 
0af0: 29 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e 62  );.  if( pAux->b
0b00: 44 69 73 70 6f 73 65 64 20 29 7b 0a 20 20 20 20  Disposed ){.    
0b10: 69 66 28 20 70 7a 45 72 72 20 29 7b 0a 20 20 20  if( pzErr ){.   
0b20: 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
0b30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 76 69 72  te3_mprintf("vir
0b40: 74 75 61 6c 20 74 61 62 6c 65 20 77 61 73 20 64  tual table was d
0b50: 69 73 70 6f 73 65 64 3a 20 5c 22 25 73 5c 22 22  isposed: \"%s\""
0b60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 70 41 75 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pAux->zName);. 
0b90: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
0ba0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
0bb0: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
0bc0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
0bd0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 2a 70  f(*pNew) );.  *p
0be0: 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33  pVtab = (sqlite3
0bf0: 5f 76 74 61 62 2a 29 70 4e 65 77 3b 0a 20 20 69  _vtab*)pNew;.  i
0c00: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
0c10: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0c20: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  ;.  memset(pNew,
0c30: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   0, sizeof(*pNew
0c40: 29 29 3b 0a 20 20 72 63 20 3d 20 70 41 75 78 2d  ));.  rc = pAux-
0c50: 3e 70 4d 6f 64 2d 3e 78 43 72 65 61 74 65 28 64  >pMod->xCreate(d
0c60: 62 2c 20 70 41 75 78 2d 3e 70 43 68 69 6c 64 41  b, pAux->pChildA
0c70: 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 0a  ux, argc, argv,.
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 20 20 20 20 20 26 70 4e 65 77             &pNew
0ca0: 2d 3e 70 43 68 69 6c 64 2c 20 70 7a 45 72 72 29  ->pChild, pzErr)
0cb0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
0cc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
0cd0: 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 56 74 61  New);.    *ppVta
0ce0: 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  b = 0;.  }.  pNe
0cf0: 77 2d 3e 70 41 75 78 20 3d 20 70 41 75 78 3b 0a  w->pAux = pAux;.
0d00: 20 20 70 4e 65 77 2d 3e 70 70 50 72 65 76 20 3d    pNew->ppPrev =
0d10: 20 26 70 41 75 78 2d 3e 70 41 6c 6c 56 74 61 62   &pAux->pAllVtab
0d20: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
0d30: 3d 20 70 41 75 78 2d 3e 70 41 6c 6c 56 74 61 62  = pAux->pAllVtab
0d40: 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e 70 41  ;.  if( pAux->pA
0d50: 6c 6c 56 74 61 62 20 29 20 70 41 75 78 2d 3e 70  llVtab ) pAux->p
0d60: 41 6c 6c 56 74 61 62 2d 3e 70 70 50 72 65 76 20  AllVtab->ppPrev 
0d70: 3d 20 26 70 4e 65 77 2d 3e 70 4e 65 78 74 3b 0a  = &pNew->pNext;.
0d80: 20 20 70 41 75 78 2d 3e 70 41 6c 6c 56 74 61 62    pAux->pAllVtab
0d90: 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
0da0: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
0db0: 69 6e 74 20 76 74 73 68 69 6d 43 6f 6e 6e 65 63  int vtshimConnec
0dc0: 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
0dd0: 2c 0a 20 20 76 6f 69 64 20 2a 70 70 41 75 78 2c  ,.  void *ppAux,
0de0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
0df0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
0e00: 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
0e10: 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a  _vtab **ppVtab,.
0e20: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
0e30: 7b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a  {.  vtshim_aux *
0e40: 70 41 75 78 20 3d 20 28 76 74 73 68 69 6d 5f 61  pAux = (vtshim_a
0e50: 75 78 2a 29 70 70 41 75 78 3b 0a 20 20 76 74 73  ux*)ppAux;.  vts
0e60: 68 69 6d 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a  him_vtab *pNew;.
0e70: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
0e80: 65 72 74 28 20 64 62 3d 3d 70 41 75 78 2d 3e 64  ert( db==pAux->d
0e90: 62 20 29 3b 0a 20 20 69 66 28 20 70 41 75 78 2d  b );.  if( pAux-
0ea0: 3e 62 44 69 73 70 6f 73 65 64 20 29 7b 0a 20 20  >bDisposed ){.  
0eb0: 20 20 69 66 28 20 70 7a 45 72 72 20 29 7b 0a 20    if( pzErr ){. 
0ec0: 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
0ed0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 76  lite3_mprintf("v
0ee0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 61 73  irtual table was
0ef0: 20 64 69 73 70 6f 73 65 64 3a 20 5c 22 25 73 5c   disposed: \"%s\
0f00: 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 20 20 70 41 75 78 2d 3e 7a 4e 61 6d 65 29 3b     pAux->zName);
0f30: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0f40: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
0f50: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
0f60: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
0f70: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
0f80: 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74  *ppVtab = (sqlit
0f90: 65 33 5f 76 74 61 62 2a 29 70 4e 65 77 3b 0a 20  e3_vtab*)pNew;. 
0fa0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
0fb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
0fc0: 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65  EM;.  memset(pNe
0fd0: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w, 0, sizeof(*pN
0fe0: 65 77 29 29 3b 0a 20 20 72 63 20 3d 20 70 41 75  ew));.  rc = pAu
0ff0: 78 2d 3e 70 4d 6f 64 2d 3e 78 43 6f 6e 6e 65 63  x->pMod->xConnec
1000: 74 28 64 62 2c 20 70 41 75 78 2d 3e 70 43 68 69  t(db, pAux->pChi
1010: 6c 64 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67  ldAux, argc, arg
1020: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  v,.             
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1040: 70 4e 65 77 2d 3e 70 43 68 69 6c 64 2c 20 70 7a  pNew->pChild, pz
1050: 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Err);.  if( rc )
1060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1070: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70  ee(pNew);.    *p
1080: 70 56 74 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 20  pVtab = 0;.  }. 
1090: 20 70 4e 65 77 2d 3e 70 41 75 78 20 3d 20 70 41   pNew->pAux = pA
10a0: 75 78 3b 0a 20 20 70 4e 65 77 2d 3e 70 70 50 72  ux;.  pNew->ppPr
10b0: 65 76 20 3d 20 26 70 41 75 78 2d 3e 70 41 6c 6c  ev = &pAux->pAll
10c0: 56 74 61 62 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e  Vtab;.  pNew->pN
10d0: 65 78 74 20 3d 20 70 41 75 78 2d 3e 70 41 6c 6c  ext = pAux->pAll
10e0: 56 74 61 62 3b 0a 20 20 69 66 28 20 70 41 75 78  Vtab;.  if( pAux
10f0: 2d 3e 70 41 6c 6c 56 74 61 62 20 29 20 70 41 75  ->pAllVtab ) pAu
1100: 78 2d 3e 70 41 6c 6c 56 74 61 62 2d 3e 70 70 50  x->pAllVtab->ppP
1110: 72 65 76 20 3d 20 26 70 4e 65 77 2d 3e 70 4e 65  rev = &pNew->pNe
1120: 78 74 3b 0a 20 20 70 41 75 78 2d 3e 70 41 6c 6c  xt;.  pAux->pAll
1130: 56 74 61 62 20 3d 20 70 4e 65 77 3b 0a 20 20 72  Vtab = pNew;.  r
1140: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
1150: 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d 42 65  tic int vtshimBe
1160: 73 74 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74  stIndex(.  sqlit
1170: 65 33 5f 76 74 61 62 20 2a 70 42 61 73 65 2c 0a  e3_vtab *pBase,.
1180: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1190: 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29  info *pIdxInfo.)
11a0: 7b 0a 20 20 76 74 73 68 69 6d 5f 76 74 61 62 20  {.  vtshim_vtab 
11b0: 2a 70 56 74 61 62 20 3d 20 28 76 74 73 68 69 6d  *pVtab = (vtshim
11c0: 5f 76 74 61 62 2a 29 70 42 61 73 65 3b 0a 20 20  _vtab*)pBase;.  
11d0: 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41 75 78  vtshim_aux *pAux
11e0: 20 3d 20 70 56 74 61 62 2d 3e 70 41 75 78 3b 0a   = pVtab->pAux;.
11f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1200: 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20  pAux->bDisposed 
1210: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1220: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 41  ERROR;.  rc = pA
1230: 75 78 2d 3e 70 4d 6f 64 2d 3e 78 42 65 73 74 49  ux->pMod->xBestI
1240: 6e 64 65 78 28 70 56 74 61 62 2d 3e 70 43 68 69  ndex(pVtab->pChi
1250: 6c 64 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ld, pIdxInfo);. 
1260: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1270: 4f 4b 20 29 7b 0a 20 20 20 20 56 54 53 48 49 4d  OK ){.    VTSHIM
1280: 5f 43 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a  _COPY_ERRMSG();.
1290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .}..static int v
12b0: 74 73 68 69 6d 44 69 73 63 6f 6e 6e 65 63 74 28  tshimDisconnect(
12c0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 42  sqlite3_vtab *pB
12d0: 61 73 65 29 7b 0a 20 20 76 74 73 68 69 6d 5f 76  ase){.  vtshim_v
12e0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 76 74  tab *pVtab = (vt
12f0: 73 68 69 6d 5f 76 74 61 62 2a 29 70 42 61 73 65  shim_vtab*)pBase
1300: 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a  ;.  vtshim_aux *
1310: 70 41 75 78 20 3d 20 70 56 74 61 62 2d 3e 70 41  pAux = pVtab->pA
1320: 75 78 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ux;.  int rc = S
1330: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1340: 21 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64  !pAux->bDisposed
1350: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 41 75   ){.    rc = pAu
1360: 78 2d 3e 70 4d 6f 64 2d 3e 78 44 69 73 63 6f 6e  x->pMod->xDiscon
1370: 6e 65 63 74 28 70 56 74 61 62 2d 3e 70 43 68 69  nect(pVtab->pChi
1380: 6c 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ld);.  }.  if( p
1390: 56 74 61 62 2d 3e 70 4e 65 78 74 20 29 20 70 56  Vtab->pNext ) pV
13a0: 74 61 62 2d 3e 70 4e 65 78 74 2d 3e 70 70 50 72  tab->pNext->ppPr
13b0: 65 76 20 3d 20 70 56 74 61 62 2d 3e 70 70 50 72  ev = pVtab->ppPr
13c0: 65 76 3b 0a 20 20 2a 70 56 74 61 62 2d 3e 70 70  ev;.  *pVtab->pp
13d0: 50 72 65 76 20 3d 20 70 56 74 61 62 2d 3e 70 4e  Prev = pVtab->pN
13e0: 65 78 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ext;.  sqlite3_f
13f0: 72 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65  ree(pVtab);.  re
1400: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
1410: 69 63 20 69 6e 74 20 76 74 73 68 69 6d 44 65 73  ic int vtshimDes
1420: 74 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61  troy(sqlite3_vta
1430: 62 20 2a 70 42 61 73 65 29 7b 0a 20 20 76 74 73  b *pBase){.  vts
1440: 68 69 6d 5f 76 74 61 62 20 2a 70 56 74 61 62 20  him_vtab *pVtab 
1450: 3d 20 28 76 74 73 68 69 6d 5f 76 74 61 62 2a 29  = (vtshim_vtab*)
1460: 70 42 61 73 65 3b 0a 20 20 76 74 73 68 69 6d 5f  pBase;.  vtshim_
1470: 61 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74 61  aux *pAux = pVta
1480: 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20 72  b->pAux;.  int r
1490: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14a0: 20 69 66 28 20 21 70 41 75 78 2d 3e 62 44 69 73   if( !pAux->bDis
14b0: 70 6f 73 65 64 20 29 7b 0a 20 20 20 20 72 63 20  posed ){.    rc 
14c0: 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 44  = pAux->pMod->xD
14d0: 65 73 74 72 6f 79 28 70 56 74 61 62 2d 3e 70 43  estroy(pVtab->pC
14e0: 68 69 6c 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  hild);.  }.  if(
14f0: 20 70 56 74 61 62 2d 3e 70 4e 65 78 74 20 29 20   pVtab->pNext ) 
1500: 70 56 74 61 62 2d 3e 70 4e 65 78 74 2d 3e 70 70  pVtab->pNext->pp
1510: 50 72 65 76 20 3d 20 70 56 74 61 62 2d 3e 70 70  Prev = pVtab->pp
1520: 50 72 65 76 3b 0a 20 20 2a 70 56 74 61 62 2d 3e  Prev;.  *pVtab->
1530: 70 70 50 72 65 76 20 3d 20 70 56 74 61 62 2d 3e  ppPrev = pVtab->
1540: 70 4e 65 78 74 3b 0a 20 20 73 71 6c 69 74 65 33  pNext;.  sqlite3
1550: 5f 66 72 65 65 28 70 56 74 61 62 29 3b 0a 20 20  _free(pVtab);.  
1560: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
1570: 61 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d 4f  atic int vtshimO
1580: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
1590: 20 2a 70 42 61 73 65 2c 20 73 71 6c 69 74 65 33   *pBase, sqlite3
15a0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
15b0: 70 43 75 72 73 6f 72 29 7b 0a 20 20 76 74 73 68  pCursor){.  vtsh
15c0: 69 6d 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  im_vtab *pVtab =
15d0: 20 28 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70   (vtshim_vtab*)p
15e0: 42 61 73 65 3b 0a 20 20 76 74 73 68 69 6d 5f 61  Base;.  vtshim_a
15f0: 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74 61 62  ux *pAux = pVtab
1600: 2d 3e 70 41 75 78 3b 0a 20 20 76 74 73 68 69 6d  ->pAux;.  vtshim
1610: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  _cursor *pCur;. 
1620: 20 69 6e 74 20 72 63 3b 0a 20 20 2a 70 70 43 75   int rc;.  *ppCu
1630: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  rsor = 0;.  if( 
1640: 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20  pAux->bDisposed 
1650: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1660: 45 52 52 4f 52 3b 0a 20 20 70 43 75 72 20 3d 20  ERROR;.  pCur = 
1670: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1680: 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b  sizeof(*pCur) );
1690: 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
16a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16b0: 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
16c0: 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  Cur, 0, sizeof(*
16d0: 70 43 75 72 29 29 3b 0a 20 20 72 63 20 3d 20 70  pCur));.  rc = p
16e0: 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 4f 70 65 6e  Aux->pMod->xOpen
16f0: 28 70 56 74 61 62 2d 3e 70 43 68 69 6c 64 2c 20  (pVtab->pChild, 
1700: 26 70 43 75 72 2d 3e 70 43 68 69 6c 64 29 3b 0a  &pCur->pChild);.
1710: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1720: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
1730: 72 29 3b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43  r);.    VTSHIM_C
1740: 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20  OPY_ERRMSG();.  
1750: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1760: 0a 20 20 70 43 75 72 2d 3e 70 43 68 69 6c 64 2d  .  pCur->pChild-
1770: 3e 70 56 74 61 62 20 3d 20 70 56 74 61 62 2d 3e  >pVtab = pVtab->
1780: 70 43 68 69 6c 64 3b 0a 20 20 2a 70 70 43 75 72  pChild;.  *ppCur
1790: 73 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73  sor = &pCur->bas
17a0: 65 3b 0a 20 20 70 43 75 72 2d 3e 70 70 50 72 65  e;.  pCur->ppPre
17b0: 76 20 3d 20 26 70 56 74 61 62 2d 3e 70 41 6c 6c  v = &pVtab->pAll
17c0: 43 75 72 3b 0a 20 20 69 66 28 20 70 56 74 61 62  Cur;.  if( pVtab
17d0: 2d 3e 70 41 6c 6c 43 75 72 20 29 20 70 56 74 61  ->pAllCur ) pVta
17e0: 62 2d 3e 70 41 6c 6c 43 75 72 2d 3e 70 70 50 72  b->pAllCur->ppPr
17f0: 65 76 20 3d 20 26 70 43 75 72 2d 3e 70 4e 65 78  ev = &pCur->pNex
1800: 74 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  t;.  pCur->pNext
1810: 20 3d 20 70 56 74 61 62 2d 3e 70 41 6c 6c 43 75   = pVtab->pAllCu
1820: 72 3b 0a 20 20 70 56 74 61 62 2d 3e 70 41 6c 6c  r;.  pVtab->pAll
1830: 43 75 72 20 3d 20 70 43 75 72 3b 0a 20 20 72 65  Cur = pCur;.  re
1840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1850: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  }..static int vt
1860: 73 68 69 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65  shimClose(sqlite
1870: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
1880: 58 29 7b 0a 20 20 76 74 73 68 69 6d 5f 63 75 72  X){.  vtshim_cur
1890: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 76 74 73  sor *pCur = (vts
18a0: 68 69 6d 5f 63 75 72 73 6f 72 2a 29 70 58 3b 0a  him_cursor*)pX;.
18b0: 20 20 76 74 73 68 69 6d 5f 76 74 61 62 20 2a 70    vtshim_vtab *p
18c0: 56 74 61 62 20 3d 20 28 76 74 73 68 69 6d 5f 76  Vtab = (vtshim_v
18d0: 74 61 62 2a 29 70 43 75 72 2d 3e 62 61 73 65 2e  tab*)pCur->base.
18e0: 70 56 74 61 62 3b 0a 20 20 76 74 73 68 69 6d 5f  pVtab;.  vtshim_
18f0: 61 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74 61  aux *pAux = pVta
1900: 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20 72  b->pAux;.  int r
1910: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1920: 20 69 66 28 20 21 70 41 75 78 2d 3e 62 44 69 73   if( !pAux->bDis
1930: 70 6f 73 65 64 20 29 7b 0a 20 20 20 20 72 63 20  posed ){.    rc 
1940: 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 43  = pAux->pMod->xC
1950: 6c 6f 73 65 28 70 43 75 72 2d 3e 70 43 68 69 6c  lose(pCur->pChil
1960: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
1970: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1980: 20 20 20 56 54 53 48 49 4d 5f 43 4f 50 59 5f 45     VTSHIM_COPY_E
1990: 52 52 4d 53 47 28 29 3b 0a 20 20 20 20 7d 0a 20  RRMSG();.    }. 
19a0: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70   }.  if( pCur->p
19b0: 4e 65 78 74 20 29 20 70 43 75 72 2d 3e 70 4e 65  Next ) pCur->pNe
19c0: 78 74 2d 3e 70 70 50 72 65 76 20 3d 20 70 43 75  xt->ppPrev = pCu
19d0: 72 2d 3e 70 70 50 72 65 76 3b 0a 20 20 2a 70 43  r->ppPrev;.  *pC
19e0: 75 72 2d 3e 70 70 50 72 65 76 20 3d 20 70 43 75  ur->ppPrev = pCu
19f0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 73 71 6c 69  r->pNext;.  sqli
1a00: 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a  te3_free(pCur);.
1a10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a20: 73 74 61 74 69 63 20 69 6e 74 20 76 74 73 68 69  static int vtshi
1a30: 6d 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74  mFilter(.  sqlit
1a40: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1a50: 70 58 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  pX,.  int idxNum
1a60: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1a70: 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72  idxStr,.  int ar
1a80: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
1a90: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
1aa0: 76 74 73 68 69 6d 5f 63 75 72 73 6f 72 20 2a 70  vtshim_cursor *p
1ab0: 43 75 72 20 3d 20 28 76 74 73 68 69 6d 5f 63 75  Cur = (vtshim_cu
1ac0: 72 73 6f 72 2a 29 70 58 3b 0a 20 20 76 74 73 68  rsor*)pX;.  vtsh
1ad0: 69 6d 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  im_vtab *pVtab =
1ae0: 20 28 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70   (vtshim_vtab*)p
1af0: 43 75 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b  Cur->base.pVtab;
1b00: 0a 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a 70  .  vtshim_aux *p
1b10: 41 75 78 20 3d 20 70 56 74 61 62 2d 3e 70 41 75  Aux = pVtab->pAu
1b20: 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  x;.  int rc;.  i
1b30: 66 28 20 70 41 75 78 2d 3e 62 44 69 73 70 6f 73  f( pAux->bDispos
1b40: 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
1b50: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  TE_ERROR;.  rc =
1b60: 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 46 69   pAux->pMod->xFi
1b70: 6c 74 65 72 28 70 43 75 72 2d 3e 70 43 68 69 6c  lter(pCur->pChil
1b80: 64 2c 20 69 64 78 4e 75 6d 2c 20 69 64 78 53 74  d, idxNum, idxSt
1b90: 72 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a  r, argc, argv);.
1ba0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 56 54 53 48 49  _OK ){.    VTSHI
1bc0: 4d 5f 43 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b  M_COPY_ERRMSG();
1bd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1be0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1bf0: 76 74 73 68 69 6d 4e 65 78 74 28 73 71 6c 69 74  vtshimNext(sqlit
1c00: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1c10: 70 58 29 7b 0a 20 20 76 74 73 68 69 6d 5f 63 75  pX){.  vtshim_cu
1c20: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 76 74  rsor *pCur = (vt
1c30: 73 68 69 6d 5f 63 75 72 73 6f 72 2a 29 70 58 3b  shim_cursor*)pX;
1c40: 0a 20 20 76 74 73 68 69 6d 5f 76 74 61 62 20 2a  .  vtshim_vtab *
1c50: 70 56 74 61 62 20 3d 20 28 76 74 73 68 69 6d 5f  pVtab = (vtshim_
1c60: 76 74 61 62 2a 29 70 43 75 72 2d 3e 62 61 73 65  vtab*)pCur->base
1c70: 2e 70 56 74 61 62 3b 0a 20 20 76 74 73 68 69 6d  .pVtab;.  vtshim
1c80: 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74  _aux *pAux = pVt
1c90: 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20  ab->pAux;.  int 
1ca0: 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e  rc;.  if( pAux->
1cb0: 62 44 69 73 70 6f 73 65 64 20 29 20 72 65 74 75  bDisposed ) retu
1cc0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1cd0: 0a 20 20 72 63 20 3d 20 70 41 75 78 2d 3e 70 4d  .  rc = pAux->pM
1ce0: 6f 64 2d 3e 78 4e 65 78 74 28 70 43 75 72 2d 3e  od->xNext(pCur->
1cf0: 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20 72  pChild);.  if( r
1d00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d10: 20 20 20 20 56 54 53 48 49 4d 5f 43 4f 50 59 5f      VTSHIM_COPY_
1d20: 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a 20 20  ERRMSG();.  }.  
1d30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
1d40: 61 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d 45  atic int vtshimE
1d50: 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  of(sqlite3_vtab_
1d60: 63 75 72 73 6f 72 20 2a 70 58 29 7b 0a 20 20 76  cursor *pX){.  v
1d70: 74 73 68 69 6d 5f 63 75 72 73 6f 72 20 2a 70 43  tshim_cursor *pC
1d80: 75 72 20 3d 20 28 76 74 73 68 69 6d 5f 63 75 72  ur = (vtshim_cur
1d90: 73 6f 72 2a 29 70 58 3b 0a 20 20 76 74 73 68 69  sor*)pX;.  vtshi
1da0: 6d 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  m_vtab *pVtab = 
1db0: 28 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 43  (vtshim_vtab*)pC
1dc0: 75 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  ur->base.pVtab;.
1dd0: 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41    vtshim_aux *pA
1de0: 75 78 20 3d 20 70 56 74 61 62 2d 3e 70 41 75 78  ux = pVtab->pAux
1df0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
1e00: 28 20 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65  ( pAux->bDispose
1e10: 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1e20: 72 63 20 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d  rc = pAux->pMod-
1e30: 3e 78 45 6f 66 28 70 43 75 72 2d 3e 70 43 68 69  >xEof(pCur->pChi
1e40: 6c 64 29 3b 0a 20 20 56 54 53 48 49 4d 5f 43 4f  ld);.  VTSHIM_CO
1e50: 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 72  PY_ERRMSG();.  r
1e60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
1e70: 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d 43 6f  tic int vtshimCo
1e80: 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  lumn(sqlite3_vta
1e90: 62 5f 63 75 72 73 6f 72 20 2a 70 58 2c 20 73 71  b_cursor *pX, sq
1ea0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1eb0: 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 76 74  tx, int i){.  vt
1ec0: 73 68 69 6d 5f 63 75 72 73 6f 72 20 2a 70 43 75  shim_cursor *pCu
1ed0: 72 20 3d 20 28 76 74 73 68 69 6d 5f 63 75 72 73  r = (vtshim_curs
1ee0: 6f 72 2a 29 70 58 3b 0a 20 20 76 74 73 68 69 6d  or*)pX;.  vtshim
1ef0: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28  _vtab *pVtab = (
1f00: 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 43 75  vtshim_vtab*)pCu
1f10: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
1f20: 20 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41 75   vtshim_aux *pAu
1f30: 78 20 3d 20 70 56 74 61 62 2d 3e 70 41 75 78 3b  x = pVtab->pAux;
1f40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1f50: 20 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64   pAux->bDisposed
1f60: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f70: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70  _ERROR;.  rc = p
1f80: 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 43 6f 6c 75  Aux->pMod->xColu
1f90: 6d 6e 28 70 43 75 72 2d 3e 70 43 68 69 6c 64 2c  mn(pCur->pChild,
1fa0: 20 63 74 78 2c 20 69 29 3b 0a 20 20 69 66 28 20   ctx, i);.  if( 
1fb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fc0: 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f 50 59  .    VTSHIM_COPY
1fd0: 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a 20  _ERRMSG();.  }. 
1fe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
1ff0: 74 61 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d  tatic int vtshim
2000: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74  Rowid(sqlite3_vt
2010: 61 62 5f 63 75 72 73 6f 72 20 2a 70 58 2c 20 73  ab_cursor *pX, s
2020: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 52  qlite3_int64 *pR
2030: 6f 77 69 64 29 7b 0a 20 20 76 74 73 68 69 6d 5f  owid){.  vtshim_
2040: 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
2050: 76 74 73 68 69 6d 5f 63 75 72 73 6f 72 2a 29 70  vtshim_cursor*)p
2060: 58 3b 0a 20 20 76 74 73 68 69 6d 5f 76 74 61 62  X;.  vtshim_vtab
2070: 20 2a 70 56 74 61 62 20 3d 20 28 76 74 73 68 69   *pVtab = (vtshi
2080: 6d 5f 76 74 61 62 2a 29 70 43 75 72 2d 3e 62 61  m_vtab*)pCur->ba
2090: 73 65 2e 70 56 74 61 62 3b 0a 20 20 76 74 73 68  se.pVtab;.  vtsh
20a0: 69 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70  im_aux *pAux = p
20b0: 56 74 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e  Vtab->pAux;.  in
20c0: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78  t rc;.  if( pAux
20d0: 2d 3e 62 44 69 73 70 6f 73 65 64 20 29 20 72 65  ->bDisposed ) re
20e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
20f0: 52 3b 0a 20 20 72 63 20 3d 20 70 41 75 78 2d 3e  R;.  rc = pAux->
2100: 70 4d 6f 64 2d 3e 78 52 6f 77 69 64 28 70 43 75  pMod->xRowid(pCu
2110: 72 2d 3e 70 43 68 69 6c 64 2c 20 70 52 6f 77 69  r->pChild, pRowi
2120: 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
2130: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 56  LITE_OK ){.    V
2140: 54 53 48 49 4d 5f 43 4f 50 59 5f 45 52 52 4d 53  TSHIM_COPY_ERRMS
2150: 47 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  G();.  }.  retur
2160: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
2170: 69 6e 74 20 76 74 73 68 69 6d 55 70 64 61 74 65  int vtshimUpdate
2180: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
2190: 20 2a 70 42 61 73 65 2c 0a 20 20 69 6e 74 20 61   *pBase,.  int a
21a0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
21b0: 61 6c 75 65 20 2a 2a 61 72 67 76 2c 0a 20 20 73  alue **argv,.  s
21c0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 52  qlite3_int64 *pR
21d0: 6f 77 69 64 0a 29 7b 0a 20 20 76 74 73 68 69 6d  owid.){.  vtshim
21e0: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28  _vtab *pVtab = (
21f0: 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 42 61  vtshim_vtab*)pBa
2200: 73 65 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78  se;.  vtshim_aux
2210: 20 2a 70 41 75 78 20 3d 20 70 56 74 61 62 2d 3e   *pAux = pVtab->
2220: 70 41 75 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pAux;.  int rc;.
2230: 20 20 69 66 28 20 70 41 75 78 2d 3e 62 44 69 73    if( pAux->bDis
2240: 70 6f 73 65 64 20 29 20 72 65 74 75 72 6e 20 53  posed ) return S
2250: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72  QLITE_ERROR;.  r
2260: 63 20 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e  c = pAux->pMod->
2270: 78 55 70 64 61 74 65 28 70 56 74 61 62 2d 3e 70  xUpdate(pVtab->p
2280: 43 68 69 6c 64 2c 20 61 72 67 63 2c 20 61 72 67  Child, argc, arg
2290: 76 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 69 66  v, pRowid);.  if
22a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22b0: 29 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f  ){.    VTSHIM_CO
22c0: 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d  PY_ERRMSG();.  }
22d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 73 68  .static int vtsh
22f0: 69 6d 42 65 67 69 6e 28 73 71 6c 69 74 65 33 5f  imBegin(sqlite3_
2300: 76 74 61 62 20 2a 70 42 61 73 65 29 7b 0a 20 20  vtab *pBase){.  
2310: 76 74 73 68 69 6d 5f 76 74 61 62 20 2a 70 56 74  vtshim_vtab *pVt
2320: 61 62 20 3d 20 28 76 74 73 68 69 6d 5f 76 74 61  ab = (vtshim_vta
2330: 62 2a 29 70 42 61 73 65 3b 0a 20 20 76 74 73 68  b*)pBase;.  vtsh
2340: 69 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70  im_aux *pAux = p
2350: 56 74 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e  Vtab->pAux;.  in
2360: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78  t rc;.  if( pAux
2370: 2d 3e 62 44 69 73 70 6f 73 65 64 20 29 20 72 65  ->bDisposed ) re
2380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2390: 52 3b 0a 20 20 72 63 20 3d 20 70 41 75 78 2d 3e  R;.  rc = pAux->
23a0: 70 4d 6f 64 2d 3e 78 42 65 67 69 6e 28 70 56 74  pMod->xBegin(pVt
23b0: 61 62 2d 3e 70 43 68 69 6c 64 29 3b 0a 20 20 69  ab->pChild);.  i
23c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23d0: 20 29 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43   ){.    VTSHIM_C
23e0: 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20  OPY_ERRMSG();.  
23f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2400: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 73  ..static int vts
2410: 68 69 6d 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  himSync(sqlite3_
2420: 76 74 61 62 20 2a 70 42 61 73 65 29 7b 0a 20 20  vtab *pBase){.  
2430: 76 74 73 68 69 6d 5f 76 74 61 62 20 2a 70 56 74  vtshim_vtab *pVt
2440: 61 62 20 3d 20 28 76 74 73 68 69 6d 5f 76 74 61  ab = (vtshim_vta
2450: 62 2a 29 70 42 61 73 65 3b 0a 20 20 76 74 73 68  b*)pBase;.  vtsh
2460: 69 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70  im_aux *pAux = p
2470: 56 74 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e  Vtab->pAux;.  in
2480: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78  t rc;.  if( pAux
2490: 2d 3e 62 44 69 73 70 6f 73 65 64 20 29 20 72 65  ->bDisposed ) re
24a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
24b0: 52 3b 0a 20 20 72 63 20 3d 20 70 41 75 78 2d 3e  R;.  rc = pAux->
24c0: 70 4d 6f 64 2d 3e 78 53 79 6e 63 28 70 56 74 61  pMod->xSync(pVta
24d0: 62 2d 3e 70 43 68 69 6c 64 29 3b 0a 20 20 69 66  b->pChild);.  if
24e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24f0: 29 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f  ){.    VTSHIM_CO
2500: 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d  PY_ERRMSG();.  }
2510: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2520: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 73 68  .static int vtsh
2530: 69 6d 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  imCommit(sqlite3
2540: 5f 76 74 61 62 20 2a 70 42 61 73 65 29 7b 0a 20  _vtab *pBase){. 
2550: 20 76 74 73 68 69 6d 5f 76 74 61 62 20 2a 70 56   vtshim_vtab *pV
2560: 74 61 62 20 3d 20 28 76 74 73 68 69 6d 5f 76 74  tab = (vtshim_vt
2570: 61 62 2a 29 70 42 61 73 65 3b 0a 20 20 76 74 73  ab*)pBase;.  vts
2580: 68 69 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d 20  him_aux *pAux = 
2590: 70 56 74 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69  pVtab->pAux;.  i
25a0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 41 75  nt rc;.  if( pAu
25b0: 78 2d 3e 62 44 69 73 70 6f 73 65 64 20 29 20 72  x->bDisposed ) r
25c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
25d0: 4f 52 3b 0a 20 20 72 63 20 3d 20 70 41 75 78 2d  OR;.  rc = pAux-
25e0: 3e 70 4d 6f 64 2d 3e 78 43 6f 6d 6d 69 74 28 70  >pMod->xCommit(p
25f0: 56 74 61 62 2d 3e 70 43 68 69 6c 64 29 3b 0a 20  Vtab->pChild);. 
2600: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2610: 4f 4b 20 29 7b 0a 20 20 20 20 56 54 53 48 49 4d  OK ){.    VTSHIM
2620: 5f 43 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a  _COPY_ERRMSG();.
2630: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2640: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .}..static int v
2650: 74 73 68 69 6d 52 6f 6c 6c 62 61 63 6b 28 73 71  tshimRollback(sq
2660: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 42 61 73  lite3_vtab *pBas
2670: 65 29 7b 0a 20 20 76 74 73 68 69 6d 5f 76 74 61  e){.  vtshim_vta
2680: 62 20 2a 70 56 74 61 62 20 3d 20 28 76 74 73 68  b *pVtab = (vtsh
2690: 69 6d 5f 76 74 61 62 2a 29 70 42 61 73 65 3b 0a  im_vtab*)pBase;.
26a0: 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41    vtshim_aux *pA
26b0: 75 78 20 3d 20 70 56 74 61 62 2d 3e 70 41 75 78  ux = pVtab->pAux
26c0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
26d0: 28 20 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65  ( pAux->bDispose
26e0: 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
26f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  E_ERROR;.  rc = 
2700: 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 52 6f 6c  pAux->pMod->xRol
2710: 6c 62 61 63 6b 28 70 56 74 61 62 2d 3e 70 43 68  lback(pVtab->pCh
2720: 69 6c 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ild);.  if( rc!=
2730: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2740: 20 56 54 53 48 49 4d 5f 43 4f 50 59 5f 45 52 52   VTSHIM_COPY_ERR
2750: 4d 53 47 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  MSG();.  }.  ret
2760: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
2770: 63 20 69 6e 74 20 76 74 73 68 69 6d 46 69 6e 64  c int vtshimFind
2780: 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
2790: 74 65 33 5f 76 74 61 62 20 2a 70 42 61 73 65 2c  te3_vtab *pBase,
27a0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 63  .  int nArg,.  c
27b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
27c0: 2c 0a 20 20 76 6f 69 64 20 28 2a 2a 70 78 46 75  ,.  void (**pxFu
27d0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
27e0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
27f0: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
2800: 64 20 2a 2a 70 70 41 72 67 0a 29 7b 0a 20 20 76  d **ppArg.){.  v
2810: 74 73 68 69 6d 5f 76 74 61 62 20 2a 70 56 74 61  tshim_vtab *pVta
2820: 62 20 3d 20 28 76 74 73 68 69 6d 5f 76 74 61 62  b = (vtshim_vtab
2830: 2a 29 70 42 61 73 65 3b 0a 20 20 76 74 73 68 69  *)pBase;.  vtshi
2840: 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70 56  m_aux *pAux = pV
2850: 74 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74  tab->pAux;.  int
2860: 20 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78 2d   rc;.  if( pAux-
2870: 3e 62 44 69 73 70 6f 73 65 64 20 29 20 72 65 74  >bDisposed ) ret
2880: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 41  urn 0;.  rc = pA
2890: 75 78 2d 3e 70 4d 6f 64 2d 3e 78 46 69 6e 64 46  ux->pMod->xFindF
28a0: 75 6e 63 74 69 6f 6e 28 70 56 74 61 62 2d 3e 70  unction(pVtab->p
28b0: 43 68 69 6c 64 2c 20 6e 41 72 67 2c 20 7a 4e 61  Child, nArg, zNa
28c0: 6d 65 2c 20 70 78 46 75 6e 63 2c 20 70 70 41 72  me, pxFunc, ppAr
28d0: 67 29 3b 0a 20 20 56 54 53 48 49 4d 5f 43 4f 50  g);.  VTSHIM_COP
28e0: 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 72 65  Y_ERRMSG();.  re
28f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
2900: 69 63 20 69 6e 74 20 76 74 73 68 69 6d 52 65 6e  ic int vtshimRen
2910: 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ame(sqlite3_vtab
2920: 20 2a 70 42 61 73 65 2c 20 63 6f 6e 73 74 20 63   *pBase, const c
2930: 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 29 7b 0a  har *zNewName){.
2940: 20 20 76 74 73 68 69 6d 5f 76 74 61 62 20 2a 70    vtshim_vtab *p
2950: 56 74 61 62 20 3d 20 28 76 74 73 68 69 6d 5f 76  Vtab = (vtshim_v
2960: 74 61 62 2a 29 70 42 61 73 65 3b 0a 20 20 76 74  tab*)pBase;.  vt
2970: 73 68 69 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d  shim_aux *pAux =
2980: 20 70 56 74 61 62 2d 3e 70 41 75 78 3b 0a 20 20   pVtab->pAux;.  
2990: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 41  int rc;.  if( pA
29a0: 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20 29 20  ux->bDisposed ) 
29b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
29c0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 41 75 78  ROR;.  rc = pAux
29d0: 2d 3e 70 4d 6f 64 2d 3e 78 52 65 6e 61 6d 65 28  ->pMod->xRename(
29e0: 70 56 74 61 62 2d 3e 70 43 68 69 6c 64 2c 20 7a  pVtab->pChild, z
29f0: 4e 65 77 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  NewName);.  if( 
2a00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a10: 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f 50 59  .    VTSHIM_COPY
2a20: 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a 20  _ERRMSG();.  }. 
2a30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
2a40: 74 61 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d  tatic int vtshim
2a50: 53 61 76 65 70 6f 69 6e 74 28 73 71 6c 69 74 65  Savepoint(sqlite
2a60: 33 5f 76 74 61 62 20 2a 70 42 61 73 65 2c 20 69  3_vtab *pBase, i
2a70: 6e 74 20 6e 29 7b 0a 20 20 76 74 73 68 69 6d 5f  nt n){.  vtshim_
2a80: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 76  vtab *pVtab = (v
2a90: 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 42 61 73  tshim_vtab*)pBas
2aa0: 65 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78 20  e;.  vtshim_aux 
2ab0: 2a 70 41 75 78 20 3d 20 70 56 74 61 62 2d 3e 70  *pAux = pVtab->p
2ac0: 41 75 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Aux;.  int rc;. 
2ad0: 20 69 66 28 20 70 41 75 78 2d 3e 62 44 69 73 70   if( pAux->bDisp
2ae0: 6f 73 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  osed ) return SQ
2af0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72 63  LITE_ERROR;.  rc
2b00: 20 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78   = pAux->pMod->x
2b10: 53 61 76 65 70 6f 69 6e 74 28 70 56 74 61 62 2d  Savepoint(pVtab-
2b20: 3e 70 43 68 69 6c 64 2c 20 6e 29 3b 0a 20 20 69  >pChild, n);.  i
2b30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b40: 20 29 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43   ){.    VTSHIM_C
2b50: 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20  OPY_ERRMSG();.  
2b60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b70: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 73  ..static int vts
2b80: 68 69 6d 52 65 6c 65 61 73 65 28 73 71 6c 69 74  himRelease(sqlit
2b90: 65 33 5f 76 74 61 62 20 2a 70 42 61 73 65 2c 20  e3_vtab *pBase, 
2ba0: 69 6e 74 20 6e 29 7b 0a 20 20 76 74 73 68 69 6d  int n){.  vtshim
2bb0: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28  _vtab *pVtab = (
2bc0: 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 42 61  vtshim_vtab*)pBa
2bd0: 73 65 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78  se;.  vtshim_aux
2be0: 20 2a 70 41 75 78 20 3d 20 70 56 74 61 62 2d 3e   *pAux = pVtab->
2bf0: 70 41 75 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pAux;.  int rc;.
2c00: 20 20 69 66 28 20 70 41 75 78 2d 3e 62 44 69 73    if( pAux->bDis
2c10: 70 6f 73 65 64 20 29 20 72 65 74 75 72 6e 20 53  posed ) return S
2c20: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72  QLITE_ERROR;.  r
2c30: 63 20 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e  c = pAux->pMod->
2c40: 78 52 65 6c 65 61 73 65 28 70 56 74 61 62 2d 3e  xRelease(pVtab->
2c50: 70 43 68 69 6c 64 2c 20 6e 29 3b 0a 20 20 69 66  pChild, n);.  if
2c60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c70: 29 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f  ){.    VTSHIM_CO
2c80: 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d  PY_ERRMSG();.  }
2c90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 73 68  .static int vtsh
2cb0: 69 6d 52 6f 6c 6c 62 61 63 6b 54 6f 28 73 71 6c  imRollbackTo(sql
2cc0: 69 74 65 33 5f 76 74 61 62 20 2a 70 42 61 73 65  ite3_vtab *pBase
2cd0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76 74 73 68  , int n){.  vtsh
2ce0: 69 6d 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  im_vtab *pVtab =
2cf0: 20 28 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70   (vtshim_vtab*)p
2d00: 42 61 73 65 3b 0a 20 20 76 74 73 68 69 6d 5f 61  Base;.  vtshim_a
2d10: 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74 61 62  ux *pAux = pVtab
2d20: 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20 72 63  ->pAux;.  int rc
2d30: 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e 62 44  ;.  if( pAux->bD
2d40: 69 73 70 6f 73 65 64 20 29 20 72 65 74 75 72 6e  isposed ) return
2d50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2d60: 20 72 63 20 3d 20 70 41 75 78 2d 3e 70 4d 6f 64   rc = pAux->pMod
2d70: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 70 56  ->xRollbackTo(pV
2d80: 74 61 62 2d 3e 70 43 68 69 6c 64 2c 20 6e 29 3b  tab->pChild, n);
2d90: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2da0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 56 54 53 48  E_OK ){.    VTSH
2db0: 49 4d 5f 43 4f 50 59 5f 45 52 52 4d 53 47 28 29  IM_COPY_ERRMSG()
2dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2dd0: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 64 65 73  c;.}../* The des
2de0: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
2df0: 20 66 6f 72 20 61 20 64 69 73 70 6f 73 69 62 6c   for a disposibl
2e00: 65 20 6d 6f 64 75 6c 65 20 2a 2f 0a 73 74 61 74  e module */.stat
2e10: 69 63 20 76 6f 69 64 20 76 74 73 68 69 6d 41 75  ic void vtshimAu
2e20: 78 44 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64  xDestructor(void
2e30: 20 2a 70 58 41 75 78 29 7b 0a 20 20 76 74 73 68   *pXAux){.  vtsh
2e40: 69 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 28  im_aux *pAux = (
2e50: 76 74 73 68 69 6d 5f 61 75 78 2a 29 70 58 41 75  vtshim_aux*)pXAu
2e60: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 75  x;.  assert( pAu
2e70: 78 2d 3e 70 41 6c 6c 56 74 61 62 3d 3d 30 20 29  x->pAllVtab==0 )
2e80: 3b 0a 20 20 69 66 28 20 21 70 41 75 78 2d 3e 62  ;.  if( !pAux->b
2e90: 44 69 73 70 6f 73 65 64 20 26 26 20 70 41 75 78  Disposed && pAux
2ea0: 2d 3e 78 43 68 69 6c 64 44 65 73 74 72 6f 79 20  ->xChildDestroy 
2eb0: 29 7b 0a 20 20 20 20 70 41 75 78 2d 3e 78 43 68  ){.    pAux->xCh
2ec0: 69 6c 64 44 65 73 74 72 6f 79 28 70 41 75 78 2d  ildDestroy(pAux-
2ed0: 3e 70 43 68 69 6c 64 41 75 78 29 3b 0a 20 20 20  >pChildAux);.   
2ee0: 20 70 41 75 78 2d 3e 78 43 68 69 6c 64 44 65 73   pAux->xChildDes
2ef0: 74 72 6f 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  troy = 0;.  }.  
2f00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 75  sqlite3_free(pAu
2f10: 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  x->zName);.  sql
2f20: 69 74 65 33 5f 66 72 65 65 28 70 41 75 78 2d 3e  ite3_free(pAux->
2f30: 70 4d 6f 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  pMod);.  sqlite3
2f40: 5f 66 72 65 65 28 70 41 75 78 29 3b 0a 7d 0a 0a  _free(pAux);.}..
2f50: 73 74 61 74 69 63 20 69 6e 74 20 76 74 73 68 69  static int vtshi
2f60: 6d 43 6f 70 79 4d 6f 64 75 6c 65 28 0a 20 20 63  mCopyModule(.  c
2f70: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
2f80: 75 6c 65 20 2a 70 4d 6f 64 2c 20 20 20 2f 2a 20  ule *pMod,   /* 
2f90: 53 6f 75 72 63 65 20 6d 6f 64 75 6c 65 20 74 6f  Source module to
2fa0: 20 62 65 20 63 6f 70 69 65 64 20 2a 2f 0a 20 20   be copied */.  
2fb0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
2fc0: 2a 70 70 4d 6f 64 20 20 20 20 20 20 20 20 2f 2a  *ppMod        /*
2fd0: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
2fe0: 20 63 6f 70 69 65 64 20 6d 6f 64 75 6c 65 20 2a   copied module *
2ff0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  /.){.  sqlite3_m
3000: 6f 64 75 6c 65 20 2a 70 3b 0a 20 20 69 66 28 20  odule *p;.  if( 
3010: 21 70 4d 6f 64 20 7c 7c 20 21 70 70 4d 6f 64 20  !pMod || !ppMod 
3020: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
3030: 45 52 52 4f 52 3b 0a 20 20 70 20 3d 20 73 71 6c  ERROR;.  p = sql
3040: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
3050: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
3060: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
3070: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
3080: 65 6d 63 70 79 28 70 2c 20 70 4d 6f 64 2c 20 73  emcpy(p, pMod, s
3090: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 2a 70  izeof(*p));.  *p
30a0: 70 4d 6f 64 20 3d 20 70 3b 0a 20 20 72 65 74 75  pMod = p;.  retu
30b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30c0: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f  .#ifdef _WIN32._
30d0: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
30e0: 6f 72 74 29 0a 23 65 6e 64 69 66 0a 76 6f 69 64  ort).#endif.void
30f0: 20 2a 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   *sqlite3_create
3100: 5f 64 69 73 70 6f 73 61 62 6c 65 5f 6d 6f 64 75  _disposable_modu
3110: 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le(.  sqlite3 *d
3120: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
3130: 20 2f 2a 20 53 51 4c 69 74 65 20 63 6f 6e 6e 65   /* SQLite conne
3140: 63 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65  ction to registe
3150: 72 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 2a 2f  r module with */
3160: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3170: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Name,         /*
3180: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6f 64   Name of the mod
3190: 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73  ule */.  const s
31a0: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
31b0: 2c 20 20 20 2f 2a 20 4d 65 74 68 6f 64 73 20 66  ,   /* Methods f
31c0: 6f 72 20 74 68 65 20 6d 6f 64 75 6c 65 20 2a 2f  or the module */
31d0: 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  .  void *pClient
31e0: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 2f 2a  Data,         /*
31f0: 20 43 6c 69 65 6e 74 20 64 61 74 61 20 66 6f 72   Client data for
3200: 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63   xCreate/xConnec
3210: 74 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 44 65  t */.  void(*xDe
3220: 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 20 20 20  stroy)(void*)   
3230: 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 64 65 73 74    /* Module dest
3240: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
3250: 2a 2f 0a 29 7b 0a 20 20 76 74 73 68 69 6d 5f 61  */.){.  vtshim_a
3260: 75 78 20 2a 70 41 75 78 3b 0a 20 20 73 71 6c 69  ux *pAux;.  sqli
3270: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
3280: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 41  ;.  int rc;.  pA
3290: 75 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ux = sqlite3_mal
32a0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 41 75  loc( sizeof(*pAu
32b0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 41 75 78  x) );.  if( pAux
32c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 78  ==0 ){.    if( x
32d0: 44 65 73 74 72 6f 79 20 29 20 78 44 65 73 74 72  Destroy ) xDestr
32e0: 6f 79 28 70 43 6c 69 65 6e 74 44 61 74 61 29 3b  oy(pClientData);
32f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3300: 20 7d 0a 20 20 72 63 20 3d 20 76 74 73 68 69 6d   }.  rc = vtshim
3310: 43 6f 70 79 4d 6f 64 75 6c 65 28 70 2c 20 26 70  CopyModule(p, &p
3320: 4d 6f 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Mod);.  if( rc!=
3330: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3340: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41   sqlite3_free(pA
3350: 75 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ux);.    return 
3360: 30 3b 0a 20 20 7d 0a 20 20 70 41 75 78 2d 3e 70  0;.  }.  pAux->p
3370: 43 68 69 6c 64 41 75 78 20 3d 20 70 43 6c 69 65  ChildAux = pClie
3380: 6e 74 44 61 74 61 3b 0a 20 20 70 41 75 78 2d 3e  ntData;.  pAux->
3390: 78 43 68 69 6c 64 44 65 73 74 72 6f 79 20 3d 20  xChildDestroy = 
33a0: 78 44 65 73 74 72 6f 79 3b 0a 20 20 70 41 75 78  xDestroy;.  pAux
33b0: 2d 3e 70 4d 6f 64 20 3d 20 70 4d 6f 64 3b 0a 20  ->pMod = pMod;. 
33c0: 20 70 41 75 78 2d 3e 64 62 20 3d 20 64 62 3b 0a   pAux->db = db;.
33d0: 20 20 70 41 75 78 2d 3e 7a 4e 61 6d 65 20 3d 20    pAux->zName = 
33e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
33f0: 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%s", zName);.  
3400: 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20  pAux->bDisposed 
3410: 3d 20 30 3b 0a 20 20 70 41 75 78 2d 3e 70 41 6c  = 0;.  pAux->pAl
3420: 6c 56 74 61 62 20 3d 20 30 3b 0a 20 20 70 41 75  lVtab = 0;.  pAu
3430: 78 2d 3e 73 53 65 6c 66 2e 69 56 65 72 73 69 6f  x->sSelf.iVersio
3440: 6e 20 3d 20 70 2d 3e 69 56 65 72 73 69 6f 6e 3c  n = p->iVersion<
3450: 3d 32 20 3f 20 70 2d 3e 69 56 65 72 73 69 6f 6e  =2 ? p->iVersion
3460: 20 3a 20 32 3b 0a 20 20 70 41 75 78 2d 3e 73 53   : 2;.  pAux->sS
3470: 65 6c 66 2e 78 43 72 65 61 74 65 20 3d 20 70 2d  elf.xCreate = p-
3480: 3e 78 43 72 65 61 74 65 20 3f 20 76 74 73 68 69  >xCreate ? vtshi
3490: 6d 43 72 65 61 74 65 20 3a 20 30 3b 0a 20 20 70  mCreate : 0;.  p
34a0: 41 75 78 2d 3e 73 53 65 6c 66 2e 78 43 6f 6e 6e  Aux->sSelf.xConn
34b0: 65 63 74 20 3d 20 70 2d 3e 78 43 6f 6e 6e 65 63  ect = p->xConnec
34c0: 74 20 3f 20 76 74 73 68 69 6d 43 6f 6e 6e 65 63  t ? vtshimConnec
34d0: 74 20 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73  t : 0;.  pAux->s
34e0: 53 65 6c 66 2e 78 42 65 73 74 49 6e 64 65 78 20  Self.xBestIndex 
34f0: 3d 20 70 2d 3e 78 42 65 73 74 49 6e 64 65 78 20  = p->xBestIndex 
3500: 3f 20 76 74 73 68 69 6d 42 65 73 74 49 6e 64 65  ? vtshimBestInde
3510: 78 20 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73  x : 0;.  pAux->s
3520: 53 65 6c 66 2e 78 44 69 73 63 6f 6e 6e 65 63 74  Self.xDisconnect
3530: 20 3d 20 70 2d 3e 78 44 69 73 63 6f 6e 6e 65 63   = p->xDisconnec
3540: 74 20 3f 20 76 74 73 68 69 6d 44 69 73 63 6f 6e  t ? vtshimDiscon
3550: 6e 65 63 74 20 3a 20 30 3b 0a 20 20 70 41 75 78  nect : 0;.  pAux
3560: 2d 3e 73 53 65 6c 66 2e 78 44 65 73 74 72 6f 79  ->sSelf.xDestroy
3570: 20 3d 20 70 2d 3e 78 44 65 73 74 72 6f 79 20 3f   = p->xDestroy ?
3580: 20 76 74 73 68 69 6d 44 65 73 74 72 6f 79 20 3a   vtshimDestroy :
3590: 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c   0;.  pAux->sSel
35a0: 66 2e 78 4f 70 65 6e 20 3d 20 70 2d 3e 78 4f 70  f.xOpen = p->xOp
35b0: 65 6e 20 3f 20 76 74 73 68 69 6d 4f 70 65 6e 20  en ? vtshimOpen 
35c0: 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65  : 0;.  pAux->sSe
35d0: 6c 66 2e 78 43 6c 6f 73 65 20 3d 20 70 2d 3e 78  lf.xClose = p->x
35e0: 43 6c 6f 73 65 20 3f 20 76 74 73 68 69 6d 43 6c  Close ? vtshimCl
35f0: 6f 73 65 20 3a 20 30 3b 0a 20 20 70 41 75 78 2d  ose : 0;.  pAux-
3600: 3e 73 53 65 6c 66 2e 78 46 69 6c 74 65 72 20 3d  >sSelf.xFilter =
3610: 20 70 2d 3e 78 46 69 6c 74 65 72 20 3f 20 76 74   p->xFilter ? vt
3620: 73 68 69 6d 46 69 6c 74 65 72 20 3a 20 30 3b 0a  shimFilter : 0;.
3630: 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 4e    pAux->sSelf.xN
3640: 65 78 74 20 3d 20 70 2d 3e 78 4e 65 78 74 20 3f  ext = p->xNext ?
3650: 20 76 74 73 68 69 6d 4e 65 78 74 20 3a 20 30 3b   vtshimNext : 0;
3660: 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78  .  pAux->sSelf.x
3670: 45 6f 66 20 3d 20 70 2d 3e 78 45 6f 66 20 3f 20  Eof = p->xEof ? 
3680: 76 74 73 68 69 6d 45 6f 66 20 3a 20 30 3b 0a 20  vtshimEof : 0;. 
3690: 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 43 6f   pAux->sSelf.xCo
36a0: 6c 75 6d 6e 20 3d 20 70 2d 3e 78 43 6f 6c 75 6d  lumn = p->xColum
36b0: 6e 20 3f 20 76 74 73 68 69 6d 43 6f 6c 75 6d 6e  n ? vtshimColumn
36c0: 20 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53   : 0;.  pAux->sS
36d0: 65 6c 66 2e 78 52 6f 77 69 64 20 3d 20 70 2d 3e  elf.xRowid = p->
36e0: 78 52 6f 77 69 64 20 3f 20 76 74 73 68 69 6d 52  xRowid ? vtshimR
36f0: 6f 77 69 64 20 3a 20 30 3b 0a 20 20 70 41 75 78  owid : 0;.  pAux
3700: 2d 3e 73 53 65 6c 66 2e 78 55 70 64 61 74 65 20  ->sSelf.xUpdate 
3710: 3d 20 70 2d 3e 78 55 70 64 61 74 65 20 3f 20 76  = p->xUpdate ? v
3720: 74 73 68 69 6d 55 70 64 61 74 65 20 3a 20 30 3b  tshimUpdate : 0;
3730: 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78  .  pAux->sSelf.x
3740: 42 65 67 69 6e 20 3d 20 70 2d 3e 78 42 65 67 69  Begin = p->xBegi
3750: 6e 20 3f 20 76 74 73 68 69 6d 42 65 67 69 6e 20  n ? vtshimBegin 
3760: 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65  : 0;.  pAux->sSe
3770: 6c 66 2e 78 53 79 6e 63 20 3d 20 70 2d 3e 78 53  lf.xSync = p->xS
3780: 79 6e 63 20 3f 20 76 74 73 68 69 6d 53 79 6e 63  ync ? vtshimSync
3790: 20 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53   : 0;.  pAux->sS
37a0: 65 6c 66 2e 78 43 6f 6d 6d 69 74 20 3d 20 70 2d  elf.xCommit = p-
37b0: 3e 78 43 6f 6d 6d 69 74 20 3f 20 76 74 73 68 69  >xCommit ? vtshi
37c0: 6d 43 6f 6d 6d 69 74 20 3a 20 30 3b 0a 20 20 70  mCommit : 0;.  p
37d0: 41 75 78 2d 3e 73 53 65 6c 66 2e 78 52 6f 6c 6c  Aux->sSelf.xRoll
37e0: 62 61 63 6b 20 3d 20 70 2d 3e 78 52 6f 6c 6c 62  back = p->xRollb
37f0: 61 63 6b 20 3f 20 76 74 73 68 69 6d 52 6f 6c 6c  ack ? vtshimRoll
3800: 62 61 63 6b 20 3a 20 30 3b 0a 20 20 70 41 75 78  back : 0;.  pAux
3810: 2d 3e 73 53 65 6c 66 2e 78 46 69 6e 64 46 75 6e  ->sSelf.xFindFun
3820: 63 74 69 6f 6e 20 3d 20 70 2d 3e 78 46 69 6e 64  ction = p->xFind
3830: 46 75 6e 63 74 69 6f 6e 20 3f 20 76 74 73 68 69  Function ? vtshi
3840: 6d 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 3a 20  mFindFunction : 
3850: 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c 66  0;.  pAux->sSelf
3860: 2e 78 52 65 6e 61 6d 65 20 3d 20 70 2d 3e 78 52  .xRename = p->xR
3870: 65 6e 61 6d 65 20 3f 20 76 74 73 68 69 6d 52 65  ename ? vtshimRe
3880: 6e 61 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20  name : 0;.  if( 
3890: 70 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 29  p->iVersion>=2 )
38a0: 7b 0a 20 20 20 20 70 41 75 78 2d 3e 73 53 65 6c  {.    pAux->sSel
38b0: 66 2e 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  f.xSavepoint = p
38c0: 2d 3e 78 53 61 76 65 70 6f 69 6e 74 20 3f 20 76  ->xSavepoint ? v
38d0: 74 73 68 69 6d 53 61 76 65 70 6f 69 6e 74 20 3a  tshimSavepoint :
38e0: 20 30 3b 0a 20 20 20 20 70 41 75 78 2d 3e 73 53   0;.    pAux->sS
38f0: 65 6c 66 2e 78 52 65 6c 65 61 73 65 20 3d 20 70  elf.xRelease = p
3900: 2d 3e 78 52 65 6c 65 61 73 65 20 3f 20 76 74 73  ->xRelease ? vts
3910: 68 69 6d 52 65 6c 65 61 73 65 20 3a 20 30 3b 0a  himRelease : 0;.
3920: 20 20 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e      pAux->sSelf.
3930: 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 3d 20 70 2d  xRollbackTo = p-
3940: 3e 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 3f 20 76  >xRollbackTo ? v
3950: 74 73 68 69 6d 52 6f 6c 6c 62 61 63 6b 54 6f 20  tshimRollbackTo 
3960: 3a 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  : 0;.  }else{.  
3970: 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 53    pAux->sSelf.xS
3980: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
3990: 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 52    pAux->sSelf.xR
39a0: 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 20 20  elease = 0;.    
39b0: 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 52 6f 6c  pAux->sSelf.xRol
39c0: 6c 62 61 63 6b 54 6f 20 3d 20 30 3b 0a 20 20 7d  lbackTo = 0;.  }
39d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
39e0: 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32  create_module_v2
39f0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 41 75  (db, zName, &pAu
3a00: 78 2d 3e 73 53 65 6c 66 2c 0a 20 20 20 20 20 20  x->sSelf,.      
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 20 20 20 20 20 20 20 20 70 41 75 78 2c 20            pAux, 
3a30: 76 74 73 68 69 6d 41 75 78 44 65 73 74 72 75 63  vtshimAuxDestruc
3a40: 74 6f 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tor);.  return r
3a50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 28  c==SQLITE_OK ? (
3a60: 76 6f 69 64 2a 29 70 41 75 78 20 3a 20 30 3b 0a  void*)pAux : 0;.
3a70: 7d 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  }..#ifdef _WIN32
3a80: 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
3a90: 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 76 6f  xport).#endif.vo
3aa0: 69 64 20 73 71 6c 69 74 65 33 5f 64 69 73 70 6f  id sqlite3_dispo
3ab0: 73 65 5f 6d 6f 64 75 6c 65 28 76 6f 69 64 20 2a  se_module(void *
3ac0: 70 58 29 7b 0a 20 20 76 74 73 68 69 6d 5f 61 75  pX){.  vtshim_au
3ad0: 78 20 2a 70 41 75 78 20 3d 20 28 76 74 73 68 69  x *pAux = (vtshi
3ae0: 6d 5f 61 75 78 2a 29 70 58 3b 0a 20 20 69 66 28  m_aux*)pX;.  if(
3af0: 20 21 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65   !pAux->bDispose
3b00: 64 20 29 7b 0a 20 20 20 20 76 74 73 68 69 6d 5f  d ){.    vtshim_
3b10: 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 20  vtab *pVtab;.   
3b20: 20 76 74 73 68 69 6d 5f 63 75 72 73 6f 72 20 2a   vtshim_cursor *
3b30: 70 43 75 72 3b 0a 20 20 20 20 66 6f 72 28 70 56  pCur;.    for(pV
3b40: 74 61 62 3d 70 41 75 78 2d 3e 70 41 6c 6c 56 74  tab=pAux->pAllVt
3b50: 61 62 3b 20 70 56 74 61 62 3b 20 70 56 74 61 62  ab; pVtab; pVtab
3b60: 3d 70 56 74 61 62 2d 3e 70 4e 65 78 74 29 7b 0a  =pVtab->pNext){.
3b70: 20 20 20 20 20 20 66 6f 72 28 70 43 75 72 3d 70        for(pCur=p
3b80: 56 74 61 62 2d 3e 70 41 6c 6c 43 75 72 3b 20 70  Vtab->pAllCur; p
3b90: 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
3ba0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
3bb0: 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 43 6c 6f  pAux->pMod->xClo
3bc0: 73 65 28 70 43 75 72 2d 3e 70 43 68 69 6c 64 29  se(pCur->pChild)
3bd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3be0: 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 44 69 73  pAux->pMod->xDis
3bf0: 63 6f 6e 6e 65 63 74 28 70 56 74 61 62 2d 3e 70  connect(pVtab->p
3c00: 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
3c10: 20 20 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65    pAux->bDispose
3c20: 64 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  d = 1;.    if( p
3c30: 41 75 78 2d 3e 78 43 68 69 6c 64 44 65 73 74 72  Aux->xChildDestr
3c40: 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 41 75 78  oy ){.      pAux
3c50: 2d 3e 78 43 68 69 6c 64 44 65 73 74 72 6f 79 28  ->xChildDestroy(
3c60: 70 41 75 78 2d 3e 70 43 68 69 6c 64 41 75 78 29  pAux->pChildAux)
3c70: 3b 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 78 43  ;.      pAux->xC
3c80: 68 69 6c 64 44 65 73 74 72 6f 79 20 3d 20 30 3b  hildDestroy = 0;
3c90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 23  .    }.  }.}...#
3ca0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3cb0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
3cc0: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 57 49  E */..#ifdef _WI
3cd0: 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  N32.__declspec(d
3ce0: 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66  llexport).#endif
3cf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 74 73  .int sqlite3_vts
3d00: 68 69 6d 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69  him_init(.  sqli
3d10: 74 65 33 20 2a 64 62 2c 0a 20 20 63 68 61 72 20  te3 *db,.  char 
3d20: 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f  **pzErrMsg,.  co
3d30: 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
3d40: 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29  routines *pApi.)
3d50: 7b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  {.  SQLITE_EXTEN
3d60: 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29  SION_INIT2(pApi)
3d70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3d80: 45 5f 4f 4b 3b 0a 7d 0a                          E_OK;.}.