/ Hex Artifact Content
Login

Artifact 8665561f244c137a2d17b5c3e5910d7303054fe841c5d510e53f23beb0089594:


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 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c20: 54 68 65 20 64 61 74 61 62 61 73 65 20 74 68 65  The database the
2c30: 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67 20   table is being 
2c40: 63 72 65 61 74 65 64 20 69 6e 20 2a 2f 0a 20 20  created in */.  
2c50: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
2c60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
2c70: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
2c80: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2ca0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2cb0: 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 53 74   */..  sqlite3St
2cc0: 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
2cd0: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
2ce0: 20 30 2c 20 30 2c 20 31 2c 20 69 66 4e 6f 74 45   0, 0, 1, ifNotE
2cf0: 78 69 73 74 73 29 3b 0a 20 20 70 54 61 62 6c 65  xists);.  pTable
2d00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
2d10: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62  able;.  if( pTab
2d20: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
2d30: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 54 61    assert( 0==pTa
2d40: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 0a  ble->pIndex );..
2d50: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2d60: 62 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  b;.  iDb = sqlit
2d70: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2d80: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  db, pTable->pSch
2d90: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
2da0: 69 44 62 3e 3d 30 20 29 3b 0a 0a 20 20 61 73 73  iDb>=0 );..  ass
2db0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 4d 6f  ert( pTable->nMo
2dc0: 64 75 6c 65 41 72 67 3d 3d 30 20 29 3b 0a 20 20  duleArg==0 );.  
2dd0: 61 64 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e  addModuleArgumen
2de0: 74 28 64 62 2c 20 70 54 61 62 6c 65 2c 20 73 71  t(db, pTable, sq
2df0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
2e00: 65 6e 28 64 62 2c 20 70 4d 6f 64 75 6c 65 4e 61  en(db, pModuleNa
2e10: 6d 65 29 29 3b 0a 20 20 61 64 64 4d 6f 64 75 6c  me));.  addModul
2e20: 65 41 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 54  eArgument(db, pT
2e30: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 61 64 64 4d  able, 0);.  addM
2e40: 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62  oduleArgument(db
2e50: 2c 20 70 54 61 62 6c 65 2c 20 73 71 6c 69 74 65  , pTable, sqlite
2e60: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 54  3DbStrDup(db, pT
2e70: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  able->zName));. 
2e80: 20 61 73 73 65 72 74 28 20 28 70 50 61 72 73 65   assert( (pParse
2e90: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3d 3d  ->sNameToken.z==
2ea0: 70 4e 61 6d 65 32 2d 3e 7a 20 26 26 20 70 4e 61  pName2->z && pNa
2eb0: 6d 65 32 2d 3e 7a 21 3d 30 29 0a 20 20 20 20 20  me2->z!=0).     
2ec0: 20 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 73 4e    || (pParse->sN
2ed0: 61 6d 65 54 6f 6b 65 6e 2e 7a 3d 3d 70 4e 61 6d  ameToken.z==pNam
2ee0: 65 31 2d 3e 7a 20 26 26 20 70 4e 61 6d 65 32 2d  e1->z && pName2-
2ef0: 3e 7a 3d 3d 30 29 0a 20 20 29 3b 0a 20 20 70 50  >z==0).  );.  pP
2f00: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
2f10: 2e 6e 20 3d 20 28 69 6e 74 29 28 0a 20 20 20 20  .n = (int)(.    
2f20: 20 20 26 70 4d 6f 64 75 6c 65 4e 61 6d 65 2d 3e    &pModuleName->
2f30: 7a 5b 70 4d 6f 64 75 6c 65 4e 61 6d 65 2d 3e 6e  z[pModuleName->n
2f40: 5d 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  ] - pParse->sNam
2f50: 65 54 6f 6b 65 6e 2e 7a 0a 20 20 29 3b 0a 0a 23  eToken.z.  );..#
2f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f70: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
2f80: 0a 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61  .  /* Creating a
2f90: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
2fa0: 6e 76 6f 6b 65 73 20 74 68 65 20 61 75 74 68 6f  nvokes the autho
2fb0: 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
2fc0: 6b 20 74 77 69 63 65 2e 0a 20 20 2a 2a 20 54 68  k twice..  ** Th
2fd0: 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
2fe0: 6f 6e 2c 20 74 6f 20 6f 62 74 61 69 6e 20 70 65  on, to obtain pe
2ff0: 72 6d 69 73 73 69 6f 6e 20 74 6f 20 49 4e 53 45  rmission to INSE
3000: 52 54 20 61 20 72 6f 77 20 69 6e 74 6f 20 74 68  RT a row into th
3010: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
3020: 73 74 65 72 20 74 61 62 6c 65 2c 20 68 61 73 20  ster table, has 
3030: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
3040: 65 20 62 79 20 73 71 6c 69 74 65 33 53 74 61 72  e by sqlite3Star
3050: 74 54 61 62 6c 65 28 29 2e 0a 20 20 2a 2a 20 54  tTable()..  ** T
3060: 68 65 20 73 65 63 6f 6e 64 20 63 61 6c 6c 2c 20  he second call, 
3070: 74 6f 20 6f 62 74 61 69 6e 20 70 65 72 6d 69 73  to obtain permis
3080: 73 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 74  sion to create t
3090: 68 65 20 74 61 62 6c 65 2c 20 69 73 20 6d 61 64  he table, is mad
30a0: 65 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  e now..  */.  if
30b0: 28 20 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64 75  ( pTable->azModu
30c0: 6c 65 41 72 67 20 29 7b 0a 20 20 20 20 73 71 6c  leArg ){.    sql
30d0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
30e0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 52 45  arse, SQLITE_CRE
30f0: 41 54 45 5f 56 54 41 42 4c 45 2c 20 70 54 61 62  ATE_VTABLE, pTab
3100: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  le->zName, .    
3110: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
3120: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 2c 20  azModuleArg[0], 
3130: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
3140: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a  iDb].zDbSName);.
3150: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
3160: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3170: 20 74 61 6b 65 73 20 74 68 65 20 6d 6f 64 75 6c   takes the modul
3180: 65 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  e argument that 
3190: 68 61 73 20 62 65 65 6e 20 61 63 63 75 6d 75 6c  has been accumul
31a0: 61 74 69 6e 67 0a 2a 2a 20 69 6e 20 70 50 61 72  ating.** in pPar
31b0: 73 65 2d 3e 7a 41 72 67 5b 5d 20 61 6e 64 20 61  se->zArg[] and a
31c0: 70 70 65 6e 64 73 20 69 74 20 74 6f 20 74 68 65  ppends it to the
31d0: 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e   list of argumen
31e0: 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 69 72  ts on the.** vir
31f0: 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 72 65  tual table curre
3200: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
3210: 72 75 63 74 69 6f 6e 20 69 6e 20 70 50 61 72 73  ruction in pPars
3220: 65 2d 3e 70 54 61 62 6c 65 2e 0a 2a 2f 0a 73 74  e->pTable..*/.st
3230: 61 74 69 63 20 76 6f 69 64 20 61 64 64 41 72 67  atic void addArg
3240: 75 6d 65 6e 74 54 6f 56 74 61 62 28 50 61 72 73  umentToVtab(Pars
3250: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
3260: 28 20 70 50 61 72 73 65 2d 3e 73 41 72 67 2e 7a  ( pParse->sArg.z
3270: 20 26 26 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   && pParse->pNew
3280: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 63 6f 6e  Table ){.    con
3290: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
32a0: 6e 73 74 20 63 68 61 72 2a 29 70 50 61 72 73 65  nst char*)pParse
32b0: 2d 3e 73 41 72 67 2e 7a 3b 0a 20 20 20 20 69 6e  ->sArg.z;.    in
32c0: 74 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 73 41  t n = pParse->sA
32d0: 72 67 2e 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  rg.n;.    sqlite
32e0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
32f0: 64 62 3b 0a 20 20 20 20 61 64 64 4d 6f 64 75 6c  db;.    addModul
3300: 65 41 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 50  eArgument(db, pP
3310: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2c  arse->pNewTable,
3320: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
3330: 70 28 64 62 2c 20 7a 2c 20 6e 29 29 3b 0a 20 20  p(db, z, n));.  
3340: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
3350: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
3360: 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 74   routine after t
3370: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
3380: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
3390: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 6f  t.** has been co
33a0: 6d 70 6c 65 74 65 6c 79 20 70 61 72 73 65 64 2e  mpletely parsed.
33b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
33c0: 56 74 61 62 46 69 6e 69 73 68 50 61 72 73 65 28  VtabFinishParse(
33d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
33e0: 6f 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54  oken *pEnd){.  T
33f0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
3400: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 20  rse->pNewTable; 
3410: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
3420: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
3430: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
3440: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
3450: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
3460: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3470: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 54 61 62  n */..  if( pTab
3480: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3490: 61 64 64 41 72 67 75 6d 65 6e 74 54 6f 56 74 61  addArgumentToVta
34a0: 62 28 70 50 61 72 73 65 29 3b 0a 20 20 70 50 61  b(pParse);.  pPa
34b0: 72 73 65 2d 3e 73 41 72 67 2e 7a 20 3d 20 30 3b  rse->sArg.z = 0;
34c0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 4d 6f  .  if( pTab->nMo
34d0: 64 75 6c 65 41 72 67 3c 31 20 29 20 72 65 74 75  duleArg<1 ) retu
34e0: 72 6e 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74  rn;.  .  /* If t
34f0: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
3500: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
3510: 74 20 69 73 20 62 65 69 6e 67 20 65 6e 74 65 72  t is being enter
3520: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
3530: 66 69 72 73 74 20 74 69 6d 65 20 28 69 6e 20 6f  first time (in o
3540: 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 74 68  ther words if th
3550: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
3560: 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
3570: 67 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 6e  g.  ** created n
3580: 6f 77 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75  ow instead of ju
3590: 73 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 75  st being read ou
35a0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 61 73 74  t of sqlite_mast
35b0: 65 72 29 20 74 68 65 6e 0a 20 20 2a 2a 20 64 6f  er) then.  ** do
35c0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 69 74   additional init
35d0: 69 61 6c 69 7a 61 74 69 6f 6e 20 77 6f 72 6b 20  ialization work 
35e0: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 73 74  and store the st
35f0: 61 74 65 6d 65 6e 74 20 74 65 78 74 0a 20 20 2a  atement text.  *
3600: 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  * in the sqlite_
3610: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
3620: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
3630: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 63  it.busy ){.    c
3640: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
3650: 63 68 61 72 20 2a 7a 57 68 65 72 65 3b 0a 20 20  char *zWhere;.  
3660: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69    int iDb;.    i
3670: 6e 74 20 69 52 65 67 3b 0a 20 20 20 20 56 64 62  nt iReg;.    Vdb
3680: 65 20 2a 76 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  e *v;..    /* Co
3690: 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
36a0: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
36b0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
36c0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
36d0: 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
36e0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73  .      pParse->s
36f0: 4e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 28 69  NameToken.n = (i
3700: 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 50  nt)(pEnd->z - pP
3710: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
3720: 2e 7a 29 20 2b 20 70 45 6e 64 2d 3e 6e 3b 0a 20  .z) + pEnd->n;. 
3730: 20 20 20 7d 0a 20 20 20 20 7a 53 74 6d 74 20 3d     }.    zStmt =
3740: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
3750: 64 62 2c 20 22 43 52 45 41 54 45 20 56 49 52 54  db, "CREATE VIRT
3760: 55 41 4c 20 54 41 42 4c 45 20 25 54 22 2c 20 26  UAL TABLE %T", &
3770: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
3780: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 73  en);..    /* A s
3790: 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
37a0: 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
37b0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
37c0: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
37d0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
37e0: 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
37f0: 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
3800: 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
3810: 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
3820: 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
3830: 74 65 64 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ted.  .    **.  
3840: 20 20 2a 2a 20 54 68 65 20 56 4d 20 72 65 67 69    ** The VM regi
3850: 73 74 65 72 20 6e 75 6d 62 65 72 20 70 50 61 72  ster number pPar
3860: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 68 6f 6c  se->regRowid hol
3870: 64 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  ds the rowid of 
3880: 61 6e 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  an.    ** entry 
3890: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
38a0: 73 74 65 72 20 74 61 62 6c 65 20 74 68 74 20 77  ster table tht w
38b0: 61 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  as created for t
38c0: 68 69 73 20 76 74 61 62 0a 20 20 20 20 2a 2a 20  his vtab.    ** 
38d0: 62 79 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  by sqlite3StartT
38e0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  able()..    */. 
38f0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
3900: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
3910: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
3920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
3930: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
3940: 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
3950: 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
3960: 22 53 45 54 20 74 79 70 65 3d 27 74 61 62 6c 65  "SET type='table
3970: 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
3980: 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
3990: 65 3d 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20  e=0, sql=%Q ".  
39a0: 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69       "WHERE rowi
39b0: 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62  d=#%d",.      db
39c0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
39d0: 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
39e0: 2c 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ,.      pTab->zN
39f0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 54 61 62 2d  ame,.      pTab-
3a00: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53  >zName,.      zS
3a10: 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
3a20: 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
3a30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
3a40: 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
3a50: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
3a60: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
3a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
3a80: 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
3a90: 20 69 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c 69   iDb);..    sqli
3aa0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
3ab0: 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20   OP_Expire);.   
3ac0: 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
3ad0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
3ae0: 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
3af0: 3d 27 74 61 62 6c 65 27 22 2c 20 70 54 61 62 2d  ='table'", pTab-
3b00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
3b10: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
3b20: 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
3b30: 20 7a 57 68 65 72 65 29 3b 0a 0a 20 20 20 20 69   zWhere);..    i
3b40: 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
3b50: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
3b60: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
3b70: 76 2c 20 69 52 65 67 2c 20 70 54 61 62 2d 3e 7a  v, iReg, pTab->z
3b80: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
3b90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3ba0: 4f 50 5f 56 43 72 65 61 74 65 2c 20 69 44 62 2c  OP_VCreate, iDb,
3bb0: 20 69 52 65 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f   iReg);.  }..  /
3bc0: 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 72 65  * If we are rere
3bd0: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
3be0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 63 72  _master table cr
3bf0: 65 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  eate the in-memo
3c00: 72 79 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 6f  ry.  ** record o
3c10: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 65  f the table. The
3c20: 20 78 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68   xConnect() meth
3c30: 6f 64 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  od is not called
3c40: 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 74 68 65 20   until.  ** the 
3c50: 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 76  first time the v
3c60: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
3c70: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 20 73  used in an SQL s
3c80: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 0a 20  tatement. This. 
3c90: 20 2a 2a 20 61 6c 6c 6f 77 73 20 61 20 73 63 68   ** allows a sch
3ca0: 65 6d 61 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ema that contain
3cb0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  s virtual tables
3cc0: 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 62 65   to be loaded be
3cd0: 66 6f 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 65  fore.  ** the re
3ce0: 71 75 69 72 65 64 20 76 69 72 74 75 61 6c 20 74  quired virtual t
3cf0: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
3d00: 69 6f 6e 73 20 61 72 65 20 72 65 67 69 73 74 65  ions are registe
3d10: 72 65 64 2e 20 20 2a 2f 0a 20 20 65 6c 73 65 20  red.  */.  else 
3d20: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
3d30: 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
3d40: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
3d50: 53 63 68 65 6d 61 3b 0a 20 20 20 20 63 6f 6e 73  Schema;.    cons
3d60: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
3d70: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
3d80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3d90: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3da0: 64 62 2c 20 30 2c 20 70 53 63 68 65 6d 61 29 20  db, 0, pSchema) 
3db0: 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
3dc0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3dd0: 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
3de0: 68 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 29 3b  h, zName, pTab);
3df0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
3e00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
3e10: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
3e20: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 3d 3d    assert( pTab==
3e30: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
3e40: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
3e50: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
3e60: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
3e70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
3e80: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
3e90: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  able = 0;.  }.}.
3ea0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
3eb0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
3ec0: 74 69 6e 65 20 77 68 65 6e 20 69 74 20 73 65 65  tine when it see
3ed0: 73 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b 65  s the first toke
3ee0: 6e 0a 2a 2a 20 6f 66 20 61 6e 20 61 72 67 75 6d  n.** of an argum
3ef0: 65 6e 74 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c  ent to the modul
3f00: 65 20 6e 61 6d 65 20 69 6e 20 61 20 43 52 45 41  e name in a CREA
3f10: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
3f20: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
3f30: 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 41  oid sqlite3VtabA
3f40: 72 67 49 6e 69 74 28 50 61 72 73 65 20 2a 70 50  rgInit(Parse *pP
3f50: 61 72 73 65 29 7b 0a 20 20 61 64 64 41 72 67 75  arse){.  addArgu
3f60: 6d 65 6e 74 54 6f 56 74 61 62 28 70 50 61 72 73  mentToVtab(pPars
3f70: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 73 41  e);.  pParse->sA
3f80: 72 67 2e 7a 20 3d 20 30 3b 0a 20 20 70 50 61 72  rg.z = 0;.  pPar
3f90: 73 65 2d 3e 73 41 72 67 2e 6e 20 3d 20 30 3b 0a  se->sArg.n = 0;.
3fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  }../*.** The par
3fb0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
3fc0: 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20  outine for each 
3fd0: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
3fe0: 66 69 72 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69  first token.** i
3ff0: 6e 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  n an argument to
4000: 20 74 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   the module name
4010: 20 69 6e 20 61 20 43 52 45 41 54 45 20 56 49 52   in a CREATE VIR
4020: 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65  TUAL TABLE state
4030: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
4040: 6c 69 74 65 33 56 74 61 62 41 72 67 45 78 74 65  lite3VtabArgExte
4050: 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
4060: 2c 20 54 6f 6b 65 6e 20 2a 70 29 7b 0a 20 20 54  , Token *p){.  T
4070: 6f 6b 65 6e 20 2a 70 41 72 67 20 3d 20 26 70 50  oken *pArg = &pP
4080: 61 72 73 65 2d 3e 73 41 72 67 3b 0a 20 20 69 66  arse->sArg;.  if
4090: 28 20 70 41 72 67 2d 3e 7a 3d 3d 30 20 29 7b 0a  ( pArg->z==0 ){.
40a0: 20 20 20 20 70 41 72 67 2d 3e 7a 20 3d 20 70 2d      pArg->z = p-
40b0: 3e 7a 3b 0a 20 20 20 20 70 41 72 67 2d 3e 6e 20  >z;.    pArg->n 
40c0: 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 65 6c 73 65 7b  = p->n;.  }else{
40d0: 0a 20 20 20 20 61 73 73 65 72 74 28 70 41 72 67  .    assert(pArg
40e0: 2d 3e 7a 20 3c 3d 20 70 2d 3e 7a 29 3b 0a 20 20  ->z <= p->z);.  
40f0: 20 20 70 41 72 67 2d 3e 6e 20 3d 20 28 69 6e 74    pArg->n = (int
4100: 29 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 2d 20  )(&p->z[p->n] - 
4110: 70 41 72 67 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a  pArg->z);.  }.}.
4120: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20  ./*.** Invoke a 
4130: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
4140: 6e 73 74 72 75 63 74 6f 72 20 28 65 69 74 68 65  nstructor (eithe
4150: 72 20 78 43 72 65 61 74 65 20 6f 72 20 78 43 6f  r xCreate or xCo
4160: 6e 6e 65 63 74 29 2e 20 54 68 65 0a 2a 2a 20 70  nnect). The.** p
4170: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75  ointer to the fu
4180: 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65  nction to invoke
4190: 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
41a0: 65 20 66 6f 75 72 74 68 20 70 61 72 61 6d 65 74  e fourth paramet
41b0: 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20 70 72  er.** to this pr
41c0: 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ocedure..*/.stat
41d0: 69 63 20 69 6e 74 20 76 74 61 62 43 61 6c 6c 43  ic int vtabCallC
41e0: 6f 6e 73 74 72 75 63 74 6f 72 28 0a 20 20 73 71  onstructor(.  sq
41f0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 54 61  lite3 *db, .  Ta
4200: 62 6c 65 20 2a 70 54 61 62 2c 0a 20 20 4d 6f 64  ble *pTab,.  Mod
4210: 75 6c 65 20 2a 70 4d 6f 64 2c 0a 20 20 69 6e 74  ule *pMod,.  int
4220: 20 28 2a 78 43 6f 6e 73 74 72 75 63 74 29 28 73   (*xConstruct)(s
4230: 71 6c 69 74 65 33 2a 2c 76 6f 69 64 2a 2c 69 6e  qlite3*,void*,in
4240: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 63 6f 6e  t,const char*con
4250: 73 74 2a 2c 73 71 6c 69 74 65 33 5f 76 74 61 62  st*,sqlite3_vtab
4260: 2a 2a 2c 63 68 61 72 2a 2a 29 2c 0a 20 20 63 68  **,char**),.  ch
4270: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
4280: 56 74 61 62 43 74 78 20 73 43 74 78 3b 0a 20 20  VtabCtx sCtx;.  
4290: 56 54 61 62 6c 65 20 2a 70 56 54 61 62 6c 65 3b  VTable *pVTable;
42a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
42b0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
42c0: 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  zArg = (const ch
42d0: 61 72 20 2a 63 6f 6e 73 74 2a 29 70 54 61 62 2d  ar *const*)pTab-
42e0: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 3b 0a 20 20  >azModuleArg;.  
42f0: 69 6e 74 20 6e 41 72 67 20 3d 20 70 54 61 62 2d  int nArg = pTab-
4300: 3e 6e 4d 6f 64 75 6c 65 41 72 67 3b 0a 20 20 63  >nModuleArg;.  c
4310: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
4320: 20 63 68 61 72 20 2a 7a 4d 6f 64 75 6c 65 4e 61   char *zModuleNa
4330: 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  me;.  int iDb;. 
4340: 20 56 74 61 62 43 74 78 20 2a 70 43 74 78 3b 0a   VtabCtx *pCtx;.
4350: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
4360: 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62   the virtual-tab
4370: 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  le is not alread
4380: 79 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69  y being initiali
4390: 7a 65 64 20 2a 2f 0a 20 20 66 6f 72 28 70 43 74  zed */.  for(pCt
43a0: 78 3d 64 62 2d 3e 70 56 74 61 62 43 74 78 3b 20  x=db->pVtabCtx; 
43b0: 70 43 74 78 3b 20 70 43 74 78 3d 70 43 74 78 2d  pCtx; pCtx=pCtx-
43c0: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 66  >pPrior){.    if
43d0: 28 20 70 43 74 78 2d 3e 70 54 61 62 3d 3d 70 54  ( pCtx->pTab==pT
43e0: 61 62 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45  ab ){.      *pzE
43f0: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
4400: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
4410: 20 20 20 22 76 74 61 62 6c 65 20 63 6f 6e 73 74     "vtable const
4420: 72 75 63 74 6f 72 20 63 61 6c 6c 65 64 20 72 65  ructor called re
4430: 63 75 72 73 69 76 65 6c 79 3a 20 25 73 22 2c 20  cursively: %s", 
4440: 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
4450: 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
4460: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
4470: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 7a 4d  .    }.  }..  zM
4480: 6f 64 75 6c 65 4e 61 6d 65 20 3d 20 73 71 6c 69  oduleName = sqli
4490: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
44a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
44b0: 69 66 28 20 21 7a 4d 6f 64 75 6c 65 4e 61 6d 65  if( !zModuleName
44c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
44d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
44e0: 3b 0a 20 20 7d 0a 0a 20 20 70 56 54 61 62 6c 65  ;.  }..  pVTable
44f0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
4500: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 56 54 61 62  Zero(sizeof(VTab
4510: 6c 65 29 29 3b 0a 20 20 69 66 28 20 21 70 56 54  le));.  if( !pVT
4520: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
4530: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
4540: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4550: 65 65 28 64 62 2c 20 7a 4d 6f 64 75 6c 65 4e 61  ee(db, zModuleNa
4560: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
4570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
4580: 54 3b 0a 20 20 7d 0a 20 20 70 56 54 61 62 6c 65  T;.  }.  pVTable
4590: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 56 54  ->db = db;.  pVT
45a0: 61 62 6c 65 2d 3e 70 4d 6f 64 20 3d 20 70 4d 6f  able->pMod = pMo
45b0: 64 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  d;..  iDb = sqli
45c0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
45d0: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
45e0: 6d 61 29 3b 0a 20 20 70 54 61 62 2d 3e 61 7a 4d  ma);.  pTab->azM
45f0: 6f 64 75 6c 65 41 72 67 5b 31 5d 20 3d 20 64 62  oduleArg[1] = db
4600: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
4610: 61 6d 65 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  ame;..  /* Invok
4620: 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
4630: 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20  ble constructor 
4640: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 26 64 62  */.  assert( &db
4650: 2d 3e 70 56 74 61 62 43 74 78 20 29 3b 0a 20 20  ->pVtabCtx );.  
4660: 61 73 73 65 72 74 28 20 78 43 6f 6e 73 74 72 75  assert( xConstru
4670: 63 74 20 29 3b 0a 20 20 73 43 74 78 2e 70 54 61  ct );.  sCtx.pTa
4680: 62 20 3d 20 70 54 61 62 3b 0a 20 20 73 43 74 78  b = pTab;.  sCtx
4690: 2e 70 56 54 61 62 6c 65 20 3d 20 70 56 54 61 62  .pVTable = pVTab
46a0: 6c 65 3b 0a 20 20 73 43 74 78 2e 70 50 72 69 6f  le;.  sCtx.pPrio
46b0: 72 20 3d 20 64 62 2d 3e 70 56 74 61 62 43 74 78  r = db->pVtabCtx
46c0: 3b 0a 20 20 73 43 74 78 2e 62 44 65 63 6c 61 72  ;.  sCtx.bDeclar
46d0: 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ed = 0;.  db->pV
46e0: 74 61 62 43 74 78 20 3d 20 26 73 43 74 78 3b 0a  tabCtx = &sCtx;.
46f0: 20 20 72 63 20 3d 20 78 43 6f 6e 73 74 72 75 63    rc = xConstruc
4700: 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 41 75 78  t(db, pMod->pAux
4710: 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 26  , nArg, azArg, &
4720: 70 56 54 61 62 6c 65 2d 3e 70 56 74 61 62 2c 20  pVTable->pVtab, 
4730: 26 7a 45 72 72 29 3b 0a 20 20 64 62 2d 3e 70 56  &zErr);.  db->pV
4740: 74 61 62 43 74 78 20 3d 20 73 43 74 78 2e 70 50  tabCtx = sCtx.pP
4750: 72 69 6f 72 3b 0a 20 20 69 66 28 20 72 63 3d 3d  rior;.  if( rc==
4760: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73  SQLITE_NOMEM ) s
4770: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
4780: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 43  b);.  assert( sC
4790: 74 78 2e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  tx.pTab==pTab );
47a0: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
47b0: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 69 66 28  K!=rc ){.    if(
47c0: 20 7a 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20   zErr==0 ){.    
47d0: 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
47e0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 76  e3MPrintf(db, "v
47f0: 74 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f  table constructo
4800: 72 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 7a  r failed: %s", z
4810: 4d 6f 64 75 6c 65 4e 61 6d 65 29 3b 0a 20 20 20  ModuleName);.   
4820: 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2a   }else {.      *
4830: 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d  pzErr = sqlite3M
4840: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
4850: 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71   zErr);.      sq
4860: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
4870: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4880: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56  te3DbFree(db, pV
4890: 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 20  Table);.  }else 
48a0: 69 66 28 20 41 4c 57 41 59 53 28 70 56 54 61 62  if( ALWAYS(pVTab
48b0: 6c 65 2d 3e 70 56 74 61 62 29 20 29 7b 0a 20 20  le->pVtab) ){.  
48c0: 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
48d0: 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3a 20  on of ALWAYS(): 
48e0: 20 41 20 63 6f 72 72 65 63 74 20 76 74 61 62 20   A correct vtab 
48f0: 63 6f 6e 73 74 72 75 63 74 6f 72 20 6d 75 73 74  constructor must
4900: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a   allocate.    **
4910: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
4920: 62 20 6f 62 6a 65 63 74 20 69 66 20 73 75 63 63  b object if succ
4930: 65 73 73 66 75 6c 2e 20 20 2a 2f 0a 20 20 20 20  essful.  */.    
4940: 6d 65 6d 73 65 74 28 70 56 54 61 62 6c 65 2d 3e  memset(pVTable->
4950: 70 56 74 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66  pVtab, 0, sizeof
4960: 28 70 56 54 61 62 6c 65 2d 3e 70 56 74 61 62 5b  (pVTable->pVtab[
4970: 30 5d 29 29 3b 0a 20 20 20 20 70 56 54 61 62 6c  0]));.    pVTabl
4980: 65 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  e->pVtab->pModul
4990: 65 20 3d 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  e = pMod->pModul
49a0: 65 3b 0a 20 20 20 20 70 56 54 61 62 6c 65 2d 3e  e;.    pVTable->
49b0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
49c0: 28 20 73 43 74 78 2e 62 44 65 63 6c 61 72 65 64  ( sCtx.bDeclared
49d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ==0 ){.      con
49e0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
49f0: 20 3d 20 22 76 74 61 62 6c 65 20 63 6f 6e 73 74   = "vtable const
4a00: 72 75 63 74 6f 72 20 64 69 64 20 6e 6f 74 20 64  ructor did not d
4a10: 65 63 6c 61 72 65 20 73 63 68 65 6d 61 3a 20 25  eclare schema: %
4a20: 73 22 3b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72  s";.      *pzErr
4a30: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
4a40: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 70  f(db, zFormat, p
4a50: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
4a60: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e     sqlite3VtabUn
4a70: 6c 6f 63 6b 28 70 56 54 61 62 6c 65 29 3b 0a 20  lock(pVTable);. 
4a80: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4a90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
4aa0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  e{.      int iCo
4ab0: 6c 3b 0a 20 20 20 20 20 20 75 38 20 6f 6f 6f 48  l;.      u8 oooH
4ac0: 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  idden = 0;.     
4ad0: 20 2f 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e   /* If everythin
4ae0: 67 20 77 65 6e 74 20 61 63 63 6f 72 64 69 6e 67  g went according
4af0: 20 74 6f 20 70 6c 61 6e 2c 20 6c 69 6e 6b 20 74   to plan, link t
4b00: 68 65 20 6e 65 77 20 56 54 61 62 6c 65 20 73 74  he new VTable st
4b10: 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 2a 2a  ructure.      **
4b20: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
4b30: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
4b40: 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 2e 20 54  pTab->pVTable. T
4b50: 68 65 6e 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68  hen loop through
4b60: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
4b70: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
4b80: 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20 61 6e  ble to see if an
4b90: 79 20 6f 66 20 74 68 65 6d 20 63 6f 6e 74 61 69  y of them contai
4ba0: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 22 68 69 64  n the token "hid
4bb0: 64 65 6e 22 2e 0a 20 20 20 20 20 20 2a 2a 20 49  den"..      ** I
4bc0: 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 43 6f  f so, set the Co
4bd0: 6c 75 6d 6e 20 43 4f 4c 46 4c 41 47 5f 48 49 44  lumn COLFLAG_HID
4be0: 44 45 4e 20 66 6c 61 67 20 61 6e 64 20 72 65 6d  DEN flag and rem
4bf0: 6f 76 65 20 74 68 65 20 74 6f 6b 65 6e 20 66 72  ove the token fr
4c00: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  om.      ** the 
4c10: 74 79 70 65 20 73 74 72 69 6e 67 2e 20 20 2a 2f  type string.  */
4c20: 0a 20 20 20 20 20 20 70 56 54 61 62 6c 65 2d 3e  .      pVTable->
4c30: 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 56  pNext = pTab->pV
4c40: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 61  Table;.      pTa
4c50: 62 2d 3e 70 56 54 61 62 6c 65 20 3d 20 70 56 54  b->pVTable = pVT
4c60: 61 62 6c 65 3b 0a 0a 20 20 20 20 20 20 66 6f 72  able;..      for
4c70: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
4c80: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
4c90: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4ca0: 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  *zType = sqlite3
4cb0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
4cc0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 20 22 22  ->aCol[iCol], ""
4cd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  );.        int n
4ce0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Type;.        in
4cf0: 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t i = 0;.       
4d00: 20 6e 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   nType = sqlite3
4d10: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
4d20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
4d30: 3b 20 69 3c 6e 54 79 70 65 3b 20 69 2b 2b 29 7b  ; i<nType; i++){
4d40: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
4d50: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
4d60: 70 28 22 68 69 64 64 65 6e 22 2c 20 26 7a 54 79  p("hidden", &zTy
4d70: 70 65 5b 69 5d 2c 20 36 29 0a 20 20 20 20 20 20  pe[i], 6).      
4d80: 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c       && (i==0 ||
4d90: 20 7a 54 79 70 65 5b 69 2d 31 5d 3d 3d 27 20 27   zType[i-1]==' '
4da0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
4db0: 28 7a 54 79 70 65 5b 69 2b 36 5d 3d 3d 27 5c 30  (zType[i+6]=='\0
4dc0: 27 20 7c 7c 20 7a 54 79 70 65 5b 69 2b 36 5d 3d  ' || zType[i+6]=
4dd0: 3d 27 20 27 29 0a 20 20 20 20 20 20 20 20 20 20  =' ').          
4de0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
4df0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
4e00: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
4e10: 20 20 20 20 69 66 28 20 69 3c 6e 54 79 70 65 20      if( i<nType 
4e20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
4e30: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   j;.          in
4e40: 74 20 6e 44 65 6c 20 3d 20 36 20 2b 20 28 7a 54  t nDel = 6 + (zT
4e50: 79 70 65 5b 69 2b 36 5d 20 3f 20 31 20 3a 20 30  ype[i+6] ? 1 : 0
4e60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
4e70: 28 6a 3d 69 3b 20 28 6a 2b 6e 44 65 6c 29 3c 3d  (j=i; (j+nDel)<=
4e80: 6e 54 79 70 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nType; j++){.   
4e90: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 5b 6a           zType[j
4ea0: 5d 20 3d 20 7a 54 79 70 65 5b 6a 2b 6e 44 65 6c  ] = zType[j+nDel
4eb0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ];.          }. 
4ec0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 79           if( zTy
4ed0: 70 65 5b 69 5d 3d 3d 27 5c 30 27 20 26 26 20 69  pe[i]=='\0' && i
4ee0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
4ef0: 20 20 61 73 73 65 72 74 28 7a 54 79 70 65 5b 69    assert(zType[i
4f00: 2d 31 5d 3d 3d 27 20 27 29 3b 0a 20 20 20 20 20  -1]==' ');.     
4f10: 20 20 20 20 20 20 20 7a 54 79 70 65 5b 69 2d 31         zType[i-1
4f20: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
4f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4f40: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
4f50: 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  .colFlags |= COL
4f60: 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 20  FLAG_HIDDEN;.   
4f70: 20 20 20 20 20 20 20 6f 6f 6f 48 69 64 64 65 6e         oooHidden
4f80: 20 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b   = TF_OOOHidden;
4f90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
4fa0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
4fb0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 6f 6f 6f 48  tabFlags |= oooH
4fc0: 69 64 64 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  idden;.        }
4fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4fe0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
4ff0: 72 65 65 28 64 62 2c 20 7a 4d 6f 64 75 6c 65 4e  ree(db, zModuleN
5000: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ame);.  return r
5010: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
5020: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
5030: 6f 6b 65 64 20 62 79 20 74 68 65 20 70 61 72 73  oked by the pars
5040: 65 72 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78  er to call the x
5050: 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64  Connect() method
5060: 0a 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75  .** of the virtu
5070: 61 6c 20 74 61 62 6c 65 20 70 54 61 62 2e 20 49  al table pTab. I
5080: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5090: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
50a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a   is returned .**
50b0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65   and an error le
50c0: 66 74 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a  ft in pParse..**
50d0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
50e0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 61 62 6c   a no-op if tabl
50f0: 65 20 70 54 61 62 20 69 73 20 6e 6f 74 20 61 20  e pTab is not a 
5100: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
5110: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61  /.int sqlite3Vta
5120: 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 50 61 72  bCallConnect(Par
5130: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
5140: 65 20 2a 70 54 61 62 29 7b 0a 20 20 73 71 6c 69  e *pTab){.  sqli
5150: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5160: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
5170: 61 72 20 2a 7a 4d 6f 64 3b 0a 20 20 4d 6f 64 75  ar *zMod;.  Modu
5180: 6c 65 20 2a 70 4d 6f 64 3b 0a 20 20 69 6e 74 20  le *pMod;.  int 
5190: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
51a0: 54 61 62 20 29 3b 0a 20 20 69 66 28 20 21 49 73  Tab );.  if( !Is
51b0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
51c0: 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
51d0: 65 28 64 62 2c 20 70 54 61 62 29 20 29 7b 0a 20  e(db, pTab) ){. 
51e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
51f0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  _OK;.  }..  /* L
5200: 6f 63 61 74 65 20 74 68 65 20 72 65 71 75 69 72  ocate the requir
5210: 65 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ed virtual table
5220: 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 7a 4d 6f   module */.  zMo
5230: 64 20 3d 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75  d = pTab->azModu
5240: 6c 65 41 72 67 5b 30 5d 3b 0a 20 20 70 4d 6f 64  leArg[0];.  pMod
5250: 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69   = (Module*)sqli
5260: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
5270: 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4d 6f 64 29 3b  >aModule, zMod);
5280: 0a 0a 20 20 69 66 28 20 21 70 4d 6f 64 20 29 7b  ..  if( !pMod ){
5290: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
52a0: 2a 7a 4d 6f 64 75 6c 65 20 3d 20 70 54 61 62 2d  *zModule = pTab-
52b0: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 3b  >azModuleArg[0];
52c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
52d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
52e0: 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 25 73   such module: %s
52f0: 22 2c 20 7a 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  ", zModule);.   
5300: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
5310: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
5320: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
5330: 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 43 61  .    rc = vtabCa
5340: 6c 6c 43 6f 6e 73 74 72 75 63 74 6f 72 28 64 62  llConstructor(db
5350: 2c 20 70 54 61 62 2c 20 70 4d 6f 64 2c 20 70 4d  , pTab, pMod, pM
5360: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f  od->pModule->xCo
5370: 6e 6e 65 63 74 2c 20 26 7a 45 72 72 29 3b 0a 20  nnect, &zErr);. 
5380: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
5390: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
53a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
53b0: 61 72 73 65 2c 20 22 25 73 22 2c 20 7a 45 72 72  arse, "%s", zErr
53c0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
53d0: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  >rc = rc;.    }.
53e0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
53f0: 65 28 64 62 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  e(db, zErr);.  }
5400: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
5410: 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20  ./*.** Grow the 
5420: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
5430: 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
5440: 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74  e is room for at
5450: 20 6c 65 61 73 74 20 6f 6e 65 0a 2a 2a 20 6d 6f   least one.** mo
5460: 72 65 20 76 2d 74 61 62 6c 65 2e 20 52 65 74 75  re v-table. Retu
5470: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
5480: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
5490: 73 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20  s, or SQLITE_OK 
54a0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
54b0: 61 74 69 63 20 69 6e 74 20 67 72 6f 77 56 54 72  atic int growVTr
54c0: 61 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ans(sqlite3 *db)
54d0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 41 52  {.  const int AR
54e0: 52 41 59 5f 49 4e 43 52 20 3d 20 35 3b 0a 0a 20  RAY_INCR = 5;.. 
54f0: 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 73 71 6c   /* Grow the sql
5500: 69 74 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72  ite3.aVTrans arr
5510: 61 79 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  ay if required *
5520: 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6e 56 54  /.  if( (db->nVT
5530: 72 61 6e 73 25 41 52 52 41 59 5f 49 4e 43 52 29  rans%ARRAY_INCR)
5540: 3d 3d 30 20 29 7b 0a 20 20 20 20 56 54 61 62 6c  ==0 ){.    VTabl
5550: 65 20 2a 2a 61 56 54 72 61 6e 73 3b 0a 20 20 20  e **aVTrans;.   
5560: 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69   int nBytes = si
5570: 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61  zeof(sqlite3_vta
5580: 62 20 2a 29 20 2a 20 28 64 62 2d 3e 6e 56 54 72  b *) * (db->nVTr
5590: 61 6e 73 20 2b 20 41 52 52 41 59 5f 49 4e 43 52  ans + ARRAY_INCR
55a0: 29 3b 0a 20 20 20 20 61 56 54 72 61 6e 73 20 3d  );.    aVTrans =
55b0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
55c0: 63 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 64 62  c(db, (void *)db
55d0: 2d 3e 61 56 54 72 61 6e 73 2c 20 6e 42 79 74 65  ->aVTrans, nByte
55e0: 73 29 3b 0a 20 20 20 20 69 66 28 20 21 61 56 54  s);.    if( !aVT
55f0: 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 65  rans ){.      re
5600: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5610: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
5620: 20 20 6d 65 6d 73 65 74 28 26 61 56 54 72 61 6e    memset(&aVTran
5630: 73 5b 64 62 2d 3e 6e 56 54 72 61 6e 73 5d 2c 20  s[db->nVTrans], 
5640: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
5650: 33 5f 76 74 61 62 20 2a 29 2a 41 52 52 41 59 5f  3_vtab *)*ARRAY_
5660: 49 4e 43 52 29 3b 0a 20 20 20 20 64 62 2d 3e 61  INCR);.    db->a
5670: 56 54 72 61 6e 73 20 3d 20 61 56 54 72 61 6e 73  VTrans = aVTrans
5680: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5690: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
56a0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 76 69 72 74  .** Add the virt
56b0: 75 61 6c 20 74 61 62 6c 65 20 70 56 54 61 62 20  ual table pVTab 
56c0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 73 71 6c  to the array sql
56d0: 69 74 65 33 2e 61 56 54 72 61 6e 73 5b 5d 2e 20  ite3.aVTrans[]. 
56e0: 53 70 61 63 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  Space should.** 
56f0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
5700: 6e 20 72 65 73 65 72 76 65 64 20 75 73 69 6e 67  n reserved using
5710: 20 67 72 6f 77 56 54 72 61 6e 73 28 29 2e 0a 2a   growVTrans()..*
5720: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
5730: 64 54 6f 56 54 72 61 6e 73 28 73 71 6c 69 74 65  dToVTrans(sqlite
5740: 33 20 2a 64 62 2c 20 56 54 61 62 6c 65 20 2a 70  3 *db, VTable *p
5750: 56 54 61 62 29 7b 0a 20 20 2f 2a 20 41 64 64 20  VTab){.  /* Add 
5760: 70 56 74 61 62 20 74 6f 20 74 68 65 20 65 6e 64  pVtab to the end
5770: 20 6f 66 20 73 71 6c 69 74 65 33 2e 61 56 54 72   of sqlite3.aVTr
5780: 61 6e 73 20 2a 2f 0a 20 20 64 62 2d 3e 61 56 54  ans */.  db->aVT
5790: 72 61 6e 73 5b 64 62 2d 3e 6e 56 54 72 61 6e 73  rans[db->nVTrans
57a0: 2b 2b 5d 20 3d 20 70 56 54 61 62 3b 0a 20 20 73  ++] = pVTab;.  s
57b0: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 70  qlite3VtabLock(p
57c0: 56 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VTab);.}../*.** 
57d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
57e0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
57f0: 76 64 62 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  vdbe to call the
5800: 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 0a   xCreate method.
5810: 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
5820: 6c 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 7a 54  l table named zT
5830: 61 62 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ab in database i
5840: 44 62 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  Db. .**.** If an
5850: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
5860: 70 7a 45 72 72 20 69 73 20 73 65 74 20 74 6f 20  pzErr is set to 
5870: 70 6f 69 6e 74 20 74 6f 20 61 6e 20 45 6e 67 6c  point to an Engl
5880: 69 73 68 20 6c 61 6e 67 75 61 67 65 0a 2a 2a 20  ish language.** 
5890: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
58a0: 68 65 20 65 72 72 6f 72 20 61 6e 64 20 61 6e 20  he error and an 
58b0: 53 51 4c 49 54 45 5f 58 58 58 20 65 72 72 6f 72  SQLITE_XXX error
58c0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
58d0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  d..** In this ca
58e0: 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  se the caller mu
58f0: 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 44  st call sqlite3D
5900: 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 2a  bFree(db, ) on *
5910: 70 7a 45 72 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pzErr..*/.int sq
5920: 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65  lite3VtabCallCre
5930: 61 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ate(sqlite3 *db,
5940: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5950: 63 68 61 72 20 2a 7a 54 61 62 2c 20 63 68 61 72  char *zTab, char
5960: 20 2a 2a 70 7a 45 72 72 29 7b 0a 20 20 69 6e 74   **pzErr){.  int
5970: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5980: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
5990: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 0a    Module *pMod;.
59a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
59b0: 6f 64 3b 0a 0a 20 20 70 54 61 62 20 3d 20 73 71  od;..  pTab = sq
59c0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
59d0: 62 2c 20 7a 54 61 62 2c 20 64 62 2d 3e 61 44 62  b, zTab, db->aDb
59e0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 3b  [iDb].zDbSName);
59f0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20  .  assert( pTab 
5a00: 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  && IsVirtual(pTa
5a10: 62 29 20 26 26 20 21 70 54 61 62 2d 3e 70 56 54  b) && !pTab->pVT
5a20: 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  able );..  /* Lo
5a30: 63 61 74 65 20 74 68 65 20 72 65 71 75 69 72 65  cate the require
5a40: 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  d virtual table 
5a50: 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 7a 4d 6f 64  module */.  zMod
5a60: 20 3d 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c   = pTab->azModul
5a70: 65 41 72 67 5b 30 5d 3b 0a 20 20 70 4d 6f 64 20  eArg[0];.  pMod 
5a80: 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74  = (Module*)sqlit
5a90: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
5aa0: 61 4d 6f 64 75 6c 65 2c 20 7a 4d 6f 64 29 3b 0a  aModule, zMod);.
5ab0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6f 64  .  /* If the mod
5ac0: 75 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 67  ule has been reg
5ad0: 69 73 74 65 72 65 64 20 61 6e 64 20 69 6e 63 6c  istered and incl
5ae0: 75 64 65 73 20 61 20 43 72 65 61 74 65 20 6d 65  udes a Create me
5af0: 74 68 6f 64 2c 20 0a 20 20 2a 2a 20 69 6e 76 6f  thod, .  ** invo
5b00: 6b 65 20 69 74 20 6e 6f 77 2e 20 49 66 20 74 68  ke it now. If th
5b10: 65 20 6d 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74  e module has not
5b20: 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
5b30: 2c 20 72 65 74 75 72 6e 20 61 6e 20 0a 20 20 2a  , return an .  *
5b40: 2a 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  * error. Otherwi
5b50: 73 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  se, do nothing..
5b60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 6f 64 3d    */.  if( pMod=
5b70: 3d 30 20 7c 7c 20 70 4d 6f 64 2d 3e 70 4d 6f 64  =0 || pMod->pMod
5b80: 75 6c 65 2d 3e 78 43 72 65 61 74 65 3d 3d 30 20  ule->xCreate==0 
5b90: 7c 7c 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65  || pMod->pModule
5ba0: 2d 3e 78 44 65 73 74 72 6f 79 3d 3d 30 20 29 7b  ->xDestroy==0 ){
5bb0: 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71  .    *pzErr = sq
5bc0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
5bd0: 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65   "no such module
5be0: 3a 20 25 73 22 2c 20 7a 4d 6f 64 29 3b 0a 20 20  : %s", zMod);.  
5bf0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
5c00: 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
5c10: 20 20 72 63 20 3d 20 76 74 61 62 43 61 6c 6c 43    rc = vtabCallC
5c20: 6f 6e 73 74 72 75 63 74 6f 72 28 64 62 2c 20 70  onstructor(db, p
5c30: 54 61 62 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64 2d  Tab, pMod, pMod-
5c40: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 43 72 65 61 74  >pModule->xCreat
5c50: 65 2c 20 70 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a  e, pzErr);.  }..
5c60: 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
5c70: 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3a 20  on of ALWAYS(): 
5c80: 20 54 68 65 20 78 43 6f 6e 73 74 72 75 63 74 6f   The xConstructo
5c90: 72 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75  r method is requ
5ca0: 69 72 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  ired to.  ** cre
5cb0: 61 74 65 20 61 20 76 61 6c 69 64 20 73 71 6c 69  ate a valid sqli
5cc0: 74 65 33 5f 76 74 61 62 20 69 66 20 69 74 20 72  te3_vtab if it r
5cd0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
5ce0: 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
5cf0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 41 4c 57 41  QLITE_OK && ALWA
5d00: 59 53 28 73 71 6c 69 74 65 33 47 65 74 56 54 61  YS(sqlite3GetVTa
5d10: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 29 20 29  ble(db, pTab)) )
5d20: 7b 0a 20 20 20 20 72 63 20 3d 20 67 72 6f 77 56  {.    rc = growV
5d30: 54 72 61 6e 73 28 64 62 29 3b 0a 20 20 20 20 69  Trans(db);.    i
5d40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5d50: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 54 6f 56   ){.      addToV
5d60: 54 72 61 6e 73 28 64 62 2c 20 73 71 6c 69 74 65  Trans(db, sqlite
5d70: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
5d80: 54 61 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Tab));.    }.  }
5d90: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
5da0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5db0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
5dc0: 20 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20   set the schema 
5dd0: 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
5de0: 6c 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 0a  le.  It is only.
5df0: 2a 2a 20 76 61 6c 69 64 20 74 6f 20 63 61 6c 6c  ** valid to call
5e00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
5e10: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78  rom within the x
5e20: 43 72 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e  Create() or xCon
5e30: 6e 65 63 74 28 29 20 6f 66 20 61 0a 2a 2a 20 76  nect() of a.** v
5e40: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
5e50: 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ule..*/.int sqli
5e60: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
5e70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
5e80: 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74  nst char *zCreat
5e90: 65 54 61 62 6c 65 29 7b 0a 20 20 56 74 61 62 43  eTable){.  VtabC
5ea0: 74 78 20 2a 70 43 74 78 3b 0a 20 20 69 6e 74 20  tx *pCtx;.  int 
5eb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5ec0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
5ed0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
5ee0: 0a 20 20 50 61 72 73 65 20 73 50 61 72 73 65 3b  .  Parse sParse;
5ef0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5f00: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
5f10: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
5f20: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
5f30: 20 7c 7c 20 7a 43 72 65 61 74 65 54 61 62 6c 65   || zCreateTable
5f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5f50: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
5f60: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
5f70: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5f80: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
5f90: 29 3b 0a 20 20 70 43 74 78 20 3d 20 64 62 2d 3e  );.  pCtx = db->
5fa0: 70 56 74 61 62 43 74 78 3b 0a 20 20 69 66 28 20  pVtabCtx;.  if( 
5fb0: 21 70 43 74 78 20 7c 7c 20 70 43 74 78 2d 3e 62  !pCtx || pCtx->b
5fc0: 44 65 63 6c 61 72 65 64 20 29 7b 0a 20 20 20 20  Declared ){.    
5fd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
5fe0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 3b   SQLITE_MISUSE);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6000: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6010: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ex);.    return 
6020: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6030: 50 54 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d  PT;.  }.  pTab =
6040: 20 70 43 74 78 2d 3e 70 54 61 62 3b 0a 20 20 61   pCtx->pTab;.  a
6050: 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c  ssert( IsVirtual
6060: 28 70 54 61 62 29 20 29 3b 0a 0a 20 20 6d 65 6d  (pTab) );..  mem
6070: 73 65 74 28 26 73 50 61 72 73 65 2c 20 30 2c 20  set(&sParse, 0, 
6080: 73 69 7a 65 6f 66 28 73 50 61 72 73 65 29 29 3b  sizeof(sParse));
6090: 0a 20 20 73 50 61 72 73 65 2e 65 50 61 72 73 65  .  sParse.eParse
60a0: 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44  Mode = PARSE_MOD
60b0: 45 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 3b 0a  E_DECLARE_VTAB;.
60c0: 20 20 73 50 61 72 73 65 2e 64 62 20 3d 20 64 62    sParse.db = db
60d0: 3b 0a 20 20 73 50 61 72 73 65 2e 6e 51 75 65 72  ;.  sParse.nQuer
60e0: 79 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 69 66 28  yLoop = 1;.  if(
60f0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
6100: 74 65 33 52 75 6e 50 61 72 73 65 72 28 26 73 50  te3RunParser(&sP
6110: 61 72 73 65 2c 20 7a 43 72 65 61 74 65 54 61 62  arse, zCreateTab
6120: 6c 65 2c 20 26 7a 45 72 72 29 20 0a 20 20 20 26  le, &zErr) .   &
6130: 26 20 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62  & sParse.pNewTab
6140: 6c 65 0a 20 20 20 26 26 20 21 64 62 2d 3e 6d 61  le.   && !db->ma
6150: 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 26 26  llocFailed.   &&
6160: 20 21 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62   !sParse.pNewTab
6170: 6c 65 2d 3e 70 53 65 6c 65 63 74 0a 20 20 20 26  le->pSelect.   &
6180: 26 20 21 49 73 56 69 72 74 75 61 6c 28 73 50 61  & !IsVirtual(sPa
6190: 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 29 0a 20  rse.pNewTable). 
61a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 54 61   ){.    if( !pTa
61b0: 62 2d 3e 61 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->aCol ){.     
61c0: 20 54 61 62 6c 65 20 2a 70 4e 65 77 20 3d 20 73   Table *pNew = s
61d0: 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 3b  Parse.pNewTable;
61e0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
61f0: 64 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  dx;.      pTab->
6200: 61 43 6f 6c 20 3d 20 70 4e 65 77 2d 3e 61 43 6f  aCol = pNew->aCo
6210: 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  l;.      pTab->n
6220: 43 6f 6c 20 3d 20 70 4e 65 77 2d 3e 6e 43 6f 6c  Col = pNew->nCol
6230: 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
6240: 62 46 6c 61 67 73 20 7c 3d 20 70 4e 65 77 2d 3e  bFlags |= pNew->
6250: 74 61 62 46 6c 61 67 73 20 26 20 28 54 46 5f 57  tabFlags & (TF_W
6260: 69 74 68 6f 75 74 52 6f 77 69 64 7c 54 46 5f 4e  ithoutRowid|TF_N
6270: 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 29 3b 0a  oVisibleRowid);.
6280: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 43 6f 6c        pNew->nCol
6290: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
62a0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
62b0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
62c0: 70 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20  pIndex==0 );.   
62d0: 20 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f     assert( HasRo
62e0: 77 69 64 28 70 4e 65 77 29 20 7c 7c 20 73 71 6c  wid(pNew) || sql
62f0: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
6300: 64 65 78 28 70 4e 65 77 29 21 3d 30 20 29 3b 0a  dex(pNew)!=0 );.
6310: 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
6320: 77 69 64 28 70 4e 65 77 29 0a 20 20 20 20 20 20  wid(pNew).      
6330: 20 26 26 20 70 43 74 78 2d 3e 70 56 54 61 62 6c   && pCtx->pVTabl
6340: 65 2d 3e 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65  e->pMod->pModule
6350: 2d 3e 78 55 70 64 61 74 65 21 3d 30 0a 20 20 20  ->xUpdate!=0.   
6360: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 72      && sqlite3Pr
6370: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 4e  imaryKeyIndex(pN
6380: 65 77 29 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 31 0a  ew)->nKeyCol!=1.
6390: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
63a0: 20 2f 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49   /* WITHOUT ROWI
63b0: 44 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  D virtual tables
63c0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 20   must either be 
63d0: 72 65 61 64 2d 6f 6e 6c 79 20 28 78 55 70 64 61  read-only (xUpda
63e0: 74 65 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 2a  te==0).        *
63f0: 2a 20 6f 72 20 65 6c 73 65 20 6d 75 73 74 20 68  * or else must h
6400: 61 76 65 20 61 20 73 69 6e 67 6c 65 2d 63 6f 6c  ave a single-col
6410: 75 6d 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  umn PRIMARY KEY 
6420: 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
6430: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
6440: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 64 78      }.      pIdx
6450: 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 3b   = pNew->pIndex;
6460: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20  .      if( pIdx 
6470: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6480: 74 28 20 70 49 64 78 2d 3e 70 4e 65 78 74 3d 3d  t( pIdx->pNext==
6490: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  0 );.        pTa
64a0: 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  b->pIndex = pIdx
64b0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
64c0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
64d0: 20 20 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65      pIdx->pTable
64e0: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 7d   = pTab;.      }
64f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 78 2d  .    }.    pCtx-
6500: 3e 62 44 65 63 6c 61 72 65 64 20 3d 20 31 3b 0a  >bDeclared = 1;.
6510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6520: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
6530: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
6540: 52 2c 20 28 7a 45 72 72 20 3f 20 22 25 73 22 20  R, (zErr ? "%s" 
6550: 3a 20 30 29 2c 20 7a 45 72 72 29 3b 0a 20 20 20  : 0), zErr);.   
6560: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6570: 62 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 72 63  b, zErr);.    rc
6580: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
6590: 0a 20 20 7d 0a 20 20 73 50 61 72 73 65 2e 65 50  .  }.  sParse.eP
65a0: 61 72 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45  arseMode = PARSE
65b0: 5f 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 0a 20  _MODE_NORMAL;.. 
65c0: 20 69 66 28 20 73 50 61 72 73 65 2e 70 56 64 62   if( sParse.pVdb
65d0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
65e0: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 73 50 61  VdbeFinalize(sPa
65f0: 72 73 65 2e 70 56 64 62 65 29 3b 0a 20 20 7d 0a  rse.pVdbe);.  }.
6600: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
6610: 61 62 6c 65 28 64 62 2c 20 73 50 61 72 73 65 2e  able(db, sParse.
6620: 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 73 71  pNewTable);.  sq
6630: 6c 69 74 65 33 50 61 72 73 65 72 52 65 73 65 74  lite3ParserReset
6640: 28 26 73 50 61 72 73 65 29 3b 0a 0a 20 20 61 73  (&sParse);..  as
6650: 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d  sert( (rc&0xff)=
6660: 3d 72 63 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  =rc );.  rc = sq
6670: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
6680: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
6690: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
66a0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
66b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
66c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
66d0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 76 64  nvoked by the vd
66e0: 62 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78  be to call the x
66f0: 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a  Destroy method.*
6700: 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  * of the virtual
6710: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 7a 54 61   table named zTa
6720: 62 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  b in database iD
6730: 62 2e 20 54 68 69 73 20 6f 63 63 75 72 73 0a 2a  b. This occurs.*
6740: 2a 20 77 68 65 6e 20 61 20 44 52 4f 50 20 54 41  * when a DROP TA
6750: 42 4c 45 20 69 73 20 6d 65 6e 74 69 6f 6e 65 64  BLE is mentioned
6760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
6770: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
6780: 7a 54 61 62 20 69 73 20 6e 6f 74 20 61 20 76 69  zTab is not a vi
6790: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
67a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 43  int sqlite3VtabC
67b0: 61 6c 6c 44 65 73 74 72 6f 79 28 73 71 6c 69 74  allDestroy(sqlit
67c0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
67d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
67e0: 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
67f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 61 62 6c  QLITE_OK;.  Tabl
6800: 65 20 2a 70 54 61 62 3b 0a 0a 20 20 70 54 61 62  e *pTab;..  pTab
6810: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
6820: 62 6c 65 28 64 62 2c 20 7a 54 61 62 2c 20 64 62  ble(db, zTab, db
6830: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
6840: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
6850: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 70 54  !=0 && ALWAYS(pT
6860: 61 62 2d 3e 70 56 54 61 62 6c 65 21 3d 30 29 20  ab->pVTable!=0) 
6870: 29 7b 0a 20 20 20 20 56 54 61 62 6c 65 20 2a 70  ){.    VTable *p
6880: 3b 0a 20 20 20 20 69 6e 74 20 28 2a 78 44 65 73  ;.    int (*xDes
6890: 74 72 6f 79 29 28 73 71 6c 69 74 65 33 5f 76 74  troy)(sqlite3_vt
68a0: 61 62 20 2a 29 3b 0a 20 20 20 20 66 6f 72 28 70  ab *);.    for(p
68b0: 3d 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 3b 20  =pTab->pVTable; 
68c0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
68d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
68e0: 3e 70 56 74 61 62 20 29 3b 0a 20 20 20 20 20 20  >pVtab );.      
68f0: 69 66 28 20 70 2d 3e 70 56 74 61 62 2d 3e 6e 52  if( p->pVtab->nR
6900: 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ef>0 ){.        
6910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
6920: 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CKED;.      }.  
6930: 20 20 7d 0a 20 20 20 20 70 20 3d 20 76 74 61 62    }.    p = vtab
6940: 44 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 28 64 62  DisconnectAll(db
6950: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 78 44 65  , pTab);.    xDe
6960: 73 74 72 6f 79 20 3d 20 70 2d 3e 70 4d 6f 64 2d  stroy = p->pMod-
6970: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73 74 72  >pModule->xDestr
6980: 6f 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  oy;.    assert( 
6990: 78 44 65 73 74 72 6f 79 21 3d 30 20 29 3b 20 20  xDestroy!=0 );  
69a0: 2f 2a 20 43 68 65 63 6b 65 64 20 62 65 66 6f 72  /* Checked befor
69b0: 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
69c0: 62 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 2a  ble is created *
69d0: 2f 0a 20 20 20 20 72 63 20 3d 20 78 44 65 73 74  /.    rc = xDest
69e0: 72 6f 79 28 70 2d 3e 70 56 74 61 62 29 3b 0a 20  roy(p->pVtab);. 
69f0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
6a00: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2a 20 66   sqlite3_vtab* f
6a10: 72 6f 6d 20 74 68 65 20 61 56 54 72 61 6e 73 5b  rom the aVTrans[
6a20: 5d 20 61 72 72 61 79 2c 20 69 66 20 61 70 70 6c  ] array, if appl
6a30: 69 63 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66  icable */.    if
6a40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6a50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
6a60: 20 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 3d 3d   pTab->pVTable==
6a70: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  p && p->pNext==0
6a80: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 74   );.      p->pVt
6a90: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54  ab = 0;.      pT
6aa0: 61 62 2d 3e 70 56 54 61 62 6c 65 20 3d 20 30 3b  ab->pVTable = 0;
6ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
6ac0: 61 62 55 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 20  abUnlock(p);.   
6ad0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
6ae0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6af0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  is function invo
6b00: 6b 65 73 20 65 69 74 68 65 72 20 74 68 65 20 78  kes either the x
6b10: 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 78 43 6f 6d  Rollback or xCom
6b20: 6d 69 74 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  mit method.** of
6b30: 20 65 61 63 68 20 6f 66 20 74 68 65 20 76 69 72   each of the vir
6b40: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 74  tual tables in t
6b50: 68 65 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61  he sqlite3.aVTra
6b60: 6e 73 20 61 72 72 61 79 2e 20 54 68 65 20 6d 65  ns array. The me
6b70: 74 68 6f 64 0a 2a 2a 20 63 61 6c 6c 65 64 20 69  thod.** called i
6b80: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
6b90: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6ba0: 65 6e 74 2c 20 22 6f 66 66 73 65 74 22 2c 20 77  ent, "offset", w
6bb0: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 6f  hich is.** the o
6bc0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 6d 65 74  ffset of the met
6bd0: 68 6f 64 20 74 6f 20 63 61 6c 6c 20 69 6e 20 74  hod to call in t
6be0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  he sqlite3_modul
6bf0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
6c00: 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20  ** The array is 
6c10: 63 6c 65 61 72 65 64 20 61 66 74 65 72 20 69 6e  cleared after in
6c20: 76 6f 6b 69 6e 67 20 74 68 65 20 63 61 6c 6c 62  voking the callb
6c30: 61 63 6b 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  acks. .*/.static
6c40: 20 76 6f 69 64 20 63 61 6c 6c 46 69 6e 61 6c 69   void callFinali
6c50: 73 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ser(sqlite3 *db,
6c60: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
6c70: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 64 62 2d  int i;.  if( db-
6c80: 3e 61 56 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  >aVTrans ){.    
6c90: 56 54 61 62 6c 65 20 2a 2a 61 56 54 72 61 6e 73  VTable **aVTrans
6ca0: 20 3d 20 64 62 2d 3e 61 56 54 72 61 6e 73 3b 0a   = db->aVTrans;.
6cb0: 20 20 20 20 64 62 2d 3e 61 56 54 72 61 6e 73 20      db->aVTrans 
6cc0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
6cd0: 3b 20 69 3c 64 62 2d 3e 6e 56 54 72 61 6e 73 3b  ; i<db->nVTrans;
6ce0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 54 61   i++){.      VTa
6cf0: 62 6c 65 20 2a 70 56 54 61 62 20 3d 20 61 56 54  ble *pVTab = aVT
6d00: 72 61 6e 73 5b 69 5d 3b 0a 20 20 20 20 20 20 73  rans[i];.      s
6d10: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 20 3d  qlite3_vtab *p =
6d20: 20 70 56 54 61 62 2d 3e 70 56 74 61 62 3b 0a 20   pVTab->pVtab;. 
6d30: 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20       if( p ){.  
6d40: 20 20 20 20 20 20 69 6e 74 20 28 2a 78 29 28 73        int (*x)(s
6d50: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 3b 0a  qlite3_vtab *);.
6d60: 20 20 20 20 20 20 20 20 78 20 3d 20 2a 28 69 6e          x = *(in
6d70: 74 20 28 2a 2a 29 28 73 71 6c 69 74 65 33 5f 76  t (**)(sqlite3_v
6d80: 74 61 62 20 2a 29 29 28 28 63 68 61 72 20 2a 29  tab *))((char *)
6d90: 70 2d 3e 70 4d 6f 64 75 6c 65 20 2b 20 6f 66 66  p->pModule + off
6da0: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
6db0: 28 20 78 20 29 20 78 28 70 29 3b 0a 20 20 20 20  ( x ) x(p);.    
6dc0: 20 20 7d 0a 20 20 20 20 20 20 70 56 54 61 62 2d    }.      pVTab-
6dd0: 3e 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >iSavepoint = 0;
6de0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
6df0: 61 62 55 6e 6c 6f 63 6b 28 70 56 54 61 62 29 3b  abUnlock(pVTab);
6e00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6e10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 56 54  e3DbFree(db, aVT
6e20: 72 61 6e 73 29 3b 0a 20 20 20 20 64 62 2d 3e 6e  rans);.    db->n
6e30: 56 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 7d 0a  VTrans = 0;.  }.
6e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
6e50: 74 68 65 20 78 53 79 6e 63 20 6d 65 74 68 6f 64  the xSync method
6e60: 20 6f 66 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   of all virtual 
6e70: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 71  tables in the sq
6e80: 6c 69 74 65 33 2e 61 56 54 72 61 6e 73 0a 2a 2a  lite3.aVTrans.**
6e90: 20 61 72 72 61 79 2e 20 52 65 74 75 72 6e 20 74   array. Return t
6ea0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 6f  he error code fo
6eb0: 72 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  r the first erro
6ec0: 72 20 74 68 61 74 20 6f 63 63 75 72 73 2c 20 6f  r that occurs, o
6ed0: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  r.** SQLITE_OK i
6ee0: 66 20 61 6c 6c 20 78 53 79 6e 63 20 6f 70 65 72  f all xSync oper
6ef0: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
6f00: 73 73 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssful..**.** If 
6f10: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6f20: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6c   is available, l
6f30: 65 61 76 65 20 69 74 20 69 6e 20 70 2d 3e 7a 45  eave it in p->zE
6f40: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
6f50: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 73 71  lite3VtabSync(sq
6f60: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
6f70: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
6f80: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6f90: 4f 4b 3b 0a 20 20 56 54 61 62 6c 65 20 2a 2a 61  OK;.  VTable **a
6fa0: 56 54 72 61 6e 73 20 3d 20 64 62 2d 3e 61 56 54  VTrans = db->aVT
6fb0: 72 61 6e 73 3b 0a 0a 20 20 64 62 2d 3e 61 56 54  rans;..  db->aVT
6fc0: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  rans = 0;.  for(
6fd0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6fe0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 56 54 72  OK && i<db->nVTr
6ff0: 61 6e 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ans; i++){.    i
7000: 6e 74 20 28 2a 78 29 28 73 71 6c 69 74 65 33 5f  nt (*x)(sqlite3_
7010: 76 74 61 62 20 2a 29 3b 0a 20 20 20 20 73 71 6c  vtab *);.    sql
7020: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
7030: 20 3d 20 61 56 54 72 61 6e 73 5b 69 5d 2d 3e 70   = aVTrans[i]->p
7040: 56 74 61 62 3b 0a 20 20 20 20 69 66 28 20 70 56  Vtab;.    if( pV
7050: 74 61 62 20 26 26 20 28 78 20 3d 20 70 56 74 61  tab && (x = pVta
7060: 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 79 6e  b->pModule->xSyn
7070: 63 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  c)!=0 ){.      r
7080: 63 20 3d 20 78 28 70 56 74 61 62 29 3b 0a 20 20  c = x(pVtab);.  
7090: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 49      sqlite3VtabI
70a0: 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70  mportErrmsg(p, p
70b0: 56 74 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Vtab);.    }.  }
70c0: 0a 20 20 64 62 2d 3e 61 56 54 72 61 6e 73 20 3d  .  db->aVTrans =
70d0: 20 61 56 54 72 61 6e 73 3b 0a 20 20 72 65 74 75   aVTrans;.  retu
70e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
70f0: 49 6e 76 6f 6b 65 20 74 68 65 20 78 52 6f 6c 6c  Invoke the xRoll
7100: 62 61 63 6b 20 6d 65 74 68 6f 64 20 6f 66 20 61  back method of a
7110: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
7120: 73 20 69 6e 20 74 68 65 20 0a 2a 2a 20 73 71 6c  s in the .** sql
7130: 69 74 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72  ite3.aVTrans arr
7140: 61 79 2e 20 54 68 65 6e 20 63 6c 65 61 72 20 74  ay. Then clear t
7150: 68 65 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e  he array itself.
7160: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
7170: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 73 71 6c 69  tabRollback(sqli
7180: 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 61 6c 6c  te3 *db){.  call
7190: 46 69 6e 61 6c 69 73 65 72 28 64 62 2c 20 6f 66  Finaliser(db, of
71a0: 66 73 65 74 6f 66 28 73 71 6c 69 74 65 33 5f 6d  fsetof(sqlite3_m
71b0: 6f 64 75 6c 65 2c 78 52 6f 6c 6c 62 61 63 6b 29  odule,xRollback)
71c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
71d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
71e0: 49 6e 76 6f 6b 65 20 74 68 65 20 78 43 6f 6d 6d  Invoke the xComm
71f0: 69 74 20 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c  it method of all
7200: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
7210: 69 6e 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  in the .** sqlit
7220: 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72 61 79  e3.aVTrans array
7230: 2e 20 54 68 65 6e 20 63 6c 65 61 72 20 74 68 65  . Then clear the
7240: 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e 0a 2a   array itself..*
7250: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61  /.int sqlite3Vta
7260: 62 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  bCommit(sqlite3 
7270: 2a 64 62 29 7b 0a 20 20 63 61 6c 6c 46 69 6e 61  *db){.  callFina
7280: 6c 69 73 65 72 28 64 62 2c 20 6f 66 66 73 65 74  liser(db, offset
7290: 6f 66 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  of(sqlite3_modul
72a0: 65 2c 78 43 6f 6d 6d 69 74 29 29 3b 0a 20 20 72  e,xCommit));.  r
72b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
72c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
72d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 70   virtual table p
72e0: 56 74 61 62 20 73 75 70 70 6f 72 74 73 20 74 68  Vtab supports th
72f0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
7300: 74 65 72 66 61 63 65 0a 2a 2a 20 28 78 42 65 67  terface.** (xBeg
7310: 69 6e 2f 78 52 6f 6c 6c 62 61 63 6b 2f 78 43 6f  in/xRollback/xCo
7320: 6d 6d 69 74 20 61 6e 64 20 6f 70 74 69 6f 6e 61  mmit and optiona
7330: 6c 6c 79 20 78 53 79 6e 63 29 20 61 6e 64 20 61  lly xSync) and a
7340: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
7350: 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ** not currently
7360: 20 6f 70 65 6e 2c 20 69 6e 76 6f 6b 65 20 74 68   open, invoke th
7370: 65 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20  e xBegin method 
7380: 6e 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  now..**.** If th
7390: 65 20 78 42 65 67 69 6e 20 63 61 6c 6c 20 69 73  e xBegin call is
73a0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 6c 61   successful, pla
73b0: 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  ce the sqlite3_v
73c0: 74 61 62 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  tab pointer.** i
73d0: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 56  n the sqlite3.aV
73e0: 54 72 61 6e 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  Trans array..*/.
73f0: 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 42  int sqlite3VtabB
7400: 65 67 69 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  egin(sqlite3 *db
7410: 2c 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 29  , VTable *pVTab)
7420: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7430: 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
7440: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
7450: 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 53  pModule;..  /* S
7460: 70 65 63 69 61 6c 20 63 61 73 65 3a 20 49 66 20  pecial case: If 
7470: 64 62 2d 3e 61 56 54 72 61 6e 73 20 69 73 20 4e  db->aVTrans is N
7480: 55 4c 4c 20 61 6e 64 20 64 62 2d 3e 6e 56 54 72  ULL and db->nVTr
7490: 61 6e 73 20 69 73 20 67 72 65 61 74 65 72 0a 20  ans is greater. 
74a0: 20 2a 2a 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74   ** than zero, t
74b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
74c0: 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
74d0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 0a  d from within a.
74e0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
74f0: 75 6c 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  ule xSync() call
7500: 62 61 63 6b 2e 20 49 74 20 69 73 20 69 6c 6c 65  back. It is ille
7510: 67 61 6c 20 74 6f 20 77 72 69 74 65 20 74 6f 20  gal to write to 
7520: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
7530: 64 75 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74  dule tables in t
7540: 68 69 73 20 63 61 73 65 2c 20 73 6f 20 72 65 74  his case, so ret
7550: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
7560: 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  D..  */.  if( sq
7570: 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
7580: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
7590: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
75a0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 56 54 61  .  }.  if( !pVTa
75b0: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
75c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 20 0a  SQLITE_OK;.  } .
75d0: 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 54 61    pModule = pVTa
75e0: 62 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  b->pVtab->pModul
75f0: 65 3b 0a 0a 20 20 69 66 28 20 70 4d 6f 64 75 6c  e;..  if( pModul
7600: 65 2d 3e 78 42 65 67 69 6e 20 29 7b 0a 20 20 20  e->xBegin ){.   
7610: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
7620: 49 66 20 70 56 74 61 62 20 69 73 20 61 6c 72 65  If pVtab is alre
7630: 61 64 79 20 69 6e 20 74 68 65 20 61 56 54 72 61  ady in the aVTra
7640: 6e 73 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e  ns array, return
7650: 20 65 61 72 6c 79 20 2a 2f 0a 20 20 20 20 66 6f   early */.    fo
7660: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 56 54  r(i=0; i<db->nVT
7670: 72 61 6e 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rans; i++){.    
7680: 20 20 69 66 28 20 64 62 2d 3e 61 56 54 72 61 6e    if( db->aVTran
7690: 73 5b 69 5d 3d 3d 70 56 54 61 62 20 29 7b 0a 20  s[i]==pVTab ){. 
76a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
76b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
76c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
76d0: 6e 76 6f 6b 65 20 74 68 65 20 78 42 65 67 69 6e  nvoke the xBegin
76e0: 20 6d 65 74 68 6f 64 2e 20 49 66 20 73 75 63 63   method. If succ
76f0: 65 73 73 66 75 6c 2c 20 61 64 64 20 74 68 65 20  essful, add the 
7700: 76 74 61 62 20 74 6f 20 74 68 65 20 0a 20 20 20  vtab to the .   
7710: 20 2a 2a 20 73 71 6c 69 74 65 33 2e 61 56 54 72   ** sqlite3.aVTr
7720: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a  ans[] array. */.
7730: 20 20 20 20 72 63 20 3d 20 67 72 6f 77 56 54 72      rc = growVTr
7740: 61 6e 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ans(db);.    if(
7750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7760: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f  {.      rc = pMo
7770: 64 75 6c 65 2d 3e 78 42 65 67 69 6e 28 70 56 54  dule->xBegin(pVT
7780: 61 62 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20 20  ab->pVtab);.    
7790: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
77a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
77b0: 6e 74 20 69 53 76 70 74 20 3d 20 64 62 2d 3e 6e  nt iSvpt = db->n
77c0: 53 74 61 74 65 6d 65 6e 74 20 2b 20 64 62 2d 3e  Statement + db->
77d0: 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  nSavepoint;.    
77e0: 20 20 20 20 61 64 64 54 6f 56 54 72 61 6e 73 28      addToVTrans(
77f0: 64 62 2c 20 70 56 54 61 62 29 3b 0a 20 20 20 20  db, pVTab);.    
7800: 20 20 20 20 69 66 28 20 69 53 76 70 74 20 26 26      if( iSvpt &&
7810: 20 70 4d 6f 64 75 6c 65 2d 3e 78 53 61 76 65 70   pModule->xSavep
7820: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
7830: 20 20 70 56 54 61 62 2d 3e 69 53 61 76 65 70 6f    pVTab->iSavepo
7840: 69 6e 74 20 3d 20 69 53 76 70 74 3b 0a 20 20 20  int = iSvpt;.   
7850: 20 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64         rc = pMod
7860: 75 6c 65 2d 3e 78 53 61 76 65 70 6f 69 6e 74 28  ule->xSavepoint(
7870: 70 56 54 61 62 2d 3e 70 56 74 61 62 2c 20 69 53  pVTab->pVtab, iS
7880: 76 70 74 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  vpt-1);.        
7890: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
78a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
78b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
78c0: 20 65 69 74 68 65 72 20 74 68 65 20 78 53 61 76   either the xSav
78d0: 65 70 6f 69 6e 74 2c 20 78 52 6f 6c 6c 62 61 63  epoint, xRollbac
78e0: 6b 54 6f 20 6f 72 20 78 52 65 6c 65 61 73 65 20  kTo or xRelease 
78f0: 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c 0a 2a 2a  method of all.**
7900: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
7910: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68  that currently h
7920: 61 76 65 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  ave an open tran
7930: 73 61 63 74 69 6f 6e 2e 20 50 61 73 73 20 69 53  saction. Pass iS
7940: 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 61 73 20 74  avepoint.** as t
7950: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7960: 6e 74 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  nt to the virtua
7970: 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f 64 20 69  l table method i
7980: 6e 76 6f 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nvoked..**.** If
7990: 20 6f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54   op is SAVEPOINT
79a0: 5f 42 45 47 49 4e 2c 20 74 68 65 20 78 53 61 76  _BEGIN, the xSav
79b0: 65 70 6f 69 6e 74 20 6d 65 74 68 6f 64 20 69 73  epoint method is
79c0: 20 69 6e 76 6f 6b 65 64 2e 20 49 66 20 69 74 20   invoked. If it 
79d0: 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
79e0: 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 20 78 52  ROLLBACK, the xR
79f0: 6f 6c 6c 62 61 63 6b 54 6f 20 6d 65 74 68 6f 64  ollbackTo method
7a00: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
7a10: 6f 70 20 69 73 20 0a 2a 2a 20 53 41 56 45 50 4f  op is .** SAVEPO
7a20: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
7a30: 6e 20 74 68 65 20 78 52 65 6c 65 61 73 65 20 6d  n the xRelease m
7a40: 65 74 68 6f 64 20 6f 66 20 65 61 63 68 20 76 69  ethod of each vi
7a50: 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
7a60: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  .** an open tran
7a70: 73 61 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  saction is invok
7a80: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
7a90: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
7aa0: 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20 61 6e  ethod returns an
7ab0: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
7ac0: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
7ad0: 2c 20 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  , .** processing
7ae0: 20 69 73 20 61 62 61 6e 64 6f 6e 65 64 20 61 6e   is abandoned an
7af0: 64 20 74 68 65 20 65 72 72 6f 72 20 72 65 74 75  d the error retu
7b00: 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
7b10: 65 72 20 6f 66 20 74 68 69 73 0a 2a 2a 20 66 75  er of this.** fu
7b20: 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
7b30: 6c 79 2e 20 49 66 20 61 6c 6c 20 63 61 6c 6c 73  ly. If all calls
7b40: 20 74 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c   to virtual tabl
7b50: 65 20 6d 65 74 68 6f 64 73 20 61 72 65 20 73 75  e methods are su
7b60: 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c  ccessful,.** SQL
7b70: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
7b80: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
7b90: 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
7ba0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
7bb0: 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
7bc0: 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
7bd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
7be0: 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
7bf0: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 7c 7c 6f 70  OINT_RELEASE||op
7c00: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
7c10: 42 41 43 4b 7c 7c 6f 70 3d 3d 53 41 56 45 50 4f  BACK||op==SAVEPO
7c20: 49 4e 54 5f 42 45 47 49 4e 20 29 3b 0a 20 20 61  INT_BEGIN );.  a
7c30: 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
7c40: 74 3e 3d 2d 31 20 29 3b 0a 20 20 69 66 28 20 64  t>=-1 );.  if( d
7c50: 62 2d 3e 61 56 54 72 61 6e 73 20 29 7b 0a 20 20  b->aVTrans ){.  
7c60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
7c70: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
7c80: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 56 54  _OK && i<db->nVT
7c90: 72 61 6e 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rans; i++){.    
7ca0: 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 20    VTable *pVTab 
7cb0: 3d 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 69 5d  = db->aVTrans[i]
7cc0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71  ;.      const sq
7cd0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
7ce0: 6f 64 20 3d 20 70 56 54 61 62 2d 3e 70 4d 6f 64  od = pVTab->pMod
7cf0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20  ->pModule;.     
7d00: 20 69 66 28 20 70 56 54 61 62 2d 3e 70 56 74 61   if( pVTab->pVta
7d10: 62 20 26 26 20 70 4d 6f 64 2d 3e 69 56 65 72 73  b && pMod->iVers
7d20: 69 6f 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  ion>=2 ){.      
7d30: 20 20 69 6e 74 20 28 2a 78 4d 65 74 68 6f 64 29    int (*xMethod)
7d40: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2c  (sqlite3_vtab *,
7d50: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73   int);.        s
7d60: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
7d70: 20 20 20 20 20 20 20 63 61 73 65 20 53 41 56 45         case SAVE
7d80: 50 4f 49 4e 54 5f 42 45 47 49 4e 3a 0a 20 20 20  POINT_BEGIN:.   
7d90: 20 20 20 20 20 20 20 20 20 78 4d 65 74 68 6f 64           xMethod
7da0: 20 3d 20 70 4d 6f 64 2d 3e 78 53 61 76 65 70 6f   = pMod->xSavepo
7db0: 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  int;.           
7dc0: 20 70 56 54 61 62 2d 3e 69 53 61 76 65 70 6f 69   pVTab->iSavepoi
7dd0: 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 2b  nt = iSavepoint+
7de0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
7df0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
7e00: 63 61 73 65 20 53 41 56 45 50 4f 49 4e 54 5f 52  case SAVEPOINT_R
7e10: 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20  OLLBACK:.       
7e20: 20 20 20 20 20 78 4d 65 74 68 6f 64 20 3d 20 70       xMethod = p
7e30: 4d 6f 64 2d 3e 78 52 6f 6c 6c 62 61 63 6b 54 6f  Mod->xRollbackTo
7e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
7e50: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
7e60: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
7e70: 20 20 20 20 78 4d 65 74 68 6f 64 20 3d 20 70 4d      xMethod = pM
7e80: 6f 64 2d 3e 78 52 65 6c 65 61 73 65 3b 0a 20 20  od->xRelease;.  
7e90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
7ea0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7eb0: 20 20 20 69 66 28 20 78 4d 65 74 68 6f 64 20 26     if( xMethod &
7ec0: 26 20 70 56 54 61 62 2d 3e 69 53 61 76 65 70 6f  & pVTab->iSavepo
7ed0: 69 6e 74 3e 69 53 61 76 65 70 6f 69 6e 74 20 29  int>iSavepoint )
7ee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
7ef0: 20 78 4d 65 74 68 6f 64 28 70 56 54 61 62 2d 3e   xMethod(pVTab->
7f00: 70 56 74 61 62 2c 20 69 53 61 76 65 70 6f 69 6e  pVtab, iSavepoin
7f10: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
7f20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7f30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7f40: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
7f50: 70 61 72 61 6d 65 74 65 72 20 28 70 44 65 66 29  parameter (pDef)
7f60: 20 69 73 20 61 20 66 75 6e 63 74 69 6f 6e 20 69   is a function i
7f70: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
7f80: 54 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 70 61  The.** second pa
7f90: 72 61 6d 65 74 65 72 20 28 70 45 78 70 72 29 20  rameter (pExpr) 
7fa0: 69 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  is the first arg
7fb0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
7fc0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 70 45  nction..** If pE
7fd0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  xpr is a column 
7fe0: 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
7ff0: 6c 65 2c 20 74 68 65 6e 20 6c 65 74 20 74 68 65  le, then let the
8000: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
8010: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8020: 20 68 61 76 65 20 61 6e 20 6f 70 70 6f 72 74 75   have an opportu
8030: 6e 69 74 79 20 74 6f 20 6f 76 65 72 6c 6f 61 64  nity to overload
8040: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
8050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8060: 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
8070: 6f 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ow virtual table
8080: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
8090: 20 74 6f 0a 2a 2a 20 6f 76 65 72 6c 6f 61 64 20   to.** overload 
80a0: 4d 41 54 43 48 2c 20 4c 49 4b 45 2c 20 47 4c 4f  MATCH, LIKE, GLO
80b0: 42 2c 20 61 6e 64 20 52 45 47 45 58 50 20 6f 70  B, and REGEXP op
80c0: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 52  erators..**.** R
80d0: 65 74 75 72 6e 20 65 69 74 68 65 72 20 74 68 65  eturn either the
80e0: 20 70 44 65 66 20 61 72 67 75 6d 65 6e 74 20 28   pDef argument (
80f0: 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 63 68  indicating no ch
8100: 61 6e 67 65 29 20 6f 72 20 61 20 0a 2a 2a 20 6e  ange) or a .** n
8110: 65 77 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ew FuncDef struc
8120: 74 75 72 65 20 74 68 61 74 20 69 73 20 6d 61 72  ture that is mar
8130: 6b 65 64 20 61 73 20 65 70 68 65 6d 65 72 61 6c  ked as ephemeral
8140: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 53 51   using the.** SQ
8150: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 20  LITE_FUNC_EPHEM 
8160: 66 6c 61 67 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66  flag..*/.FuncDef
8170: 20 2a 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65   *sqlite3VtabOve
8180: 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 0a 20  rloadFunction(. 
8190: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
81a0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
81b0: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 72 65 70 6f  nection for repo
81c0: 72 74 69 6e 67 20 6d 61 6c 6c 6f 63 20 70 72 6f  rting malloc pro
81d0: 62 6c 65 6d 73 20 2a 2f 0a 20 20 46 75 6e 63 44  blems */.  FuncD
81e0: 65 66 20 2a 70 44 65 66 2c 20 20 2f 2a 20 46 75  ef *pDef,  /* Fu
81f0: 6e 63 74 69 6f 6e 20 74 6f 20 70 6f 73 73 69 62  nction to possib
8200: 6c 79 20 6f 76 65 72 6c 6f 61 64 20 2a 2f 0a 20  ly overload */. 
8210: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
8220: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8230: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
8240: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  unction */.  Exp
8250: 72 20 2a 70 45 78 70 72 20 20 20 20 20 2f 2a 20  r *pExpr     /* 
8260: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
8270: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
8280: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
8290: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  ab;.  sqlite3_vt
82a0: 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 73 71 6c  ab *pVtab;.  sql
82b0: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
82c0: 64 3b 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  d;.  void (*xSFu
82d0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
82e0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
82f0: 5f 76 61 6c 75 65 2a 2a 29 20 3d 20 30 3b 0a 20  _value**) = 0;. 
8300: 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b   void *pArg = 0;
8310: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 77  .  FuncDef *pNew
8320: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
8330: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
8340: 65 65 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ee the left oper
8350: 61 6e 64 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  and is a column 
8360: 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
8370: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  le */.  if( NEVE
8380: 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
8390: 74 75 72 6e 20 70 44 65 66 3b 0a 20 20 69 66 28  turn pDef;.  if(
83a0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
83b0: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 70  OLUMN ) return p
83c0: 44 65 66 3b 0a 20 20 70 54 61 62 20 3d 20 70 45  Def;.  pTab = pE
83d0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28  xpr->pTab;.  if(
83e0: 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
83f0: 6e 20 70 44 65 66 3b 0a 20 20 69 66 28 20 21 49  n pDef;.  if( !I
8400: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
8410: 20 72 65 74 75 72 6e 20 70 44 65 66 3b 0a 20 20   return pDef;.  
8420: 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
8430: 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
8440: 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 61 73 73  b)->pVtab;.  ass
8450: 65 72 74 28 20 70 56 74 61 62 21 3d 30 20 29 3b  ert( pVtab!=0 );
8460: 0a 20 20 61 73 73 65 72 74 28 20 70 56 74 61 62  .  assert( pVtab
8470: 2d 3e 70 4d 6f 64 75 6c 65 21 3d 30 20 29 3b 0a  ->pModule!=0 );.
8480: 20 20 70 4d 6f 64 20 3d 20 28 73 71 6c 69 74 65    pMod = (sqlite
8490: 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74 61 62  3_module *)pVtab
84a0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 66 28  ->pModule;.  if(
84b0: 20 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75 6e 63   pMod->xFindFunc
84c0: 74 69 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  tion==0 ) return
84d0: 20 70 44 65 66 3b 0a 20 0a 20 20 2f 2a 20 43 61   pDef;. .  /* Ca
84e0: 6c 6c 20 74 68 65 20 78 46 69 6e 64 46 75 6e 63  ll the xFindFunc
84f0: 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 6e 20 74  tion method on t
8500: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
8510: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
8520: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74    ** to see if t
8530: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
8540: 6e 20 77 61 6e 74 73 20 74 6f 20 6f 76 65 72 6c  n wants to overl
8550: 6f 61 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oad this functio
8560: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 6f  n..  **.  ** Tho
8570: 75 67 68 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64  ugh undocumented
8580: 2c 20 77 65 20 68 61 76 65 20 68 69 73 74 6f 72  , we have histor
8590: 69 63 61 6c 6c 79 20 61 6c 77 61 79 73 20 69 6e  ically always in
85a0: 76 6f 6b 65 64 20 78 46 69 6e 64 46 75 6e 63 74  voked xFindFunct
85b0: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  ion.  ** with an
85c0: 20 61 6c 6c 20 6c 6f 77 65 72 2d 63 61 73 65 20   all lower-case 
85d0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 20  function name.  
85e0: 43 6f 6e 74 69 6e 75 65 20 69 6e 20 74 68 69 73  Continue in this
85f0: 20 74 72 61 64 69 74 69 6f 6e 20 74 6f 0a 20 20   tradition to.  
8600: 2a 2a 20 61 76 6f 69 64 20 61 6e 79 20 63 68 61  ** avoid any cha
8610: 6e 63 65 20 6f 66 20 61 6e 20 69 6e 63 6f 6d 70  nce of an incomp
8620: 61 74 69 62 69 6c 69 74 79 2e 0a 20 20 2a 2f 0a  atibility..  */.
8630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8640: 42 55 47 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  BUG.  {.    int 
8650: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
8660: 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b 69 5d 3b 20  pDef->zName[i]; 
8670: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  i++){.      unsi
8680: 67 6e 65 64 20 63 68 61 72 20 78 20 3d 20 28 75  gned char x = (u
8690: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 44 65  nsigned char)pDe
86a0: 66 2d 3e 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20  f->zName[i];.   
86b0: 20 20 20 61 73 73 65 72 74 28 20 78 3d 3d 73 71     assert( x==sq
86c0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
86d0: 72 5b 78 5d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  r[x] );.    }.  
86e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20  }.#endif.  rc = 
86f0: 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75 6e 63 74  pMod->xFindFunct
8700: 69 6f 6e 28 70 56 74 61 62 2c 20 6e 41 72 67 2c  ion(pVtab, nArg,
8710: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 26 78   pDef->zName, &x
8720: 53 46 75 6e 63 2c 20 26 70 41 72 67 29 3b 0a 20  SFunc, &pArg);. 
8730: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
8740: 20 20 72 65 74 75 72 6e 20 70 44 65 66 3b 0a 20    return pDef;. 
8750: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20   }..  /* Create 
8760: 61 20 6e 65 77 20 65 70 68 65 6d 65 72 61 6c 20  a new ephemeral 
8770: 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
8780: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ion for the over
8790: 6c 6f 61 64 65 64 0a 20 20 2a 2a 20 66 75 6e 63  loaded.  ** func
87a0: 74 69 6f 6e 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  tion */.  pNew =
87b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
87c0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
87d0: 2a 70 4e 65 77 29 0a 20 20 20 20 20 20 20 20 20  *pNew).         
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 20 20 20 20 2b 20 73 71 6c 69 74 65 33 53 74 72      + sqlite3Str
8800: 6c 65 6e 33 30 28 70 44 65 66 2d 3e 7a 4e 61 6d  len30(pDef->zNam
8810: 65 29 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 70  e) + 1);.  if( p
8820: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  New==0 ){.    re
8830: 74 75 72 6e 20 70 44 65 66 3b 0a 20 20 7d 0a 20  turn pDef;.  }. 
8840: 20 2a 70 4e 65 77 20 3d 20 2a 70 44 65 66 3b 0a   *pNew = *pDef;.
8850: 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20    pNew->zName = 
8860: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 70 4e  (const char*)&pN
8870: 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  ew[1];.  memcpy(
8880: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 2c  (char*)&pNew[1],
8890: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 73 71   pDef->zName, sq
88a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
88b0: 65 66 2d 3e 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  ef->zName)+1);. 
88c0: 20 70 4e 65 77 2d 3e 78 53 46 75 6e 63 20 3d 20   pNew->xSFunc = 
88d0: 78 53 46 75 6e 63 3b 0a 20 20 70 4e 65 77 2d 3e  xSFunc;.  pNew->
88e0: 70 55 73 65 72 44 61 74 61 20 3d 20 70 41 72 67  pUserData = pArg
88f0: 3b 0a 20 20 70 4e 65 77 2d 3e 66 75 6e 63 46 6c  ;.  pNew->funcFl
8900: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 55  ags |= SQLITE_FU
8910: 4e 43 5f 45 50 48 45 4d 3b 0a 20 20 72 65 74 75  NC_EPHEM;.  retu
8920: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
8930: 2a 20 4d 61 6b 65 20 73 75 72 65 20 76 69 72 74  * Make sure virt
8940: 75 61 6c 20 74 61 62 6c 65 20 70 54 61 62 20 69  ual table pTab i
8950: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
8960: 68 65 20 70 50 61 72 73 65 2d 3e 61 70 56 69 72  he pParse->apVir
8970: 74 75 61 6c 4c 6f 63 6b 5b 5d 0a 2a 2a 20 61 72  tualLock[].** ar
8980: 72 61 79 20 73 6f 20 74 68 61 74 20 61 6e 20 4f  ray so that an O
8990: 50 5f 56 42 65 67 69 6e 20 77 69 6c 6c 20 67 65  P_VBegin will ge
89a0: 74 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  t generated for 
89b0: 69 74 2e 20 20 41 64 64 20 70 54 61 62 20 74 6f  it.  Add pTab to
89c0: 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 66   the.** array if
89d0: 20 69 74 20 69 73 20 6d 69 73 73 69 6e 67 2e 20   it is missing. 
89e0: 20 49 66 20 70 54 61 62 20 69 73 20 61 6c 72 65   If pTab is alre
89f0: 61 64 79 20 69 6e 20 74 68 65 20 61 72 72 61 79  ady in the array
8a00: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
8a10: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  * is a no-op..*/
8a20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
8a30: 62 4d 61 6b 65 57 72 69 74 61 62 6c 65 28 50 61  bMakeWritable(Pa
8a40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
8a50: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 50 61 72  le *pTab){.  Par
8a60: 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
8a70: 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
8a80: 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
8a90: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 54 61 62 6c  int i, n;.  Tabl
8aa0: 65 20 2a 2a 61 70 56 74 61 62 4c 6f 63 6b 3b 0a  e **apVtabLock;.
8ab0: 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
8ac0: 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20  tual(pTab) );.  
8ad0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
8ae0: 65 76 65 6c 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b  evel->nVtabLock;
8af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
8b00: 54 61 62 3d 3d 70 54 6f 70 6c 65 76 65 6c 2d 3e  Tab==pToplevel->
8b10: 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 20 29 20  apVtabLock[i] ) 
8b20: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 20  return;.  }.  n 
8b30: 3d 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 56  = (pToplevel->nV
8b40: 74 61 62 4c 6f 63 6b 2b 31 29 2a 73 69 7a 65 6f  tabLock+1)*sizeo
8b50: 66 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70 56  f(pToplevel->apV
8b60: 74 61 62 4c 6f 63 6b 5b 30 5d 29 3b 0a 20 20 61  tabLock[0]);.  a
8b70: 70 56 74 61 62 4c 6f 63 6b 20 3d 20 73 71 6c 69  pVtabLock = sqli
8b80: 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 54  te3_realloc64(pT
8b90: 6f 70 6c 65 76 65 6c 2d 3e 61 70 56 74 61 62 4c  oplevel->apVtabL
8ba0: 6f 63 6b 2c 20 6e 29 3b 0a 20 20 69 66 28 20 61  ock, n);.  if( a
8bb0: 70 56 74 61 62 4c 6f 63 6b 20 29 7b 0a 20 20 20  pVtabLock ){.   
8bc0: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70 56 74   pToplevel->apVt
8bd0: 61 62 4c 6f 63 6b 20 3d 20 61 70 56 74 61 62 4c  abLock = apVtabL
8be0: 6f 63 6b 3b 0a 20 20 20 20 70 54 6f 70 6c 65 76  ock;.    pToplev
8bf0: 65 6c 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 70  el->apVtabLock[p
8c00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 56 74 61 62 4c  Toplevel->nVtabL
8c10: 6f 63 6b 2b 2b 5d 20 3d 20 70 54 61 62 3b 0a 20  ock++] = pTab;. 
8c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8c30: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70  te3OomFault(pTop
8c40: 6c 65 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a  level->db);.  }.
8c50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
8c60: 6f 20 73 65 65 20 69 66 20 76 69 72 74 75 61 6c  o see if virtual
8c70: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 70 4d   table module pM
8c80: 6f 64 20 63 61 6e 20 62 65 20 68 61 76 65 20 61  od can be have a
8c90: 6e 20 65 70 6f 6e 79 6d 6f 75 73 0a 2a 2a 20 76  n eponymous.** v
8ca0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 73  irtual table ins
8cb0: 74 61 6e 63 65 2e 20 20 49 66 20 69 74 20 63 61  tance.  If it ca
8cc0: 6e 2c 20 63 72 65 61 74 65 20 6f 6e 65 20 69 66  n, create one if
8cd0: 20 6f 6e 65 20 64 6f 65 73 20 6e 6f 74 20 61 6c   one does not al
8ce0: 72 65 61 64 79 0a 2a 2a 20 65 78 69 73 74 2e 20  ready.** exist. 
8cf0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
8d00: 69 66 20 74 68 65 20 65 70 6f 6e 79 6d 6f 75 73  if the eponymous
8d10: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
8d20: 6e 73 74 61 6e 63 65 20 65 78 69 73 74 73 0a 2a  nstance exists.*
8d30: 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
8d40: 69 6e 65 20 72 65 74 75 72 6e 73 2c 20 61 6e 64  ine returns, and
8d50: 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   return zero if 
8d60: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
8d70: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 70 6f 6e  t..**.** An epon
8d80: 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
8d90: 62 6c 65 20 69 6e 73 74 61 6e 63 65 20 69 73 20  ble instance is 
8da0: 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 61 6d 65  one that is name
8db0: 64 20 61 66 74 65 72 20 69 74 73 0a 2a 2a 20 6d  d after its.** m
8dc0: 6f 64 75 6c 65 2c 20 61 6e 64 20 6d 6f 72 65 20  odule, and more 
8dd0: 69 6d 70 6f 72 74 61 6e 74 6c 79 2c 20 64 6f 65  importantly, doe
8de0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20  s not require a 
8df0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
8e00: 41 42 4c 45 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ABLE.** statemen
8e10: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  t in order to co
8e20: 6d 65 20 69 6e 74 6f 20 65 78 69 73 74 61 6e 63  me into existanc
8e30: 65 2e 20 20 45 70 6f 6e 79 6d 6f 75 73 20 76 69  e.  Eponymous vi
8e40: 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2a 20 69  rtual table.** i
8e50: 6e 73 74 61 6e 63 65 73 20 61 6c 77 61 79 73 20  nstances always 
8e60: 65 78 69 73 74 2e 20 20 54 68 65 79 20 63 61 6e  exist.  They can
8e70: 6e 6f 74 20 62 65 20 44 52 4f 50 2d 65 64 2e 0a  not be DROP-ed..
8e80: 2a 2a 0a 2a 2a 20 41 6e 79 20 76 69 72 74 75 61  **.** Any virtua
8e90: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 66  l table module f
8ea0: 6f 72 20 77 68 69 63 68 20 78 43 6f 6e 6e 65 63  or which xConnec
8eb0: 74 20 61 6e 64 20 78 43 72 65 61 74 65 20 61 72  t and xCreate ar
8ec0: 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6d 65  e the same.** me
8ed0: 74 68 6f 64 20 63 61 6e 20 68 61 76 65 20 61 6e  thod can have an
8ee0: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
8ef0: 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 61 6e 63  al table instanc
8f00: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
8f10: 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61  3VtabEponymousTa
8f20: 62 6c 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70  bleInit(Parse *p
8f30: 50 61 72 73 65 2c 20 4d 6f 64 75 6c 65 20 2a 70  Parse, Module *p
8f40: 4d 6f 64 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71  Mod){.  const sq
8f50: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
8f60: 6f 64 75 6c 65 20 3d 20 70 4d 6f 64 2d 3e 70 4d  odule = pMod->pM
8f70: 6f 64 75 6c 65 3b 0a 20 20 54 61 62 6c 65 20 2a  odule;.  Table *
8f80: 70 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 45  pTab;.  char *zE
8f90: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  rr = 0;.  int rc
8fa0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8fb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8fc0: 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  if( pMod->pEpoTa
8fd0: 62 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  b ) return 1;.  
8fe0: 69 66 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 72  if( pModule->xCr
8ff0: 65 61 74 65 21 3d 30 20 26 26 20 70 4d 6f 64 75  eate!=0 && pModu
9000: 6c 65 2d 3e 78 43 72 65 61 74 65 21 3d 70 4d 6f  le->xCreate!=pMo
9010: 64 75 6c 65 2d 3e 78 43 6f 6e 6e 65 63 74 20 29  dule->xConnect )
9020: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61   return 0;.  pTa
9030: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
9040: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
9050: 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66  of(Table));.  if
9060: 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
9070: 72 6e 20 30 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e  rn 0;.  pTab->zN
9080: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
9090: 74 72 44 75 70 28 64 62 2c 20 70 4d 6f 64 2d 3e  trDup(db, pMod->
90a0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  zName);.  if( pT
90b0: 61 62 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  ab->zName==0 ){.
90c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
90d0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
90e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
90f0: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 3d   pMod->pEpoTab =
9100: 20 70 54 61 62 3b 0a 20 20 70 54 61 62 2d 3e 6e   pTab;.  pTab->n
9110: 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  TabRef = 1;.  pT
9120: 61 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ab->pSchema = db
9130: 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61  ->aDb[0].pSchema
9140: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
9150: 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 3d 3d 30 20  ->nModuleArg==0 
9160: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
9170: 20 3d 20 2d 31 3b 0a 20 20 61 64 64 4d 6f 64 75   = -1;.  addModu
9180: 6c 65 41 72 67 75 6d 65 6e 74 28 64 62 2c 20 70  leArgument(db, p
9190: 54 61 62 2c 20 73 71 6c 69 74 65 33 44 62 53 74  Tab, sqlite3DbSt
91a0: 72 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 7a  rDup(db, pTab->z
91b0: 4e 61 6d 65 29 29 3b 0a 20 20 61 64 64 4d 6f 64  Name));.  addMod
91c0: 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62 2c 20  uleArgument(db, 
91d0: 70 54 61 62 2c 20 30 29 3b 0a 20 20 61 64 64 4d  pTab, 0);.  addM
91e0: 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62  oduleArgument(db
91f0: 2c 20 70 54 61 62 2c 20 73 71 6c 69 74 65 33 44  , pTab, sqlite3D
9200: 62 53 74 72 44 75 70 28 64 62 2c 20 70 54 61 62  bStrDup(db, pTab
9210: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 72 63 20  ->zName));.  rc 
9220: 3d 20 76 74 61 62 43 61 6c 6c 43 6f 6e 73 74 72  = vtabCallConstr
9230: 75 63 74 6f 72 28 64 62 2c 20 70 54 61 62 2c 20  uctor(db, pTab, 
9240: 70 4d 6f 64 2c 20 70 4d 6f 64 75 6c 65 2d 3e 78  pMod, pModule->x
9250: 43 6f 6e 6e 65 63 74 2c 20 26 7a 45 72 72 29 3b  Connect, &zErr);
9260: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
9270: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9280: 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 7a  (pParse, "%s", z
9290: 45 72 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Err);.    sqlite
92a0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
92b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  );.    sqlite3Vt
92c0: 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65  abEponymousTable
92d0: 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b  Clear(db, pMod);
92e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
92f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
9300: 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68  ../*.** Erase th
9310: 65 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74  e eponymous virt
9320: 75 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 61 6e  ual table instan
9330: 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ce associated wi
9340: 74 68 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  th.** virtual ta
9350: 62 6c 65 20 6d 6f 64 75 6c 65 20 70 4d 6f 64 2c  ble module pMod,
9360: 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a   if it exists..*
9370: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
9380: 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65  abEponymousTable
9390: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
93a0: 62 2c 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 29  b, Module *pMod)
93b0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
93c0: 3d 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b  = pMod->pEpoTab;
93d0: 0a 20 20 69 66 28 20 70 54 61 62 21 3d 30 20 29  .  if( pTab!=0 )
93e0: 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68  {.    /* Mark th
93f0: 65 20 74 61 62 6c 65 20 61 73 20 45 70 68 65 6d  e table as Ephem
9400: 65 72 61 6c 20 70 72 69 6f 72 20 74 6f 20 64 65  eral prior to de
9410: 6c 65 74 69 6e 67 20 69 74 2c 20 73 6f 20 74 68  leting it, so th
9420: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71  at the.    ** sq
9430: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
9440: 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
9450: 6b 6e 6f 77 20 74 68 61 74 20 69 74 20 69 73 20  know that it is 
9460: 6e 6f 74 20 73 74 6f 72 65 64 20 69 6e 20 0a 20  not stored in . 
9470: 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61     ** the schema
9480: 2e 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 74  . */.    pTab->t
9490: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
94a0: 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 73 71 6c  hemeral;.    sql
94b0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
94c0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 70  db, pTab);.    p
94d0: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 3d 20 30  Mod->pEpoTab = 0
94e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
94f0: 65 74 75 72 6e 20 74 68 65 20 4f 4e 20 43 4f 4e  eturn the ON CON
9500: 46 4c 49 43 54 20 72 65 73 6f 6c 75 74 69 6f 6e  FLICT resolution
9510: 20 6d 6f 64 65 20 69 6e 20 65 66 66 65 63 74 20   mode in effect 
9520: 66 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 0a  for the virtual.
9530: 2a 2a 20 74 61 62 6c 65 20 75 70 64 61 74 65 20  ** table update 
9540: 6f 70 65 72 61 74 69 6f 6e 20 63 75 72 72 65 6e  operation curren
9550: 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
9560: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
9570: 74 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ts of this routi
9580: 6e 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ne are undefined
9590: 20 75 6e 6c 65 73 73 20 69 74 20 69 73 20 63 61   unless it is ca
95a0: 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77 69 74  lled from.** wit
95b0: 68 69 6e 20 61 6e 20 78 55 70 64 61 74 65 20 6d  hin an xUpdate m
95c0: 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ethod..*/.int sq
95d0: 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f  lite3_vtab_on_co
95e0: 6e 66 6c 69 63 74 28 73 71 6c 69 74 65 33 20 2a  nflict(sqlite3 *
95f0: 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
9600: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
9610: 72 20 61 4d 61 70 5b 5d 20 3d 20 7b 20 0a 20 20  r aMap[] = { .  
9620: 20 20 53 51 4c 49 54 45 5f 52 4f 4c 4c 42 41 43    SQLITE_ROLLBAC
9630: 4b 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2c  K, SQLITE_ABORT,
9640: 20 53 51 4c 49 54 45 5f 46 41 49 4c 2c 20 53 51   SQLITE_FAIL, SQ
9650: 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 53 51 4c  LITE_IGNORE, SQL
9660: 49 54 45 5f 52 45 50 4c 41 43 45 20 0a 20 20 7d  ITE_REPLACE .  }
9670: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9680: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
9690: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
96a0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
96b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
96c0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
96d0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 4f  ndif.  assert( O
96e0: 45 5f 52 6f 6c 6c 62 61 63 6b 3d 3d 31 20 26 26  E_Rollback==1 &&
96f0: 20 4f 45 5f 41 62 6f 72 74 3d 3d 32 20 26 26 20   OE_Abort==2 && 
9700: 4f 45 5f 46 61 69 6c 3d 3d 33 20 29 3b 0a 20 20  OE_Fail==3 );.  
9710: 61 73 73 65 72 74 28 20 4f 45 5f 49 67 6e 6f 72  assert( OE_Ignor
9720: 65 3d 3d 34 20 26 26 20 4f 45 5f 52 65 70 6c 61  e==4 && OE_Repla
9730: 63 65 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72  ce==5 );.  asser
9740: 74 28 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e  t( db->vtabOnCon
9750: 66 6c 69 63 74 3e 3d 31 20 26 26 20 64 62 2d 3e  flict>=1 && db->
9760: 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 3c 3d  vtabOnConflict<=
9770: 35 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69  5 );.  return (i
9780: 6e 74 29 61 4d 61 70 5b 64 62 2d 3e 76 74 61 62  nt)aMap[db->vtab
9790: 4f 6e 43 6f 6e 66 6c 69 63 74 2d 31 5d 3b 0a 7d  OnConflict-1];.}
97a0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 66 72 6f  ../*.** Call fro
97b0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78 43 72  m within the xCr
97c0: 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e 6e 65  eate() or xConne
97d0: 63 74 28 29 20 6d 65 74 68 6f 64 73 20 74 6f 20  ct() methods to 
97e0: 70 72 6f 76 69 64 65 20 0a 2a 2a 20 74 68 65 20  provide .** the 
97f0: 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69 74 68  SQLite core with
9800: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
9810: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
9820: 65 20 62 65 68 61 76 69 6f 72 0a 2a 2a 20 6f 66  e behavior.** of
9830: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
9840: 6c 65 20 62 65 69 6e 67 20 69 6d 70 6c 65 6d 65  le being impleme
9850: 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
9860: 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69 67  ite3_vtab_config
9870: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
9880: 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  t op, ...){.  va
9890: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
98a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
98b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
98c0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
98d0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
98e0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
98f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
9900: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
9910: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
9920: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
9930: 74 65 78 29 3b 0a 20 20 76 61 5f 73 74 61 72 74  tex);.  va_start
9940: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
9950: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
9960: 73 65 20 53 51 4c 49 54 45 5f 56 54 41 42 5f 43  se SQLITE_VTAB_C
9970: 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50 50 4f 52  ONSTRAINT_SUPPOR
9980: 54 3a 20 7b 0a 20 20 20 20 20 20 56 74 61 62 43  T: {.      VtabC
9990: 74 78 20 2a 70 20 3d 20 64 62 2d 3e 70 56 74 61  tx *p = db->pVta
99a0: 62 43 74 78 3b 0a 20 20 20 20 20 20 69 66 28 20  bCtx;.      if( 
99b0: 21 70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  !p ){.        rc
99c0: 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45   = SQLITE_MISUSE
99d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
99e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
99f0: 72 74 28 20 70 2d 3e 70 54 61 62 3d 3d 30 20 7c  rt( p->pTab==0 |
9a00: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 2d 3e 70  | IsVirtual(p->p
9a10: 54 61 62 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Tab) );.        
9a20: 70 2d 3e 70 56 54 61 62 6c 65 2d 3e 62 43 6f 6e  p->pVTable->bCon
9a30: 73 74 72 61 69 6e 74 20 3d 20 28 75 38 29 76 61  straint = (u8)va
9a40: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
9a50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9a60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
9a70: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 63 20  fault:.      rc 
9a80: 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  = SQLITE_MISUSE_
9a90: 42 4b 50 54 3b 0a 20 20 20 20 20 20 62 72 65 61  BKPT;.      brea
9aa0: 6b 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  k;.  }.  va_end(
9ab0: 61 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  ap);..  if( rc!=
9ac0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73 71 6c 69  SQLITE_OK ) sqli
9ad0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
9ae0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9af0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9b00: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
9b10: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
9b20: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9b30: 4c 54 41 42 4c 45 20 2a 2f 0a                    LTABLE */.