/ Hex Artifact Content
Login

Artifact 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa:


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 66 6f 72 28 70 56 74 61 62 3d 70 54  ;.  for(pVtab=pT
1450: 61 62 2d 3e 70 56 54 61 62 6c 65 3b 20 70 56 74  ab->pVTable; pVt
1460: 61 62 20 26 26 20 70 56 74 61 62 2d 3e 64 62 21  ab && pVtab->db!
1470: 3d 64 62 3b 20 70 56 74 61 62 3d 70 56 74 61 62  =db; pVtab=pVtab
1480: 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 72 65 74 75  ->pNext);.  retu
1490: 72 6e 20 70 56 74 61 62 3b 0a 7d 0a 0a 2f 2a 0a  rn pVtab;.}../*.
14a0: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
14b0: 20 72 65 66 2d 63 6f 75 6e 74 20 6f 6e 20 61 20   ref-count on a 
14c0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
14d0: 6a 65 63 74 2e 20 57 68 65 6e 20 74 68 65 20 72  ject. When the r
14e0: 65 66 2d 63 6f 75 6e 74 0a 2a 2a 20 72 65 61 63  ef-count.** reac
14f0: 68 65 73 20 7a 65 72 6f 2c 20 63 61 6c 6c 20 74  hes zero, call t
1500: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29  he xDisconnect()
1510: 20 6d 65 74 68 6f 64 20 74 6f 20 64 65 6c 65 74   method to delet
1520: 65 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  e the object..*/
1530: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
1540: 62 55 6e 6c 6f 63 6b 28 56 54 61 62 6c 65 20 2a  bUnlock(VTable *
1550: 70 56 54 61 62 29 7b 0a 20 20 73 71 6c 69 74 65  pVTab){.  sqlite
1560: 33 20 2a 64 62 20 3d 20 70 56 54 61 62 2d 3e 64  3 *db = pVTab->d
1570: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
1580: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
1590: 54 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  Tab->nRef>0 );. 
15a0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67   assert( db->mag
15b0: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
15c0: 5f 4f 50 45 4e 20 7c 7c 20 64 62 2d 3e 6d 61 67  _OPEN || db->mag
15d0: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
15e0: 5f 5a 4f 4d 42 49 45 20 29 3b 0a 0a 20 20 70 56  _ZOMBIE );..  pV
15f0: 54 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  Tab->nRef--;.  i
1600: 66 28 20 70 56 54 61 62 2d 3e 6e 52 65 66 3d 3d  f( pVTab->nRef==
1610: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1620: 5f 76 74 61 62 20 2a 70 20 3d 20 70 56 54 61 62  _vtab *p = pVTab
1630: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 69 66 28  ->pVtab;.    if(
1640: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
1650: 4d 6f 64 75 6c 65 2d 3e 78 44 69 73 63 6f 6e 6e  Module->xDisconn
1660: 65 63 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ect(p);.    }.  
1670: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1680: 64 62 2c 20 70 56 54 61 62 29 3b 0a 20 20 7d 0a  db, pVTab);.  }.
1690: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 70  }../*.** Table p
16a0: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
16b0: 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
16c0: 6f 6e 20 6d 6f 76 65 73 20 61 6c 6c 20 65 6c 65  on moves all ele
16d0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 0a 2a 2a 20  ments in the.** 
16e0: 70 2d 3e 70 56 54 61 62 6c 65 20 6c 69 73 74 20  p->pVTable list 
16f0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 2e 70  to the sqlite3.p
1700: 44 69 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74 73  Disconnect lists
1710: 20 6f 66 20 74 68 65 69 72 20 61 73 73 6f 63 69   of their associ
1720: 61 74 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  ated.** database
1730: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
1740: 62 65 20 64 69 73 63 6f 6e 6e 65 63 74 65 64 20  be disconnected 
1750: 61 74 20 74 68 65 20 6e 65 78 74 20 6f 70 70 6f  at the next oppo
1760: 72 74 75 6e 69 74 79 2e 20 0a 2a 2a 20 45 78 63  rtunity. .** Exc
1770: 65 70 74 2c 20 69 66 20 61 72 67 75 6d 65 6e 74  ept, if argument
1780: 20 64 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   db is not NULL,
1790: 20 74 68 65 6e 20 74 68 65 20 65 6e 74 72 79 20   then the entry 
17a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
17b0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
17c0: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20   is left in the 
17d0: 70 2d 3e 70 56 54 61 62 6c 65 20 6c 69 73 74 2e  p->pVTable list.
17e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 56 54 61 62 6c  .*/.static VTabl
17f0: 65 20 2a 76 74 61 62 44 69 73 63 6f 6e 6e 65 63  e *vtabDisconnec
1800: 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
1810: 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 56  , Table *p){.  V
1820: 54 61 62 6c 65 20 2a 70 52 65 74 20 3d 20 30 3b  Table *pRet = 0;
1830: 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62  .  VTable *pVTab
1840: 6c 65 20 3d 20 70 2d 3e 70 56 54 61 62 6c 65 3b  le = p->pVTable;
1850: 0a 20 20 70 2d 3e 70 56 54 61 62 6c 65 20 3d 20  .  p->pVTable = 
1860: 30 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  0;..  /* Assert 
1870: 74 68 61 74 20 74 68 65 20 6d 75 74 65 78 20 28  that the mutex (
1880: 69 66 20 61 6e 79 29 20 61 73 73 6f 63 69 61 74  if any) associat
1890: 65 64 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ed with the BtSh
18a0: 61 72 65 64 20 64 61 74 61 62 61 73 65 20 0a 20  ared database . 
18b0: 20 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e   ** that contain
18c0: 73 20 74 61 62 6c 65 20 70 20 69 73 20 68 65 6c  s table p is hel
18d0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
18e0: 20 53 65 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   See header comm
18f0: 65 6e 74 73 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ents .  ** above
1900: 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65   function sqlite
1910: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
1920: 29 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  ) for an explana
1930: 74 69 6f 6e 20 6f 66 20 77 68 79 0a 20 20 2a 2a  tion of why.  **
1940: 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 73   this makes it s
1950: 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  afe to access th
1960: 65 20 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f  e sqlite3.pDisco
1970: 6e 6e 65 63 74 20 6c 69 73 74 20 6f 66 20 61 6e  nnect list of an
1980: 79 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  y.  ** database 
1990: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
19a0: 6d 61 79 20 68 61 76 65 20 61 6e 20 65 6e 74 72  may have an entr
19b0: 79 20 69 6e 20 74 68 65 20 70 2d 3e 70 56 54 61  y in the p->pVTa
19c0: 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ble list..  */. 
19d0: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c   assert( db==0 |
19e0: 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  | sqlite3SchemaM
19f0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
1a00: 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 0a  p->pSchema) );..
1a10: 20 20 77 68 69 6c 65 28 20 70 56 54 61 62 6c 65    while( pVTable
1a20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
1a30: 2a 64 62 32 20 3d 20 70 56 54 61 62 6c 65 2d 3e  *db2 = pVTable->
1a40: 64 62 3b 0a 20 20 20 20 56 54 61 62 6c 65 20 2a  db;.    VTable *
1a50: 70 4e 65 78 74 20 3d 20 70 56 54 61 62 6c 65 2d  pNext = pVTable-
1a60: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
1a70: 72 74 28 20 64 62 32 20 29 3b 0a 20 20 20 20 69  rt( db2 );.    i
1a80: 66 28 20 64 62 32 3d 3d 64 62 20 29 7b 0a 20 20  f( db2==db ){.  
1a90: 20 20 20 20 70 52 65 74 20 3d 20 70 56 54 61 62      pRet = pVTab
1aa0: 6c 65 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 54  le;.      p->pVT
1ab0: 61 62 6c 65 20 3d 20 70 52 65 74 3b 0a 20 20 20  able = pRet;.   
1ac0: 20 20 20 70 52 65 74 2d 3e 70 4e 65 78 74 20 3d     pRet->pNext =
1ad0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ae0: 20 20 20 20 20 70 56 54 61 62 6c 65 2d 3e 70 4e       pVTable->pN
1af0: 65 78 74 20 3d 20 64 62 32 2d 3e 70 44 69 73 63  ext = db2->pDisc
1b00: 6f 6e 6e 65 63 74 3b 0a 20 20 20 20 20 20 64 62  onnect;.      db
1b10: 32 2d 3e 70 44 69 73 63 6f 6e 6e 65 63 74 20 3d  2->pDisconnect =
1b20: 20 70 56 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a   pVTable;.    }.
1b30: 20 20 20 20 70 56 54 61 62 6c 65 20 3d 20 70 4e      pVTable = pN
1b40: 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ext;.  }..  asse
1b50: 72 74 28 20 21 64 62 20 7c 7c 20 70 52 65 74 20  rt( !db || pRet 
1b60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
1b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65  ;.}../*.** Table
1b80: 20 2a 70 20 69 73 20 61 20 76 69 72 74 75 61 6c   *p is a virtual
1b90: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
1ba0: 63 74 69 6f 6e 20 72 65 6d 6f 76 65 73 20 74 68  ction removes th
1bb0: 65 20 56 54 61 62 6c 65 20 6f 62 6a 65 63 74 0a  e VTable object.
1bc0: 2a 2a 20 66 6f 72 20 74 61 62 6c 65 20 2a 70 20  ** for table *p 
1bd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1be0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1bf0: 69 6f 6e 20 64 62 20 66 72 6f 6d 20 74 68 65 20  ion db from the 
1c00: 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 69  linked.** list i
1c10: 6e 20 70 2d 3e 70 56 54 61 62 2e 20 49 74 20 61  n p->pVTab. It a
1c20: 6c 73 6f 20 64 65 63 72 65 6d 65 6e 74 73 20 74  lso decrements t
1c30: 68 65 20 56 54 61 62 6c 65 20 72 65 66 20 63 6f  he VTable ref co
1c40: 75 6e 74 2e 20 54 68 69 73 20 69 73 0a 2a 2a 20  unt. This is.** 
1c50: 75 73 65 64 20 77 68 65 6e 20 63 6c 6f 73 69 6e  used when closin
1c60: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
1c70: 63 74 69 6f 6e 20 64 62 20 74 6f 20 66 72 65 65  ction db to free
1c80: 20 61 6c 6c 20 6f 66 20 69 74 73 20 56 54 61 62   all of its VTab
1c90: 6c 65 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 69  le.** objects wi
1ca0: 74 68 6f 75 74 20 64 69 73 74 75 72 62 69 6e 67  thout disturbing
1cb0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1cc0: 20 53 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28   Schema object (
1cd0: 77 68 69 63 68 20 6d 61 79 0a 2a 2a 20 62 65 20  which may.** be 
1ce0: 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 6f 74  being used by ot
1cf0: 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1d00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 29 2e 0a 2a   connections)..*
1d10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
1d20: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c  abDisconnect(sql
1d30: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
1d40: 2a 70 29 7b 0a 20 20 56 54 61 62 6c 65 20 2a 2a  *p){.  VTable **
1d50: 70 70 56 54 61 62 3b 0a 0a 20 20 61 73 73 65 72  ppVTab;..  asser
1d60: 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 29 20  t( IsVirtual(p) 
1d70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1d80: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
1d90: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
1da0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1db0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
1dc0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 66 6f  >mutex) );..  fo
1dd0: 72 28 70 70 56 54 61 62 3d 26 70 2d 3e 70 56 54  r(ppVTab=&p->pVT
1de0: 61 62 6c 65 3b 20 2a 70 70 56 54 61 62 3b 20 70  able; *ppVTab; p
1df0: 70 56 54 61 62 3d 26 28 2a 70 70 56 54 61 62 29  pVTab=&(*ppVTab)
1e00: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1e10: 28 20 28 2a 70 70 56 54 61 62 29 2d 3e 64 62 3d  ( (*ppVTab)->db=
1e20: 3d 64 62 20 20 29 7b 0a 20 20 20 20 20 20 56 54  =db  ){.      VT
1e30: 61 62 6c 65 20 2a 70 56 54 61 62 20 3d 20 2a 70  able *pVTab = *p
1e40: 70 56 54 61 62 3b 0a 20 20 20 20 20 20 2a 70 70  pVTab;.      *pp
1e50: 56 54 61 62 20 3d 20 70 56 54 61 62 2d 3e 70 4e  VTab = pVTab->pN
1e60: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1e70: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 70 56 54  e3VtabUnlock(pVT
1e80: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
1e90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
1ea0: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
1eb0: 20 61 6c 6c 20 74 68 65 20 76 69 72 74 75 61 6c   all the virtual
1ec0: 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69   table objects i
1ed0: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e 70 44  n the sqlite3.pD
1ee0: 69 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74 2e 0a  isconnect list..
1ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1f00: 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ion may only be 
1f10: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
1f20: 6d 75 74 65 78 65 73 20 61 73 73 6f 63 69 61 74  mutexes associat
1f30: 65 64 20 77 69 74 68 20 61 6c 6c 0a 2a 2a 20 73  ed with all.** s
1f40: 68 61 72 65 64 20 62 2d 74 72 65 65 20 64 61 74  hared b-tree dat
1f50: 61 62 61 73 65 73 20 6f 70 65 6e 65 64 20 75 73  abases opened us
1f60: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ing connection d
1f70: 62 20 61 72 65 20 68 65 6c 64 20 62 79 20 74 68  b are held by th
1f80: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 2e 20 54 68  e .** caller. Th
1f90: 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 70 72  is is done to pr
1fa0: 6f 74 65 63 74 20 74 68 65 20 73 71 6c 69 74 65  otect the sqlite
1fb0: 33 2e 70 44 69 73 63 6f 6e 6e 65 63 74 20 6c 69  3.pDisconnect li
1fc0: 73 74 2e 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  st. The.** sqlit
1fd0: 65 33 2e 70 44 69 73 63 6f 6e 6e 65 63 74 20 6c  e3.pDisconnect l
1fe0: 69 73 74 20 69 73 20 61 63 63 65 73 73 65 64 20  ist is accessed 
1ff0: 6f 6e 6c 79 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  only as follows:
2000: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 42 79 20 74  .**.**   1) By t
2010: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  his function. In
2020: 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20   this case, all 
2030: 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 65 73  BtShared mutexes
2040: 20 61 6e 64 20 74 68 65 20 6d 75 74 65 78 0a 2a   and the mutex.*
2050: 2a 20 20 20 20 20 20 61 73 73 6f 63 69 61 74 65  *      associate
2060: 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
2070: 61 73 65 20 68 61 6e 64 6c 65 20 69 74 73 65 6c  ase handle itsel
2080: 66 20 6d 75 73 74 20 62 65 20 68 65 6c 64 2e 0a  f must be held..
2090: 2a 2a 0a 2a 2a 20 20 20 32 29 20 42 79 20 66 75  **.**   2) By fu
20a0: 6e 63 74 69 6f 6e 20 76 74 61 62 44 69 73 63 6f  nction vtabDisco
20b0: 6e 6e 65 63 74 41 6c 6c 28 29 2c 20 77 68 65 6e  nnectAll(), when
20c0: 20 69 74 20 61 64 64 73 20 61 20 56 54 61 62 6c   it adds a VTabl
20d0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 20 20  e entry to.**   
20e0: 20 20 20 74 68 65 20 73 71 6c 69 74 65 33 2e 70     the sqlite3.p
20f0: 44 69 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74 2e  Disconnect list.
2100: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 69   In this case ei
2110: 74 68 65 72 20 74 68 65 20 42 74 53 68 61 72 65  ther the BtShare
2120: 64 20 6d 75 74 65 78 0a 2a 2a 20 20 20 20 20 20  d mutex.**      
2130: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2140: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 65  the database the
2150: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
2160: 73 20 73 74 6f 72 65 64 20 69 6e 20 69 73 20 68  s stored in is h
2170: 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 72 2c 20  eld.**      or, 
2180: 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  if the virtual t
2190: 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69  able is stored i
21a0: 6e 20 61 20 6e 6f 6e 2d 73 68 61 72 61 62 6c 65  n a non-sharable
21b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
21c0: 2a 2a 20 20 20 20 20 20 74 68 65 20 64 61 74 61  **      the data
21d0: 62 61 73 65 20 68 61 6e 64 6c 65 20 6d 75 74 65  base handle mute
21e0: 78 20 69 73 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  x is held..**.**
21f0: 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 61 20   As a result, a 
2200: 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e 6e  sqlite3.pDisconn
2210: 65 63 74 20 63 61 6e 6e 6f 74 20 62 65 20 61 63  ect cannot be ac
2220: 63 65 73 73 65 64 20 73 69 6d 75 6c 74 61 6e 65  cessed simultane
2230: 6f 75 73 6c 79 20 0a 2a 2a 20 62 79 20 6d 75 6c  ously .** by mul
2240: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 20 49  tiple threads. I
2250: 74 20 69 73 20 74 68 72 65 61 64 2d 73 61 66 65  t is thread-safe
2260: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2270: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
2280: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2290: 56 54 61 62 6c 65 20 2a 70 20 3d 20 64 62 2d 3e  VTable *p = db->
22a0: 70 44 69 73 63 6f 6e 6e 65 63 74 3b 0a 20 20 64  pDisconnect;.  d
22b0: 62 2d 3e 70 44 69 73 63 6f 6e 6e 65 63 74 20 3d  b->pDisconnect =
22c0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
22d0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
22e0: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
22f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2300: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
2310: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
2320: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
2330: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
2340: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c  edStatements(db,
2350: 20 30 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20   0);.    do {.  
2360: 20 20 20 20 56 54 61 62 6c 65 20 2a 70 4e 65 78      VTable *pNex
2370: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
2380: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 55      sqlite3VtabU
2390: 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 20 20 20 20  nlock(p);.      
23a0: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  p = pNext;.    }
23b0: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a  while( p );.  }.
23c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
23d0: 6e 79 20 61 6e 64 20 61 6c 6c 20 76 69 72 74 75  ny and all virtu
23e0: 61 6c 2d 74 61 62 6c 65 20 69 6e 66 6f 72 6d 61  al-table informa
23f0: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 54 61  tion from the Ta
2400: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 54  ble record..** T
2410: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2420: 61 6c 6c 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  alled, for examp
2430: 6c 65 2c 20 6a 75 73 74 20 62 65 66 6f 72 65 20  le, just before 
2440: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
2450: 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a  le.** record..**
2460: 0a 2a 2a 20 53 69 6e 63 65 20 69 74 20 69 73 20  .** Since it is 
2470: 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2c  a virtual-table,
2480: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2490: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ture contains a 
24a0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
24b0: 65 20 68 65 61 64 20 6f 66 20 61 20 6c 69 6e 6b  e head of a link
24c0: 65 64 20 6c 69 73 74 20 6f 66 20 56 54 61 62 6c  ed list of VTabl
24d0: 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 45 61  e structures. Ea
24e0: 63 68 20 56 54 61 62 6c 65 20 0a 2a 2a 20 73 74  ch VTable .** st
24f0: 72 75 63 74 75 72 65 20 69 73 20 61 73 73 6f 63  ructure is assoc
2500: 69 61 74 65 64 20 77 69 74 68 20 61 20 73 69 6e  iated with a sin
2510: 67 6c 65 20 73 71 6c 69 74 65 33 2a 20 75 73 65  gle sqlite3* use
2520: 72 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e  r of the schema.
2530: 0a 2a 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63  .** The referenc
2540: 65 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 56  e count of the V
2550: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2560: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2570: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
2580: 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 64 65  nection db is de
2590: 63 72 65 6d 65 6e 74 65 64 20 69 6d 6d 65 64 69  cremented immedi
25a0: 61 74 65 6c 79 20 28 77 68 69 63 68 20 6d 61 79  ately (which may
25b0: 20 6c 65 61 64 20 74 6f 20 74 68 65 20 0a 2a 2a   lead to the .**
25c0: 20 73 74 72 75 63 74 75 72 65 20 62 65 69 6e 67   structure being
25d0: 20 78 44 69 73 63 6f 6e 6e 65 63 74 65 64 20 61   xDisconnected a
25e0: 6e 64 20 66 72 65 65 29 2e 20 41 6e 79 20 6f 74  nd free). Any ot
25f0: 68 65 72 20 56 54 61 62 6c 65 20 73 74 72 75 63  her VTable struc
2600: 74 75 72 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  tures.** in the 
2610: 6c 69 73 74 20 61 72 65 20 6d 6f 76 65 64 20 74  list are moved t
2620: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 2e 70 44  o the sqlite3.pD
2630: 69 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74 20 6f  isconnect list o
2640: 66 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  f the associated
2650: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f   .** database co
2660: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
2670: 64 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65  d sqlite3VtabCle
2680: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
2690: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 66 28  Table *p){.  if(
26a0: 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79   !db || db->pnBy
26b0: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 76 74  tesFreed==0 ) vt
26c0: 61 62 44 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 28  abDisconnectAll(
26d0: 30 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  0, p);.  if( p->
26e0: 61 7a 4d 6f 64 75 6c 65 41 72 67 20 29 7b 0a 20  azModuleArg ){. 
26f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
2700: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 6f 64  r(i=0; i<p->nMod
2710: 75 6c 65 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  uleArg; i++){.  
2720: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 73      if( i!=1 ) s
2730: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2740: 20 70 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b   p->azModuleArg[
2750: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
2760: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2770: 20 70 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 29   p->azModuleArg)
2780: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2790: 64 64 20 61 20 6e 65 77 20 6d 6f 64 75 6c 65 20  dd a new module 
27a0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 54 61 62  argument to pTab
27b0: 6c 65 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b  le->azModuleArg[
27c0: 5d 2e 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e 67  ]..** The string
27d0: 20 69 73 20 6e 6f 74 20 63 6f 70 69 65 64 20 2d   is not copied -
27e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
27f0: 73 74 6f 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20  stored.  The.** 
2800: 73 74 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 66  string will be f
2810: 72 65 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  reed automatical
2820: 6c 79 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c  ly when the tabl
2830: 65 20 69 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e  e is.** deleted.
2840: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2850: 61 64 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e  addModuleArgumen
2860: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  t(sqlite3 *db, T
2870: 61 62 6c 65 20 2a 70 54 61 62 6c 65 2c 20 63 68  able *pTable, ch
2880: 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74  ar *zArg){.  int
2890: 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
28a0: 28 63 68 61 72 20 2a 29 2a 28 32 2b 70 54 61 62  (char *)*(2+pTab
28b0: 6c 65 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 29 3b  le->nModuleArg);
28c0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 4d 6f 64 75  .  char **azModu
28d0: 6c 65 41 72 67 3b 0a 20 20 61 7a 4d 6f 64 75 6c  leArg;.  azModul
28e0: 65 41 72 67 20 3d 20 73 71 6c 69 74 65 33 44 62  eArg = sqlite3Db
28f0: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 54 61 62  Realloc(db, pTab
2900: 6c 65 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 2c  le->azModuleArg,
2910: 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20   nBytes);.  if( 
2920: 61 7a 4d 6f 64 75 6c 65 41 72 67 3d 3d 30 20 29  azModuleArg==0 )
2930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2940: 72 65 65 28 64 62 2c 20 7a 41 72 67 29 3b 0a 20  ree(db, zArg);. 
2950: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
2960: 69 20 3d 20 70 54 61 62 6c 65 2d 3e 6e 4d 6f 64  i = pTable->nMod
2970: 75 6c 65 41 72 67 2b 2b 3b 0a 20 20 20 20 61 7a  uleArg++;.    az
2980: 4d 6f 64 75 6c 65 41 72 67 5b 69 5d 20 3d 20 7a  ModuleArg[i] = z
2990: 41 72 67 3b 0a 20 20 20 20 61 7a 4d 6f 64 75 6c  Arg;.    azModul
29a0: 65 41 72 67 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  eArg[i+1] = 0;. 
29b0: 20 20 20 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64     pTable->azMod
29c0: 75 6c 65 41 72 67 20 3d 20 61 7a 4d 6f 64 75 6c  uleArg = azModul
29d0: 65 41 72 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eArg;.  }.}../*.
29e0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
29f0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
2a00: 20 77 68 65 6e 20 69 74 20 66 69 72 73 74 20 73   when it first s
2a10: 65 65 73 20 61 20 43 52 45 41 54 45 20 56 49 52  ees a CREATE VIR
2a20: 54 55 41 4c 20 54 41 42 4c 45 0a 2a 2a 20 73 74  TUAL TABLE.** st
2a30: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 6d 6f  atement.  The mo
2a40: 64 75 6c 65 20 6e 61 6d 65 20 68 61 73 20 62 65  dule name has be
2a50: 65 6e 20 70 61 72 73 65 64 2c 20 62 75 74 20 74  en parsed, but t
2a60: 68 65 20 6f 70 74 69 6f 6e 61 6c 20 6c 69 73 74  he optional list
2a70: 0a 2a 2a 20 6f 66 20 70 61 72 61 6d 65 74 65 72  .** of parameter
2a80: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
2a90: 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 61 72  e module name ar
2aa0: 65 20 73 74 69 6c 6c 20 70 65 6e 64 69 6e 67 2e  e still pending.
2ab0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2ac0: 56 74 61 62 42 65 67 69 6e 50 61 72 73 65 28 0a  VtabBeginParse(.
2ad0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2ae0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
2af0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2b00: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
2b10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2b20: 20 6e 65 77 20 74 61 62 6c 65 2c 20 6f 72 20 64   new table, or d
2b30: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
2b40: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
2b50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2b60: 6f 66 20 6e 65 77 20 74 61 62 6c 65 20 6f 72 20  of new table or 
2b70: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
2b80: 2a 70 4d 6f 64 75 6c 65 4e 61 6d 65 2c 20 20 20  *pModuleName,   
2b90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
2ba0: 6f 64 75 6c 65 20 66 6f 72 20 74 68 65 20 76 69  odule for the vi
2bb0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
2bc0: 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 73   int ifNotExists
2bd0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 65 72 72         /* No err
2be0: 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2bf0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
2c00: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
2c10: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
2c20: 54 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20  The new virtual 
2c30: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
2c40: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
2c50: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2c60: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 73 71  nection */..  sq
2c70: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
2c80: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
2c90: 70 4e 61 6d 65 32 2c 20 30 2c 20 30 2c 20 31 2c  pName2, 0, 0, 1,
2ca0: 20 69 66 4e 6f 74 45 78 69 73 74 73 29 3b 0a 20   ifNotExists);. 
2cb0: 20 70 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65   pTable = pParse
2cc0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
2cd0: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
2ce0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
2cf0: 20 30 3d 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64   0==pTable->pInd
2d00: 65 78 20 29 3b 0a 0a 20 20 64 62 20 3d 20 70 50  ex );..  db = pP
2d10: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
2d20: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 4d 6f  ert( pTable->nMo
2d30: 64 75 6c 65 41 72 67 3d 3d 30 20 29 3b 0a 20 20  duleArg==0 );.  
2d40: 61 64 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e  addModuleArgumen
2d50: 74 28 64 62 2c 20 70 54 61 62 6c 65 2c 20 73 71  t(db, pTable, sq
2d60: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
2d70: 65 6e 28 64 62 2c 20 70 4d 6f 64 75 6c 65 4e 61  en(db, pModuleNa
2d80: 6d 65 29 29 3b 0a 20 20 61 64 64 4d 6f 64 75 6c  me));.  addModul
2d90: 65 41 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 54  eArgument(db, pT
2da0: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 61 64 64 4d  able, 0);.  addM
2db0: 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62  oduleArgument(db
2dc0: 2c 20 70 54 61 62 6c 65 2c 20 73 71 6c 69 74 65  , pTable, sqlite
2dd0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 54  3DbStrDup(db, pT
2de0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  able->zName));. 
2df0: 20 61 73 73 65 72 74 28 20 28 70 50 61 72 73 65   assert( (pParse
2e00: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3d 3d  ->sNameToken.z==
2e10: 70 4e 61 6d 65 32 2d 3e 7a 20 26 26 20 70 4e 61  pName2->z && pNa
2e20: 6d 65 32 2d 3e 7a 21 3d 30 29 0a 20 20 20 20 20  me2->z!=0).     
2e30: 20 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 73 4e    || (pParse->sN
2e40: 61 6d 65 54 6f 6b 65 6e 2e 7a 3d 3d 70 4e 61 6d  ameToken.z==pNam
2e50: 65 31 2d 3e 7a 20 26 26 20 70 4e 61 6d 65 32 2d  e1->z && pName2-
2e60: 3e 7a 3d 3d 30 29 0a 20 20 29 3b 0a 20 20 70 50  >z==0).  );.  pP
2e70: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
2e80: 2e 6e 20 3d 20 28 69 6e 74 29 28 0a 20 20 20 20  .n = (int)(.    
2e90: 20 20 26 70 4d 6f 64 75 6c 65 4e 61 6d 65 2d 3e    &pModuleName->
2ea0: 7a 5b 70 4d 6f 64 75 6c 65 4e 61 6d 65 2d 3e 6e  z[pModuleName->n
2eb0: 5d 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  ] - pParse->sNam
2ec0: 65 54 6f 6b 65 6e 2e 7a 0a 20 20 29 3b 0a 0a 23  eToken.z.  );..#
2ed0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ee0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
2ef0: 0a 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61  .  /* Creating a
2f00: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
2f10: 6e 76 6f 6b 65 73 20 74 68 65 20 61 75 74 68 6f  nvokes the autho
2f20: 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
2f30: 6b 20 74 77 69 63 65 2e 0a 20 20 2a 2a 20 54 68  k twice..  ** Th
2f40: 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
2f50: 6f 6e 2c 20 74 6f 20 6f 62 74 61 69 6e 20 70 65  on, to obtain pe
2f60: 72 6d 69 73 73 69 6f 6e 20 74 6f 20 49 4e 53 45  rmission to INSE
2f70: 52 54 20 61 20 72 6f 77 20 69 6e 74 6f 20 74 68  RT a row into th
2f80: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
2f90: 73 74 65 72 20 74 61 62 6c 65 2c 20 68 61 73 20  ster table, has 
2fa0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
2fb0: 65 20 62 79 20 73 71 6c 69 74 65 33 53 74 61 72  e by sqlite3Star
2fc0: 74 54 61 62 6c 65 28 29 2e 0a 20 20 2a 2a 20 54  tTable()..  ** T
2fd0: 68 65 20 73 65 63 6f 6e 64 20 63 61 6c 6c 2c 20  he second call, 
2fe0: 74 6f 20 6f 62 74 61 69 6e 20 70 65 72 6d 69 73  to obtain permis
2ff0: 73 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 74  sion to create t
3000: 68 65 20 74 61 62 6c 65 2c 20 69 73 20 6d 61 64  he table, is mad
3010: 65 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  e now..  */.  if
3020: 28 20 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64 75  ( pTable->azModu
3030: 6c 65 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74  leArg ){.    int
3040: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
3050: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
3060: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
3070: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
3080: 62 3e 3d 30 20 29 3b 20 2f 2a 20 54 68 65 20 64  b>=0 ); /* The d
3090: 61 74 61 62 61 73 65 20 74 68 65 20 74 61 62 6c  atabase the tabl
30a0: 65 20 69 73 20 62 65 69 6e 67 20 63 72 65 61 74  e is being creat
30b0: 65 64 20 69 6e 20 2a 2f 0a 20 20 20 20 73 71 6c  ed in */.    sql
30c0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
30d0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 52 45  arse, SQLITE_CRE
30e0: 41 54 45 5f 56 54 41 42 4c 45 2c 20 70 54 61 62  ATE_VTABLE, pTab
30f0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  le->zName, .    
3100: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
3110: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 2c 20  azModuleArg[0], 
3120: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
3130: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a  iDb].zDbSName);.
3140: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
3150: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3160: 20 74 61 6b 65 73 20 74 68 65 20 6d 6f 64 75 6c   takes the modul
3170: 65 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  e argument that 
3180: 68 61 73 20 62 65 65 6e 20 61 63 63 75 6d 75 6c  has been accumul
3190: 61 74 69 6e 67 0a 2a 2a 20 69 6e 20 70 50 61 72  ating.** in pPar
31a0: 73 65 2d 3e 7a 41 72 67 5b 5d 20 61 6e 64 20 61  se->zArg[] and a
31b0: 70 70 65 6e 64 73 20 69 74 20 74 6f 20 74 68 65  ppends it to the
31c0: 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e   list of argumen
31d0: 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 69 72  ts on the.** vir
31e0: 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 72 65  tual table curre
31f0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
3200: 72 75 63 74 69 6f 6e 20 69 6e 20 70 50 61 72 73  ruction in pPars
3210: 65 2d 3e 70 54 61 62 6c 65 2e 0a 2a 2f 0a 73 74  e->pTable..*/.st
3220: 61 74 69 63 20 76 6f 69 64 20 61 64 64 41 72 67  atic void addArg
3230: 75 6d 65 6e 74 54 6f 56 74 61 62 28 50 61 72 73  umentToVtab(Pars
3240: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
3250: 28 20 70 50 61 72 73 65 2d 3e 73 41 72 67 2e 7a  ( pParse->sArg.z
3260: 20 26 26 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   && pParse->pNew
3270: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 63 6f 6e  Table ){.    con
3280: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
3290: 6e 73 74 20 63 68 61 72 2a 29 70 50 61 72 73 65  nst char*)pParse
32a0: 2d 3e 73 41 72 67 2e 7a 3b 0a 20 20 20 20 69 6e  ->sArg.z;.    in
32b0: 74 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 73 41  t n = pParse->sA
32c0: 72 67 2e 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  rg.n;.    sqlite
32d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
32e0: 64 62 3b 0a 20 20 20 20 61 64 64 4d 6f 64 75 6c  db;.    addModul
32f0: 65 41 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 50  eArgument(db, pP
3300: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2c  arse->pNewTable,
3310: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
3320: 70 28 64 62 2c 20 7a 2c 20 6e 29 29 3b 0a 20 20  p(db, z, n));.  
3330: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
3340: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
3350: 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 74   routine after t
3360: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
3370: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
3380: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 6f  t.** has been co
3390: 6d 70 6c 65 74 65 6c 79 20 70 61 72 73 65 64 2e  mpletely parsed.
33a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
33b0: 56 74 61 62 46 69 6e 69 73 68 50 61 72 73 65 28  VtabFinishParse(
33c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
33d0: 6f 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54  oken *pEnd){.  T
33e0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
33f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 20  rse->pNewTable; 
3400: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
3410: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
3420: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
3430: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
3440: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
3450: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3460: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 54 61 62  n */..  if( pTab
3470: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3480: 61 64 64 41 72 67 75 6d 65 6e 74 54 6f 56 74 61  addArgumentToVta
3490: 62 28 70 50 61 72 73 65 29 3b 0a 20 20 70 50 61  b(pParse);.  pPa
34a0: 72 73 65 2d 3e 73 41 72 67 2e 7a 20 3d 20 30 3b  rse->sArg.z = 0;
34b0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 4d 6f  .  if( pTab->nMo
34c0: 64 75 6c 65 41 72 67 3c 31 20 29 20 72 65 74 75  duleArg<1 ) retu
34d0: 72 6e 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74  rn;.  .  /* If t
34e0: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
34f0: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
3500: 74 20 69 73 20 62 65 69 6e 67 20 65 6e 74 65 72  t is being enter
3510: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
3520: 66 69 72 73 74 20 74 69 6d 65 20 28 69 6e 20 6f  first time (in o
3530: 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 74 68  ther words if th
3540: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
3550: 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
3560: 67 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 6e  g.  ** created n
3570: 6f 77 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75  ow instead of ju
3580: 73 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 75  st being read ou
3590: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 61 73 74  t of sqlite_mast
35a0: 65 72 29 20 74 68 65 6e 0a 20 20 2a 2a 20 64 6f  er) then.  ** do
35b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 69 74   additional init
35c0: 69 61 6c 69 7a 61 74 69 6f 6e 20 77 6f 72 6b 20  ialization work 
35d0: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 73 74  and store the st
35e0: 61 74 65 6d 65 6e 74 20 74 65 78 74 0a 20 20 2a  atement text.  *
35f0: 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  * in the sqlite_
3600: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
3610: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
3620: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 63  it.busy ){.    c
3630: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
3640: 63 68 61 72 20 2a 7a 57 68 65 72 65 3b 0a 20 20  char *zWhere;.  
3650: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69    int iDb;.    i
3660: 6e 74 20 69 52 65 67 3b 0a 20 20 20 20 56 64 62  nt iReg;.    Vdb
3670: 65 20 2a 76 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  e *v;..    /* Co
3680: 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
3690: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
36a0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
36b0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
36c0: 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
36d0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73  .      pParse->s
36e0: 4e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 28 69  NameToken.n = (i
36f0: 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 50  nt)(pEnd->z - pP
3700: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
3710: 2e 7a 29 20 2b 20 70 45 6e 64 2d 3e 6e 3b 0a 20  .z) + pEnd->n;. 
3720: 20 20 20 7d 0a 20 20 20 20 7a 53 74 6d 74 20 3d     }.    zStmt =
3730: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
3740: 64 62 2c 20 22 43 52 45 41 54 45 20 56 49 52 54  db, "CREATE VIRT
3750: 55 41 4c 20 54 41 42 4c 45 20 25 54 22 2c 20 26  UAL TABLE %T", &
3760: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
3770: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 73  en);..    /* A s
3780: 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
3790: 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
37a0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
37b0: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
37c0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
37d0: 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
37e0: 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
37f0: 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
3800: 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
3810: 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
3820: 74 65 64 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ted.  .    **.  
3830: 20 20 2a 2a 20 54 68 65 20 56 4d 20 72 65 67 69    ** The VM regi
3840: 73 74 65 72 20 6e 75 6d 62 65 72 20 70 50 61 72  ster number pPar
3850: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 68 6f 6c  se->regRowid hol
3860: 64 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  ds the rowid of 
3870: 61 6e 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  an.    ** entry 
3880: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
3890: 73 74 65 72 20 74 61 62 6c 65 20 74 68 74 20 77  ster table tht w
38a0: 61 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  as created for t
38b0: 68 69 73 20 76 74 61 62 0a 20 20 20 20 2a 2a 20  his vtab.    ** 
38c0: 62 79 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  by sqlite3StartT
38d0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  able()..    */. 
38e0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
38f0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
3900: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
3910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
3920: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
3930: 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
3940: 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
3950: 22 53 45 54 20 74 79 70 65 3d 27 74 61 62 6c 65  "SET type='table
3960: 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
3970: 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
3980: 65 3d 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20  e=0, sql=%Q ".  
3990: 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69       "WHERE rowi
39a0: 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62  d=#%d",.      db
39b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
39c0: 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
39d0: 2c 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ,.      pTab->zN
39e0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 54 61 62 2d  ame,.      pTab-
39f0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53  >zName,.      zS
3a00: 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
3a10: 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
3a20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
3a30: 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
3a40: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
3a50: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
3a60: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
3a70: 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
3a80: 20 69 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c 69   iDb);..    sqli
3a90: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
3aa0: 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20   OP_Expire);.   
3ab0: 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
3ac0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
3ad0: 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
3ae0: 3d 27 74 61 62 6c 65 27 22 2c 20 70 54 61 62 2d  ='table'", pTab-
3af0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
3b00: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
3b10: 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
3b20: 20 7a 57 68 65 72 65 29 3b 0a 0a 20 20 20 20 69   zWhere);..    i
3b30: 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
3b40: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
3b50: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
3b60: 76 2c 20 69 52 65 67 2c 20 70 54 61 62 2d 3e 7a  v, iReg, pTab->z
3b70: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
3b80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3b90: 4f 50 5f 56 43 72 65 61 74 65 2c 20 69 44 62 2c  OP_VCreate, iDb,
3ba0: 20 69 52 65 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f   iReg);.  }..  /
3bb0: 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 72 65  * If we are rere
3bc0: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
3bd0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 63 72  _master table cr
3be0: 65 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  eate the in-memo
3bf0: 72 79 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 6f  ry.  ** record o
3c00: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 65  f the table. The
3c10: 20 78 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68   xConnect() meth
3c20: 6f 64 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  od is not called
3c30: 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 74 68 65 20   until.  ** the 
3c40: 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 76  first time the v
3c50: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
3c60: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 20 73  used in an SQL s
3c70: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 0a 20  tatement. This. 
3c80: 20 2a 2a 20 61 6c 6c 6f 77 73 20 61 20 73 63 68   ** allows a sch
3c90: 65 6d 61 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ema that contain
3ca0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  s virtual tables
3cb0: 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 62 65   to be loaded be
3cc0: 66 6f 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 65  fore.  ** the re
3cd0: 71 75 69 72 65 64 20 76 69 72 74 75 61 6c 20 74  quired virtual t
3ce0: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
3cf0: 69 6f 6e 73 20 61 72 65 20 72 65 67 69 73 74 65  ions are registe
3d00: 72 65 64 2e 20 20 2a 2f 0a 20 20 65 6c 73 65 20  red.  */.  else 
3d10: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
3d20: 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
3d30: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
3d40: 53 63 68 65 6d 61 3b 0a 20 20 20 20 63 6f 6e 73  Schema;.    cons
3d50: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
3d60: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
3d70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3d80: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3d90: 64 62 2c 20 30 2c 20 70 53 63 68 65 6d 61 29 20  db, 0, pSchema) 
3da0: 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
3db0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3dc0: 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
3dd0: 68 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 29 3b  h, zName, pTab);
3de0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
3df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
3e00: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
3e10: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 3d 3d    assert( pTab==
3e20: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
3e30: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
3e40: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
3e50: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
3e60: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3e70: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
3e80: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  able = 0;.  }.}.
3e90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
3ea0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
3eb0: 74 69 6e 65 20 77 68 65 6e 20 69 74 20 73 65 65  tine when it see
3ec0: 73 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b 65  s the first toke
3ed0: 6e 0a 2a 2a 20 6f 66 20 61 6e 20 61 72 67 75 6d  n.** of an argum
3ee0: 65 6e 74 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c  ent to the modul
3ef0: 65 20 6e 61 6d 65 20 69 6e 20 61 20 43 52 45 41  e name in a CREA
3f00: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
3f10: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
3f20: 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 41  oid sqlite3VtabA
3f30: 72 67 49 6e 69 74 28 50 61 72 73 65 20 2a 70 50  rgInit(Parse *pP
3f40: 61 72 73 65 29 7b 0a 20 20 61 64 64 41 72 67 75  arse){.  addArgu
3f50: 6d 65 6e 74 54 6f 56 74 61 62 28 70 50 61 72 73  mentToVtab(pPars
3f60: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 73 41  e);.  pParse->sA
3f70: 72 67 2e 7a 20 3d 20 30 3b 0a 20 20 70 50 61 72  rg.z = 0;.  pPar
3f80: 73 65 2d 3e 73 41 72 67 2e 6e 20 3d 20 30 3b 0a  se->sArg.n = 0;.
3f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  }../*.** The par
3fa0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
3fb0: 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20  outine for each 
3fc0: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
3fd0: 66 69 72 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69  first token.** i
3fe0: 6e 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  n an argument to
3ff0: 20 74 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   the module name
4000: 20 69 6e 20 61 20 43 52 45 41 54 45 20 56 49 52   in a CREATE VIR
4010: 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65  TUAL TABLE state
4020: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
4030: 6c 69 74 65 33 56 74 61 62 41 72 67 45 78 74 65  lite3VtabArgExte
4040: 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
4050: 2c 20 54 6f 6b 65 6e 20 2a 70 29 7b 0a 20 20 54  , Token *p){.  T
4060: 6f 6b 65 6e 20 2a 70 41 72 67 20 3d 20 26 70 50  oken *pArg = &pP
4070: 61 72 73 65 2d 3e 73 41 72 67 3b 0a 20 20 69 66  arse->sArg;.  if
4080: 28 20 70 41 72 67 2d 3e 7a 3d 3d 30 20 29 7b 0a  ( pArg->z==0 ){.
4090: 20 20 20 20 70 41 72 67 2d 3e 7a 20 3d 20 70 2d      pArg->z = p-
40a0: 3e 7a 3b 0a 20 20 20 20 70 41 72 67 2d 3e 6e 20  >z;.    pArg->n 
40b0: 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 65 6c 73 65 7b  = p->n;.  }else{
40c0: 0a 20 20 20 20 61 73 73 65 72 74 28 70 41 72 67  .    assert(pArg
40d0: 2d 3e 7a 20 3c 3d 20 70 2d 3e 7a 29 3b 0a 20 20  ->z <= p->z);.  
40e0: 20 20 70 41 72 67 2d 3e 6e 20 3d 20 28 69 6e 74    pArg->n = (int
40f0: 29 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 2d 20  )(&p->z[p->n] - 
4100: 70 41 72 67 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a  pArg->z);.  }.}.
4110: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20  ./*.** Invoke a 
4120: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
4130: 6e 73 74 72 75 63 74 6f 72 20 28 65 69 74 68 65  nstructor (eithe
4140: 72 20 78 43 72 65 61 74 65 20 6f 72 20 78 43 6f  r xCreate or xCo
4150: 6e 6e 65 63 74 29 2e 20 54 68 65 0a 2a 2a 20 70  nnect). The.** p
4160: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75  ointer to the fu
4170: 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65  nction to invoke
4180: 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
4190: 65 20 66 6f 75 72 74 68 20 70 61 72 61 6d 65 74  e fourth paramet
41a0: 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20 70 72  er.** to this pr
41b0: 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ocedure..*/.stat
41c0: 69 63 20 69 6e 74 20 76 74 61 62 43 61 6c 6c 43  ic int vtabCallC
41d0: 6f 6e 73 74 72 75 63 74 6f 72 28 0a 20 20 73 71  onstructor(.  sq
41e0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 54 61  lite3 *db, .  Ta
41f0: 62 6c 65 20 2a 70 54 61 62 2c 0a 20 20 4d 6f 64  ble *pTab,.  Mod
4200: 75 6c 65 20 2a 70 4d 6f 64 2c 0a 20 20 69 6e 74  ule *pMod,.  int
4210: 20 28 2a 78 43 6f 6e 73 74 72 75 63 74 29 28 73   (*xConstruct)(s
4220: 71 6c 69 74 65 33 2a 2c 76 6f 69 64 2a 2c 69 6e  qlite3*,void*,in
4230: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 63 6f 6e  t,const char*con
4240: 73 74 2a 2c 73 71 6c 69 74 65 33 5f 76 74 61 62  st*,sqlite3_vtab
4250: 2a 2a 2c 63 68 61 72 2a 2a 29 2c 0a 20 20 63 68  **,char**),.  ch
4260: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
4270: 56 74 61 62 43 74 78 20 73 43 74 78 3b 0a 20 20  VtabCtx sCtx;.  
4280: 56 54 61 62 6c 65 20 2a 70 56 54 61 62 6c 65 3b  VTable *pVTable;
4290: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
42a0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
42b0: 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  zArg = (const ch
42c0: 61 72 20 2a 63 6f 6e 73 74 2a 29 70 54 61 62 2d  ar *const*)pTab-
42d0: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 3b 0a 20 20  >azModuleArg;.  
42e0: 69 6e 74 20 6e 41 72 67 20 3d 20 70 54 61 62 2d  int nArg = pTab-
42f0: 3e 6e 4d 6f 64 75 6c 65 41 72 67 3b 0a 20 20 63  >nModuleArg;.  c
4300: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
4310: 20 63 68 61 72 20 2a 7a 4d 6f 64 75 6c 65 4e 61   char *zModuleNa
4320: 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  me;.  int iDb;. 
4330: 20 56 74 61 62 43 74 78 20 2a 70 43 74 78 3b 0a   VtabCtx *pCtx;.
4340: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
4350: 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62   the virtual-tab
4360: 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  le is not alread
4370: 79 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69  y being initiali
4380: 7a 65 64 20 2a 2f 0a 20 20 66 6f 72 28 70 43 74  zed */.  for(pCt
4390: 78 3d 64 62 2d 3e 70 56 74 61 62 43 74 78 3b 20  x=db->pVtabCtx; 
43a0: 70 43 74 78 3b 20 70 43 74 78 3d 70 43 74 78 2d  pCtx; pCtx=pCtx-
43b0: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 66  >pPrior){.    if
43c0: 28 20 70 43 74 78 2d 3e 70 54 61 62 3d 3d 70 54  ( pCtx->pTab==pT
43d0: 61 62 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45  ab ){.      *pzE
43e0: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
43f0: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
4400: 20 20 20 22 76 74 61 62 6c 65 20 63 6f 6e 73 74     "vtable const
4410: 72 75 63 74 6f 72 20 63 61 6c 6c 65 64 20 72 65  ructor called re
4420: 63 75 72 73 69 76 65 6c 79 3a 20 25 73 22 2c 20  cursively: %s", 
4430: 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
4440: 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
4450: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
4460: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 7a 4d  .    }.  }..  zM
4470: 6f 64 75 6c 65 4e 61 6d 65 20 3d 20 73 71 6c 69  oduleName = sqli
4480: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
4490: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
44a0: 69 66 28 20 21 7a 4d 6f 64 75 6c 65 4e 61 6d 65  if( !zModuleName
44b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
44c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
44d0: 3b 0a 20 20 7d 0a 0a 20 20 70 56 54 61 62 6c 65  ;.  }..  pVTable
44e0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
44f0: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 56 54 61 62  Zero(sizeof(VTab
4500: 6c 65 29 29 3b 0a 20 20 69 66 28 20 21 70 56 54  le));.  if( !pVT
4510: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
4520: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
4530: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4540: 65 65 28 64 62 2c 20 7a 4d 6f 64 75 6c 65 4e 61  ee(db, zModuleNa
4550: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
4560: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
4570: 54 3b 0a 20 20 7d 0a 20 20 70 56 54 61 62 6c 65  T;.  }.  pVTable
4580: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 56 54  ->db = db;.  pVT
4590: 61 62 6c 65 2d 3e 70 4d 6f 64 20 3d 20 70 4d 6f  able->pMod = pMo
45a0: 64 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  d;..  iDb = sqli
45b0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
45c0: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
45d0: 6d 61 29 3b 0a 20 20 70 54 61 62 2d 3e 61 7a 4d  ma);.  pTab->azM
45e0: 6f 64 75 6c 65 41 72 67 5b 31 5d 20 3d 20 64 62  oduleArg[1] = db
45f0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
4600: 61 6d 65 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  ame;..  /* Invok
4610: 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
4620: 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20  ble constructor 
4630: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 26 64 62  */.  assert( &db
4640: 2d 3e 70 56 74 61 62 43 74 78 20 29 3b 0a 20 20  ->pVtabCtx );.  
4650: 61 73 73 65 72 74 28 20 78 43 6f 6e 73 74 72 75  assert( xConstru
4660: 63 74 20 29 3b 0a 20 20 73 43 74 78 2e 70 54 61  ct );.  sCtx.pTa
4670: 62 20 3d 20 70 54 61 62 3b 0a 20 20 73 43 74 78  b = pTab;.  sCtx
4680: 2e 70 56 54 61 62 6c 65 20 3d 20 70 56 54 61 62  .pVTable = pVTab
4690: 6c 65 3b 0a 20 20 73 43 74 78 2e 70 50 72 69 6f  le;.  sCtx.pPrio
46a0: 72 20 3d 20 64 62 2d 3e 70 56 74 61 62 43 74 78  r = db->pVtabCtx
46b0: 3b 0a 20 20 73 43 74 78 2e 62 44 65 63 6c 61 72  ;.  sCtx.bDeclar
46c0: 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ed = 0;.  db->pV
46d0: 74 61 62 43 74 78 20 3d 20 26 73 43 74 78 3b 0a  tabCtx = &sCtx;.
46e0: 20 20 72 63 20 3d 20 78 43 6f 6e 73 74 72 75 63    rc = xConstruc
46f0: 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 41 75 78  t(db, pMod->pAux
4700: 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 26  , nArg, azArg, &
4710: 70 56 54 61 62 6c 65 2d 3e 70 56 74 61 62 2c 20  pVTable->pVtab, 
4720: 26 7a 45 72 72 29 3b 0a 20 20 64 62 2d 3e 70 56  &zErr);.  db->pV
4730: 74 61 62 43 74 78 20 3d 20 73 43 74 78 2e 70 50  tabCtx = sCtx.pP
4740: 72 69 6f 72 3b 0a 20 20 69 66 28 20 72 63 3d 3d  rior;.  if( rc==
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73  SQLITE_NOMEM ) s
4760: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4770: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 43  b);.  assert( sC
4780: 74 78 2e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  tx.pTab==pTab );
4790: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
47a0: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 69 66 28  K!=rc ){.    if(
47b0: 20 7a 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20   zErr==0 ){.    
47c0: 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
47d0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 76  e3MPrintf(db, "v
47e0: 74 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f  table constructo
47f0: 72 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 7a  r failed: %s", z
4800: 4d 6f 64 75 6c 65 4e 61 6d 65 29 3b 0a 20 20 20  ModuleName);.   
4810: 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2a   }else {.      *
4820: 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d  pzErr = sqlite3M
4830: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
4840: 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71   zErr);.      sq
4850: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
4860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4870: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56  te3DbFree(db, pV
4880: 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 20  Table);.  }else 
4890: 69 66 28 20 41 4c 57 41 59 53 28 70 56 54 61 62  if( ALWAYS(pVTab
48a0: 6c 65 2d 3e 70 56 74 61 62 29 20 29 7b 0a 20 20  le->pVtab) ){.  
48b0: 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
48c0: 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3a 20  on of ALWAYS(): 
48d0: 20 41 20 63 6f 72 72 65 63 74 20 76 74 61 62 20   A correct vtab 
48e0: 63 6f 6e 73 74 72 75 63 74 6f 72 20 6d 75 73 74  constructor must
48f0: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a   allocate.    **
4900: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
4910: 62 20 6f 62 6a 65 63 74 20 69 66 20 73 75 63 63  b object if succ
4920: 65 73 73 66 75 6c 2e 20 20 2a 2f 0a 20 20 20 20  essful.  */.    
4930: 6d 65 6d 73 65 74 28 70 56 54 61 62 6c 65 2d 3e  memset(pVTable->
4940: 70 56 74 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66  pVtab, 0, sizeof
4950: 28 70 56 54 61 62 6c 65 2d 3e 70 56 74 61 62 5b  (pVTable->pVtab[
4960: 30 5d 29 29 3b 0a 20 20 20 20 70 56 54 61 62 6c  0]));.    pVTabl
4970: 65 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  e->pVtab->pModul
4980: 65 20 3d 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  e = pMod->pModul
4990: 65 3b 0a 20 20 20 20 70 56 54 61 62 6c 65 2d 3e  e;.    pVTable->
49a0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
49b0: 28 20 73 43 74 78 2e 62 44 65 63 6c 61 72 65 64  ( sCtx.bDeclared
49c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ==0 ){.      con
49d0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
49e0: 20 3d 20 22 76 74 61 62 6c 65 20 63 6f 6e 73 74   = "vtable const
49f0: 72 75 63 74 6f 72 20 64 69 64 20 6e 6f 74 20 64  ructor did not d
4a00: 65 63 6c 61 72 65 20 73 63 68 65 6d 61 3a 20 25  eclare schema: %
4a10: 73 22 3b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72  s";.      *pzErr
4a20: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
4a30: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 70  f(db, zFormat, p
4a40: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
4a50: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e     sqlite3VtabUn
4a60: 6c 6f 63 6b 28 70 56 54 61 62 6c 65 29 3b 0a 20  lock(pVTable);. 
4a70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4a80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
4a90: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  e{.      int iCo
4aa0: 6c 3b 0a 20 20 20 20 20 20 75 38 20 6f 6f 6f 48  l;.      u8 oooH
4ab0: 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  idden = 0;.     
4ac0: 20 2f 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e   /* If everythin
4ad0: 67 20 77 65 6e 74 20 61 63 63 6f 72 64 69 6e 67  g went according
4ae0: 20 74 6f 20 70 6c 61 6e 2c 20 6c 69 6e 6b 20 74   to plan, link t
4af0: 68 65 20 6e 65 77 20 56 54 61 62 6c 65 20 73 74  he new VTable st
4b00: 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 2a 2a  ructure.      **
4b10: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
4b20: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
4b30: 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 2e 20 54  pTab->pVTable. T
4b40: 68 65 6e 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68  hen loop through
4b50: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
4b60: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
4b70: 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20 61 6e  ble to see if an
4b80: 79 20 6f 66 20 74 68 65 6d 20 63 6f 6e 74 61 69  y of them contai
4b90: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 22 68 69 64  n the token "hid
4ba0: 64 65 6e 22 2e 0a 20 20 20 20 20 20 2a 2a 20 49  den"..      ** I
4bb0: 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 43 6f  f so, set the Co
4bc0: 6c 75 6d 6e 20 43 4f 4c 46 4c 41 47 5f 48 49 44  lumn COLFLAG_HID
4bd0: 44 45 4e 20 66 6c 61 67 20 61 6e 64 20 72 65 6d  DEN flag and rem
4be0: 6f 76 65 20 74 68 65 20 74 6f 6b 65 6e 20 66 72  ove the token fr
4bf0: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  om.      ** the 
4c00: 74 79 70 65 20 73 74 72 69 6e 67 2e 20 20 2a 2f  type string.  */
4c10: 0a 20 20 20 20 20 20 70 56 54 61 62 6c 65 2d 3e  .      pVTable->
4c20: 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 56  pNext = pTab->pV
4c30: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 61  Table;.      pTa
4c40: 62 2d 3e 70 56 54 61 62 6c 65 20 3d 20 70 56 54  b->pVTable = pVT
4c50: 61 62 6c 65 3b 0a 0a 20 20 20 20 20 20 66 6f 72  able;..      for
4c60: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
4c70: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
4c80: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4c90: 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  *zType = sqlite3
4ca0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
4cb0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 20 22 22  ->aCol[iCol], ""
4cc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  );.        int n
4cd0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Type;.        in
4ce0: 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t i = 0;.       
4cf0: 20 6e 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   nType = sqlite3
4d00: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
4d10: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
4d20: 3b 20 69 3c 6e 54 79 70 65 3b 20 69 2b 2b 29 7b  ; i<nType; i++){
4d30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
4d40: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
4d50: 70 28 22 68 69 64 64 65 6e 22 2c 20 26 7a 54 79  p("hidden", &zTy
4d60: 70 65 5b 69 5d 2c 20 36 29 0a 20 20 20 20 20 20  pe[i], 6).      
4d70: 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c       && (i==0 ||
4d80: 20 7a 54 79 70 65 5b 69 2d 31 5d 3d 3d 27 20 27   zType[i-1]==' '
4d90: 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
4da0: 28 7a 54 79 70 65 5b 69 2b 36 5d 3d 3d 27 5c 30  (zType[i+6]=='\0
4db0: 27 20 7c 7c 20 7a 54 79 70 65 5b 69 2b 36 5d 3d  ' || zType[i+6]=
4dc0: 3d 27 20 27 29 0a 20 20 20 20 20 20 20 20 20 20  =' ').          
4dd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
4de0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
4df0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
4e00: 20 20 20 20 69 66 28 20 69 3c 6e 54 79 70 65 20      if( i<nType 
4e10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4e20: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   j;.          in
4e30: 74 20 6e 44 65 6c 20 3d 20 36 20 2b 20 28 7a 54  t nDel = 6 + (zT
4e40: 79 70 65 5b 69 2b 36 5d 20 3f 20 31 20 3a 20 30  ype[i+6] ? 1 : 0
4e50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
4e60: 28 6a 3d 69 3b 20 28 6a 2b 6e 44 65 6c 29 3c 3d  (j=i; (j+nDel)<=
4e70: 6e 54 79 70 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nType; j++){.   
4e80: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 5b 6a           zType[j
4e90: 5d 20 3d 20 7a 54 79 70 65 5b 6a 2b 6e 44 65 6c  ] = zType[j+nDel
4ea0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
4eb0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 79           if( zTy
4ec0: 70 65 5b 69 5d 3d 3d 27 5c 30 27 20 26 26 20 69  pe[i]=='\0' && i
4ed0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
4ee0: 20 20 61 73 73 65 72 74 28 7a 54 79 70 65 5b 69    assert(zType[i
4ef0: 2d 31 5d 3d 3d 27 20 27 29 3b 0a 20 20 20 20 20  -1]==' ');.     
4f00: 20 20 20 20 20 20 20 7a 54 79 70 65 5b 69 2d 31         zType[i-1
4f10: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
4f20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4f30: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
4f40: 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  .colFlags |= COL
4f50: 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 20  FLAG_HIDDEN;.   
4f60: 20 20 20 20 20 20 20 6f 6f 6f 48 69 64 64 65 6e         oooHidden
4f70: 20 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b   = TF_OOOHidden;
4f80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
4f90: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
4fa0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 6f 6f 6f 48  tabFlags |= oooH
4fb0: 69 64 64 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  idden;.        }
4fc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4fd0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
4fe0: 72 65 65 28 64 62 2c 20 7a 4d 6f 64 75 6c 65 4e  ree(db, zModuleN
4ff0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ame);.  return r
5000: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
5010: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
5020: 6f 6b 65 64 20 62 79 20 74 68 65 20 70 61 72 73  oked by the pars
5030: 65 72 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78  er to call the x
5040: 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64  Connect() method
5050: 0a 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75  .** of the virtu
5060: 61 6c 20 74 61 62 6c 65 20 70 54 61 62 2e 20 49  al table pTab. I
5070: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5080: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
5090: 20 69 73 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a   is returned .**
50a0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65   and an error le
50b0: 66 74 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a  ft in pParse..**
50c0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
50d0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 61 62 6c   a no-op if tabl
50e0: 65 20 70 54 61 62 20 69 73 20 6e 6f 74 20 61 20  e pTab is not a 
50f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
5100: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61  /.int sqlite3Vta
5110: 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 50 61 72  bCallConnect(Par
5120: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
5130: 65 20 2a 70 54 61 62 29 7b 0a 20 20 73 71 6c 69  e *pTab){.  sqli
5140: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5150: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
5160: 61 72 20 2a 7a 4d 6f 64 3b 0a 20 20 4d 6f 64 75  ar *zMod;.  Modu
5170: 6c 65 20 2a 70 4d 6f 64 3b 0a 20 20 69 6e 74 20  le *pMod;.  int 
5180: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
5190: 54 61 62 20 29 3b 0a 20 20 69 66 28 20 21 49 73  Tab );.  if( !Is
51a0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
51b0: 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
51c0: 65 28 64 62 2c 20 70 54 61 62 29 20 29 7b 0a 20  e(db, pTab) ){. 
51d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
51e0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  _OK;.  }..  /* L
51f0: 6f 63 61 74 65 20 74 68 65 20 72 65 71 75 69 72  ocate the requir
5200: 65 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ed virtual table
5210: 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 7a 4d 6f   module */.  zMo
5220: 64 20 3d 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75  d = pTab->azModu
5230: 6c 65 41 72 67 5b 30 5d 3b 0a 20 20 70 4d 6f 64  leArg[0];.  pMod
5240: 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69   = (Module*)sqli
5250: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
5260: 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4d 6f 64 29 3b  >aModule, zMod);
5270: 0a 0a 20 20 69 66 28 20 21 70 4d 6f 64 20 29 7b  ..  if( !pMod ){
5280: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5290: 2a 7a 4d 6f 64 75 6c 65 20 3d 20 70 54 61 62 2d  *zModule = pTab-
52a0: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 3b  >azModuleArg[0];
52b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
52c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
52d0: 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 25 73   such module: %s
52e0: 22 2c 20 7a 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  ", zModule);.   
52f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
5300: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
5310: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
5320: 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 43 61  .    rc = vtabCa
5330: 6c 6c 43 6f 6e 73 74 72 75 63 74 6f 72 28 64 62  llConstructor(db
5340: 2c 20 70 54 61 62 2c 20 70 4d 6f 64 2c 20 70 4d  , pTab, pMod, pM
5350: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f  od->pModule->xCo
5360: 6e 6e 65 63 74 2c 20 26 7a 45 72 72 29 3b 0a 20  nnect, &zErr);. 
5370: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
5380: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
5390: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
53a0: 61 72 73 65 2c 20 22 25 73 22 2c 20 7a 45 72 72  arse, "%s", zErr
53b0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
53c0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  >rc = rc;.    }.
53d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
53e0: 65 28 64 62 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  e(db, zErr);.  }
53f0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
5400: 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20  ./*.** Grow the 
5410: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
5420: 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
5430: 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74  e is room for at
5440: 20 6c 65 61 73 74 20 6f 6e 65 0a 2a 2a 20 6d 6f   least one.** mo
5450: 72 65 20 76 2d 74 61 62 6c 65 2e 20 52 65 74 75  re v-table. Retu
5460: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
5470: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
5480: 73 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20  s, or SQLITE_OK 
5490: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
54a0: 61 74 69 63 20 69 6e 74 20 67 72 6f 77 56 54 72  atic int growVTr
54b0: 61 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ans(sqlite3 *db)
54c0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 41 52  {.  const int AR
54d0: 52 41 59 5f 49 4e 43 52 20 3d 20 35 3b 0a 0a 20  RAY_INCR = 5;.. 
54e0: 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 73 71 6c   /* Grow the sql
54f0: 69 74 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72  ite3.aVTrans arr
5500: 61 79 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  ay if required *
5510: 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6e 56 54  /.  if( (db->nVT
5520: 72 61 6e 73 25 41 52 52 41 59 5f 49 4e 43 52 29  rans%ARRAY_INCR)
5530: 3d 3d 30 20 29 7b 0a 20 20 20 20 56 54 61 62 6c  ==0 ){.    VTabl
5540: 65 20 2a 2a 61 56 54 72 61 6e 73 3b 0a 20 20 20  e **aVTrans;.   
5550: 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69   int nBytes = si
5560: 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61  zeof(sqlite3_vta
5570: 62 20 2a 29 20 2a 20 28 64 62 2d 3e 6e 56 54 72  b *) * (db->nVTr
5580: 61 6e 73 20 2b 20 41 52 52 41 59 5f 49 4e 43 52  ans + ARRAY_INCR
5590: 29 3b 0a 20 20 20 20 61 56 54 72 61 6e 73 20 3d  );.    aVTrans =
55a0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
55b0: 63 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 64 62  c(db, (void *)db
55c0: 2d 3e 61 56 54 72 61 6e 73 2c 20 6e 42 79 74 65  ->aVTrans, nByte
55d0: 73 29 3b 0a 20 20 20 20 69 66 28 20 21 61 56 54  s);.    if( !aVT
55e0: 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 65  rans ){.      re
55f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5600: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
5610: 20 20 6d 65 6d 73 65 74 28 26 61 56 54 72 61 6e    memset(&aVTran
5620: 73 5b 64 62 2d 3e 6e 56 54 72 61 6e 73 5d 2c 20  s[db->nVTrans], 
5630: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
5640: 33 5f 76 74 61 62 20 2a 29 2a 41 52 52 41 59 5f  3_vtab *)*ARRAY_
5650: 49 4e 43 52 29 3b 0a 20 20 20 20 64 62 2d 3e 61  INCR);.    db->a
5660: 56 54 72 61 6e 73 20 3d 20 61 56 54 72 61 6e 73  VTrans = aVTrans
5670: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5680: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5690: 0a 2a 2a 20 41 64 64 20 74 68 65 20 76 69 72 74  .** Add the virt
56a0: 75 61 6c 20 74 61 62 6c 65 20 70 56 54 61 62 20  ual table pVTab 
56b0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 73 71 6c  to the array sql
56c0: 69 74 65 33 2e 61 56 54 72 61 6e 73 5b 5d 2e 20  ite3.aVTrans[]. 
56d0: 53 70 61 63 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  Space should.** 
56e0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
56f0: 6e 20 72 65 73 65 72 76 65 64 20 75 73 69 6e 67  n reserved using
5700: 20 67 72 6f 77 56 54 72 61 6e 73 28 29 2e 0a 2a   growVTrans()..*
5710: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
5720: 64 54 6f 56 54 72 61 6e 73 28 73 71 6c 69 74 65  dToVTrans(sqlite
5730: 33 20 2a 64 62 2c 20 56 54 61 62 6c 65 20 2a 70  3 *db, VTable *p
5740: 56 54 61 62 29 7b 0a 20 20 2f 2a 20 41 64 64 20  VTab){.  /* Add 
5750: 70 56 74 61 62 20 74 6f 20 74 68 65 20 65 6e 64  pVtab to the end
5760: 20 6f 66 20 73 71 6c 69 74 65 33 2e 61 56 54 72   of sqlite3.aVTr
5770: 61 6e 73 20 2a 2f 0a 20 20 64 62 2d 3e 61 56 54  ans */.  db->aVT
5780: 72 61 6e 73 5b 64 62 2d 3e 6e 56 54 72 61 6e 73  rans[db->nVTrans
5790: 2b 2b 5d 20 3d 20 70 56 54 61 62 3b 0a 20 20 73  ++] = pVTab;.  s
57a0: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 70  qlite3VtabLock(p
57b0: 56 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VTab);.}../*.** 
57c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
57d0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
57e0: 76 64 62 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  vdbe to call the
57f0: 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 0a   xCreate method.
5800: 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
5810: 6c 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 7a 54  l table named zT
5820: 61 62 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ab in database i
5830: 44 62 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  Db. .**.** If an
5840: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
5850: 70 7a 45 72 72 20 69 73 20 73 65 74 20 74 6f 20  pzErr is set to 
5860: 70 6f 69 6e 74 20 74 6f 20 61 6e 20 45 6e 67 6c  point to an Engl
5870: 69 73 68 20 6c 61 6e 67 75 61 67 65 0a 2a 2a 20  ish language.** 
5880: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
5890: 68 65 20 65 72 72 6f 72 20 61 6e 64 20 61 6e 20  he error and an 
58a0: 53 51 4c 49 54 45 5f 58 58 58 20 65 72 72 6f 72  SQLITE_XXX error
58b0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
58c0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  d..** In this ca
58d0: 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  se the caller mu
58e0: 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 44  st call sqlite3D
58f0: 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 2a  bFree(db, ) on *
5900: 70 7a 45 72 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pzErr..*/.int sq
5910: 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65  lite3VtabCallCre
5920: 61 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ate(sqlite3 *db,
5930: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5940: 63 68 61 72 20 2a 7a 54 61 62 2c 20 63 68 61 72  char *zTab, char
5950: 20 2a 2a 70 7a 45 72 72 29 7b 0a 20 20 69 6e 74   **pzErr){.  int
5960: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5970: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
5980: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 0a    Module *pMod;.
5990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
59a0: 6f 64 3b 0a 0a 20 20 70 54 61 62 20 3d 20 73 71  od;..  pTab = sq
59b0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
59c0: 62 2c 20 7a 54 61 62 2c 20 64 62 2d 3e 61 44 62  b, zTab, db->aDb
59d0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b  [iDb].zDbSName);
59e0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20  .  assert( pTab 
59f0: 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  && IsVirtual(pTa
5a00: 62 29 20 26 26 20 21 70 54 61 62 2d 3e 70 56 54  b) && !pTab->pVT
5a10: 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  able );..  /* Lo
5a20: 63 61 74 65 20 74 68 65 20 72 65 71 75 69 72 65  cate the require
5a30: 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  d virtual table 
5a40: 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 7a 4d 6f 64  module */.  zMod
5a50: 20 3d 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c   = pTab->azModul
5a60: 65 41 72 67 5b 30 5d 3b 0a 20 20 70 4d 6f 64 20  eArg[0];.  pMod 
5a70: 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74  = (Module*)sqlit
5a80: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
5a90: 61 4d 6f 64 75 6c 65 2c 20 7a 4d 6f 64 29 3b 0a  aModule, zMod);.
5aa0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6f 64  .  /* If the mod
5ab0: 75 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 67  ule has been reg
5ac0: 69 73 74 65 72 65 64 20 61 6e 64 20 69 6e 63 6c  istered and incl
5ad0: 75 64 65 73 20 61 20 43 72 65 61 74 65 20 6d 65  udes a Create me
5ae0: 74 68 6f 64 2c 20 0a 20 20 2a 2a 20 69 6e 76 6f  thod, .  ** invo
5af0: 6b 65 20 69 74 20 6e 6f 77 2e 20 49 66 20 74 68  ke it now. If th
5b00: 65 20 6d 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74  e module has not
5b10: 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
5b20: 2c 20 72 65 74 75 72 6e 20 61 6e 20 0a 20 20 2a  , return an .  *
5b30: 2a 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  * error. Otherwi
5b40: 73 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  se, do nothing..
5b50: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 6f 64 3d    */.  if( pMod=
5b60: 3d 30 20 7c 7c 20 70 4d 6f 64 2d 3e 70 4d 6f 64  =0 || pMod->pMod
5b70: 75 6c 65 2d 3e 78 43 72 65 61 74 65 3d 3d 30 20  ule->xCreate==0 
5b80: 7c 7c 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65  || pMod->pModule
5b90: 2d 3e 78 44 65 73 74 72 6f 79 3d 3d 30 20 29 7b  ->xDestroy==0 ){
5ba0: 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71  .    *pzErr = sq
5bb0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
5bc0: 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65   "no such module
5bd0: 3a 20 25 73 22 2c 20 7a 4d 6f 64 29 3b 0a 20 20  : %s", zMod);.  
5be0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
5bf0: 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
5c00: 20 20 72 63 20 3d 20 76 74 61 62 43 61 6c 6c 43    rc = vtabCallC
5c10: 6f 6e 73 74 72 75 63 74 6f 72 28 64 62 2c 20 70  onstructor(db, p
5c20: 54 61 62 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64 2d  Tab, pMod, pMod-
5c30: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 43 72 65 61 74  >pModule->xCreat
5c40: 65 2c 20 70 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a  e, pzErr);.  }..
5c50: 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
5c60: 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3a 20  on of ALWAYS(): 
5c70: 20 54 68 65 20 78 43 6f 6e 73 74 72 75 63 74 6f   The xConstructo
5c80: 72 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75  r method is requ
5c90: 69 72 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  ired to.  ** cre
5ca0: 61 74 65 20 61 20 76 61 6c 69 64 20 73 71 6c 69  ate a valid sqli
5cb0: 74 65 33 5f 76 74 61 62 20 69 66 20 69 74 20 72  te3_vtab if it r
5cc0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
5cd0: 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
5ce0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 41 4c 57 41  QLITE_OK && ALWA
5cf0: 59 53 28 73 71 6c 69 74 65 33 47 65 74 56 54 61  YS(sqlite3GetVTa
5d00: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 29 20 29  ble(db, pTab)) )
5d10: 7b 0a 20 20 20 20 72 63 20 3d 20 67 72 6f 77 56  {.    rc = growV
5d20: 54 72 61 6e 73 28 64 62 29 3b 0a 20 20 20 20 69  Trans(db);.    i
5d30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5d40: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 54 6f 56   ){.      addToV
5d50: 54 72 61 6e 73 28 64 62 2c 20 73 71 6c 69 74 65  Trans(db, sqlite
5d60: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
5d70: 54 61 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Tab));.    }.  }
5d80: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
5d90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5da0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
5db0: 20 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20   set the schema 
5dc0: 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
5dd0: 6c 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 0a  le.  It is only.
5de0: 2a 2a 20 76 61 6c 69 64 20 74 6f 20 63 61 6c 6c  ** valid to call
5df0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
5e00: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78  rom within the x
5e10: 43 72 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e  Create() or xCon
5e20: 6e 65 63 74 28 29 20 6f 66 20 61 0a 2a 2a 20 76  nect() of a.** v
5e30: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
5e40: 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ule..*/.int sqli
5e50: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
5e60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
5e70: 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74  nst char *zCreat
5e80: 65 54 61 62 6c 65 29 7b 0a 20 20 56 74 61 62 43  eTable){.  VtabC
5e90: 74 78 20 2a 70 43 74 78 3b 0a 20 20 69 6e 74 20  tx *pCtx;.  int 
5ea0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5eb0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
5ec0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
5ed0: 0a 20 20 50 61 72 73 65 20 73 50 61 72 73 65 3b  .  Parse sParse;
5ee0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5ef0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
5f00: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
5f10: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
5f20: 20 7c 7c 20 7a 43 72 65 61 74 65 54 61 62 6c 65   || zCreateTable
5f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5f40: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
5f50: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
5f60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5f70: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
5f80: 29 3b 0a 20 20 70 43 74 78 20 3d 20 64 62 2d 3e  );.  pCtx = db->
5f90: 70 56 74 61 62 43 74 78 3b 0a 20 20 69 66 28 20  pVtabCtx;.  if( 
5fa0: 21 70 43 74 78 20 7c 7c 20 70 43 74 78 2d 3e 62  !pCtx || pCtx->b
5fb0: 44 65 63 6c 61 72 65 64 20 29 7b 0a 20 20 20 20  Declared ){.    
5fc0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
5fd0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 3b   SQLITE_MISUSE);
5fe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
5ff0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6000: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ex);.    return 
6010: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6020: 50 54 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d  PT;.  }.  pTab =
6030: 20 70 43 74 78 2d 3e 70 54 61 62 3b 0a 20 20 61   pCtx->pTab;.  a
6040: 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c  ssert( IsVirtual
6050: 28 70 54 61 62 29 20 29 3b 0a 0a 20 20 6d 65 6d  (pTab) );..  mem
6060: 73 65 74 28 26 73 50 61 72 73 65 2c 20 30 2c 20  set(&sParse, 0, 
6070: 73 69 7a 65 6f 66 28 73 50 61 72 73 65 29 29 3b  sizeof(sParse));
6080: 0a 20 20 73 50 61 72 73 65 2e 65 50 61 72 73 65  .  sParse.eParse
6090: 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44  Mode = PARSE_MOD
60a0: 45 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 3b 0a  E_DECLARE_VTAB;.
60b0: 20 20 73 50 61 72 73 65 2e 64 62 20 3d 20 64 62    sParse.db = db
60c0: 3b 0a 20 20 73 50 61 72 73 65 2e 6e 51 75 65 72  ;.  sParse.nQuer
60d0: 79 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 69 66 28  yLoop = 1;.  if(
60e0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
60f0: 74 65 33 52 75 6e 50 61 72 73 65 72 28 26 73 50  te3RunParser(&sP
6100: 61 72 73 65 2c 20 7a 43 72 65 61 74 65 54 61 62  arse, zCreateTab
6110: 6c 65 2c 20 26 7a 45 72 72 29 20 0a 20 20 20 26  le, &zErr) .   &
6120: 26 20 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62  & sParse.pNewTab
6130: 6c 65 0a 20 20 20 26 26 20 21 64 62 2d 3e 6d 61  le.   && !db->ma
6140: 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 26 26  llocFailed.   &&
6150: 20 21 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62   !sParse.pNewTab
6160: 6c 65 2d 3e 70 53 65 6c 65 63 74 0a 20 20 20 26  le->pSelect.   &
6170: 26 20 21 49 73 56 69 72 74 75 61 6c 28 73 50 61  & !IsVirtual(sPa
6180: 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 29 0a 20  rse.pNewTable). 
6190: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 54 61   ){.    if( !pTa
61a0: 62 2d 3e 61 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->aCol ){.     
61b0: 20 54 61 62 6c 65 20 2a 70 4e 65 77 20 3d 20 73   Table *pNew = s
61c0: 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 3b  Parse.pNewTable;
61d0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
61e0: 64 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  dx;.      pTab->
61f0: 61 43 6f 6c 20 3d 20 70 4e 65 77 2d 3e 61 43 6f  aCol = pNew->aCo
6200: 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  l;.      pTab->n
6210: 43 6f 6c 20 3d 20 70 4e 65 77 2d 3e 6e 43 6f 6c  Col = pNew->nCol
6220: 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
6230: 62 46 6c 61 67 73 20 7c 3d 20 70 4e 65 77 2d 3e  bFlags |= pNew->
6240: 74 61 62 46 6c 61 67 73 20 26 20 28 54 46 5f 57  tabFlags & (TF_W
6250: 69 74 68 6f 75 74 52 6f 77 69 64 7c 54 46 5f 4e  ithoutRowid|TF_N
6260: 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 29 3b 0a  oVisibleRowid);.
6270: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 43 6f 6c        pNew->nCol
6280: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
6290: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
62a0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
62b0: 70 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20  pIndex==0 );.   
62c0: 20 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f     assert( HasRo
62d0: 77 69 64 28 70 4e 65 77 29 20 7c 7c 20 73 71 6c  wid(pNew) || sql
62e0: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
62f0: 64 65 78 28 70 4e 65 77 29 21 3d 30 20 29 3b 0a  dex(pNew)!=0 );.
6300: 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
6310: 77 69 64 28 70 4e 65 77 29 0a 20 20 20 20 20 20  wid(pNew).      
6320: 20 26 26 20 70 43 74 78 2d 3e 70 56 54 61 62 6c   && pCtx->pVTabl
6330: 65 2d 3e 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65  e->pMod->pModule
6340: 2d 3e 78 55 70 64 61 74 65 21 3d 30 0a 20 20 20  ->xUpdate!=0.   
6350: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 72      && sqlite3Pr
6360: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 4e  imaryKeyIndex(pN
6370: 65 77 29 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 31 0a  ew)->nKeyCol!=1.
6380: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
6390: 20 2f 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49   /* WITHOUT ROWI
63a0: 44 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  D virtual tables
63b0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 20   must either be 
63c0: 72 65 61 64 2d 6f 6e 6c 79 20 28 78 55 70 64 61  read-only (xUpda
63d0: 74 65 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 2a  te==0).        *
63e0: 2a 20 6f 72 20 65 6c 73 65 20 6d 75 73 74 20 68  * or else must h
63f0: 61 76 65 20 61 20 73 69 6e 67 6c 65 2d 63 6f 6c  ave a single-col
6400: 75 6d 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  umn PRIMARY KEY 
6410: 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
6420: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
6430: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 64 78      }.      pIdx
6440: 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 3b   = pNew->pIndex;
6450: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20  .      if( pIdx 
6460: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6470: 74 28 20 70 49 64 78 2d 3e 70 4e 65 78 74 3d 3d  t( pIdx->pNext==
6480: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  0 );.        pTa
6490: 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  b->pIndex = pIdx
64a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
64b0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
64c0: 20 20 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65      pIdx->pTable
64d0: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 7d   = pTab;.      }
64e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 78 2d  .    }.    pCtx-
64f0: 3e 62 44 65 63 6c 61 72 65 64 20 3d 20 31 3b 0a  >bDeclared = 1;.
6500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6510: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
6520: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
6530: 52 2c 20 28 7a 45 72 72 20 3f 20 22 25 73 22 20  R, (zErr ? "%s" 
6540: 3a 20 30 29 2c 20 7a 45 72 72 29 3b 0a 20 20 20  : 0), zErr);.   
6550: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6560: 62 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 72 63  b, zErr);.    rc
6570: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
6580: 0a 20 20 7d 0a 20 20 73 50 61 72 73 65 2e 65 50  .  }.  sParse.eP
6590: 61 72 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45  arseMode = PARSE
65a0: 5f 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 0a 20  _MODE_NORMAL;.. 
65b0: 20 69 66 28 20 73 50 61 72 73 65 2e 70 56 64 62   if( sParse.pVdb
65c0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
65d0: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 73 50 61  VdbeFinalize(sPa
65e0: 72 73 65 2e 70 56 64 62 65 29 3b 0a 20 20 7d 0a  rse.pVdbe);.  }.
65f0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
6600: 61 62 6c 65 28 64 62 2c 20 73 50 61 72 73 65 2e  able(db, sParse.
6610: 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 73 71  pNewTable);.  sq
6620: 6c 69 74 65 33 50 61 72 73 65 72 52 65 73 65 74  lite3ParserReset
6630: 28 26 73 50 61 72 73 65 29 3b 0a 0a 20 20 61 73  (&sParse);..  as
6640: 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d  sert( (rc&0xff)=
6650: 3d 72 63 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  =rc );.  rc = sq
6660: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
6670: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
6680: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
6690: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
66a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
66b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
66c0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 76 64  nvoked by the vd
66d0: 62 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78  be to call the x
66e0: 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a  Destroy method.*
66f0: 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  * of the virtual
6700: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 7a 54 61   table named zTa
6710: 62 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  b in database iD
6720: 62 2e 20 54 68 69 73 20 6f 63 63 75 72 73 0a 2a  b. This occurs.*
6730: 2a 20 77 68 65 6e 20 61 20 44 52 4f 50 20 54 41  * when a DROP TA
6740: 42 4c 45 20 69 73 20 6d 65 6e 74 69 6f 6e 65 64  BLE is mentioned
6750: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
6760: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
6770: 7a 54 61 62 20 69 73 20 6e 6f 74 20 61 20 76 69  zTab is not a vi
6780: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
6790: 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 43  int sqlite3VtabC
67a0: 61 6c 6c 44 65 73 74 72 6f 79 28 73 71 6c 69 74  allDestroy(sqlit
67b0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
67c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
67d0: 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
67e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 61 62 6c  QLITE_OK;.  Tabl
67f0: 65 20 2a 70 54 61 62 3b 0a 0a 20 20 70 54 61 62  e *pTab;..  pTab
6800: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
6810: 62 6c 65 28 64 62 2c 20 7a 54 61 62 2c 20 64 62  ble(db, zTab, db
6820: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
6830: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
6840: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 70 54  !=0 && ALWAYS(pT
6850: 61 62 2d 3e 70 56 54 61 62 6c 65 21 3d 30 29 20  ab->pVTable!=0) 
6860: 29 7b 0a 20 20 20 20 56 54 61 62 6c 65 20 2a 70  ){.    VTable *p
6870: 3b 0a 20 20 20 20 69 6e 74 20 28 2a 78 44 65 73  ;.    int (*xDes
6880: 74 72 6f 79 29 28 73 71 6c 69 74 65 33 5f 76 74  troy)(sqlite3_vt
6890: 61 62 20 2a 29 3b 0a 20 20 20 20 66 6f 72 28 70  ab *);.    for(p
68a0: 3d 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 3b 20  =pTab->pVTable; 
68b0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
68c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
68d0: 3e 70 56 74 61 62 20 29 3b 0a 20 20 20 20 20 20  >pVtab );.      
68e0: 69 66 28 20 70 2d 3e 70 56 74 61 62 2d 3e 6e 52  if( p->pVtab->nR
68f0: 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ef>0 ){.        
6900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
6910: 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CKED;.      }.  
6920: 20 20 7d 0a 20 20 20 20 70 20 3d 20 76 74 61 62    }.    p = vtab
6930: 44 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 28 64 62  DisconnectAll(db
6940: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 78 44 65  , pTab);.    xDe
6950: 73 74 72 6f 79 20 3d 20 70 2d 3e 70 4d 6f 64 2d  stroy = p->pMod-
6960: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73 74 72  >pModule->xDestr
6970: 6f 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  oy;.    assert( 
6980: 78 44 65 73 74 72 6f 79 21 3d 30 20 29 3b 20 20  xDestroy!=0 );  
6990: 2f 2a 20 43 68 65 63 6b 65 64 20 62 65 66 6f 72  /* Checked befor
69a0: 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
69b0: 62 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 2a  ble is created *
69c0: 2f 0a 20 20 20 20 72 63 20 3d 20 78 44 65 73 74  /.    rc = xDest
69d0: 72 6f 79 28 70 2d 3e 70 56 74 61 62 29 3b 0a 20  roy(p->pVtab);. 
69e0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
69f0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 20 66   sqlite3_vtab* f
6a00: 72 6f 6d 20 74 68 65 20 61 56 54 72 61 6e 73 5b  rom the aVTrans[
6a10: 5d 20 61 72 72 61 79 2c 20 69 66 20 61 70 70 6c  ] array, if appl
6a20: 69 63 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66  icable */.    if
6a30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6a40: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
6a50: 20 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 3d 3d   pTab->pVTable==
6a60: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  p && p->pNext==0
6a70: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 74   );.      p->pVt
6a80: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54  ab = 0;.      pT
6a90: 61 62 2d 3e 70 56 54 61 62 6c 65 20 3d 20 30 3b  ab->pVTable = 0;
6aa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
6ab0: 61 62 55 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 20  abUnlock(p);.   
6ac0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
6ad0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6ae0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
6af0: 6b 65 73 20 65 69 74 68 65 72 20 74 68 65 20 78  kes either the x
6b00: 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 78 43 6f 6d  Rollback or xCom
6b10: 6d 69 74 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  mit method.** of
6b20: 20 65 61 63 68 20 6f 66 20 74 68 65 20 76 69 72   each of the vir
6b30: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 74  tual tables in t
6b40: 68 65 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61  he sqlite3.aVTra
6b50: 6e 73 20 61 72 72 61 79 2e 20 54 68 65 20 6d 65  ns array. The me
6b60: 74 68 6f 64 0a 2a 2a 20 63 61 6c 6c 65 64 20 69  thod.** called i
6b70: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
6b80: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6b90: 65 6e 74 2c 20 22 6f 66 66 73 65 74 22 2c 20 77  ent, "offset", w
6ba0: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 6f  hich is.** the o
6bb0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 6d 65 74  ffset of the met
6bc0: 68 6f 64 20 74 6f 20 63 61 6c 6c 20 69 6e 20 74  hod to call in t
6bd0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  he sqlite3_modul
6be0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
6bf0: 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20  ** The array is 
6c00: 63 6c 65 61 72 65 64 20 61 66 74 65 72 20 69 6e  cleared after in
6c10: 76 6f 6b 69 6e 67 20 74 68 65 20 63 61 6c 6c 62  voking the callb
6c20: 61 63 6b 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  acks. .*/.static
6c30: 20 76 6f 69 64 20 63 61 6c 6c 46 69 6e 61 6c 69   void callFinali
6c40: 73 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ser(sqlite3 *db,
6c50: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
6c60: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 64 62 2d  int i;.  if( db-
6c70: 3e 61 56 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  >aVTrans ){.    
6c80: 56 54 61 62 6c 65 20 2a 2a 61 56 54 72 61 6e 73  VTable **aVTrans
6c90: 20 3d 20 64 62 2d 3e 61 56 54 72 61 6e 73 3b 0a   = db->aVTrans;.
6ca0: 20 20 20 20 64 62 2d 3e 61 56 54 72 61 6e 73 20      db->aVTrans 
6cb0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
6cc0: 3b 20 69 3c 64 62 2d 3e 6e 56 54 72 61 6e 73 3b  ; i<db->nVTrans;
6cd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 54 61   i++){.      VTa
6ce0: 62 6c 65 20 2a 70 56 54 61 62 20 3d 20 61 56 54  ble *pVTab = aVT
6cf0: 72 61 6e 73 5b 69 5d 3b 0a 20 20 20 20 20 20 73  rans[i];.      s
6d00: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 20 3d  qlite3_vtab *p =
6d10: 20 70 56 54 61 62 2d 3e 70 56 74 61 62 3b 0a 20   pVTab->pVtab;. 
6d20: 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20       if( p ){.  
6d30: 20 20 20 20 20 20 69 6e 74 20 28 2a 78 29 28 73        int (*x)(s
6d40: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 3b 0a  qlite3_vtab *);.
6d50: 20 20 20 20 20 20 20 20 78 20 3d 20 2a 28 69 6e          x = *(in
6d60: 74 20 28 2a 2a 29 28 73 71 6c 69 74 65 33 5f 76  t (**)(sqlite3_v
6d70: 74 61 62 20 2a 29 29 28 28 63 68 61 72 20 2a 29  tab *))((char *)
6d80: 70 2d 3e 70 4d 6f 64 75 6c 65 20 2b 20 6f 66 66  p->pModule + off
6d90: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
6da0: 28 20 78 20 29 20 78 28 70 29 3b 0a 20 20 20 20  ( x ) x(p);.    
6db0: 20 20 7d 0a 20 20 20 20 20 20 70 56 54 61 62 2d    }.      pVTab-
6dc0: 3e 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >iSavepoint = 0;
6dd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
6de0: 61 62 55 6e 6c 6f 63 6b 28 70 56 54 61 62 29 3b  abUnlock(pVTab);
6df0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6e00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 56 54  e3DbFree(db, aVT
6e10: 72 61 6e 73 29 3b 0a 20 20 20 20 64 62 2d 3e 6e  rans);.    db->n
6e20: 56 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 7d 0a  VTrans = 0;.  }.
6e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
6e40: 74 68 65 20 78 53 79 6e 63 20 6d 65 74 68 6f 64  the xSync method
6e50: 20 6f 66 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   of all virtual 
6e60: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 71  tables in the sq
6e70: 6c 69 74 65 33 2e 61 56 54 72 61 6e 73 0a 2a 2a  lite3.aVTrans.**
6e80: 20 61 72 72 61 79 2e 20 52 65 74 75 72 6e 20 74   array. Return t
6e90: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 6f  he error code fo
6ea0: 72 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  r the first erro
6eb0: 72 20 74 68 61 74 20 6f 63 63 75 72 73 2c 20 6f  r that occurs, o
6ec0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  r.** SQLITE_OK i
6ed0: 66 20 61 6c 6c 20 78 53 79 6e 63 20 6f 70 65 72  f all xSync oper
6ee0: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
6ef0: 73 73 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssful..**.** If 
6f00: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6f10: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6c   is available, l
6f20: 65 61 76 65 20 69 74 20 69 6e 20 70 2d 3e 7a 45  eave it in p->zE
6f30: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
6f40: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 73 71  lite3VtabSync(sq
6f50: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
6f60: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
6f70: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6f80: 4f 4b 3b 0a 20 20 56 54 61 62 6c 65 20 2a 2a 61  OK;.  VTable **a
6f90: 56 54 72 61 6e 73 20 3d 20 64 62 2d 3e 61 56 54  VTrans = db->aVT
6fa0: 72 61 6e 73 3b 0a 0a 20 20 64 62 2d 3e 61 56 54  rans;..  db->aVT
6fb0: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  rans = 0;.  for(
6fc0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6fd0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 56 54 72  OK && i<db->nVTr
6fe0: 61 6e 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ans; i++){.    i
6ff0: 6e 74 20 28 2a 78 29 28 73 71 6c 69 74 65 33 5f  nt (*x)(sqlite3_
7000: 76 74 61 62 20 2a 29 3b 0a 20 20 20 20 73 71 6c  vtab *);.    sql
7010: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
7020: 20 3d 20 61 56 54 72 61 6e 73 5b 69 5d 2d 3e 70   = aVTrans[i]->p
7030: 56 74 61 62 3b 0a 20 20 20 20 69 66 28 20 70 56  Vtab;.    if( pV
7040: 74 61 62 20 26 26 20 28 78 20 3d 20 70 56 74 61  tab && (x = pVta
7050: 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 79 6e  b->pModule->xSyn
7060: 63 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  c)!=0 ){.      r
7070: 63 20 3d 20 78 28 70 56 74 61 62 29 3b 0a 20 20  c = x(pVtab);.  
7080: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 49      sqlite3VtabI
7090: 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70  mportErrmsg(p, p
70a0: 56 74 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Vtab);.    }.  }
70b0: 0a 20 20 64 62 2d 3e 61 56 54 72 61 6e 73 20 3d  .  db->aVTrans =
70c0: 20 61 56 54 72 61 6e 73 3b 0a 20 20 72 65 74 75   aVTrans;.  retu
70d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
70e0: 49 6e 76 6f 6b 65 20 74 68 65 20 78 52 6f 6c 6c  Invoke the xRoll
70f0: 62 61 63 6b 20 6d 65 74 68 6f 64 20 6f 66 20 61  back method of a
7100: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
7110: 73 20 69 6e 20 74 68 65 20 0a 2a 2a 20 73 71 6c  s in the .** sql
7120: 69 74 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72  ite3.aVTrans arr
7130: 61 79 2e 20 54 68 65 6e 20 63 6c 65 61 72 20 74  ay. Then clear t
7140: 68 65 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e  he array itself.
7150: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
7160: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 73 71 6c 69  tabRollback(sqli
7170: 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 61 6c 6c  te3 *db){.  call
7180: 46 69 6e 61 6c 69 73 65 72 28 64 62 2c 20 6f 66  Finaliser(db, of
7190: 66 73 65 74 6f 66 28 73 71 6c 69 74 65 33 5f 6d  fsetof(sqlite3_m
71a0: 6f 64 75 6c 65 2c 78 52 6f 6c 6c 62 61 63 6b 29  odule,xRollback)
71b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
71c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
71d0: 49 6e 76 6f 6b 65 20 74 68 65 20 78 43 6f 6d 6d  Invoke the xComm
71e0: 69 74 20 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c  it method of all
71f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
7200: 69 6e 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  in the .** sqlit
7210: 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72 61 79  e3.aVTrans array
7220: 2e 20 54 68 65 6e 20 63 6c 65 61 72 20 74 68 65  . Then clear the
7230: 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e 0a 2a   array itself..*
7240: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61  /.int sqlite3Vta
7250: 62 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  bCommit(sqlite3 
7260: 2a 64 62 29 7b 0a 20 20 63 61 6c 6c 46 69 6e 61  *db){.  callFina
7270: 6c 69 73 65 72 28 64 62 2c 20 6f 66 66 73 65 74  liser(db, offset
7280: 6f 66 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  of(sqlite3_modul
7290: 65 2c 78 43 6f 6d 6d 69 74 29 29 3b 0a 20 20 72  e,xCommit));.  r
72a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
72b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
72c0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 70   virtual table p
72d0: 56 74 61 62 20 73 75 70 70 6f 72 74 73 20 74 68  Vtab supports th
72e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
72f0: 74 65 72 66 61 63 65 0a 2a 2a 20 28 78 42 65 67  terface.** (xBeg
7300: 69 6e 2f 78 52 6f 6c 6c 62 61 63 6b 2f 78 43 6f  in/xRollback/xCo
7310: 6d 6d 69 74 20 61 6e 64 20 6f 70 74 69 6f 6e 61  mmit and optiona
7320: 6c 6c 79 20 78 53 79 6e 63 29 20 61 6e 64 20 61  lly xSync) and a
7330: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
7340: 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ** not currently
7350: 20 6f 70 65 6e 2c 20 69 6e 76 6f 6b 65 20 74 68   open, invoke th
7360: 65 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20  e xBegin method 
7370: 6e 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  now..**.** If th
7380: 65 20 78 42 65 67 69 6e 20 63 61 6c 6c 20 69 73  e xBegin call is
7390: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 6c 61   successful, pla
73a0: 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  ce the sqlite3_v
73b0: 74 61 62 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  tab pointer.** i
73c0: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 56  n the sqlite3.aV
73d0: 54 72 61 6e 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  Trans array..*/.
73e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 42  int sqlite3VtabB
73f0: 65 67 69 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  egin(sqlite3 *db
7400: 2c 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 29  , VTable *pVTab)
7410: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7420: 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
7430: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
7440: 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 53  pModule;..  /* S
7450: 70 65 63 69 61 6c 20 63 61 73 65 3a 20 49 66 20  pecial case: If 
7460: 64 62 2d 3e 61 56 54 72 61 6e 73 20 69 73 20 4e  db->aVTrans is N
7470: 55 4c 4c 20 61 6e 64 20 64 62 2d 3e 6e 56 54 72  ULL and db->nVTr
7480: 61 6e 73 20 69 73 20 67 72 65 61 74 65 72 0a 20  ans is greater. 
7490: 20 2a 2a 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74   ** than zero, t
74a0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
74b0: 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
74c0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 0a  d from within a.
74d0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
74e0: 75 6c 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  ule xSync() call
74f0: 62 61 63 6b 2e 20 49 74 20 69 73 20 69 6c 6c 65  back. It is ille
7500: 67 61 6c 20 74 6f 20 77 72 69 74 65 20 74 6f 20  gal to write to 
7510: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
7520: 64 75 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74  dule tables in t
7530: 68 69 73 20 63 61 73 65 2c 20 73 6f 20 72 65 74  his case, so ret
7540: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
7550: 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  D..  */.  if( sq
7560: 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
7570: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
7580: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
7590: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 56 54 61  .  }.  if( !pVTa
75a0: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
75b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 20 0a  SQLITE_OK;.  } .
75c0: 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 54 61    pModule = pVTa
75d0: 62 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  b->pVtab->pModul
75e0: 65 3b 0a 0a 20 20 69 66 28 20 70 4d 6f 64 75 6c  e;..  if( pModul
75f0: 65 2d 3e 78 42 65 67 69 6e 20 29 7b 0a 20 20 20  e->xBegin ){.   
7600: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
7610: 49 66 20 70 56 74 61 62 20 69 73 20 61 6c 72 65  If pVtab is alre
7620: 61 64 79 20 69 6e 20 74 68 65 20 61 56 54 72 61  ady in the aVTra
7630: 6e 73 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e  ns array, return
7640: 20 65 61 72 6c 79 20 2a 2f 0a 20 20 20 20 66 6f   early */.    fo
7650: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 56 54  r(i=0; i<db->nVT
7660: 72 61 6e 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rans; i++){.    
7670: 20 20 69 66 28 20 64 62 2d 3e 61 56 54 72 61 6e    if( db->aVTran
7680: 73 5b 69 5d 3d 3d 70 56 54 61 62 20 29 7b 0a 20  s[i]==pVTab ){. 
7690: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
76a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
76b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
76c0: 6e 76 6f 6b 65 20 74 68 65 20 78 42 65 67 69 6e  nvoke the xBegin
76d0: 20 6d 65 74 68 6f 64 2e 20 49 66 20 73 75 63 63   method. If succ
76e0: 65 73 73 66 75 6c 2c 20 61 64 64 20 74 68 65 20  essful, add the 
76f0: 76 74 61 62 20 74 6f 20 74 68 65 20 0a 20 20 20  vtab to the .   
7700: 20 2a 2a 20 73 71 6c 69 74 65 33 2e 61 56 54 72   ** sqlite3.aVTr
7710: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a  ans[] array. */.
7720: 20 20 20 20 72 63 20 3d 20 67 72 6f 77 56 54 72      rc = growVTr
7730: 61 6e 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ans(db);.    if(
7740: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7750: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f  {.      rc = pMo
7760: 64 75 6c 65 2d 3e 78 42 65 67 69 6e 28 70 56 54  dule->xBegin(pVT
7770: 61 62 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20 20  ab->pVtab);.    
7780: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7790: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
77a0: 6e 74 20 69 53 76 70 74 20 3d 20 64 62 2d 3e 6e  nt iSvpt = db->n
77b0: 53 74 61 74 65 6d 65 6e 74 20 2b 20 64 62 2d 3e  Statement + db->
77c0: 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  nSavepoint;.    
77d0: 20 20 20 20 61 64 64 54 6f 56 54 72 61 6e 73 28      addToVTrans(
77e0: 64 62 2c 20 70 56 54 61 62 29 3b 0a 20 20 20 20  db, pVTab);.    
77f0: 20 20 20 20 69 66 28 20 69 53 76 70 74 20 26 26      if( iSvpt &&
7800: 20 70 4d 6f 64 75 6c 65 2d 3e 78 53 61 76 65 70   pModule->xSavep
7810: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
7820: 20 20 70 56 54 61 62 2d 3e 69 53 61 76 65 70 6f    pVTab->iSavepo
7830: 69 6e 74 20 3d 20 69 53 76 70 74 3b 0a 20 20 20  int = iSvpt;.   
7840: 20 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64         rc = pMod
7850: 75 6c 65 2d 3e 78 53 61 76 65 70 6f 69 6e 74 28  ule->xSavepoint(
7860: 70 56 54 61 62 2d 3e 70 56 74 61 62 2c 20 69 53  pVTab->pVtab, iS
7870: 76 70 74 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  vpt-1);.        
7880: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
78a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
78b0: 20 65 69 74 68 65 72 20 74 68 65 20 78 53 61 76   either the xSav
78c0: 65 70 6f 69 6e 74 2c 20 78 52 6f 6c 6c 62 61 63  epoint, xRollbac
78d0: 6b 54 6f 20 6f 72 20 78 52 65 6c 65 61 73 65 20  kTo or xRelease 
78e0: 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c 0a 2a 2a  method of all.**
78f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
7900: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68  that currently h
7910: 61 76 65 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  ave an open tran
7920: 73 61 63 74 69 6f 6e 2e 20 50 61 73 73 20 69 53  saction. Pass iS
7930: 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 61 73 20 74  avepoint.** as t
7940: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7950: 6e 74 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  nt to the virtua
7960: 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 20 69  l table method i
7970: 6e 76 6f 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nvoked..**.** If
7980: 20 6f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54   op is SAVEPOINT
7990: 5f 42 45 47 49 4e 2c 20 74 68 65 20 78 53 61 76  _BEGIN, the xSav
79a0: 65 70 6f 69 6e 74 20 6d 65 74 68 6f 64 20 69 73  epoint method is
79b0: 20 69 6e 76 6f 6b 65 64 2e 20 49 66 20 69 74 20   invoked. If it 
79c0: 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
79d0: 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 20 78 52  ROLLBACK, the xR
79e0: 6f 6c 6c 62 61 63 6b 54 6f 20 6d 65 74 68 6f 64  ollbackTo method
79f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
7a00: 6f 70 20 69 73 20 0a 2a 2a 20 53 41 56 45 50 4f  op is .** SAVEPO
7a10: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
7a20: 6e 20 74 68 65 20 78 52 65 6c 65 61 73 65 20 6d  n the xRelease m
7a30: 65 74 68 6f 64 20 6f 66 20 65 61 63 68 20 76 69  ethod of each vi
7a40: 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
7a50: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  .** an open tran
7a60: 73 61 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  saction is invok
7a70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
7a80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
7a90: 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20 61 6e  ethod returns an
7aa0: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
7ab0: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
7ac0: 2c 20 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  , .** processing
7ad0: 20 69 73 20 61 62 61 6e 64 6f 6e 65 64 20 61 6e   is abandoned an
7ae0: 64 20 74 68 65 20 65 72 72 6f 72 20 72 65 74 75  d the error retu
7af0: 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
7b00: 65 72 20 6f 66 20 74 68 69 73 0a 2a 2a 20 66 75  er of this.** fu
7b10: 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
7b20: 6c 79 2e 20 49 66 20 61 6c 6c 20 63 61 6c 6c 73  ly. If all calls
7b30: 20 74 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c   to virtual tabl
7b40: 65 20 6d 65 74 68 6f 64 73 20 61 72 65 20 73 75  e methods are su
7b50: 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c  ccessful,.** SQL
7b60: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
7b70: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
7b80: 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
7b90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
7ba0: 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
7bb0: 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
7bc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
7bd0: 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
7be0: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 7c 7c 6f 70  OINT_RELEASE||op
7bf0: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
7c00: 42 41 43 4b 7c 7c 6f 70 3d 3d 53 41 56 45 50 4f  BACK||op==SAVEPO
7c10: 49 4e 54 5f 42 45 47 49 4e 20 29 3b 0a 20 20 61  INT_BEGIN );.  a
7c20: 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
7c30: 74 3e 3d 2d 31 20 29 3b 0a 20 20 69 66 28 20 64  t>=-1 );.  if( d
7c40: 62 2d 3e 61 56 54 72 61 6e 73 20 29 7b 0a 20 20  b->aVTrans ){.  
7c50: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
7c60: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
7c70: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 56 54  _OK && i<db->nVT
7c80: 72 61 6e 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rans; i++){.    
7c90: 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 20    VTable *pVTab 
7ca0: 3d 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 69 5d  = db->aVTrans[i]
7cb0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71  ;.      const sq
7cc0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
7cd0: 6f 64 20 3d 20 70 56 54 61 62 2d 3e 70 4d 6f 64  od = pVTab->pMod
7ce0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20  ->pModule;.     
7cf0: 20 69 66 28 20 70 56 54 61 62 2d 3e 70 56 74 61   if( pVTab->pVta
7d00: 62 20 26 26 20 70 4d 6f 64 2d 3e 69 56 65 72 73  b && pMod->iVers
7d10: 69 6f 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  ion>=2 ){.      
7d20: 20 20 69 6e 74 20 28 2a 78 4d 65 74 68 6f 64 29    int (*xMethod)
7d30: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2c  (sqlite3_vtab *,
7d40: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73   int);.        s
7d50: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
7d60: 20 20 20 20 20 20 20 63 61 73 65 20 53 41 56 45         case SAVE
7d70: 50 4f 49 4e 54 5f 42 45 47 49 4e 3a 0a 20 20 20  POINT_BEGIN:.   
7d80: 20 20 20 20 20 20 20 20 20 78 4d 65 74 68 6f 64           xMethod
7d90: 20 3d 20 70 4d 6f 64 2d 3e 78 53 61 76 65 70 6f   = pMod->xSavepo
7da0: 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  int;.           
7db0: 20 70 56 54 61 62 2d 3e 69 53 61 76 65 70 6f 69   pVTab->iSavepoi
7dc0: 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 2b  nt = iSavepoint+
7dd0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
7de0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
7df0: 63 61 73 65 20 53 41 56 45 50 4f 49 4e 54 5f 52  case SAVEPOINT_R
7e00: 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20  OLLBACK:.       
7e10: 20 20 20 20 20 78 4d 65 74 68 6f 64 20 3d 20 70       xMethod = p
7e20: 4d 6f 64 2d 3e 78 52 6f 6c 6c 62 61 63 6b 54 6f  Mod->xRollbackTo
7e30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
7e40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
7e50: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
7e60: 20 20 20 20 78 4d 65 74 68 6f 64 20 3d 20 70 4d      xMethod = pM
7e70: 6f 64 2d 3e 78 52 65 6c 65 61 73 65 3b 0a 20 20  od->xRelease;.  
7e80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
7e90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7ea0: 20 20 20 69 66 28 20 78 4d 65 74 68 6f 64 20 26     if( xMethod &
7eb0: 26 20 70 56 54 61 62 2d 3e 69 53 61 76 65 70 6f  & pVTab->iSavepo
7ec0: 69 6e 74 3e 69 53 61 76 65 70 6f 69 6e 74 20 29  int>iSavepoint )
7ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
7ee0: 20 78 4d 65 74 68 6f 64 28 70 56 54 61 62 2d 3e   xMethod(pVTab->
7ef0: 70 56 74 61 62 2c 20 69 53 61 76 65 70 6f 69 6e  pVtab, iSavepoin
7f00: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
7f10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7f20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7f30: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
7f40: 70 61 72 61 6d 65 74 65 72 20 28 70 44 65 66 29  parameter (pDef)
7f50: 20 69 73 20 61 20 66 75 6e 63 74 69 6f 6e 20 69   is a function i
7f60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
7f70: 54 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 70 61  The.** second pa
7f80: 72 61 6d 65 74 65 72 20 28 70 45 78 70 72 29 20  rameter (pExpr) 
7f90: 69 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  is the first arg
7fa0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
7fb0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 70 45  nction..** If pE
7fc0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  xpr is a column 
7fd0: 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
7fe0: 6c 65 2c 20 74 68 65 6e 20 6c 65 74 20 74 68 65  le, then let the
7ff0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
8000: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8010: 20 68 61 76 65 20 61 6e 20 6f 70 70 6f 72 74 75   have an opportu
8020: 6e 69 74 79 20 74 6f 20 6f 76 65 72 6c 6f 61 64  nity to overload
8030: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
8040: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8050: 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
8060: 6f 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ow virtual table
8070: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
8080: 20 74 6f 0a 2a 2a 20 6f 76 65 72 6c 6f 61 64 20   to.** overload 
8090: 4d 41 54 43 48 2c 20 4c 49 4b 45 2c 20 47 4c 4f  MATCH, LIKE, GLO
80a0: 42 2c 20 61 6e 64 20 52 45 47 45 58 50 20 6f 70  B, and REGEXP op
80b0: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 52  erators..**.** R
80c0: 65 74 75 72 6e 20 65 69 74 68 65 72 20 74 68 65  eturn either the
80d0: 20 70 44 65 66 20 61 72 67 75 6d 65 6e 74 20 28   pDef argument (
80e0: 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 63 68  indicating no ch
80f0: 61 6e 67 65 29 20 6f 72 20 61 20 0a 2a 2a 20 6e  ange) or a .** n
8100: 65 77 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ew FuncDef struc
8110: 74 75 72 65 20 74 68 61 74 20 69 73 20 6d 61 72  ture that is mar
8120: 6b 65 64 20 61 73 20 65 70 68 65 6d 65 72 61 6c  ked as ephemeral
8130: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 53 51   using the.** SQ
8140: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 20  LITE_FUNC_EPHEM 
8150: 66 6c 61 67 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66  flag..*/.FuncDef
8160: 20 2a 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65   *sqlite3VtabOve
8170: 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 0a 20  rloadFunction(. 
8180: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
8190: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
81a0: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 72 65 70 6f  nection for repo
81b0: 72 74 69 6e 67 20 6d 61 6c 6c 6f 63 20 70 72 6f  rting malloc pro
81c0: 62 6c 65 6d 73 20 2a 2f 0a 20 20 46 75 6e 63 44  blems */.  FuncD
81d0: 65 66 20 2a 70 44 65 66 2c 20 20 2f 2a 20 46 75  ef *pDef,  /* Fu
81e0: 6e 63 74 69 6f 6e 20 74 6f 20 70 6f 73 73 69 62  nction to possib
81f0: 6c 79 20 6f 76 65 72 6c 6f 61 64 20 2a 2f 0a 20  ly overload */. 
8200: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
8210: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8220: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
8230: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  unction */.  Exp
8240: 72 20 2a 70 45 78 70 72 20 20 20 20 20 2f 2a 20  r *pExpr     /* 
8250: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
8260: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
8270: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
8280: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  ab;.  sqlite3_vt
8290: 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 73 71 6c  ab *pVtab;.  sql
82a0: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
82b0: 64 3b 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  d;.  void (*xSFu
82c0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
82d0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
82e0: 5f 76 61 6c 75 65 2a 2a 29 20 3d 20 30 3b 0a 20  _value**) = 0;. 
82f0: 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b   void *pArg = 0;
8300: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 77  .  FuncDef *pNew
8310: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
8320: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
8330: 65 65 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ee the left oper
8340: 61 6e 64 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  and is a column 
8350: 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
8360: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  le */.  if( NEVE
8370: 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
8380: 74 75 72 6e 20 70 44 65 66 3b 0a 20 20 69 66 28  turn pDef;.  if(
8390: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
83a0: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 70  OLUMN ) return p
83b0: 44 65 66 3b 0a 20 20 70 54 61 62 20 3d 20 70 45  Def;.  pTab = pE
83c0: 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 69  xpr->y.pTab;.  i
83d0: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
83e0: 75 72 6e 20 70 44 65 66 3b 0a 20 20 69 66 28 20  urn pDef;.  if( 
83f0: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
8400: 20 29 20 72 65 74 75 72 6e 20 70 44 65 66 3b 0a   ) return pDef;.
8410: 20 20 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65    pVtab = sqlite
8420: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
8430: 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 61  Tab)->pVtab;.  a
8440: 73 73 65 72 74 28 20 70 56 74 61 62 21 3d 30 20  ssert( pVtab!=0 
8450: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 74  );.  assert( pVt
8460: 61 62 2d 3e 70 4d 6f 64 75 6c 65 21 3d 30 20 29  ab->pModule!=0 )
8470: 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 73 71 6c 69  ;.  pMod = (sqli
8480: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74  te3_module *)pVt
8490: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 69  ab->pModule;.  i
84a0: 66 28 20 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75  f( pMod->xFindFu
84b0: 6e 63 74 69 6f 6e 3d 3d 30 20 29 20 72 65 74 75  nction==0 ) retu
84c0: 72 6e 20 70 44 65 66 3b 0a 20 0a 20 20 2f 2a 20  rn pDef;. .  /* 
84d0: 43 61 6c 6c 20 74 68 65 20 78 46 69 6e 64 46 75  Call the xFindFu
84e0: 6e 63 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 6e  nction method on
84f0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
8500: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
8510: 6e 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  n.  ** to see if
8520: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
8530: 69 6f 6e 20 77 61 6e 74 73 20 74 6f 20 6f 76 65  ion wants to ove
8540: 72 6c 6f 61 64 20 74 68 69 73 20 66 75 6e 63 74  rload this funct
8550: 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ion..  **.  ** T
8560: 68 6f 75 67 68 20 75 6e 64 6f 63 75 6d 65 6e 74  hough undocument
8570: 65 64 2c 20 77 65 20 68 61 76 65 20 68 69 73 74  ed, we have hist
8580: 6f 72 69 63 61 6c 6c 79 20 61 6c 77 61 79 73 20  orically always 
8590: 69 6e 76 6f 6b 65 64 20 78 46 69 6e 64 46 75 6e  invoked xFindFun
85a0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ction.  ** with 
85b0: 61 6e 20 61 6c 6c 20 6c 6f 77 65 72 2d 63 61 73  an all lower-cas
85c0: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
85d0: 20 20 43 6f 6e 74 69 6e 75 65 20 69 6e 20 74 68    Continue in th
85e0: 69 73 20 74 72 61 64 69 74 69 6f 6e 20 74 6f 0a  is tradition to.
85f0: 20 20 2a 2a 20 61 76 6f 69 64 20 61 6e 79 20 63    ** avoid any c
8600: 68 61 6e 63 65 20 6f 66 20 61 6e 20 69 6e 63 6f  hance of an inco
8610: 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a  mpatibility..  *
8620: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8630: 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 69 6e  DEBUG.  {.    in
8640: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
8650: 3b 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b 69 5d  ; pDef->zName[i]
8660: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e  ; i++){.      un
8670: 73 69 67 6e 65 64 20 63 68 61 72 20 78 20 3d 20  signed char x = 
8680: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
8690: 44 65 66 2d 3e 7a 4e 61 6d 65 5b 69 5d 3b 0a 20  Def->zName[i];. 
86a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3d 3d       assert( x==
86b0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
86c0: 77 65 72 5b 78 5d 20 29 3b 0a 20 20 20 20 7d 0a  wer[x] );.    }.
86d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20    }.#endif.  rc 
86e0: 3d 20 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75 6e  = pMod->xFindFun
86f0: 63 74 69 6f 6e 28 70 56 74 61 62 2c 20 6e 41 72  ction(pVtab, nAr
8700: 67 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  g, pDef->zName, 
8710: 26 78 53 46 75 6e 63 2c 20 26 70 41 72 67 29 3b  &xSFunc, &pArg);
8720: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
8730: 20 20 20 20 72 65 74 75 72 6e 20 70 44 65 66 3b      return pDef;
8740: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
8750: 65 20 61 20 6e 65 77 20 65 70 68 65 6d 65 72 61  e a new ephemera
8760: 6c 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  l function defin
8770: 69 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6f 76  ition for the ov
8780: 65 72 6c 6f 61 64 65 64 0a 20 20 2a 2a 20 66 75  erloaded.  ** fu
8790: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 4e 65 77  nction */.  pNew
87a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
87b0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
87c0: 66 28 2a 70 4e 65 77 29 0a 20 20 20 20 20 20 20  f(*pNew).       
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65 33 53        + sqlite3S
87f0: 74 72 6c 65 6e 33 30 28 70 44 65 66 2d 3e 7a 4e  trlen30(pDef->zN
8800: 61 6d 65 29 20 2b 20 31 29 3b 0a 20 20 69 66 28  ame) + 1);.  if(
8810: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
8820: 72 65 74 75 72 6e 20 70 44 65 66 3b 0a 20 20 7d  return pDef;.  }
8830: 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 44 65 66  .  *pNew = *pDef
8840: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20  ;.  pNew->zName 
8850: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26  = (const char*)&
8860: 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70  pNew[1];.  memcp
8870: 79 28 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  y((char*)&pNew[1
8880: 5d 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ], pDef->zName, 
8890: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
88a0: 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 2b 31 29 3b  pDef->zName)+1);
88b0: 0a 20 20 70 4e 65 77 2d 3e 78 53 46 75 6e 63 20  .  pNew->xSFunc 
88c0: 3d 20 78 53 46 75 6e 63 3b 0a 20 20 70 4e 65 77  = xSFunc;.  pNew
88d0: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 41  ->pUserData = pA
88e0: 72 67 3b 0a 20 20 70 4e 65 77 2d 3e 66 75 6e 63  rg;.  pNew->func
88f0: 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
8900: 46 55 4e 43 5f 45 50 48 45 4d 3b 0a 20 20 72 65  FUNC_EPHEM;.  re
8910: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
8920: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 76 69  .** Make sure vi
8930: 72 74 75 61 6c 20 74 61 62 6c 65 20 70 54 61 62  rtual table pTab
8940: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
8950: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 70 56   the pParse->apV
8960: 69 72 74 75 61 6c 4c 6f 63 6b 5b 5d 0a 2a 2a 20  irtualLock[].** 
8970: 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 61 6e  array so that an
8980: 20 4f 50 5f 56 42 65 67 69 6e 20 77 69 6c 6c 20   OP_VBegin will 
8990: 67 65 74 20 67 65 6e 65 72 61 74 65 64 20 66 6f  get generated fo
89a0: 72 20 69 74 2e 20 20 41 64 64 20 70 54 61 62 20  r it.  Add pTab 
89b0: 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  to the.** array 
89c0: 69 66 20 69 74 20 69 73 20 6d 69 73 73 69 6e 67  if it is missing
89d0: 2e 20 20 49 66 20 70 54 61 62 20 69 73 20 61 6c  .  If pTab is al
89e0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 61 72 72  ready in the arr
89f0: 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
8a00: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  .** is a no-op..
8a10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8a20: 74 61 62 4d 61 6b 65 57 72 69 74 61 62 6c 65 28  tabMakeWritable(
8a30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
8a40: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 50  able *pTab){.  P
8a50: 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
8a60: 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
8a70: 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
8a80: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 54 61    int i, n;.  Ta
8a90: 62 6c 65 20 2a 2a 61 70 56 74 61 62 4c 6f 63 6b  ble **apVtabLock
8aa0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  ;..  assert( IsV
8ab0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a  irtual(pTab) );.
8ac0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
8ad0: 70 6c 65 76 65 6c 2d 3e 6e 56 74 61 62 4c 6f 63  plevel->nVtabLoc
8ae0: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  k; i++){.    if(
8af0: 20 70 54 61 62 3d 3d 70 54 6f 70 6c 65 76 65 6c   pTab==pToplevel
8b00: 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 20  ->apVtabLock[i] 
8b10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
8b20: 6e 20 3d 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  n = (pToplevel->
8b30: 6e 56 74 61 62 4c 6f 63 6b 2b 31 29 2a 73 69 7a  nVtabLock+1)*siz
8b40: 65 6f 66 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  eof(pToplevel->a
8b50: 70 56 74 61 62 4c 6f 63 6b 5b 30 5d 29 3b 0a 20  pVtabLock[0]);. 
8b60: 20 61 70 56 74 61 62 4c 6f 63 6b 20 3d 20 73 71   apVtabLock = sq
8b70: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
8b80: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70 56 74 61  pToplevel->apVta
8b90: 62 4c 6f 63 6b 2c 20 6e 29 3b 0a 20 20 69 66 28  bLock, n);.  if(
8ba0: 20 61 70 56 74 61 62 4c 6f 63 6b 20 29 7b 0a 20   apVtabLock ){. 
8bb0: 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70     pToplevel->ap
8bc0: 56 74 61 62 4c 6f 63 6b 20 3d 20 61 70 56 74 61  VtabLock = apVta
8bd0: 62 4c 6f 63 6b 3b 0a 20 20 20 20 70 54 6f 70 6c  bLock;.    pTopl
8be0: 65 76 65 6c 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  evel->apVtabLock
8bf0: 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 56 74 61  [pToplevel->nVta
8c00: 62 4c 6f 63 6b 2b 2b 5d 20 3d 20 70 54 61 62 3b  bLock++] = pTab;
8c10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
8c20: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 54  lite3OomFault(pT
8c30: 6f 70 6c 65 76 65 6c 2d 3e 64 62 29 3b 0a 20 20  oplevel->db);.  
8c40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  }.}../*.** Check
8c50: 20 74 6f 20 73 65 65 20 69 66 20 76 69 72 74 75   to see if virtu
8c60: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
8c70: 70 4d 6f 64 20 63 61 6e 20 62 65 20 68 61 76 65  pMod can be have
8c80: 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 0a 2a 2a   an eponymous.**
8c90: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
8ca0: 6e 73 74 61 6e 63 65 2e 20 20 49 66 20 69 74 20  nstance.  If it 
8cb0: 63 61 6e 2c 20 63 72 65 61 74 65 20 6f 6e 65 20  can, create one 
8cc0: 69 66 20 6f 6e 65 20 64 6f 65 73 20 6e 6f 74 20  if one does not 
8cd0: 61 6c 72 65 61 64 79 0a 2a 2a 20 65 78 69 73 74  already.** exist
8ce0: 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  . Return non-zer
8cf0: 6f 20 69 66 20 74 68 65 20 65 70 6f 6e 79 6d 6f  o if the eponymo
8d00: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
8d10: 20 69 6e 73 74 61 6e 63 65 20 65 78 69 73 74 73   instance exists
8d20: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
8d30: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 20 61  utine returns, a
8d40: 6e 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  nd return zero i
8d50: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
8d60: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 70  ist..**.** An ep
8d70: 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20  onymous virtual 
8d80: 74 61 62 6c 65 20 69 6e 73 74 61 6e 63 65 20 69  table instance i
8d90: 73 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 61  s one that is na
8da0: 6d 65 64 20 61 66 74 65 72 20 69 74 73 0a 2a 2a  med after its.**
8db0: 20 6d 6f 64 75 6c 65 2c 20 61 6e 64 20 6d 6f 72   module, and mor
8dc0: 65 20 69 6d 70 6f 72 74 61 6e 74 6c 79 2c 20 64  e importantly, d
8dd0: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
8de0: 61 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  a CREATE VIRTUAL
8df0: 20 54 41 42 4c 45 0a 2a 2a 20 73 74 61 74 65 6d   TABLE.** statem
8e00: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
8e10: 63 6f 6d 65 20 69 6e 74 6f 20 65 78 69 73 74 61  come into exista
8e20: 6e 63 65 2e 20 20 45 70 6f 6e 79 6d 6f 75 73 20  nce.  Eponymous 
8e30: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2a  virtual table.**
8e40: 20 69 6e 73 74 61 6e 63 65 73 20 61 6c 77 61 79   instances alway
8e50: 73 20 65 78 69 73 74 2e 20 20 54 68 65 79 20 63  s exist.  They c
8e60: 61 6e 6e 6f 74 20 62 65 20 44 52 4f 50 2d 65 64  annot be DROP-ed
8e70: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 76 69 72 74  ..**.** Any virt
8e80: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
8e90: 20 66 6f 72 20 77 68 69 63 68 20 78 43 6f 6e 6e   for which xConn
8ea0: 65 63 74 20 61 6e 64 20 78 43 72 65 61 74 65 20  ect and xCreate 
8eb0: 61 72 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  are the same.** 
8ec0: 6d 65 74 68 6f 64 20 63 61 6e 20 68 61 76 65 20  method can have 
8ed0: 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
8ee0: 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 61  tual table insta
8ef0: 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nce..*/.int sqli
8f00: 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73  te3VtabEponymous
8f10: 54 61 62 6c 65 49 6e 69 74 28 50 61 72 73 65 20  TableInit(Parse 
8f20: 2a 70 50 61 72 73 65 2c 20 4d 6f 64 75 6c 65 20  *pParse, Module 
8f30: 2a 70 4d 6f 64 29 7b 0a 20 20 63 6f 6e 73 74 20  *pMod){.  const 
8f40: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
8f50: 70 4d 6f 64 75 6c 65 20 3d 20 70 4d 6f 64 2d 3e  pModule = pMod->
8f60: 70 4d 6f 64 75 6c 65 3b 0a 20 20 54 61 62 6c 65  pModule;.  Table
8f70: 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72 20 2a   *pTab;.  char *
8f80: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
8f90: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
8fa0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8fb0: 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f    if( pMod->pEpo
8fc0: 54 61 62 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Tab ) return 1;.
8fd0: 20 20 69 66 28 20 70 4d 6f 64 75 6c 65 2d 3e 78    if( pModule->x
8fe0: 43 72 65 61 74 65 21 3d 30 20 26 26 20 70 4d 6f  Create!=0 && pMo
8ff0: 64 75 6c 65 2d 3e 78 43 72 65 61 74 65 21 3d 70  dule->xCreate!=p
9000: 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6e 6e 65 63 74  Module->xConnect
9010: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
9020: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
9030: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9040: 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
9050: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
9060: 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 2d 3e  turn 0;.  pTab->
9070: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
9080: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4d 6f 64  bStrDup(db, pMod
9090: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
90a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  pTab->zName==0 )
90b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
90c0: 72 65 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ree(db, pTab);. 
90d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
90e0: 0a 20 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  .  pMod->pEpoTab
90f0: 20 3d 20 70 54 61 62 3b 0a 20 20 70 54 61 62 2d   = pTab;.  pTab-
9100: 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
9110: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20  pTab->pSchema = 
9120: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
9130: 6d 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ma;.  assert( pT
9140: 61 62 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 3d 3d  ab->nModuleArg==
9150: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  0 );.  pTab->iPK
9160: 65 79 20 3d 20 2d 31 3b 0a 20 20 61 64 64 4d 6f  ey = -1;.  addMo
9170: 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62 2c  duleArgument(db,
9180: 20 70 54 61 62 2c 20 73 71 6c 69 74 65 33 44 62   pTab, sqlite3Db
9190: 53 74 72 44 75 70 28 64 62 2c 20 70 54 61 62 2d  StrDup(db, pTab-
91a0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 61 64 64 4d  >zName));.  addM
91b0: 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62  oduleArgument(db
91c0: 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 61 64  , pTab, 0);.  ad
91d0: 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28  dModuleArgument(
91e0: 64 62 2c 20 70 54 61 62 2c 20 73 71 6c 69 74 65  db, pTab, sqlite
91f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 54  3DbStrDup(db, pT
9200: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 72  ab->zName));.  r
9210: 63 20 3d 20 76 74 61 62 43 61 6c 6c 43 6f 6e 73  c = vtabCallCons
9220: 74 72 75 63 74 6f 72 28 64 62 2c 20 70 54 61 62  tructor(db, pTab
9230: 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64 75 6c 65 2d  , pMod, pModule-
9240: 3e 78 43 6f 6e 6e 65 63 74 2c 20 26 7a 45 72 72  >xConnect, &zErr
9250: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
9260: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9270: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
9280: 20 7a 45 72 72 29 3b 0a 20 20 20 20 73 71 6c 69   zErr);.    sqli
9290: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
92a0: 72 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rr);.    sqlite3
92b0: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
92c0: 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64  leClear(db, pMod
92d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
92e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
92f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
9300: 74 68 65 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69  the eponymous vi
9310: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  rtual table inst
9320: 61 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  ance associated 
9330: 77 69 74 68 0a 2a 2a 20 76 69 72 74 75 61 6c 20  with.** virtual 
9340: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 70 4d 6f  table module pMo
9350: 64 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  d, if it exists.
9360: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9370: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
9380: 6c 65 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20  leClear(sqlite3 
9390: 2a 64 62 2c 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f  *db, Module *pMo
93a0: 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  d){.  Table *pTa
93b0: 62 20 3d 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  b = pMod->pEpoTa
93c0: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 21 3d 30  b;.  if( pTab!=0
93d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20   ){.    /* Mark 
93e0: 74 68 65 20 74 61 62 6c 65 20 61 73 20 45 70 68  the table as Eph
93f0: 65 6d 65 72 61 6c 20 70 72 69 6f 72 20 74 6f 20  emeral prior to 
9400: 64 65 6c 65 74 69 6e 67 20 69 74 2c 20 73 6f 20  deleting it, so 
9410: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
9420: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
9430: 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  le() routine wil
9440: 6c 20 6b 6e 6f 77 20 74 68 61 74 20 69 74 20 69  l know that it i
9450: 73 20 6e 6f 74 20 73 74 6f 72 65 64 20 69 6e 20  s not stored in 
9460: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65  .    ** the sche
9470: 6d 61 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d  ma. */.    pTab-
9480: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
9490: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 73  Ephemeral;.    s
94a0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
94b0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
94c0: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 3d   pMod->pEpoTab =
94d0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
94e0: 20 52 65 74 75 72 6e 20 74 68 65 20 4f 4e 20 43   Return the ON C
94f0: 4f 4e 46 4c 49 43 54 20 72 65 73 6f 6c 75 74 69  ONFLICT resoluti
9500: 6f 6e 20 6d 6f 64 65 20 69 6e 20 65 66 66 65 63  on mode in effec
9510: 74 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61  t for the virtua
9520: 6c 0a 2a 2a 20 74 61 62 6c 65 20 75 70 64 61 74  l.** table updat
9530: 65 20 6f 70 65 72 61 74 69 6f 6e 20 63 75 72 72  e operation curr
9540: 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
9550: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  s..**.** The res
9560: 75 6c 74 73 20 6f 66 20 74 68 69 73 20 72 6f 75  ults of this rou
9570: 74 69 6e 65 20 61 72 65 20 75 6e 64 65 66 69 6e  tine are undefin
9580: 65 64 20 75 6e 6c 65 73 73 20 69 74 20 69 73 20  ed unless it is 
9590: 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77  called from.** w
95a0: 69 74 68 69 6e 20 61 6e 20 78 55 70 64 61 74 65  ithin an xUpdate
95b0: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20   method..*/.int 
95c0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f  sqlite3_vtab_on_
95d0: 63 6f 6e 66 6c 69 63 74 28 73 71 6c 69 74 65 33  conflict(sqlite3
95e0: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
95f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
9600: 68 61 72 20 61 4d 61 70 5b 5d 20 3d 20 7b 20 0a  har aMap[] = { .
9610: 20 20 20 20 53 51 4c 49 54 45 5f 52 4f 4c 4c 42      SQLITE_ROLLB
9620: 41 43 4b 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  ACK, SQLITE_ABOR
9630: 54 2c 20 53 51 4c 49 54 45 5f 46 41 49 4c 2c 20  T, SQLITE_FAIL, 
9640: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 53  SQLITE_IGNORE, S
9650: 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 0a 20  QLITE_REPLACE . 
9660: 20 7d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   };.#ifdef SQLIT
9670: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
9680: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
9690: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
96a0: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
96b0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
96c0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
96d0: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3d 3d 31 20   OE_Rollback==1 
96e0: 26 26 20 4f 45 5f 41 62 6f 72 74 3d 3d 32 20 26  && OE_Abort==2 &
96f0: 26 20 4f 45 5f 46 61 69 6c 3d 3d 33 20 29 3b 0a  & OE_Fail==3 );.
9700: 20 20 61 73 73 65 72 74 28 20 4f 45 5f 49 67 6e    assert( OE_Ign
9710: 6f 72 65 3d 3d 34 20 26 26 20 4f 45 5f 52 65 70  ore==4 && OE_Rep
9720: 6c 61 63 65 3d 3d 35 20 29 3b 0a 20 20 61 73 73  lace==5 );.  ass
9730: 65 72 74 28 20 64 62 2d 3e 76 74 61 62 4f 6e 43  ert( db->vtabOnC
9740: 6f 6e 66 6c 69 63 74 3e 3d 31 20 26 26 20 64 62  onflict>=1 && db
9750: 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74  ->vtabOnConflict
9760: 3c 3d 35 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  <=5 );.  return 
9770: 28 69 6e 74 29 61 4d 61 70 5b 64 62 2d 3e 76 74  (int)aMap[db->vt
9780: 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 2d 31 5d 3b  abOnConflict-1];
9790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 66  .}../*.** Call f
97a0: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78  rom within the x
97b0: 43 72 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e  Create() or xCon
97c0: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 73 20 74  nect() methods t
97d0: 6f 20 70 72 6f 76 69 64 65 20 0a 2a 2a 20 74 68  o provide .** th
97e0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69  e SQLite core wi
97f0: 74 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  th additional in
9800: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
9810: 74 68 65 20 62 65 68 61 76 69 6f 72 0a 2a 2a 20  the behavior.** 
9820: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
9830: 61 62 6c 65 20 62 65 69 6e 67 20 69 6d 70 6c 65  able being imple
9840: 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mented..*/.int s
9850: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66  qlite3_vtab_conf
9860: 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ig(sqlite3 *db, 
9870: 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
9880: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
9890: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
98a0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
98b0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
98c0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
98d0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
98e0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
98f0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
9900: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
9910: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
9920: 6d 75 74 65 78 29 3b 0a 20 20 76 61 5f 73 74 61  mutex);.  va_sta
9930: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
9940: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
9950: 63 61 73 65 20 53 51 4c 49 54 45 5f 56 54 41 42  case SQLITE_VTAB
9960: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50 50  _CONSTRAINT_SUPP
9970: 4f 52 54 3a 20 7b 0a 20 20 20 20 20 20 56 74 61  ORT: {.      Vta
9980: 62 43 74 78 20 2a 70 20 3d 20 64 62 2d 3e 70 56  bCtx *p = db->pV
9990: 74 61 62 43 74 78 3b 0a 20 20 20 20 20 20 69 66  tabCtx;.      if
99a0: 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( !p ){.        
99b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
99c0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  SE_BKPT;.      }
99d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
99e0: 73 65 72 74 28 20 70 2d 3e 70 54 61 62 3d 3d 30  sert( p->pTab==0
99f0: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 2d   || IsVirtual(p-
9a00: 3e 70 54 61 62 29 20 29 3b 0a 20 20 20 20 20 20  >pTab) );.      
9a10: 20 20 70 2d 3e 70 56 54 61 62 6c 65 2d 3e 62 43    p->pVTable->bC
9a20: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 28 75 38 29  onstraint = (u8)
9a30: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
9a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9a50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9a60: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
9a70: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  c = SQLITE_MISUS
9a80: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 62 72  E_BKPT;.      br
9a90: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  eak;.  }.  va_en
9aa0: 64 28 61 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  d(ap);..  if( rc
9ab0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73 71  !=SQLITE_OK ) sq
9ac0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
9ad0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
9ae0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9af0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
9b00: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
9b10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9b20: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a              UALTABLE */.