System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd:


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 20 20 72 65 74 75 72  b = 0;.    retur
0cf0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  n rc;.  }.  pNew
0d00: 2d 3e 70 41 75 78 20 3d 20 70 41 75 78 3b 0a 20  ->pAux = pAux;. 
0d10: 20 70 4e 65 77 2d 3e 70 70 50 72 65 76 20 3d 20   pNew->ppPrev = 
0d20: 26 70 41 75 78 2d 3e 70 41 6c 6c 56 74 61 62 3b  &pAux->pAllVtab;
0d30: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
0d40: 20 70 41 75 78 2d 3e 70 41 6c 6c 56 74 61 62 3b   pAux->pAllVtab;
0d50: 0a 20 20 69 66 28 20 70 41 75 78 2d 3e 70 41 6c  .  if( pAux->pAl
0d60: 6c 56 74 61 62 20 29 20 70 41 75 78 2d 3e 70 41  lVtab ) pAux->pA
0d70: 6c 6c 56 74 61 62 2d 3e 70 70 50 72 65 76 20 3d  llVtab->ppPrev =
0d80: 20 26 70 4e 65 77 2d 3e 70 4e 65 78 74 3b 0a 20   &pNew->pNext;. 
0d90: 20 70 41 75 78 2d 3e 70 41 6c 6c 56 74 61 62 20   pAux->pAllVtab 
0da0: 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e  = pNew;.  return
0db0: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
0dc0: 6e 74 20 76 74 73 68 69 6d 43 6f 6e 6e 65 63 74  nt vtshimConnect
0dd0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
0de0: 0a 20 20 76 6f 69 64 20 2a 70 70 41 75 78 2c 0a  .  void *ppAux,.
0df0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 6f    int argc,.  co
0e00: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a  nst char *const*
0e10: 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argv,.  sqlite3_
0e20: 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20  vtab **ppVtab,. 
0e30: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
0e40: 0a 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a 70  .  vtshim_aux *p
0e50: 41 75 78 20 3d 20 28 76 74 73 68 69 6d 5f 61 75  Aux = (vtshim_au
0e60: 78 2a 29 70 70 41 75 78 3b 0a 20 20 76 74 73 68  x*)ppAux;.  vtsh
0e70: 69 6d 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20  im_vtab *pNew;. 
0e80: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
0e90: 72 74 28 20 64 62 3d 3d 70 41 75 78 2d 3e 64 62  rt( db==pAux->db
0ea0: 20 29 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e   );.  if( pAux->
0eb0: 62 44 69 73 70 6f 73 65 64 20 29 7b 0a 20 20 20  bDisposed ){.   
0ec0: 20 69 66 28 20 70 7a 45 72 72 20 29 7b 0a 20 20   if( pzErr ){.  
0ed0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
0ee0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 76 69  ite3_mprintf("vi
0ef0: 72 74 75 61 6c 20 74 61 62 6c 65 20 77 61 73 20  rtual table was 
0f00: 64 69 73 70 6f 73 65 64 3a 20 5c 22 25 73 5c 22  disposed: \"%s\"
0f10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 70 41 75 78 2d 3e 7a 4e 61 6d 65 29 3b 0a    pAux->zName);.
0f40: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
0f50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
0f60: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
0f70: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
0f80: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 2a  of(*pNew) );.  *
0f90: 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVtab = (sqlite
0fa0: 33 5f 76 74 61 62 2a 29 70 4e 65 77 3b 0a 20 20  3_vtab*)pNew;.  
0fb0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
0fc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
0fd0: 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  M;.  memset(pNew
0fe0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , 0, sizeof(*pNe
0ff0: 77 29 29 3b 0a 20 20 72 63 20 3d 20 70 41 75 78  w));.  rc = pAux
1000: 2d 3e 70 4d 6f 64 2d 3e 78 43 6f 6e 6e 65 63 74  ->pMod->xConnect
1010: 28 64 62 2c 20 70 41 75 78 2d 3e 70 43 68 69 6c  (db, pAux->pChil
1020: 64 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76  dAux, argc, argv
1030: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
1050: 4e 65 77 2d 3e 70 43 68 69 6c 64 2c 20 70 7a 45  New->pChild, pzE
1060: 72 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  rr);.  if( rc ){
1070: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1080: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70  e(pNew);.    *pp
1090: 56 74 61 62 20 3d 20 30 3b 0a 20 20 20 20 72 65  Vtab = 0;.    re
10a0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
10b0: 4e 65 77 2d 3e 70 41 75 78 20 3d 20 70 41 75 78  New->pAux = pAux
10c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 70 50 72 65 76  ;.  pNew->ppPrev
10d0: 20 3d 20 26 70 41 75 78 2d 3e 70 41 6c 6c 56 74   = &pAux->pAllVt
10e0: 61 62 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ab;.  pNew->pNex
10f0: 74 20 3d 20 70 41 75 78 2d 3e 70 41 6c 6c 56 74  t = pAux->pAllVt
1100: 61 62 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e  ab;.  if( pAux->
1110: 70 41 6c 6c 56 74 61 62 20 29 20 70 41 75 78 2d  pAllVtab ) pAux-
1120: 3e 70 41 6c 6c 56 74 61 62 2d 3e 70 70 50 72 65  >pAllVtab->ppPre
1130: 76 20 3d 20 26 70 4e 65 77 2d 3e 70 4e 65 78 74  v = &pNew->pNext
1140: 3b 0a 20 20 70 41 75 78 2d 3e 70 41 6c 6c 56 74  ;.  pAux->pAllVt
1150: 61 62 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74  ab = pNew;.  ret
1160: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
1170: 63 20 69 6e 74 20 76 74 73 68 69 6d 42 65 73 74  c int vtshimBest
1180: 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33  Index(.  sqlite3
1190: 5f 76 74 61 62 20 2a 70 42 61 73 65 2c 0a 20 20  _vtab *pBase,.  
11a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
11b0: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a  fo *pIdxInfo.){.
11c0: 20 20 76 74 73 68 69 6d 5f 76 74 61 62 20 2a 70    vtshim_vtab *p
11d0: 56 74 61 62 20 3d 20 28 76 74 73 68 69 6d 5f 76  Vtab = (vtshim_v
11e0: 74 61 62 2a 29 70 42 61 73 65 3b 0a 20 20 76 74  tab*)pBase;.  vt
11f0: 73 68 69 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d  shim_aux *pAux =
1200: 20 70 56 74 61 62 2d 3e 70 41 75 78 3b 0a 20 20   pVtab->pAux;.  
1210: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 41  int rc;.  if( pA
1220: 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20 29 20  ux->bDisposed ) 
1230: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1240: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 41 75 78  ROR;.  rc = pAux
1250: 2d 3e 70 4d 6f 64 2d 3e 78 42 65 73 74 49 6e 64  ->pMod->xBestInd
1260: 65 78 28 70 56 74 61 62 2d 3e 70 43 68 69 6c 64  ex(pVtab->pChild
1270: 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69  , pIdxInfo);.  i
1280: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1290: 20 29 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43   ){.    VTSHIM_C
12a0: 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20  OPY_ERRMSG();.  
12b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 73  ..static int vts
12d0: 68 69 6d 44 69 73 63 6f 6e 6e 65 63 74 28 73 71  himDisconnect(sq
12e0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 42 61 73  lite3_vtab *pBas
12f0: 65 29 7b 0a 20 20 76 74 73 68 69 6d 5f 76 74 61  e){.  vtshim_vta
1300: 62 20 2a 70 56 74 61 62 20 3d 20 28 76 74 73 68  b *pVtab = (vtsh
1310: 69 6d 5f 76 74 61 62 2a 29 70 42 61 73 65 3b 0a  im_vtab*)pBase;.
1320: 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41    vtshim_aux *pA
1330: 75 78 20 3d 20 70 56 74 61 62 2d 3e 70 41 75 78  ux = pVtab->pAux
1340: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1350: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
1360: 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20 29  Aux->bDisposed )
1370: 7b 0a 20 20 20 20 72 63 20 3d 20 70 41 75 78 2d  {.    rc = pAux-
1380: 3e 70 4d 6f 64 2d 3e 78 44 69 73 63 6f 6e 6e 65  >pMod->xDisconne
1390: 63 74 28 70 56 74 61 62 2d 3e 70 43 68 69 6c 64  ct(pVtab->pChild
13a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 56 74  );.  }.  if( pVt
13b0: 61 62 2d 3e 70 4e 65 78 74 20 29 20 70 56 74 61  ab->pNext ) pVta
13c0: 62 2d 3e 70 4e 65 78 74 2d 3e 70 70 50 72 65 76  b->pNext->ppPrev
13d0: 20 3d 20 70 56 74 61 62 2d 3e 70 70 50 72 65 76   = pVtab->ppPrev
13e0: 3b 0a 20 20 2a 70 56 74 61 62 2d 3e 70 70 50 72  ;.  *pVtab->ppPr
13f0: 65 76 20 3d 20 70 56 74 61 62 2d 3e 70 4e 65 78  ev = pVtab->pNex
1400: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t;.  sqlite3_fre
1410: 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75  e(pVtab);.  retu
1420: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
1430: 20 69 6e 74 20 76 74 73 68 69 6d 44 65 73 74 72   int vtshimDestr
1440: 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  oy(sqlite3_vtab 
1450: 2a 70 42 61 73 65 29 7b 0a 20 20 76 74 73 68 69  *pBase){.  vtshi
1460: 6d 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  m_vtab *pVtab = 
1470: 28 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 42  (vtshim_vtab*)pB
1480: 61 73 65 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75  ase;.  vtshim_au
1490: 78 20 2a 70 41 75 78 20 3d 20 70 56 74 61 62 2d  x *pAux = pVtab-
14a0: 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20 72 63 20  >pAux;.  int rc 
14b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14c0: 66 28 20 21 70 41 75 78 2d 3e 62 44 69 73 70 6f  f( !pAux->bDispo
14d0: 73 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sed ){.    rc = 
14e0: 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 44 65 73  pAux->pMod->xDes
14f0: 74 72 6f 79 28 70 56 74 61 62 2d 3e 70 43 68 69  troy(pVtab->pChi
1500: 6c 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ld);.  }.  if( p
1510: 56 74 61 62 2d 3e 70 4e 65 78 74 20 29 20 70 56  Vtab->pNext ) pV
1520: 74 61 62 2d 3e 70 4e 65 78 74 2d 3e 70 70 50 72  tab->pNext->ppPr
1530: 65 76 20 3d 20 70 56 74 61 62 2d 3e 70 70 50 72  ev = pVtab->ppPr
1540: 65 76 3b 0a 20 20 2a 70 56 74 61 62 2d 3e 70 70  ev;.  *pVtab->pp
1550: 50 72 65 76 20 3d 20 70 56 74 61 62 2d 3e 70 4e  Prev = pVtab->pN
1560: 65 78 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ext;.  sqlite3_f
1570: 72 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65  ree(pVtab);.  re
1580: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
1590: 69 63 20 69 6e 74 20 76 74 73 68 69 6d 4f 70 65  ic int vtshimOpe
15a0: 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  n(sqlite3_vtab *
15b0: 70 42 61 73 65 2c 20 73 71 6c 69 74 65 33 5f 76  pBase, sqlite3_v
15c0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
15d0: 75 72 73 6f 72 29 7b 0a 20 20 76 74 73 68 69 6d  ursor){.  vtshim
15e0: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28  _vtab *pVtab = (
15f0: 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 42 61  vtshim_vtab*)pBa
1600: 73 65 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78  se;.  vtshim_aux
1610: 20 2a 70 41 75 78 20 3d 20 70 56 74 61 62 2d 3e   *pAux = pVtab->
1620: 70 41 75 78 3b 0a 20 20 76 74 73 68 69 6d 5f 63  pAux;.  vtshim_c
1630: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
1640: 6e 74 20 72 63 3b 0a 20 20 2a 70 70 43 75 72 73  nt rc;.  *ppCurs
1650: 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41  or = 0;.  if( pA
1660: 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20 29 20  ux->bDisposed ) 
1670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1680: 52 4f 52 3b 0a 20 20 70 43 75 72 20 3d 20 73 71  ROR;.  pCur = sq
1690: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
16a0: 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20  zeof(*pCur) );. 
16b0: 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72   if( pCur==0 ) r
16c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16d0: 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75  EM;.  memset(pCu
16e0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  r, 0, sizeof(*pC
16f0: 75 72 29 29 3b 0a 20 20 72 63 20 3d 20 70 41 75  ur));.  rc = pAu
1700: 78 2d 3e 70 4d 6f 64 2d 3e 78 4f 70 65 6e 28 70  x->pMod->xOpen(p
1710: 56 74 61 62 2d 3e 70 43 68 69 6c 64 2c 20 26 70  Vtab->pChild, &p
1720: 43 75 72 2d 3e 70 43 68 69 6c 64 29 3b 0a 20 20  Cur->pChild);.  
1730: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
1740: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1750: 3b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f 50  ;.    VTSHIM_COP
1760: 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 20 20  Y_ERRMSG();.    
1770: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1780: 20 70 43 75 72 2d 3e 70 43 68 69 6c 64 2d 3e 70   pCur->pChild->p
1790: 56 74 61 62 20 3d 20 70 56 74 61 62 2d 3e 70 43  Vtab = pVtab->pC
17a0: 68 69 6c 64 3b 0a 20 20 2a 70 70 43 75 72 73 6f  hild;.  *ppCurso
17b0: 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65 3b  r = &pCur->base;
17c0: 0a 20 20 70 43 75 72 2d 3e 70 70 50 72 65 76 20  .  pCur->ppPrev 
17d0: 3d 20 26 70 56 74 61 62 2d 3e 70 41 6c 6c 43 75  = &pVtab->pAllCu
17e0: 72 3b 0a 20 20 69 66 28 20 70 56 74 61 62 2d 3e  r;.  if( pVtab->
17f0: 70 41 6c 6c 43 75 72 20 29 20 70 56 74 61 62 2d  pAllCur ) pVtab-
1800: 3e 70 41 6c 6c 43 75 72 2d 3e 70 70 50 72 65 76  >pAllCur->ppPrev
1810: 20 3d 20 26 70 43 75 72 2d 3e 70 4e 65 78 74 3b   = &pCur->pNext;
1820: 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
1830: 20 70 56 74 61 62 2d 3e 70 41 6c 6c 43 75 72 3b   pVtab->pAllCur;
1840: 0a 20 20 70 56 74 61 62 2d 3e 70 41 6c 6c 43 75  .  pVtab->pAllCu
1850: 72 20 3d 20 70 43 75 72 3b 0a 20 20 72 65 74 75  r = pCur;.  retu
1860: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1870: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 73 68  .static int vtsh
1880: 69 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  imClose(sqlite3_
1890: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 58 29  vtab_cursor *pX)
18a0: 7b 0a 20 20 76 74 73 68 69 6d 5f 63 75 72 73 6f  {.  vtshim_curso
18b0: 72 20 2a 70 43 75 72 20 3d 20 28 76 74 73 68 69  r *pCur = (vtshi
18c0: 6d 5f 63 75 72 73 6f 72 2a 29 70 58 3b 0a 20 20  m_cursor*)pX;.  
18d0: 76 74 73 68 69 6d 5f 76 74 61 62 20 2a 70 56 74  vtshim_vtab *pVt
18e0: 61 62 20 3d 20 28 76 74 73 68 69 6d 5f 76 74 61  ab = (vtshim_vta
18f0: 62 2a 29 70 43 75 72 2d 3e 62 61 73 65 2e 70 56  b*)pCur->base.pV
1900: 74 61 62 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75  tab;.  vtshim_au
1910: 78 20 2a 70 41 75 78 20 3d 20 70 56 74 61 62 2d  x *pAux = pVtab-
1920: 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20 72 63 20  >pAux;.  int rc 
1930: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1940: 66 28 20 21 70 41 75 78 2d 3e 62 44 69 73 70 6f  f( !pAux->bDispo
1950: 73 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sed ){.    rc = 
1960: 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 43 6c 6f  pAux->pMod->xClo
1970: 73 65 28 70 43 75 72 2d 3e 70 43 68 69 6c 64 29  se(pCur->pChild)
1980: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1990: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19a0: 20 56 54 53 48 49 4d 5f 43 4f 50 59 5f 45 52 52   VTSHIM_COPY_ERR
19b0: 4d 53 47 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MSG();.    }.  }
19c0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
19d0: 78 74 20 29 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt ) pCur->pNext
19e0: 2d 3e 70 70 50 72 65 76 20 3d 20 70 43 75 72 2d  ->ppPrev = pCur-
19f0: 3e 70 70 50 72 65 76 3b 0a 20 20 2a 70 43 75 72  >ppPrev;.  *pCur
1a00: 2d 3e 70 70 50 72 65 76 20 3d 20 70 43 75 72 2d  ->ppPrev = pCur-
1a10: 3e 70 4e 65 78 74 3b 0a 20 20 73 71 6c 69 74 65  >pNext;.  sqlite
1a20: 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a 20 20  3_free(pCur);.  
1a30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
1a40: 61 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d 46  atic int vtshimF
1a50: 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
1a60: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 58  _vtab_cursor *pX
1a70: 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 0a  ,.  int idxNum,.
1a80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64    const char *id
1a90: 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
1aa0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1ab0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 76 74  e **argv.){.  vt
1ac0: 73 68 69 6d 5f 63 75 72 73 6f 72 20 2a 70 43 75  shim_cursor *pCu
1ad0: 72 20 3d 20 28 76 74 73 68 69 6d 5f 63 75 72 73  r = (vtshim_curs
1ae0: 6f 72 2a 29 70 58 3b 0a 20 20 76 74 73 68 69 6d  or*)pX;.  vtshim
1af0: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28  _vtab *pVtab = (
1b00: 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 43 75  vtshim_vtab*)pCu
1b10: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
1b20: 20 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41 75   vtshim_aux *pAu
1b30: 78 20 3d 20 70 56 74 61 62 2d 3e 70 41 75 78 3b  x = pVtab->pAux;
1b40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1b50: 20 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64   pAux->bDisposed
1b60: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b70: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70  _ERROR;.  rc = p
1b80: 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 46 69 6c 74  Aux->pMod->xFilt
1b90: 65 72 28 70 43 75 72 2d 3e 70 43 68 69 6c 64 2c  er(pCur->pChild,
1ba0: 20 69 64 78 4e 75 6d 2c 20 69 64 78 53 74 72 2c   idxNum, idxStr,
1bb0: 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 20 20   argc, argv);.  
1bc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bd0: 4b 20 29 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f  K ){.    VTSHIM_
1be0: 43 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20  COPY_ERRMSG();. 
1bf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c00: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  }..static int vt
1c10: 73 68 69 6d 4e 65 78 74 28 73 71 6c 69 74 65 33  shimNext(sqlite3
1c20: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 58  _vtab_cursor *pX
1c30: 29 7b 0a 20 20 76 74 73 68 69 6d 5f 63 75 72 73  ){.  vtshim_curs
1c40: 6f 72 20 2a 70 43 75 72 20 3d 20 28 76 74 73 68  or *pCur = (vtsh
1c50: 69 6d 5f 63 75 72 73 6f 72 2a 29 70 58 3b 0a 20  im_cursor*)pX;. 
1c60: 20 76 74 73 68 69 6d 5f 76 74 61 62 20 2a 70 56   vtshim_vtab *pV
1c70: 74 61 62 20 3d 20 28 76 74 73 68 69 6d 5f 76 74  tab = (vtshim_vt
1c80: 61 62 2a 29 70 43 75 72 2d 3e 62 61 73 65 2e 70  ab*)pCur->base.p
1c90: 56 74 61 62 3b 0a 20 20 76 74 73 68 69 6d 5f 61  Vtab;.  vtshim_a
1ca0: 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74 61 62  ux *pAux = pVtab
1cb0: 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20 72 63  ->pAux;.  int rc
1cc0: 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e 62 44  ;.  if( pAux->bD
1cd0: 69 73 70 6f 73 65 64 20 29 20 72 65 74 75 72 6e  isposed ) return
1ce0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1cf0: 20 72 63 20 3d 20 70 41 75 78 2d 3e 70 4d 6f 64   rc = pAux->pMod
1d00: 2d 3e 78 4e 65 78 74 28 70 43 75 72 2d 3e 70 43  ->xNext(pCur->pC
1d10: 68 69 6c 64 29 3b 0a 20 20 69 66 28 20 72 63 21  hild);.  if( rc!
1d20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d30: 20 20 56 54 53 48 49 4d 5f 43 4f 50 59 5f 45 52    VTSHIM_COPY_ER
1d40: 52 4d 53 47 28 29 3b 0a 20 20 7d 0a 20 20 72 65  RMSG();.  }.  re
1d50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
1d60: 69 63 20 69 6e 74 20 76 74 73 68 69 6d 45 6f 66  ic int vtshimEof
1d70: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
1d80: 72 73 6f 72 20 2a 70 58 29 7b 0a 20 20 76 74 73  rsor *pX){.  vts
1d90: 68 69 6d 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  him_cursor *pCur
1da0: 20 3d 20 28 76 74 73 68 69 6d 5f 63 75 72 73 6f   = (vtshim_curso
1db0: 72 2a 29 70 58 3b 0a 20 20 76 74 73 68 69 6d 5f  r*)pX;.  vtshim_
1dc0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 76  vtab *pVtab = (v
1dd0: 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 43 75 72  tshim_vtab*)pCur
1de0: 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20  ->base.pVtab;.  
1df0: 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41 75 78  vtshim_aux *pAux
1e00: 20 3d 20 70 56 74 61 62 2d 3e 70 41 75 78 3b 0a   = pVtab->pAux;.
1e10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1e20: 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20  pAux->bDisposed 
1e30: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 63  ) return 1;.  rc
1e40: 20 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78   = pAux->pMod->x
1e50: 45 6f 66 28 70 43 75 72 2d 3e 70 43 68 69 6c 64  Eof(pCur->pChild
1e60: 29 3b 0a 20 20 56 54 53 48 49 4d 5f 43 4f 50 59  );.  VTSHIM_COPY
1e70: 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 72 65 74  _ERRMSG();.  ret
1e80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
1e90: 63 20 69 6e 74 20 76 74 73 68 69 6d 43 6f 6c 75  c int vtshimColu
1ea0: 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  mn(sqlite3_vtab_
1eb0: 63 75 72 73 6f 72 20 2a 70 58 2c 20 73 71 6c 69  cursor *pX, sqli
1ec0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
1ed0: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 76 74 73 68  , int i){.  vtsh
1ee0: 69 6d 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  im_cursor *pCur 
1ef0: 3d 20 28 76 74 73 68 69 6d 5f 63 75 72 73 6f 72  = (vtshim_cursor
1f00: 2a 29 70 58 3b 0a 20 20 76 74 73 68 69 6d 5f 76  *)pX;.  vtshim_v
1f10: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 76 74  tab *pVtab = (vt
1f20: 73 68 69 6d 5f 76 74 61 62 2a 29 70 43 75 72 2d  shim_vtab*)pCur-
1f30: 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 76  >base.pVtab;.  v
1f40: 74 73 68 69 6d 5f 61 75 78 20 2a 70 41 75 78 20  tshim_aux *pAux 
1f50: 3d 20 70 56 74 61 62 2d 3e 70 41 75 78 3b 0a 20  = pVtab->pAux;. 
1f60: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
1f70: 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20 29  Aux->bDisposed )
1f80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1f90: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 41 75  RROR;.  rc = pAu
1fa0: 78 2d 3e 70 4d 6f 64 2d 3e 78 43 6f 6c 75 6d 6e  x->pMod->xColumn
1fb0: 28 70 43 75 72 2d 3e 70 43 68 69 6c 64 2c 20 63  (pCur->pChild, c
1fc0: 74 78 2c 20 69 29 3b 0a 20 20 69 66 28 20 72 63  tx, i);.  if( rc
1fd0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1fe0: 20 20 20 56 54 53 48 49 4d 5f 43 4f 50 59 5f 45     VTSHIM_COPY_E
1ff0: 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a 20 20 72  RRMSG();.  }.  r
2000: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
2010: 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d 52 6f  tic int vtshimRo
2020: 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  wid(sqlite3_vtab
2030: 5f 63 75 72 73 6f 72 20 2a 70 58 2c 20 73 71 6c  _cursor *pX, sql
2040: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 52 6f 77  ite3_int64 *pRow
2050: 69 64 29 7b 0a 20 20 76 74 73 68 69 6d 5f 63 75  id){.  vtshim_cu
2060: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 76 74  rsor *pCur = (vt
2070: 73 68 69 6d 5f 63 75 72 73 6f 72 2a 29 70 58 3b  shim_cursor*)pX;
2080: 0a 20 20 76 74 73 68 69 6d 5f 76 74 61 62 20 2a  .  vtshim_vtab *
2090: 70 56 74 61 62 20 3d 20 28 76 74 73 68 69 6d 5f  pVtab = (vtshim_
20a0: 76 74 61 62 2a 29 70 43 75 72 2d 3e 62 61 73 65  vtab*)pCur->base
20b0: 2e 70 56 74 61 62 3b 0a 20 20 76 74 73 68 69 6d  .pVtab;.  vtshim
20c0: 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74  _aux *pAux = pVt
20d0: 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20  ab->pAux;.  int 
20e0: 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e  rc;.  if( pAux->
20f0: 62 44 69 73 70 6f 73 65 64 20 29 20 72 65 74 75  bDisposed ) retu
2100: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2110: 0a 20 20 72 63 20 3d 20 70 41 75 78 2d 3e 70 4d  .  rc = pAux->pM
2120: 6f 64 2d 3e 78 52 6f 77 69 64 28 70 43 75 72 2d  od->xRowid(pCur-
2130: 3e 70 43 68 69 6c 64 2c 20 70 52 6f 77 69 64 29  >pChild, pRowid)
2140: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2150: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 56 54 53  TE_OK ){.    VTS
2160: 48 49 4d 5f 43 4f 50 59 5f 45 52 52 4d 53 47 28  HIM_COPY_ERRMSG(
2170: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2180: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
2190: 74 20 76 74 73 68 69 6d 55 70 64 61 74 65 28 0a  t vtshimUpdate(.
21a0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
21b0: 70 42 61 73 65 2c 0a 20 20 69 6e 74 20 61 72 67  pBase,.  int arg
21c0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
21d0: 75 65 20 2a 2a 61 72 67 76 2c 0a 20 20 73 71 6c  ue **argv,.  sql
21e0: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 52 6f 77  ite3_int64 *pRow
21f0: 69 64 0a 29 7b 0a 20 20 76 74 73 68 69 6d 5f 76  id.){.  vtshim_v
2200: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 76 74  tab *pVtab = (vt
2210: 73 68 69 6d 5f 76 74 61 62 2a 29 70 42 61 73 65  shim_vtab*)pBase
2220: 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a  ;.  vtshim_aux *
2230: 70 41 75 78 20 3d 20 70 56 74 61 62 2d 3e 70 41  pAux = pVtab->pA
2240: 75 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ux;.  int rc;.  
2250: 69 66 28 20 70 41 75 78 2d 3e 62 44 69 73 70 6f  if( pAux->bDispo
2260: 73 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  sed ) return SQL
2270: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  ITE_ERROR;.  rc 
2280: 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 55  = pAux->pMod->xU
2290: 70 64 61 74 65 28 70 56 74 61 62 2d 3e 70 43 68  pdate(pVtab->pCh
22a0: 69 6c 64 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  ild, argc, argv,
22b0: 20 70 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20   pRowid);.  if( 
22c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22d0: 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f 50 59  .    VTSHIM_COPY
22e0: 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a 20  _ERRMSG();.  }. 
22f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
2300: 74 61 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d  tatic int vtshim
2310: 42 65 67 69 6e 28 73 71 6c 69 74 65 33 5f 76 74  Begin(sqlite3_vt
2320: 61 62 20 2a 70 42 61 73 65 29 7b 0a 20 20 76 74  ab *pBase){.  vt
2330: 73 68 69 6d 5f 76 74 61 62 20 2a 70 56 74 61 62  shim_vtab *pVtab
2340: 20 3d 20 28 76 74 73 68 69 6d 5f 76 74 61 62 2a   = (vtshim_vtab*
2350: 29 70 42 61 73 65 3b 0a 20 20 76 74 73 68 69 6d  )pBase;.  vtshim
2360: 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74  _aux *pAux = pVt
2370: 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20  ab->pAux;.  int 
2380: 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e  rc;.  if( pAux->
2390: 62 44 69 73 70 6f 73 65 64 20 29 20 72 65 74 75  bDisposed ) retu
23a0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
23b0: 0a 20 20 72 63 20 3d 20 70 41 75 78 2d 3e 70 4d  .  rc = pAux->pM
23c0: 6f 64 2d 3e 78 42 65 67 69 6e 28 70 56 74 61 62  od->xBegin(pVtab
23d0: 2d 3e 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28  ->pChild);.  if(
23e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23f0: 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f 50  {.    VTSHIM_COP
2400: 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a  Y_ERRMSG();.  }.
2410: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2420: 73 74 61 74 69 63 20 69 6e 74 20 76 74 73 68 69  static int vtshi
2430: 6d 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 76 74  mSync(sqlite3_vt
2440: 61 62 20 2a 70 42 61 73 65 29 7b 0a 20 20 76 74  ab *pBase){.  vt
2450: 73 68 69 6d 5f 76 74 61 62 20 2a 70 56 74 61 62  shim_vtab *pVtab
2460: 20 3d 20 28 76 74 73 68 69 6d 5f 76 74 61 62 2a   = (vtshim_vtab*
2470: 29 70 42 61 73 65 3b 0a 20 20 76 74 73 68 69 6d  )pBase;.  vtshim
2480: 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74  _aux *pAux = pVt
2490: 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20  ab->pAux;.  int 
24a0: 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e  rc;.  if( pAux->
24b0: 62 44 69 73 70 6f 73 65 64 20 29 20 72 65 74 75  bDisposed ) retu
24c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
24d0: 0a 20 20 72 63 20 3d 20 70 41 75 78 2d 3e 70 4d  .  rc = pAux->pM
24e0: 6f 64 2d 3e 78 53 79 6e 63 28 70 56 74 61 62 2d  od->xSync(pVtab-
24f0: 3e 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20  >pChild);.  if( 
2500: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2510: 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f 50 59  .    VTSHIM_COPY
2520: 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a 20  _ERRMSG();.  }. 
2530: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
2540: 74 61 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d  tatic int vtshim
2550: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 5f 76  Commit(sqlite3_v
2560: 74 61 62 20 2a 70 42 61 73 65 29 7b 0a 20 20 76  tab *pBase){.  v
2570: 74 73 68 69 6d 5f 76 74 61 62 20 2a 70 56 74 61  tshim_vtab *pVta
2580: 62 20 3d 20 28 76 74 73 68 69 6d 5f 76 74 61 62  b = (vtshim_vtab
2590: 2a 29 70 42 61 73 65 3b 0a 20 20 76 74 73 68 69  *)pBase;.  vtshi
25a0: 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70 56  m_aux *pAux = pV
25b0: 74 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74  tab->pAux;.  int
25c0: 20 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78 2d   rc;.  if( pAux-
25d0: 3e 62 44 69 73 70 6f 73 65 64 20 29 20 72 65 74  >bDisposed ) ret
25e0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25f0: 3b 0a 20 20 72 63 20 3d 20 70 41 75 78 2d 3e 70  ;.  rc = pAux->p
2600: 4d 6f 64 2d 3e 78 43 6f 6d 6d 69 74 28 70 56 74  Mod->xCommit(pVt
2610: 61 62 2d 3e 70 43 68 69 6c 64 29 3b 0a 20 20 69  ab->pChild);.  i
2620: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2630: 20 29 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43   ){.    VTSHIM_C
2640: 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20  OPY_ERRMSG();.  
2650: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2660: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 73  ..static int vts
2670: 68 69 6d 52 6f 6c 6c 62 61 63 6b 28 73 71 6c 69  himRollback(sqli
2680: 74 65 33 5f 76 74 61 62 20 2a 70 42 61 73 65 29  te3_vtab *pBase)
2690: 7b 0a 20 20 76 74 73 68 69 6d 5f 76 74 61 62 20  {.  vtshim_vtab 
26a0: 2a 70 56 74 61 62 20 3d 20 28 76 74 73 68 69 6d  *pVtab = (vtshim
26b0: 5f 76 74 61 62 2a 29 70 42 61 73 65 3b 0a 20 20  _vtab*)pBase;.  
26c0: 76 74 73 68 69 6d 5f 61 75 78 20 2a 70 41 75 78  vtshim_aux *pAux
26d0: 20 3d 20 70 56 74 61 62 2d 3e 70 41 75 78 3b 0a   = pVtab->pAux;.
26e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
26f0: 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20  pAux->bDisposed 
2700: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2710: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 41  ERROR;.  rc = pA
2720: 75 78 2d 3e 70 4d 6f 64 2d 3e 78 52 6f 6c 6c 62  ux->pMod->xRollb
2730: 61 63 6b 28 70 56 74 61 62 2d 3e 70 43 68 69 6c  ack(pVtab->pChil
2740: 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
2750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 56  LITE_OK ){.    V
2760: 54 53 48 49 4d 5f 43 4f 50 59 5f 45 52 52 4d 53  TSHIM_COPY_ERRMS
2770: 47 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  G();.  }.  retur
2780: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
2790: 69 6e 74 20 76 74 73 68 69 6d 46 69 6e 64 46 75  int vtshimFindFu
27a0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
27b0: 33 5f 76 74 61 62 20 2a 70 42 61 73 65 2c 0a 20  3_vtab *pBase,. 
27c0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 63 6f 6e   int nArg,.  con
27d0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
27e0: 20 20 76 6f 69 64 20 28 2a 2a 70 78 46 75 6e 63    void (**pxFunc
27f0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
2800: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
2810: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
2820: 2a 2a 70 70 41 72 67 0a 29 7b 0a 20 20 76 74 73  **ppArg.){.  vts
2830: 68 69 6d 5f 76 74 61 62 20 2a 70 56 74 61 62 20  him_vtab *pVtab 
2840: 3d 20 28 76 74 73 68 69 6d 5f 76 74 61 62 2a 29  = (vtshim_vtab*)
2850: 70 42 61 73 65 3b 0a 20 20 76 74 73 68 69 6d 5f  pBase;.  vtshim_
2860: 61 75 78 20 2a 70 41 75 78 20 3d 20 70 56 74 61  aux *pAux = pVta
2870: 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e 74 20 72  b->pAux;.  int r
2880: 63 3b 0a 20 20 69 66 28 20 70 41 75 78 2d 3e 62  c;.  if( pAux->b
2890: 44 69 73 70 6f 73 65 64 20 29 20 72 65 74 75 72  Disposed ) retur
28a0: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 41 75 78  n 0;.  rc = pAux
28b0: 2d 3e 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75 6e  ->pMod->xFindFun
28c0: 63 74 69 6f 6e 28 70 56 74 61 62 2d 3e 70 43 68  ction(pVtab->pCh
28d0: 69 6c 64 2c 20 6e 41 72 67 2c 20 7a 4e 61 6d 65  ild, nArg, zName
28e0: 2c 20 70 78 46 75 6e 63 2c 20 70 70 41 72 67 29  , pxFunc, ppArg)
28f0: 3b 0a 20 20 56 54 53 48 49 4d 5f 43 4f 50 59 5f  ;.  VTSHIM_COPY_
2900: 45 52 52 4d 53 47 28 29 3b 0a 20 20 72 65 74 75  ERRMSG();.  retu
2910: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
2920: 20 69 6e 74 20 76 74 73 68 69 6d 52 65 6e 61 6d   int vtshimRenam
2930: 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  e(sqlite3_vtab *
2940: 70 42 61 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  pBase, const cha
2950: 72 20 2a 7a 4e 65 77 4e 61 6d 65 29 7b 0a 20 20  r *zNewName){.  
2960: 76 74 73 68 69 6d 5f 76 74 61 62 20 2a 70 56 74  vtshim_vtab *pVt
2970: 61 62 20 3d 20 28 76 74 73 68 69 6d 5f 76 74 61  ab = (vtshim_vta
2980: 62 2a 29 70 42 61 73 65 3b 0a 20 20 76 74 73 68  b*)pBase;.  vtsh
2990: 69 6d 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 70  im_aux *pAux = p
29a0: 56 74 61 62 2d 3e 70 41 75 78 3b 0a 20 20 69 6e  Vtab->pAux;.  in
29b0: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 41 75 78  t rc;.  if( pAux
29c0: 2d 3e 62 44 69 73 70 6f 73 65 64 20 29 20 72 65  ->bDisposed ) re
29d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29e0: 52 3b 0a 20 20 72 63 20 3d 20 70 41 75 78 2d 3e  R;.  rc = pAux->
29f0: 70 4d 6f 64 2d 3e 78 52 65 6e 61 6d 65 28 70 56  pMod->xRename(pV
2a00: 74 61 62 2d 3e 70 43 68 69 6c 64 2c 20 7a 4e 65  tab->pChild, zNe
2a10: 77 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 72 63  wName);.  if( rc
2a20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a30: 20 20 20 56 54 53 48 49 4d 5f 43 4f 50 59 5f 45     VTSHIM_COPY_E
2a40: 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a 20 20 72  RRMSG();.  }.  r
2a50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
2a60: 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d 53 61  tic int vtshimSa
2a70: 76 65 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 5f  vepoint(sqlite3_
2a80: 76 74 61 62 20 2a 70 42 61 73 65 2c 20 69 6e 74  vtab *pBase, int
2a90: 20 6e 29 7b 0a 20 20 76 74 73 68 69 6d 5f 76 74   n){.  vtshim_vt
2aa0: 61 62 20 2a 70 56 74 61 62 20 3d 20 28 76 74 73  ab *pVtab = (vts
2ab0: 68 69 6d 5f 76 74 61 62 2a 29 70 42 61 73 65 3b  him_vtab*)pBase;
2ac0: 0a 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a 70  .  vtshim_aux *p
2ad0: 41 75 78 20 3d 20 70 56 74 61 62 2d 3e 70 41 75  Aux = pVtab->pAu
2ae0: 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  x;.  int rc;.  i
2af0: 66 28 20 70 41 75 78 2d 3e 62 44 69 73 70 6f 73  f( pAux->bDispos
2b00: 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
2b10: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  TE_ERROR;.  rc =
2b20: 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 53 61   pAux->pMod->xSa
2b30: 76 65 70 6f 69 6e 74 28 70 56 74 61 62 2d 3e 70  vepoint(pVtab->p
2b40: 43 68 69 6c 64 2c 20 6e 29 3b 0a 20 20 69 66 28  Child, n);.  if(
2b50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b60: 7b 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f 50  {.    VTSHIM_COP
2b70: 59 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a  Y_ERRMSG();.  }.
2b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b90: 73 74 61 74 69 63 20 69 6e 74 20 76 74 73 68 69  static int vtshi
2ba0: 6d 52 65 6c 65 61 73 65 28 73 71 6c 69 74 65 33  mRelease(sqlite3
2bb0: 5f 76 74 61 62 20 2a 70 42 61 73 65 2c 20 69 6e  _vtab *pBase, in
2bc0: 74 20 6e 29 7b 0a 20 20 76 74 73 68 69 6d 5f 76  t n){.  vtshim_v
2bd0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 76 74  tab *pVtab = (vt
2be0: 73 68 69 6d 5f 76 74 61 62 2a 29 70 42 61 73 65  shim_vtab*)pBase
2bf0: 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78 20 2a  ;.  vtshim_aux *
2c00: 70 41 75 78 20 3d 20 70 56 74 61 62 2d 3e 70 41  pAux = pVtab->pA
2c10: 75 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ux;.  int rc;.  
2c20: 69 66 28 20 70 41 75 78 2d 3e 62 44 69 73 70 6f  if( pAux->bDispo
2c30: 73 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  sed ) return SQL
2c40: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  ITE_ERROR;.  rc 
2c50: 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e 78 52  = pAux->pMod->xR
2c60: 65 6c 65 61 73 65 28 70 56 74 61 62 2d 3e 70 43  elease(pVtab->pC
2c70: 68 69 6c 64 2c 20 6e 29 3b 0a 20 20 69 66 28 20  hild, n);.  if( 
2c80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c90: 0a 20 20 20 20 56 54 53 48 49 4d 5f 43 4f 50 59  .    VTSHIM_COPY
2ca0: 5f 45 52 52 4d 53 47 28 29 3b 0a 20 20 7d 0a 20  _ERRMSG();.  }. 
2cb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
2cc0: 74 61 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d  tatic int vtshim
2cd0: 52 6f 6c 6c 62 61 63 6b 54 6f 28 73 71 6c 69 74  RollbackTo(sqlit
2ce0: 65 33 5f 76 74 61 62 20 2a 70 42 61 73 65 2c 20  e3_vtab *pBase, 
2cf0: 69 6e 74 20 6e 29 7b 0a 20 20 76 74 73 68 69 6d  int n){.  vtshim
2d00: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28  _vtab *pVtab = (
2d10: 76 74 73 68 69 6d 5f 76 74 61 62 2a 29 70 42 61  vtshim_vtab*)pBa
2d20: 73 65 3b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78  se;.  vtshim_aux
2d30: 20 2a 70 41 75 78 20 3d 20 70 56 74 61 62 2d 3e   *pAux = pVtab->
2d40: 70 41 75 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pAux;.  int rc;.
2d50: 20 20 69 66 28 20 70 41 75 78 2d 3e 62 44 69 73    if( pAux->bDis
2d60: 70 6f 73 65 64 20 29 20 72 65 74 75 72 6e 20 53  posed ) return S
2d70: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72  QLITE_ERROR;.  r
2d80: 63 20 3d 20 70 41 75 78 2d 3e 70 4d 6f 64 2d 3e  c = pAux->pMod->
2d90: 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 70 56 74 61  xRollbackTo(pVta
2da0: 62 2d 3e 70 43 68 69 6c 64 2c 20 6e 29 3b 0a 20  b->pChild, n);. 
2db0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2dc0: 4f 4b 20 29 7b 0a 20 20 20 20 56 54 53 48 49 4d  OK ){.    VTSHIM
2dd0: 5f 43 4f 50 59 5f 45 52 52 4d 53 47 28 29 3b 0a  _COPY_ERRMSG();.
2de0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2df0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 64 65 73 74 72  .}../* The destr
2e00: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66  uctor function f
2e10: 6f 72 20 61 20 64 69 73 70 6f 73 69 62 6c 65 20  or a disposible 
2e20: 6d 6f 64 75 6c 65 20 2a 2f 0a 73 74 61 74 69 63  module */.static
2e30: 20 76 6f 69 64 20 76 74 73 68 69 6d 41 75 78 44   void vtshimAuxD
2e40: 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20 2a  estructor(void *
2e50: 70 58 41 75 78 29 7b 0a 20 20 76 74 73 68 69 6d  pXAux){.  vtshim
2e60: 5f 61 75 78 20 2a 70 41 75 78 20 3d 20 28 76 74  _aux *pAux = (vt
2e70: 73 68 69 6d 5f 61 75 78 2a 29 70 58 41 75 78 3b  shim_aux*)pXAux;
2e80: 0a 20 20 61 73 73 65 72 74 28 20 70 41 75 78 2d  .  assert( pAux-
2e90: 3e 70 41 6c 6c 56 74 61 62 3d 3d 30 20 29 3b 0a  >pAllVtab==0 );.
2ea0: 20 20 69 66 28 20 21 70 41 75 78 2d 3e 62 44 69    if( !pAux->bDi
2eb0: 73 70 6f 73 65 64 20 26 26 20 70 41 75 78 2d 3e  sposed && pAux->
2ec0: 78 43 68 69 6c 64 44 65 73 74 72 6f 79 20 29 7b  xChildDestroy ){
2ed0: 0a 20 20 20 20 70 41 75 78 2d 3e 78 43 68 69 6c  .    pAux->xChil
2ee0: 64 44 65 73 74 72 6f 79 28 70 41 75 78 2d 3e 70  dDestroy(pAux->p
2ef0: 43 68 69 6c 64 41 75 78 29 3b 0a 20 20 20 20 70  ChildAux);.    p
2f00: 41 75 78 2d 3e 78 43 68 69 6c 64 44 65 73 74 72  Aux->xChildDestr
2f10: 6f 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  oy = 0;.  }.  sq
2f20: 6c 69 74 65 33 5f 66 72 65 65 28 70 41 75 78 2d  lite3_free(pAux-
2f30: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
2f40: 65 33 5f 66 72 65 65 28 70 41 75 78 2d 3e 70 4d  e3_free(pAux->pM
2f50: 6f 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  od);.  sqlite3_f
2f60: 72 65 65 28 70 41 75 78 29 3b 0a 7d 0a 0a 73 74  ree(pAux);.}..st
2f70: 61 74 69 63 20 69 6e 74 20 76 74 73 68 69 6d 43  atic int vtshimC
2f80: 6f 70 79 4d 6f 64 75 6c 65 28 0a 20 20 63 6f 6e  opyModule(.  con
2f90: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
2fa0: 65 20 2a 70 4d 6f 64 2c 20 20 20 2f 2a 20 53 6f  e *pMod,   /* So
2fb0: 75 72 63 65 20 6d 6f 64 75 6c 65 20 74 6f 20 62  urce module to b
2fc0: 65 20 63 6f 70 69 65 64 20 2a 2f 0a 20 20 73 71  e copied */.  sq
2fd0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 2a 70  lite3_module **p
2fe0: 70 4d 6f 64 20 20 20 20 20 20 20 20 2f 2a 20 44  pMod        /* D
2ff0: 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
3000: 6f 70 69 65 64 20 6d 6f 64 75 6c 65 20 2a 2f 0a  opied module */.
3010: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64  ){.  sqlite3_mod
3020: 75 6c 65 20 2a 70 3b 0a 20 20 69 66 28 20 21 70  ule *p;.  if( !p
3030: 4d 6f 64 20 7c 7c 20 21 70 70 4d 6f 64 20 29 20  Mod || !ppMod ) 
3040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
3050: 52 4f 52 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  ROR;.  p = sqlit
3060: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
3070: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
3080: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
3090: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
30a0: 63 70 79 28 70 2c 20 70 4d 6f 64 2c 20 73 69 7a  cpy(p, pMod, siz
30b0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 2a 70 70 4d  eof(*p));.  *ppM
30c0: 6f 64 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e  od = p;.  return
30d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
30e0: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64  ifdef _WIN32.__d
30f0: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
3100: 74 29 0a 23 65 6e 64 69 66 0a 76 6f 69 64 20 2a  t).#endif.void *
3110: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 64  sqlite3_create_d
3120: 69 73 70 6f 73 61 62 6c 65 5f 6d 6f 64 75 6c 65  isposable_module
3130: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3150: 2a 20 53 51 4c 69 74 65 20 63 6f 6e 6e 65 63 74  * SQLite connect
3160: 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20  ion to register 
3170: 6d 6f 64 75 6c 65 20 77 69 74 68 20 2a 2f 0a 20  module with */. 
3180: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
3190: 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  me,         /* N
31a0: 61 6d 65 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c  ame of the modul
31b0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 71 6c  e */.  const sql
31c0: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 2c 20  ite3_module *p, 
31d0: 20 20 2f 2a 20 4d 65 74 68 6f 64 73 20 66 6f 72    /* Methods for
31e0: 20 74 68 65 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20   the module */. 
31f0: 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61   void *pClientDa
3200: 74 61 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ta,         /* C
3210: 6c 69 65 6e 74 20 64 61 74 61 20 66 6f 72 20 78  lient data for x
3220: 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20  Create/xConnect 
3230: 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 44 65 73 74  */.  void(*xDest
3240: 72 6f 79 29 28 76 6f 69 64 2a 29 20 20 20 20 20  roy)(void*)     
3250: 2f 2a 20 4d 6f 64 75 6c 65 20 64 65 73 74 72 75  /* Module destru
3260: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ctor function */
3270: 0a 29 7b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78  .){.  vtshim_aux
3280: 20 2a 70 41 75 78 3b 0a 20 20 73 71 6c 69 74 65   *pAux;.  sqlite
3290: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 0a  3_module *pMod;.
32a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 41 75 78    int rc;.  pAux
32b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
32c0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 41 75 78 29  c( sizeof(*pAux)
32d0: 20 29 3b 0a 20 20 69 66 28 20 70 41 75 78 3d 3d   );.  if( pAux==
32e0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 78 44 65  0 ){.    if( xDe
32f0: 73 74 72 6f 79 20 29 20 78 44 65 73 74 72 6f 79  stroy ) xDestroy
3300: 28 70 43 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20  (pClientData);. 
3310: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3320: 0a 20 20 72 63 20 3d 20 76 74 73 68 69 6d 43 6f  .  rc = vtshimCo
3330: 70 79 4d 6f 64 75 6c 65 28 70 2c 20 26 70 4d 6f  pyModule(p, &pMo
3340: 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
3350: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
3360: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 75 78  qlite3_free(pAux
3370: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3380: 0a 20 20 7d 0a 20 20 70 41 75 78 2d 3e 70 43 68  .  }.  pAux->pCh
3390: 69 6c 64 41 75 78 20 3d 20 70 43 6c 69 65 6e 74  ildAux = pClient
33a0: 44 61 74 61 3b 0a 20 20 70 41 75 78 2d 3e 78 43  Data;.  pAux->xC
33b0: 68 69 6c 64 44 65 73 74 72 6f 79 20 3d 20 78 44  hildDestroy = xD
33c0: 65 73 74 72 6f 79 3b 0a 20 20 70 41 75 78 2d 3e  estroy;.  pAux->
33d0: 70 4d 6f 64 20 3d 20 70 4d 6f 64 3b 0a 20 20 70  pMod = pMod;.  p
33e0: 41 75 78 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  Aux->db = db;.  
33f0: 70 41 75 78 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pAux->zName = sq
3400: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
3410: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 41  s", zName);.  pA
3420: 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20 3d 20  ux->bDisposed = 
3430: 30 3b 0a 20 20 70 41 75 78 2d 3e 70 41 6c 6c 56  0;.  pAux->pAllV
3440: 74 61 62 20 3d 20 30 3b 0a 20 20 70 41 75 78 2d  tab = 0;.  pAux-
3450: 3e 73 53 65 6c 66 2e 69 56 65 72 73 69 6f 6e 20  >sSelf.iVersion 
3460: 3d 20 70 2d 3e 69 56 65 72 73 69 6f 6e 3c 3d 32  = p->iVersion<=2
3470: 20 3f 20 70 2d 3e 69 56 65 72 73 69 6f 6e 20 3a   ? p->iVersion :
3480: 20 32 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c   2;.  pAux->sSel
3490: 66 2e 78 43 72 65 61 74 65 20 3d 20 70 2d 3e 78  f.xCreate = p->x
34a0: 43 72 65 61 74 65 20 3f 20 76 74 73 68 69 6d 43  Create ? vtshimC
34b0: 72 65 61 74 65 20 3a 20 30 3b 0a 20 20 70 41 75  reate : 0;.  pAu
34c0: 78 2d 3e 73 53 65 6c 66 2e 78 43 6f 6e 6e 65 63  x->sSelf.xConnec
34d0: 74 20 3d 20 70 2d 3e 78 43 6f 6e 6e 65 63 74 20  t = p->xConnect 
34e0: 3f 20 76 74 73 68 69 6d 43 6f 6e 6e 65 63 74 20  ? vtshimConnect 
34f0: 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65  : 0;.  pAux->sSe
3500: 6c 66 2e 78 42 65 73 74 49 6e 64 65 78 20 3d 20  lf.xBestIndex = 
3510: 70 2d 3e 78 42 65 73 74 49 6e 64 65 78 20 3f 20  p->xBestIndex ? 
3520: 76 74 73 68 69 6d 42 65 73 74 49 6e 64 65 78 20  vtshimBestIndex 
3530: 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65  : 0;.  pAux->sSe
3540: 6c 66 2e 78 44 69 73 63 6f 6e 6e 65 63 74 20 3d  lf.xDisconnect =
3550: 20 70 2d 3e 78 44 69 73 63 6f 6e 6e 65 63 74 20   p->xDisconnect 
3560: 3f 20 76 74 73 68 69 6d 44 69 73 63 6f 6e 6e 65  ? vtshimDisconne
3570: 63 74 20 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e  ct : 0;.  pAux->
3580: 73 53 65 6c 66 2e 78 44 65 73 74 72 6f 79 20 3d  sSelf.xDestroy =
3590: 20 70 2d 3e 78 44 65 73 74 72 6f 79 20 3f 20 76   p->xDestroy ? v
35a0: 74 73 68 69 6d 44 65 73 74 72 6f 79 20 3a 20 30  tshimDestroy : 0
35b0: 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e  ;.  pAux->sSelf.
35c0: 78 4f 70 65 6e 20 3d 20 70 2d 3e 78 4f 70 65 6e  xOpen = p->xOpen
35d0: 20 3f 20 76 74 73 68 69 6d 4f 70 65 6e 20 3a 20   ? vtshimOpen : 
35e0: 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c 66  0;.  pAux->sSelf
35f0: 2e 78 43 6c 6f 73 65 20 3d 20 70 2d 3e 78 43 6c  .xClose = p->xCl
3600: 6f 73 65 20 3f 20 76 74 73 68 69 6d 43 6c 6f 73  ose ? vtshimClos
3610: 65 20 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73  e : 0;.  pAux->s
3620: 53 65 6c 66 2e 78 46 69 6c 74 65 72 20 3d 20 70  Self.xFilter = p
3630: 2d 3e 78 46 69 6c 74 65 72 20 3f 20 76 74 73 68  ->xFilter ? vtsh
3640: 69 6d 46 69 6c 74 65 72 20 3a 20 30 3b 0a 20 20  imFilter : 0;.  
3650: 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 4e 65 78  pAux->sSelf.xNex
3660: 74 20 3d 20 70 2d 3e 78 4e 65 78 74 20 3f 20 76  t = p->xNext ? v
3670: 74 73 68 69 6d 4e 65 78 74 20 3a 20 30 3b 0a 20  tshimNext : 0;. 
3680: 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 45 6f   pAux->sSelf.xEo
3690: 66 20 3d 20 70 2d 3e 78 45 6f 66 20 3f 20 76 74  f = p->xEof ? vt
36a0: 73 68 69 6d 45 6f 66 20 3a 20 30 3b 0a 20 20 70  shimEof : 0;.  p
36b0: 41 75 78 2d 3e 73 53 65 6c 66 2e 78 43 6f 6c 75  Aux->sSelf.xColu
36c0: 6d 6e 20 3d 20 70 2d 3e 78 43 6f 6c 75 6d 6e 20  mn = p->xColumn 
36d0: 3f 20 76 74 73 68 69 6d 43 6f 6c 75 6d 6e 20 3a  ? vtshimColumn :
36e0: 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c   0;.  pAux->sSel
36f0: 66 2e 78 52 6f 77 69 64 20 3d 20 70 2d 3e 78 52  f.xRowid = p->xR
3700: 6f 77 69 64 20 3f 20 76 74 73 68 69 6d 52 6f 77  owid ? vtshimRow
3710: 69 64 20 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e  id : 0;.  pAux->
3720: 73 53 65 6c 66 2e 78 55 70 64 61 74 65 20 3d 20  sSelf.xUpdate = 
3730: 70 2d 3e 78 55 70 64 61 74 65 20 3f 20 76 74 73  p->xUpdate ? vts
3740: 68 69 6d 55 70 64 61 74 65 20 3a 20 30 3b 0a 20  himUpdate : 0;. 
3750: 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 42 65   pAux->sSelf.xBe
3760: 67 69 6e 20 3d 20 70 2d 3e 78 42 65 67 69 6e 20  gin = p->xBegin 
3770: 3f 20 76 74 73 68 69 6d 42 65 67 69 6e 20 3a 20  ? vtshimBegin : 
3780: 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c 66  0;.  pAux->sSelf
3790: 2e 78 53 79 6e 63 20 3d 20 70 2d 3e 78 53 79 6e  .xSync = p->xSyn
37a0: 63 20 3f 20 76 74 73 68 69 6d 53 79 6e 63 20 3a  c ? vtshimSync :
37b0: 20 30 3b 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c   0;.  pAux->sSel
37c0: 66 2e 78 43 6f 6d 6d 69 74 20 3d 20 70 2d 3e 78  f.xCommit = p->x
37d0: 43 6f 6d 6d 69 74 20 3f 20 76 74 73 68 69 6d 43  Commit ? vtshimC
37e0: 6f 6d 6d 69 74 20 3a 20 30 3b 0a 20 20 70 41 75  ommit : 0;.  pAu
37f0: 78 2d 3e 73 53 65 6c 66 2e 78 52 6f 6c 6c 62 61  x->sSelf.xRollba
3800: 63 6b 20 3d 20 70 2d 3e 78 52 6f 6c 6c 62 61 63  ck = p->xRollbac
3810: 6b 20 3f 20 76 74 73 68 69 6d 52 6f 6c 6c 62 61  k ? vtshimRollba
3820: 63 6b 20 3a 20 30 3b 0a 20 20 70 41 75 78 2d 3e  ck : 0;.  pAux->
3830: 73 53 65 6c 66 2e 78 46 69 6e 64 46 75 6e 63 74  sSelf.xFindFunct
3840: 69 6f 6e 20 3d 20 70 2d 3e 78 46 69 6e 64 46 75  ion = p->xFindFu
3850: 6e 63 74 69 6f 6e 20 3f 20 76 74 73 68 69 6d 46  nction ? vtshimF
3860: 69 6e 64 46 75 6e 63 74 69 6f 6e 20 3a 20 30 3b  indFunction : 0;
3870: 0a 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78  .  pAux->sSelf.x
3880: 52 65 6e 61 6d 65 20 3d 20 70 2d 3e 78 52 65 6e  Rename = p->xRen
3890: 61 6d 65 20 3f 20 76 74 73 68 69 6d 52 65 6e 61  ame ? vtshimRena
38a0: 6d 65 20 3a 20 30 3b 0a 20 20 69 66 28 20 70 2d  me : 0;.  if( p-
38b0: 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 29 7b 0a  >iVersion>=2 ){.
38c0: 20 20 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e      pAux->sSelf.
38d0: 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  xSavepoint = p->
38e0: 78 53 61 76 65 70 6f 69 6e 74 20 3f 20 76 74 73  xSavepoint ? vts
38f0: 68 69 6d 53 61 76 65 70 6f 69 6e 74 20 3a 20 30  himSavepoint : 0
3900: 3b 0a 20 20 20 20 70 41 75 78 2d 3e 73 53 65 6c  ;.    pAux->sSel
3910: 66 2e 78 52 65 6c 65 61 73 65 20 3d 20 70 2d 3e  f.xRelease = p->
3920: 78 52 65 6c 65 61 73 65 20 3f 20 76 74 73 68 69  xRelease ? vtshi
3930: 6d 52 65 6c 65 61 73 65 20 3a 20 30 3b 0a 20 20  mRelease : 0;.  
3940: 20 20 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 52    pAux->sSelf.xR
3950: 6f 6c 6c 62 61 63 6b 54 6f 20 3d 20 70 2d 3e 78  ollbackTo = p->x
3960: 52 6f 6c 6c 62 61 63 6b 54 6f 20 3f 20 76 74 73  RollbackTo ? vts
3970: 68 69 6d 52 6f 6c 6c 62 61 63 6b 54 6f 20 3a 20  himRollbackTo : 
3980: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
3990: 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 53 61 76  pAux->sSelf.xSav
39a0: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  epoint = 0;.    
39b0: 70 41 75 78 2d 3e 73 53 65 6c 66 2e 78 52 65 6c  pAux->sSelf.xRel
39c0: 65 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 41  ease = 0;.    pA
39d0: 75 78 2d 3e 73 53 65 6c 66 2e 78 52 6f 6c 6c 62  ux->sSelf.xRollb
39e0: 61 63 6b 54 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  ackTo = 0;.  }. 
39f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
3a00: 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 64  eate_module_v2(d
3a10: 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 41 75 78 2d  b, zName, &pAux-
3a20: 3e 73 53 65 6c 66 2c 0a 20 20 20 20 20 20 20 20  >sSelf,.        
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 20 20 20 20 20 20 20 70 41 75 78 2c 20 76 74          pAux, vt
3a50: 73 68 69 6d 41 75 78 44 65 73 74 72 75 63 74 6f  shimAuxDestructo
3a60: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3d  r);.  return rc=
3a70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 28 76 6f  =SQLITE_OK ? (vo
3a80: 69 64 2a 29 70 41 75 78 20 3a 20 30 3b 0a 7d 0a  id*)pAux : 0;.}.
3a90: 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f  .#ifdef _WIN32._
3aa0: 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
3ab0: 6f 72 74 29 0a 23 65 6e 64 69 66 0a 76 6f 69 64  ort).#endif.void
3ac0: 20 73 71 6c 69 74 65 33 5f 64 69 73 70 6f 73 65   sqlite3_dispose
3ad0: 5f 6d 6f 64 75 6c 65 28 76 6f 69 64 20 2a 70 58  _module(void *pX
3ae0: 29 7b 0a 20 20 76 74 73 68 69 6d 5f 61 75 78 20  ){.  vtshim_aux 
3af0: 2a 70 41 75 78 20 3d 20 28 76 74 73 68 69 6d 5f  *pAux = (vtshim_
3b00: 61 75 78 2a 29 70 58 3b 0a 20 20 69 66 28 20 21  aux*)pX;.  if( !
3b10: 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20  pAux->bDisposed 
3b20: 29 7b 0a 20 20 20 20 76 74 73 68 69 6d 5f 76 74  ){.    vtshim_vt
3b30: 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 20 20 76  ab *pVtab;.    v
3b40: 74 73 68 69 6d 5f 63 75 72 73 6f 72 20 2a 70 43  tshim_cursor *pC
3b50: 75 72 3b 0a 20 20 20 20 66 6f 72 28 70 56 74 61  ur;.    for(pVta
3b60: 62 3d 70 41 75 78 2d 3e 70 41 6c 6c 56 74 61 62  b=pAux->pAllVtab
3b70: 3b 20 70 56 74 61 62 3b 20 70 56 74 61 62 3d 70  ; pVtab; pVtab=p
3b80: 56 74 61 62 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Vtab->pNext){.  
3b90: 20 20 20 20 66 6f 72 28 70 43 75 72 3d 70 56 74      for(pCur=pVt
3ba0: 61 62 2d 3e 70 41 6c 6c 43 75 72 3b 20 70 43 75  ab->pAllCur; pCu
3bb0: 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
3bc0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 70 41  ext){.        pA
3bd0: 75 78 2d 3e 70 4d 6f 64 2d 3e 78 43 6c 6f 73 65  ux->pMod->xClose
3be0: 28 70 43 75 72 2d 3e 70 43 68 69 6c 64 29 3b 0a  (pCur->pChild);.
3bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
3c00: 75 78 2d 3e 70 4d 6f 64 2d 3e 78 44 69 73 63 6f  ux->pMod->xDisco
3c10: 6e 6e 65 63 74 28 70 56 74 61 62 2d 3e 70 43 68  nnect(pVtab->pCh
3c20: 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
3c30: 70 41 75 78 2d 3e 62 44 69 73 70 6f 73 65 64 20  pAux->bDisposed 
3c40: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 41 75  = 1;.    if( pAu
3c50: 78 2d 3e 78 43 68 69 6c 64 44 65 73 74 72 6f 79  x->xChildDestroy
3c60: 20 29 7b 0a 20 20 20 20 20 20 70 41 75 78 2d 3e   ){.      pAux->
3c70: 78 43 68 69 6c 64 44 65 73 74 72 6f 79 28 70 41  xChildDestroy(pA
3c80: 75 78 2d 3e 70 43 68 69 6c 64 41 75 78 29 3b 0a  ux->pChildAux);.
3c90: 20 20 20 20 20 20 70 41 75 78 2d 3e 78 43 68 69        pAux->xChi
3ca0: 6c 64 44 65 73 74 72 6f 79 20 3d 20 30 3b 0a 20  ldDestroy = 0;. 
3cb0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 23 65 6e     }.  }.}...#en
3cc0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3cd0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
3ce0: 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  */..#ifdef _WIN3
3cf0: 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c  2.__declspec(dll
3d00: 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69  export).#endif.i
3d10: 6e 74 20 73 71 6c 69 74 65 33 5f 76 74 73 68 69  nt sqlite3_vtshi
3d20: 6d 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65  m_init(.  sqlite
3d30: 33 20 2a 64 62 2c 0a 20 20 63 68 61 72 20 2a 2a  3 *db,.  char **
3d40: 70 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73  pzErrMsg,.  cons
3d50: 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
3d60: 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a  utines *pApi.){.
3d70: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
3d80: 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
3d90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3da0: 4f 4b 3b 0a 7d 0a                                OK;.}.