/ Hex Artifact Content
Login

Artifact 7d0f847060b3cfe8102b97a8c419866b44d600f2c2ed36e9c13c14c6581dd962:


0000: 2f 2a 0a 2a 2a 20 32 30 30 36 20 4a 75 6e 65 20  /*.** 2006 June 
0010: 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  10.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d  d to help implem
01a0: 65 6e 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ent virtual tabl
01b0: 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  es..*/.#ifndef S
01c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
01d0: 41 4c 54 41 42 4c 45 0a 23 69 6e 63 6c 75 64 65  ALTABLE.#include
01e0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
01f0: 2f 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 61 20 76  /*.** Before a v
0200: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 43 72  irtual table xCr
0210: 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e 6e 65  eate() or xConne
0220: 63 74 28 29 20 6d 65 74 68 6f 64 20 69 73 20 69  ct() method is i
0230: 6e 76 6f 6b 65 64 2c 20 74 68 65 0a 2a 2a 20 73  nvoked, the.** s
0240: 71 6c 69 74 65 33 2e 70 56 74 61 62 43 74 78 20  qlite3.pVtabCtx 
0250: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 20  member variable 
0260: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
0270: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
0280: 66 0a 2a 2a 20 74 68 69 73 20 73 74 72 75 63 74  f.** this struct
0290: 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68   allocated on th
02a0: 65 20 73 74 61 63 6b 2e 20 49 74 20 69 73 20 75  e stack. It is u
02b0: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
02c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  mentation of .**
02d0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 64 65 63   the sqlite3_dec
02e0: 6c 61 72 65 5f 76 74 61 62 28 29 20 61 6e 64 20  lare_vtab() and 
02f0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e  sqlite3_vtab_con
0300: 66 69 67 28 29 20 41 50 49 73 2c 20 62 6f 74 68  fig() APIs, both
0310: 20 6f 66 20 77 68 69 63 68 0a 2a 2a 20 61 72 65   of which.** are
0320: 20 69 6e 76 6f 6b 65 64 20 6f 6e 6c 79 20 66 72   invoked only fr
0330: 6f 6d 20 77 69 74 68 69 6e 20 78 43 72 65 61 74  om within xCreat
0340: 65 20 61 6e 64 20 78 43 6f 6e 6e 65 63 74 20 6d  e and xConnect m
0350: 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  ethods..*/.struc
0360: 74 20 56 74 61 62 43 74 78 20 7b 0a 20 20 56 54  t VtabCtx {.  VT
0370: 61 62 6c 65 20 2a 70 56 54 61 62 6c 65 3b 20 20  able *pVTable;  
0380: 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
0390: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6f 6e   table being con
03a0: 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 54 61  structed */.  Ta
03b0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
03c0: 20 20 2f 2a 20 54 68 65 20 54 61 62 6c 65 20 6f    /* The Table o
03d0: 62 6a 65 63 74 20 74 6f 20 77 68 69 63 68 20 74  bject to which t
03e0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
03f0: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 56 74   belongs */.  Vt
0400: 61 62 43 74 78 20 2a 70 50 72 69 6f 72 3b 20 20  abCtx *pPrior;  
0410: 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74    /* Parent cont
0420: 65 78 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ext (if any) */.
0430: 20 20 69 6e 74 20 62 44 65 63 6c 61 72 65 64 3b    int bDeclared;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61 66        /* True af
0450: 74 65 72 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  ter sqlite3_decl
0460: 61 72 65 5f 76 74 61 62 28 29 20 69 73 20 63 61  are_vtab() is ca
0470: 6c 6c 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  lled */.};../*.*
0480: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6e 64 20  * Construct and 
0490: 69 6e 73 74 61 6c 6c 20 61 20 4d 6f 64 75 6c 65  install a Module
04a0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 76 69   object for a vi
04b0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 57 68  rtual table.  Wh
04c0: 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
04d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ne is called, it
04e0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
04f0: 68 61 74 20 61 6c 6c 20 61 70 70 72 6f 70 72 69  hat all appropri
0500: 61 74 65 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ate locks are he
0510: 6c 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6d 6f  ld.** and the mo
0520: 64 75 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  dule is not alre
0530: 61 64 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  ady part of the 
0540: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 4d  connection..*/.M
0550: 6f 64 75 6c 65 20 2a 73 71 6c 69 74 65 33 56 74  odule *sqlite3Vt
0560: 61 62 43 72 65 61 74 65 4d 6f 64 75 6c 65 28 0a  abCreateModule(.
0570: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0590: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e    /* Database in
05a0: 20 77 68 69 63 68 20 6d 6f 64 75 6c 65 20 69 73   which module is
05b0: 20 72 65 67 69 73 74 65 72 65 64 20 2a 2f 0a 20   registered */. 
05c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
05d0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
05e0: 20 2f 2a 20 4e 61 6d 65 20 61 73 73 69 67 6e 65   /* Name assigne
05f0: 64 20 74 6f 20 74 68 69 73 20 6d 6f 64 75 6c 65  d to this module
0600: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69   */.  const sqli
0610: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
0620: 75 6c 65 2c 20 20 2f 2a 20 54 68 65 20 64 65 66  ule,  /* The def
0630: 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  inition of the m
0640: 6f 64 75 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20  odule */.  void 
0650: 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20 20 20  *pAux,          
0660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
0670: 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f  ntext pointer fo
0680: 72 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65  r xCreate/xConne
0690: 63 74 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ct */.  void (*x
06a0: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29  Destroy)(void *)
06b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c          /* Modul
06c0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e  e destructor fun
06d0: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 4d 6f  ction */.){.  Mo
06e0: 64 75 6c 65 20 2a 70 4d 6f 64 3b 0a 20 20 69 6e  dule *pMod;.  in
06f0: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
0700: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
0710: 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  ;.  pMod = (Modu
0720: 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
0730: 6f 63 28 73 69 7a 65 6f 66 28 4d 6f 64 75 6c 65  oc(sizeof(Module
0740: 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 29 3b 0a  ) + nName + 1);.
0750: 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 29 7b    if( pMod==0 ){
0760: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
0770: 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d 65 6c 73  ault(db);.  }els
0780: 65 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  e{.    Module *p
0790: 44 65 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Del;.    char *z
07a0: 43 6f 70 79 20 3d 20 28 63 68 61 72 20 2a 29 28  Copy = (char *)(
07b0: 26 70 4d 6f 64 5b 31 5d 29 3b 0a 20 20 20 20 6d  &pMod[1]);.    m
07c0: 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 4e 61  emcpy(zCopy, zNa
07d0: 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
07e0: 20 20 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 20 3d 20    pMod->zName = 
07f0: 7a 43 6f 70 79 3b 0a 20 20 20 20 70 4d 6f 64 2d  zCopy;.    pMod-
0800: 3e 70 4d 6f 64 75 6c 65 20 3d 20 70 4d 6f 64 75  >pModule = pModu
0810: 6c 65 3b 0a 20 20 20 20 70 4d 6f 64 2d 3e 70 41  le;.    pMod->pA
0820: 75 78 20 3d 20 70 41 75 78 3b 0a 20 20 20 20 70  ux = pAux;.    p
0830: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20  Mod->xDestroy = 
0840: 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 4d  xDestroy;.    pM
0850: 6f 64 2d 3e 70 45 70 6f 54 61 62 20 3d 20 30 3b  od->pEpoTab = 0;
0860: 0a 20 20 20 20 70 44 65 6c 20 3d 20 28 4d 6f 64  .    pDel = (Mod
0870: 75 6c 65 20 2a 29 73 71 6c 69 74 65 33 48 61 73  ule *)sqlite3Has
0880: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 4d 6f  hInsert(&db->aMo
0890: 64 75 6c 65 2c 7a 43 6f 70 79 2c 28 76 6f 69 64  dule,zCopy,(void
08a0: 2a 29 70 4d 6f 64 29 3b 0a 20 20 20 20 61 73 73  *)pMod);.    ass
08b0: 65 72 74 28 20 70 44 65 6c 3d 3d 30 20 7c 7c 20  ert( pDel==0 || 
08c0: 70 44 65 6c 3d 3d 70 4d 6f 64 20 29 3b 0a 20 20  pDel==pMod );.  
08d0: 20 20 69 66 28 20 70 44 65 6c 20 29 7b 0a 20 20    if( pDel ){.  
08e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
08f0: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 73  ult(db);.      s
0900: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
0910: 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 70 4d   pDel);.      pM
0920: 6f 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  od = 0;.    }.  
0930: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 3b  }.  return pMod;
0940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 63  .}../*.** The ac
0950: 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e 20 74 68  tual function th
0960: 61 74 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  at does the work
0970: 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e   of creating a n
0980: 65 77 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 20 54 68  ew module..** Th
0990: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  is function impl
09a0: 65 6d 65 6e 74 73 20 74 68 65 20 73 71 6c 69 74  ements the sqlit
09b0: 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
09c0: 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
09d0: 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f  3_create_module_
09e0: 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 73 2e  v2() interfaces.
09f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
0a00: 72 65 61 74 65 4d 6f 64 75 6c 65 28 0a 20 20 73  reateModule(.  s
0a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0a30: 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68  * Database in wh
0a40: 69 63 68 20 6d 6f 64 75 6c 65 20 69 73 20 72 65  ich module is re
0a50: 67 69 73 74 65 72 65 64 20 2a 2f 0a 20 20 63 6f  gistered */.  co
0a60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0a80: 20 4e 61 6d 65 20 61 73 73 69 67 6e 65 64 20 74   Name assigned t
0a90: 6f 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f  o this module */
0aa0: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
0ab0: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
0ac0: 2c 20 20 2f 2a 20 54 68 65 20 64 65 66 69 6e 69  ,  /* The defini
0ad0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 64 75  tion of the modu
0ae0: 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  le */.  void *pA
0af0: 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ux,             
0b00: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
0b10: 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78  xt pointer for x
0b20: 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20  Create/xConnect 
0b30: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  */.  void (*xDes
0b40: 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 20 20 20  troy)(void *)   
0b50: 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 64       /* Module d
0b60: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
0b70: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  on */.){.  int r
0b80: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
0b90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
0ba0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
0bb0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 48  ;.  if( sqlite3H
0bc0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f  ashFind(&db->aMo
0bd0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  dule, zName) ){.
0be0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
0bf0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
0c00: 65 6c 73 65 7b 0a 20 20 20 20 28 76 6f 69 64 29  else{.    (void)
0c10: 73 71 6c 69 74 65 33 56 74 61 62 43 72 65 61 74  sqlite3VtabCreat
0c20: 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61 6d  eModule(db, zNam
0c30: 65 2c 20 70 4d 6f 64 75 6c 65 2c 20 70 41 75 78  e, pModule, pAux
0c40: 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 20 20 7d  , xDestroy);.  }
0c50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
0c60: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
0c70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
0c80: 5f 4f 4b 20 26 26 20 78 44 65 73 74 72 6f 79 20  _OK && xDestroy 
0c90: 29 20 78 44 65 73 74 72 6f 79 28 70 41 75 78 29  ) xDestroy(pAux)
0ca0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
0cb0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
0cc0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
0cd0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 72  .}.../*.** Exter
0ce0: 6e 61 6c 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  nal API function
0cf0: 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20   used to create 
0d00: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 2d 74 61  a new virtual-ta
0d10: 62 6c 65 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69  ble module..*/.i
0d20: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
0d30: 65 5f 6d 6f 64 75 6c 65 28 0a 20 20 73 71 6c 69  e_module(.  sqli
0d40: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0d60: 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68  atabase in which
0d70: 20 6d 6f 64 75 6c 65 20 69 73 20 72 65 67 69 73   module is regis
0d80: 74 65 72 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  tered */.  const
0d90: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
0da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
0db0: 6d 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  me assigned to t
0dc0: 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20  his module */.  
0dd0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
0de0: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 2c 20 20  dule *pModule,  
0df0: 2f 2a 20 54 68 65 20 64 65 66 69 6e 69 74 69 6f  /* The definitio
0e00: 6e 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 20  n of the module 
0e10: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 20  */.  void *pAux 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
0e40: 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 72 65  pointer for xCre
0e50: 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a  ate/xConnect */.
0e60: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
0e70: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
0e80: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
0e90: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
0ea0: 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
0eb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
0ec0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
0ed0: 66 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61 74  f.  return creat
0ee0: 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61 6d  eModule(db, zNam
0ef0: 65 2c 20 70 4d 6f 64 75 6c 65 2c 20 70 41 75 78  e, pModule, pAux
0f00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  , 0);.}../*.** E
0f10: 78 74 65 72 6e 61 6c 20 41 50 49 20 66 75 6e 63  xternal API func
0f20: 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 63 72 65  tion used to cre
0f30: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
0f40: 6c 2d 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 0a  l-table module..
0f50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
0f60: 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28  reate_module_v2(
0f70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
0fa0: 6e 20 77 68 69 63 68 20 6d 6f 64 75 6c 65 20 69  n which module i
0fb0: 73 20 72 65 67 69 73 74 65 72 65 64 20 2a 2f 0a  s registered */.
0fc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
0fd0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
0fe0: 20 20 2f 2a 20 4e 61 6d 65 20 61 73 73 69 67 6e    /* Name assign
0ff0: 65 64 20 74 6f 20 74 68 69 73 20 6d 6f 64 75 6c  ed to this modul
1000: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 71 6c  e */.  const sql
1010: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
1020: 64 75 6c 65 2c 20 20 2f 2a 20 54 68 65 20 64 65  dule,  /* The de
1030: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
1040: 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 76 6f 69 64  module */.  void
1050: 20 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20 20   *pAux,         
1060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1070: 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66  ontext pointer f
1080: 6f 72 20 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e  or xCreate/xConn
1090: 65 63 74 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ect */.  void (*
10a0: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
10b0: 29 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 75  )        /* Modu
10c0: 6c 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  le destructor fu
10d0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  nction */.){.#if
10e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10f0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1100: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1110: 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1120: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
1130: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1140: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  KPT;.#endif.  re
1150: 74 75 72 6e 20 63 72 65 61 74 65 4d 6f 64 75 6c  turn createModul
1160: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 4d 6f  e(db, zName, pMo
1170: 64 75 6c 65 2c 20 70 41 75 78 2c 20 78 44 65 73  dule, pAux, xDes
1180: 74 72 6f 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  troy);.}../*.** 
1190: 4c 6f 63 6b 20 74 68 65 20 76 69 72 74 75 61 6c  Lock the virtual
11a0: 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69   table so that i
11b0: 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 69 73 63  t cannot be disc
11c0: 6f 6e 6e 65 63 74 65 64 2e 0a 2a 2a 20 4c 6f 63  onnected..** Loc
11d0: 6b 73 20 6e 65 73 74 2e 20 20 45 76 65 72 79 20  ks nest.  Every 
11e0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 68 61 76 65  lock should have
11f0: 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67   a corresponding
1200: 20 75 6e 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 61   unlock..** If a
1210: 6e 20 75 6e 6c 6f 63 6b 20 69 73 20 6f 6d 69 74  n unlock is omit
1220: 74 65 64 2c 20 72 65 73 6f 75 72 63 65 73 20 6c  ted, resources l
1230: 65 61 6b 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e  eaks will occur.
1240: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 64 69    .**.** If a di
1250: 73 63 6f 6e 6e 65 63 74 20 69 73 20 61 74 74 65  sconnect is atte
1260: 6d 70 74 65 64 20 77 68 69 6c 65 20 61 20 76 69  mpted while a vi
1270: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 6c  rtual table is l
1280: 6f 63 6b 65 64 2c 0a 2a 2a 20 74 68 65 20 64 69  ocked,.** the di
1290: 73 63 6f 6e 6e 65 63 74 20 69 73 20 64 65 66 65  sconnect is defe
12a0: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c  rred until all l
12b0: 6f 63 6b 73 20 68 61 76 65 20 62 65 65 6e 20 72  ocks have been r
12c0: 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
12d0: 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28  sqlite3VtabLock(
12e0: 56 54 61 62 6c 65 20 2a 70 56 54 61 62 29 7b 0a  VTable *pVTab){.
12f0: 20 20 70 56 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b    pVTab->nRef++;
1300: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 70 54 61 62 20  .}.../*.** pTab 
1310: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1320: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
1330: 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  e representing a
1340: 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 0a   virtual-table..
1350: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1360: 74 65 72 20 74 6f 20 74 68 65 20 56 54 61 62 6c  ter to the VTabl
1370: 65 20 6f 62 6a 65 63 74 20 75 73 65 64 20 62 79  e object used by
1380: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 74   connection db t
1390: 6f 20 61 63 63 65 73 73 20 0a 2a 2a 20 74 68 69  o access .** thi
13a0: 73 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2c  s virtual-table,
13b0: 20 69 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e   if one has been
13c0: 20 63 72 65 61 74 65 64 2c 20 6f 72 20 4e 55 4c   created, or NUL
13d0: 4c 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  L otherwise..*/.
13e0: 56 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 47  VTable *sqlite3G
13f0: 65 74 56 54 61 62 6c 65 28 73 71 6c 69 74 65 33  etVTable(sqlite3
1400: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
1410: 62 29 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70 56  b){.  VTable *pV
1420: 74 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49  tab;.  assert( I
1430: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1440: 3b 0a 20 20 69 66 28 20 49 73 52 65 75 73 65 53  ;.  if( IsReuseS
1450: 63 68 65 6d 61 28 64 62 29 20 29 7b 0a 20 20 20  chema(db) ){.   
1460: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
1470: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1480: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1490: 61 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 21  a);.    if( iDb!
14a0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =1 ){.      for(
14b0: 70 56 74 61 62 3d 64 62 2d 3e 61 44 62 5b 69 44  pVtab=db->aDb[iD
14c0: 62 5d 2e 70 56 54 61 62 6c 65 3b 20 70 56 74 61  b].pVTable; pVta
14d0: 62 3b 20 70 56 74 61 62 3d 70 56 74 61 62 2d 3e  b; pVtab=pVtab->
14e0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
14f0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1500: 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
1510: 70 56 74 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  pVtab->zName)==0
1520: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1530: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
1540: 56 74 61 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Vtab;.    }.  }.
1550: 20 20 66 6f 72 28 70 56 74 61 62 3d 70 54 61 62    for(pVtab=pTab
1560: 2d 3e 70 56 54 61 62 6c 65 3b 20 70 56 74 61 62  ->pVTable; pVtab
1570: 20 26 26 20 70 56 74 61 62 2d 3e 64 62 21 3d 64   && pVtab->db!=d
1580: 62 3b 20 70 56 74 61 62 3d 70 56 74 61 62 2d 3e  b; pVtab=pVtab->
1590: 70 4e 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e  pNext);.  return
15a0: 20 70 56 74 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pVtab;.}../*.**
15b0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
15c0: 65 66 2d 63 6f 75 6e 74 20 6f 6e 20 61 20 76 69  ef-count on a vi
15d0: 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65  rtual table obje
15e0: 63 74 2e 20 57 68 65 6e 20 74 68 65 20 72 65 66  ct. When the ref
15f0: 2d 63 6f 75 6e 74 0a 2a 2a 20 72 65 61 63 68 65  -count.** reache
1600: 73 20 7a 65 72 6f 2c 20 63 61 6c 6c 20 74 68 65  s zero, call the
1610: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
1620: 65 74 68 6f 64 20 74 6f 20 64 65 6c 65 74 65 20  ethod to delete 
1630: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  the object..*/.v
1640: 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 55  oid sqlite3VtabU
1650: 6e 6c 6f 63 6b 28 56 54 61 62 6c 65 20 2a 70 56  nlock(VTable *pV
1660: 54 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  Tab){.  sqlite3 
1670: 2a 64 62 20 3d 20 70 56 54 61 62 2d 3e 64 62 3b  *db = pVTab->db;
1680: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  ..  assert( db )
1690: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 54 61  ;.  assert( pVTa
16a0: 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61  b->nRef>0 );.  a
16b0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63  ssert( db->magic
16c0: 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  ==SQLITE_MAGIC_O
16d0: 50 45 4e 20 7c 7c 20 64 62 2d 3e 6d 61 67 69 63  PEN || db->magic
16e0: 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  ==SQLITE_MAGIC_Z
16f0: 4f 4d 42 49 45 20 29 3b 0a 0a 20 20 70 56 54 61  OMBIE );..  pVTa
1700: 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  b->nRef--;.  if(
1710: 20 70 56 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 20   pVTab->nRef==0 
1720: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
1730: 74 61 62 20 2a 70 20 3d 20 70 56 54 61 62 2d 3e  tab *p = pVTab->
1740: 70 56 74 61 62 3b 0a 20 20 20 20 69 66 28 20 70  pVtab;.    if( p
1750: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4d 6f   ){.      p->pMo
1760: 64 75 6c 65 2d 3e 78 44 69 73 63 6f 6e 6e 65 63  dule->xDisconnec
1770: 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(p);.    }.    
1780: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1790: 2c 20 70 56 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a  , pVTab);.  }.}.
17a0: 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 70 20 69  ./*.** Table p i
17b0: 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  s a virtual tabl
17c0: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
17d0: 20 6d 6f 76 65 73 20 61 6c 6c 20 65 6c 65 6d 65   moves all eleme
17e0: 6e 74 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 2d  nts in the.** p-
17f0: 3e 70 56 54 61 62 6c 65 20 6c 69 73 74 20 74 6f  >pVTable list to
1800: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 70 44 69   the sqlite3.pDi
1810: 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74 73 20 6f  sconnect lists o
1820: 66 20 74 68 65 69 72 20 61 73 73 6f 63 69 61 74  f their associat
1830: 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  ed.** database c
1840: 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 62 65  onnections to be
1850: 20 64 69 73 63 6f 6e 6e 65 63 74 65 64 20 61 74   disconnected at
1860: 20 74 68 65 20 6e 65 78 74 20 6f 70 70 6f 72 74   the next opport
1870: 75 6e 69 74 79 2e 20 0a 2a 2a 20 45 78 63 65 70  unity. .** Excep
1880: 74 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 64  t, if argument d
1890: 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  b is not NULL, t
18a0: 68 65 6e 20 74 68 65 20 65 6e 74 72 79 20 61 73  hen the entry as
18b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
18c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
18d0: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 70 2d  s left in the p-
18e0: 3e 70 56 54 61 62 6c 65 20 6c 69 73 74 2e 0a 2a  >pVTable list..*
18f0: 2f 0a 73 74 61 74 69 63 20 56 54 61 62 6c 65 20  /.static VTable 
1900: 2a 76 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 41  *vtabDisconnectA
1910: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
1920: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 56 54 61  Table *p){.  VTa
1930: 62 6c 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ble *pRet = 0;. 
1940: 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 6c 65   VTable *pVTable
1950: 20 3d 20 70 2d 3e 70 56 54 61 62 6c 65 3b 0a 20   = p->pVTable;. 
1960: 20 70 2d 3e 70 56 54 61 62 6c 65 20 3d 20 30 3b   p->pVTable = 0;
1970: 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1980: 61 74 20 74 68 65 20 6d 75 74 65 78 20 28 69 66  at the mutex (if
1990: 20 61 6e 79 29 20 61 73 73 6f 63 69 61 74 65 64   any) associated
19a0: 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72   with the BtShar
19b0: 65 64 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a  ed database .  *
19c0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
19d0: 74 61 62 6c 65 20 70 20 69 73 20 68 65 6c 64 20  table p is held 
19e0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
19f0: 65 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  ee header commen
1a00: 74 73 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ts .  ** above f
1a10: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 56  unction sqlite3V
1a20: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 29 20  tabUnlockList() 
1a30: 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
1a40: 6f 6e 20 6f 66 20 77 68 79 0a 20 20 2a 2a 20 74  on of why.  ** t
1a50: 68 69 73 20 6d 61 6b 65 73 20 69 74 20 73 61 66  his makes it saf
1a60: 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
1a70: 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e 6e  sqlite3.pDisconn
1a80: 65 63 74 20 6c 69 73 74 20 6f 66 20 61 6e 79 0a  ect list of any.
1a90: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f    ** database co
1aa0: 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 6d 61  nnection that ma
1ab0: 79 20 68 61 76 65 20 61 6e 20 65 6e 74 72 79 20  y have an entry 
1ac0: 69 6e 20 74 68 65 20 70 2d 3e 70 56 54 61 62 6c  in the p->pVTabl
1ad0: 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 61  e list..  */.  a
1ae0: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
1af0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1b00: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d  exHeld(db, 0, p-
1b10: 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 0a 20 20  >pSchema) );..  
1b20: 77 68 69 6c 65 28 20 70 56 54 61 62 6c 65 20 29  while( pVTable )
1b30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
1b40: 62 32 20 3d 20 70 56 54 61 62 6c 65 2d 3e 64 62  b2 = pVTable->db
1b50: 3b 0a 20 20 20 20 56 54 61 62 6c 65 20 2a 70 4e  ;.    VTable *pN
1b60: 65 78 74 20 3d 20 70 56 54 61 62 6c 65 2d 3e 70  ext = pVTable->p
1b70: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
1b80: 28 20 64 62 32 20 29 3b 0a 20 20 20 20 69 66 28  ( db2 );.    if(
1b90: 20 64 62 32 3d 3d 64 62 20 29 7b 0a 20 20 20 20   db2==db ){.    
1ba0: 20 20 70 52 65 74 20 3d 20 70 56 54 61 62 6c 65    pRet = pVTable
1bb0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 54 61 62  ;.      p->pVTab
1bc0: 6c 65 20 3d 20 70 52 65 74 3b 0a 20 20 20 20 20  le = pRet;.     
1bd0: 20 70 52 65 74 2d 3e 70 4e 65 78 74 20 3d 20 30   pRet->pNext = 0
1be0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bf0: 20 20 20 70 56 54 61 62 6c 65 2d 3e 70 4e 65 78     pVTable->pNex
1c00: 74 20 3d 20 64 62 32 2d 3e 70 44 69 73 63 6f 6e  t = db2->pDiscon
1c10: 6e 65 63 74 3b 0a 20 20 20 20 20 20 64 62 32 2d  nect;.      db2-
1c20: 3e 70 44 69 73 63 6f 6e 6e 65 63 74 20 3d 20 70  >pDisconnect = p
1c30: 56 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  VTable;.    }.  
1c40: 20 20 70 56 54 61 62 6c 65 20 3d 20 70 4e 65 78    pVTable = pNex
1c50: 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  t;.  }..  assert
1c60: 28 20 21 64 62 20 7c 7c 20 70 52 65 74 20 29 3b  ( !db || pRet );
1c70: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
1c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 2a  }../*.** Table *
1c90: 70 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  p is a virtual t
1ca0: 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
1cb0: 69 6f 6e 20 72 65 6d 6f 76 65 73 20 74 68 65 20  ion removes the 
1cc0: 56 54 61 62 6c 65 20 6f 62 6a 65 63 74 0a 2a 2a  VTable object.**
1cd0: 20 66 6f 72 20 74 61 62 6c 65 20 2a 70 20 61 73   for table *p as
1ce0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
1cf0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1d00: 6e 20 64 62 20 66 72 6f 6d 20 74 68 65 20 6c 69  n db from the li
1d10: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 69 6e 20  nked.** list in 
1d20: 70 2d 3e 70 56 54 61 62 2e 20 49 74 20 61 6c 73  p->pVTab. It als
1d30: 6f 20 64 65 63 72 65 6d 65 6e 74 73 20 74 68 65  o decrements the
1d40: 20 56 54 61 62 6c 65 20 72 65 66 20 63 6f 75 6e   VTable ref coun
1d50: 74 2e 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  t. This is.** us
1d60: 65 64 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  ed when closing 
1d70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1d80: 69 6f 6e 20 64 62 20 74 6f 20 66 72 65 65 20 61  ion db to free a
1d90: 6c 6c 20 6f 66 20 69 74 73 20 56 54 61 62 6c 65  ll of its VTable
1da0: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 69 74 68  .** objects with
1db0: 6f 75 74 20 64 69 73 74 75 72 62 69 6e 67 20 74  out disturbing t
1dc0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 53  he rest of the S
1dd0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 77 68  chema object (wh
1de0: 69 63 68 20 6d 61 79 0a 2a 2a 20 62 65 20 62 65  ich may.** be be
1df0: 69 6e 67 20 75 73 65 64 20 62 79 20 6f 74 68 65  ing used by othe
1e00: 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1e10: 6f 6e 6e 65 63 74 69 6f 6e 73 29 2e 0a 2a 2f 0a  onnections)..*/.
1e20: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
1e30: 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74  Disconnect(sqlit
1e40: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
1e50: 29 7b 0a 20 20 56 54 61 62 6c 65 20 2a 2a 70 70  ){.  VTable **pp
1e60: 56 54 61 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  VTab;..  assert(
1e70: 20 49 73 56 69 72 74 75 61 6c 28 70 29 20 29 3b   IsVirtual(p) );
1e80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e90: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
1ea0: 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20  utexes(db) );.  
1eb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1ec0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
1ed0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 66 6f 72 28  utex) );..  for(
1ee0: 70 70 56 54 61 62 3d 26 70 2d 3e 70 56 54 61 62  ppVTab=&p->pVTab
1ef0: 6c 65 3b 20 2a 70 70 56 54 61 62 3b 20 70 70 56  le; *ppVTab; ppV
1f00: 54 61 62 3d 26 28 2a 70 70 56 54 61 62 29 2d 3e  Tab=&(*ppVTab)->
1f10: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1f20: 28 2a 70 70 56 54 61 62 29 2d 3e 64 62 3d 3d 64  (*ppVTab)->db==d
1f30: 62 20 20 29 7b 0a 20 20 20 20 20 20 56 54 61 62  b  ){.      VTab
1f40: 6c 65 20 2a 70 56 54 61 62 20 3d 20 2a 70 70 56  le *pVTab = *ppV
1f50: 54 61 62 3b 0a 20 20 20 20 20 20 2a 70 70 56 54  Tab;.      *ppVT
1f60: 61 62 20 3d 20 70 56 54 61 62 2d 3e 70 4e 65 78  ab = pVTab->pNex
1f70: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1f80: 56 74 61 62 55 6e 6c 6f 63 6b 28 70 56 54 61 62  VtabUnlock(pVTab
1f90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fa0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
1fb0: 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61  .** Disconnect a
1fc0: 6c 6c 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ll the virtual t
1fd0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
1fe0: 74 68 65 20 73 71 6c 69 74 65 33 2e 70 44 69 73  the sqlite3.pDis
1ff0: 63 6f 6e 6e 65 63 74 20 6c 69 73 74 2e 0a 2a 2a  connect list..**
2000: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2010: 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
2020: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 75  lled when the mu
2030: 74 65 78 65 73 20 61 73 73 6f 63 69 61 74 65 64  texes associated
2040: 20 77 69 74 68 20 61 6c 6c 0a 2a 2a 20 73 68 61   with all.** sha
2050: 72 65 64 20 62 2d 74 72 65 65 20 64 61 74 61 62  red b-tree datab
2060: 61 73 65 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  ases opened usin
2070: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  g connection db 
2080: 61 72 65 20 68 65 6c 64 20 62 79 20 74 68 65 20  are held by the 
2090: 0a 2a 2a 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  .** caller. This
20a0: 20 69 73 20 64 6f 6e 65 20 74 6f 20 70 72 6f 74   is done to prot
20b0: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  ect the sqlite3.
20c0: 70 44 69 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74  pDisconnect list
20d0: 2e 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  . The.** sqlite3
20e0: 2e 70 44 69 73 63 6f 6e 6e 65 63 74 20 6c 69 73  .pDisconnect lis
20f0: 74 20 69 73 20 61 63 63 65 73 73 65 64 20 6f 6e  t is accessed on
2100: 6c 79 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ly as follows:.*
2110: 2a 0a 2a 2a 20 20 20 31 29 20 42 79 20 74 68 69  *.**   1) By thi
2120: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74  s function. In t
2130: 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20 42 74  his case, all Bt
2140: 53 68 61 72 65 64 20 6d 75 74 65 78 65 73 20 61  Shared mutexes a
2150: 6e 64 20 74 68 65 20 6d 75 74 65 78 0a 2a 2a 20  nd the mutex.** 
2160: 20 20 20 20 20 61 73 73 6f 63 69 61 74 65 64 20       associated 
2170: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
2180: 65 20 68 61 6e 64 6c 65 20 69 74 73 65 6c 66 20  e handle itself 
2190: 6d 75 73 74 20 62 65 20 68 65 6c 64 2e 0a 2a 2a  must be held..**
21a0: 0a 2a 2a 20 20 20 32 29 20 42 79 20 66 75 6e 63  .**   2) By func
21b0: 74 69 6f 6e 20 76 74 61 62 44 69 73 63 6f 6e 6e  tion vtabDisconn
21c0: 65 63 74 41 6c 6c 28 29 2c 20 77 68 65 6e 20 69  ectAll(), when i
21d0: 74 20 61 64 64 73 20 61 20 56 54 61 62 6c 65 20  t adds a VTable 
21e0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 20 20 20 20  entry to.**     
21f0: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 70 44 69   the sqlite3.pDi
2200: 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74 2e 20 49  sconnect list. I
2210: 6e 20 74 68 69 73 20 63 61 73 65 20 65 69 74 68  n this case eith
2220: 65 72 20 74 68 65 20 42 74 53 68 61 72 65 64 20  er the BtShared 
2230: 6d 75 74 65 78 0a 2a 2a 20 20 20 20 20 20 61 73  mutex.**      as
2240: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2250: 65 20 64 61 74 61 62 61 73 65 20 74 68 65 20 76  e database the v
2260: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
2270: 73 74 6f 72 65 64 20 69 6e 20 69 73 20 68 65 6c  stored in is hel
2280: 64 0a 2a 2a 20 20 20 20 20 20 6f 72 2c 20 69 66  d.**      or, if
2290: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
22a0: 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  le is stored in 
22b0: 61 20 6e 6f 6e 2d 73 68 61 72 61 62 6c 65 20 64  a non-sharable d
22c0: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
22d0: 20 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61        the databa
22e0: 73 65 20 68 61 6e 64 6c 65 20 6d 75 74 65 78 20  se handle mutex 
22f0: 69 73 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 41  is held..**.** A
2300: 73 20 61 20 72 65 73 75 6c 74 2c 20 61 20 73 71  s a result, a sq
2310: 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e 6e 65 63  lite3.pDisconnec
2320: 74 20 63 61 6e 6e 6f 74 20 62 65 20 61 63 63 65  t cannot be acce
2330: 73 73 65 64 20 73 69 6d 75 6c 74 61 6e 65 6f 75  ssed simultaneou
2340: 73 6c 79 20 0a 2a 2a 20 62 79 20 6d 75 6c 74 69  sly .** by multi
2350: 70 6c 65 20 74 68 72 65 61 64 73 2e 20 49 74 20  ple threads. It 
2360: 69 73 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  is thread-safe..
2370: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2380: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 73 71  tabUnlockList(sq
2390: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 54  lite3 *db){.  VT
23a0: 61 62 6c 65 20 2a 70 20 3d 20 64 62 2d 3e 70 44  able *p = db->pD
23b0: 69 73 63 6f 6e 6e 65 63 74 3b 0a 20 20 64 62 2d  isconnect;.  db-
23c0: 3e 70 44 69 73 63 6f 6e 6e 65 63 74 20 3d 20 30  >pDisconnect = 0
23d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
23e0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
23f0: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
2400: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2410: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
2420: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 66  >mutex) );..  if
2430: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
2440: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
2450: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30  Statements(db, 0
2460: 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  );.    do {.    
2470: 20 20 56 54 61 62 6c 65 20 2a 70 4e 65 78 74 20    VTable *pNext 
2480: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
2490: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
24a0: 6f 63 6b 28 70 29 3b 0a 20 20 20 20 20 20 70 20  ock(p);.      p 
24b0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 77 68  = pNext;.    }wh
24c0: 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a 7d 0a  ile( p );.  }.}.
24d0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6e 79  ./*.** Clear any
24e0: 20 61 6e 64 20 61 6c 6c 20 76 69 72 74 75 61 6c   and all virtual
24f0: 2d 74 61 62 6c 65 20 69 6e 66 6f 72 6d 61 74 69  -table informati
2500: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  on from the Tabl
2510: 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 54 68 69  e record..** Thi
2520: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2530: 6c 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  led, for example
2540: 2c 20 6a 75 73 74 20 62 65 66 6f 72 65 20 64 65  , just before de
2550: 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
2560: 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  .** record..**.*
2570: 2a 20 53 69 6e 63 65 20 69 74 20 69 73 20 61 20  * Since it is a 
2580: 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2c 20 74  virtual-table, t
2590: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
25a0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
25b0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
25c0: 68 65 61 64 20 6f 66 20 61 20 6c 69 6e 6b 65 64  head of a linked
25d0: 20 6c 69 73 74 20 6f 66 20 56 54 61 62 6c 65 20   list of VTable 
25e0: 73 74 72 75 63 74 75 72 65 73 2e 20 45 61 63 68  structures. Each
25f0: 20 56 54 61 62 6c 65 20 0a 2a 2a 20 73 74 72 75   VTable .** stru
2600: 63 74 75 72 65 20 69 73 20 61 73 73 6f 63 69 61  cture is associa
2610: 74 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ted with a singl
2620: 65 20 73 71 6c 69 74 65 33 2a 20 75 73 65 72 20  e sqlite3* user 
2630: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 0a 2a  of the schema..*
2640: 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
2650: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 56 54 61  count of the VTa
2660: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
2670: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
2680: 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65  tabase .** conne
2690: 63 74 69 6f 6e 20 64 62 20 69 73 20 64 65 63 72  ction db is decr
26a0: 65 6d 65 6e 74 65 64 20 69 6d 6d 65 64 69 61 74  emented immediat
26b0: 65 6c 79 20 28 77 68 69 63 68 20 6d 61 79 20 6c  ely (which may l
26c0: 65 61 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73  ead to the .** s
26d0: 74 72 75 63 74 75 72 65 20 62 65 69 6e 67 20 78  tructure being x
26e0: 44 69 73 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64  Disconnected and
26f0: 20 66 72 65 65 29 2e 20 41 6e 79 20 6f 74 68 65   free). Any othe
2700: 72 20 56 54 61 62 6c 65 20 73 74 72 75 63 74 75  r VTable structu
2710: 72 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  res.** in the li
2720: 73 74 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  st are moved to 
2730: 74 68 65 20 73 71 6c 69 74 65 33 2e 70 44 69 73  the sqlite3.pDis
2740: 63 6f 6e 6e 65 63 74 20 6c 69 73 74 20 6f 66 20  connect list of 
2750: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
2760: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
2770: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
2780: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
2790: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
27a0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 21  ble *p){.  if( !
27b0: 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  db || db->pnByte
27c0: 73 46 72 65 65 64 3d 3d 30 20 29 20 76 74 61 62  sFreed==0 ) vtab
27d0: 44 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 28 30 2c  DisconnectAll(0,
27e0: 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 7a   p);.  if( p->az
27f0: 4d 6f 64 75 6c 65 41 72 67 20 29 7b 0a 20 20 20  ModuleArg ){.   
2800: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
2810: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 6f 64 75 6c  i=0; i<p->nModul
2820: 65 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eArg; i++){.    
2830: 20 20 69 66 28 20 69 21 3d 31 20 29 20 73 71 6c    if( i!=1 ) sql
2840: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2850: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 69 5d  ->azModuleArg[i]
2860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2870: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2880: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 29 3b 0a  ->azModuleArg);.
2890: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
28a0: 20 61 20 6e 65 77 20 6d 6f 64 75 6c 65 20 61 72   a new module ar
28b0: 67 75 6d 65 6e 74 20 74 6f 20 70 54 61 62 6c 65  gument to pTable
28c0: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 5d 2e  ->azModuleArg[].
28d0: 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67 20 69  .** The string i
28e0: 73 20 6e 6f 74 20 63 6f 70 69 65 64 20 2d 20 74  s not copied - t
28f0: 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74  he pointer is st
2900: 6f 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 73 74  ored.  The.** st
2910: 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 66 72 65  ring will be fre
2920: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2930: 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   when the table 
2940: 69 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a  is.** deleted..*
2950: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
2960: 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28  dModuleArgument(
2970: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
2980: 6c 65 20 2a 70 54 61 62 6c 65 2c 20 63 68 61 72  le *pTable, char
2990: 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 6e   *zArg){.  int n
29a0: 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 63  Bytes = sizeof(c
29b0: 68 61 72 20 2a 29 2a 28 32 2b 70 54 61 62 6c 65  har *)*(2+pTable
29c0: 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 29 3b 0a 20  ->nModuleArg);. 
29d0: 20 63 68 61 72 20 2a 2a 61 7a 4d 6f 64 75 6c 65   char **azModule
29e0: 41 72 67 3b 0a 20 20 61 7a 4d 6f 64 75 6c 65 41  Arg;.  azModuleA
29f0: 72 67 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  rg = sqlite3DbRe
2a00: 61 6c 6c 6f 63 28 64 62 2c 20 70 54 61 62 6c 65  alloc(db, pTable
2a10: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 2c 20 6e  ->azModuleArg, n
2a20: 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 61 7a  Bytes);.  if( az
2a30: 4d 6f 64 75 6c 65 41 72 67 3d 3d 30 20 29 7b 0a  ModuleArg==0 ){.
2a40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2a50: 65 28 64 62 2c 20 7a 41 72 67 29 3b 0a 20 20 7d  e(db, zArg);.  }
2a60: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 20  else{.    int i 
2a70: 3d 20 70 54 61 62 6c 65 2d 3e 6e 4d 6f 64 75 6c  = pTable->nModul
2a80: 65 41 72 67 2b 2b 3b 0a 20 20 20 20 61 7a 4d 6f  eArg++;.    azMo
2a90: 64 75 6c 65 41 72 67 5b 69 5d 20 3d 20 7a 41 72  duleArg[i] = zAr
2aa0: 67 3b 0a 20 20 20 20 61 7a 4d 6f 64 75 6c 65 41  g;.    azModuleA
2ab0: 72 67 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 20  rg[i+1] = 0;.   
2ac0: 20 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64 75 6c   pTable->azModul
2ad0: 65 41 72 67 20 3d 20 61 7a 4d 6f 64 75 6c 65 41  eArg = azModuleA
2ae0: 72 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rg;.  }.}../*.**
2af0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
2b00: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
2b10: 68 65 6e 20 69 74 20 66 69 72 73 74 20 73 65 65  hen it first see
2b20: 73 20 61 20 43 52 45 41 54 45 20 56 49 52 54 55  s a CREATE VIRTU
2b30: 41 4c 20 54 41 42 4c 45 0a 2a 2a 20 73 74 61 74  AL TABLE.** stat
2b40: 65 6d 65 6e 74 2e 20 20 54 68 65 20 6d 6f 64 75  ement.  The modu
2b50: 6c 65 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  le name has been
2b60: 20 70 61 72 73 65 64 2c 20 62 75 74 20 74 68 65   parsed, but the
2b70: 20 6f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 0a 2a   optional list.*
2b80: 2a 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  * of parameters 
2b90: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20  that follow the 
2ba0: 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 61 72 65 20  module name are 
2bb0: 73 74 69 6c 6c 20 70 65 6e 64 69 6e 67 2e 0a 2a  still pending..*
2bc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
2bd0: 61 62 42 65 67 69 6e 50 61 72 73 65 28 0a 20 20  abBeginParse(.  
2be0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2bf0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2c00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
2c10: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
2c20: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6e      /* Name of n
2c30: 65 77 20 74 61 62 6c 65 2c 20 6f 72 20 64 61 74  ew table, or dat
2c40: 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  abase name */.  
2c50: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
2c60: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2c70: 20 6e 65 77 20 74 61 62 6c 65 20 6f 72 20 4e 55   new table or NU
2c80: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
2c90: 4d 6f 64 75 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a  ModuleName,   /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6f 64   Name of the mod
2cb0: 75 6c 65 20 66 6f 72 20 74 68 65 20 76 69 72 74  ule for the virt
2cc0: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ual table */.  i
2cd0: 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 73 20 20  nt ifNotExists  
2ce0: 20 20 20 20 20 2f 2a 20 4e 6f 20 65 72 72 6f 72       /* No error
2cf0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
2d00: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
2d10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
2d20: 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  le;        /* Th
2d30: 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61  e new virtual ta
2d40: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
2d50: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
2d60: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2d70: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 73 71 6c 69  ction */..  sqli
2d80: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
2d90: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
2da0: 61 6d 65 32 2c 20 30 2c 20 30 2c 20 31 2c 20 69  ame2, 0, 0, 1, i
2db0: 66 4e 6f 74 45 78 69 73 74 73 29 3b 0a 20 20 70  fNotExists);.  p
2dc0: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
2dd0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
2de0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
2df0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 30  urn;.  assert( 0
2e00: 3d 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ==pTable->pIndex
2e10: 20 29 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   );..  db = pPar
2e20: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
2e30: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 4d 6f 64 75  t( pTable->nModu
2e40: 6c 65 41 72 67 3d 3d 30 20 29 3b 0a 20 20 61 64  leArg==0 );.  ad
2e50: 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28  dModuleArgument(
2e60: 64 62 2c 20 70 54 61 62 6c 65 2c 20 73 71 6c 69  db, pTable, sqli
2e70: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
2e80: 28 64 62 2c 20 70 4d 6f 64 75 6c 65 4e 61 6d 65  (db, pModuleName
2e90: 29 29 3b 0a 20 20 61 64 64 4d 6f 64 75 6c 65 41  ));.  addModuleA
2ea0: 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 54 61 62  rgument(db, pTab
2eb0: 6c 65 2c 20 30 29 3b 0a 20 20 61 64 64 4d 6f 64  le, 0);.  addMod
2ec0: 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62 2c 20  uleArgument(db, 
2ed0: 70 54 61 62 6c 65 2c 20 73 71 6c 69 74 65 33 44  pTable, sqlite3D
2ee0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 54 61 62  bStrDup(db, pTab
2ef0: 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 61  le->zName));.  a
2f00: 73 73 65 72 74 28 20 28 70 50 61 72 73 65 2d 3e  ssert( (pParse->
2f10: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3d 3d 70 4e  sNameToken.z==pN
2f20: 61 6d 65 32 2d 3e 7a 20 26 26 20 70 4e 61 6d 65  ame2->z && pName
2f30: 32 2d 3e 7a 21 3d 30 29 0a 20 20 20 20 20 20 20  2->z!=0).       
2f40: 7c 7c 20 28 70 50 61 72 73 65 2d 3e 73 4e 61 6d  || (pParse->sNam
2f50: 65 54 6f 6b 65 6e 2e 7a 3d 3d 70 4e 61 6d 65 31  eToken.z==pName1
2f60: 2d 3e 7a 20 26 26 20 70 4e 61 6d 65 32 2d 3e 7a  ->z && pName2->z
2f70: 3d 3d 30 29 0a 20 20 29 3b 0a 20 20 70 50 61 72  ==0).  );.  pPar
2f80: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 6e  se->sNameToken.n
2f90: 20 3d 20 28 69 6e 74 29 28 0a 20 20 20 20 20 20   = (int)(.      
2fa0: 26 70 4d 6f 64 75 6c 65 4e 61 6d 65 2d 3e 7a 5b  &pModuleName->z[
2fb0: 70 4d 6f 64 75 6c 65 4e 61 6d 65 2d 3e 6e 5d 20  pModuleName->n] 
2fc0: 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
2fd0: 6f 6b 65 6e 2e 7a 0a 20 20 29 3b 0a 0a 23 69 66  oken.z.  );..#if
2fe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ff0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
3000: 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 76   /* Creating a v
3010: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 76  irtual table inv
3020: 6f 6b 65 73 20 74 68 65 20 61 75 74 68 6f 72 69  okes the authori
3030: 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20  zation callback 
3040: 74 77 69 63 65 2e 0a 20 20 2a 2a 20 54 68 65 20  twice..  ** The 
3050: 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e  first invocation
3060: 2c 20 74 6f 20 6f 62 74 61 69 6e 20 70 65 72 6d  , to obtain perm
3070: 69 73 73 69 6f 6e 20 74 6f 20 49 4e 53 45 52 54  ission to INSERT
3080: 20 61 20 72 6f 77 20 69 6e 74 6f 20 74 68 65 0a   a row into the.
3090: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
30a0: 65 72 20 74 61 62 6c 65 2c 20 68 61 73 20 61 6c  er table, has al
30b0: 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
30c0: 62 79 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  by sqlite3StartT
30d0: 61 62 6c 65 28 29 2e 0a 20 20 2a 2a 20 54 68 65  able()..  ** The
30e0: 20 73 65 63 6f 6e 64 20 63 61 6c 6c 2c 20 74 6f   second call, to
30f0: 20 6f 62 74 61 69 6e 20 70 65 72 6d 69 73 73 69   obtain permissi
3100: 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  on to create the
3110: 20 74 61 62 6c 65 2c 20 69 73 20 6d 61 64 65 20   table, is made 
3120: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
3130: 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64 75 6c 65  pTable->azModule
3140: 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Arg ){.    int i
3150: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
3160: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
3170: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  able->pSchema);.
3180: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e      assert( iDb>
3190: 3d 30 20 29 3b 20 2f 2a 20 54 68 65 20 64 61 74  =0 ); /* The dat
31a0: 61 62 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  abase the table 
31b0: 69 73 20 62 65 69 6e 67 20 63 72 65 61 74 65 64  is being created
31c0: 20 69 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74   in */.    sqlit
31d0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
31e0: 73 65 2c 20 53 51 4c 49 54 45 5f 43 52 45 41 54  se, SQLITE_CREAT
31f0: 45 5f 56 54 41 42 4c 45 2c 20 70 54 61 62 6c 65  E_VTABLE, pTable
3200: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
3210: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 7a        pTable->az
3220: 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 2c 20 70 50  ModuleArg[0], pP
3230: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
3240: 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b].zDbSName);.  
3250: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
3260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74  * This routine t
3270: 61 6b 65 73 20 74 68 65 20 6d 6f 64 75 6c 65 20  akes the module 
3280: 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 68 61  argument that ha
3290: 73 20 62 65 65 6e 20 61 63 63 75 6d 75 6c 61 74  s been accumulat
32a0: 69 6e 67 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  ing.** in pParse
32b0: 2d 3e 7a 41 72 67 5b 5d 20 61 6e 64 20 61 70 70  ->zArg[] and app
32c0: 65 6e 64 73 20 69 74 20 74 6f 20 74 68 65 20 6c  ends it to the l
32d0: 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
32e0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   on the.** virtu
32f0: 61 6c 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  al table current
3300: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
3310: 63 74 69 6f 6e 20 69 6e 20 70 50 61 72 73 65 2d  ction in pParse-
3320: 3e 70 54 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  >pTable..*/.stat
3330: 69 63 20 76 6f 69 64 20 61 64 64 41 72 67 75 6d  ic void addArgum
3340: 65 6e 74 54 6f 56 74 61 62 28 50 61 72 73 65 20  entToVtab(Parse 
3350: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
3360: 70 50 61 72 73 65 2d 3e 73 41 72 67 2e 7a 20 26  pParse->sArg.z &
3370: 26 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  & pParse->pNewTa
3380: 62 6c 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ble ){.    const
3390: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
33a0: 74 20 63 68 61 72 2a 29 70 50 61 72 73 65 2d 3e  t char*)pParse->
33b0: 73 41 72 67 2e 7a 3b 0a 20 20 20 20 69 6e 74 20  sArg.z;.    int 
33c0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 73 41 72 67  n = pParse->sArg
33d0: 2e 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  .n;.    sqlite3 
33e0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
33f0: 3b 0a 20 20 20 20 61 64 64 4d 6f 64 75 6c 65 41  ;.    addModuleA
3400: 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 50 61 72  rgument(db, pPar
3410: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2c 20 73  se->pNewTable, s
3420: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
3430: 64 62 2c 20 7a 2c 20 6e 29 29 3b 0a 20 20 7d 0a  db, z, n));.  }.
3440: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  }../*.** The par
3450: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
3460: 6f 75 74 69 6e 65 20 61 66 74 65 72 20 74 68 65  outine after the
3470: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
3480: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 0a  TABLE statement.
3490: 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70  ** has been comp
34a0: 6c 65 74 65 6c 79 20 70 61 72 73 65 64 2e 0a 2a  letely parsed..*
34b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
34c0: 61 62 46 69 6e 69 73 68 50 61 72 73 65 28 50 61  abFinishParse(Pa
34d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
34e0: 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54 61 62  en *pEnd){.  Tab
34f0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
3500: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 20 20 2f  e->pNewTable;  /
3510: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
3520: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f  g constructed */
3530: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3540: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
3550: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
3560: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
3570: 2a 2f 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  */..  if( pTab==
3580: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64  0 ) return;.  ad
3590: 64 41 72 67 75 6d 65 6e 74 54 6f 56 74 61 62 28  dArgumentToVtab(
35a0: 70 50 61 72 73 65 29 3b 0a 20 20 70 50 61 72 73  pParse);.  pPars
35b0: 65 2d 3e 73 41 72 67 2e 7a 20 3d 20 30 3b 0a 20  e->sArg.z = 0;. 
35c0: 20 69 66 28 20 70 54 61 62 2d 3e 6e 4d 6f 64 75   if( pTab->nModu
35d0: 6c 65 41 72 67 3c 31 20 29 20 72 65 74 75 72 6e  leArg<1 ) return
35e0: 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  ;.  .  /* If the
35f0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
3600: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
3610: 69 73 20 62 65 69 6e 67 20 65 6e 74 65 72 65 64  is being entered
3620: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 66 69   for the.  ** fi
3630: 72 73 74 20 74 69 6d 65 20 28 69 6e 20 6f 74 68  rst time (in oth
3640: 65 72 20 77 6f 72 64 73 20 69 66 20 74 68 65 20  er words if the 
3650: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
3660: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 0a   actually being.
3670: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 6e 6f 77    ** created now
3680: 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74   instead of just
3690: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 75 74 20   being read out 
36a0: 6f 66 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  of sqlite_master
36b0: 29 20 74 68 65 6e 0a 20 20 2a 2a 20 64 6f 20 61  ) then.  ** do a
36c0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 69 74 69 61  dditional initia
36d0: 6c 69 7a 61 74 69 6f 6e 20 77 6f 72 6b 20 61 6e  lization work an
36e0: 64 20 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  d store the stat
36f0: 65 6d 65 6e 74 20 74 65 78 74 0a 20 20 2a 2a 20  ement text.  ** 
3700: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
3710: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  ster table..  */
3720: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
3730: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 63 68 61  .busy ){.    cha
3740: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 63 68  r *zStmt;.    ch
3750: 61 72 20 2a 7a 57 68 65 72 65 3b 0a 20 20 20 20  ar *zWhere;.    
3760: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69 6e 74  int iDb;.    int
3770: 20 69 52 65 67 3b 0a 20 20 20 20 56 64 62 65 20   iReg;.    Vdbe 
3780: 2a 76 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  *v;..    /* Comp
3790: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
37a0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
37b0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
37c0: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
37d0: 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
37e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73 4e 61       pParse->sNa
37f0: 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 28 69 6e 74  meToken.n = (int
3800: 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72  )(pEnd->z - pPar
3810: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
3820: 29 20 2b 20 70 45 6e 64 2d 3e 6e 3b 0a 20 20 20  ) + pEnd->n;.   
3830: 20 7d 0a 20 20 20 20 7a 53 74 6d 74 20 3d 20 73   }.    zStmt = s
3840: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
3850: 2c 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  , "CREATE VIRTUA
3860: 4c 20 54 41 42 4c 45 20 25 54 22 2c 20 26 70 50  L TABLE %T", &pP
3870: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
3880: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f  );..    /* A slo
3890: 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
38a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
38b0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
38c0: 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
38d0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
38e0: 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
38f0: 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
3900: 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
3910: 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
3920: 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
3930: 64 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  d.  .    **.    
3940: 2a 2a 20 54 68 65 20 56 4d 20 72 65 67 69 73 74  ** The VM regist
3950: 65 72 20 6e 75 6d 62 65 72 20 70 50 61 72 73 65  er number pParse
3960: 2d 3e 72 65 67 52 6f 77 69 64 20 68 6f 6c 64 73  ->regRowid holds
3970: 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 6e   the rowid of an
3980: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e  .    ** entry in
3990: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
39a0: 65 72 20 74 61 62 6c 65 20 74 68 74 20 77 61 73  er table tht was
39b0: 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69   created for thi
39c0: 73 20 76 74 61 62 0a 20 20 20 20 2a 2a 20 62 79  s vtab.    ** by
39d0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
39e0: 6c 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  le()..    */.   
39f0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
3a00: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
3a10: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
3a20: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
3a30: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
3a40: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
3a50: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
3a60: 45 54 20 74 79 70 65 3d 27 74 61 62 6c 65 27 2c  ET type='table',
3a70: 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
3a80: 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
3a90: 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  0, sql=%Q ".    
3aa0: 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
3ab0: 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
3ac0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
3ad0: 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a  e, MASTER_NAME,.
3ae0: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
3af0: 65 2c 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  e,.      pTab->z
3b00: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Name,.      zStm
3b10: 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t,.      pParse-
3b20: 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b  >regRowid.    );
3b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3b40: 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20  ee(db, zStmt);. 
3b50: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
3b60: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
3b70: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
3b80: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
3b90: 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  Db);..    sqlite
3ba0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
3bb0: 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20 7a  P_Expire);.    z
3bc0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 4d  Where = sqlite3M
3bd0: 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
3be0: 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
3bf0: 74 61 62 6c 65 27 22 2c 20 70 54 61 62 2d 3e 7a  table'", pTab->z
3c00: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
3c10: 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
3c20: 68 65 6d 61 4f 70 28 70 50 61 72 73 65 2c 20 69  hemaOp(pParse, i
3c30: 44 62 2c 20 7a 57 68 65 72 65 29 3b 0a 0a 20 20  Db, zWhere);..  
3c40: 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72 73    iReg = ++pPars
3c50: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
3c60: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
3c70: 6e 67 28 76 2c 20 69 52 65 67 2c 20 70 54 61 62  ng(v, iReg, pTab
3c80: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
3c90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3ca0: 76 2c 20 4f 50 5f 56 43 72 65 61 74 65 2c 20 69  v, OP_VCreate, i
3cb0: 44 62 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 0a  Db, iReg);.  }..
3cc0: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 72    /* If we are r
3cd0: 65 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c  ereading the sql
3ce0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
3cf0: 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 2d 6d   create the in-m
3d00: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 63 6f 72  emory.  ** recor
3d10: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  d of the table. 
3d20: 54 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 20 6d  The xConnect() m
3d30: 65 74 68 6f 64 20 69 73 20 6e 6f 74 20 63 61 6c  ethod is not cal
3d40: 6c 65 64 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 74  led until.  ** t
3d50: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
3d60: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
3d70: 69 73 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  is used in an SQ
3d80: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  L statement. Thi
3d90: 73 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 61 20  s.  ** allows a 
3da0: 73 63 68 65 6d 61 20 74 68 61 74 20 63 6f 6e 74  schema that cont
3db0: 61 69 6e 73 20 76 69 72 74 75 61 6c 20 74 61 62  ains virtual tab
3dc0: 6c 65 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64  les to be loaded
3dd0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 74 68 65   before.  ** the
3de0: 20 72 65 71 75 69 72 65 64 20 76 69 72 74 75 61   required virtua
3df0: 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  l table implemen
3e00: 74 61 74 69 6f 6e 73 20 61 72 65 20 72 65 67 69  tations are regi
3e10: 73 74 65 72 65 64 2e 20 20 2a 2f 0a 20 20 65 6c  stered.  */.  el
3e20: 73 65 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  se {.    Table *
3e30: 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61  pOld;.    Schema
3e40: 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62   *pSchema = pTab
3e50: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 63  ->pSchema;.    c
3e60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3e70: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
3e80: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3e90: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
3ea0: 6c 64 28 64 62 2c 20 30 2c 20 70 53 63 68 65 6d  ld(db, 0, pSchem
3eb0: 61 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  a) );.    pOld =
3ec0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
3ed0: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
3ee0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  Hash, zName, pTa
3ef0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  b);.    if( pOld
3f00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3f10: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
3f20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
3f30: 62 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  b==pOld );  /* M
3f40: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
3f50: 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
3f60: 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
3f70: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3f80: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
3f90: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d  ewTable = 0;.  }
3fa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
3fb0: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
3fc0: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20  routine when it 
3fd0: 73 65 65 73 20 74 68 65 20 66 69 72 73 74 20 74  sees the first t
3fe0: 6f 6b 65 6e 0a 2a 2a 20 6f 66 20 61 6e 20 61 72  oken.** of an ar
3ff0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6d 6f  gument to the mo
4000: 64 75 6c 65 20 6e 61 6d 65 20 69 6e 20 61 20 43  dule name in a C
4010: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
4020: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
4030: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
4040: 61 62 41 72 67 49 6e 69 74 28 50 61 72 73 65 20  abArgInit(Parse 
4050: 2a 70 50 61 72 73 65 29 7b 0a 20 20 61 64 64 41  *pParse){.  addA
4060: 72 67 75 6d 65 6e 74 54 6f 56 74 61 62 28 70 50  rgumentToVtab(pP
4070: 61 72 73 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  arse);.  pParse-
4080: 3e 73 41 72 67 2e 7a 20 3d 20 30 3b 0a 20 20 70  >sArg.z = 0;.  p
4090: 50 61 72 73 65 2d 3e 73 41 72 67 2e 6e 20 3d 20  Parse->sArg.n = 
40a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
40b0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
40c0: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61  s routine for ea
40d0: 63 68 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ch token after t
40e0: 68 65 20 66 69 72 73 74 20 74 6f 6b 65 6e 0a 2a  he first token.*
40f0: 2a 20 69 6e 20 61 6e 20 61 72 67 75 6d 65 6e 74  * in an argument
4100: 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20 6e   to the module n
4110: 61 6d 65 20 69 6e 20 61 20 43 52 45 41 54 45 20  ame in a CREATE 
4120: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74  VIRTUAL TABLE st
4130: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
4140: 20 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 45   sqlite3VtabArgE
4150: 78 74 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xtend(Parse *pPa
4160: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 29 7b 0a  rse, Token *p){.
4170: 20 20 54 6f 6b 65 6e 20 2a 70 41 72 67 20 3d 20    Token *pArg = 
4180: 26 70 50 61 72 73 65 2d 3e 73 41 72 67 3b 0a 20  &pParse->sArg;. 
4190: 20 69 66 28 20 70 41 72 67 2d 3e 7a 3d 3d 30 20   if( pArg->z==0 
41a0: 29 7b 0a 20 20 20 20 70 41 72 67 2d 3e 7a 20 3d  ){.    pArg->z =
41b0: 20 70 2d 3e 7a 3b 0a 20 20 20 20 70 41 72 67 2d   p->z;.    pArg-
41c0: 3e 6e 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 65 6c  >n = p->n;.  }el
41d0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70  se{.    assert(p
41e0: 41 72 67 2d 3e 7a 20 3c 3d 20 70 2d 3e 7a 29 3b  Arg->z <= p->z);
41f0: 0a 20 20 20 20 70 41 72 67 2d 3e 6e 20 3d 20 28  .    pArg->n = (
4200: 69 6e 74 29 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 5d  int)(&p->z[p->n]
4210: 20 2d 20 70 41 72 67 2d 3e 7a 29 3b 0a 20 20 7d   - pArg->z);.  }
4220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
4230: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
4240: 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 28 65 69   constructor (ei
4250: 74 68 65 72 20 78 43 72 65 61 74 65 20 6f 72 20  ther xCreate or 
4260: 78 43 6f 6e 6e 65 63 74 29 2e 20 54 68 65 0a 2a  xConnect). The.*
4270: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
4280: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76   function to inv
4290: 6f 6b 65 20 69 73 20 70 61 73 73 65 64 20 61 73  oke is passed as
42a0: 20 74 68 65 20 66 6f 75 72 74 68 20 70 61 72 61   the fourth para
42b0: 6d 65 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73  meter.** to this
42c0: 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73   procedure..*/.s
42d0: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 43 61  tatic int vtabCa
42e0: 6c 6c 43 6f 6e 73 74 72 75 63 74 6f 72 28 0a 20  llConstructor(. 
42f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
4300: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 0a 20 20   Table *pTab,.  
4310: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 2c 0a 20 20  Module *pMod,.  
4320: 69 6e 74 20 28 2a 78 43 6f 6e 73 74 72 75 63 74  int (*xConstruct
4330: 29 28 73 71 6c 69 74 65 33 2a 2c 76 6f 69 64 2a  )(sqlite3*,void*
4340: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
4350: 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 76  const*,sqlite3_v
4360: 74 61 62 2a 2a 2c 63 68 61 72 2a 2a 29 2c 0a 20  tab**,char**),. 
4370: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
4380: 0a 20 20 56 74 61 62 43 74 78 20 73 43 74 78 3b  .  VtabCtx sCtx;
4390: 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62  .  VTable *pVTab
43a0: 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  le;.  int rc;.  
43b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
43c0: 74 2a 61 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74  t*azArg = (const
43d0: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 29 70 54   char *const*)pT
43e0: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 3b  ab->azModuleArg;
43f0: 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 70 54  .  int nArg = pT
4400: 61 62 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 3b 0a  ab->nModuleArg;.
4410: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
4420: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 6f 64 75 6c  ;.  char *zModul
4430: 65 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62  eName;.  int iDb
4440: 3b 0a 20 20 56 74 61 62 43 74 78 20 2a 70 43 74  ;.  VtabCtx *pCt
4450: 78 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  x;.  int nByte; 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
4480: 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
4490: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  te */..  /* Chec
44a0: 6b 20 74 68 61 74 20 74 68 65 20 76 69 72 74 75  k that the virtu
44b0: 61 6c 2d 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  al-table is not 
44c0: 61 6c 72 65 61 64 79 20 62 65 69 6e 67 20 69 6e  already being in
44d0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 66  itialized */.  f
44e0: 6f 72 28 70 43 74 78 3d 64 62 2d 3e 70 56 74 61  or(pCtx=db->pVta
44f0: 62 43 74 78 3b 20 70 43 74 78 3b 20 70 43 74 78  bCtx; pCtx; pCtx
4500: 3d 70 43 74 78 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pCtx->pPrior){.
4510: 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 70 54      if( pCtx->pT
4520: 61 62 3d 3d 70 54 61 62 20 29 7b 0a 20 20 20 20  ab==pTab ){.    
4530: 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
4540: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
4550: 20 20 20 20 20 20 20 20 20 22 76 74 61 62 6c 65           "vtable
4560: 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 63 61 6c   constructor cal
4570: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 3a  led recursively:
4580: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
4590: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
45a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
45b0: 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  OCKED;.    }.  }
45c0: 0a 0a 20 20 7a 4d 6f 64 75 6c 65 4e 61 6d 65 20  ..  zModuleName 
45d0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
45e0: 70 28 64 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  p(db, pTab->zNam
45f0: 65 29 3b 0a 20 20 69 66 28 20 21 7a 4d 6f 64 75  e);.  if( !zModu
4600: 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 72 65  leName ){.    re
4610: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
4620: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 6e  M_BKPT;.  }..  n
4630: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 56 54  Byte = sizeof(VT
4640: 61 62 6c 65 29 20 2b 20 73 71 6c 69 74 65 33 53  able) + sqlite3S
4650: 74 72 6c 65 6e 33 30 28 70 54 61 62 2d 3e 7a 4e  trlen30(pTab->zN
4660: 61 6d 65 29 20 2b 20 31 3b 0a 20 20 70 56 54 61  ame) + 1;.  pVTa
4670: 62 6c 65 20 3d 20 28 56 54 61 62 6c 65 2a 29 73  ble = (VTable*)s
4680: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
4690: 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21  (nByte);.  if( !
46a0: 70 56 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73  pVTable ){.    s
46b0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
46c0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  b);.    sqlite3D
46d0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 6f 64 75 6c  bFree(db, zModul
46e0: 65 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  eName);.    retu
46f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
4700: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 56 54 61  BKPT;.  }.  pVTa
4710: 62 6c 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  ble->db = db;.  
4720: 70 56 54 61 62 6c 65 2d 3e 70 4d 6f 64 20 3d 20  pVTable->pMod = 
4730: 70 4d 6f 64 3b 0a 20 20 70 56 54 61 62 6c 65 2d  pMod;.  pVTable-
4740: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
4750: 26 70 56 54 61 62 6c 65 5b 31 5d 3b 0a 20 20 6d  &pVTable[1];.  m
4760: 65 6d 63 70 79 28 70 56 54 61 62 6c 65 2d 3e 7a  emcpy(pVTable->z
4770: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
4780: 65 2c 20 6e 42 79 74 65 2d 73 69 7a 65 6f 66 28  e, nByte-sizeof(
4790: 56 54 61 62 6c 65 29 29 3b 0a 0a 20 20 69 44 62  VTable));..  iDb
47a0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
47b0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
47c0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 70 54  ->pSchema);.  pT
47d0: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b  ab->azModuleArg[
47e0: 31 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  1] = db->aDb[iDb
47f0: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 0a 20 20 2f  ].zDbSName;..  /
4800: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72  * Invoke the vir
4810: 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 73 74  tual table const
4820: 72 75 63 74 6f 72 20 2a 2f 0a 20 20 61 73 73 65  ructor */.  asse
4830: 72 74 28 20 26 64 62 2d 3e 70 56 74 61 62 43 74  rt( &db->pVtabCt
4840: 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 78  x );.  assert( x
4850: 43 6f 6e 73 74 72 75 63 74 20 29 3b 0a 20 20 73  Construct );.  s
4860: 43 74 78 2e 70 54 61 62 20 3d 20 70 54 61 62 3b  Ctx.pTab = pTab;
4870: 0a 20 20 73 43 74 78 2e 70 56 54 61 62 6c 65 20  .  sCtx.pVTable 
4880: 3d 20 70 56 54 61 62 6c 65 3b 0a 20 20 73 43 74  = pVTable;.  sCt
4890: 78 2e 70 50 72 69 6f 72 20 3d 20 64 62 2d 3e 70  x.pPrior = db->p
48a0: 56 74 61 62 43 74 78 3b 0a 20 20 73 43 74 78 2e  VtabCtx;.  sCtx.
48b0: 62 44 65 63 6c 61 72 65 64 20 3d 20 30 3b 0a 20  bDeclared = 0;. 
48c0: 20 64 62 2d 3e 70 56 74 61 62 43 74 78 20 3d 20   db->pVtabCtx = 
48d0: 26 73 43 74 78 3b 0a 20 20 72 63 20 3d 20 78 43  &sCtx;.  rc = xC
48e0: 6f 6e 73 74 72 75 63 74 28 64 62 2c 20 70 4d 6f  onstruct(db, pMo
48f0: 64 2d 3e 70 41 75 78 2c 20 6e 41 72 67 2c 20 61  d->pAux, nArg, a
4900: 7a 41 72 67 2c 20 26 70 56 54 61 62 6c 65 2d 3e  zArg, &pVTable->
4910: 70 56 74 61 62 2c 20 26 7a 45 72 72 29 3b 0a 20  pVtab, &zErr);. 
4920: 20 64 62 2d 3e 70 56 74 61 62 43 74 78 20 3d 20   db->pVtabCtx = 
4930: 73 43 74 78 2e 70 50 72 69 6f 72 3b 0a 20 20 69  sCtx.pPrior;.  i
4940: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
4950: 4d 45 4d 20 29 20 73 71 6c 69 74 65 33 4f 6f 6d  MEM ) sqlite3Oom
4960: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 61 73 73  Fault(db);.  ass
4970: 65 72 74 28 20 73 43 74 78 2e 70 54 61 62 3d 3d  ert( sCtx.pTab==
4980: 70 54 61 62 20 29 3b 0a 0a 20 20 69 66 28 20 53  pTab );..  if( S
4990: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
49a0: 20 20 20 20 69 66 28 20 7a 45 72 72 3d 3d 30 20      if( zErr==0 
49b0: 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20  ){.      *pzErr 
49c0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
49d0: 28 64 62 2c 20 22 76 74 61 62 6c 65 20 63 6f 6e  (db, "vtable con
49e0: 73 74 72 75 63 74 6f 72 20 66 61 69 6c 65 64 3a  structor failed:
49f0: 20 25 73 22 2c 20 7a 4d 6f 64 75 6c 65 4e 61 6d   %s", zModuleNam
4a00: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a  e);.    }else {.
4a10: 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73        *pzErr = s
4a20: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
4a30: 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
4a40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4a50: 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  e(zErr);.    }. 
4a60: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4a70: 28 64 62 2c 20 70 56 54 61 62 6c 65 29 3b 0a 20  (db, pVTable);. 
4a80: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
4a90: 53 28 70 56 54 61 62 6c 65 2d 3e 70 56 74 61 62  S(pVTable->pVtab
4aa0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4a 75 73 74  ) ){.    /* Just
4ab0: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57  ification of ALW
4ac0: 41 59 53 28 29 3a 20 20 41 20 63 6f 72 72 65 63  AYS():  A correc
4ad0: 74 20 76 74 61 62 20 63 6f 6e 73 74 72 75 63 74  t vtab construct
4ae0: 6f 72 20 6d 75 73 74 20 61 6c 6c 6f 63 61 74 65  or must allocate
4af0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  .    ** the sqli
4b00: 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20  te3_vtab object 
4b10: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 20 20  if successful.  
4b20: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 56  */.    memset(pV
4b30: 54 61 62 6c 65 2d 3e 70 56 74 61 62 2c 20 30 2c  Table->pVtab, 0,
4b40: 20 73 69 7a 65 6f 66 28 70 56 54 61 62 6c 65 2d   sizeof(pVTable-
4b50: 3e 70 56 74 61 62 5b 30 5d 29 29 3b 0a 20 20 20  >pVtab[0]));.   
4b60: 20 70 56 54 61 62 6c 65 2d 3e 70 56 74 61 62 2d   pVTable->pVtab-
4b70: 3e 70 4d 6f 64 75 6c 65 20 3d 20 70 4d 6f 64 2d  >pModule = pMod-
4b80: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 56  >pModule;.    pV
4b90: 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Table->nRef = 1;
4ba0: 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 62 44  .    if( sCtx.bD
4bb0: 65 63 6c 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  eclared==0 ){.  
4bc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4bd0: 7a 46 6f 72 6d 61 74 20 3d 20 22 76 74 61 62 6c  zFormat = "vtabl
4be0: 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 64 69  e constructor di
4bf0: 64 20 6e 6f 74 20 64 65 63 6c 61 72 65 20 73 63  d not declare sc
4c00: 68 65 6d 61 3a 20 25 73 22 3b 0a 20 20 20 20 20  hema: %s";.     
4c10: 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
4c20: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f  3MPrintf(db, zFo
4c30: 72 6d 61 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  rmat, pTab->zNam
4c40: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
4c50: 33 56 74 61 62 55 6e 6c 6f 63 6b 28 70 56 54 61  3VtabUnlock(pVTa
4c60: 62 6c 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ble);.      rc =
4c70: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4c80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4c90: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
4ca0: 75 38 20 6f 6f 6f 48 69 64 64 65 6e 20 3d 20 30  u8 oooHidden = 0
4cb0: 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 76  ;.      /* If ev
4cc0: 65 72 79 74 68 69 6e 67 20 77 65 6e 74 20 61 63  erything went ac
4cd0: 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2c  cording to plan,
4ce0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 56 54   link the new VT
4cf0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 0a 20  able structure. 
4d00: 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
4d10: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
4d20: 64 65 64 20 62 79 20 70 54 61 62 2d 3e 70 56 54  ded by pTab->pVT
4d30: 61 62 6c 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  able. Or, if thi
4d40: 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  s is a.      ** 
4d50: 72 65 75 73 61 62 6c 65 20 73 63 68 65 6d 61 2c  reusable schema,
4d60: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
4d70: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
4d80: 44 62 2e 70 56 54 61 62 6c 65 2e 0a 20 20 20 20  Db.pVTable..    
4d90: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
4da0: 65 6e 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20  en loop through 
4db0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
4dc0: 68 65 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20  he table to see 
4dd0: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a 20  if any of them. 
4de0: 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20       ** contain 
4df0: 74 68 65 20 74 6f 6b 65 6e 20 22 68 69 64 64 65  the token "hidde
4e00: 6e 22 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  n". If so, set t
4e10: 68 65 20 43 6f 6c 75 6d 6e 20 43 4f 4c 46 4c 41  he Column COLFLA
4e20: 47 5f 48 49 44 44 45 4e 20 66 6c 61 67 0a 20 20  G_HIDDEN flag.  
4e30: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 6d 6f 76      ** and remov
4e40: 65 20 74 68 65 20 74 6f 6b 65 6e 20 66 72 6f 6d  e the token from
4e50: 20 74 68 65 20 74 79 70 65 20 73 74 72 69 6e 67   the type string
4e60: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
4e70: 49 73 52 65 75 73 65 53 63 68 65 6d 61 28 64 62  IsReuseSchema(db
4e80: 29 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20  ) && iDb!=1 ){. 
4e90: 20 20 20 20 20 20 20 70 56 54 61 62 6c 65 2d 3e         pVTable->
4ea0: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 61 44 62 5b  pNext = db->aDb[
4eb0: 69 44 62 5d 2e 70 56 54 61 62 6c 65 3b 0a 20 20  iDb].pVTable;.  
4ec0: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
4ed0: 62 5d 2e 70 56 54 61 62 6c 65 20 3d 20 70 56 54  b].pVTable = pVT
4ee0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  able;.      }els
4ef0: 65 7b 0a 20 20 20 20 20 20 20 20 70 56 54 61 62  e{.        pVTab
4f00: 6c 65 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  le->pNext = pTab
4f10: 2d 3e 70 56 54 61 62 6c 65 3b 0a 20 20 20 20 20  ->pVTable;.     
4f20: 20 20 20 70 54 61 62 2d 3e 70 56 54 61 62 6c 65     pTab->pVTable
4f30: 20 3d 20 70 56 54 61 62 6c 65 3b 0a 20 20 20 20   = pVTable;.    
4f40: 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
4f50: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
4f60: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
4f70: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
4f80: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f  Type = sqlite3Co
4f90: 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e  lumnType(&pTab->
4fa0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 20 22 22 29 3b  aCol[iCol], "");
4fb0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 79  .        int nTy
4fc0: 70 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pe;.        int 
4fd0: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  i = 0;.        n
4fe0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Type = sqlite3St
4ff0: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
5000: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
5010: 69 3c 6e 54 79 70 65 3b 20 69 2b 2b 29 7b 0a 20  i<nType; i++){. 
5020: 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d           if( 0==
5030: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
5040: 22 68 69 64 64 65 6e 22 2c 20 26 7a 54 79 70 65  "hidden", &zType
5050: 5b 69 5d 2c 20 36 29 0a 20 20 20 20 20 20 20 20  [i], 6).        
5060: 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 7a     && (i==0 || z
5070: 54 79 70 65 5b 69 2d 31 5d 3d 3d 27 20 27 29 0a  Type[i-1]==' ').
5080: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 7a             && (z
5090: 54 79 70 65 5b 69 2b 36 5d 3d 3d 27 5c 30 27 20  Type[i+6]=='\0' 
50a0: 7c 7c 20 7a 54 79 70 65 5b 69 2b 36 5d 3d 3d 27  || zType[i+6]=='
50b0: 20 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b   ').          ){
50c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
50d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
50e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
50f0: 20 20 69 66 28 20 69 3c 6e 54 79 70 65 20 29 7b    if( i<nType ){
5100: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a  .          int j
5110: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
5120: 6e 44 65 6c 20 3d 20 36 20 2b 20 28 7a 54 79 70  nDel = 6 + (zTyp
5130: 65 5b 69 2b 36 5d 20 3f 20 31 20 3a 20 30 29 3b  e[i+6] ? 1 : 0);
5140: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
5150: 3d 69 3b 20 28 6a 2b 6e 44 65 6c 29 3c 3d 6e 54  =i; (j+nDel)<=nT
5160: 79 70 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ype; j++){.     
5170: 20 20 20 20 20 20 20 7a 54 79 70 65 5b 6a 5d 20         zType[j] 
5180: 3d 20 7a 54 79 70 65 5b 6a 2b 6e 44 65 6c 5d 3b  = zType[j+nDel];
5190: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
51a0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 79 70 65         if( zType
51b0: 5b 69 5d 3d 3d 27 5c 30 27 20 26 26 20 69 3e 30  [i]=='\0' && i>0
51c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
51d0: 61 73 73 65 72 74 28 7a 54 79 70 65 5b 69 2d 31  assert(zType[i-1
51e0: 5d 3d 3d 27 20 27 29 3b 0a 20 20 20 20 20 20 20  ]==' ');.       
51f0: 20 20 20 20 20 7a 54 79 70 65 5b 69 2d 31 5d 20       zType[i-1] 
5200: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
5210: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
5220: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
5230: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
5240: 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 20  AG_HIDDEN;.     
5250: 20 20 20 20 20 6f 6f 6f 48 69 64 64 65 6e 20 3d       oooHidden =
5260: 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20   TF_OOOHidden;. 
5270: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5280: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61          pTab->ta
5290: 62 46 6c 61 67 73 20 7c 3d 20 6f 6f 6f 48 69 64  bFlags |= oooHid
52a0: 64 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  den;.        }. 
52b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
52c0: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
52d0: 65 28 64 62 2c 20 7a 4d 6f 64 75 6c 65 4e 61 6d  e(db, zModuleNam
52e0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
52f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
5300: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
5310: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
5320: 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78 43 6f   to call the xCo
5330: 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 0a 2a  nnect() method.*
5340: 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  * of the virtual
5350: 20 74 61 62 6c 65 20 70 54 61 62 2e 20 49 66 20   table pTab. If 
5360: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
5370: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
5380: 73 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 61  s returned .** a
5390: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74  nd an error left
53a0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a   in pParse..**.*
53b0: 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
53c0: 20 6e 6f 2d 6f 70 20 69 66 20 74 61 62 6c 65 20   no-op if table 
53d0: 70 54 61 62 20 69 73 20 6e 6f 74 20 61 20 76 69  pTab is not a vi
53e0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
53f0: 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 43  int sqlite3VtabC
5400: 61 6c 6c 43 6f 6e 6e 65 63 74 28 50 61 72 73 65  allConnect(Parse
5410: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
5420: 2a 70 54 61 62 29 7b 0a 20 20 73 71 6c 69 74 65  *pTab){.  sqlite
5430: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5440: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
5450: 20 2a 7a 4d 6f 64 3b 0a 20 20 4d 6f 64 75 6c 65   *zMod;.  Module
5460: 20 2a 70 4d 6f 64 3b 0a 20 20 69 6e 74 20 72 63   *pMod;.  int rc
5470: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
5480: 62 20 29 3b 0a 20 20 69 66 28 20 21 49 73 56 69  b );.  if( !IsVi
5490: 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 73  rtual(pTab) || s
54a0: 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
54b0: 64 62 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  db, pTab) ){.   
54c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
54d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  K;.  }..  /* Loc
54e0: 61 74 65 20 74 68 65 20 72 65 71 75 69 72 65 64  ate the required
54f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
5500: 6f 64 75 6c 65 20 2a 2f 0a 20 20 7a 4d 6f 64 20  odule */.  zMod 
5510: 3d 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  = pTab->azModule
5520: 41 72 67 5b 30 5d 3b 0a 20 20 70 4d 6f 64 20 3d  Arg[0];.  pMod =
5530: 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65   (Module*)sqlite
5540: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
5550: 4d 6f 64 75 6c 65 2c 20 7a 4d 6f 64 29 3b 0a 0a  Module, zMod);..
5560: 20 20 69 66 28 20 21 70 4d 6f 64 20 29 7b 0a 20    if( !pMod ){. 
5570: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5580: 4d 6f 64 75 6c 65 20 3d 20 70 54 61 62 2d 3e 61  Module = pTab->a
5590: 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 3b 0a 20  zModuleArg[0];. 
55a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
55b0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
55c0: 75 63 68 20 6d 6f 64 75 6c 65 3a 20 25 73 22 2c  uch module: %s",
55d0: 20 7a 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 72   zModule);.    r
55e0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
55f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
5600: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
5610: 20 20 20 72 63 20 3d 20 76 74 61 62 43 61 6c 6c     rc = vtabCall
5620: 43 6f 6e 73 74 72 75 63 74 6f 72 28 64 62 2c 20  Constructor(db, 
5630: 70 54 61 62 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64  pTab, pMod, pMod
5640: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6e 6e  ->pModule->xConn
5650: 65 63 74 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20  ect, &zErr);.   
5660: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5670: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
5680: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5690: 73 65 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b  se, "%s", zErr);
56a0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
56b0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
56c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
56d0: 64 62 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a  db, zErr);.  }..
56e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
56f0: 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 64 62  *.** Grow the db
5700: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
5710: 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  y so that there 
5720: 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c  is room for at l
5730: 65 61 73 74 20 6f 6e 65 0a 2a 2a 20 6d 6f 72 65  east one.** more
5740: 20 76 2d 74 61 62 6c 65 2e 20 52 65 74 75 72 6e   v-table. Return
5750: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
5760: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c   a malloc fails,
5770: 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 74   or SQLITE_OK ot
5780: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
5790: 69 63 20 69 6e 74 20 67 72 6f 77 56 54 72 61 6e  ic int growVTran
57a0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
57b0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 41 52 52 41    const int ARRA
57c0: 59 5f 49 4e 43 52 20 3d 20 35 3b 0a 0a 20 20 2f  Y_INCR = 5;..  /
57d0: 2a 20 47 72 6f 77 20 74 68 65 20 73 71 6c 69 74  * Grow the sqlit
57e0: 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72 61 79  e3.aVTrans array
57f0: 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
5800: 20 20 69 66 28 20 28 64 62 2d 3e 6e 56 54 72 61    if( (db->nVTra
5810: 6e 73 25 41 52 52 41 59 5f 49 4e 43 52 29 3d 3d  ns%ARRAY_INCR)==
5820: 30 20 29 7b 0a 20 20 20 20 56 54 61 62 6c 65 20  0 ){.    VTable 
5830: 2a 2a 61 56 54 72 61 6e 73 3b 0a 20 20 20 20 69  **aVTrans;.    i
5840: 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65  nt nBytes = size
5850: 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  of(sqlite3_vtab 
5860: 2a 29 20 2a 20 28 64 62 2d 3e 6e 56 54 72 61 6e  *) * (db->nVTran
5870: 73 20 2b 20 41 52 52 41 59 5f 49 4e 43 52 29 3b  s + ARRAY_INCR);
5880: 0a 20 20 20 20 61 56 54 72 61 6e 73 20 3d 20 73  .    aVTrans = s
5890: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
58a0: 64 62 2c 20 28 76 6f 69 64 20 2a 29 64 62 2d 3e  db, (void *)db->
58b0: 61 56 54 72 61 6e 73 2c 20 6e 42 79 74 65 73 29  aVTrans, nBytes)
58c0: 3b 0a 20 20 20 20 69 66 28 20 21 61 56 54 72 61  ;.    if( !aVTra
58d0: 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ns ){.      retu
58e0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
58f0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
5900: 6d 65 6d 73 65 74 28 26 61 56 54 72 61 6e 73 5b  memset(&aVTrans[
5910: 64 62 2d 3e 6e 56 54 72 61 6e 73 5d 2c 20 30 2c  db->nVTrans], 0,
5920: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
5930: 76 74 61 62 20 2a 29 2a 41 52 52 41 59 5f 49 4e  vtab *)*ARRAY_IN
5940: 43 52 29 3b 0a 20 20 20 20 64 62 2d 3e 61 56 54  CR);.    db->aVT
5950: 72 61 6e 73 20 3d 20 61 56 54 72 61 6e 73 3b 0a  rans = aVTrans;.
5960: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
5970: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5980: 2a 20 41 64 64 20 74 68 65 20 76 69 72 74 75 61  * Add the virtua
5990: 6c 20 74 61 62 6c 65 20 70 56 54 61 62 20 74 6f  l table pVTab to
59a0: 20 74 68 65 20 61 72 72 61 79 20 73 71 6c 69 74   the array sqlit
59b0: 65 33 2e 61 56 54 72 61 6e 73 5b 5d 2e 20 53 70  e3.aVTrans[]. Sp
59c0: 61 63 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 68 61  ace should.** ha
59d0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
59e0: 72 65 73 65 72 76 65 64 20 75 73 69 6e 67 20 67  reserved using g
59f0: 72 6f 77 56 54 72 61 6e 73 28 29 2e 0a 2a 2f 0a  rowVTrans()..*/.
5a00: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 54  static void addT
5a10: 6f 56 54 72 61 6e 73 28 73 71 6c 69 74 65 33 20  oVTrans(sqlite3 
5a20: 2a 64 62 2c 20 56 54 61 62 6c 65 20 2a 70 56 54  *db, VTable *pVT
5a30: 61 62 29 7b 0a 20 20 2f 2a 20 41 64 64 20 70 56  ab){.  /* Add pV
5a40: 74 61 62 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tab to the end o
5a50: 66 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e  f sqlite3.aVTran
5a60: 73 20 2a 2f 0a 20 20 64 62 2d 3e 61 56 54 72 61  s */.  db->aVTra
5a70: 6e 73 5b 64 62 2d 3e 6e 56 54 72 61 6e 73 2b 2b  ns[db->nVTrans++
5a80: 5d 20 3d 20 70 56 54 61 62 3b 0a 20 20 73 71 6c  ] = pVTab;.  sql
5a90: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 70 56 54  ite3VtabLock(pVT
5aa0: 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ab);.}../*.** Th
5ab0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
5ac0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 76 64  nvoked by the vd
5ad0: 62 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78  be to call the x
5ae0: 43 72 65 61 74 65 20 6d 65 74 68 6f 64 0a 2a 2a  Create method.**
5af0: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
5b00: 74 61 62 6c 65 20 6e 61 6d 65 64 20 7a 54 61 62  table named zTab
5b10: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
5b20: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
5b30: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 7a  rror occurs, *pz
5b40: 45 72 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Err is set to po
5b50: 69 6e 74 20 74 6f 20 61 6e 20 45 6e 67 6c 69 73  int to an Englis
5b60: 68 20 6c 61 6e 67 75 61 67 65 0a 2a 2a 20 64 65  h language.** de
5b70: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
5b80: 20 65 72 72 6f 72 20 61 6e 64 20 61 6e 20 53 51   error and an SQ
5b90: 4c 49 54 45 5f 58 58 58 20 65 72 72 6f 72 20 63  LITE_XXX error c
5ba0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
5bb0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65  .** In this case
5bc0: 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
5bd0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 44 62 46   call sqlite3DbF
5be0: 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 2a 70 7a  ree(db, ) on *pz
5bf0: 45 72 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Err..*/.int sqli
5c00: 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65 61 74  te3VtabCallCreat
5c10: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
5c20: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
5c30: 61 72 20 2a 7a 54 61 62 2c 20 63 68 61 72 20 2a  ar *zTab, char *
5c40: 2a 70 7a 45 72 72 29 7b 0a 20 20 69 6e 74 20 72  *pzErr){.  int r
5c50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5c60: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5c70: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 0a 20 20  Module *pMod;.  
5c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64  const char *zMod
5c90: 3b 0a 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  ;..  pTab = sqli
5ca0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
5cb0: 20 7a 54 61 62 2c 20 64 62 2d 3e 61 44 62 5b 69   zTab, db->aDb[i
5cc0: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20  Db].zDbSName);. 
5cd0: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
5ce0: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
5cf0: 20 26 26 20 21 70 54 61 62 2d 3e 70 56 54 61 62   && !pTab->pVTab
5d00: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  le );..  /* Loca
5d10: 74 65 20 74 68 65 20 72 65 71 75 69 72 65 64 20  te the required 
5d20: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
5d30: 64 75 6c 65 20 2a 2f 0a 20 20 7a 4d 6f 64 20 3d  dule */.  zMod =
5d40: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
5d50: 72 67 5b 30 5d 3b 0a 20 20 70 4d 6f 64 20 3d 20  rg[0];.  pMod = 
5d60: 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33  (Module*)sqlite3
5d70: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d  HashFind(&db->aM
5d80: 6f 64 75 6c 65 2c 20 7a 4d 6f 64 29 3b 0a 0a 20  odule, zMod);.. 
5d90: 20 2f 2a 20 49 66 20 74 68 65 20 6d 6f 64 75 6c   /* If the modul
5da0: 65 20 68 61 73 20 62 65 65 6e 20 72 65 67 69 73  e has been regis
5db0: 74 65 72 65 64 20 61 6e 64 20 69 6e 63 6c 75 64  tered and includ
5dc0: 65 73 20 61 20 43 72 65 61 74 65 20 6d 65 74 68  es a Create meth
5dd0: 6f 64 2c 20 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  od, .  ** invoke
5de0: 20 69 74 20 6e 6f 77 2e 20 49 66 20 74 68 65 20   it now. If the 
5df0: 6d 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74 20 62  module has not b
5e00: 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 2c 20  een registered, 
5e10: 72 65 74 75 72 6e 20 61 6e 20 0a 20 20 2a 2a 20  return an .  ** 
5e20: 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
5e30: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
5e40: 2a 2f 0a 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30  */.  if( pMod==0
5e50: 20 7c 7c 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c   || pMod->pModul
5e60: 65 2d 3e 78 43 72 65 61 74 65 3d 3d 30 20 7c 7c  e->xCreate==0 ||
5e70: 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e   pMod->pModule->
5e80: 78 44 65 73 74 72 6f 79 3d 3d 30 20 29 7b 0a 20  xDestroy==0 ){. 
5e90: 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
5ea0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
5eb0: 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20  no such module: 
5ec0: 25 73 22 2c 20 7a 4d 6f 64 29 3b 0a 20 20 20 20  %s", zMod);.    
5ed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5ee0: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
5ef0: 72 63 20 3d 20 76 74 61 62 43 61 6c 6c 43 6f 6e  rc = vtabCallCon
5f00: 73 74 72 75 63 74 6f 72 28 64 62 2c 20 70 54 61  structor(db, pTa
5f10: 62 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64 2d 3e 70  b, pMod, pMod->p
5f20: 4d 6f 64 75 6c 65 2d 3e 78 43 72 65 61 74 65 2c  Module->xCreate,
5f30: 20 70 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a 20 20   pzErr);.  }..  
5f40: 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e  /* Justification
5f50: 20 6f 66 20 41 4c 57 41 59 53 28 29 3a 20 20 54   of ALWAYS():  T
5f60: 68 65 20 78 43 6f 6e 73 74 72 75 63 74 6f 72 20  he xConstructor 
5f70: 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75 69 72  method is requir
5f80: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
5f90: 65 20 61 20 76 61 6c 69 64 20 73 71 6c 69 74 65  e a valid sqlite
5fa0: 33 5f 76 74 61 62 20 69 66 20 69 74 20 72 65 74  3_vtab if it ret
5fb0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
5fc0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
5fd0: 49 54 45 5f 4f 4b 20 26 26 20 41 4c 57 41 59 53  ITE_OK && ALWAYS
5fe0: 28 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  (sqlite3GetVTabl
5ff0: 65 28 64 62 2c 20 70 54 61 62 29 29 20 29 7b 0a  e(db, pTab)) ){.
6000: 20 20 20 20 72 63 20 3d 20 67 72 6f 77 56 54 72      rc = growVTr
6010: 61 6e 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ans(db);.    if(
6020: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6030: 7b 0a 20 20 20 20 20 20 61 64 64 54 6f 56 54 72  {.      addToVTr
6040: 61 6e 73 28 64 62 2c 20 73 71 6c 69 74 65 33 47  ans(db, sqlite3G
6050: 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
6060: 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  b));.    }.  }..
6070: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6080: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
6090: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
60a0: 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  et the schema of
60b0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
60c0: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a  .  It is only.**
60d0: 20 76 61 6c 69 64 20 74 6f 20 63 61 6c 6c 20 74   valid to call t
60e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  his function fro
60f0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78 43 72  m within the xCr
6100: 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e 6e 65  eate() or xConne
6110: 63 74 28 29 20 6f 66 20 61 0a 2a 2a 20 76 69 72  ct() of a.** vir
6120: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
6130: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6140: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 73  3_declare_vtab(s
6150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
6160: 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 54  t char *zCreateT
6170: 61 62 6c 65 29 7b 0a 20 20 56 74 61 62 43 74 78  able){.  VtabCtx
6180: 20 2a 70 43 74 78 3b 0a 20 20 69 6e 74 20 72 63   *pCtx;.  int rc
6190: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
61a0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63  Table *pTab;.  c
61b0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
61c0: 20 50 61 72 73 65 20 73 50 61 72 73 65 3b 0a 0a   Parse sParse;..
61d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
61e0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
61f0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
6200: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
6210: 7c 20 7a 43 72 65 61 74 65 54 61 62 6c 65 3d 3d  | zCreateTable==
6220: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6230: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6240: 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
6250: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6260: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
6270: 0a 20 20 70 43 74 78 20 3d 20 64 62 2d 3e 70 56  .  pCtx = db->pV
6280: 74 61 62 43 74 78 3b 0a 20 20 69 66 28 20 21 70  tabCtx;.  if( !p
6290: 43 74 78 20 7c 7c 20 70 43 74 78 2d 3e 62 44 65  Ctx || pCtx->bDe
62a0: 63 6c 61 72 65 64 20 29 7b 0a 20 20 20 20 73 71  clared ){.    sq
62b0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
62c0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 3b 0a 20  QLITE_MISUSE);. 
62d0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
62e0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
62f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
6300: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
6310: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
6320: 43 74 78 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Ctx->pTab;.  ass
6330: 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
6340: 54 61 62 29 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  Tab) );..  memse
6350: 74 28 26 73 50 61 72 73 65 2c 20 30 2c 20 73 69  t(&sParse, 0, si
6360: 7a 65 6f 66 28 73 50 61 72 73 65 29 29 3b 0a 20  zeof(sParse));. 
6370: 20 73 50 61 72 73 65 2e 65 50 61 72 73 65 4d 6f   sParse.eParseMo
6380: 64 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45 5f  de = PARSE_MODE_
6390: 44 45 43 4c 41 52 45 5f 56 54 41 42 3b 0a 20 20  DECLARE_VTAB;.  
63a0: 73 50 61 72 73 65 2e 64 62 20 3d 20 64 62 3b 0a  sParse.db = db;.
63b0: 20 20 73 50 61 72 73 65 2e 6e 51 75 65 72 79 4c    sParse.nQueryL
63c0: 6f 6f 70 20 3d 20 31 3b 0a 20 20 69 66 28 20 53  oop = 1;.  if( S
63d0: 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65  QLITE_OK==sqlite
63e0: 33 52 75 6e 50 61 72 73 65 72 28 26 73 50 61 72  3RunParser(&sPar
63f0: 73 65 2c 20 7a 43 72 65 61 74 65 54 61 62 6c 65  se, zCreateTable
6400: 2c 20 26 7a 45 72 72 29 20 0a 20 20 20 26 26 20  , &zErr) .   && 
6410: 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65  sParse.pNewTable
6420: 0a 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  .   && !db->mall
6430: 6f 63 46 61 69 6c 65 64 0a 20 20 20 26 26 20 21  ocFailed.   && !
6440: 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65  sParse.pNewTable
6450: 2d 3e 70 53 65 6c 65 63 74 0a 20 20 20 26 26 20  ->pSelect.   && 
6460: 21 49 73 56 69 72 74 75 61 6c 28 73 50 61 72 73  !IsVirtual(sPars
6470: 65 2e 70 4e 65 77 54 61 62 6c 65 29 0a 20 20 29  e.pNewTable).  )
6480: 7b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 2d  {.    if( !pTab-
6490: 3e 61 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 54  >aCol ){.      T
64a0: 61 62 6c 65 20 2a 70 4e 65 77 20 3d 20 73 50 61  able *pNew = sPa
64b0: 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  rse.pNewTable;. 
64c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
64d0: 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  ;.      pTab->aC
64e0: 6f 6c 20 3d 20 70 4e 65 77 2d 3e 61 43 6f 6c 3b  ol = pNew->aCol;
64f0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f  .      pTab->nCo
6500: 6c 20 3d 20 70 4e 65 77 2d 3e 6e 43 6f 6c 3b 0a  l = pNew->nCol;.
6510: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
6520: 6c 61 67 73 20 7c 3d 20 70 4e 65 77 2d 3e 74 61  lags |= pNew->ta
6530: 62 46 6c 61 67 73 20 26 20 28 54 46 5f 57 69 74  bFlags & (TF_Wit
6540: 68 6f 75 74 52 6f 77 69 64 7c 54 46 5f 4e 6f 56  houtRowid|TF_NoV
6550: 69 73 69 62 6c 65 52 6f 77 69 64 29 3b 0a 20 20  isibleRowid);.  
6560: 20 20 20 20 70 4e 65 77 2d 3e 6e 43 6f 6c 20 3d      pNew->nCol =
6570: 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
6580: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
6590: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 49  assert( pTab->pI
65a0: 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ndex==0 );.     
65b0: 20 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69   assert( HasRowi
65c0: 64 28 70 4e 65 77 29 20 7c 7c 20 73 71 6c 69 74  d(pNew) || sqlit
65d0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
65e0: 78 28 70 4e 65 77 29 21 3d 30 20 29 3b 0a 20 20  x(pNew)!=0 );.  
65f0: 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
6600: 64 28 70 4e 65 77 29 0a 20 20 20 20 20 20 20 26  d(pNew).       &
6610: 26 20 70 43 74 78 2d 3e 70 56 54 61 62 6c 65 2d  & pCtx->pVTable-
6620: 3e 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  >pMod->pModule->
6630: 78 55 70 64 61 74 65 21 3d 30 0a 20 20 20 20 20  xUpdate!=0.     
6640: 20 20 26 26 20 73 71 6c 69 74 65 33 50 72 69 6d    && sqlite3Prim
6650: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 4e 65 77  aryKeyIndex(pNew
6660: 29 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 31 0a 20 20  )->nKeyCol!=1.  
6670: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
6680: 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  * WITHOUT ROWID 
6690: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d  virtual tables m
66a0: 75 73 74 20 65 69 74 68 65 72 20 62 65 20 72 65  ust either be re
66b0: 61 64 2d 6f 6e 6c 79 20 28 78 55 70 64 61 74 65  ad-only (xUpdate
66c0: 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ==0).        ** 
66d0: 6f 72 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  or else must hav
66e0: 65 20 61 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d  e a single-colum
66f0: 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  n PRIMARY KEY */
6700: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
6710: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
6720: 20 20 7d 0a 20 20 20 20 20 20 70 49 64 78 20 3d    }.      pIdx =
6730: 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 3b 0a 20   pNew->pIndex;. 
6740: 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b       if( pIdx ){
6750: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6760: 20 70 49 64 78 2d 3e 70 4e 65 78 74 3d 3d 30 20   pIdx->pNext==0 
6770: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  );.        pTab-
6780: 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  >pIndex = pIdx;.
6790: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
67a0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
67b0: 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
67c0: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 20   pTab;.      }. 
67d0: 20 20 20 7d 0a 20 20 20 20 70 43 74 78 2d 3e 62     }.    pCtx->b
67e0: 44 65 63 6c 61 72 65 64 20 3d 20 31 3b 0a 20 20  Declared = 1;.  
67f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
6800: 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
6810: 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  b, SQLITE_ERROR,
6820: 20 28 7a 45 72 72 20 3f 20 22 25 73 22 20 3a 20   (zErr ? "%s" : 
6830: 30 29 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 73  0), zErr);.    s
6840: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6850: 20 7a 45 72 72 29 3b 0a 20 20 20 20 72 63 20 3d   zErr);.    rc =
6860: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
6870: 20 7d 0a 20 20 73 50 61 72 73 65 2e 65 50 61 72   }.  sParse.ePar
6880: 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d  seMode = PARSE_M
6890: 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 0a 20 20 69  ODE_NORMAL;..  i
68a0: 66 28 20 73 50 61 72 73 65 2e 70 56 64 62 65 20  f( sParse.pVdbe 
68b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
68c0: 62 65 46 69 6e 61 6c 69 7a 65 28 73 50 61 72 73  beFinalize(sPars
68d0: 65 2e 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  e.pVdbe);.  }.  
68e0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
68f0: 6c 65 28 64 62 2c 20 73 50 61 72 73 65 2e 70 4e  le(db, sParse.pN
6900: 65 77 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  ewTable);.  sqli
6910: 74 65 33 50 61 72 73 65 72 52 65 73 65 74 28 26  te3ParserReset(&
6920: 73 50 61 72 73 65 29 3b 0a 0a 20 20 61 73 73 65  sParse);..  asse
6930: 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 72  rt( (rc&0xff)==r
6940: 63 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  c );.  rc = sqli
6950: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
6960: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
6970: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6980: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
6990: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
69a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
69b0: 6f 6b 65 64 20 62 79 20 74 68 65 20 76 64 62 65  oked by the vdbe
69c0: 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78 44 65   to call the xDe
69d0: 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a 20  stroy method.** 
69e0: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
69f0: 61 62 6c 65 20 6e 61 6d 65 64 20 7a 54 61 62 20  able named zTab 
6a00: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  in database iDb.
6a10: 20 54 68 69 73 20 6f 63 63 75 72 73 0a 2a 2a 20   This occurs.** 
6a20: 77 68 65 6e 20 61 20 44 52 4f 50 20 54 41 42 4c  when a DROP TABL
6a30: 45 20 69 73 20 6d 65 6e 74 69 6f 6e 65 64 2e 0a  E is mentioned..
6a40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
6a50: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 7a 54  is a no-op if zT
6a60: 61 62 20 69 73 20 6e 6f 74 20 61 20 76 69 72 74  ab is not a virt
6a70: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  ual table..*/.in
6a80: 74 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  t sqlite3VtabCal
6a90: 6c 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33  lDestroy(sqlite3
6aa0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
6ab0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
6ac0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
6ad0: 49 54 45 5f 4f 4b 3b 0a 20 20 54 61 62 6c 65 20  ITE_OK;.  Table 
6ae0: 2a 70 54 61 62 3b 0a 0a 20 20 70 54 61 62 20 3d  *pTab;..  pTab =
6af0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
6b00: 65 28 64 62 2c 20 7a 54 61 62 2c 20 64 62 2d 3e  e(db, zTab, db->
6b10: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
6b20: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 21 3d  e);.  if( pTab!=
6b30: 30 20 26 26 20 41 4c 57 41 59 53 28 70 54 61 62  0 && ALWAYS(pTab
6b40: 2d 3e 70 56 54 61 62 6c 65 21 3d 30 29 20 29 7b  ->pVTable!=0) ){
6b50: 0a 20 20 20 20 56 54 61 62 6c 65 20 2a 70 3b 0a  .    VTable *p;.
6b60: 20 20 20 20 69 6e 74 20 28 2a 78 44 65 73 74 72      int (*xDestr
6b70: 6f 79 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  oy)(sqlite3_vtab
6b80: 20 2a 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *);.    for(p=p
6b90: 54 61 62 2d 3e 70 56 54 61 62 6c 65 3b 20 70 3b  Tab->pVTable; p;
6ba0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
6bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
6bc0: 56 74 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  Vtab );.      if
6bd0: 28 20 70 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  ( p->pVtab->nRef
6be0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  >0 ){.        re
6bf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
6c00: 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
6c10: 7d 0a 20 20 20 20 70 20 3d 20 76 74 61 62 44 69  }.    p = vtabDi
6c20: 73 63 6f 6e 6e 65 63 74 41 6c 6c 28 64 62 2c 20  sconnectAll(db, 
6c30: 70 54 61 62 29 3b 0a 20 20 20 20 78 44 65 73 74  pTab);.    xDest
6c40: 72 6f 79 20 3d 20 70 2d 3e 70 4d 6f 64 2d 3e 70  roy = p->pMod->p
6c50: 4d 6f 64 75 6c 65 2d 3e 78 44 65 73 74 72 6f 79  Module->xDestroy
6c60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 44  ;.    assert( xD
6c70: 65 73 74 72 6f 79 21 3d 30 20 29 3b 20 20 2f 2a  estroy!=0 );  /*
6c80: 20 43 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   Checked before 
6c90: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
6ca0: 65 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a  e is created */.
6cb0: 20 20 20 20 72 63 20 3d 20 78 44 65 73 74 72 6f      rc = xDestro
6cc0: 79 28 70 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20  y(p->pVtab);.   
6cd0: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
6ce0: 71 6c 69 74 65 33 5f 76 74 61 62 2a 20 66 72 6f  qlite3_vtab* fro
6cf0: 6d 20 74 68 65 20 61 56 54 72 61 6e 73 5b 5d 20  m the aVTrans[] 
6d00: 61 72 72 61 79 2c 20 69 66 20 61 70 70 6c 69 63  array, if applic
6d10: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  able */.    if( 
6d20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6d30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6d40: 54 61 62 2d 3e 70 56 54 61 62 6c 65 3d 3d 70 20  Tab->pVTable==p 
6d50: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  && p->pNext==0 )
6d60: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 74 61 62  ;.      p->pVtab
6d70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
6d80: 2d 3e 70 56 54 61 62 6c 65 20 3d 20 30 3b 0a 20  ->pVTable = 0;. 
6d90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
6da0: 55 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 20 20 7d  Unlock(p);.    }
6db0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
6dc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
6dd0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
6de0: 73 20 65 69 74 68 65 72 20 74 68 65 20 78 52 6f  s either the xRo
6df0: 6c 6c 62 61 63 6b 20 6f 72 20 78 43 6f 6d 6d 69  llback or xCommi
6e00: 74 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 65  t method.** of e
6e10: 61 63 68 20 6f 66 20 74 68 65 20 76 69 72 74 75  ach of the virtu
6e20: 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  al tables in the
6e30: 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e 73   sqlite3.aVTrans
6e40: 20 61 72 72 61 79 2e 20 54 68 65 20 6d 65 74 68   array. The meth
6e50: 6f 64 0a 2a 2a 20 63 61 6c 6c 65 64 20 69 73 20  od.** called is 
6e60: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
6e70: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6e80: 74 2c 20 22 6f 66 66 73 65 74 22 2c 20 77 68 69  t, "offset", whi
6e90: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 6f 66 66  ch is.** the off
6ea0: 73 65 74 20 6f 66 20 74 68 65 20 6d 65 74 68 6f  set of the metho
6eb0: 64 20 74 6f 20 63 61 6c 6c 20 69 6e 20 74 68 65  d to call in the
6ec0: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
6ed0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
6ee0: 20 54 68 65 20 61 72 72 61 79 20 69 73 20 63 6c   The array is cl
6ef0: 65 61 72 65 64 20 61 66 74 65 72 20 69 6e 76 6f  eared after invo
6f00: 6b 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  king the callbac
6f10: 6b 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ks. .*/.static v
6f20: 6f 69 64 20 63 61 6c 6c 46 69 6e 61 6c 69 73 65  oid callFinalise
6f30: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  r(sqlite3 *db, i
6f40: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 69 6e  nt offset){.  in
6f50: 74 20 69 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  t i;.  if( db->a
6f60: 56 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 56 54  VTrans ){.    VT
6f70: 61 62 6c 65 20 2a 2a 61 56 54 72 61 6e 73 20 3d  able **aVTrans =
6f80: 20 64 62 2d 3e 61 56 54 72 61 6e 73 3b 0a 20 20   db->aVTrans;.  
6f90: 20 20 64 62 2d 3e 61 56 54 72 61 6e 73 20 3d 20    db->aVTrans = 
6fa0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
6fb0: 69 3c 64 62 2d 3e 6e 56 54 72 61 6e 73 3b 20 69  i<db->nVTrans; i
6fc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 54 61 62 6c  ++){.      VTabl
6fd0: 65 20 2a 70 56 54 61 62 20 3d 20 61 56 54 72 61  e *pVTab = aVTra
6fe0: 6e 73 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ns[i];.      sql
6ff0: 69 74 65 33 5f 76 74 61 62 20 2a 70 20 3d 20 70  ite3_vtab *p = p
7000: 56 54 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  VTab->pVtab;.   
7010: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
7020: 20 20 20 20 69 6e 74 20 28 2a 78 29 28 73 71 6c      int (*x)(sql
7030: 69 74 65 33 5f 76 74 61 62 20 2a 29 3b 0a 20 20  ite3_vtab *);.  
7040: 20 20 20 20 20 20 78 20 3d 20 2a 28 69 6e 74 20        x = *(int 
7050: 28 2a 2a 29 28 73 71 6c 69 74 65 33 5f 76 74 61  (**)(sqlite3_vta
7060: 62 20 2a 29 29 28 28 63 68 61 72 20 2a 29 70 2d  b *))((char *)p-
7070: 3e 70 4d 6f 64 75 6c 65 20 2b 20 6f 66 66 73 65  >pModule + offse
7080: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
7090: 78 20 29 20 78 28 70 29 3b 0a 20 20 20 20 20 20  x ) x(p);.      
70a0: 7d 0a 20 20 20 20 20 20 70 56 54 61 62 2d 3e 69  }.      pVTab->i
70b0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
70c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
70d0: 55 6e 6c 6f 63 6b 28 70 56 54 61 62 29 3b 0a 20  Unlock(pVTab);. 
70e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
70f0: 44 62 46 72 65 65 28 64 62 2c 20 61 56 54 72 61  DbFree(db, aVTra
7100: 6e 73 29 3b 0a 20 20 20 20 64 62 2d 3e 6e 56 54  ns);.    db->nVT
7110: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rans = 0;.  }.}.
7120: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
7130: 65 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f  e xSync method o
7140: 66 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  f all virtual ta
7150: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  bles in the sqli
7160: 74 65 33 2e 61 56 54 72 61 6e 73 0a 2a 2a 20 61  te3.aVTrans.** a
7170: 72 72 61 79 2e 20 52 65 74 75 72 6e 20 74 68 65  rray. Return the
7180: 20 65 72 72 6f 72 20 63 6f 64 65 20 66 6f 72 20   error code for 
7190: 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
71a0: 74 68 61 74 20 6f 63 63 75 72 73 2c 20 6f 72 0a  that occurs, or.
71b0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
71c0: 61 6c 6c 20 78 53 79 6e 63 20 6f 70 65 72 61 74  all xSync operat
71d0: 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
71e0: 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ful..**.** If an
71f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
7200: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6c 65 61  s available, lea
7210: 76 65 20 69 74 20 69 6e 20 70 2d 3e 7a 45 72 72  ve it in p->zErr
7220: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
7230: 74 65 33 56 74 61 62 53 79 6e 63 28 73 71 6c 69  te3VtabSync(sqli
7240: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
7250: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
7260: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7270: 3b 0a 20 20 56 54 61 62 6c 65 20 2a 2a 61 56 54  ;.  VTable **aVT
7280: 72 61 6e 73 20 3d 20 64 62 2d 3e 61 56 54 72 61  rans = db->aVTra
7290: 6e 73 3b 0a 0a 20 20 64 62 2d 3e 61 56 54 72 61  ns;..  db->aVTra
72a0: 6e 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ns = 0;.  for(i=
72b0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
72c0: 20 26 26 20 69 3c 64 62 2d 3e 6e 56 54 72 61 6e   && i<db->nVTran
72d0: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  s; i++){.    int
72e0: 20 28 2a 78 29 28 73 71 6c 69 74 65 33 5f 76 74   (*x)(sqlite3_vt
72f0: 61 62 20 2a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ab *);.    sqlit
7300: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
7310: 20 61 56 54 72 61 6e 73 5b 69 5d 2d 3e 70 56 74   aVTrans[i]->pVt
7320: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 56 74 61  ab;.    if( pVta
7330: 62 20 26 26 20 28 78 20 3d 20 70 56 74 61 62 2d  b && (x = pVtab-
7340: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 79 6e 63 29  >pModule->xSync)
7350: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
7360: 3d 20 78 28 70 56 74 61 62 29 3b 0a 20 20 20 20  = x(pVtab);.    
7370: 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
7380: 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
7390: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
73a0: 20 64 62 2d 3e 61 56 54 72 61 6e 73 20 3d 20 61   db->aVTrans = a
73b0: 56 54 72 61 6e 73 3b 0a 20 20 72 65 74 75 72 6e  VTrans;.  return
73c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
73d0: 76 6f 6b 65 20 74 68 65 20 78 52 6f 6c 6c 62 61  voke the xRollba
73e0: 63 6b 20 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c  ck method of all
73f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
7400: 69 6e 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  in the .** sqlit
7410: 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72 61 79  e3.aVTrans array
7420: 2e 20 54 68 65 6e 20 63 6c 65 61 72 20 74 68 65  . Then clear the
7430: 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e 0a 2a   array itself..*
7440: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61  /.int sqlite3Vta
7450: 62 52 6f 6c 6c 62 61 63 6b 28 73 71 6c 69 74 65  bRollback(sqlite
7460: 33 20 2a 64 62 29 7b 0a 20 20 63 61 6c 6c 46 69  3 *db){.  callFi
7470: 6e 61 6c 69 73 65 72 28 64 62 2c 20 6f 66 66 73  naliser(db, offs
7480: 65 74 6f 66 28 73 71 6c 69 74 65 33 5f 6d 6f 64  etof(sqlite3_mod
7490: 75 6c 65 2c 78 52 6f 6c 6c 62 61 63 6b 29 29 3b  ule,xRollback));
74a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
74b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
74c0: 76 6f 6b 65 20 74 68 65 20 78 43 6f 6d 6d 69 74  voke the xCommit
74d0: 20 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c 20 76   method of all v
74e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
74f0: 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
7500: 2e 61 56 54 72 61 6e 73 20 61 72 72 61 79 2e 20  .aVTrans array. 
7510: 54 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 61  Then clear the a
7520: 72 72 61 79 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  rray itself..*/.
7530: 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 43  int sqlite3VtabC
7540: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
7550: 62 29 7b 0a 20 20 63 61 6c 6c 46 69 6e 61 6c 69  b){.  callFinali
7560: 73 65 72 28 64 62 2c 20 6f 66 66 73 65 74 6f 66  ser(db, offsetof
7570: 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 2c  (sqlite3_module,
7580: 78 43 6f 6d 6d 69 74 29 29 3b 0a 20 20 72 65 74  xCommit));.  ret
7590: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
75a0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76  ../*.** If the v
75b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 70 56 74  irtual table pVt
75c0: 61 62 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  ab supports the 
75d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 65  transaction inte
75e0: 72 66 61 63 65 0a 2a 2a 20 28 78 42 65 67 69 6e  rface.** (xBegin
75f0: 2f 78 52 6f 6c 6c 62 61 63 6b 2f 78 43 6f 6d 6d  /xRollback/xComm
7600: 69 74 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c  it and optionall
7610: 79 20 78 53 79 6e 63 29 20 61 6e 64 20 61 20 74  y xSync) and a t
7620: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
7630: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f   not currently o
7640: 70 65 6e 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  pen, invoke the 
7650: 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20 6e 6f  xBegin method no
7660: 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  w..**.** If the 
7670: 78 42 65 67 69 6e 20 63 61 6c 6c 20 69 73 20 73  xBegin call is s
7680: 75 63 63 65 73 73 66 75 6c 2c 20 70 6c 61 63 65  uccessful, place
7690: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
76a0: 62 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 6e 20  b pointer.** in 
76b0: 74 68 65 20 73 71 6c 69 74 65 33 2e 61 56 54 72  the sqlite3.aVTr
76c0: 61 6e 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 69 6e  ans array..*/.in
76d0: 74 20 73 71 6c 69 74 65 33 56 74 61 62 42 65 67  t sqlite3VtabBeg
76e0: 69 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  in(sqlite3 *db, 
76f0: 56 54 61 62 6c 65 20 2a 70 56 54 61 62 29 7b 0a  VTable *pVTab){.
7700: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7710: 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 73 71  E_OK;.  const sq
7720: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
7730: 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 53 70 65  odule;..  /* Spe
7740: 63 69 61 6c 20 63 61 73 65 3a 20 49 66 20 64 62  cial case: If db
7750: 2d 3e 61 56 54 72 61 6e 73 20 69 73 20 4e 55 4c  ->aVTrans is NUL
7760: 4c 20 61 6e 64 20 64 62 2d 3e 6e 56 54 72 61 6e  L and db->nVTran
7770: 73 20 69 73 20 67 72 65 61 74 65 72 0a 20 20 2a  s is greater.  *
7780: 2a 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  * than zero, the
7790: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
77a0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
77b0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 0a 20 20  from within a.  
77c0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
77d0: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
77e0: 63 6b 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ck. It is illega
77f0: 6c 20 74 6f 20 77 72 69 74 65 20 74 6f 20 0a 20  l to write to . 
7800: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
7810: 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 69  le tables in thi
7820: 73 20 63 61 73 65 2c 20 73 6f 20 72 65 74 75 72  s case, so retur
7830: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
7840: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
7850: 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
7860: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
7870: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
7880: 20 7d 0a 20 20 69 66 28 20 21 70 56 54 61 62 20   }.  if( !pVTab 
7890: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
78a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 20 0a 20 20  LITE_OK;.  } .  
78b0: 70 4d 6f 64 75 6c 65 20 3d 20 70 56 54 61 62 2d  pModule = pVTab-
78c0: 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  >pVtab->pModule;
78d0: 0a 0a 20 20 69 66 28 20 70 4d 6f 64 75 6c 65 2d  ..  if( pModule-
78e0: 3e 78 42 65 67 69 6e 20 29 7b 0a 20 20 20 20 69  >xBegin ){.    i
78f0: 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  nt i;..    /* If
7900: 20 70 56 74 61 62 20 69 73 20 61 6c 72 65 61 64   pVtab is alread
7910: 79 20 69 6e 20 74 68 65 20 61 56 54 72 61 6e 73  y in the aVTrans
7920: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 20 65   array, return e
7930: 61 72 6c 79 20 2a 2f 0a 20 20 20 20 66 6f 72 28  arly */.    for(
7940: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 56 54 72 61  i=0; i<db->nVTra
7950: 6e 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ns; i++){.      
7960: 69 66 28 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b  if( db->aVTrans[
7970: 69 5d 3d 3d 70 56 54 61 62 20 29 7b 0a 20 20 20  i]==pVTab ){.   
7980: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7990: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
79a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
79b0: 6f 6b 65 20 74 68 65 20 78 42 65 67 69 6e 20 6d  oke the xBegin m
79c0: 65 74 68 6f 64 2e 20 49 66 20 73 75 63 63 65 73  ethod. If succes
79d0: 73 66 75 6c 2c 20 61 64 64 20 74 68 65 20 76 74  sful, add the vt
79e0: 61 62 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a  ab to the .    *
79f0: 2a 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e  * sqlite3.aVTran
7a00: 73 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  s[] array. */.  
7a10: 20 20 72 63 20 3d 20 67 72 6f 77 56 54 72 61 6e    rc = growVTran
7a20: 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  s(db);.    if( r
7a30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7a40: 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75        rc = pModu
7a50: 6c 65 2d 3e 78 42 65 67 69 6e 28 70 56 54 61 62  le->xBegin(pVTab
7a60: 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20  ->pVtab);.      
7a70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7a80: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
7a90: 20 69 53 76 70 74 20 3d 20 64 62 2d 3e 6e 53 74   iSvpt = db->nSt
7aa0: 61 74 65 6d 65 6e 74 20 2b 20 64 62 2d 3e 6e 53  atement + db->nS
7ab0: 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20  avepoint;.      
7ac0: 20 20 61 64 64 54 6f 56 54 72 61 6e 73 28 64 62    addToVTrans(db
7ad0: 2c 20 70 56 54 61 62 29 3b 0a 20 20 20 20 20 20  , pVTab);.      
7ae0: 20 20 69 66 28 20 69 53 76 70 74 20 26 26 20 70    if( iSvpt && p
7af0: 4d 6f 64 75 6c 65 2d 3e 78 53 61 76 65 70 6f 69  Module->xSavepoi
7b00: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
7b10: 70 56 54 61 62 2d 3e 69 53 61 76 65 70 6f 69 6e  pVTab->iSavepoin
7b20: 74 20 3d 20 69 53 76 70 74 3b 0a 20 20 20 20 20  t = iSvpt;.     
7b30: 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c       rc = pModul
7b40: 65 2d 3e 78 53 61 76 65 70 6f 69 6e 74 28 70 56  e->xSavepoint(pV
7b50: 54 61 62 2d 3e 70 56 74 61 62 2c 20 69 53 76 70  Tab->pVtab, iSvp
7b60: 74 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t-1);.        }.
7b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7b80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7b90: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 65  ../*.** Invoke e
7ba0: 69 74 68 65 72 20 74 68 65 20 78 53 61 76 65 70  ither the xSavep
7bb0: 6f 69 6e 74 2c 20 78 52 6f 6c 6c 62 61 63 6b 54  oint, xRollbackT
7bc0: 6f 20 6f 72 20 78 52 65 6c 65 61 73 65 20 6d 65  o or xRelease me
7bd0: 74 68 6f 64 20 6f 66 20 61 6c 6c 0a 2a 2a 20 76  thod of all.** v
7be0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 74 68  irtual tables th
7bf0: 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 76  at currently hav
7c00: 65 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  e an open transa
7c10: 63 74 69 6f 6e 2e 20 50 61 73 73 20 69 53 61 76  ction. Pass iSav
7c20: 65 70 6f 69 6e 74 0a 2a 2a 20 61 73 20 74 68 65  epoint.** as the
7c30: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
7c40: 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
7c50: 74 61 62 6c 65 20 6d 65 74 68 6f 64 20 69 6e 76  table method inv
7c60: 6f 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  oked..**.** If o
7c70: 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 42  p is SAVEPOINT_B
7c80: 45 47 49 4e 2c 20 74 68 65 20 78 53 61 76 65 70  EGIN, the xSavep
7c90: 6f 69 6e 74 20 6d 65 74 68 6f 64 20 69 73 20 69  oint method is i
7ca0: 6e 76 6f 6b 65 64 2e 20 49 66 20 69 74 20 69 73  nvoked. If it is
7cb0: 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
7cc0: 4c 4c 42 41 43 4b 2c 20 74 68 65 20 78 52 6f 6c  LLBACK, the xRol
7cd0: 6c 62 61 63 6b 54 6f 20 6d 65 74 68 6f 64 2e 20  lbackTo method. 
7ce0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6f 70  Otherwise, if op
7cf0: 20 69 73 20 0a 2a 2a 20 53 41 56 45 50 4f 49 4e   is .** SAVEPOIN
7d00: 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
7d10: 74 68 65 20 78 52 65 6c 65 61 73 65 20 6d 65 74  the xRelease met
7d20: 68 6f 64 20 6f 66 20 65 61 63 68 20 76 69 72 74  hod of each virt
7d30: 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 2a  ual table with.*
7d40: 2a 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  * an open transa
7d50: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
7d60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 76  ..**.** If any v
7d70: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 65 74  irtual table met
7d80: 68 6f 64 20 72 65 74 75 72 6e 73 20 61 6e 20 65  hod returns an e
7d90: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20  rror code other 
7da0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  than SQLITE_OK, 
7db0: 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69  .** processing i
7dc0: 73 20 61 62 61 6e 64 6f 6e 65 64 20 61 6e 64 20  s abandoned and 
7dd0: 74 68 65 20 65 72 72 6f 72 20 72 65 74 75 72 6e  the error return
7de0: 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
7df0: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63   of this.** func
7e00: 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
7e10: 2e 20 49 66 20 61 6c 6c 20 63 61 6c 6c 73 20 74  . If all calls t
7e20: 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  o virtual table 
7e30: 6d 65 74 68 6f 64 73 20 61 72 65 20 73 75 63 63  methods are succ
7e40: 65 73 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54  essful,.** SQLIT
7e50: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
7e60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7e70: 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 73 71  VtabSavepoint(sq
7e80: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f  lite3 *db, int o
7e90: 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
7ea0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
7eb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
7ec0: 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
7ed0: 4e 54 5f 52 45 4c 45 41 53 45 7c 7c 6f 70 3d 3d  NT_RELEASE||op==
7ee0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
7ef0: 43 4b 7c 7c 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  CK||op==SAVEPOIN
7f00: 54 5f 42 45 47 49 4e 20 29 3b 0a 20 20 61 73 73  T_BEGIN );.  ass
7f10: 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
7f20: 3d 2d 31 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  =-1 );.  if( db-
7f30: 3e 61 56 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  >aVTrans ){.    
7f40: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
7f50: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
7f60: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 56 54 72 61  K && i<db->nVTra
7f70: 6e 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ns; i++){.      
7f80: 56 54 61 62 6c 65 20 2a 70 56 54 61 62 20 3d 20  VTable *pVTab = 
7f90: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 69 5d 3b 0a  db->aVTrans[i];.
7fa0: 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69        const sqli
7fb0: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
7fc0: 20 3d 20 70 56 54 61 62 2d 3e 70 4d 6f 64 2d 3e   = pVTab->pMod->
7fd0: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 69  pModule;.      i
7fe0: 66 28 20 70 56 54 61 62 2d 3e 70 56 74 61 62 20  f( pVTab->pVtab 
7ff0: 26 26 20 70 4d 6f 64 2d 3e 69 56 65 72 73 69 6f  && pMod->iVersio
8000: 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=2 ){.        
8010: 69 6e 74 20 28 2a 78 4d 65 74 68 6f 64 29 28 73  int (*xMethod)(s
8020: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2c 20 69  qlite3_vtab *, i
8030: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
8040: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 70 56 54  ite3VtabLock(pVT
8050: 61 62 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69  ab);.        swi
8060: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 20  tch( op ){.     
8070: 20 20 20 20 20 63 61 73 65 20 53 41 56 45 50 4f       case SAVEPO
8080: 49 4e 54 5f 42 45 47 49 4e 3a 0a 20 20 20 20 20  INT_BEGIN:.     
8090: 20 20 20 20 20 20 20 78 4d 65 74 68 6f 64 20 3d         xMethod =
80a0: 20 70 4d 6f 64 2d 3e 78 53 61 76 65 70 6f 69 6e   pMod->xSavepoin
80b0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
80c0: 56 54 61 62 2d 3e 69 53 61 76 65 70 6f 69 6e 74  VTab->iSavepoint
80d0: 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 2b 31 3b   = iSavepoint+1;
80e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
80f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
8100: 73 65 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  se SAVEPOINT_ROL
8110: 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  LBACK:.         
8120: 20 20 20 78 4d 65 74 68 6f 64 20 3d 20 70 4d 6f     xMethod = pMo
8130: 64 2d 3e 78 52 6f 6c 6c 62 61 63 6b 54 6f 3b 0a  d->xRollbackTo;.
8140: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8150: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66  k;.          def
8160: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ault:.          
8170: 20 20 78 4d 65 74 68 6f 64 20 3d 20 70 4d 6f 64    xMethod = pMod
8180: 2d 3e 78 52 65 6c 65 61 73 65 3b 0a 20 20 20 20  ->xRelease;.    
8190: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
81a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
81b0: 20 69 66 28 20 78 4d 65 74 68 6f 64 20 26 26 20   if( xMethod && 
81c0: 70 56 54 61 62 2d 3e 69 53 61 76 65 70 6f 69 6e  pVTab->iSavepoin
81d0: 74 3e 69 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  t>iSavepoint ){.
81e0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 78            rc = x
81f0: 4d 65 74 68 6f 64 28 70 56 54 61 62 2d 3e 70 56  Method(pVTab->pV
8200: 74 61 62 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  tab, iSavepoint)
8210: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8220: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 55      sqlite3VtabU
8230: 6e 6c 6f 63 6b 28 70 56 54 61 62 29 3b 0a 20 20  nlock(pVTab);.  
8240: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8250: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8260: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
8270: 70 61 72 61 6d 65 74 65 72 20 28 70 44 65 66 29  parameter (pDef)
8280: 20 69 73 20 61 20 66 75 6e 63 74 69 6f 6e 20 69   is a function i
8290: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
82a0: 54 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 70 61  The.** second pa
82b0: 72 61 6d 65 74 65 72 20 28 70 45 78 70 72 29 20  rameter (pExpr) 
82c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  is the first arg
82d0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
82e0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 70 45  nction..** If pE
82f0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  xpr is a column 
8300: 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
8310: 6c 65 2c 20 74 68 65 6e 20 6c 65 74 20 74 68 65  le, then let the
8320: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
8330: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8340: 20 68 61 76 65 20 61 6e 20 6f 70 70 6f 72 74 75   have an opportu
8350: 6e 69 74 79 20 74 6f 20 6f 76 65 72 6c 6f 61 64  nity to overload
8360: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
8370: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8380: 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
8390: 6f 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ow virtual table
83a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
83b0: 20 74 6f 0a 2a 2a 20 6f 76 65 72 6c 6f 61 64 20   to.** overload 
83c0: 4d 41 54 43 48 2c 20 4c 49 4b 45 2c 20 47 4c 4f  MATCH, LIKE, GLO
83d0: 42 2c 20 61 6e 64 20 52 45 47 45 58 50 20 6f 70  B, and REGEXP op
83e0: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 52  erators..**.** R
83f0: 65 74 75 72 6e 20 65 69 74 68 65 72 20 74 68 65  eturn either the
8400: 20 70 44 65 66 20 61 72 67 75 6d 65 6e 74 20 28   pDef argument (
8410: 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 63 68  indicating no ch
8420: 61 6e 67 65 29 20 6f 72 20 61 20 0a 2a 2a 20 6e  ange) or a .** n
8430: 65 77 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ew FuncDef struc
8440: 74 75 72 65 20 74 68 61 74 20 69 73 20 6d 61 72  ture that is mar
8450: 6b 65 64 20 61 73 20 65 70 68 65 6d 65 72 61 6c  ked as ephemeral
8460: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 53 51   using the.** SQ
8470: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 20  LITE_FUNC_EPHEM 
8480: 66 6c 61 67 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66  flag..*/.FuncDef
8490: 20 2a 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65   *sqlite3VtabOve
84a0: 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 0a 20  rloadFunction(. 
84b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
84c0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
84d0: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 72 65 70 6f  nection for repo
84e0: 72 74 69 6e 67 20 6d 61 6c 6c 6f 63 20 70 72 6f  rting malloc pro
84f0: 62 6c 65 6d 73 20 2a 2f 0a 20 20 46 75 6e 63 44  blems */.  FuncD
8500: 65 66 20 2a 70 44 65 66 2c 20 20 2f 2a 20 46 75  ef *pDef,  /* Fu
8510: 6e 63 74 69 6f 6e 20 74 6f 20 70 6f 73 73 69 62  nction to possib
8520: 6c 79 20 6f 76 65 72 6c 6f 61 64 20 2a 2f 0a 20  ly overload */. 
8530: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
8540: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8550: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
8560: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  unction */.  Exp
8570: 72 20 2a 70 45 78 70 72 20 20 20 20 20 2f 2a 20  r *pExpr     /* 
8580: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
8590: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
85a0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
85b0: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  ab;.  sqlite3_vt
85c0: 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 73 71 6c  ab *pVtab;.  sql
85d0: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
85e0: 64 3b 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  d;.  void (*xSFu
85f0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
8600: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
8610: 5f 76 61 6c 75 65 2a 2a 29 20 3d 20 30 3b 0a 20  _value**) = 0;. 
8620: 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b   void *pArg = 0;
8630: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 77  .  FuncDef *pNew
8640: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
8650: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
8660: 65 65 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ee the left oper
8670: 61 6e 64 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  and is a column 
8680: 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
8690: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  le */.  if( NEVE
86a0: 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
86b0: 74 75 72 6e 20 70 44 65 66 3b 0a 20 20 69 66 28  turn pDef;.  if(
86c0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
86d0: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 70  OLUMN ) return p
86e0: 44 65 66 3b 0a 20 20 70 54 61 62 20 3d 20 70 45  Def;.  pTab = pE
86f0: 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 69  xpr->y.pTab;.  i
8700: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
8710: 75 72 6e 20 70 44 65 66 3b 0a 20 20 69 66 28 20  urn pDef;.  if( 
8720: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
8730: 20 29 20 72 65 74 75 72 6e 20 70 44 65 66 3b 0a   ) return pDef;.
8740: 20 20 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65    pVtab = sqlite
8750: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
8760: 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 61  Tab)->pVtab;.  a
8770: 73 73 65 72 74 28 20 70 56 74 61 62 21 3d 30 20  ssert( pVtab!=0 
8780: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 74  );.  assert( pVt
8790: 61 62 2d 3e 70 4d 6f 64 75 6c 65 21 3d 30 20 29  ab->pModule!=0 )
87a0: 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 73 71 6c 69  ;.  pMod = (sqli
87b0: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74  te3_module *)pVt
87c0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 69  ab->pModule;.  i
87d0: 66 28 20 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75  f( pMod->xFindFu
87e0: 6e 63 74 69 6f 6e 3d 3d 30 20 29 20 72 65 74 75  nction==0 ) retu
87f0: 72 6e 20 70 44 65 66 3b 0a 20 0a 20 20 2f 2a 20  rn pDef;. .  /* 
8800: 43 61 6c 6c 20 74 68 65 20 78 46 69 6e 64 46 75  Call the xFindFu
8810: 6e 63 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 6e  nction method on
8820: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
8830: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
8840: 6e 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  n.  ** to see if
8850: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
8860: 69 6f 6e 20 77 61 6e 74 73 20 74 6f 20 6f 76 65  ion wants to ove
8870: 72 6c 6f 61 64 20 74 68 69 73 20 66 75 6e 63 74  rload this funct
8880: 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ion..  **.  ** T
8890: 68 6f 75 67 68 20 75 6e 64 6f 63 75 6d 65 6e 74  hough undocument
88a0: 65 64 2c 20 77 65 20 68 61 76 65 20 68 69 73 74  ed, we have hist
88b0: 6f 72 69 63 61 6c 6c 79 20 61 6c 77 61 79 73 20  orically always 
88c0: 69 6e 76 6f 6b 65 64 20 78 46 69 6e 64 46 75 6e  invoked xFindFun
88d0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ction.  ** with 
88e0: 61 6e 20 61 6c 6c 20 6c 6f 77 65 72 2d 63 61 73  an all lower-cas
88f0: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
8900: 20 20 43 6f 6e 74 69 6e 75 65 20 69 6e 20 74 68    Continue in th
8910: 69 73 20 74 72 61 64 69 74 69 6f 6e 20 74 6f 0a  is tradition to.
8920: 20 20 2a 2a 20 61 76 6f 69 64 20 61 6e 79 20 63    ** avoid any c
8930: 68 61 6e 63 65 20 6f 66 20 61 6e 20 69 6e 63 6f  hance of an inco
8940: 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a  mpatibility..  *
8950: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8960: 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 69 6e  DEBUG.  {.    in
8970: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
8980: 3b 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b 69 5d  ; pDef->zName[i]
8990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e  ; i++){.      un
89a0: 73 69 67 6e 65 64 20 63 68 61 72 20 78 20 3d 20  signed char x = 
89b0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
89c0: 44 65 66 2d 3e 7a 4e 61 6d 65 5b 69 5d 3b 0a 20  Def->zName[i];. 
89d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3d 3d       assert( x==
89e0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
89f0: 77 65 72 5b 78 5d 20 29 3b 0a 20 20 20 20 7d 0a  wer[x] );.    }.
8a00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20    }.#endif.  rc 
8a10: 3d 20 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75 6e  = pMod->xFindFun
8a20: 63 74 69 6f 6e 28 70 56 74 61 62 2c 20 6e 41 72  ction(pVtab, nAr
8a30: 67 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  g, pDef->zName, 
8a40: 26 78 53 46 75 6e 63 2c 20 26 70 41 72 67 29 3b  &xSFunc, &pArg);
8a50: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
8a60: 20 20 20 20 72 65 74 75 72 6e 20 70 44 65 66 3b      return pDef;
8a70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
8a80: 65 20 61 20 6e 65 77 20 65 70 68 65 6d 65 72 61  e a new ephemera
8a90: 6c 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  l function defin
8aa0: 69 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6f 76  ition for the ov
8ab0: 65 72 6c 6f 61 64 65 64 0a 20 20 2a 2a 20 66 75  erloaded.  ** fu
8ac0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 4e 65 77  nction */.  pNew
8ad0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8ae0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
8af0: 66 28 2a 70 4e 65 77 29 0a 20 20 20 20 20 20 20  f(*pNew).       
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65 33 53        + sqlite3S
8b20: 74 72 6c 65 6e 33 30 28 70 44 65 66 2d 3e 7a 4e  trlen30(pDef->zN
8b30: 61 6d 65 29 20 2b 20 31 29 3b 0a 20 20 69 66 28  ame) + 1);.  if(
8b40: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
8b50: 72 65 74 75 72 6e 20 70 44 65 66 3b 0a 20 20 7d  return pDef;.  }
8b60: 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 44 65 66  .  *pNew = *pDef
8b70: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20  ;.  pNew->zName 
8b80: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26  = (const char*)&
8b90: 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70  pNew[1];.  memcp
8ba0: 79 28 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  y((char*)&pNew[1
8bb0: 5d 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ], pDef->zName, 
8bc0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8bd0: 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 2b 31 29 3b  pDef->zName)+1);
8be0: 0a 20 20 70 4e 65 77 2d 3e 78 53 46 75 6e 63 20  .  pNew->xSFunc 
8bf0: 3d 20 78 53 46 75 6e 63 3b 0a 20 20 70 4e 65 77  = xSFunc;.  pNew
8c00: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 41  ->pUserData = pA
8c10: 72 67 3b 0a 20 20 70 4e 65 77 2d 3e 66 75 6e 63  rg;.  pNew->func
8c20: 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
8c30: 46 55 4e 43 5f 45 50 48 45 4d 3b 0a 20 20 72 65  FUNC_EPHEM;.  re
8c40: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
8c50: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 76 69  .** Make sure vi
8c60: 72 74 75 61 6c 20 74 61 62 6c 65 20 70 54 61 62  rtual table pTab
8c70: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
8c80: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 70 56   the pParse->apV
8c90: 69 72 74 75 61 6c 4c 6f 63 6b 5b 5d 0a 2a 2a 20  irtualLock[].** 
8ca0: 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 61 6e  array so that an
8cb0: 20 4f 50 5f 56 42 65 67 69 6e 20 77 69 6c 6c 20   OP_VBegin will 
8cc0: 67 65 74 20 67 65 6e 65 72 61 74 65 64 20 66 6f  get generated fo
8cd0: 72 20 69 74 2e 20 20 41 64 64 20 70 54 61 62 20  r it.  Add pTab 
8ce0: 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  to the.** array 
8cf0: 69 66 20 69 74 20 69 73 20 6d 69 73 73 69 6e 67  if it is missing
8d00: 2e 20 20 49 66 20 70 54 61 62 20 69 73 20 61 6c  .  If pTab is al
8d10: 72 65 61 64 79 20 69 6e 20 74 68 65 20 61 72 72  ready in the arr
8d20: 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
8d30: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  .** is a no-op..
8d40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8d50: 74 61 62 4d 61 6b 65 57 72 69 74 61 62 6c 65 28  tabMakeWritable(
8d60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
8d70: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 50  able *pTab){.  P
8d80: 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
8d90: 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
8da0: 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
8db0: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 54 61    int i, n;.  Ta
8dc0: 62 6c 65 20 2a 2a 61 70 56 74 61 62 4c 6f 63 6b  ble **apVtabLock
8dd0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  ;..  assert( IsV
8de0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a  irtual(pTab) );.
8df0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
8e00: 70 6c 65 76 65 6c 2d 3e 6e 56 74 61 62 4c 6f 63  plevel->nVtabLoc
8e10: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  k; i++){.    if(
8e20: 20 70 54 61 62 3d 3d 70 54 6f 70 6c 65 76 65 6c   pTab==pToplevel
8e30: 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 20  ->apVtabLock[i] 
8e40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
8e50: 6e 20 3d 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  n = (pToplevel->
8e60: 6e 56 74 61 62 4c 6f 63 6b 2b 31 29 2a 73 69 7a  nVtabLock+1)*siz
8e70: 65 6f 66 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  eof(pToplevel->a
8e80: 70 56 74 61 62 4c 6f 63 6b 5b 30 5d 29 3b 0a 20  pVtabLock[0]);. 
8e90: 20 61 70 56 74 61 62 4c 6f 63 6b 20 3d 20 73 71   apVtabLock = sq
8ea0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
8eb0: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70 56 74 61  pToplevel->apVta
8ec0: 62 4c 6f 63 6b 2c 20 6e 29 3b 0a 20 20 69 66 28  bLock, n);.  if(
8ed0: 20 61 70 56 74 61 62 4c 6f 63 6b 20 29 7b 0a 20   apVtabLock ){. 
8ee0: 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70     pToplevel->ap
8ef0: 56 74 61 62 4c 6f 63 6b 20 3d 20 61 70 56 74 61  VtabLock = apVta
8f00: 62 4c 6f 63 6b 3b 0a 20 20 20 20 70 54 6f 70 6c  bLock;.    pTopl
8f10: 65 76 65 6c 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  evel->apVtabLock
8f20: 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 56 74 61  [pToplevel->nVta
8f30: 62 4c 6f 63 6b 2b 2b 5d 20 3d 20 70 54 61 62 3b  bLock++] = pTab;
8f40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
8f50: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 54  lite3OomFault(pT
8f60: 6f 70 6c 65 76 65 6c 2d 3e 64 62 29 3b 0a 20 20  oplevel->db);.  
8f70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  }.}../*.** Check
8f80: 20 74 6f 20 73 65 65 20 69 66 20 76 69 72 74 75   to see if virtu
8f90: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
8fa0: 70 4d 6f 64 20 63 61 6e 20 62 65 20 68 61 76 65  pMod can be have
8fb0: 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 0a 2a 2a   an eponymous.**
8fc0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
8fd0: 6e 73 74 61 6e 63 65 2e 20 20 49 66 20 69 74 20  nstance.  If it 
8fe0: 63 61 6e 2c 20 63 72 65 61 74 65 20 6f 6e 65 20  can, create one 
8ff0: 69 66 20 6f 6e 65 20 64 6f 65 73 20 6e 6f 74 20  if one does not 
9000: 61 6c 72 65 61 64 79 0a 2a 2a 20 65 78 69 73 74  already.** exist
9010: 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  . Return non-zer
9020: 6f 20 69 66 20 74 68 65 20 65 70 6f 6e 79 6d 6f  o if the eponymo
9030: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
9040: 20 69 6e 73 74 61 6e 63 65 20 65 78 69 73 74 73   instance exists
9050: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
9060: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 20 61  utine returns, a
9070: 6e 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  nd return zero i
9080: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
9090: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 70  ist..**.** An ep
90a0: 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
90b0: 74 61 62 6c 65 20 69 6e 73 74 61 6e 63 65 20 69  table instance i
90c0: 73 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 61  s one that is na
90d0: 6d 65 64 20 61 66 74 65 72 20 69 74 73 0a 2a 2a  med after its.**
90e0: 20 6d 6f 64 75 6c 65 2c 20 61 6e 64 20 6d 6f 72   module, and mor
90f0: 65 20 69 6d 70 6f 72 74 61 6e 74 6c 79 2c 20 64  e importantly, d
9100: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
9110: 61 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  a CREATE VIRTUAL
9120: 20 54 41 42 4c 45 0a 2a 2a 20 73 74 61 74 65 6d   TABLE.** statem
9130: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
9140: 63 6f 6d 65 20 69 6e 74 6f 20 65 78 69 73 74 61  come into exista
9150: 6e 63 65 2e 20 20 45 70 6f 6e 79 6d 6f 75 73 20  nce.  Eponymous 
9160: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2a  virtual table.**
9170: 20 69 6e 73 74 61 6e 63 65 73 20 61 6c 77 61 79   instances alway
9180: 73 20 65 78 69 73 74 2e 20 20 54 68 65 79 20 63  s exist.  They c
9190: 61 6e 6e 6f 74 20 62 65 20 44 52 4f 50 2d 65 64  annot be DROP-ed
91a0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 76 69 72 74  ..**.** Any virt
91b0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
91c0: 20 66 6f 72 20 77 68 69 63 68 20 78 43 6f 6e 6e   for which xConn
91d0: 65 63 74 20 61 6e 64 20 78 43 72 65 61 74 65 20  ect and xCreate 
91e0: 61 72 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  are the same.** 
91f0: 6d 65 74 68 6f 64 20 63 61 6e 20 68 61 76 65 20  method can have 
9200: 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
9210: 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 61  tual table insta
9220: 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nce..*/.int sqli
9230: 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73  te3VtabEponymous
9240: 54 61 62 6c 65 49 6e 69 74 28 50 61 72 73 65 20  TableInit(Parse 
9250: 2a 70 50 61 72 73 65 2c 20 4d 6f 64 75 6c 65 20  *pParse, Module 
9260: 2a 70 4d 6f 64 29 7b 0a 20 20 63 6f 6e 73 74 20  *pMod){.  const 
9270: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
9280: 70 4d 6f 64 75 6c 65 20 3d 20 70 4d 6f 64 2d 3e  pModule = pMod->
9290: 70 4d 6f 64 75 6c 65 3b 0a 20 20 54 61 62 6c 65  pModule;.  Table
92a0: 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72 20 2a   *pTab;.  char *
92b0: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
92c0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
92d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
92e0: 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f    if( pMod->pEpo
92f0: 54 61 62 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Tab ) return 1;.
9300: 20 20 69 66 28 20 70 4d 6f 64 75 6c 65 2d 3e 78    if( pModule->x
9310: 43 72 65 61 74 65 21 3d 30 20 26 26 20 70 4d 6f  Create!=0 && pMo
9320: 64 75 6c 65 2d 3e 78 43 72 65 61 74 65 21 3d 70  dule->xCreate!=p
9330: 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6e 6e 65 63 74  Module->xConnect
9340: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
9350: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
9360: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9370: 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
9380: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
9390: 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 2d 3e  turn 0;.  pTab->
93a0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
93b0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4d 6f 64  bStrDup(db, pMod
93c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
93d0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  pTab->zName==0 )
93e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
93f0: 72 65 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ree(db, pTab);. 
9400: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9410: 0a 20 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  .  pMod->pEpoTab
9420: 20 3d 20 70 54 61 62 3b 0a 20 20 70 54 61 62 2d   = pTab;.  pTab-
9430: 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
9440: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20  pTab->pSchema = 
9450: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
9460: 6d 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ma;.  assert( pT
9470: 61 62 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 3d 3d  ab->nModuleArg==
9480: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  0 );.  pTab->iPK
9490: 65 79 20 3d 20 2d 31 3b 0a 20 20 61 64 64 4d 6f  ey = -1;.  addMo
94a0: 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62 2c  duleArgument(db,
94b0: 20 70 54 61 62 2c 20 73 71 6c 69 74 65 33 44 62   pTab, sqlite3Db
94c0: 53 74 72 44 75 70 28 64 62 2c 20 70 54 61 62 2d  StrDup(db, pTab-
94d0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 61 64 64 4d  >zName));.  addM
94e0: 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62  oduleArgument(db
94f0: 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 61 64  , pTab, 0);.  ad
9500: 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28  dModuleArgument(
9510: 64 62 2c 20 70 54 61 62 2c 20 73 71 6c 69 74 65  db, pTab, sqlite
9520: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 54  3DbStrDup(db, pT
9530: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 72  ab->zName));.  r
9540: 63 20 3d 20 76 74 61 62 43 61 6c 6c 43 6f 6e 73  c = vtabCallCons
9550: 74 72 75 63 74 6f 72 28 64 62 2c 20 70 54 61 62  tructor(db, pTab
9560: 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64 75 6c 65 2d  , pMod, pModule-
9570: 3e 78 43 6f 6e 6e 65 63 74 2c 20 26 7a 45 72 72  >xConnect, &zErr
9580: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
9590: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
95a0: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
95b0: 20 7a 45 72 72 29 3b 0a 20 20 20 20 73 71 6c 69   zErr);.    sqli
95c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
95d0: 72 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rr);.    sqlite3
95e0: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
95f0: 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64  leClear(db, pMod
9600: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
9610: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
9620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
9630: 74 68 65 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69  the eponymous vi
9640: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  rtual table inst
9650: 61 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  ance associated 
9660: 77 69 74 68 0a 2a 2a 20 76 69 72 74 75 61 6c 20  with.** virtual 
9670: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 70 4d 6f  table module pMo
9680: 64 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  d, if it exists.
9690: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
96a0: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
96b0: 6c 65 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20  leClear(sqlite3 
96c0: 2a 64 62 2c 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f  *db, Module *pMo
96d0: 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  d){.  Table *pTa
96e0: 62 20 3d 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  b = pMod->pEpoTa
96f0: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 21 3d 30  b;.  if( pTab!=0
9700: 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20   ){.    /* Mark 
9710: 74 68 65 20 74 61 62 6c 65 20 61 73 20 45 70 68  the table as Eph
9720: 65 6d 65 72 61 6c 20 70 72 69 6f 72 20 74 6f 20  emeral prior to 
9730: 64 65 6c 65 74 69 6e 67 20 69 74 2c 20 73 6f 20  deleting it, so 
9740: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
9750: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
9760: 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  le() routine wil
9770: 6c 20 6b 6e 6f 77 20 74 68 61 74 20 69 74 20 69  l know that it i
9780: 73 20 6e 6f 74 20 73 74 6f 72 65 64 20 69 6e 20  s not stored in 
9790: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65  .    ** the sche
97a0: 6d 61 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d  ma. */.    pTab-
97b0: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
97c0: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 73  Ephemeral;.    s
97d0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
97e0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
97f0: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 3d   pMod->pEpoTab =
9800: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
9810: 20 52 65 74 75 72 6e 20 74 68 65 20 4f 4e 20 43   Return the ON C
9820: 4f 4e 46 4c 49 43 54 20 72 65 73 6f 6c 75 74 69  ONFLICT resoluti
9830: 6f 6e 20 6d 6f 64 65 20 69 6e 20 65 66 66 65 63  on mode in effec
9840: 74 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61  t for the virtua
9850: 6c 0a 2a 2a 20 74 61 62 6c 65 20 75 70 64 61 74  l.** table updat
9860: 65 20 6f 70 65 72 61 74 69 6f 6e 20 63 75 72 72  e operation curr
9870: 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
9880: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  s..**.** The res
9890: 75 6c 74 73 20 6f 66 20 74 68 69 73 20 72 6f 75  ults of this rou
98a0: 74 69 6e 65 20 61 72 65 20 75 6e 64 65 66 69 6e  tine are undefin
98b0: 65 64 20 75 6e 6c 65 73 73 20 69 74 20 69 73 20  ed unless it is 
98c0: 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77  called from.** w
98d0: 69 74 68 69 6e 20 61 6e 20 78 55 70 64 61 74 65  ithin an xUpdate
98e0: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20   method..*/.int 
98f0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f  sqlite3_vtab_on_
9900: 63 6f 6e 66 6c 69 63 74 28 73 71 6c 69 74 65 33  conflict(sqlite3
9910: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
9920: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
9930: 68 61 72 20 61 4d 61 70 5b 5d 20 3d 20 7b 20 0a  har aMap[] = { .
9940: 20 20 20 20 53 51 4c 49 54 45 5f 52 4f 4c 4c 42      SQLITE_ROLLB
9950: 41 43 4b 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  ACK, SQLITE_ABOR
9960: 54 2c 20 53 51 4c 49 54 45 5f 46 41 49 4c 2c 20  T, SQLITE_FAIL, 
9970: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 53  SQLITE_IGNORE, S
9980: 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 0a 20  QLITE_REPLACE . 
9990: 20 7d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   };.#ifdef SQLIT
99a0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
99b0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
99c0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
99d0: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
99e0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
99f0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
9a00: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3d 3d 31 20   OE_Rollback==1 
9a10: 26 26 20 4f 45 5f 41 62 6f 72 74 3d 3d 32 20 26  && OE_Abort==2 &
9a20: 26 20 4f 45 5f 46 61 69 6c 3d 3d 33 20 29 3b 0a  & OE_Fail==3 );.
9a30: 20 20 61 73 73 65 72 74 28 20 4f 45 5f 49 67 6e    assert( OE_Ign
9a40: 6f 72 65 3d 3d 34 20 26 26 20 4f 45 5f 52 65 70  ore==4 && OE_Rep
9a50: 6c 61 63 65 3d 3d 35 20 29 3b 0a 20 20 61 73 73  lace==5 );.  ass
9a60: 65 72 74 28 20 64 62 2d 3e 76 74 61 62 4f 6e 43  ert( db->vtabOnC
9a70: 6f 6e 66 6c 69 63 74 3e 3d 31 20 26 26 20 64 62  onflict>=1 && db
9a80: 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74  ->vtabOnConflict
9a90: 3c 3d 35 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  <=5 );.  return 
9aa0: 28 69 6e 74 29 61 4d 61 70 5b 64 62 2d 3e 76 74  (int)aMap[db->vt
9ab0: 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 2d 31 5d 3b  abOnConflict-1];
9ac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 66  .}../*.** Call f
9ad0: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78  rom within the x
9ae0: 43 72 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e  Create() or xCon
9af0: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 73 20 74  nect() methods t
9b00: 6f 20 70 72 6f 76 69 64 65 20 0a 2a 2a 20 74 68  o provide .** th
9b10: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69  e SQLite core wi
9b20: 74 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  th additional in
9b30: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
9b40: 74 68 65 20 62 65 68 61 76 69 6f 72 0a 2a 2a 20  the behavior.** 
9b50: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
9b60: 61 62 6c 65 20 62 65 69 6e 67 20 69 6d 70 6c 65  able being imple
9b70: 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mented..*/.int s
9b80: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66  qlite3_vtab_conf
9b90: 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ig(sqlite3 *db, 
9ba0: 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
9bb0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
9bc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
9bd0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
9be0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
9bf0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
9c00: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
9c10: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
9c20: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
9c30: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
9c40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
9c50: 6d 75 74 65 78 29 3b 0a 20 20 76 61 5f 73 74 61  mutex);.  va_sta
9c60: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
9c70: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
9c80: 63 61 73 65 20 53 51 4c 49 54 45 5f 56 54 41 42  case SQLITE_VTAB
9c90: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50 50  _CONSTRAINT_SUPP
9ca0: 4f 52 54 3a 20 7b 0a 20 20 20 20 20 20 56 74 61  ORT: {.      Vta
9cb0: 62 43 74 78 20 2a 70 20 3d 20 64 62 2d 3e 70 56  bCtx *p = db->pV
9cc0: 74 61 62 43 74 78 3b 0a 20 20 20 20 20 20 69 66  tabCtx;.      if
9cd0: 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( !p ){.        
9ce0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
9cf0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  SE_BKPT;.      }
9d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
9d10: 73 65 72 74 28 20 70 2d 3e 70 54 61 62 3d 3d 30  sert( p->pTab==0
9d20: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 2d   || IsVirtual(p-
9d30: 3e 70 54 61 62 29 20 29 3b 0a 20 20 20 20 20 20  >pTab) );.      
9d40: 20 20 70 2d 3e 70 56 54 61 62 6c 65 2d 3e 62 43    p->pVTable->bC
9d50: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 28 75 38 29  onstraint = (u8)
9d60: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
9d70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9d80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9d90: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
9da0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  c = SQLITE_MISUS
9db0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 62 72  E_BKPT;.      br
9dc0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  eak;.  }.  va_en
9dd0: 64 28 61 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  d(ap);..  if( rc
9de0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73 71  !=SQLITE_OK ) sq
9df0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
9e00: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
9e10: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9e20: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
9e30: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
9e40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9e50: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a              UALTABLE */.