/ Hex Artifact Content
Login

Artifact 2ecfe020c10e0a0c7b078203fdba2fae844744bc:


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 54 68 65 20 61 63 74 75 61 6c 20 66 75 6e  * The actual fun
0490: 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20  ction that does 
04a0: 74 68 65 20 77 6f 72 6b 20 6f 66 20 63 72 65 61  the work of crea
04b0: 74 69 6e 67 20 61 20 6e 65 77 20 6d 6f 64 75 6c  ting a new modul
04c0: 65 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  e..** This funct
04d0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ion implements t
04e0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
04f0: 65 5f 6d 6f 64 75 6c 65 28 29 20 61 6e 64 0a 2a  e_module() and.*
0500: 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
0510: 5f 6d 6f 64 75 6c 65 5f 76 32 28 29 20 69 6e 74  _module_v2() int
0520: 65 72 66 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  erfaces..*/.stat
0530: 69 63 20 69 6e 74 20 63 72 65 61 74 65 4d 6f 64  ic int createMod
0540: 75 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ule(.  sqlite3 *
0550: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
0560: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
0570: 73 65 20 69 6e 20 77 68 69 63 68 20 6d 6f 64 75  se in which modu
0580: 6c 65 20 69 73 20 72 65 67 69 73 74 65 72 65 64  le is registered
0590: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
05a0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
05b0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61 73        /* Name as
05c0: 73 69 67 6e 65 64 20 74 6f 20 74 68 69 73 20 6d  signed to this m
05d0: 6f 64 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  odule */.  const
05e0: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
05f0: 2a 70 4d 6f 64 75 6c 65 2c 20 20 2f 2a 20 54 68  *pModule,  /* Th
0600: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
0610: 74 68 65 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20  the module */.  
0620: 76 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20  void *pAux,     
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0640: 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74  /* Context point
0650: 65 72 20 66 6f 72 20 78 43 72 65 61 74 65 2f 78  er for xCreate/x
0660: 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 76 6f 69  Connect */.  voi
0670: 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f  d (*xDestroy)(vo
0680: 69 64 20 2a 29 20 20 20 20 20 20 20 20 2f 2a 20  id *)        /* 
0690: 4d 6f 64 75 6c 65 20 64 65 73 74 72 75 63 74 6f  Module destructo
06a0: 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  r function */.){
06b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
06c0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4e 61  TE_OK;.  int nNa
06d0: 6d 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d  me;..  sqlite3_m
06e0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
06f0: 75 74 65 78 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d  utex);.  nName =
0700: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
0710: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  (zName);.  if( s
0720: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
0730: 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61  db->aModule, zNa
0740: 6d 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me) ){.    rc = 
0750: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
0760: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
0770: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 0a 20   Module *pMod;. 
0780: 20 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c     pMod = (Modul
0790: 65 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  e *)sqlite3DbMal
07a0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
07b0: 66 28 4d 6f 64 75 6c 65 29 20 2b 20 6e 4e 61 6d  f(Module) + nNam
07c0: 65 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  e + 1);.    if( 
07d0: 70 4d 6f 64 20 29 7b 0a 20 20 20 20 20 20 4d 6f  pMod ){.      Mo
07e0: 64 75 6c 65 20 2a 70 44 65 6c 3b 0a 20 20 20 20  dule *pDel;.    
07f0: 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20    char *zCopy = 
0800: 28 63 68 61 72 20 2a 29 28 26 70 4d 6f 64 5b 31  (char *)(&pMod[1
0810: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
0820: 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d 65 2c 20 6e  (zCopy, zName, n
0830: 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 20 20 70  Name+1);.      p
0840: 4d 6f 64 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 43 6f  Mod->zName = zCo
0850: 70 79 3b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e  py;.      pMod->
0860: 70 4d 6f 64 75 6c 65 20 3d 20 70 4d 6f 64 75 6c  pModule = pModul
0870: 65 3b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 70  e;.      pMod->p
0880: 41 75 78 20 3d 20 70 41 75 78 3b 0a 20 20 20 20  Aux = pAux;.    
0890: 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79    pMod->xDestroy
08a0: 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20   = xDestroy;.   
08b0: 20 20 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62     pMod->pEpoTab
08c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 65 6c   = 0;.      pDel
08d0: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
08e0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
08f0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 7a 43 6f 70  db->aModule,zCop
0900: 79 2c 28 76 6f 69 64 2a 29 70 4d 6f 64 29 3b 0a  y,(void*)pMod);.
0910: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
0920: 65 6c 3d 3d 30 20 7c 7c 20 70 44 65 6c 3d 3d 70  el==0 || pDel==p
0930: 4d 6f 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Mod );.      if(
0940: 20 70 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pDel ){.       
0950: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0960: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  d = 1;.        s
0970: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
0980: 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pDel);.      }.
0990: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
09a0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
09b0: 64 62 2c 20 72 63 29 3b 0a 20 20 69 66 28 20 72  db, rc);.  if( r
09c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
09d0: 78 44 65 73 74 72 6f 79 20 29 20 78 44 65 73 74  xDestroy ) xDest
09e0: 72 6f 79 28 70 41 75 78 29 3b 0a 0a 20 20 73 71  roy(pAux);..  sq
09f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
0a00: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
0a10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
0a20: 2a 0a 2a 2a 20 45 78 74 65 72 6e 61 6c 20 41 50  *.** External AP
0a30: 49 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20  I function used 
0a40: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
0a50: 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 6d 6f  virtual-table mo
0a60: 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dule..*/.int sql
0a70: 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
0a80: 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le(.  sqlite3 *d
0a90: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
0aa0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
0ab0: 65 20 69 6e 20 77 68 69 63 68 20 6d 6f 64 75 6c  e in which modul
0ac0: 65 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  e is registered 
0ad0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0ae0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
0af0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61 73 73       /* Name ass
0b00: 69 67 6e 65 64 20 74 6f 20 74 68 69 73 20 6d 6f  igned to this mo
0b10: 64 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dule */.  const 
0b20: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
0b30: 70 4d 6f 64 75 6c 65 2c 20 20 2f 2a 20 54 68 65  pModule,  /* The
0b40: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74   definition of t
0b50: 68 65 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 76  he module */.  v
0b60: 6f 69 64 20 2a 70 41 75 78 20 20 20 20 20 20 20  oid *pAux       
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0b80: 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65  * Context pointe
0b90: 72 20 66 6f 72 20 78 43 72 65 61 74 65 2f 78 43  r for xCreate/xC
0ba0: 6f 6e 6e 65 63 74 20 2a 2f 0a 29 7b 0a 23 69 66  onnect */.){.#if
0bb0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0bc0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
0bd0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
0be0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
0bf0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
0c00: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
0c10: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  KPT;.#endif.  re
0c20: 74 75 72 6e 20 63 72 65 61 74 65 4d 6f 64 75 6c  turn createModul
0c30: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 4d 6f  e(db, zName, pMo
0c40: 64 75 6c 65 2c 20 70 41 75 78 2c 20 30 29 3b 0a  dule, pAux, 0);.
0c50: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 72 6e 61  }../*.** Externa
0c60: 6c 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 75  l API function u
0c70: 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  sed to create a 
0c80: 6e 65 77 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  new virtual-tabl
0c90: 65 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74  e module..*/.int
0ca0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
0cb0: 6d 6f 64 75 6c 65 5f 76 32 28 0a 20 20 73 71 6c  module_v2(.  sql
0cc0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0ce0: 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63  Database in whic
0cf0: 68 20 6d 6f 64 75 6c 65 20 69 73 20 72 65 67 69  h module is regi
0d00: 73 74 65 72 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  stered */.  cons
0d10: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0d30: 61 6d 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ame assigned to 
0d40: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20  this module */. 
0d50: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
0d60: 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 2c 20  odule *pModule, 
0d70: 20 2f 2a 20 54 68 65 20 64 65 66 69 6e 69 74 69   /* The definiti
0d80: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65  on of the module
0d90: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78   */.  void *pAux
0da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0db0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
0dc0: 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 72   pointer for xCr
0dd0: 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 2a 2f  eate/xConnect */
0de0: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
0df0: 6f 79 29 28 76 6f 69 64 20 2a 29 20 20 20 20 20  oy)(void *)     
0e00: 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 64 65 73     /* Module des
0e10: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
0e20: 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51   */.){.#ifdef SQ
0e30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
0e40: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
0e50: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
0e60: 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
0e70: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
0e80: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
0e90: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 63  endif.  return c
0ea0: 72 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20  reateModule(db, 
0eb0: 7a 4e 61 6d 65 2c 20 70 4d 6f 64 75 6c 65 2c 20  zName, pModule, 
0ec0: 70 41 75 78 2c 20 78 44 65 73 74 72 6f 79 29 3b  pAux, xDestroy);
0ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
0ee0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
0ef0: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e   so that it cann
0f00: 6f 74 20 62 65 20 64 69 73 63 6f 6e 6e 65 63 74  ot be disconnect
0f10: 65 64 2e 0a 2a 2a 20 4c 6f 63 6b 73 20 6e 65 73  ed..** Locks nes
0f20: 74 2e 20 20 45 76 65 72 79 20 6c 6f 63 6b 20 73  t.  Every lock s
0f30: 68 6f 75 6c 64 20 68 61 76 65 20 61 20 63 6f 72  hould have a cor
0f40: 72 65 73 70 6f 6e 64 69 6e 67 20 75 6e 6c 6f 63  responding unloc
0f50: 6b 2e 0a 2a 2a 20 49 66 20 61 6e 20 75 6e 6c 6f  k..** If an unlo
0f60: 63 6b 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 72  ck is omitted, r
0f70: 65 73 6f 75 72 63 65 73 20 6c 65 61 6b 73 20 77  esources leaks w
0f80: 69 6c 6c 20 6f 63 63 75 72 2e 20 20 0a 2a 2a 0a  ill occur.  .**.
0f90: 2a 2a 20 49 66 20 61 20 64 69 73 63 6f 6e 6e 65  ** If a disconne
0fa0: 63 74 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ct is attempted 
0fb0: 77 68 69 6c 65 20 61 20 76 69 72 74 75 61 6c 20  while a virtual 
0fc0: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2c  table is locked,
0fd0: 0a 2a 2a 20 74 68 65 20 64 69 73 63 6f 6e 6e 65  .** the disconne
0fe0: 63 74 20 69 73 20 64 65 66 65 72 72 65 64 20 75  ct is deferred u
0ff0: 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 68  ntil all locks h
1000: 61 76 65 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ave been removed
1010: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1020: 33 56 74 61 62 4c 6f 63 6b 28 56 54 61 62 6c 65  3VtabLock(VTable
1030: 20 2a 70 56 54 61 62 29 7b 0a 20 20 70 56 54 61   *pVTab){.  pVTa
1040: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 0a 2f  b->nRef++;.}.../
1050: 2a 0a 2a 2a 20 70 54 61 62 20 69 73 20 61 20 70  *.** pTab is a p
1060: 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
1070: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 70 72  e structure repr
1080: 65 73 65 6e 74 69 6e 67 20 61 20 76 69 72 74 75  esenting a virtu
1090: 61 6c 2d 74 61 62 6c 65 2e 0a 2a 2a 20 52 65 74  al-table..** Ret
10a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
10b0: 20 74 68 65 20 56 54 61 62 6c 65 20 6f 62 6a 65   the VTable obje
10c0: 63 74 20 75 73 65 64 20 62 79 20 63 6f 6e 6e 65  ct used by conne
10d0: 63 74 69 6f 6e 20 64 62 20 74 6f 20 61 63 63 65  ction db to acce
10e0: 73 73 20 0a 2a 2a 20 74 68 69 73 20 76 69 72 74  ss .** this virt
10f0: 75 61 6c 2d 74 61 62 6c 65 2c 20 69 66 20 6f 6e  ual-table, if on
1100: 65 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  e has been creat
1110: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 6f 74 68 65  ed, or NULL othe
1120: 72 77 69 73 65 2e 0a 2a 2f 0a 56 54 61 62 6c 65  rwise..*/.VTable
1130: 20 2a 73 71 6c 69 74 65 33 47 65 74 56 54 61 62   *sqlite3GetVTab
1140: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
1150: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
1160: 56 54 61 62 6c 65 20 2a 70 56 74 61 62 3b 0a 20  VTable *pVtab;. 
1170: 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
1180: 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 66 6f  al(pTab) );.  fo
1190: 72 28 70 56 74 61 62 3d 70 54 61 62 2d 3e 70 56  r(pVtab=pTab->pV
11a0: 54 61 62 6c 65 3b 20 70 56 74 61 62 20 26 26 20  Table; pVtab && 
11b0: 70 56 74 61 62 2d 3e 64 62 21 3d 64 62 3b 20 70  pVtab->db!=db; p
11c0: 56 74 61 62 3d 70 56 74 61 62 2d 3e 70 4e 65 78  Vtab=pVtab->pNex
11d0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 56 74  t);.  return pVt
11e0: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ab;.}../*.** Dec
11f0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 2d 63  rement the ref-c
1200: 6f 75 6e 74 20 6f 6e 20 61 20 76 69 72 74 75 61  ount on a virtua
1210: 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2e 20  l table object. 
1220: 57 68 65 6e 20 74 68 65 20 72 65 66 2d 63 6f 75  When the ref-cou
1230: 6e 74 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65  nt.** reaches ze
1240: 72 6f 2c 20 63 61 6c 6c 20 74 68 65 20 78 44 69  ro, call the xDi
1250: 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  sconnect() metho
1260: 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
1270: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  object..*/.void 
1280: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
1290: 6b 28 56 54 61 62 6c 65 20 2a 70 56 54 61 62 29  k(VTable *pVTab)
12a0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
12b0: 3d 20 70 56 54 61 62 2d 3e 64 62 3b 0a 0a 20 20  = pVTab->db;..  
12c0: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20  assert( db );.  
12d0: 61 73 73 65 72 74 28 20 70 56 54 61 62 2d 3e 6e  assert( pVTab->n
12e0: 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
12f0: 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51  t( db->magic==SQ
1300: 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 20  LITE_MAGIC_OPEN 
1310: 7c 7c 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51  || db->magic==SQ
1320: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
1330: 45 20 29 3b 0a 0a 20 20 70 56 54 61 62 2d 3e 6e  E );..  pVTab->n
1340: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 56 54  Ref--;.  if( pVT
1350: 61 62 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  ab->nRef==0 ){. 
1360: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
1370: 2a 70 20 3d 20 70 56 54 61 62 2d 3e 70 56 74 61  *p = pVTab->pVta
1380: 62 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  b;.    if( p ){.
1390: 20 20 20 20 20 20 70 2d 3e 70 4d 6f 64 75 6c 65        p->pModule
13a0: 2d 3e 78 44 69 73 63 6f 6e 6e 65 63 74 28 70 29  ->xDisconnect(p)
13b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
13c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56  te3DbFree(db, pV
13d0: 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Tab);.  }.}../*.
13e0: 2a 2a 20 54 61 62 6c 65 20 70 20 69 73 20 61 20  ** Table p is a 
13f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
1400: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 76  his function mov
1410: 65 73 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  es all elements 
1420: 69 6e 20 74 68 65 0a 2a 2a 20 70 2d 3e 70 56 54  in the.** p->pVT
1430: 61 62 6c 65 20 6c 69 73 74 20 74 6f 20 74 68 65  able list to the
1440: 20 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e   sqlite3.pDiscon
1450: 6e 65 63 74 20 6c 69 73 74 73 20 6f 66 20 74 68  nect lists of th
1460: 65 69 72 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  eir associated.*
1470: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
1480: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ctions to be dis
1490: 63 6f 6e 6e 65 63 74 65 64 20 61 74 20 74 68 65  connected at the
14a0: 20 6e 65 78 74 20 6f 70 70 6f 72 74 75 6e 69 74   next opportunit
14b0: 79 2e 20 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  y. .** Except, i
14c0: 66 20 61 72 67 75 6d 65 6e 74 20 64 62 20 69 73  f argument db is
14d0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
14e0: 74 68 65 20 65 6e 74 72 79 20 61 73 73 6f 63 69  the entry associ
14f0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 63 6f 6e  ated with.** con
1500: 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 6c 65  nection db is le
1510: 66 74 20 69 6e 20 74 68 65 20 70 2d 3e 70 56 54  ft in the p->pVT
1520: 61 62 6c 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  able list..*/.st
1530: 61 74 69 63 20 56 54 61 62 6c 65 20 2a 76 74 61  atic VTable *vta
1540: 62 44 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 28 73  bDisconnectAll(s
1550: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
1560: 65 20 2a 70 29 7b 0a 20 20 56 54 61 62 6c 65 20  e *p){.  VTable 
1570: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 56 54 61  *pRet = 0;.  VTa
1580: 62 6c 65 20 2a 70 56 54 61 62 6c 65 20 3d 20 70  ble *pVTable = p
1590: 2d 3e 70 56 54 61 62 6c 65 3b 0a 20 20 70 2d 3e  ->pVTable;.  p->
15a0: 70 56 54 61 62 6c 65 20 3d 20 30 3b 0a 0a 20 20  pVTable = 0;..  
15b0: 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
15c0: 68 65 20 6d 75 74 65 78 20 28 69 66 20 61 6e 79  he mutex (if any
15d0: 29 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  ) associated wit
15e0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 20 64  h the BtShared d
15f0: 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 74 68  atabase .  ** th
1600: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 61 62 6c  at contains tabl
1610: 65 20 70 20 69 73 20 68 65 6c 64 20 62 79 20 74  e p is held by t
1620: 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 68  he caller. See h
1630: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 73 20 0a  eader comments .
1640: 20 20 2a 2a 20 61 62 6f 76 65 20 66 75 6e 63 74    ** above funct
1650: 69 6f 6e 20 73 71 6c 69 74 65 33 56 74 61 62 55  ion sqlite3VtabU
1660: 6e 6c 6f 63 6b 4c 69 73 74 28 29 20 66 6f 72 20  nlockList() for 
1670: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
1680: 66 20 77 68 79 0a 20 20 2a 2a 20 74 68 69 73 20  f why.  ** this 
1690: 6d 61 6b 65 73 20 69 74 20 73 61 66 65 20 74 6f  makes it safe to
16a0: 20 61 63 63 65 73 73 20 74 68 65 20 73 71 6c 69   access the sqli
16b0: 74 65 33 2e 70 44 69 73 63 6f 6e 6e 65 63 74 20  te3.pDisconnect 
16c0: 6c 69 73 74 20 6f 66 20 61 6e 79 0a 20 20 2a 2a  list of any.  **
16d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16e0: 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61  tion that may ha
16f0: 76 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ve an entry in t
1700: 68 65 20 70 2d 3e 70 56 54 61 62 6c 65 20 6c 69  he p->pVTable li
1710: 73 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  st..  */.  asser
1720: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
1730: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1740: 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63  ld(db, 0, p->pSc
1750: 68 65 6d 61 29 20 29 3b 0a 0a 20 20 77 68 69 6c  hema) );..  whil
1760: 65 28 20 70 56 54 61 62 6c 65 20 29 7b 0a 20 20  e( pVTable ){.  
1770: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 32 20 3d    sqlite3 *db2 =
1780: 20 70 56 54 61 62 6c 65 2d 3e 64 62 3b 0a 20 20   pVTable->db;.  
1790: 20 20 56 54 61 62 6c 65 20 2a 70 4e 65 78 74 20    VTable *pNext 
17a0: 3d 20 70 56 54 61 62 6c 65 2d 3e 70 4e 65 78 74  = pVTable->pNext
17b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
17c0: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62 32  2 );.    if( db2
17d0: 3d 3d 64 62 20 29 7b 0a 20 20 20 20 20 20 70 52  ==db ){.      pR
17e0: 65 74 20 3d 20 70 56 54 61 62 6c 65 3b 0a 20 20  et = pVTable;.  
17f0: 20 20 20 20 70 2d 3e 70 56 54 61 62 6c 65 20 3d      p->pVTable =
1800: 20 70 52 65 74 3b 0a 20 20 20 20 20 20 70 52 65   pRet;.      pRe
1810: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
1820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1830: 56 54 61 62 6c 65 2d 3e 70 4e 65 78 74 20 3d 20  VTable->pNext = 
1840: 64 62 32 2d 3e 70 44 69 73 63 6f 6e 6e 65 63 74  db2->pDisconnect
1850: 3b 0a 20 20 20 20 20 20 64 62 32 2d 3e 70 44 69  ;.      db2->pDi
1860: 73 63 6f 6e 6e 65 63 74 20 3d 20 70 56 54 61 62  sconnect = pVTab
1870: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 56  le;.    }.    pV
1880: 54 61 62 6c 65 20 3d 20 70 4e 65 78 74 3b 0a 20  Table = pNext;. 
1890: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64   }..  assert( !d
18a0: 62 20 7c 7c 20 70 52 65 74 20 29 3b 0a 20 20 72  b || pRet );.  r
18b0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
18c0: 2a 0a 2a 2a 20 54 61 62 6c 65 20 2a 70 20 69 73  *.** Table *p is
18d0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
18e0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
18f0: 72 65 6d 6f 76 65 73 20 74 68 65 20 56 54 61 62  removes the VTab
1900: 6c 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 66 6f 72  le object.** for
1910: 20 74 61 62 6c 65 20 2a 70 20 61 73 73 6f 63 69   table *p associ
1920: 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61  ated with databa
1930: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
1940: 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64   from the linked
1950: 0a 2a 2a 20 6c 69 73 74 20 69 6e 20 70 2d 3e 70  .** list in p->p
1960: 56 54 61 62 2e 20 49 74 20 61 6c 73 6f 20 64 65  VTab. It also de
1970: 63 72 65 6d 65 6e 74 73 20 74 68 65 20 56 54 61  crements the VTa
1980: 62 6c 65 20 72 65 66 20 63 6f 75 6e 74 2e 20 54  ble ref count. T
1990: 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 77  his is.** used w
19a0: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 64 61 74 61  hen closing data
19b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
19c0: 64 62 20 74 6f 20 66 72 65 65 20 61 6c 6c 20 6f  db to free all o
19d0: 66 20 69 74 73 20 56 54 61 62 6c 65 0a 2a 2a 20  f its VTable.** 
19e0: 6f 62 6a 65 63 74 73 20 77 69 74 68 6f 75 74 20  objects without 
19f0: 64 69 73 74 75 72 62 69 6e 67 20 74 68 65 20 72  disturbing the r
1a00: 65 73 74 20 6f 66 20 74 68 65 20 53 63 68 65 6d  est of the Schem
1a10: 61 20 6f 62 6a 65 63 74 20 28 77 68 69 63 68 20  a object (which 
1a20: 6d 61 79 0a 2a 2a 20 62 65 20 62 65 69 6e 67 20  may.** be being 
1a30: 75 73 65 64 20 62 79 20 6f 74 68 65 72 20 73 68  used by other sh
1a40: 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65  ared-cache conne
1a50: 63 74 69 6f 6e 73 29 2e 0a 2a 2f 0a 76 6f 69 64  ctions)..*/.void
1a60: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
1a70: 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 20 2a  onnect(sqlite3 *
1a80: 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20  db, Table *p){. 
1a90: 20 56 54 61 62 6c 65 20 2a 2a 70 70 56 54 61 62   VTable **ppVTab
1aa0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  ;..  assert( IsV
1ab0: 69 72 74 75 61 6c 28 70 29 20 29 3b 0a 20 20 61  irtual(p) );.  a
1ac0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1ad0: 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
1ae0: 65 73 28 64 62 29 20 29 3b 0a 20 20 61 73 73 65  es(db) );.  asse
1af0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1b00: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
1b10: 29 20 29 3b 0a 0a 20 20 66 6f 72 28 70 70 56 54  ) );..  for(ppVT
1b20: 61 62 3d 26 70 2d 3e 70 56 54 61 62 6c 65 3b 20  ab=&p->pVTable; 
1b30: 2a 70 70 56 54 61 62 3b 20 70 70 56 54 61 62 3d  *ppVTab; ppVTab=
1b40: 26 28 2a 70 70 56 54 61 62 29 2d 3e 70 4e 65 78  &(*ppVTab)->pNex
1b50: 74 29 7b 0a 20 20 20 20 69 66 28 20 28 2a 70 70  t){.    if( (*pp
1b60: 56 54 61 62 29 2d 3e 64 62 3d 3d 64 62 20 20 29  VTab)->db==db  )
1b70: 7b 0a 20 20 20 20 20 20 56 54 61 62 6c 65 20 2a  {.      VTable *
1b80: 70 56 54 61 62 20 3d 20 2a 70 70 56 54 61 62 3b  pVTab = *ppVTab;
1b90: 0a 20 20 20 20 20 20 2a 70 70 56 54 61 62 20 3d  .      *ppVTab =
1ba0: 20 70 56 54 61 62 2d 3e 70 4e 65 78 74 3b 0a 20   pVTab->pNext;. 
1bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
1bc0: 55 6e 6c 6f 63 6b 28 70 56 54 61 62 29 3b 0a 20  Unlock(pVTab);. 
1bd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1be0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
1bf0: 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 74  Disconnect all t
1c00: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1c10: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
1c20: 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e 6e  sqlite3.pDisconn
1c30: 65 63 74 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ect list..**.** 
1c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1c50: 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
1c60: 20 77 68 65 6e 20 74 68 65 20 6d 75 74 65 78 65   when the mutexe
1c70: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1c80: 68 20 61 6c 6c 0a 2a 2a 20 73 68 61 72 65 64 20  h all.** shared 
1c90: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 73  b-tree databases
1ca0: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 6f   opened using co
1cb0: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 61 72 65 20  nnection db are 
1cc0: 68 65 6c 64 20 62 79 20 74 68 65 20 0a 2a 2a 20  held by the .** 
1cd0: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 69 73 20  caller. This is 
1ce0: 64 6f 6e 65 20 74 6f 20 70 72 6f 74 65 63 74 20  done to protect 
1cf0: 74 68 65 20 73 71 6c 69 74 65 33 2e 70 44 69 73  the sqlite3.pDis
1d00: 63 6f 6e 6e 65 63 74 20 6c 69 73 74 2e 20 54 68  connect list. Th
1d10: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 2e 70 44 69  e.** sqlite3.pDi
1d20: 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74 20 69 73  sconnect list is
1d30: 20 61 63 63 65 73 73 65 64 20 6f 6e 6c 79 20 61   accessed only a
1d40: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1d50: 20 20 20 31 29 20 42 79 20 74 68 69 73 20 66 75     1) By this fu
1d60: 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  nction. In this 
1d70: 63 61 73 65 2c 20 61 6c 6c 20 42 74 53 68 61 72  case, all BtShar
1d80: 65 64 20 6d 75 74 65 78 65 73 20 61 6e 64 20 74  ed mutexes and t
1d90: 68 65 20 6d 75 74 65 78 0a 2a 2a 20 20 20 20 20  he mutex.**     
1da0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1db0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1dc0: 6e 64 6c 65 20 69 74 73 65 6c 66 20 6d 75 73 74  ndle itself must
1dd0: 20 62 65 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20   be held..**.** 
1de0: 20 20 32 29 20 42 79 20 66 75 6e 63 74 69 6f 6e    2) By function
1df0: 20 76 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 41   vtabDisconnectA
1e00: 6c 6c 28 29 2c 20 77 68 65 6e 20 69 74 20 61 64  ll(), when it ad
1e10: 64 73 20 61 20 56 54 61 62 6c 65 20 65 6e 74 72  ds a VTable entr
1e20: 79 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74 68 65  y to.**      the
1e30: 20 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e   sqlite3.pDiscon
1e40: 6e 65 63 74 20 6c 69 73 74 2e 20 49 6e 20 74 68  nect list. In th
1e50: 69 73 20 63 61 73 65 20 65 69 74 68 65 72 20 74  is case either t
1e60: 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
1e70: 78 0a 2a 2a 20 20 20 20 20 20 61 73 73 6f 63 69  x.**      associ
1e80: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
1e90: 74 61 62 61 73 65 20 74 68 65 20 76 69 72 74 75  tabase the virtu
1ea0: 61 6c 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72  al table is stor
1eb0: 65 64 20 69 6e 20 69 73 20 68 65 6c 64 0a 2a 2a  ed in is held.**
1ec0: 20 20 20 20 20 20 6f 72 2c 20 69 66 20 74 68 65        or, if the
1ed0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
1ee0: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6e 6f  s stored in a no
1ef0: 6e 2d 73 68 61 72 61 62 6c 65 20 64 61 74 61 62  n-sharable datab
1f00: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20  ase, then.**    
1f10: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68    the database h
1f20: 61 6e 64 6c 65 20 6d 75 74 65 78 20 69 73 20 68  andle mutex is h
1f30: 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 61 20  eld..**.** As a 
1f40: 72 65 73 75 6c 74 2c 20 61 20 73 71 6c 69 74 65  result, a sqlite
1f50: 33 2e 70 44 69 73 63 6f 6e 6e 65 63 74 20 63 61  3.pDisconnect ca
1f60: 6e 6e 6f 74 20 62 65 20 61 63 63 65 73 73 65 64  nnot be accessed
1f70: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1f80: 0a 2a 2a 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  .** by multiple 
1f90: 74 68 72 65 61 64 73 2e 20 49 74 20 69 73 20 74  threads. It is t
1fa0: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 76  hread-safe..*/.v
1fb0: 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 55  oid sqlite3VtabU
1fc0: 6e 6c 6f 63 6b 4c 69 73 74 28 73 71 6c 69 74 65  nlockList(sqlite
1fd0: 33 20 2a 64 62 29 7b 0a 20 20 56 54 61 62 6c 65  3 *db){.  VTable
1fe0: 20 2a 70 20 3d 20 64 62 2d 3e 70 44 69 73 63 6f   *p = db->pDisco
1ff0: 6e 6e 65 63 74 3b 0a 20 20 64 62 2d 3e 70 44 69  nnect;.  db->pDi
2000: 73 63 6f 6e 6e 65 63 74 20 3d 20 30 3b 0a 0a 20  sconnect = 0;.. 
2010: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2020: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
2030: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 61 73  exes(db) );.  as
2040: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2050: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
2060: 65 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 20  ex) );..  if( p 
2070: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2080: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
2090: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
20a0: 64 6f 20 7b 0a 20 20 20 20 20 20 56 54 61 62 6c  do {.      VTabl
20b0: 65 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  e *pNext = p->pN
20c0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
20d0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 70 29 3b  e3VtabUnlock(p);
20e0: 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74  .      p = pNext
20f0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20  ;.    }while( p 
2100: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2110: 43 6c 65 61 72 20 61 6e 79 20 61 6e 64 20 61 6c  Clear any and al
2120: 6c 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  l virtual-table 
2130: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2140: 20 74 68 65 20 54 61 62 6c 65 20 72 65 63 6f 72   the Table recor
2150: 64 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  d..** This routi
2160: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 6f  ne is called, fo
2170: 72 20 65 78 61 6d 70 6c 65 2c 20 6a 75 73 74 20  r example, just 
2180: 62 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67 20  before deleting 
2190: 74 68 65 20 54 61 62 6c 65 0a 2a 2a 20 72 65 63  the Table.** rec
21a0: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  ord..**.** Since
21b0: 20 69 74 20 69 73 20 61 20 76 69 72 74 75 61 6c   it is a virtual
21c0: 2d 74 61 62 6c 65 2c 20 74 68 65 20 54 61 62 6c  -table, the Tabl
21d0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
21e0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
21f0: 2a 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  * to the head of
2200: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
2210: 66 20 56 54 61 62 6c 65 20 73 74 72 75 63 74 75  f VTable structu
2220: 72 65 73 2e 20 45 61 63 68 20 56 54 61 62 6c 65  res. Each VTable
2230: 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69   .** structure i
2240: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2250: 68 20 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74  h a single sqlit
2260: 65 33 2a 20 75 73 65 72 20 6f 66 20 74 68 65 20  e3* user of the 
2270: 73 63 68 65 6d 61 2e 0a 2a 2a 20 54 68 65 20 72  schema..** The r
2280: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
2290: 66 20 74 68 65 20 56 54 61 62 6c 65 20 73 74 72  f the VTable str
22a0: 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
22b0: 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  d with database 
22c0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  .** connection d
22d0: 62 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64  b is decremented
22e0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 28 77 68   immediately (wh
22f0: 69 63 68 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  ich may lead to 
2300: 74 68 65 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  the .** structur
2310: 65 20 62 65 69 6e 67 20 78 44 69 73 63 6f 6e 6e  e being xDisconn
2320: 65 63 74 65 64 20 61 6e 64 20 66 72 65 65 29 2e  ected and free).
2330: 20 41 6e 79 20 6f 74 68 65 72 20 56 54 61 62 6c   Any other VTabl
2340: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
2350: 69 6e 20 74 68 65 20 6c 69 73 74 20 61 72 65 20  in the list are 
2360: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 73 71 6c  moved to the sql
2370: 69 74 65 33 2e 70 44 69 73 63 6f 6e 6e 65 63 74  ite3.pDisconnect
2380: 20 6c 69 73 74 20 6f 66 20 74 68 65 20 61 73 73   list of the ass
2390: 6f 63 69 61 74 65 64 20 0a 2a 2a 20 64 61 74 61  ociated .** data
23a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
23b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23c0: 56 74 61 62 43 6c 65 61 72 28 73 71 6c 69 74 65  VtabClear(sqlite
23d0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29  3 *db, Table *p)
23e0: 7b 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  {.  if( !db || d
23f0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
2400: 3d 30 20 29 20 76 74 61 62 44 69 73 63 6f 6e 6e  =0 ) vtabDisconn
2410: 65 63 74 41 6c 6c 28 30 2c 20 70 29 3b 0a 20 20  ectAll(0, p);.  
2420: 69 66 28 20 70 2d 3e 61 7a 4d 6f 64 75 6c 65 41  if( p->azModuleA
2430: 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  rg ){.    int i;
2440: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2450: 70 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 3b 20 69  p->nModuleArg; i
2460: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
2470: 21 3d 31 20 29 20 73 71 6c 69 74 65 33 44 62 46  !=1 ) sqlite3DbF
2480: 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 4d 6f 64  ree(db, p->azMod
2490: 75 6c 65 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  uleArg[i]);.    
24a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
24b0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 4d 6f 64  ree(db, p->azMod
24c0: 75 6c 65 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  uleArg);.  }.}..
24d0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
24e0: 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 20  module argument 
24f0: 74 6f 20 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64  to pTable->azMod
2500: 75 6c 65 41 72 67 5b 5d 2e 0a 2a 2a 20 54 68 65  uleArg[]..** The
2510: 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 63   string is not c
2520: 6f 70 69 65 64 20 2d 20 74 68 65 20 70 6f 69 6e  opied - the poin
2530: 74 65 72 20 69 73 20 73 74 6f 72 65 64 2e 20 20  ter is stored.  
2540: 54 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 77 69  The.** string wi
2550: 6c 6c 20 62 65 20 66 72 65 65 64 20 61 75 74 6f  ll be freed auto
2560: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2570: 68 65 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 64  he table is.** d
2580: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
2590: 63 20 76 6f 69 64 20 61 64 64 4d 6f 64 75 6c 65  c void addModule
25a0: 41 72 67 75 6d 65 6e 74 28 73 71 6c 69 74 65 33  Argument(sqlite3
25b0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
25c0: 62 6c 65 2c 20 63 68 61 72 20 2a 7a 41 72 67 29  ble, char *zArg)
25d0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d  {.  int nBytes =
25e0: 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a   sizeof(char *)*
25f0: 28 32 2b 70 54 61 62 6c 65 2d 3e 6e 4d 6f 64 75  (2+pTable->nModu
2600: 6c 65 41 72 67 29 3b 0a 20 20 63 68 61 72 20 2a  leArg);.  char *
2610: 2a 61 7a 4d 6f 64 75 6c 65 41 72 67 3b 0a 20 20  *azModuleArg;.  
2620: 61 7a 4d 6f 64 75 6c 65 41 72 67 20 3d 20 73 71  azModuleArg = sq
2630: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
2640: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64  b, pTable->azMod
2650: 75 6c 65 41 72 67 2c 20 6e 42 79 74 65 73 29 3b  uleArg, nBytes);
2660: 0a 20 20 69 66 28 20 61 7a 4d 6f 64 75 6c 65 41  .  if( azModuleA
2670: 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rg==0 ){.    sql
2680: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2690: 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Arg);.  }else{. 
26a0: 20 20 20 69 6e 74 20 69 20 3d 20 70 54 61 62 6c     int i = pTabl
26b0: 65 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 2b 2b 3b  e->nModuleArg++;
26c0: 0a 20 20 20 20 61 7a 4d 6f 64 75 6c 65 41 72 67  .    azModuleArg
26d0: 5b 69 5d 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  [i] = zArg;.    
26e0: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 69 2b 31 5d  azModuleArg[i+1]
26f0: 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65   = 0;.    pTable
2700: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 3d 20  ->azModuleArg = 
2710: 61 7a 4d 6f 64 75 6c 65 41 72 67 3b 0a 20 20 7d  azModuleArg;.  }
2720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
2730: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
2740: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20  routine when it 
2750: 66 69 72 73 74 20 73 65 65 73 20 61 20 43 52 45  first sees a CRE
2760: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
2770: 45 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  E.** statement. 
2780: 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   The module name
2790: 20 68 61 73 20 62 65 65 6e 20 70 61 72 73 65 64   has been parsed
27a0: 2c 20 62 75 74 20 74 68 65 20 6f 70 74 69 6f 6e  , but the option
27b0: 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 70 61  al list.** of pa
27c0: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 66 6f  rameters that fo
27d0: 6c 6c 6f 77 20 74 68 65 20 6d 6f 64 75 6c 65 20  llow the module 
27e0: 6e 61 6d 65 20 61 72 65 20 73 74 69 6c 6c 20 70  name are still p
27f0: 65 6e 64 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ending..*/.void 
2800: 73 71 6c 69 74 65 33 56 74 61 62 42 65 67 69 6e  sqlite3VtabBegin
2810: 50 61 72 73 65 28 0a 20 20 50 61 72 73 65 20 2a  Parse(.  Parse *
2820: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
2830: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
2840: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
2850: 61 6d 65 31 2c 20 20 20 20 20 20 20 20 2f 2a 20  ame1,        /* 
2860: 4e 61 6d 65 20 6f 66 20 6e 65 77 20 74 61 62 6c  Name of new tabl
2870: 65 2c 20 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e, or database n
2880: 61 6d 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ame */.  Token *
2890: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 20 20 2f  pName2,        /
28a0: 2a 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20 74 61  * Name of new ta
28b0: 62 6c 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ble or NULL */. 
28c0: 20 54 6f 6b 65 6e 20 2a 70 4d 6f 64 75 6c 65 4e   Token *pModuleN
28d0: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
28e0: 66 20 74 68 65 20 6d 6f 64 75 6c 65 20 66 6f 72  f the module for
28f0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
2900: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  le */.  int ifNo
2910: 74 45 78 69 73 74 73 20 20 20 20 20 20 20 2f 2a  tExists       /*
2920: 20 4e 6f 20 65 72 72 6f 72 20 69 66 20 74 68 65   No error if the
2930: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
2940: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  xists */.){.  in
2950: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
2960: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2970: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ase the table is
2980: 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 69   being created i
2990: 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
29a0: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
29b0: 54 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20  The new virtual 
29c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
29d0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
29e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
29f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 73 71  nection */..  sq
2a00: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
2a10: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
2a20: 70 4e 61 6d 65 32 2c 20 30 2c 20 30 2c 20 31 2c  pName2, 0, 0, 1,
2a30: 20 69 66 4e 6f 74 45 78 69 73 74 73 29 3b 0a 20   ifNotExists);. 
2a40: 20 70 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65   pTable = pParse
2a50: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
2a60: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
2a70: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
2a80: 20 30 3d 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64   0==pTable->pInd
2a90: 65 78 20 29 3b 0a 0a 20 20 64 62 20 3d 20 70 50  ex );..  db = pP
2aa0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 44 62 20  arse->db;.  iDb 
2ab0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2ac0: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 6c  oIndex(db, pTabl
2ad0: 65 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  e->pSchema);.  a
2ae0: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b  ssert( iDb>=0 );
2af0: 0a 0a 20 20 70 54 61 62 6c 65 2d 3e 74 61 62 46  ..  pTable->tabF
2b00: 6c 61 67 73 20 7c 3d 20 54 46 5f 56 69 72 74 75  lags |= TF_Virtu
2b10: 61 6c 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 4d  al;.  pTable->nM
2b20: 6f 64 75 6c 65 41 72 67 20 3d 20 30 3b 0a 20 20  oduleArg = 0;.  
2b30: 61 64 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e  addModuleArgumen
2b40: 74 28 64 62 2c 20 70 54 61 62 6c 65 2c 20 73 71  t(db, pTable, sq
2b50: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
2b60: 65 6e 28 64 62 2c 20 70 4d 6f 64 75 6c 65 4e 61  en(db, pModuleNa
2b70: 6d 65 29 29 3b 0a 20 20 61 64 64 4d 6f 64 75 6c  me));.  addModul
2b80: 65 41 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 54  eArgument(db, pT
2b90: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 61 64 64 4d  able, 0);.  addM
2ba0: 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62  oduleArgument(db
2bb0: 2c 20 70 54 61 62 6c 65 2c 20 73 71 6c 69 74 65  , pTable, sqlite
2bc0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 54  3DbStrDup(db, pT
2bd0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  able->zName));. 
2be0: 20 61 73 73 65 72 74 28 20 28 70 50 61 72 73 65   assert( (pParse
2bf0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3d 3d  ->sNameToken.z==
2c00: 70 4e 61 6d 65 32 2d 3e 7a 20 26 26 20 70 4e 61  pName2->z && pNa
2c10: 6d 65 32 2d 3e 7a 21 3d 30 29 0a 20 20 20 20 20  me2->z!=0).     
2c20: 20 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 73 4e    || (pParse->sN
2c30: 61 6d 65 54 6f 6b 65 6e 2e 7a 3d 3d 70 4e 61 6d  ameToken.z==pNam
2c40: 65 31 2d 3e 7a 20 26 26 20 70 4e 61 6d 65 32 2d  e1->z && pName2-
2c50: 3e 7a 3d 3d 30 29 0a 20 20 29 3b 0a 20 20 70 50  >z==0).  );.  pP
2c60: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
2c70: 2e 6e 20 3d 20 28 69 6e 74 29 28 0a 20 20 20 20  .n = (int)(.    
2c80: 20 20 26 70 4d 6f 64 75 6c 65 4e 61 6d 65 2d 3e    &pModuleName->
2c90: 7a 5b 70 4d 6f 64 75 6c 65 4e 61 6d 65 2d 3e 6e  z[pModuleName->n
2ca0: 5d 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  ] - pParse->sNam
2cb0: 65 54 6f 6b 65 6e 2e 7a 0a 20 20 29 3b 0a 0a 23  eToken.z.  );..#
2cc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2cd0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
2ce0: 0a 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61  .  /* Creating a
2cf0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
2d00: 6e 76 6f 6b 65 73 20 74 68 65 20 61 75 74 68 6f  nvokes the autho
2d10: 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
2d20: 6b 20 74 77 69 63 65 2e 0a 20 20 2a 2a 20 54 68  k twice..  ** Th
2d30: 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
2d40: 6f 6e 2c 20 74 6f 20 6f 62 74 61 69 6e 20 70 65  on, to obtain pe
2d50: 72 6d 69 73 73 69 6f 6e 20 74 6f 20 49 4e 53 45  rmission to INSE
2d60: 52 54 20 61 20 72 6f 77 20 69 6e 74 6f 20 74 68  RT a row into th
2d70: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
2d80: 73 74 65 72 20 74 61 62 6c 65 2c 20 68 61 73 20  ster table, has 
2d90: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
2da0: 65 20 62 79 20 73 71 6c 69 74 65 33 53 74 61 72  e by sqlite3Star
2db0: 74 54 61 62 6c 65 28 29 2e 0a 20 20 2a 2a 20 54  tTable()..  ** T
2dc0: 68 65 20 73 65 63 6f 6e 64 20 63 61 6c 6c 2c 20  he second call, 
2dd0: 74 6f 20 6f 62 74 61 69 6e 20 70 65 72 6d 69 73  to obtain permis
2de0: 73 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 74  sion to create t
2df0: 68 65 20 74 61 62 6c 65 2c 20 69 73 20 6d 61 64  he table, is mad
2e00: 65 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  e now..  */.  if
2e10: 28 20 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64 75  ( pTable->azModu
2e20: 6c 65 41 72 67 20 29 7b 0a 20 20 20 20 73 71 6c  leArg ){.    sql
2e30: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2e40: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 52 45  arse, SQLITE_CRE
2e50: 41 54 45 5f 56 54 41 42 4c 45 2c 20 70 54 61 62  ATE_VTABLE, pTab
2e60: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  le->zName, .    
2e70: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
2e80: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 2c 20  azModuleArg[0], 
2e90: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
2ea0: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  iDb].zName);.  }
2eb0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2ec0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 61   This routine ta
2ed0: 6b 65 73 20 74 68 65 20 6d 6f 64 75 6c 65 20 61  kes the module a
2ee0: 72 67 75 6d 65 6e 74 20 74 68 61 74 20 68 61 73  rgument that has
2ef0: 20 62 65 65 6e 20 61 63 63 75 6d 75 6c 61 74 69   been accumulati
2f00: 6e 67 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d  ng.** in pParse-
2f10: 3e 7a 41 72 67 5b 5d 20 61 6e 64 20 61 70 70 65  >zArg[] and appe
2f20: 6e 64 73 20 69 74 20 74 6f 20 74 68 65 20 6c 69  nds it to the li
2f30: 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  st of arguments 
2f40: 6f 6e 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  on the.** virtua
2f50: 6c 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  l table currentl
2f60: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
2f70: 74 69 6f 6e 20 69 6e 20 70 50 61 72 73 65 2d 3e  tion in pParse->
2f80: 70 54 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  pTable..*/.stati
2f90: 63 20 76 6f 69 64 20 61 64 64 41 72 67 75 6d 65  c void addArgume
2fa0: 6e 74 54 6f 56 74 61 62 28 50 61 72 73 65 20 2a  ntToVtab(Parse *
2fb0: 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2fc0: 50 61 72 73 65 2d 3e 73 41 72 67 2e 7a 20 26 26  Parse->sArg.z &&
2fd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
2fe0: 6c 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  le ){.    const 
2ff0: 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  char *z = (const
3000: 20 63 68 61 72 2a 29 70 50 61 72 73 65 2d 3e 73   char*)pParse->s
3010: 41 72 67 2e 7a 3b 0a 20 20 20 20 69 6e 74 20 6e  Arg.z;.    int n
3020: 20 3d 20 70 50 61 72 73 65 2d 3e 73 41 72 67 2e   = pParse->sArg.
3030: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  n;.    sqlite3 *
3040: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
3050: 0a 20 20 20 20 61 64 64 4d 6f 64 75 6c 65 41 72  .    addModuleAr
3060: 67 75 6d 65 6e 74 28 64 62 2c 20 70 50 61 72 73  gument(db, pPars
3070: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2c 20 73 71  e->pNewTable, sq
3080: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
3090: 62 2c 20 7a 2c 20 6e 29 29 3b 0a 20 20 7d 0a 7d  b, z, n));.  }.}
30a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ../*.** The pars
30b0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
30c0: 75 74 69 6e 65 20 61 66 74 65 72 20 74 68 65 20  utine after the 
30d0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
30e0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 0a 2a  ABLE statement.*
30f0: 2a 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c  * has been compl
3100: 65 74 65 6c 79 20 70 61 72 73 65 64 2e 0a 2a 2f  etely parsed..*/
3110: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
3120: 62 46 69 6e 69 73 68 50 61 72 73 65 28 50 61 72  bFinishParse(Par
3130: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
3140: 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54 61 62 6c  n *pEnd){.  Tabl
3150: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
3160: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 20 20 2f 2a  ->pNewTable;  /*
3170: 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
3180: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
3190: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
31a0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
31b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
31c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
31d0: 2f 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  /..  if( pTab==0
31e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64 64   ) return;.  add
31f0: 41 72 67 75 6d 65 6e 74 54 6f 56 74 61 62 28 70  ArgumentToVtab(p
3200: 50 61 72 73 65 29 3b 0a 20 20 70 50 61 72 73 65  Parse);.  pParse
3210: 2d 3e 73 41 72 67 2e 7a 20 3d 20 30 3b 0a 20 20  ->sArg.z = 0;.  
3220: 69 66 28 20 70 54 61 62 2d 3e 6e 4d 6f 64 75 6c  if( pTab->nModul
3230: 65 41 72 67 3c 31 20 29 20 72 65 74 75 72 6e 3b  eArg<1 ) return;
3240: 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .  .  /* If the 
3250: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
3260: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
3270: 73 20 62 65 69 6e 67 20 65 6e 74 65 72 65 64 20  s being entered 
3280: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 66 69 72  for the.  ** fir
3290: 73 74 20 74 69 6d 65 20 28 69 6e 20 6f 74 68 65  st time (in othe
32a0: 72 20 77 6f 72 64 73 20 69 66 20 74 68 65 20 76  r words if the v
32b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
32c0: 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 0a 20  actually being. 
32d0: 20 2a 2a 20 63 72 65 61 74 65 64 20 6e 6f 77 20   ** created now 
32e0: 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74 20  instead of just 
32f0: 62 65 69 6e 67 20 72 65 61 64 20 6f 75 74 20 6f  being read out o
3300: 66 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 29  f sqlite_master)
3310: 20 74 68 65 6e 0a 20 20 2a 2a 20 64 6f 20 61 64   then.  ** do ad
3320: 64 69 74 69 6f 6e 61 6c 20 69 6e 69 74 69 61 6c  ditional initial
3330: 69 7a 61 74 69 6f 6e 20 77 6f 72 6b 20 61 6e 64  ization work and
3340: 20 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65   store the state
3350: 6d 65 6e 74 20 74 65 78 74 0a 20 20 2a 2a 20 69  ment text.  ** i
3360: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
3370: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ter table..  */.
3380: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
3390: 62 75 73 79 20 29 7b 0a 20 20 20 20 63 68 61 72  busy ){.    char
33a0: 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 63 68 61   *zStmt;.    cha
33b0: 72 20 2a 7a 57 68 65 72 65 3b 0a 20 20 20 20 69  r *zWhere;.    i
33c0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 69 6e 74 20  nt iDb;.    int 
33d0: 69 52 65 67 3b 0a 20 20 20 20 56 64 62 65 20 2a  iReg;.    Vdbe *
33e0: 76 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  v;..    /* Compu
33f0: 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
3400: 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
3410: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
3420: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3430: 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
3440: 20 20 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d      pParse->sNam
3450: 65 54 6f 6b 65 6e 2e 6e 20 3d 20 28 69 6e 74 29  eToken.n = (int)
3460: 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73  (pEnd->z - pPars
3470: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
3480: 20 2b 20 70 45 6e 64 2d 3e 6e 3b 0a 20 20 20 20   + pEnd->n;.    
3490: 7d 0a 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71  }.    zStmt = sq
34a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
34b0: 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
34c0: 20 54 41 42 4c 45 20 25 54 22 2c 20 26 70 50 61   TABLE %T", &pPa
34d0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 29  rse->sNameToken)
34e0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  ;..    /* A slot
34f0: 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
3500: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
3510: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
3520: 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
3530: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
3540: 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
3550: 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
3560: 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
3570: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
3580: 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
3590: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
35a0: 2a 20 54 68 65 20 56 4d 20 72 65 67 69 73 74 65  * The VM registe
35b0: 72 20 6e 75 6d 62 65 72 20 70 50 61 72 73 65 2d  r number pParse-
35c0: 3e 72 65 67 52 6f 77 69 64 20 68 6f 6c 64 73 20  >regRowid holds 
35d0: 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 6e 0a  the rowid of an.
35e0: 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20      ** entry in 
35f0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
3600: 72 20 74 61 62 6c 65 20 74 68 74 20 77 61 73 20  r table tht was 
3610: 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
3620: 20 76 74 61 62 0a 20 20 20 20 2a 2a 20 62 79 20   vtab.    ** by 
3630: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
3640: 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  e()..    */.    
3650: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
3660: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
3670: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
3680: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
3690: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
36a0: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
36b0: 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
36c0: 54 20 74 79 70 65 3d 27 74 61 62 6c 65 27 2c 20  T type='table', 
36d0: 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
36e0: 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 30  e=%Q, rootpage=0
36f0: 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
3700: 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
3710: 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  %d",.      db->a
3720: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
3730: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
3740: 2c 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ,.      pTab->zN
3750: 61 6d 65 2c 0a 20 20 20 20 20 20 70 54 61 62 2d  ame,.      pTab-
3760: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53  >zName,.      zS
3770: 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
3780: 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
3790: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
37a0: 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
37b0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
37c0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
37d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
37e0: 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
37f0: 20 69 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c 69   iDb);..    sqli
3800: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3810: 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30   OP_Expire, 0, 0
3820: 29 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d 20  );.    zWhere = 
3830: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
3840: 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e  b, "name='%q' AN
3850: 44 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c  D type='table'",
3860: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
3870: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3880: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
3890: 2c 20 69 44 62 2c 20 7a 57 68 65 72 65 29 3b 0a  , iDb, zWhere);.
38a0: 0a 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50  .    iReg = ++pP
38b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
38c0: 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
38d0: 74 72 69 6e 67 28 76 2c 20 69 52 65 67 2c 20 70  tring(v, iReg, p
38e0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
38f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3900: 70 32 28 76 2c 20 4f 50 5f 56 43 72 65 61 74 65  p2(v, OP_VCreate
3910: 2c 20 69 44 62 2c 20 69 52 65 67 29 3b 0a 20 20  , iDb, iReg);.  
3920: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
3930: 65 20 72 65 72 65 61 64 69 6e 67 20 74 68 65 20  e rereading the 
3940: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
3950: 62 6c 65 20 63 72 65 61 74 65 20 74 68 65 20 69  ble create the i
3960: 6e 2d 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  n-memory.  ** re
3970: 63 6f 72 64 20 6f 66 20 74 68 65 20 74 61 62 6c  cord of the tabl
3980: 65 2e 20 54 68 65 20 78 43 6f 6e 6e 65 63 74 28  e. The xConnect(
3990: 29 20 6d 65 74 68 6f 64 20 69 73 20 6e 6f 74 20  ) method is not 
39a0: 63 61 6c 6c 65 64 20 75 6e 74 69 6c 0a 20 20 2a  called until.  *
39b0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
39c0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
39d0: 6c 65 20 69 73 20 75 73 65 64 20 69 6e 20 61 6e  le is used in an
39e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
39f0: 54 68 69 73 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  This.  ** allows
3a00: 20 61 20 73 63 68 65 6d 61 20 74 68 61 74 20 63   a schema that c
3a10: 6f 6e 74 61 69 6e 73 20 76 69 72 74 75 61 6c 20  ontains virtual 
3a20: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6c 6f 61  tables to be loa
3a30: 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  ded before.  ** 
3a40: 74 68 65 20 72 65 71 75 69 72 65 64 20 76 69 72  the required vir
3a50: 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65  tual table imple
3a60: 6d 65 6e 74 61 74 69 6f 6e 73 20 61 72 65 20 72  mentations are r
3a70: 65 67 69 73 74 65 72 65 64 2e 20 20 2a 2f 0a 20  egistered.  */. 
3a80: 20 65 6c 73 65 20 7b 0a 20 20 20 20 54 61 62 6c   else {.    Tabl
3a90: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68  e *pOld;.    Sch
3aa0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70  ema *pSchema = p
3ab0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
3ac0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
3ad0: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
3ae0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e;.    assert( s
3af0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3b00: 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 53 63  xHeld(db, 0, pSc
3b10: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 4f 6c  hema) );.    pOl
3b20: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
3b30: 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e  nsert(&pSchema->
3b40: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  tblHash, zName, 
3b50: 70 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 70  pTab);.    if( p
3b60: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  Old ){.      db-
3b70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
3b80: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
3b90: 20 70 54 61 62 3d 3d 70 4f 6c 64 20 29 3b 20 20   pTab==pOld );  
3ba0: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
3bb0: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
3bc0: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
3bd0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
3be0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
3bf0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
3c00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3c10: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
3c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3c30: 20 69 74 20 73 65 65 73 20 74 68 65 20 66 69 72   it sees the fir
3c40: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 6f 66 20 61  st token.** of a
3c50: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  n argument to th
3c60: 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 69 6e  e module name in
3c70: 20 61 20 43 52 45 41 54 45 20 56 49 52 54 55 41   a CREATE VIRTUA
3c80: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
3c90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
3ca0: 65 33 56 74 61 62 41 72 67 49 6e 69 74 28 50 61  e3VtabArgInit(Pa
3cb0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
3cc0: 61 64 64 41 72 67 75 6d 65 6e 74 54 6f 56 74 61  addArgumentToVta
3cd0: 62 28 70 50 61 72 73 65 29 3b 0a 20 20 70 50 61  b(pParse);.  pPa
3ce0: 72 73 65 2d 3e 73 41 72 67 2e 7a 20 3d 20 30 3b  rse->sArg.z = 0;
3cf0: 0a 20 20 70 50 61 72 73 65 2d 3e 73 41 72 67 2e  .  pParse->sArg.
3d00: 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 0;.}../*.** 
3d10: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
3d20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f   this routine fo
3d30: 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 61 66 74  r each token aft
3d40: 65 72 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b  er the first tok
3d50: 65 6e 0a 2a 2a 20 69 6e 20 61 6e 20 61 72 67 75  en.** in an argu
3d60: 6d 65 6e 74 20 74 6f 20 74 68 65 20 6d 6f 64 75  ment to the modu
3d70: 6c 65 20 6e 61 6d 65 20 69 6e 20 61 20 43 52 45  le name in a CRE
3d80: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
3d90: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
3da0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
3db0: 41 72 67 45 78 74 65 6e 64 28 50 61 72 73 65 20  ArgExtend(Parse 
3dc0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
3dd0: 70 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 72  p){.  Token *pAr
3de0: 67 20 3d 20 26 70 50 61 72 73 65 2d 3e 73 41 72  g = &pParse->sAr
3df0: 67 3b 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 7a  g;.  if( pArg->z
3e00: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 41 72 67 2d  ==0 ){.    pArg-
3e10: 3e 7a 20 3d 20 70 2d 3e 7a 3b 0a 20 20 20 20 70  >z = p->z;.    p
3e20: 41 72 67 2d 3e 6e 20 3d 20 70 2d 3e 6e 3b 0a 20  Arg->n = p->n;. 
3e30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
3e40: 72 74 28 70 41 72 67 2d 3e 7a 20 3c 3d 20 70 2d  rt(pArg->z <= p-
3e50: 3e 7a 29 3b 0a 20 20 20 20 70 41 72 67 2d 3e 6e  >z);.    pArg->n
3e60: 20 3d 20 28 69 6e 74 29 28 26 70 2d 3e 7a 5b 70   = (int)(&p->z[p
3e70: 2d 3e 6e 5d 20 2d 20 70 41 72 67 2d 3e 7a 29 3b  ->n] - pArg->z);
3e80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
3e90: 76 6f 6b 65 20 61 20 76 69 72 74 75 61 6c 20 74  voke a virtual t
3ea0: 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72  able constructor
3eb0: 20 28 65 69 74 68 65 72 20 78 43 72 65 61 74 65   (either xCreate
3ec0: 20 6f 72 20 78 43 6f 6e 6e 65 63 74 29 2e 20 54   or xConnect). T
3ed0: 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  he.** pointer to
3ee0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f   the function to
3ef0: 20 69 6e 76 6f 6b 65 20 69 73 20 70 61 73 73 65   invoke is passe
3f00: 64 20 61 73 20 74 68 65 20 66 6f 75 72 74 68 20  d as the fourth 
3f10: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74 6f 20  parameter.** to 
3f20: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a  this procedure..
3f30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
3f40: 61 62 43 61 6c 6c 43 6f 6e 73 74 72 75 63 74 6f  abCallConstructo
3f50: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
3f60: 2c 20 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  , .  Table *pTab
3f70: 2c 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64  ,.  Module *pMod
3f80: 2c 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e 73 74  ,.  int (*xConst
3f90: 72 75 63 74 29 28 73 71 6c 69 74 65 33 2a 2c 76  ruct)(sqlite3*,v
3fa0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
3fb0: 68 61 72 2a 63 6f 6e 73 74 2a 2c 73 71 6c 69 74  har*const*,sqlit
3fc0: 65 33 5f 76 74 61 62 2a 2a 2c 63 68 61 72 2a 2a  e3_vtab**,char**
3fd0: 29 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  ),.  char **pzEr
3fe0: 72 0a 29 7b 0a 20 20 56 74 61 62 43 74 78 20 73  r.){.  VtabCtx s
3ff0: 43 74 78 3b 0a 20 20 56 54 61 62 6c 65 20 2a 70  Ctx;.  VTable *p
4000: 56 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 63  VTable;.  int rc
4010: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4020: 63 6f 6e 73 74 2a 61 7a 41 72 67 20 3d 20 28 63  const*azArg = (c
4030: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
4040: 2a 29 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  *)pTab->azModule
4050: 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  Arg;.  int nArg 
4060: 3d 20 70 54 61 62 2d 3e 6e 4d 6f 64 75 6c 65 41  = pTab->nModuleA
4070: 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rg;.  char *zErr
4080: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d   = 0;.  char *zM
4090: 6f 64 75 6c 65 4e 61 6d 65 3b 0a 20 20 69 6e 74  oduleName;.  int
40a0: 20 69 44 62 3b 0a 20 20 56 74 61 62 43 74 78 20   iDb;.  VtabCtx 
40b0: 2a 70 43 74 78 3b 0a 0a 20 20 2f 2a 20 43 68 65  *pCtx;..  /* Che
40c0: 63 6b 20 74 68 61 74 20 74 68 65 20 76 69 72 74  ck that the virt
40d0: 75 61 6c 2d 74 61 62 6c 65 20 69 73 20 6e 6f 74  ual-table is not
40e0: 20 61 6c 72 65 61 64 79 20 62 65 69 6e 67 20 69   already being i
40f0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
4100: 66 6f 72 28 70 43 74 78 3d 64 62 2d 3e 70 56 74  for(pCtx=db->pVt
4110: 61 62 43 74 78 3b 20 70 43 74 78 3b 20 70 43 74  abCtx; pCtx; pCt
4120: 78 3d 70 43 74 78 2d 3e 70 50 72 69 6f 72 29 7b  x=pCtx->pPrior){
4130: 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 70  .    if( pCtx->p
4140: 54 61 62 3d 3d 70 54 61 62 20 29 7b 0a 20 20 20  Tab==pTab ){.   
4150: 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
4160: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
4170: 20 20 20 20 20 20 20 20 20 20 22 76 74 61 62 6c            "vtabl
4180: 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 63 61  e constructor ca
4190: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
41a0: 3a 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  : %s", pTab->zNa
41b0: 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
41c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
41d0: 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
41e0: 7d 0a 0a 20 20 7a 4d 6f 64 75 6c 65 4e 61 6d 65  }..  zModuleName
41f0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
4200: 66 28 64 62 2c 20 22 25 73 22 2c 20 70 54 61 62  f(db, "%s", pTab
4210: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
4220: 21 7a 4d 6f 64 75 6c 65 4e 61 6d 65 20 29 7b 0a  !zModuleName ){.
4230: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4240: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
4250: 70 56 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  pVTable = sqlite
4260: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
4270: 2c 20 73 69 7a 65 6f 66 28 56 54 61 62 6c 65 29  , sizeof(VTable)
4280: 29 3b 0a 20 20 69 66 28 20 21 70 56 54 61 62 6c  );.  if( !pVTabl
4290: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
42a0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 6f 64 75  DbFree(db, zModu
42b0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  leName);.    ret
42c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
42d0: 3b 0a 20 20 7d 0a 20 20 70 56 54 61 62 6c 65 2d  ;.  }.  pVTable-
42e0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 56 54 61  >db = db;.  pVTa
42f0: 62 6c 65 2d 3e 70 4d 6f 64 20 3d 20 70 4d 6f 64  ble->pMod = pMod
4300: 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  ;..  iDb = sqlit
4310: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
4320: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
4330: 61 29 3b 0a 20 20 70 54 61 62 2d 3e 61 7a 4d 6f  a);.  pTab->azMo
4340: 64 75 6c 65 41 72 67 5b 31 5d 20 3d 20 64 62 2d  duleArg[1] = db-
4350: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
4360: 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
4370: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
4380: 63 6f 6e 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20  constructor */. 
4390: 20 61 73 73 65 72 74 28 20 26 64 62 2d 3e 70 56   assert( &db->pV
43a0: 74 61 62 43 74 78 20 29 3b 0a 20 20 61 73 73 65  tabCtx );.  asse
43b0: 72 74 28 20 78 43 6f 6e 73 74 72 75 63 74 20 29  rt( xConstruct )
43c0: 3b 0a 20 20 73 43 74 78 2e 70 54 61 62 20 3d 20  ;.  sCtx.pTab = 
43d0: 70 54 61 62 3b 0a 20 20 73 43 74 78 2e 70 56 54  pTab;.  sCtx.pVT
43e0: 61 62 6c 65 20 3d 20 70 56 54 61 62 6c 65 3b 0a  able = pVTable;.
43f0: 20 20 73 43 74 78 2e 70 50 72 69 6f 72 20 3d 20    sCtx.pPrior = 
4400: 64 62 2d 3e 70 56 74 61 62 43 74 78 3b 0a 20 20  db->pVtabCtx;.  
4410: 73 43 74 78 2e 62 44 65 63 6c 61 72 65 64 20 3d  sCtx.bDeclared =
4420: 20 30 3b 0a 20 20 64 62 2d 3e 70 56 74 61 62 43   0;.  db->pVtabC
4430: 74 78 20 3d 20 26 73 43 74 78 3b 0a 20 20 72 63  tx = &sCtx;.  rc
4440: 20 3d 20 78 43 6f 6e 73 74 72 75 63 74 28 64 62   = xConstruct(db
4450: 2c 20 70 4d 6f 64 2d 3e 70 41 75 78 2c 20 6e 41  , pMod->pAux, nA
4460: 72 67 2c 20 61 7a 41 72 67 2c 20 26 70 56 54 61  rg, azArg, &pVTa
4470: 62 6c 65 2d 3e 70 56 74 61 62 2c 20 26 7a 45 72  ble->pVtab, &zEr
4480: 72 29 3b 0a 20 20 64 62 2d 3e 70 56 74 61 62 43  r);.  db->pVtabC
4490: 74 78 20 3d 20 73 43 74 78 2e 70 50 72 69 6f 72  tx = sCtx.pPrior
44a0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
44b0: 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d  TE_NOMEM ) db->m
44c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
44d0: 0a 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e  .  assert( sCtx.
44e0: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 0a 20  pTab==pTab );.. 
44f0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
4500: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 45  rc ){.    if( zE
4510: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  rr==0 ){.      *
4520: 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d  pzErr = sqlite3M
4530: 50 72 69 6e 74 66 28 64 62 2c 20 22 76 74 61 62  Printf(db, "vtab
4540: 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66  le constructor f
4550: 61 69 6c 65 64 3a 20 25 73 22 2c 20 7a 4d 6f 64  ailed: %s", zMod
4560: 75 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  uleName);.    }e
4570: 6c 73 65 20 7b 0a 20 20 20 20 20 20 2a 70 7a 45  lse {.      *pzE
4580: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
4590: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 7a 45  ntf(db, "%s", zE
45a0: 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rr);.      sqlit
45b0: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
45c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
45d0: 44 62 46 72 65 65 28 64 62 2c 20 70 56 54 61 62  DbFree(db, pVTab
45e0: 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  le);.  }else if(
45f0: 20 41 4c 57 41 59 53 28 70 56 54 61 62 6c 65 2d   ALWAYS(pVTable-
4600: 3e 70 56 74 61 62 29 20 29 7b 0a 20 20 20 20 2f  >pVtab) ){.    /
4610: 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
4620: 6f 66 20 41 4c 57 41 59 53 28 29 3a 20 20 41 20  of ALWAYS():  A 
4630: 63 6f 72 72 65 63 74 20 76 74 61 62 20 63 6f 6e  correct vtab con
4640: 73 74 72 75 63 74 6f 72 20 6d 75 73 74 20 61 6c  structor must al
4650: 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20 74 68  locate.    ** th
4660: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  e sqlite3_vtab o
4670: 62 6a 65 63 74 20 69 66 20 73 75 63 63 65 73 73  bject if success
4680: 66 75 6c 2e 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ful.  */.    mem
4690: 73 65 74 28 70 56 54 61 62 6c 65 2d 3e 70 56 74  set(pVTable->pVt
46a0: 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 56  ab, 0, sizeof(pV
46b0: 54 61 62 6c 65 2d 3e 70 56 74 61 62 5b 30 5d 29  Table->pVtab[0])
46c0: 29 3b 0a 20 20 20 20 70 56 54 61 62 6c 65 2d 3e  );.    pVTable->
46d0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 20 3d  pVtab->pModule =
46e0: 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 3b 0a   pMod->pModule;.
46f0: 20 20 20 20 70 56 54 61 62 6c 65 2d 3e 6e 52 65      pVTable->nRe
4700: 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73  f = 1;.    if( s
4710: 43 74 78 2e 62 44 65 63 6c 61 72 65 64 3d 3d 30  Ctx.bDeclared==0
4720: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
4730: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20  char *zFormat = 
4740: 22 76 74 61 62 6c 65 20 63 6f 6e 73 74 72 75 63  "vtable construc
4750: 74 6f 72 20 64 69 64 20 6e 6f 74 20 64 65 63 6c  tor did not decl
4760: 61 72 65 20 73 63 68 65 6d 61 3a 20 25 73 22 3b  are schema: %s";
4770: 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  .      *pzErr = 
4780: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
4790: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 70 54 61 62  b, zFormat, pTab
47a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
47b0: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
47c0: 6b 28 70 56 54 61 62 6c 65 29 3b 0a 20 20 20 20  k(pVTable);.    
47d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
47e0: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
47f0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
4800: 20 20 20 20 20 20 75 38 20 6f 6f 6f 48 69 64 64        u8 oooHidd
4810: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a  en = 0;.      /*
4820: 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   If everything w
4830: 65 6e 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ent according to
4840: 20 70 6c 61 6e 2c 20 6c 69 6e 6b 20 74 68 65 20   plan, link the 
4850: 6e 65 77 20 56 54 61 62 6c 65 20 73 74 72 75 63  new VTable struc
4860: 74 75 72 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ture.      ** in
4870: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
4880: 73 74 20 68 65 61 64 65 64 20 62 79 20 70 54 61  st headed by pTa
4890: 62 2d 3e 70 56 54 61 62 6c 65 2e 20 54 68 65 6e  b->pVTable. Then
48a0: 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   loop through th
48b0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  e .      ** colu
48c0: 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
48d0: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20 6f   to see if any o
48e0: 66 20 74 68 65 6d 20 63 6f 6e 74 61 69 6e 20 74  f them contain t
48f0: 68 65 20 74 6f 6b 65 6e 20 22 68 69 64 64 65 6e  he token "hidden
4900: 22 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  "..      ** If s
4910: 6f 2c 20 73 65 74 20 74 68 65 20 43 6f 6c 75 6d  o, set the Colum
4920: 6e 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e  n COLFLAG_HIDDEN
4930: 20 66 6c 61 67 20 61 6e 64 20 72 65 6d 6f 76 65   flag and remove
4940: 20 74 68 65 20 74 6f 6b 65 6e 20 66 72 6f 6d 0a   the token from.
4950: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70        ** the typ
4960: 65 20 73 74 72 69 6e 67 2e 20 20 2a 2f 0a 20 20  e string.  */.  
4970: 20 20 20 20 70 56 54 61 62 6c 65 2d 3e 70 4e 65      pVTable->pNe
4980: 78 74 20 3d 20 70 54 61 62 2d 3e 70 56 54 61 62  xt = pTab->pVTab
4990: 6c 65 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  le;.      pTab->
49a0: 70 56 54 61 62 6c 65 20 3d 20 70 56 54 61 62 6c  pVTable = pVTabl
49b0: 65 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 43  e;..      for(iC
49c0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
49d0: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
49e0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
49f0: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
4a00: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
4a10: 20 20 20 20 20 20 69 6e 74 20 6e 54 79 70 65 3b        int nType;
4a20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
4a30: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
4a40: 21 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  !zType ){.      
4a50: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
4a60: 67 73 20 7c 3d 20 6f 6f 6f 48 69 64 64 65 6e 3b  gs |= oooHidden;
4a70: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
4a80: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
4a90: 20 20 20 20 20 20 20 6e 54 79 70 65 20 3d 20 73         nType = s
4aa0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4ab0: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Type);.        i
4ac0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
4ad0: 6d 70 28 22 68 69 64 64 65 6e 22 2c 20 7a 54 79  mp("hidden", zTy
4ae0: 70 65 2c 20 36 29 7c 7c 28 7a 54 79 70 65 5b 36  pe, 6)||(zType[6
4af0: 5d 20 26 26 20 7a 54 79 70 65 5b 36 5d 21 3d 27  ] && zType[6]!='
4b00: 20 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   ') ){.         
4b10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 79 70   for(i=0; i<nTyp
4b20: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
4b30: 20 20 20 20 20 69 66 28 20 28 30 3d 3d 73 71 6c       if( (0==sql
4b40: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 22 20 68  ite3StrNICmp(" h
4b50: 69 64 64 65 6e 22 2c 20 26 7a 54 79 70 65 5b 69  idden", &zType[i
4b60: 5d 2c 20 37 29 29 0a 20 20 20 20 20 20 20 20 20  ], 7)).         
4b70: 20 20 20 20 26 26 20 28 7a 54 79 70 65 5b 69 2b      && (zType[i+
4b80: 37 5d 3d 3d 27 5c 30 27 20 7c 7c 20 7a 54 79 70  7]=='\0' || zTyp
4b90: 65 5b 69 2b 37 5d 3d 3d 27 20 27 29 0a 20 20 20  e[i+7]==' ').   
4ba0: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
4bb0: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
4bd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
4be0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
4bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4c00: 69 66 28 20 69 3c 6e 54 79 70 65 20 29 7b 0a 20  if( i<nType ){. 
4c10: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
4c20: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44            int nD
4c30: 65 6c 20 3d 20 36 20 2b 20 28 7a 54 79 70 65 5b  el = 6 + (zType[
4c40: 69 2b 36 5d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  i+6] ? 1 : 0);. 
4c50: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69           for(j=i
4c60: 3b 20 28 6a 2b 6e 44 65 6c 29 3c 3d 6e 54 79 70  ; (j+nDel)<=nTyp
4c70: 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; j++){.       
4c80: 20 20 20 20 20 7a 54 79 70 65 5b 6a 5d 20 3d 20       zType[j] = 
4c90: 7a 54 79 70 65 5b 6a 2b 6e 44 65 6c 5d 3b 0a 20  zType[j+nDel];. 
4ca0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4cb0: 20 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b 69       if( zType[i
4cc0: 5d 3d 3d 27 5c 30 27 20 26 26 20 69 3e 30 20 29  ]=='\0' && i>0 )
4cd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
4ce0: 73 65 72 74 28 7a 54 79 70 65 5b 69 2d 31 5d 3d  sert(zType[i-1]=
4cf0: 3d 27 20 27 29 3b 0a 20 20 20 20 20 20 20 20 20  =' ');.         
4d00: 20 20 20 7a 54 79 70 65 5b 69 2d 31 5d 20 3d 20     zType[i-1] = 
4d10: 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\0';.          
4d20: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  }.          pTab
4d30: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c  ->aCol[iCol].col
4d40: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
4d50: 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 20 20 20  _HIDDEN;.       
4d60: 20 20 20 6f 6f 6f 48 69 64 64 65 6e 20 3d 20 54     oooHidden = T
4d70: 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 20  F_OOOHidden;.   
4d80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4d90: 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
4da0: 6c 61 67 73 20 7c 3d 20 6f 6f 6f 48 69 64 64 65  lags |= oooHidde
4db0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
4dc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
4dd0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4de0: 64 62 2c 20 7a 4d 6f 64 75 6c 65 4e 61 6d 65 29  db, zModuleName)
4df0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4e00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
4e10: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
4e20: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
4e30: 6f 20 63 61 6c 6c 20 74 68 65 20 78 43 6f 6e 6e  o call the xConn
4e40: 65 63 74 28 29 20 6d 65 74 68 6f 64 0a 2a 2a 20  ect() method.** 
4e50: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
4e60: 61 62 6c 65 20 70 54 61 62 2e 20 49 66 20 61 6e  able pTab. If an
4e70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
4e80: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
4e90: 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 61 6e 64  returned .** and
4ea0: 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74 20 69   an error left i
4eb0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  n pParse..**.** 
4ec0: 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
4ed0: 6f 2d 6f 70 20 69 66 20 74 61 62 6c 65 20 70 54  o-op if table pT
4ee0: 61 62 20 69 73 20 6e 6f 74 20 61 20 76 69 72 74  ab is not a virt
4ef0: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  ual table..*/.in
4f00: 74 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  t sqlite3VtabCal
4f10: 6c 43 6f 6e 6e 65 63 74 28 50 61 72 73 65 20 2a  lConnect(Parse *
4f20: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
4f30: 54 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  Tab){.  sqlite3 
4f40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4f50: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4f60: 7a 4d 6f 64 3b 0a 20 20 4d 6f 64 75 6c 65 20 2a  zMod;.  Module *
4f70: 70 4d 6f 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pMod;.  int rc;.
4f80: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20  .  assert( pTab 
4f90: 29 3b 0a 20 20 69 66 28 20 28 70 54 61 62 2d 3e  );.  if( (pTab->
4fa0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 56 69  tabFlags & TF_Vi
4fb0: 72 74 75 61 6c 29 3d 3d 30 20 7c 7c 20 73 71 6c  rtual)==0 || sql
4fc0: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
4fd0: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 72  , pTab) ){.    r
4fe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4ff0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
5000: 65 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76  e the required v
5010: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
5020: 75 6c 65 20 2a 2f 0a 20 20 7a 4d 6f 64 20 3d 20  ule */.  zMod = 
5030: 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
5040: 67 5b 30 5d 3b 0a 20 20 70 4d 6f 64 20 3d 20 28  g[0];.  pMod = (
5050: 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48  Module*)sqlite3H
5060: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f  ashFind(&db->aMo
5070: 64 75 6c 65 2c 20 7a 4d 6f 64 29 3b 0a 0a 20 20  dule, zMod);..  
5080: 69 66 28 20 21 70 4d 6f 64 20 29 7b 0a 20 20 20  if( !pMod ){.   
5090: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
50a0: 64 75 6c 65 20 3d 20 70 54 61 62 2d 3e 61 7a 4d  dule = pTab->azM
50b0: 6f 64 75 6c 65 41 72 67 5b 30 5d 3b 0a 20 20 20  oduleArg[0];.   
50c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
50d0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
50e0: 68 20 6d 6f 64 75 6c 65 3a 20 25 73 22 2c 20 7a  h module: %s", z
50f0: 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 72 63 20  Module);.    rc 
5100: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
5110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
5120: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  r *zErr = 0;.   
5130: 20 72 63 20 3d 20 76 74 61 62 43 61 6c 6c 43 6f   rc = vtabCallCo
5140: 6e 73 74 72 75 63 74 6f 72 28 64 62 2c 20 70 54  nstructor(db, pT
5150: 61 62 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64 2d 3e  ab, pMod, pMod->
5160: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6e 6e 65 63  pModule->xConnec
5170: 74 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  t, &zErr);.    i
5180: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5190: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
51a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
51b0: 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
51c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
51d0: 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 29  DbFree(db, zErr)
51e0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
51f0: 72 63 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 47 72 6f 77  rc;.}./*.** Grow
5200: 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73   the db->aVTrans
5210: 5b 5d 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  [] array so that
5220: 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66   there is room f
5230: 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 0a  or at least one.
5240: 2a 2a 20 6d 6f 72 65 20 76 2d 74 61 62 6c 65 2e  ** more v-table.
5250: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   Return SQLITE_N
5260: 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
5270: 20 66 61 69 6c 73 2c 20 6f 72 20 53 51 4c 49 54   fails, or SQLIT
5280: 45 5f 4f 4b 20 6f 74 68 65 72 77 69 73 65 2e 0a  E_OK otherwise..
5290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
52a0: 6f 77 56 54 72 61 6e 73 28 73 71 6c 69 74 65 33  owVTrans(sqlite3
52b0: 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 69   *db){.  const i
52c0: 6e 74 20 41 52 52 41 59 5f 49 4e 43 52 20 3d 20  nt ARRAY_INCR = 
52d0: 35 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77 20 74 68  5;..  /* Grow th
52e0: 65 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e  e sqlite3.aVTran
52f0: 73 20 61 72 72 61 79 20 69 66 20 72 65 71 75 69  s array if requi
5300: 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 64 62  red */.  if( (db
5310: 2d 3e 6e 56 54 72 61 6e 73 25 41 52 52 41 59 5f  ->nVTrans%ARRAY_
5320: 49 4e 43 52 29 3d 3d 30 20 29 7b 0a 20 20 20 20  INCR)==0 ){.    
5330: 56 54 61 62 6c 65 20 2a 2a 61 56 54 72 61 6e 73  VTable **aVTrans
5340: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 73  ;.    int nBytes
5350: 20 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   = sizeof(sqlite
5360: 33 5f 76 74 61 62 20 2a 29 20 2a 20 28 64 62 2d  3_vtab *) * (db-
5370: 3e 6e 56 54 72 61 6e 73 20 2b 20 41 52 52 41 59  >nVTrans + ARRAY
5380: 5f 49 4e 43 52 29 3b 0a 20 20 20 20 61 56 54 72  _INCR);.    aVTr
5390: 61 6e 73 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ans = sqlite3DbR
53a0: 65 61 6c 6c 6f 63 28 64 62 2c 20 28 76 6f 69 64  ealloc(db, (void
53b0: 20 2a 29 64 62 2d 3e 61 56 54 72 61 6e 73 2c 20   *)db->aVTrans, 
53c0: 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 69 66 28  nBytes);.    if(
53d0: 20 21 61 56 54 72 61 6e 73 20 29 7b 0a 20 20 20   !aVTrans ){.   
53e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
53f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5400: 20 20 6d 65 6d 73 65 74 28 26 61 56 54 72 61 6e    memset(&aVTran
5410: 73 5b 64 62 2d 3e 6e 56 54 72 61 6e 73 5d 2c 20  s[db->nVTrans], 
5420: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
5430: 33 5f 76 74 61 62 20 2a 29 2a 41 52 52 41 59 5f  3_vtab *)*ARRAY_
5440: 49 4e 43 52 29 3b 0a 20 20 20 20 64 62 2d 3e 61  INCR);.    db->a
5450: 56 54 72 61 6e 73 20 3d 20 61 56 54 72 61 6e 73  VTrans = aVTrans
5460: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5470: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5480: 0a 2a 2a 20 41 64 64 20 74 68 65 20 76 69 72 74  .** Add the virt
5490: 75 61 6c 20 74 61 62 6c 65 20 70 56 54 61 62 20  ual table pVTab 
54a0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 73 71 6c  to the array sql
54b0: 69 74 65 33 2e 61 56 54 72 61 6e 73 5b 5d 2e 20  ite3.aVTrans[]. 
54c0: 53 70 61 63 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  Space should.** 
54d0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
54e0: 6e 20 72 65 73 65 72 76 65 64 20 75 73 69 6e 67  n reserved using
54f0: 20 67 72 6f 77 56 54 72 61 6e 73 28 29 2e 0a 2a   growVTrans()..*
5500: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
5510: 64 54 6f 56 54 72 61 6e 73 28 73 71 6c 69 74 65  dToVTrans(sqlite
5520: 33 20 2a 64 62 2c 20 56 54 61 62 6c 65 20 2a 70  3 *db, VTable *p
5530: 56 54 61 62 29 7b 0a 20 20 2f 2a 20 41 64 64 20  VTab){.  /* Add 
5540: 70 56 74 61 62 20 74 6f 20 74 68 65 20 65 6e 64  pVtab to the end
5550: 20 6f 66 20 73 71 6c 69 74 65 33 2e 61 56 54 72   of sqlite3.aVTr
5560: 61 6e 73 20 2a 2f 0a 20 20 64 62 2d 3e 61 56 54  ans */.  db->aVT
5570: 72 61 6e 73 5b 64 62 2d 3e 6e 56 54 72 61 6e 73  rans[db->nVTrans
5580: 2b 2b 5d 20 3d 20 70 56 54 61 62 3b 0a 20 20 73  ++] = pVTab;.  s
5590: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 70  qlite3VtabLock(p
55a0: 56 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VTab);.}../*.** 
55b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
55c0: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
55d0: 76 64 62 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  vdbe to call the
55e0: 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 0a   xCreate method.
55f0: 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
5600: 6c 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 7a 54  l table named zT
5610: 61 62 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ab in database i
5620: 44 62 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  Db. .**.** If an
5630: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
5640: 70 7a 45 72 72 20 69 73 20 73 65 74 20 74 6f 20  pzErr is set to 
5650: 70 6f 69 6e 74 20 61 6e 20 61 6e 20 45 6e 67 6c  point an an Engl
5660: 69 73 68 20 6c 61 6e 67 75 61 67 65 0a 2a 2a 20  ish language.** 
5670: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
5680: 68 65 20 65 72 72 6f 72 20 61 6e 64 20 61 6e 20  he error and an 
5690: 53 51 4c 49 54 45 5f 58 58 58 20 65 72 72 6f 72  SQLITE_XXX error
56a0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
56b0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  d..** In this ca
56c0: 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  se the caller mu
56d0: 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 44  st call sqlite3D
56e0: 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 2a  bFree(db, ) on *
56f0: 70 7a 45 72 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pzErr..*/.int sq
5700: 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72 65  lite3VtabCallCre
5710: 61 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ate(sqlite3 *db,
5720: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5730: 63 68 61 72 20 2a 7a 54 61 62 2c 20 63 68 61 72  char *zTab, char
5740: 20 2a 2a 70 7a 45 72 72 29 7b 0a 20 20 69 6e 74   **pzErr){.  int
5750: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5760: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
5770: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 0a    Module *pMod;.
5780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
5790: 6f 64 3b 0a 0a 20 20 70 54 61 62 20 3d 20 73 71  od;..  pTab = sq
57a0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
57b0: 62 2c 20 7a 54 61 62 2c 20 64 62 2d 3e 61 44 62  b, zTab, db->aDb
57c0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
57d0: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
57e0: 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
57f0: 26 20 54 46 5f 56 69 72 74 75 61 6c 29 21 3d 30  & TF_Virtual)!=0
5800: 20 26 26 20 21 70 54 61 62 2d 3e 70 56 54 61 62   && !pTab->pVTab
5810: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  le );..  /* Loca
5820: 74 65 20 74 68 65 20 72 65 71 75 69 72 65 64 20  te the required 
5830: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
5840: 64 75 6c 65 20 2a 2f 0a 20 20 7a 4d 6f 64 20 3d  dule */.  zMod =
5850: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
5860: 72 67 5b 30 5d 3b 0a 20 20 70 4d 6f 64 20 3d 20  rg[0];.  pMod = 
5870: 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33  (Module*)sqlite3
5880: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d  HashFind(&db->aM
5890: 6f 64 75 6c 65 2c 20 7a 4d 6f 64 29 3b 0a 0a 20  odule, zMod);.. 
58a0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 6f 64 75 6c   /* If the modul
58b0: 65 20 68 61 73 20 62 65 65 6e 20 72 65 67 69 73  e has been regis
58c0: 74 65 72 65 64 20 61 6e 64 20 69 6e 63 6c 75 64  tered and includ
58d0: 65 73 20 61 20 43 72 65 61 74 65 20 6d 65 74 68  es a Create meth
58e0: 6f 64 2c 20 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  od, .  ** invoke
58f0: 20 69 74 20 6e 6f 77 2e 20 49 66 20 74 68 65 20   it now. If the 
5900: 6d 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74 20 62  module has not b
5910: 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 2c 20  een registered, 
5920: 72 65 74 75 72 6e 20 61 6e 20 0a 20 20 2a 2a 20  return an .  ** 
5930: 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
5940: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
5950: 2a 2f 0a 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30  */.  if( pMod==0
5960: 20 7c 7c 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c   || pMod->pModul
5970: 65 2d 3e 78 43 72 65 61 74 65 3d 3d 30 20 7c 7c  e->xCreate==0 ||
5980: 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e   pMod->pModule->
5990: 78 44 65 73 74 72 6f 79 3d 3d 30 20 29 7b 0a 20  xDestroy==0 ){. 
59a0: 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
59b0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
59c0: 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20  no such module: 
59d0: 25 73 22 2c 20 7a 4d 6f 64 29 3b 0a 20 20 20 20  %s", zMod);.    
59e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
59f0: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
5a00: 72 63 20 3d 20 76 74 61 62 43 61 6c 6c 43 6f 6e  rc = vtabCallCon
5a10: 73 74 72 75 63 74 6f 72 28 64 62 2c 20 70 54 61  structor(db, pTa
5a20: 62 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64 2d 3e 70  b, pMod, pMod->p
5a30: 4d 6f 64 75 6c 65 2d 3e 78 43 72 65 61 74 65 2c  Module->xCreate,
5a40: 20 70 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a 20 20   pzErr);.  }..  
5a50: 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e  /* Justification
5a60: 20 6f 66 20 41 4c 57 41 59 53 28 29 3a 20 20 54   of ALWAYS():  T
5a70: 68 65 20 78 43 6f 6e 73 74 72 75 63 74 6f 72 20  he xConstructor 
5a80: 6d 65 74 68 6f 64 20 69 73 20 72 65 71 75 69 72  method is requir
5a90: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
5aa0: 65 20 61 20 76 61 6c 69 64 20 73 71 6c 69 74 65  e a valid sqlite
5ab0: 33 5f 76 74 61 62 20 69 66 20 69 74 20 72 65 74  3_vtab if it ret
5ac0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
5ad0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
5ae0: 49 54 45 5f 4f 4b 20 26 26 20 41 4c 57 41 59 53  ITE_OK && ALWAYS
5af0: 28 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  (sqlite3GetVTabl
5b00: 65 28 64 62 2c 20 70 54 61 62 29 29 20 29 7b 0a  e(db, pTab)) ){.
5b10: 20 20 20 20 72 63 20 3d 20 67 72 6f 77 56 54 72      rc = growVTr
5b20: 61 6e 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ans(db);.    if(
5b30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5b40: 7b 0a 20 20 20 20 20 20 61 64 64 54 6f 56 54 72  {.      addToVTr
5b50: 61 6e 73 28 64 62 2c 20 73 71 6c 69 74 65 33 47  ans(db, sqlite3G
5b60: 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
5b70: 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  b));.    }.  }..
5b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5b90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
5ba0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
5bb0: 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  et the schema of
5bc0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
5bd0: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a  .  It is only.**
5be0: 20 76 61 6c 69 64 20 74 6f 20 63 61 6c 6c 20 74   valid to call t
5bf0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  his function fro
5c00: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78 43 72  m within the xCr
5c10: 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e 6e 65  eate() or xConne
5c20: 63 74 28 29 20 6f 66 20 61 0a 2a 2a 20 76 69 72  ct() of a.** vir
5c30: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
5c40: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5c50: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 73  3_declare_vtab(s
5c60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5c70: 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 54  t char *zCreateT
5c80: 61 62 6c 65 29 7b 0a 20 20 56 74 61 62 43 74 78  able){.  VtabCtx
5c90: 20 2a 70 43 74 78 3b 0a 20 20 50 61 72 73 65 20   *pCtx;.  Parse 
5ca0: 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 72  *pParse;.  int r
5cb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5cc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5cd0: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
5ce0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5cf0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
5d00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
5d10: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
5d20: 7c 7c 20 7a 43 72 65 61 74 65 54 61 62 6c 65 3d  || zCreateTable=
5d30: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5d40: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
5d50: 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
5d60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5d70: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
5d80: 3b 0a 20 20 70 43 74 78 20 3d 20 64 62 2d 3e 70  ;.  pCtx = db->p
5d90: 56 74 61 62 43 74 78 3b 0a 20 20 69 66 28 20 21  VtabCtx;.  if( !
5da0: 70 43 74 78 20 7c 7c 20 70 43 74 78 2d 3e 62 44  pCtx || pCtx->bD
5db0: 65 63 6c 61 72 65 64 20 29 7b 0a 20 20 20 20 73  eclared ){.    s
5dc0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
5dd0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 3b 0a  SQLITE_MISUSE);.
5de0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
5df0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
5e00: 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  x);.    return S
5e10: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
5e20: 54 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  T;.  }.  pTab = 
5e30: 70 43 74 78 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pCtx->pTab;.  as
5e40: 73 65 72 74 28 20 28 70 54 61 62 2d 3e 74 61 62  sert( (pTab->tab
5e50: 46 6c 61 67 73 20 26 20 54 46 5f 56 69 72 74 75  Flags & TF_Virtu
5e60: 61 6c 29 21 3d 30 20 29 3b 0a 0a 20 20 70 50 61  al)!=0 );..  pPa
5e70: 72 73 65 20 3d 20 73 71 6c 69 74 65 33 53 74 61  rse = sqlite3Sta
5e80: 63 6b 41 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  ckAllocZero(db, 
5e90: 73 69 7a 65 6f 66 28 2a 70 50 61 72 73 65 29 29  sizeof(*pParse))
5ea0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ;.  if( pParse==
5eb0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
5ec0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
5ed0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
5ee0: 3e 64 65 63 6c 61 72 65 56 74 61 62 20 3d 20 31  >declareVtab = 1
5ef0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  ;.    pParse->db
5f00: 20 3d 20 64 62 3b 0a 20 20 20 20 70 50 61 72 73   = db;.    pPars
5f10: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
5f20: 31 3b 0a 20 20 0a 20 20 20 20 69 66 28 20 53 51  1;.  .    if( SQ
5f30: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
5f40: 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73 65  RunParser(pParse
5f50: 2c 20 7a 43 72 65 61 74 65 54 61 62 6c 65 2c 20  , zCreateTable, 
5f60: 26 7a 45 72 72 29 20 0a 20 20 20 20 20 26 26 20  &zErr) .     && 
5f70: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5f80: 65 0a 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d  e.     && !db->m
5f90: 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20  allocFailed.    
5fa0: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 70 4e 65   && !pParse->pNe
5fb0: 77 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 0a  wTable->pSelect.
5fc0: 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d       && (pParse-
5fd0: 3e 70 4e 65 77 54 61 62 6c 65 2d 3e 74 61 62 46  >pNewTable->tabF
5fe0: 6c 61 67 73 20 26 20 54 46 5f 56 69 72 74 75 61  lags & TF_Virtua
5ff0: 6c 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  l)==0.    ){.   
6000: 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e 61 43     if( !pTab->aC
6010: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ol ){.        pT
6020: 61 62 2d 3e 61 43 6f 6c 20 3d 20 70 50 61 72 73  ab->aCol = pPars
6030: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2d 3e 61 43  e->pNewTable->aC
6040: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  ol;.        pTab
6050: 2d 3e 6e 43 6f 6c 20 3d 20 70 50 61 72 73 65 2d  ->nCol = pParse-
6060: 3e 70 4e 65 77 54 61 62 6c 65 2d 3e 6e 43 6f 6c  >pNewTable->nCol
6070: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
6080: 2d 3e 70 4e 65 77 54 61 62 6c 65 2d 3e 6e 43 6f  ->pNewTable->nCo
6090: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
60a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
60b0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
60c0: 20 20 7d 0a 20 20 20 20 20 20 70 43 74 78 2d 3e    }.      pCtx->
60d0: 62 44 65 63 6c 61 72 65 64 20 3d 20 31 3b 0a 20  bDeclared = 1;. 
60e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
60f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
6100: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45  Msg(db, SQLITE_E
6110: 52 52 4f 52 2c 20 28 7a 45 72 72 20 3f 20 22 25  RROR, (zErr ? "%
6120: 73 22 20 3a 20 30 29 2c 20 7a 45 72 72 29 3b 0a  s" : 0), zErr);.
6130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
6140: 72 65 65 28 64 62 2c 20 7a 45 72 72 29 3b 0a 20  ree(db, zErr);. 
6150: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6160: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6170: 20 20 70 50 61 72 73 65 2d 3e 64 65 63 6c 61 72    pParse->declar
6180: 65 56 74 61 62 20 3d 20 30 3b 0a 20 20 0a 20 20  eVtab = 0;.  .  
6190: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
61a0: 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dbe ){.      sql
61b0: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
61c0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b  (pParse->pVdbe);
61d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
61e0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
61f0: 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  , pParse->pNewTa
6200: 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ble);.    sqlite
6210: 33 50 61 72 73 65 72 52 65 73 65 74 28 70 50 61  3ParserReset(pPa
6220: 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rse);.    sqlite
6230: 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70  3StackFree(db, p
6240: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 61  Parse);.  }..  a
6250: 73 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29  ssert( (rc&0xff)
6260: 3d 3d 72 63 20 29 3b 0a 20 20 72 63 20 3d 20 73  ==rc );.  rc = s
6270: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
6280: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
6290: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
62a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
62b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
62c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
62d0: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 76  invoked by the v
62e0: 64 62 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20  dbe to call the 
62f0: 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a  xDestroy method.
6300: 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
6310: 6c 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 7a 54  l table named zT
6320: 61 62 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ab in database i
6330: 44 62 2e 20 54 68 69 73 20 6f 63 63 75 72 73 0a  Db. This occurs.
6340: 2a 2a 20 77 68 65 6e 20 61 20 44 52 4f 50 20 54  ** when a DROP T
6350: 41 42 4c 45 20 69 73 20 6d 65 6e 74 69 6f 6e 65  ABLE is mentione
6360: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  d..**.** This ca
6370: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
6380: 20 7a 54 61 62 20 69 73 20 6e 6f 74 20 61 20 76   zTab is not a v
6390: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
63a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62  .int sqlite3Vtab
63b0: 43 61 6c 6c 44 65 73 74 72 6f 79 28 73 71 6c 69  CallDestroy(sqli
63c0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
63d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
63e0: 61 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ab){.  int rc = 
63f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 61 62  SQLITE_OK;.  Tab
6400: 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 70 54 61  le *pTab;..  pTa
6410: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
6420: 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 2c 20 64  able(db, zTab, d
6430: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
6440: 65 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  e);.  if( ALWAYS
6450: 28 70 54 61 62 21 3d 30 20 26 26 20 70 54 61 62  (pTab!=0 && pTab
6460: 2d 3e 70 56 54 61 62 6c 65 21 3d 30 29 20 29 7b  ->pVTable!=0) ){
6470: 0a 20 20 20 20 56 54 61 62 6c 65 20 2a 70 3b 0a  .    VTable *p;.
6480: 20 20 20 20 69 6e 74 20 28 2a 78 44 65 73 74 72      int (*xDestr
6490: 6f 79 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  oy)(sqlite3_vtab
64a0: 20 2a 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *);.    for(p=p
64b0: 54 61 62 2d 3e 70 56 54 61 62 6c 65 3b 20 70 3b  Tab->pVTable; p;
64c0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
64d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
64e0: 56 74 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  Vtab );.      if
64f0: 28 20 70 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  ( p->pVtab->nRef
6500: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  >0 ){.        re
6510: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
6520: 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
6530: 7d 0a 20 20 20 20 70 20 3d 20 76 74 61 62 44 69  }.    p = vtabDi
6540: 73 63 6f 6e 6e 65 63 74 41 6c 6c 28 64 62 2c 20  sconnectAll(db, 
6550: 70 54 61 62 29 3b 0a 20 20 20 20 78 44 65 73 74  pTab);.    xDest
6560: 72 6f 79 20 3d 20 70 2d 3e 70 4d 6f 64 2d 3e 70  roy = p->pMod->p
6570: 4d 6f 64 75 6c 65 2d 3e 78 44 65 73 74 72 6f 79  Module->xDestroy
6580: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 44  ;.    assert( xD
6590: 65 73 74 72 6f 79 21 3d 30 20 29 3b 20 20 2f 2a  estroy!=0 );  /*
65a0: 20 43 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   Checked before 
65b0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
65c0: 65 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a  e is created */.
65d0: 20 20 20 20 72 63 20 3d 20 78 44 65 73 74 72 6f      rc = xDestro
65e0: 79 28 70 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20  y(p->pVtab);.   
65f0: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
6600: 71 6c 69 74 65 33 5f 76 74 61 62 2a 20 66 72 6f  qlite3_vtab* fro
6610: 6d 20 74 68 65 20 61 56 54 72 61 6e 73 5b 5d 20  m the aVTrans[] 
6620: 61 72 72 61 79 2c 20 69 66 20 61 70 70 6c 69 63  array, if applic
6630: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  able */.    if( 
6640: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6650: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6660: 54 61 62 2d 3e 70 56 54 61 62 6c 65 3d 3d 70 20  Tab->pVTable==p 
6670: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  && p->pNext==0 )
6680: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 74 61 62  ;.      p->pVtab
6690: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
66a0: 2d 3e 70 56 54 61 62 6c 65 20 3d 20 30 3b 0a 20  ->pVTable = 0;. 
66b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
66c0: 55 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 20 20 7d  Unlock(p);.    }
66d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
66e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
66f0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
6700: 73 20 65 69 74 68 65 72 20 74 68 65 20 78 52 6f  s either the xRo
6710: 6c 6c 62 61 63 6b 20 6f 72 20 78 43 6f 6d 6d 69  llback or xCommi
6720: 74 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 65  t method.** of e
6730: 61 63 68 20 6f 66 20 74 68 65 20 76 69 72 74 75  ach of the virtu
6740: 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  al tables in the
6750: 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e 73   sqlite3.aVTrans
6760: 20 61 72 72 61 79 2e 20 54 68 65 20 6d 65 74 68   array. The meth
6770: 6f 64 0a 2a 2a 20 63 61 6c 6c 65 64 20 69 73 20  od.** called is 
6780: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
6790: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
67a0: 74 2c 20 22 6f 66 66 73 65 74 22 2c 20 77 68 69  t, "offset", whi
67b0: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 6f 66 66  ch is.** the off
67c0: 73 65 74 20 6f 66 20 74 68 65 20 6d 65 74 68 6f  set of the metho
67d0: 64 20 74 6f 20 63 61 6c 6c 20 69 6e 20 74 68 65  d to call in the
67e0: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
67f0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
6800: 20 54 68 65 20 61 72 72 61 79 20 69 73 20 63 6c   The array is cl
6810: 65 61 72 65 64 20 61 66 74 65 72 20 69 6e 76 6f  eared after invo
6820: 6b 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  king the callbac
6830: 6b 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ks. .*/.static v
6840: 6f 69 64 20 63 61 6c 6c 46 69 6e 61 6c 69 73 65  oid callFinalise
6850: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  r(sqlite3 *db, i
6860: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 69 6e  nt offset){.  in
6870: 74 20 69 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  t i;.  if( db->a
6880: 56 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 56 54  VTrans ){.    VT
6890: 61 62 6c 65 20 2a 2a 61 56 54 72 61 6e 73 20 3d  able **aVTrans =
68a0: 20 64 62 2d 3e 61 56 54 72 61 6e 73 3b 0a 20 20   db->aVTrans;.  
68b0: 20 20 64 62 2d 3e 61 56 54 72 61 6e 73 20 3d 20    db->aVTrans = 
68c0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
68d0: 69 3c 64 62 2d 3e 6e 56 54 72 61 6e 73 3b 20 69  i<db->nVTrans; i
68e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 54 61 62 6c  ++){.      VTabl
68f0: 65 20 2a 70 56 54 61 62 20 3d 20 61 56 54 72 61  e *pVTab = aVTra
6900: 6e 73 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ns[i];.      sql
6910: 69 74 65 33 5f 76 74 61 62 20 2a 70 20 3d 20 70  ite3_vtab *p = p
6920: 56 54 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  VTab->pVtab;.   
6930: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
6940: 20 20 20 20 69 6e 74 20 28 2a 78 29 28 73 71 6c      int (*x)(sql
6950: 69 74 65 33 5f 76 74 61 62 20 2a 29 3b 0a 20 20  ite3_vtab *);.  
6960: 20 20 20 20 20 20 78 20 3d 20 2a 28 69 6e 74 20        x = *(int 
6970: 28 2a 2a 29 28 73 71 6c 69 74 65 33 5f 76 74 61  (**)(sqlite3_vta
6980: 62 20 2a 29 29 28 28 63 68 61 72 20 2a 29 70 2d  b *))((char *)p-
6990: 3e 70 4d 6f 64 75 6c 65 20 2b 20 6f 66 66 73 65  >pModule + offse
69a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
69b0: 78 20 29 20 78 28 70 29 3b 0a 20 20 20 20 20 20  x ) x(p);.      
69c0: 7d 0a 20 20 20 20 20 20 70 56 54 61 62 2d 3e 69  }.      pVTab->i
69d0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
69e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
69f0: 55 6e 6c 6f 63 6b 28 70 56 54 61 62 29 3b 0a 20  Unlock(pVTab);. 
6a00: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6a10: 44 62 46 72 65 65 28 64 62 2c 20 61 56 54 72 61  DbFree(db, aVTra
6a20: 6e 73 29 3b 0a 20 20 20 20 64 62 2d 3e 6e 56 54  ns);.    db->nVT
6a30: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rans = 0;.  }.}.
6a40: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
6a50: 65 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f  e xSync method o
6a60: 66 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  f all virtual ta
6a70: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  bles in the sqli
6a80: 74 65 33 2e 61 56 54 72 61 6e 73 0a 2a 2a 20 61  te3.aVTrans.** a
6a90: 72 72 61 79 2e 20 52 65 74 75 72 6e 20 74 68 65  rray. Return the
6aa0: 20 65 72 72 6f 72 20 63 6f 64 65 20 66 6f 72 20   error code for 
6ab0: 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
6ac0: 74 68 61 74 20 6f 63 63 75 72 73 2c 20 6f 72 0a  that occurs, or.
6ad0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
6ae0: 61 6c 6c 20 78 53 79 6e 63 20 6f 70 65 72 61 74  all xSync operat
6af0: 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
6b00: 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ful..**.** If an
6b10: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
6b20: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6c 65 61  s available, lea
6b30: 76 65 20 69 74 20 69 6e 20 70 2d 3e 7a 45 72 72  ve it in p->zErr
6b40: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
6b50: 74 65 33 56 74 61 62 53 79 6e 63 28 73 71 6c 69  te3VtabSync(sqli
6b60: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
6b70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
6b80: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6b90: 3b 0a 20 20 56 54 61 62 6c 65 20 2a 2a 61 56 54  ;.  VTable **aVT
6ba0: 72 61 6e 73 20 3d 20 64 62 2d 3e 61 56 54 72 61  rans = db->aVTra
6bb0: 6e 73 3b 0a 0a 20 20 64 62 2d 3e 61 56 54 72 61  ns;..  db->aVTra
6bc0: 6e 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ns = 0;.  for(i=
6bd0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
6be0: 20 26 26 20 69 3c 64 62 2d 3e 6e 56 54 72 61 6e   && i<db->nVTran
6bf0: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  s; i++){.    int
6c00: 20 28 2a 78 29 28 73 71 6c 69 74 65 33 5f 76 74   (*x)(sqlite3_vt
6c10: 61 62 20 2a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ab *);.    sqlit
6c20: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
6c30: 20 61 56 54 72 61 6e 73 5b 69 5d 2d 3e 70 56 74   aVTrans[i]->pVt
6c40: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 56 74 61  ab;.    if( pVta
6c50: 62 20 26 26 20 28 78 20 3d 20 70 56 74 61 62 2d  b && (x = pVtab-
6c60: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 79 6e 63 29  >pModule->xSync)
6c70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
6c80: 3d 20 78 28 70 56 74 61 62 29 3b 0a 20 20 20 20  = x(pVtab);.    
6c90: 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
6ca0: 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
6cb0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
6cc0: 20 64 62 2d 3e 61 56 54 72 61 6e 73 20 3d 20 61   db->aVTrans = a
6cd0: 56 54 72 61 6e 73 3b 0a 20 20 72 65 74 75 72 6e  VTrans;.  return
6ce0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
6cf0: 76 6f 6b 65 20 74 68 65 20 78 52 6f 6c 6c 62 61  voke the xRollba
6d00: 63 6b 20 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c  ck method of all
6d10: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
6d20: 69 6e 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  in the .** sqlit
6d30: 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72 61 79  e3.aVTrans array
6d40: 2e 20 54 68 65 6e 20 63 6c 65 61 72 20 74 68 65  . Then clear the
6d50: 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e 0a 2a   array itself..*
6d60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61  /.int sqlite3Vta
6d70: 62 52 6f 6c 6c 62 61 63 6b 28 73 71 6c 69 74 65  bRollback(sqlite
6d80: 33 20 2a 64 62 29 7b 0a 20 20 63 61 6c 6c 46 69  3 *db){.  callFi
6d90: 6e 61 6c 69 73 65 72 28 64 62 2c 20 6f 66 66 73  naliser(db, offs
6da0: 65 74 6f 66 28 73 71 6c 69 74 65 33 5f 6d 6f 64  etof(sqlite3_mod
6db0: 75 6c 65 2c 78 52 6f 6c 6c 62 61 63 6b 29 29 3b  ule,xRollback));
6dc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6dd0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
6de0: 76 6f 6b 65 20 74 68 65 20 78 43 6f 6d 6d 69 74  voke the xCommit
6df0: 20 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c 20 76   method of all v
6e00: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
6e10: 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
6e20: 2e 61 56 54 72 61 6e 73 20 61 72 72 61 79 2e 20  .aVTrans array. 
6e30: 54 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 61  Then clear the a
6e40: 72 72 61 79 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  rray itself..*/.
6e50: 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 43  int sqlite3VtabC
6e60: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
6e70: 62 29 7b 0a 20 20 63 61 6c 6c 46 69 6e 61 6c 69  b){.  callFinali
6e80: 73 65 72 28 64 62 2c 20 6f 66 66 73 65 74 6f 66  ser(db, offsetof
6e90: 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 2c  (sqlite3_module,
6ea0: 78 43 6f 6d 6d 69 74 29 29 3b 0a 20 20 72 65 74  xCommit));.  ret
6eb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76  ../*.** If the v
6ed0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 70 56 74  irtual table pVt
6ee0: 61 62 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  ab supports the 
6ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 65  transaction inte
6f00: 72 66 61 63 65 0a 2a 2a 20 28 78 42 65 67 69 6e  rface.** (xBegin
6f10: 2f 78 52 6f 6c 6c 62 61 63 6b 2f 78 43 6f 6d 6d  /xRollback/xComm
6f20: 69 74 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c  it and optionall
6f30: 79 20 78 53 79 6e 63 29 20 61 6e 64 20 61 20 74  y xSync) and a t
6f40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
6f50: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f   not currently o
6f60: 70 65 6e 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  pen, invoke the 
6f70: 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20 6e 6f  xBegin method no
6f80: 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  w..**.** If the 
6f90: 78 42 65 67 69 6e 20 63 61 6c 6c 20 69 73 20 73  xBegin call is s
6fa0: 75 63 63 65 73 73 66 75 6c 2c 20 70 6c 61 63 65  uccessful, place
6fb0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61   the sqlite3_vta
6fc0: 62 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 6e 20  b pointer.** in 
6fd0: 74 68 65 20 73 71 6c 69 74 65 33 2e 61 56 54 72  the sqlite3.aVTr
6fe0: 61 6e 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 69 6e  ans array..*/.in
6ff0: 74 20 73 71 6c 69 74 65 33 56 74 61 62 42 65 67  t sqlite3VtabBeg
7000: 69 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  in(sqlite3 *db, 
7010: 56 54 61 62 6c 65 20 2a 70 56 54 61 62 29 7b 0a  VTable *pVTab){.
7020: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7030: 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 73 71  E_OK;.  const sq
7040: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
7050: 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 53 70 65  odule;..  /* Spe
7060: 63 69 61 6c 20 63 61 73 65 3a 20 49 66 20 64 62  cial case: If db
7070: 2d 3e 61 56 54 72 61 6e 73 20 69 73 20 4e 55 4c  ->aVTrans is NUL
7080: 4c 20 61 6e 64 20 64 62 2d 3e 6e 56 54 72 61 6e  L and db->nVTran
7090: 73 20 69 73 20 67 72 65 61 74 65 72 0a 20 20 2a  s is greater.  *
70a0: 2a 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  * than zero, the
70b0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
70c0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
70d0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 0a 20 20  from within a.  
70e0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
70f0: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
7100: 63 6b 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ck. It is illega
7110: 6c 20 74 6f 20 77 72 69 74 65 20 74 6f 20 0a 20  l to write to . 
7120: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
7130: 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 69  le tables in thi
7140: 73 20 63 61 73 65 2c 20 73 6f 20 72 65 74 75 72  s case, so retur
7150: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
7160: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
7170: 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
7180: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
7190: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
71a0: 20 7d 0a 20 20 69 66 28 20 21 70 56 54 61 62 20   }.  if( !pVTab 
71b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
71c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 20 0a 20 20  LITE_OK;.  } .  
71d0: 70 4d 6f 64 75 6c 65 20 3d 20 70 56 54 61 62 2d  pModule = pVTab-
71e0: 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  >pVtab->pModule;
71f0: 0a 0a 20 20 69 66 28 20 70 4d 6f 64 75 6c 65 2d  ..  if( pModule-
7200: 3e 78 42 65 67 69 6e 20 29 7b 0a 20 20 20 20 69  >xBegin ){.    i
7210: 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  nt i;..    /* If
7220: 20 70 56 74 61 62 20 69 73 20 61 6c 72 65 61 64   pVtab is alread
7230: 79 20 69 6e 20 74 68 65 20 61 56 54 72 61 6e 73  y in the aVTrans
7240: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 20 65   array, return e
7250: 61 72 6c 79 20 2a 2f 0a 20 20 20 20 66 6f 72 28  arly */.    for(
7260: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 56 54 72 61  i=0; i<db->nVTra
7270: 6e 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ns; i++){.      
7280: 69 66 28 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b  if( db->aVTrans[
7290: 69 5d 3d 3d 70 56 54 61 62 20 29 7b 0a 20 20 20  i]==pVTab ){.   
72a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
72b0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
72c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
72d0: 6f 6b 65 20 74 68 65 20 78 42 65 67 69 6e 20 6d  oke the xBegin m
72e0: 65 74 68 6f 64 2e 20 49 66 20 73 75 63 63 65 73  ethod. If succes
72f0: 73 66 75 6c 2c 20 61 64 64 20 74 68 65 20 76 74  sful, add the vt
7300: 61 62 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a  ab to the .    *
7310: 2a 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e  * sqlite3.aVTran
7320: 73 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  s[] array. */.  
7330: 20 20 72 63 20 3d 20 67 72 6f 77 56 54 72 61 6e    rc = growVTran
7340: 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  s(db);.    if( r
7350: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7360: 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75        rc = pModu
7370: 6c 65 2d 3e 78 42 65 67 69 6e 28 70 56 54 61 62  le->xBegin(pVTab
7380: 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20  ->pVtab);.      
7390: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
73a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  K ){.        add
73b0: 54 6f 56 54 72 61 6e 73 28 64 62 2c 20 70 56 54  ToVTrans(db, pVT
73c0: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
73d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
73e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  rc;.}../*.** Inv
73f0: 6f 6b 65 20 65 69 74 68 65 72 20 74 68 65 20 78  oke either the x
7400: 53 61 76 65 70 6f 69 6e 74 2c 20 78 52 6f 6c 6c  Savepoint, xRoll
7410: 62 61 63 6b 54 6f 20 6f 72 20 78 52 65 6c 65 61  backTo or xRelea
7420: 73 65 20 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c  se method of all
7430: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
7440: 65 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  es that currentl
7450: 79 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 74  y have an open t
7460: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 50 61 73 73  ransaction. Pass
7470: 20 69 53 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 61   iSavepoint.** a
7480: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7490: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 76 69 72  ument to the vir
74a0: 74 75 61 6c 20 74 61 62 6c 65 20 6d 65 74 68 6f  tual table metho
74b0: 64 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 0a 2a 2a  d invoked..**.**
74c0: 20 49 66 20 6f 70 20 69 73 20 53 41 56 45 50 4f   If op is SAVEPO
74d0: 49 4e 54 5f 42 45 47 49 4e 2c 20 74 68 65 20 78  INT_BEGIN, the x
74e0: 53 61 76 65 70 6f 69 6e 74 20 6d 65 74 68 6f 64  Savepoint method
74f0: 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49 66 20   is invoked. If 
7500: 69 74 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  it is.** SAVEPOI
7510: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
7520: 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 6d 65 74   xRollbackTo met
7530: 68 6f 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  hod. Otherwise, 
7540: 69 66 20 6f 70 20 69 73 20 0a 2a 2a 20 53 41 56  if op is .** SAV
7550: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
7560: 74 68 65 6e 20 74 68 65 20 78 52 65 6c 65 61 73  then the xReleas
7570: 65 20 6d 65 74 68 6f 64 20 6f 66 20 65 61 63 68  e method of each
7580: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
7590: 69 74 68 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 74  ith.** an open t
75a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6e  ransaction is in
75b0: 76 6f 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  voked..**.** If 
75c0: 61 6e 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c  any virtual tabl
75d0: 65 20 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73  e method returns
75e0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
75f0: 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
7600: 5f 4f 4b 2c 20 0a 2a 2a 20 70 72 6f 63 65 73 73  _OK, .** process
7610: 69 6e 67 20 69 73 20 61 62 61 6e 64 6f 6e 65 64  ing is abandoned
7620: 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 72   and the error r
7630: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
7640: 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 0a 2a 2a  aller of this.**
7650: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
7660: 61 74 65 6c 79 2e 20 49 66 20 61 6c 6c 20 63 61  ately. If all ca
7670: 6c 6c 73 20 74 6f 20 76 69 72 74 75 61 6c 20 74  lls to virtual t
7680: 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 61 72 65  able methods are
7690: 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
76a0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
76b0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
76c0: 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
76d0: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
76e0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
76f0: 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
7700: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
7710: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
7720: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 7c  VEPOINT_RELEASE|
7730: 7c 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  |op==SAVEPOINT_R
7740: 4f 4c 4c 42 41 43 4b 7c 7c 6f 70 3d 3d 53 41 56  OLLBACK||op==SAV
7750: 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 3b 0a  EPOINT_BEGIN );.
7760: 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
7770: 6f 69 6e 74 3e 3d 2d 31 20 29 3b 0a 20 20 69 66  oint>=-1 );.  if
7780: 28 20 64 62 2d 3e 61 56 54 72 61 6e 73 20 29 7b  ( db->aVTrans ){
7790: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
77a0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
77b0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
77c0: 6e 56 54 72 61 6e 73 3b 20 69 2b 2b 29 7b 0a 20  nVTrans; i++){. 
77d0: 20 20 20 20 20 56 54 61 62 6c 65 20 2a 70 56 54       VTable *pVT
77e0: 61 62 20 3d 20 64 62 2d 3e 61 56 54 72 61 6e 73  ab = db->aVTrans
77f0: 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  [i];.      const
7800: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
7810: 2a 70 4d 6f 64 20 3d 20 70 56 54 61 62 2d 3e 70  *pMod = pVTab->p
7820: 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  Mod->pModule;.  
7830: 20 20 20 20 69 66 28 20 70 56 54 61 62 2d 3e 70      if( pVTab->p
7840: 56 74 61 62 20 26 26 20 70 4d 6f 64 2d 3e 69 56  Vtab && pMod->iV
7850: 65 72 73 69 6f 6e 3e 3d 32 20 29 7b 0a 20 20 20  ersion>=2 ){.   
7860: 20 20 20 20 20 69 6e 74 20 28 2a 78 4d 65 74 68       int (*xMeth
7870: 6f 64 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  od)(sqlite3_vtab
7880: 20 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20   *, int);.      
7890: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
78a0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
78b0: 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 3a 0a  AVEPOINT_BEGIN:.
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 78 4d 65 74              xMet
78d0: 68 6f 64 20 3d 20 70 4d 6f 64 2d 3e 78 53 61 76  hod = pMod->xSav
78e0: 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20  epoint;.        
78f0: 20 20 20 20 70 56 54 61 62 2d 3e 69 53 61 76 65      pVTab->iSave
7900: 70 6f 69 6e 74 20 3d 20 69 53 61 76 65 70 6f 69  point = iSavepoi
7910: 6e 74 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  nt+1;.          
7920: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7930: 20 20 20 63 61 73 65 20 53 41 56 45 50 4f 49 4e     case SAVEPOIN
7940: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20  T_ROLLBACK:.    
7950: 20 20 20 20 20 20 20 20 78 4d 65 74 68 6f 64 20          xMethod 
7960: 3d 20 70 4d 6f 64 2d 3e 78 52 6f 6c 6c 62 61 63  = pMod->xRollbac
7970: 6b 54 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  kTo;.           
7980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7990: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
79a0: 20 20 20 20 20 20 20 78 4d 65 74 68 6f 64 20 3d         xMethod =
79b0: 20 70 4d 6f 64 2d 3e 78 52 65 6c 65 61 73 65 3b   pMod->xRelease;
79c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
79d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
79e0: 20 20 20 20 20 20 69 66 28 20 78 4d 65 74 68 6f        if( xMetho
79f0: 64 20 26 26 20 70 56 54 61 62 2d 3e 69 53 61 76  d && pVTab->iSav
7a00: 65 70 6f 69 6e 74 3e 69 53 61 76 65 70 6f 69 6e  epoint>iSavepoin
7a10: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
7a20: 63 20 3d 20 78 4d 65 74 68 6f 64 28 70 56 54 61  c = xMethod(pVTa
7a30: 62 2d 3e 70 56 74 61 62 2c 20 69 53 61 76 65 70  b->pVtab, iSavep
7a40: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
7a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7a60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  }../*.** The fir
7a80: 73 74 20 70 61 72 61 6d 65 74 65 72 20 28 70 44  st parameter (pD
7a90: 65 66 29 20 69 73 20 61 20 66 75 6e 63 74 69 6f  ef) is a functio
7aa0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
7ab0: 2e 20 20 54 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  .  The.** second
7ac0: 20 70 61 72 61 6d 65 74 65 72 20 28 70 45 78 70   parameter (pExp
7ad0: 72 29 20 69 73 20 74 68 65 20 66 69 72 73 74 20  r) is the first 
7ae0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
7af0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66   function..** If
7b00: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6c 75   pExpr is a colu
7b10: 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
7b20: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6c 65 74 20  table, then let 
7b30: 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
7b40: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
7b50: 69 6f 6e 20 68 61 76 65 20 61 6e 20 6f 70 70 6f  ion have an oppo
7b60: 72 74 75 6e 69 74 79 20 74 6f 20 6f 76 65 72 6c  rtunity to overl
7b70: 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
7b80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7b90: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
7ba0: 61 6c 6c 6f 77 20 76 69 72 74 75 61 6c 20 74 61  allow virtual ta
7bb0: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
7bc0: 6f 6e 73 20 74 6f 0a 2a 2a 20 6f 76 65 72 6c 6f  ons to.** overlo
7bd0: 61 64 20 4d 41 54 43 48 2c 20 4c 49 4b 45 2c 20  ad MATCH, LIKE, 
7be0: 47 4c 4f 42 2c 20 61 6e 64 20 52 45 47 45 58 50  GLOB, and REGEXP
7bf0: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   operators..**.*
7c00: 2a 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  * Return either 
7c10: 74 68 65 20 70 44 65 66 20 61 72 67 75 6d 65 6e  the pDef argumen
7c20: 74 20 28 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  t (indicating no
7c30: 20 63 68 61 6e 67 65 29 20 6f 72 20 61 20 0a 2a   change) or a .*
7c40: 2a 20 6e 65 77 20 46 75 6e 63 44 65 66 20 73 74  * new FuncDef st
7c50: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
7c60: 6d 61 72 6b 65 64 20 61 73 20 65 70 68 65 6d 65  marked as epheme
7c70: 72 61 6c 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ral using the.**
7c80: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
7c90: 45 4d 20 66 6c 61 67 2e 0a 2a 2f 0a 46 75 6e 63  EM flag..*/.Func
7ca0: 44 65 66 20 2a 73 71 6c 69 74 65 33 56 74 61 62  Def *sqlite3Vtab
7cb0: 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
7cc0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7cd0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7ce0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 72  connection for r
7cf0: 65 70 6f 72 74 69 6e 67 20 6d 61 6c 6c 6f 63 20  eporting malloc 
7d00: 70 72 6f 62 6c 65 6d 73 20 2a 2f 0a 20 20 46 75  problems */.  Fu
7d10: 6e 63 44 65 66 20 2a 70 44 65 66 2c 20 20 2f 2a  ncDef *pDef,  /*
7d20: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 70 6f 73   Function to pos
7d30: 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 2a  sibly overload *
7d40: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
7d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7d60: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
7d70: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
7d80: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
7d90: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
7da0: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
7db0: 6e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  n */.){.  Table 
7dc0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
7dd0: 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20  _vtab *pVtab;.  
7de0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
7df0: 70 4d 6f 64 3b 0a 20 20 76 6f 69 64 20 28 2a 78  pMod;.  void (*x
7e00: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
7e10: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
7e20: 65 33 5f 76 61 6c 75 65 2a 2a 29 20 3d 20 30 3b  e3_value**) = 0;
7e30: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20  .  void *pArg = 
7e40: 30 3b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 4e  0;.  FuncDef *pN
7e50: 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ew;.  int rc = 0
7e60: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 77 65 72  ;.  char *zLower
7e70: 4e 61 6d 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Name;.  unsigned
7e80: 20 63 68 61 72 20 2a 7a 3b 0a 0a 0a 20 20 2f 2a   char *z;...  /*
7e90: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   Check to see th
7ea0: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 69  e left operand i
7eb0: 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
7ec0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
7ed0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
7ee0: 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  pr==0) ) return 
7ef0: 70 44 65 66 3b 0a 20 20 69 66 28 20 70 45 78 70  pDef;.  if( pExp
7f00: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
7f10: 20 29 20 72 65 74 75 72 6e 20 70 44 65 66 3b 0a   ) return pDef;.
7f20: 20 20 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e    pTab = pExpr->
7f30: 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56 45  pTab;.  if( NEVE
7f40: 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65 74  R(pTab==0) ) ret
7f50: 75 72 6e 20 70 44 65 66 3b 0a 20 20 69 66 28 20  urn pDef;.  if( 
7f60: 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
7f70: 26 20 54 46 5f 56 69 72 74 75 61 6c 29 3d 3d 30  & TF_Virtual)==0
7f80: 20 29 20 72 65 74 75 72 6e 20 70 44 65 66 3b 0a   ) return pDef;.
7f90: 20 20 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65    pVtab = sqlite
7fa0: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
7fb0: 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 61  Tab)->pVtab;.  a
7fc0: 73 73 65 72 74 28 20 70 56 74 61 62 21 3d 30 20  ssert( pVtab!=0 
7fd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 74  );.  assert( pVt
7fe0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 21 3d 30 20 29  ab->pModule!=0 )
7ff0: 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 73 71 6c 69  ;.  pMod = (sqli
8000: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74  te3_module *)pVt
8010: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 69  ab->pModule;.  i
8020: 66 28 20 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75  f( pMod->xFindFu
8030: 6e 63 74 69 6f 6e 3d 3d 30 20 29 20 72 65 74 75  nction==0 ) retu
8040: 72 6e 20 70 44 65 66 3b 0a 20 0a 20 20 2f 2a 20  rn pDef;. .  /* 
8050: 43 61 6c 6c 20 74 68 65 20 78 46 69 6e 64 46 75  Call the xFindFu
8060: 6e 63 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 6e  nction method on
8070: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
8080: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
8090: 6e 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  n.  ** to see if
80a0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
80b0: 69 6f 6e 20 77 61 6e 74 73 20 74 6f 20 6f 76 65  ion wants to ove
80c0: 72 6c 6f 61 64 20 74 68 69 73 20 66 75 6e 63 74  rload this funct
80d0: 69 6f 6e 20 0a 20 20 2a 2f 0a 20 20 7a 4c 6f 77  ion .  */.  zLow
80e0: 65 72 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  erName = sqlite3
80f0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 44 65  DbStrDup(db, pDe
8100: 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  f->zName);.  if(
8110: 20 7a 4c 6f 77 65 72 4e 61 6d 65 20 29 7b 0a 20   zLowerName ){. 
8120: 20 20 20 66 6f 72 28 7a 3d 28 75 6e 73 69 67 6e     for(z=(unsign
8130: 65 64 20 63 68 61 72 2a 29 7a 4c 6f 77 65 72 4e  ed char*)zLowerN
8140: 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ame; *z; z++){. 
8150: 20 20 20 20 20 2a 7a 20 3d 20 73 71 6c 69 74 65       *z = sqlite
8160: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a  3UpperToLower[*z
8170: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  ];.    }.    rc 
8180: 3d 20 70 4d 6f 64 2d 3e 78 46 69 6e 64 46 75 6e  = pMod->xFindFun
8190: 63 74 69 6f 6e 28 70 56 74 61 62 2c 20 6e 41 72  ction(pVtab, nAr
81a0: 67 2c 20 7a 4c 6f 77 65 72 4e 61 6d 65 2c 20 26  g, zLowerName, &
81b0: 78 46 75 6e 63 2c 20 26 70 41 72 67 29 3b 0a 20  xFunc, &pArg);. 
81c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
81d0: 28 64 62 2c 20 7a 4c 6f 77 65 72 4e 61 6d 65 29  (db, zLowerName)
81e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
81f0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8200: 70 44 65 66 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pDef;.  }..  /* 
8210: 43 72 65 61 74 65 20 61 20 6e 65 77 20 65 70 68  Create a new eph
8220: 65 6d 65 72 61 6c 20 66 75 6e 63 74 69 6f 6e 20  emeral function 
8230: 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
8240: 68 65 20 6f 76 65 72 6c 6f 61 64 65 64 0a 20 20  he overloaded.  
8250: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ** function */. 
8260: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8270: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
8280: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 0a 20 20  sizeof(*pNew).  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 71 6c             + sql
82b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65  ite3Strlen30(pDe
82c0: 66 2d 3e 7a 4e 61 6d 65 29 20 2b 20 31 29 3b 0a  f->zName) + 1);.
82d0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
82e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 44 65 66  .    return pDef
82f0: 3b 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 20 3d 20  ;.  }.  *pNew = 
8300: 2a 70 44 65 66 3b 0a 20 20 70 4e 65 77 2d 3e 7a  *pDef;.  pNew->z
8310: 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26  Name = (char *)&
8320: 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70  pNew[1];.  memcp
8330: 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 70  y(pNew->zName, p
8340: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69  Def->zName, sqli
8350: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 66  te3Strlen30(pDef
8360: 2d 3e 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 70  ->zName)+1);.  p
8370: 4e 65 77 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75  New->xFunc = xFu
8380: 6e 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 73 65  nc;.  pNew->pUse
8390: 72 44 61 74 61 20 3d 20 70 41 72 67 3b 0a 20 20  rData = pArg;.  
83a0: 70 4e 65 77 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pNew->funcFlags 
83b0: 7c 3d 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45  |= SQLITE_FUNC_E
83c0: 50 48 45 4d 3b 0a 20 20 72 65 74 75 72 6e 20 70  PHEM;.  return p
83d0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  New;.}../*.** Ma
83e0: 6b 65 20 73 75 72 65 20 76 69 72 74 75 61 6c 20  ke sure virtual 
83f0: 74 61 62 6c 65 20 70 54 61 62 20 69 73 20 63 6f  table pTab is co
8400: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 70  ntained in the p
8410: 50 61 72 73 65 2d 3e 61 70 56 69 72 74 75 61 6c  Parse->apVirtual
8420: 4c 6f 63 6b 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  Lock[].** array 
8430: 73 6f 20 74 68 61 74 20 61 6e 20 4f 50 5f 56 42  so that an OP_VB
8440: 65 67 69 6e 20 77 69 6c 6c 20 67 65 74 20 67 65  egin will get ge
8450: 6e 65 72 61 74 65 64 20 66 6f 72 20 69 74 2e 20  nerated for it. 
8460: 20 41 64 64 20 70 54 61 62 20 74 6f 20 74 68 65   Add pTab to the
8470: 0a 2a 2a 20 61 72 72 61 79 20 69 66 20 69 74 20  .** array if it 
8480: 69 73 20 6d 69 73 73 69 6e 67 2e 20 20 49 66 20  is missing.  If 
8490: 70 54 61 62 20 69 73 20 61 6c 72 65 61 64 79 20  pTab is already 
84a0: 69 6e 20 74 68 65 20 61 72 72 61 79 2c 20 74 68  in the array, th
84b0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
84c0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69   a no-op..*/.voi
84d0: 64 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61 6b  d sqlite3VtabMak
84e0: 65 57 72 69 74 61 62 6c 65 28 50 61 72 73 65 20  eWritable(Parse 
84f0: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
8500: 70 54 61 62 29 7b 0a 20 20 50 61 72 73 65 20 2a  pTab){.  Parse *
8510: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
8520: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
8530: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
8540: 69 2c 20 6e 3b 0a 20 20 54 61 62 6c 65 20 2a 2a  i, n;.  Table **
8550: 61 70 56 74 61 62 4c 6f 63 6b 3b 0a 0a 20 20 61  apVtabLock;..  a
8560: 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c  ssert( IsVirtual
8570: 28 70 54 61 62 29 20 29 3b 0a 20 20 66 6f 72 28  (pTab) );.  for(
8580: 69 3d 30 3b 20 69 3c 70 54 6f 70 6c 65 76 65 6c  i=0; i<pToplevel
8590: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b  ->nVtabLock; i++
85a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  ){.    if( pTab=
85b0: 3d 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70 56 74  =pToplevel->apVt
85c0: 61 62 4c 6f 63 6b 5b 69 5d 20 29 20 72 65 74 75  abLock[i] ) retu
85d0: 72 6e 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 28 70  rn;.  }.  n = (p
85e0: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 56 74 61 62 4c  Toplevel->nVtabL
85f0: 6f 63 6b 2b 31 29 2a 73 69 7a 65 6f 66 28 70 54  ock+1)*sizeof(pT
8600: 6f 70 6c 65 76 65 6c 2d 3e 61 70 56 74 61 62 4c  oplevel->apVtabL
8610: 6f 63 6b 5b 30 5d 29 3b 0a 20 20 61 70 56 74 61  ock[0]);.  apVta
8620: 62 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  bLock = sqlite3_
8630: 72 65 61 6c 6c 6f 63 36 34 28 70 54 6f 70 6c 65  realloc64(pTople
8640: 76 65 6c 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 2c  vel->apVtabLock,
8650: 20 6e 29 3b 0a 20 20 69 66 28 20 61 70 56 74 61   n);.  if( apVta
8660: 62 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 54 6f  bLock ){.    pTo
8670: 70 6c 65 76 65 6c 2d 3e 61 70 56 74 61 62 4c 6f  plevel->apVtabLo
8680: 63 6b 20 3d 20 61 70 56 74 61 62 4c 6f 63 6b 3b  ck = apVtabLock;
8690: 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  .    pToplevel->
86a0: 61 70 56 74 61 62 4c 6f 63 6b 5b 70 54 6f 70 6c  apVtabLock[pTopl
86b0: 65 76 65 6c 2d 3e 6e 56 74 61 62 4c 6f 63 6b 2b  evel->nVtabLock+
86c0: 2b 5d 20 3d 20 70 54 61 62 3b 0a 20 20 7d 65 6c  +] = pTab;.  }el
86d0: 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65  se{.    pTopleve
86e0: 6c 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  l->db->mallocFai
86f0: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  led = 1;.  }.}..
8700: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
8710: 65 65 20 69 66 20 76 69 72 74 75 61 6c 20 74 61  ee if virtual ta
8720: 6c 65 20 6d 6f 64 75 6c 65 20 70 4d 6f 64 20 63  le module pMod c
8730: 61 6e 20 62 65 20 68 61 76 65 20 61 6e 20 65 70  an be have an ep
8740: 6f 6e 79 6d 6f 75 73 0a 2a 2a 20 76 69 72 74 75  onymous.** virtu
8750: 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 61 6e 63  al table instanc
8760: 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 63  e.  If it can, c
8770: 72 65 61 74 65 20 6f 6e 65 20 69 66 20 6f 6e 65  reate one if one
8780: 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
8790: 79 0a 2a 2a 20 65 78 69 73 74 2e 20 52 65 74 75  y.** exist. Retu
87a0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
87b0: 68 65 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  he eponymous vir
87c0: 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 61  tual table insta
87d0: 6e 63 65 20 65 78 69 73 74 73 0a 2a 2a 20 77 68  nce exists.** wh
87e0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
87f0: 72 65 74 75 72 6e 73 2c 20 61 6e 64 20 72 65 74  returns, and ret
8800: 75 72 6e 20 7a 65 72 6f 20 69 66 20 69 74 20 64  urn zero if it d
8810: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
8820: 2a 0a 2a 2a 20 41 6e 20 65 70 6f 6e 79 6d 6f 75  *.** An eponymou
8830: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
8840: 69 6e 73 74 61 6e 63 65 20 69 73 20 6f 6e 65 20  instance is one 
8850: 74 68 61 74 20 69 73 20 6e 61 6d 65 64 20 61 66  that is named af
8860: 74 65 72 20 69 74 73 0a 2a 2a 20 6d 6f 64 75 6c  ter its.** modul
8870: 65 2c 20 61 6e 64 20 6d 6f 72 65 20 69 6d 70 6f  e, and more impo
8880: 72 74 61 6e 74 6c 79 2c 20 64 6f 65 73 20 6e 6f  rtantly, does no
8890: 74 20 72 65 71 75 69 72 65 20 61 20 43 52 45 41  t require a CREA
88a0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
88b0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  .** statement in
88c0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 65 20 69   order to come i
88d0: 6e 74 6f 20 65 78 69 73 74 61 6e 63 65 2e 20 20  nto existance.  
88e0: 45 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  Eponymous virtua
88f0: 6c 20 74 61 62 6c 65 0a 2a 2a 20 69 6e 73 74 61  l table.** insta
8900: 6e 63 65 73 20 61 6c 77 61 79 73 20 65 78 69 73  nces always exis
8910: 74 2e 20 20 54 68 65 79 20 63 61 6e 6e 6f 74 20  t.  They cannot 
8920: 62 65 20 44 52 4f 50 2d 65 64 2e 0a 2a 2a 0a 2a  be DROP-ed..**.*
8930: 2a 20 41 6e 79 20 76 69 72 74 75 61 6c 20 74 61  * Any virtual ta
8940: 62 6c 65 20 6d 6f 64 75 6c 65 20 66 6f 72 20 77  ble module for w
8950: 68 69 63 68 20 78 43 6f 6e 6e 65 63 74 20 61 6e  hich xConnect an
8960: 64 20 78 43 72 65 61 74 65 20 61 72 65 20 74 68  d xCreate are th
8970: 65 20 73 61 6d 65 0a 2a 2a 20 6d 65 74 68 6f 64  e same.** method
8980: 20 63 61 6e 20 68 61 76 65 20 61 6e 20 65 70 6f   can have an epo
8990: 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74  nymous virtual t
89a0: 61 62 6c 65 20 69 6e 73 74 61 6e 63 65 2e 0a 2a  able instance..*
89b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61  /.int sqlite3Vta
89c0: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
89d0: 6e 69 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  nit(Parse *pPars
89e0: 65 2c 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 29  e, Module *pMod)
89f0: 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
8a00: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
8a10: 65 20 3d 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  e = pMod->pModul
8a20: 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  e;.  Table *pTab
8a30: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
8a40: 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   0;.  int nName;
8a50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
8a60: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8a70: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4d 6f  e->db;.  if( pMo
8a80: 64 2d 3e 70 45 70 6f 54 61 62 20 29 20 72 65 74  d->pEpoTab ) ret
8a90: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4d 6f  urn 1;.  if( pMo
8aa0: 64 75 6c 65 2d 3e 78 43 72 65 61 74 65 21 3d 30  dule->xCreate!=0
8ab0: 20 26 26 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 72   && pModule->xCr
8ac0: 65 61 74 65 21 3d 70 4d 6f 64 75 6c 65 2d 3e 78  eate!=pModule->x
8ad0: 43 6f 6e 6e 65 63 74 20 29 20 72 65 74 75 72 6e  Connect ) return
8ae0: 20 30 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   0;.  nName = sq
8af0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
8b00: 6f 64 2d 3e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  od->zName) + 1;.
8b10: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
8b20: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
8b30: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 2b   sizeof(Table) +
8b40: 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   nName);.  if( p
8b50: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
8b60: 30 3b 0a 20 20 70 4d 6f 64 2d 3e 70 45 70 6f 54  0;.  pMod->pEpoT
8b70: 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 70 54 61  ab = pTab;.  pTa
8b80: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  b->zName = (char
8b90: 2a 29 26 70 54 61 62 5b 31 5d 3b 0a 20 20 6d 65  *)&pTab[1];.  me
8ba0: 6d 63 70 79 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  mcpy(pTab->zName
8bb0: 2c 20 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pMod->zName, n
8bc0: 4e 61 6d 65 29 3b 0a 20 20 70 54 61 62 2d 3e 6e  Name);.  pTab->n
8bd0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
8be0: 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
8bf0: 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[0].pSchema;. 
8c00: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
8c10: 7c 3d 20 54 46 5f 56 69 72 74 75 61 6c 3b 0a 20  |= TF_Virtual;. 
8c20: 20 70 54 61 62 2d 3e 6e 4d 6f 64 75 6c 65 41 72   pTab->nModuleAr
8c30: 67 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 69  g = 0;.  pTab->i
8c40: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 61 64 64  PKey = -1;.  add
8c50: 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64  ModuleArgument(d
8c60: 62 2c 20 70 54 61 62 2c 20 73 71 6c 69 74 65 33  b, pTab, sqlite3
8c70: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 54 61  DbStrDup(db, pTa
8c80: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 61 64  b->zName));.  ad
8c90: 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28  dModuleArgument(
8ca0: 64 62 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  db, pTab, 0);.  
8cb0: 61 64 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e  addModuleArgumen
8cc0: 74 28 64 62 2c 20 70 54 61 62 2c 20 73 71 6c 69  t(db, pTab, sqli
8cd0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
8ce0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
8cf0: 20 72 63 20 3d 20 76 74 61 62 43 61 6c 6c 43 6f   rc = vtabCallCo
8d00: 6e 73 74 72 75 63 74 6f 72 28 64 62 2c 20 70 54  nstructor(db, pT
8d10: 61 62 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64 75 6c  ab, pMod, pModul
8d20: 65 2d 3e 78 43 6f 6e 6e 65 63 74 2c 20 26 7a 45  e->xConnect, &zE
8d30: 72 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  rr);.  if( rc ){
8d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8d50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
8d60: 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 73 71  ", zErr);.    sq
8d70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8d80: 7a 45 72 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  zErr);.    sqlit
8d90: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
8da0: 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d  ableClear(db, pM
8db0: 6f 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  od);.    return 
8dc0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
8dd0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  1;.}../*.** Eras
8de0: 65 20 74 68 65 20 65 70 6f 6e 79 6d 6f 75 73 20  e the eponymous 
8df0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
8e00: 73 74 61 6e 63 65 20 61 73 73 6f 63 69 61 74 65  stance associate
8e10: 64 20 77 69 74 68 0a 2a 2a 20 76 69 72 74 75 61  d with.** virtua
8e20: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 70  l table module p
8e30: 4d 6f 64 2c 20 69 66 20 69 74 20 65 78 69 73 74  Mod, if it exist
8e40: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
8e50: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
8e60: 61 62 6c 65 43 6c 65 61 72 28 73 71 6c 69 74 65  ableClear(sqlite
8e70: 33 20 2a 64 62 2c 20 4d 6f 64 75 6c 65 20 2a 70  3 *db, Module *p
8e80: 4d 6f 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  Mod){.  Table *p
8e90: 54 61 62 20 3d 20 70 4d 6f 64 2d 3e 70 45 70 6f  Tab = pMod->pEpo
8ea0: 54 61 62 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Tab;.  if( (pTab
8eb0: 20 3d 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62   = pMod->pEpoTab
8ec0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
8ed0: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
8ee0: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a  ames(db, pTab);.
8ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
8f00: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 29 3b 0a  lear(db, pTab);.
8f10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8f20: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
8f30: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 3d   pMod->pEpoTab =
8f40: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
8f50: 20 52 65 74 75 72 6e 20 74 68 65 20 4f 4e 20 43   Return the ON C
8f60: 4f 4e 46 4c 49 43 54 20 72 65 73 6f 6c 75 74 69  ONFLICT resoluti
8f70: 6f 6e 20 6d 6f 64 65 20 69 6e 20 65 66 66 65 63  on mode in effec
8f80: 74 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61  t for the virtua
8f90: 6c 0a 2a 2a 20 74 61 62 6c 65 20 75 70 64 61 74  l.** table updat
8fa0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 63 75 72 72  e operation curr
8fb0: 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
8fc0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  s..**.** The res
8fd0: 75 6c 74 73 20 6f 66 20 74 68 69 73 20 72 6f 75  ults of this rou
8fe0: 74 69 6e 65 20 61 72 65 20 75 6e 64 65 66 69 6e  tine are undefin
8ff0: 65 64 20 75 6e 6c 65 73 73 20 69 74 20 69 73 20  ed unless it is 
9000: 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77  called from.** w
9010: 69 74 68 69 6e 20 61 6e 20 78 55 70 64 61 74 65  ithin an xUpdate
9020: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20   method..*/.int 
9030: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f  sqlite3_vtab_on_
9040: 63 6f 6e 66 6c 69 63 74 28 73 71 6c 69 74 65 33  conflict(sqlite3
9050: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
9060: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
9070: 68 61 72 20 61 4d 61 70 5b 5d 20 3d 20 7b 20 0a  har aMap[] = { .
9080: 20 20 20 20 53 51 4c 49 54 45 5f 52 4f 4c 4c 42      SQLITE_ROLLB
9090: 41 43 4b 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  ACK, SQLITE_ABOR
90a0: 54 2c 20 53 51 4c 49 54 45 5f 46 41 49 4c 2c 20  T, SQLITE_FAIL, 
90b0: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 53  SQLITE_IGNORE, S
90c0: 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 0a 20  QLITE_REPLACE . 
90d0: 20 7d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   };.#ifdef SQLIT
90e0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
90f0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
9100: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
9110: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
9120: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
9130: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
9140: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3d 3d 31 20   OE_Rollback==1 
9150: 26 26 20 4f 45 5f 41 62 6f 72 74 3d 3d 32 20 26  && OE_Abort==2 &
9160: 26 20 4f 45 5f 46 61 69 6c 3d 3d 33 20 29 3b 0a  & OE_Fail==3 );.
9170: 20 20 61 73 73 65 72 74 28 20 4f 45 5f 49 67 6e    assert( OE_Ign
9180: 6f 72 65 3d 3d 34 20 26 26 20 4f 45 5f 52 65 70  ore==4 && OE_Rep
9190: 6c 61 63 65 3d 3d 35 20 29 3b 0a 20 20 61 73 73  lace==5 );.  ass
91a0: 65 72 74 28 20 64 62 2d 3e 76 74 61 62 4f 6e 43  ert( db->vtabOnC
91b0: 6f 6e 66 6c 69 63 74 3e 3d 31 20 26 26 20 64 62  onflict>=1 && db
91c0: 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74  ->vtabOnConflict
91d0: 3c 3d 35 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  <=5 );.  return 
91e0: 28 69 6e 74 29 61 4d 61 70 5b 64 62 2d 3e 76 74  (int)aMap[db->vt
91f0: 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 2d 31 5d 3b  abOnConflict-1];
9200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 66  .}../*.** Call f
9210: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78  rom within the x
9220: 43 72 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e  Create() or xCon
9230: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 73 20 74  nect() methods t
9240: 6f 20 70 72 6f 76 69 64 65 20 0a 2a 2a 20 74 68  o provide .** th
9250: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 69  e SQLite core wi
9260: 74 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  th additional in
9270: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
9280: 74 68 65 20 62 65 68 61 76 69 6f 72 0a 2a 2a 20  the behavior.** 
9290: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
92a0: 61 62 6c 65 20 62 65 69 6e 67 20 69 6d 70 6c 65  able being imple
92b0: 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mented..*/.int s
92c0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66  qlite3_vtab_conf
92d0: 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ig(sqlite3 *db, 
92e0: 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
92f0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
9300: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
9310: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
9320: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
9330: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
9340: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
9350: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
9360: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
9370: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
9380: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
9390: 6d 75 74 65 78 29 3b 0a 20 20 76 61 5f 73 74 61  mutex);.  va_sta
93a0: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
93b0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
93c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 56 54 41 42  case SQLITE_VTAB
93d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 53 55 50 50  _CONSTRAINT_SUPP
93e0: 4f 52 54 3a 20 7b 0a 20 20 20 20 20 20 56 74 61  ORT: {.      Vta
93f0: 62 43 74 78 20 2a 70 20 3d 20 64 62 2d 3e 70 56  bCtx *p = db->pV
9400: 74 61 62 43 74 78 3b 0a 20 20 20 20 20 20 69 66  tabCtx;.      if
9410: 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( !p ){.        
9420: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
9430: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  SE_BKPT;.      }
9440: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
9450: 73 65 72 74 28 20 70 2d 3e 70 54 61 62 3d 3d 30  sert( p->pTab==0
9460: 20 7c 7c 20 28 70 2d 3e 70 54 61 62 2d 3e 74 61   || (p->pTab->ta
9470: 62 46 6c 61 67 73 20 26 20 54 46 5f 56 69 72 74  bFlags & TF_Virt
9480: 75 61 6c 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  ual)!=0 );.     
9490: 20 20 20 70 2d 3e 70 56 54 61 62 6c 65 2d 3e 62     p->pVTable->b
94a0: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 28 75 38  Constraint = (u8
94b0: 29 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29  )va_arg(ap, int)
94c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
94d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
94e0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
94f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55  rc = SQLITE_MISU
9500: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 62  SE_BKPT;.      b
9510: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 61 5f 65  reak;.  }.  va_e
9520: 6e 64 28 61 70 29 3b 0a 0a 20 20 69 66 28 20 72  nd(ap);..  if( r
9530: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73  c!=SQLITE_OK ) s
9540: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
9550: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
9560: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9570: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9580: 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
9590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
95a0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a           TUALTABLE */.