/ Hex Artifact Content
Login

Artifact b297e8fa656ab5e66244ab15680d68db0adbec30:


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 54 68 65 20 61 63 74 75 61 6c  /*.** The actual
0200: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64   function that d
0210: 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
0220: 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 6d  creating a new m
0230: 6f 64 75 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 66  odule..** This f
0240: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
0250: 74 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ts the sqlite3_c
0260: 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 29 20 61  reate_module() a
0270: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72  nd.** sqlite3_cr
0280: 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 29  eate_module_v2()
0290: 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2f 0a   interfaces..*/.
02a0: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
02b0: 65 4d 6f 64 75 6c 65 28 0a 20 20 73 71 6c 69 74  eModule(.  sqlit
02c0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
02d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
02e0: 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20  tabase in which 
02f0: 6d 6f 64 75 6c 65 20 69 73 20 72 65 67 69 73 74  module is regist
0300: 65 72 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ered */.  const 
0310: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
0320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0330: 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  e assigned to th
0340: 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 63  is module */.  c
0350: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
0360: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 2c 20 20 2f  ule *pModule,  /
0370: 2a 20 54 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  * The definition
0380: 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 20 2a   of the module *
0390: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 20  /.  void *pAux, 
03a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03b0: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70      /* Context p
03c0: 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 72 65 61  ointer for xCrea
03d0: 74 65 2f 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20  te/xConnect */. 
03e0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79   void (*xDestroy
03f0: 29 28 76 6f 69 64 20 2a 29 20 20 20 20 20 20 20  )(void *)       
0400: 20 2f 2a 20 4d 6f 64 75 6c 65 20 64 65 73 74 72   /* Module destr
0410: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 2a  uctor function *
0420: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  /.){.  int rc, n
0430: 4e 61 6d 65 3b 0a 20 20 4d 6f 64 75 6c 65 20 2a  Name;.  Module *
0440: 70 4d 6f 64 3b 0a 0a 20 20 73 71 6c 69 74 65 33  pMod;..  sqlite3
0450: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
0460: 3e 6d 75 74 65 78 29 3b 0a 20 20 6e 4e 61 6d 65  >mutex);.  nName
0470: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
0480: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 4d 6f  30(zName);.  pMo
0490: 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71  d = (Module *)sq
04a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
04b0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 6f 64 75  (db, sizeof(Modu
04c0: 6c 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 29  le) + nName + 1)
04d0: 3b 0a 20 20 69 66 28 20 70 4d 6f 64 20 29 7b 0a  ;.  if( pMod ){.
04e0: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 44 65 6c      Module *pDel
04f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70  ;.    char *zCop
0500: 79 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 4d  y = (char *)(&pM
0510: 6f 64 5b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  od[1]);.    memc
0520: 70 79 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d 65 2c  py(zCopy, zName,
0530: 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 70   nName+1);.    p
0540: 4d 6f 64 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 43 6f  Mod->zName = zCo
0550: 70 79 3b 0a 20 20 20 20 70 4d 6f 64 2d 3e 70 4d  py;.    pMod->pM
0560: 6f 64 75 6c 65 20 3d 20 70 4d 6f 64 75 6c 65 3b  odule = pModule;
0570: 0a 20 20 20 20 70 4d 6f 64 2d 3e 70 41 75 78 20  .    pMod->pAux 
0580: 3d 20 70 41 75 78 3b 0a 20 20 20 20 70 4d 6f 64  = pAux;.    pMod
0590: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
05a0: 73 74 72 6f 79 3b 0a 20 20 20 20 70 44 65 6c 20  stroy;.    pDel 
05b0: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
05c0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
05d0: 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 43 6f 70  b->aModule, zCop
05e0: 79 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a  y, nName, (void*
05f0: 29 70 4d 6f 64 29 3b 0a 20 20 20 20 69 66 28 20  )pMod);.    if( 
0600: 70 44 65 6c 20 26 26 20 70 44 65 6c 2d 3e 78 44  pDel && pDel->xD
0610: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
0620: 70 44 65 6c 2d 3e 78 44 65 73 74 72 6f 79 28 70  pDel->xDestroy(p
0630: 44 65 6c 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Del->pAux);.    
0640: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
0650: 72 65 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ree(db, pDel);. 
0660: 20 20 20 69 66 28 20 70 44 65 6c 3d 3d 70 4d 6f     if( pDel==pMo
0670: 64 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  d ){.      db->m
0680: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
0690: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
06a0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
06b0: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
06c0: 7d 65 6c 73 65 20 69 66 28 20 78 44 65 73 74 72  }else if( xDestr
06d0: 6f 79 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72  oy ){.    xDestr
06e0: 6f 79 28 70 41 75 78 29 3b 0a 20 20 7d 0a 20 20  oy(pAux);.  }.  
06f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
0700: 78 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  xit(db, SQLITE_O
0710: 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  K);.  sqlite3_mu
0720: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
0730: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
0740: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 74  c;.}.../*.** Ext
0750: 65 72 6e 61 6c 20 41 50 49 20 66 75 6e 63 74 69  ernal API functi
0760: 6f 6e 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  on used to creat
0770: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 2d  e a new virtual-
0780: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 0a 2a 2f  table module..*/
0790: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
07a0: 61 74 65 5f 6d 6f 64 75 6c 65 28 0a 20 20 73 71  ate_module(.  sq
07b0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
07d0: 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
07e0: 63 68 20 6d 6f 64 75 6c 65 20 69 73 20 72 65 67  ch module is reg
07f0: 69 73 74 65 72 65 64 20 2a 2f 0a 20 20 63 6f 6e  istered */.  con
0800: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0820: 4e 61 6d 65 20 61 73 73 69 67 6e 65 64 20 74 6f  Name assigned to
0830: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a   this module */.
0840: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
0850: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 2c  module *pModule,
0860: 20 20 2f 2a 20 54 68 65 20 64 65 66 69 6e 69 74    /* The definit
0870: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c  ion of the modul
0880: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75  e */.  void *pAu
0890: 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
08a0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
08b0: 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43  t pointer for xC
08c0: 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 2a  reate/xConnect *
08d0: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72  /.){.  return cr
08e0: 65 61 74 65 4d 6f 64 75 6c 65 28 64 62 2c 20 7a  eateModule(db, z
08f0: 4e 61 6d 65 2c 20 70 4d 6f 64 75 6c 65 2c 20 70  Name, pModule, p
0900: 41 75 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Aux, 0);.}../*.*
0910: 2a 20 45 78 74 65 72 6e 61 6c 20 41 50 49 20 66  * External API f
0920: 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  unction used to 
0930: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
0940: 74 75 61 6c 2d 74 61 62 6c 65 20 6d 6f 64 75 6c  tual-table modul
0950: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
0960: 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f  3_create_module_
0970: 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
0980: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
0990: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
09a0: 65 20 69 6e 20 77 68 69 63 68 20 6d 6f 64 75 6c  e in which modul
09b0: 65 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  e is registered 
09c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
09d0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
09e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 61 73 73       /* Name ass
09f0: 69 67 6e 65 64 20 74 6f 20 74 68 69 73 20 6d 6f  igned to this mo
0a00: 64 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  dule */.  const 
0a10: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
0a20: 70 4d 6f 64 75 6c 65 2c 20 20 2f 2a 20 54 68 65  pModule,  /* The
0a30: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74   definition of t
0a40: 68 65 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 76  he module */.  v
0a50: 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20  oid *pAux,      
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0a70: 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65  * Context pointe
0a80: 72 20 66 6f 72 20 78 43 72 65 61 74 65 2f 78 43  r for xCreate/xC
0a90: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 76 6f 69 64  onnect */.  void
0aa0: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
0ab0: 64 20 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 4d  d *)        /* M
0ac0: 6f 64 75 6c 65 20 64 65 73 74 72 75 63 74 6f 72  odule destructor
0ad0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
0ae0: 20 20 72 65 74 75 72 6e 20 63 72 65 61 74 65 4d    return createM
0af0: 6f 64 75 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  odule(db, zName,
0b00: 20 70 4d 6f 64 75 6c 65 2c 20 70 41 75 78 2c 20   pModule, pAux, 
0b10: 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a 2f 2a  xDestroy);.}../*
0b20: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 76 69 72  .** Lock the vir
0b30: 74 75 61 6c 20 74 61 62 6c 65 20 73 6f 20 74 68  tual table so th
0b40: 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20  at it cannot be 
0b50: 64 69 73 63 6f 6e 6e 65 63 74 65 64 2e 0a 2a 2a  disconnected..**
0b60: 20 4c 6f 63 6b 73 20 6e 65 73 74 2e 20 20 45 76   Locks nest.  Ev
0b70: 65 72 79 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20  ery lock should 
0b80: 68 61 76 65 20 61 20 63 6f 72 72 65 73 70 6f 6e  have a correspon
0b90: 64 69 6e 67 20 75 6e 6c 6f 63 6b 2e 0a 2a 2a 20  ding unlock..** 
0ba0: 49 66 20 61 6e 20 75 6e 6c 6f 63 6b 20 69 73 20  If an unlock is 
0bb0: 6f 6d 69 74 74 65 64 2c 20 72 65 73 6f 75 72 63  omitted, resourc
0bc0: 65 73 20 6c 65 61 6b 73 20 77 69 6c 6c 20 6f 63  es leaks will oc
0bd0: 63 75 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  cur.  .**.** If 
0be0: 61 20 64 69 73 63 6f 6e 6e 65 63 74 20 69 73 20  a disconnect is 
0bf0: 61 74 74 65 6d 70 74 65 64 20 77 68 69 6c 65 20  attempted while 
0c00: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
0c10: 69 73 20 6c 6f 63 6b 65 64 2c 0a 2a 2a 20 74 68  is locked,.** th
0c20: 65 20 64 69 73 63 6f 6e 6e 65 63 74 20 69 73 20  e disconnect is 
0c30: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
0c40: 6c 6c 20 6c 6f 63 6b 73 20 68 61 76 65 20 62 65  ll locks have be
0c50: 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  en removed..*/.v
0c60: 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 4c  oid sqlite3VtabL
0c70: 6f 63 6b 28 56 54 61 62 6c 65 20 2a 70 56 54 61  ock(VTable *pVTa
0c80: 62 29 7b 0a 20 20 70 56 54 61 62 2d 3e 6e 52 65  b){.  pVTab->nRe
0c90: 66 2b 2b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 70  f++;.}.../*.** p
0ca0: 54 61 62 20 69 73 20 61 20 70 6f 69 6e 74 65 72  Tab is a pointer
0cb0: 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
0cc0: 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 69  cture representi
0cd0: 6e 67 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  ng a virtual-tab
0ce0: 6c 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  le..** Return a 
0cf0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  pointer to the V
0d00: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 75 73 65  Table object use
0d10: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  d by connection 
0d20: 64 62 20 74 6f 20 61 63 63 65 73 73 20 0a 2a 2a  db to access .**
0d30: 20 74 68 69 73 20 76 69 72 74 75 61 6c 2d 74 61   this virtual-ta
0d40: 62 6c 65 2c 20 69 66 20 6f 6e 65 20 68 61 73 20  ble, if one has 
0d50: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 6f 72  been created, or
0d60: 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 2e   NULL otherwise.
0d70: 0a 2a 2f 0a 56 54 61 62 6c 65 20 2a 73 71 6c 69  .*/.VTable *sqli
0d80: 74 65 33 47 65 74 56 54 61 62 6c 65 28 73 71 6c  te3GetVTable(sql
0d90: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
0da0: 2a 70 54 61 62 29 7b 0a 20 20 56 54 61 62 6c 65  *pTab){.  VTable
0db0: 20 2a 70 56 74 61 62 3b 0a 20 20 61 73 73 65 72   *pVtab;.  asser
0dc0: 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  t( IsVirtual(pTa
0dd0: 62 29 20 29 3b 0a 20 20 66 6f 72 28 70 56 74 61  b) );.  for(pVta
0de0: 62 3d 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 3b  b=pTab->pVTable;
0df0: 20 70 56 74 61 62 20 26 26 20 70 56 74 61 62 2d   pVtab && pVtab-
0e00: 3e 64 62 21 3d 64 62 3b 20 70 56 74 61 62 3d 70  >db!=db; pVtab=p
0e10: 56 74 61 62 2d 3e 70 4e 65 78 74 29 3b 0a 20 20  Vtab->pNext);.  
0e20: 72 65 74 75 72 6e 20 70 56 74 61 62 3b 0a 7d 0a  return pVtab;.}.
0e30: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
0e40: 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20 6f   the ref-count o
0e50: 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
0e60: 65 20 6f 62 6a 65 63 74 2e 20 57 68 65 6e 20 74  e object. When t
0e70: 68 65 20 72 65 66 2d 63 6f 75 6e 74 0a 2a 2a 20  he ref-count.** 
0e80: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 61  reaches zero, ca
0e90: 6c 6c 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ll the xDisconne
0ea0: 63 74 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 64  ct() method to d
0eb0: 65 6c 65 74 65 20 74 68 65 20 6f 62 6a 65 63 74  elete the object
0ec0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0ed0: 33 56 74 61 62 55 6e 6c 6f 63 6b 28 56 54 61 62  3VtabUnlock(VTab
0ee0: 6c 65 20 2a 70 56 54 61 62 29 7b 0a 20 20 73 71  le *pVTab){.  sq
0ef0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 56 54 61  lite3 *db = pVTa
0f00: 62 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  b->db;..  assert
0f10: 28 20 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ( db );.  assert
0f20: 28 20 70 56 54 61 62 2d 3e 6e 52 65 66 3e 30 20  ( pVTab->nRef>0 
0f30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
0f40: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
0f50: 6b 28 64 62 29 20 29 3b 0a 0a 20 20 70 56 54 61  k(db) );..  pVTa
0f60: 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  b->nRef--;.  if(
0f70: 20 70 56 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 20   pVTab->nRef==0 
0f80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
0f90: 74 61 62 20 2a 70 20 3d 20 70 56 54 61 62 2d 3e  tab *p = pVTab->
0fa0: 70 56 74 61 62 3b 0a 20 20 20 20 69 66 28 20 70  pVtab;.    if( p
0fb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4d 6f   ){.      p->pMo
0fc0: 64 75 6c 65 2d 3e 78 44 69 73 63 6f 6e 6e 65 63  dule->xDisconnec
0fd0: 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(p);.    }.    
0fe0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
0ff0: 2c 20 70 56 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a  , pVTab);.  }.}.
1000: 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 70 20 69  ./*.** Table p i
1010: 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  s a virtual tabl
1020: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1030: 20 6d 6f 76 65 73 20 61 6c 6c 20 65 6c 65 6d 65   moves all eleme
1040: 6e 74 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 2d  nts in the.** p-
1050: 3e 70 56 54 61 62 6c 65 20 6c 69 73 74 20 74 6f  >pVTable list to
1060: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 70 44 69   the sqlite3.pDi
1070: 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74 73 20 6f  sconnect lists o
1080: 66 20 74 68 65 69 72 20 61 73 73 6f 63 69 61 74  f their associat
1090: 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  ed.** database c
10a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 62 65  onnections to be
10b0: 20 64 69 73 63 6f 6e 6e 65 63 74 65 64 20 61 74   disconnected at
10c0: 20 74 68 65 20 6e 65 78 74 20 6f 70 70 6f 72 74   the next opport
10d0: 75 6e 69 74 79 2e 20 0a 2a 2a 20 45 78 63 65 70  unity. .** Excep
10e0: 74 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 64  t, if argument d
10f0: 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  b is not NULL, t
1100: 68 65 6e 20 74 68 65 20 65 6e 74 72 79 20 61 73  hen the entry as
1110: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
1120: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
1130: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 70 2d  s left in the p-
1140: 3e 70 56 54 61 62 6c 65 20 6c 69 73 74 2e 0a 2a  >pVTable list..*
1150: 2f 0a 73 74 61 74 69 63 20 56 54 61 62 6c 65 20  /.static VTable 
1160: 2a 76 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 41  *vtabDisconnectA
1170: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
1180: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 56 54 61  Table *p){.  VTa
1190: 62 6c 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ble *pRet = 0;. 
11a0: 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 6c 65   VTable *pVTable
11b0: 20 3d 20 70 2d 3e 70 56 54 61 62 6c 65 3b 0a 20   = p->pVTable;. 
11c0: 20 70 2d 3e 70 56 54 61 62 6c 65 20 3d 20 30 3b   p->pVTable = 0;
11d0: 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
11e0: 61 74 20 74 68 65 20 6d 75 74 65 78 20 28 69 66  at the mutex (if
11f0: 20 61 6e 79 29 20 61 73 73 6f 63 69 61 74 65 64   any) associated
1200: 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72   with the BtShar
1210: 65 64 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a  ed database .  *
1220: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
1230: 74 61 62 6c 65 20 70 20 69 73 20 68 65 6c 64 20  table p is held 
1240: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
1250: 65 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  ee header commen
1260: 74 73 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66  ts .  ** above f
1270: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 56  unction sqlite3V
1280: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 29 20  tabUnlockList() 
1290: 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
12a0: 6f 6e 20 6f 66 20 77 68 79 0a 20 20 2a 2a 20 74  on of why.  ** t
12b0: 68 69 73 20 6d 61 6b 65 73 20 69 74 20 73 61 66  his makes it saf
12c0: 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
12d0: 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e 6e  sqlite3.pDisconn
12e0: 65 63 74 20 6c 69 73 74 20 6f 66 20 61 6e 79 0a  ect list of any.
12f0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f    ** database co
1300: 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 6d 61  nnection that ma
1310: 79 20 68 61 76 65 20 61 6e 20 65 6e 74 72 79 20  y have an entry 
1320: 69 6e 20 74 68 65 20 70 2d 3e 70 56 54 61 62 6c  in the p->pVTabl
1330: 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 61 73  e list.  */.  as
1340: 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 0a 20  sert( db==0 ||. 
1350: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 48     sqlite3BtreeH
1360: 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44  oldsMutex(db->aD
1370: 62 5b 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  b[sqlite3SchemaT
1380: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
1390: 63 68 65 6d 61 29 5d 2e 70 42 74 29 20 0a 20 20  chema)].pBt) .  
13a0: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 56 54  );..  while( pVT
13b0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
13c0: 74 65 33 20 2a 64 62 32 20 3d 20 70 56 54 61 62  te3 *db2 = pVTab
13d0: 6c 65 2d 3e 64 62 3b 0a 20 20 20 20 56 54 61 62  le->db;.    VTab
13e0: 6c 65 20 2a 70 4e 65 78 74 20 3d 20 70 56 54 61  le *pNext = pVTa
13f0: 62 6c 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ble->pNext;.    
1400: 61 73 73 65 72 74 28 20 64 62 32 20 29 3b 0a 20  assert( db2 );. 
1410: 20 20 20 69 66 28 20 64 62 32 3d 3d 64 62 20 29     if( db2==db )
1420: 7b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 70  {.      pRet = p
1430: 56 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 2d  VTable;.      p-
1440: 3e 70 56 54 61 62 6c 65 20 3d 20 70 52 65 74 3b  >pVTable = pRet;
1450: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 70 4e 65  .      pRet->pNe
1460: 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  xt = 0;.    }els
1470: 65 7b 0a 20 20 20 20 20 20 70 56 54 61 62 6c 65  e{.      pVTable
1480: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 32 2d 3e 70  ->pNext = db2->p
1490: 44 69 73 63 6f 6e 6e 65 63 74 3b 0a 20 20 20 20  Disconnect;.    
14a0: 20 20 64 62 32 2d 3e 70 44 69 73 63 6f 6e 6e 65    db2->pDisconne
14b0: 63 74 20 3d 20 70 56 54 61 62 6c 65 3b 0a 20 20  ct = pVTable;.  
14c0: 20 20 7d 0a 20 20 20 20 70 56 54 61 62 6c 65 20    }.    pVTable 
14d0: 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
14e0: 61 73 73 65 72 74 28 20 21 64 62 20 7c 7c 20 70  assert( !db || p
14f0: 52 65 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Ret );.  return 
1500: 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pRet;.}.../*.** 
1510: 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 74  Disconnect all t
1520: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1530: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
1540: 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e 6e  sqlite3.pDisconn
1550: 65 63 74 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ect list..**.** 
1560: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1570: 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
1580: 20 77 68 65 6e 20 74 68 65 20 6d 75 74 65 78 65   when the mutexe
1590: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
15a0: 68 20 61 6c 6c 0a 2a 2a 20 73 68 61 72 65 64 20  h all.** shared 
15b0: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 73  b-tree databases
15c0: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 6f   opened using co
15d0: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 61 72 65 20  nnection db are 
15e0: 68 65 6c 64 20 62 79 20 74 68 65 20 0a 2a 2a 20  held by the .** 
15f0: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 69 73 20  caller. This is 
1600: 64 6f 6e 65 20 74 6f 20 70 72 6f 74 65 63 74 20  done to protect 
1610: 74 68 65 20 73 71 6c 69 74 65 33 2e 70 44 69 73  the sqlite3.pDis
1620: 63 6f 6e 6e 65 63 74 20 6c 69 73 74 2e 20 54 68  connect list. Th
1630: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 2e 70 44 69  e.** sqlite3.pDi
1640: 73 63 6f 6e 6e 65 63 74 20 6c 69 73 74 20 69 73  sconnect list is
1650: 20 61 63 63 65 73 73 65 64 20 6f 6e 6c 79 20 61   accessed only a
1660: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1670: 20 20 20 31 29 20 42 79 20 74 68 69 73 20 66 75     1) By this fu
1680: 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  nction. In this 
1690: 63 61 73 65 2c 20 61 6c 6c 20 42 74 53 68 61 72  case, all BtShar
16a0: 65 64 20 6d 75 74 65 78 65 73 20 61 6e 64 20 74  ed mutexes and t
16b0: 68 65 20 6d 75 74 65 78 0a 2a 2a 20 20 20 20 20  he mutex.**     
16c0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
16e0: 6e 64 6c 65 20 69 74 73 65 6c 66 20 6d 75 73 74  ndle itself must
16f0: 20 62 65 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20   be held..**.** 
1700: 20 20 32 29 20 42 79 20 66 75 6e 63 74 69 6f 6e    2) By function
1710: 20 76 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 41   vtabDisconnectA
1720: 6c 6c 28 29 2c 20 77 68 65 6e 20 69 74 20 61 64  ll(), when it ad
1730: 64 73 20 61 20 56 54 61 62 6c 65 20 65 6e 74 72  ds a VTable entr
1740: 79 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74 68 65  y to.**      the
1750: 20 73 71 6c 69 74 65 33 2e 70 44 69 73 63 6f 6e   sqlite3.pDiscon
1760: 6e 65 63 74 20 6c 69 73 74 2e 20 49 6e 20 74 68  nect list. In th
1770: 69 73 20 63 61 73 65 20 65 69 74 68 65 72 20 74  is case either t
1780: 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
1790: 78 0a 2a 2a 20 20 20 20 20 20 61 73 73 6f 63 69  x.**      associ
17a0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
17b0: 74 61 62 61 73 65 20 74 68 65 20 76 69 72 74 75  tabase the virtu
17c0: 61 6c 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72  al table is stor
17d0: 65 64 20 69 6e 20 69 73 20 68 65 6c 64 0a 2a 2a  ed in is held.**
17e0: 20 20 20 20 20 20 6f 72 2c 20 69 66 20 74 68 65        or, if the
17f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
1800: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6e 6f  s stored in a no
1810: 6e 2d 73 68 61 72 61 62 6c 65 20 64 61 74 61 62  n-sharable datab
1820: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20  ase, then.**    
1830: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68    the database h
1840: 61 6e 64 6c 65 20 6d 75 74 65 78 20 69 73 20 68  andle mutex is h
1850: 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 61 20  eld..**.** As a 
1860: 72 65 73 75 6c 74 2c 20 61 20 73 71 6c 69 74 65  result, a sqlite
1870: 33 2e 70 44 69 73 63 6f 6e 6e 65 63 74 20 63 61  3.pDisconnect ca
1880: 6e 6e 6f 74 20 62 65 20 61 63 63 65 73 73 65 64  nnot be accessed
1890: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
18a0: 0a 2a 2a 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  .** by multiple 
18b0: 74 68 72 65 61 64 73 2e 20 49 74 20 69 73 20 74  threads. It is t
18c0: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 76  hread-safe..*/.v
18d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 55  oid sqlite3VtabU
18e0: 6e 6c 6f 63 6b 4c 69 73 74 28 73 71 6c 69 74 65  nlockList(sqlite
18f0: 33 20 2a 64 62 29 7b 0a 20 20 56 54 61 62 6c 65  3 *db){.  VTable
1900: 20 2a 70 20 3d 20 64 62 2d 3e 70 44 69 73 63 6f   *p = db->pDisco
1910: 6e 6e 65 63 74 3b 0a 20 20 64 62 2d 3e 70 44 69  nnect;.  db->pDi
1920: 73 63 6f 6e 6e 65 63 74 20 3d 20 30 3b 0a 0a 20  sconnect = 0;.. 
1930: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1940: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
1950: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 61 73  exes(db) );.  as
1960: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1970: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
1980: 65 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 20  ex) );..  if( p 
1990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
19a0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
19b0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
19c0: 64 6f 20 7b 0a 20 20 20 20 20 20 56 54 61 62 6c  do {.      VTabl
19d0: 65 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  e *pNext = p->pN
19e0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
19f0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 70 29 3b  e3VtabUnlock(p);
1a00: 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74  .      p = pNext
1a10: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20  ;.    }while( p 
1a20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a30: 43 6c 65 61 72 20 61 6e 79 20 61 6e 64 20 61 6c  Clear any and al
1a40: 6c 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  l virtual-table 
1a50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1a60: 20 74 68 65 20 54 61 62 6c 65 20 72 65 63 6f 72   the Table recor
1a70: 64 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  d..** This routi
1a80: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 6f  ne is called, fo
1a90: 72 20 65 78 61 6d 70 6c 65 2c 20 6a 75 73 74 20  r example, just 
1aa0: 62 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67 20  before deleting 
1ab0: 74 68 65 20 54 61 62 6c 65 0a 2a 2a 20 72 65 63  the Table.** rec
1ac0: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  ord..**.** Since
1ad0: 20 69 74 20 69 73 20 61 20 76 69 72 74 75 61 6c   it is a virtual
1ae0: 2d 74 61 62 6c 65 2c 20 74 68 65 20 54 61 62 6c  -table, the Tabl
1af0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
1b00: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
1b10: 2a 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  * to the head of
1b20: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
1b30: 66 20 56 54 61 62 6c 65 20 73 74 72 75 63 74 75  f VTable structu
1b40: 72 65 73 2e 20 45 61 63 68 20 56 54 61 62 6c 65  res. Each VTable
1b50: 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69   .** structure i
1b60: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1b70: 68 20 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74  h a single sqlit
1b80: 65 33 2a 20 75 73 65 72 20 6f 66 20 74 68 65 20  e3* user of the 
1b90: 73 63 68 65 6d 61 2e 0a 2a 2a 20 54 68 65 20 72  schema..** The r
1ba0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
1bb0: 66 20 74 68 65 20 56 54 61 62 6c 65 20 73 74 72  f the VTable str
1bc0: 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
1bd0: 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  d with database 
1be0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  .** connection d
1bf0: 62 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64  b is decremented
1c00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 28 77 68   immediately (wh
1c10: 69 63 68 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  ich may lead to 
1c20: 74 68 65 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  the .** structur
1c30: 65 20 62 65 69 6e 67 20 78 44 69 73 63 6f 6e 6e  e being xDisconn
1c40: 65 63 74 65 64 20 61 6e 64 20 66 72 65 65 29 2e  ected and free).
1c50: 20 41 6e 79 20 6f 74 68 65 72 20 56 54 61 62 6c   Any other VTabl
1c60: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
1c70: 69 6e 20 74 68 65 20 6c 69 73 74 20 61 72 65 20  in the list are 
1c80: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 73 71 6c  moved to the sql
1c90: 69 74 65 33 2e 70 44 69 73 63 6f 6e 6e 65 63 74  ite3.pDisconnect
1ca0: 20 6c 69 73 74 20 6f 66 20 74 68 65 20 61 73 73   list of the ass
1cb0: 6f 63 69 61 74 65 64 20 0a 2a 2a 20 64 61 74 61  ociated .** data
1cc0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ce0: 56 74 61 62 43 6c 65 61 72 28 73 71 6c 69 74 65  VtabClear(sqlite
1cf0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29  3 *db, Table *p)
1d00: 7b 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  {.  if( !db || d
1d10: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
1d20: 3d 30 20 29 20 76 74 61 62 44 69 73 63 6f 6e 6e  =0 ) vtabDisconn
1d30: 65 63 74 41 6c 6c 28 30 2c 20 70 29 3b 0a 20 20  ectAll(0, p);.  
1d40: 69 66 28 20 70 2d 3e 61 7a 4d 6f 64 75 6c 65 41  if( p->azModuleA
1d50: 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  rg ){.    int i;
1d60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d70: 70 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 3b 20 69  p->nModuleArg; i
1d80: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1d90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
1da0: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 69 5d 29 3b  azModuleArg[i]);
1db0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1dc0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
1dd0: 61 7a 4d 6f 64 75 6c 65 41 72 67 29 3b 0a 20 20  azModuleArg);.  
1de0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
1df0: 20 6e 65 77 20 6d 6f 64 75 6c 65 20 61 72 67 75   new module argu
1e00: 6d 65 6e 74 20 74 6f 20 70 54 61 62 6c 65 2d 3e  ment to pTable->
1e10: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 5d 2e 0a 2a  azModuleArg[]..*
1e20: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20  * The string is 
1e30: 6e 6f 74 20 63 6f 70 69 65 64 20 2d 20 74 68 65  not copied - the
1e40: 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72   pointer is stor
1e50: 65 64 2e 20 20 54 68 65 0a 2a 2a 20 73 74 72 69  ed.  The.** stri
1e60: 6e 67 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ng will be freed
1e70: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
1e80: 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73  hen the table is
1e90: 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a  .** deleted..*/.
1ea0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 4d  static void addM
1eb0: 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 73 71  oduleArgument(sq
1ec0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
1ed0: 20 2a 70 54 61 62 6c 65 2c 20 63 68 61 72 20 2a   *pTable, char *
1ee0: 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 20 3d  zArg){.  int i =
1ef0: 20 70 54 61 62 6c 65 2d 3e 6e 4d 6f 64 75 6c 65   pTable->nModule
1f00: 41 72 67 2b 2b 3b 0a 20 20 69 6e 74 20 6e 42 79  Arg++;.  int nBy
1f10: 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 63 68 61  tes = sizeof(cha
1f20: 72 20 2a 29 2a 28 31 2b 70 54 61 62 6c 65 2d 3e  r *)*(1+pTable->
1f30: 6e 4d 6f 64 75 6c 65 41 72 67 29 3b 0a 20 20 63  nModuleArg);.  c
1f40: 68 61 72 20 2a 2a 61 7a 4d 6f 64 75 6c 65 41 72  har **azModuleAr
1f50: 67 3b 0a 20 20 61 7a 4d 6f 64 75 6c 65 41 72 67  g;.  azModuleArg
1f60: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1f70: 6c 6f 63 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  loc(db, pTable->
1f80: 61 7a 4d 6f 64 75 6c 65 41 72 67 2c 20 6e 42 79  azModuleArg, nBy
1f90: 74 65 73 29 3b 0a 20 20 69 66 28 20 61 7a 4d 6f  tes);.  if( azMo
1fa0: 64 75 6c 65 41 72 67 3d 3d 30 20 29 7b 0a 20 20  duleArg==0 ){.  
1fb0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72    int j;.    for
1fc0: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
1fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1fe0: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
1ff0: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 6a 5d 29  >azModuleArg[j])
2000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2010: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 41  te3DbFree(db, zA
2020: 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
2030: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
2040: 65 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 29 3b  e->azModuleArg);
2050: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 4d 6f  .    pTable->nMo
2060: 64 75 6c 65 41 72 67 20 3d 20 30 3b 0a 20 20 7d  duleArg = 0;.  }
2070: 65 6c 73 65 7b 0a 20 20 20 20 61 7a 4d 6f 64 75  else{.    azModu
2080: 6c 65 41 72 67 5b 69 5d 20 3d 20 7a 41 72 67 3b  leArg[i] = zArg;
2090: 0a 20 20 20 20 61 7a 4d 6f 64 75 6c 65 41 72 67  .    azModuleArg
20a0: 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  [i+1] = 0;.  }. 
20b0: 20 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64 75 6c   pTable->azModul
20c0: 65 41 72 67 20 3d 20 61 7a 4d 6f 64 75 6c 65 41  eArg = azModuleA
20d0: 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rg;.}../*.** The
20e0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
20f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2100: 69 74 20 66 69 72 73 74 20 73 65 65 73 20 61 20  it first sees a 
2110: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
2120: 41 42 4c 45 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ABLE.** statemen
2130: 74 2e 20 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e  t.  The module n
2140: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 70 61 72  ame has been par
2150: 73 65 64 2c 20 62 75 74 20 74 68 65 20 6f 70 74  sed, but the opt
2160: 69 6f 6e 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66  ional list.** of
2170: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
2180: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 6d 6f 64 75   follow the modu
2190: 6c 65 20 6e 61 6d 65 20 61 72 65 20 73 74 69 6c  le name are stil
21a0: 6c 20 70 65 6e 64 69 6e 67 2e 0a 2a 2f 0a 76 6f  l pending..*/.vo
21b0: 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 42 65  id sqlite3VtabBe
21c0: 67 69 6e 50 61 72 73 65 28 0a 20 20 50 61 72 73  ginParse(.  Pars
21d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
21e0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
21f0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
2200: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 20 20  *pName1,        
2210: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20 74  /* Name of new t
2220: 61 62 6c 65 2c 20 6f 72 20 64 61 74 61 62 61 73  able, or databas
2230: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f 6b 65  e name */.  Toke
2240: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
2250: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6e 65 77    /* Name of new
2260: 20 74 61 62 6c 65 20 6f 72 20 4e 55 4c 4c 20 2a   table or NULL *
2270: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4d 6f 64 75  /.  Token *pModu
2280: 6c 65 4e 61 6d 65 20 20 20 20 2f 2a 20 4e 61 6d  leName    /* Nam
2290: 65 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 20  e of the module 
22a0: 66 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20  for the virtual 
22b0: 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  table */.){.  in
22c0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
22d0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
22e0: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ase the table is
22f0: 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 69   being created i
2300: 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
2310: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
2320: 54 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20  The new virtual 
2330: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
2340: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
2350: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2360: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 73 71  nection */..  sq
2370: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
2380: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
2390: 70 4e 61 6d 65 32 2c 20 30 2c 20 30 2c 20 31 2c  pName2, 0, 0, 1,
23a0: 20 30 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20   0);.  pTable = 
23b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
23c0: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  e;.  if( pTable=
23d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
23e0: 73 73 65 72 74 28 20 30 3d 3d 70 54 61 62 6c 65  ssert( 0==pTable
23f0: 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 0a 20 20 64  ->pIndex );..  d
2400: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2410: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
2420: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
2430: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
2440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
2450: 3e 3d 30 20 29 3b 0a 0a 20 20 70 54 61 62 6c 65  >=0 );..  pTable
2460: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
2470: 5f 56 69 72 74 75 61 6c 3b 0a 20 20 70 54 61 62  _Virtual;.  pTab
2480: 6c 65 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 20 3d  le->nModuleArg =
2490: 20 30 3b 0a 20 20 61 64 64 4d 6f 64 75 6c 65 41   0;.  addModuleA
24a0: 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 54 61 62  rgument(db, pTab
24b0: 6c 65 2c 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  le, sqlite3NameF
24c0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4d 6f  romToken(db, pMo
24d0: 64 75 6c 65 4e 61 6d 65 29 29 3b 0a 20 20 61 64  duleName));.  ad
24e0: 64 4d 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28  dModuleArgument(
24f0: 64 62 2c 20 70 54 61 62 6c 65 2c 20 73 71 6c 69  db, pTable, sqli
2500: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
2510: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
2520: 6d 65 29 29 3b 0a 20 20 61 64 64 4d 6f 64 75 6c  me));.  addModul
2530: 65 41 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 54  eArgument(db, pT
2540: 61 62 6c 65 2c 20 73 71 6c 69 74 65 33 44 62 53  able, sqlite3DbS
2550: 74 72 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65  trDup(db, pTable
2560: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 50 61  ->zName));.  pPa
2570: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
2580: 6e 20 3d 20 28 69 6e 74 29 28 26 70 4d 6f 64 75  n = (int)(&pModu
2590: 6c 65 4e 61 6d 65 2d 3e 7a 5b 70 4d 6f 64 75 6c  leName->z[pModul
25a0: 65 4e 61 6d 65 2d 3e 6e 5d 20 2d 20 70 4e 61 6d  eName->n] - pNam
25b0: 65 31 2d 3e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66  e1->z);..#ifndef
25c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
25d0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  HORIZATION.  /* 
25e0: 43 72 65 61 74 69 6e 67 20 61 20 76 69 72 74 75  Creating a virtu
25f0: 61 6c 20 74 61 62 6c 65 20 69 6e 76 6f 6b 65 73  al table invokes
2600: 20 74 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   the authorizati
2610: 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 74 77 69 63  on callback twic
2620: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  e..  ** The firs
2630: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2c 20 74 6f  t invocation, to
2640: 20 6f 62 74 61 69 6e 20 70 65 72 6d 69 73 73 69   obtain permissi
2650: 6f 6e 20 74 6f 20 49 4e 53 45 52 54 20 61 20 72  on to INSERT a r
2660: 6f 77 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ow into the.  **
2670: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
2680: 61 62 6c 65 2c 20 68 61 73 20 61 6c 72 65 61 64  able, has alread
2690: 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 73  y been made by s
26a0: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
26b0: 28 29 2e 0a 20 20 2a 2a 20 54 68 65 20 73 65 63  ()..  ** The sec
26c0: 6f 6e 64 20 63 61 6c 6c 2c 20 74 6f 20 6f 62 74  ond call, to obt
26d0: 61 69 6e 20 70 65 72 6d 69 73 73 69 6f 6e 20 74  ain permission t
26e0: 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
26f0: 6c 65 2c 20 69 73 20 6d 61 64 65 20 6e 6f 77 2e  le, is made now.
2700: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
2710: 6c 65 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20  le->azModuleArg 
2720: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
2730: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
2740: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54  SQLITE_CREATE_VT
2750: 41 42 4c 45 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ABLE, pTable->zN
2760: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
2770: 20 20 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64 75    pTable->azModu
2780: 6c 65 41 72 67 5b 30 5d 2c 20 70 50 61 72 73 65  leArg[0], pParse
2790: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
27a0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Name);.  }.#endi
27b0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
27c0: 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 74 68  routine takes th
27d0: 65 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e  e module argumen
27e0: 74 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  t that has been 
27f0: 61 63 63 75 6d 75 6c 61 74 69 6e 67 0a 2a 2a 20  accumulating.** 
2800: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 41 72 67 5b  in pParse->zArg[
2810: 5d 20 61 6e 64 20 61 70 70 65 6e 64 73 20 69 74  ] and appends it
2820: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
2830: 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 74 68 65  arguments on the
2840: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
2850: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
2860: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
2870: 6e 20 70 50 61 72 73 65 2d 3e 70 54 61 62 6c 65  n pParse->pTable
2880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2890: 20 61 64 64 41 72 67 75 6d 65 6e 74 54 6f 56 74   addArgumentToVt
28a0: 61 62 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ab(Parse *pParse
28b0: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
28c0: 3e 73 41 72 67 2e 7a 20 26 26 20 41 4c 57 41 59  >sArg.z && ALWAY
28d0: 53 28 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  S(pParse->pNewTa
28e0: 62 6c 65 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73  ble) ){.    cons
28f0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
2900: 73 74 20 63 68 61 72 2a 29 70 50 61 72 73 65 2d  st char*)pParse-
2910: 3e 73 41 72 67 2e 7a 3b 0a 20 20 20 20 69 6e 74  >sArg.z;.    int
2920: 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 73 41 72   n = pParse->sAr
2930: 67 2e 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g.n;.    sqlite3
2940: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2950: 62 3b 0a 20 20 20 20 61 64 64 4d 6f 64 75 6c 65  b;.    addModule
2960: 41 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 50 61  Argument(db, pPa
2970: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2c 20  rse->pNewTable, 
2980: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
2990: 28 64 62 2c 20 7a 2c 20 6e 29 29 3b 0a 20 20 7d  (db, z, n));.  }
29a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
29b0: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
29c0: 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 74 68  routine after th
29d0: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
29e0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
29f0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  .** has been com
2a00: 70 6c 65 74 65 6c 79 20 70 61 72 73 65 64 2e 0a  pletely parsed..
2a10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2a20: 74 61 62 46 69 6e 69 73 68 50 61 72 73 65 28 50  tabFinishParse(P
2a30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
2a40: 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54 61  ken *pEnd){.  Ta
2a50: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
2a60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 20 20  se->pNewTable;  
2a70: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
2a80: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
2a90: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
2aa0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
2ab0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2ac0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2ad0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 54 61 62 3d   */..  if( pTab=
2ae0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
2af0: 64 64 41 72 67 75 6d 65 6e 74 54 6f 56 74 61 62  ddArgumentToVtab
2b00: 28 70 50 61 72 73 65 29 3b 0a 20 20 70 50 61 72  (pParse);.  pPar
2b10: 73 65 2d 3e 73 41 72 67 2e 7a 20 3d 20 30 3b 0a  se->sArg.z = 0;.
2b20: 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 4d 6f 64    if( pTab->nMod
2b30: 75 6c 65 41 72 67 3c 31 20 29 20 72 65 74 75 72  uleArg<1 ) retur
2b40: 6e 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68  n;.  .  /* If th
2b50: 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  e CREATE VIRTUAL
2b60: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2b70: 20 69 73 20 62 65 69 6e 67 20 65 6e 74 65 72 65   is being entere
2b80: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 66  d for the.  ** f
2b90: 69 72 73 74 20 74 69 6d 65 20 28 69 6e 20 6f 74  irst time (in ot
2ba0: 68 65 72 20 77 6f 72 64 73 20 69 66 20 74 68 65  her words if the
2bb0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
2bc0: 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  s actually being
2bd0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 6e 6f  .  ** created no
2be0: 77 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73  w instead of jus
2bf0: 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 75 74  t being read out
2c00: 20 6f 66 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   of sqlite_maste
2c10: 72 29 20 74 68 65 6e 0a 20 20 2a 2a 20 64 6f 20  r) then.  ** do 
2c20: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 69 74 69  additional initi
2c30: 61 6c 69 7a 61 74 69 6f 6e 20 77 6f 72 6b 20 61  alization work a
2c40: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 73 74 61  nd store the sta
2c50: 74 65 6d 65 6e 74 20 74 65 78 74 0a 20 20 2a 2a  tement text.  **
2c60: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
2c70: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 2a  aster table..  *
2c80: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
2c90: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 63 68  t.busy ){.    ch
2ca0: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 63  ar *zStmt;.    c
2cb0: 68 61 72 20 2a 7a 57 68 65 72 65 3b 0a 20 20 20  har *zWhere;.   
2cc0: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 56 64   int iDb;.    Vd
2cd0: 62 65 20 2a 76 3b 0a 0a 20 20 20 20 2f 2a 20 43  be *v;..    /* C
2ce0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c  ompute the compl
2cf0: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
2d00: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
2d10: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
2d20: 2f 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  /.    if( pEnd )
2d30: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
2d40: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 28  sNameToken.n = (
2d50: 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70  int)(pEnd->z - p
2d60: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
2d70: 6e 2e 7a 29 20 2b 20 70 45 6e 64 2d 3e 6e 3b 0a  n.z) + pEnd->n;.
2d80: 20 20 20 20 7d 0a 20 20 20 20 7a 53 74 6d 74 20      }.    zStmt 
2d90: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
2da0: 28 64 62 2c 20 22 43 52 45 41 54 45 20 56 49 52  (db, "CREATE VIR
2db0: 54 55 41 4c 20 54 41 42 4c 45 20 25 54 22 2c 20  TUAL TABLE %T", 
2dc0: 26 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  &pParse->sNameTo
2dd0: 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  ken);..    /* A 
2de0: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
2df0: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
2e00: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
2e10: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
2e20: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
2e30: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
2e40: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
2e50: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
2e60: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
2e70: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
2e80: 63 74 65 64 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cted.  .    **. 
2e90: 20 20 20 2a 2a 20 54 68 65 20 56 4d 20 72 65 67     ** The VM reg
2ea0: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 70 50 61  ister number pPa
2eb0: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 68 6f  rse->regRowid ho
2ec0: 6c 64 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66  lds the rowid of
2ed0: 20 61 6e 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79   an.    ** entry
2ee0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
2ef0: 61 73 74 65 72 20 74 61 62 6c 65 20 74 68 74 20  aster table tht 
2f00: 77 61 73 20 63 72 65 61 74 65 64 20 66 6f 72 20  was created for 
2f10: 74 68 69 73 20 76 74 61 62 0a 20 20 20 20 2a 2a  this vtab.    **
2f20: 20 62 79 20 73 71 6c 69 74 65 33 53 74 61 72 74   by sqlite3Start
2f30: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2f 0a  Table()..    */.
2f40: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
2f50: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
2f60: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2f70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
2f80: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
2f90: 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
2fa0: 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
2fb0: 20 22 53 45 54 20 74 79 70 65 3d 27 74 61 62 6c   "SET type='tabl
2fc0: 65 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c  e', name=%Q, tbl
2fd0: 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61  _name=%Q, rootpa
2fe0: 67 65 3d 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20  ge=0, sql=%Q ". 
2ff0: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
3000: 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
3010: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
3020: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
3030: 69 44 62 29 2c 0a 20 20 20 20 20 20 70 54 61 62  iDb),.      pTab
3040: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
3050: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
3060: 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70    zStmt,.      p
3070: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a  Parse->regRowid.
3080: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
3090: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
30a0: 6d 74 29 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  mt);.    v = sql
30b0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
30c0: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
30d0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
30e0: 72 73 65 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  rse, iDb);..    
30f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3100: 32 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  2(v, OP_Expire, 
3110: 30 2c 20 30 29 3b 0a 20 20 20 20 7a 57 68 65 72  0, 0);.    zWher
3120: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
3130: 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71  tf(db, "name='%q
3140: 27 20 41 4e 44 20 74 79 70 65 3d 27 74 61 62 6c  ' AND type='tabl
3150: 65 27 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  e'", pTab->zName
3160: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3170: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
3180: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
3190: 20 31 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50   1, 0, zWhere, P
31a0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
31b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31c0: 34 28 76 2c 20 4f 50 5f 56 43 72 65 61 74 65 2c  4(v, OP_VCreate,
31d0: 20 69 44 62 2c 20 30 2c 20 30 2c 20 0a 20 20 20   iDb, 0, 0, .   
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
3200: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
3210: 33 30 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20  30(pTab->zName) 
3220: 2b 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  + 1);.  }..  /* 
3230: 49 66 20 77 65 20 61 72 65 20 72 65 72 65 61 64  If we are reread
3240: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
3250: 61 73 74 65 72 20 74 61 62 6c 65 20 63 72 65 61  aster table crea
3260: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
3270: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 6f 66 20  .  ** record of 
3280: 74 68 65 20 74 61 62 6c 65 2e 20 54 68 65 20 78  the table. The x
3290: 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64  Connect() method
32a0: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75   is not called u
32b0: 6e 74 69 6c 0a 20 20 2a 2a 20 74 68 65 20 66 69  ntil.  ** the fi
32c0: 72 73 74 20 74 69 6d 65 20 74 68 65 20 76 69 72  rst time the vir
32d0: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 75 73  tual table is us
32e0: 65 64 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed in an SQL sta
32f0: 74 65 6d 65 6e 74 2e 20 54 68 69 73 0a 20 20 2a  tement. This.  *
3300: 2a 20 61 6c 6c 6f 77 73 20 61 20 73 63 68 65 6d  * allows a schem
3310: 61 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  a that contains 
3320: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 74  virtual tables t
3330: 6f 20 62 65 20 6c 6f 61 64 65 64 20 62 65 66 6f  o be loaded befo
3340: 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 65 71 75  re.  ** the requ
3350: 69 72 65 64 20 76 69 72 74 75 61 6c 20 74 61 62  ired virtual tab
3360: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
3370: 6e 73 20 61 72 65 20 72 65 67 69 73 74 65 72 65  ns are registere
3380: 64 2e 20 20 2a 2f 0a 20 20 65 6c 73 65 20 7b 0a  d.  */.  else {.
3390: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
33a0: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
33b0: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
33c0: 68 65 6d 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20  hema;.    const 
33d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
33e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ab->zName;.    i
33f0: 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  nt nName = sqlit
3400: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
3410: 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
3420: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3430: 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
3440: 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  h, zName, nName,
3450: 20 70 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20   pTab);.    if( 
3460: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 64 62  pOld ){.      db
3470: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
3480: 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
3490: 28 20 70 54 61 62 3d 3d 70 4f 6c 64 20 29 3b 20  ( pTab==pOld ); 
34a0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
34b0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
34c0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
34d0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
34e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
34f0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
3500: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3510: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
3520: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3530: 6e 20 69 74 20 73 65 65 73 20 74 68 65 20 66 69  n it sees the fi
3540: 72 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 6f 66 20  rst token.** of 
3550: 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  an argument to t
3560: 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 69  he module name i
3570: 6e 20 61 20 43 52 45 41 54 45 20 56 49 52 54 55  n a CREATE VIRTU
3580: 41 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  AL TABLE stateme
3590: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
35a0: 74 65 33 56 74 61 62 41 72 67 49 6e 69 74 28 50  te3VtabArgInit(P
35b0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
35c0: 20 61 64 64 41 72 67 75 6d 65 6e 74 54 6f 56 74   addArgumentToVt
35d0: 61 62 28 70 50 61 72 73 65 29 3b 0a 20 20 70 50  ab(pParse);.  pP
35e0: 61 72 73 65 2d 3e 73 41 72 67 2e 7a 20 3d 20 30  arse->sArg.z = 0
35f0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 73 41 72 67  ;.  pParse->sArg
3600: 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .n = 0;.}../*.**
3610: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
3620: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  s this routine f
3630: 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 61 66  or each token af
3640: 74 65 72 20 74 68 65 20 66 69 72 73 74 20 74 6f  ter the first to
3650: 6b 65 6e 0a 2a 2a 20 69 6e 20 61 6e 20 61 72 67  ken.** in an arg
3660: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6d 6f 64  ument to the mod
3670: 75 6c 65 20 6e 61 6d 65 20 69 6e 20 61 20 43 52  ule name in a CR
3680: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
3690: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
36a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
36b0: 62 41 72 67 45 78 74 65 6e 64 28 50 61 72 73 65  bArgExtend(Parse
36c0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
36d0: 2a 70 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 41  *p){.  Token *pA
36e0: 72 67 20 3d 20 26 70 50 61 72 73 65 2d 3e 73 41  rg = &pParse->sA
36f0: 72 67 3b 0a 20 20 69 66 28 20 70 41 72 67 2d 3e  rg;.  if( pArg->
3700: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 41 72 67  z==0 ){.    pArg
3710: 2d 3e 7a 20 3d 20 70 2d 3e 7a 3b 0a 20 20 20 20  ->z = p->z;.    
3720: 70 41 72 67 2d 3e 6e 20 3d 20 70 2d 3e 6e 3b 0a  pArg->n = p->n;.
3730: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3740: 65 72 74 28 70 41 72 67 2d 3e 7a 20 3c 20 70 2d  ert(pArg->z < p-
3750: 3e 7a 29 3b 0a 20 20 20 20 70 41 72 67 2d 3e 6e  >z);.    pArg->n
3760: 20 3d 20 28 69 6e 74 29 28 26 70 2d 3e 7a 5b 70   = (int)(&p->z[p
3770: 2d 3e 6e 5d 20 2d 20 70 41 72 67 2d 3e 7a 29 3b  ->n] - pArg->z);
3780: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
3790: 76 6f 6b 65 20 61 20 76 69 72 74 75 61 6c 20 74  voke a virtual t
37a0: 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72  able constructor
37b0: 20 28 65 69 74 68 65 72 20 78 43 72 65 61 74 65   (either xCreate
37c0: 20 6f 72 20 78 43 6f 6e 6e 65 63 74 29 2e 20 54   or xConnect). T
37d0: 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  he.** pointer to
37e0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f   the function to
37f0: 20 69 6e 76 6f 6b 65 20 69 73 20 70 61 73 73 65   invoke is passe
3800: 64 20 61 73 20 74 68 65 20 66 6f 75 72 74 68 20  d as the fourth 
3810: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74 6f 20  parameter.** to 
3820: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a  this procedure..
3830: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
3840: 61 62 43 61 6c 6c 43 6f 6e 73 74 72 75 63 74 6f  abCallConstructo
3850: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
3860: 2c 20 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  , .  Table *pTab
3870: 2c 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64  ,.  Module *pMod
3880: 2c 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e 73 74  ,.  int (*xConst
3890: 72 75 63 74 29 28 73 71 6c 69 74 65 33 2a 2c 76  ruct)(sqlite3*,v
38a0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
38b0: 68 61 72 2a 63 6f 6e 73 74 2a 2c 73 71 6c 69 74  har*const*,sqlit
38c0: 65 33 5f 76 74 61 62 2a 2a 2c 63 68 61 72 2a 2a  e3_vtab**,char**
38d0: 29 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  ),.  char **pzEr
38e0: 72 0a 29 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70  r.){.  VTable *p
38f0: 56 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 63  VTable;.  int rc
3900: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
3910: 63 6f 6e 73 74 2a 61 7a 41 72 67 20 3d 20 28 63  const*azArg = (c
3920: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
3930: 2a 29 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  *)pTab->azModule
3940: 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  Arg;.  int nArg 
3950: 3d 20 70 54 61 62 2d 3e 6e 4d 6f 64 75 6c 65 41  = pTab->nModuleA
3960: 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rg;.  char *zErr
3970: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d   = 0;.  char *zM
3980: 6f 64 75 6c 65 4e 61 6d 65 20 3d 20 73 71 6c 69  oduleName = sqli
3990: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
39a0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
39b0: 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 6f 64 75  );..  if( !zModu
39c0: 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 72 65  leName ){.    re
39d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
39e0: 4d 3b 0a 20 20 7d 0a 0a 20 20 70 56 54 61 62 6c  M;.  }..  pVTabl
39f0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
3a00: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
3a10: 6f 66 28 56 54 61 62 6c 65 29 29 3b 0a 20 20 69  of(VTable));.  i
3a20: 66 28 20 21 70 56 54 61 62 6c 65 20 29 7b 0a 20  f( !pVTable ){. 
3a30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3a40: 28 64 62 2c 20 7a 4d 6f 64 75 6c 65 4e 61 6d 65  (db, zModuleName
3a50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
3a60: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
3a70: 20 20 70 56 54 61 62 6c 65 2d 3e 64 62 20 3d 20    pVTable->db = 
3a80: 64 62 3b 0a 20 20 70 56 54 61 62 6c 65 2d 3e 70  db;.  pVTable->p
3a90: 4d 6f 64 20 3d 20 70 4d 6f 64 3b 0a 0a 20 20 61  Mod = pMod;..  a
3aa0: 73 73 65 72 74 28 20 21 64 62 2d 3e 70 56 54 61  ssert( !db->pVTa
3ab0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 78  b );.  assert( x
3ac0: 43 6f 6e 73 74 72 75 63 74 20 29 3b 0a 20 20 64  Construct );.  d
3ad0: 62 2d 3e 70 56 54 61 62 20 3d 20 70 54 61 62 3b  b->pVTab = pTab;
3ae0: 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
3af0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
3b00: 63 6f 6e 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20  constructor */. 
3b10: 20 72 63 20 3d 20 78 43 6f 6e 73 74 72 75 63 74   rc = xConstruct
3b20: 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 41 75 78 2c  (db, pMod->pAux,
3b30: 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 26 70   nArg, azArg, &p
3b40: 56 54 61 62 6c 65 2d 3e 70 56 74 61 62 2c 20 26  VTable->pVtab, &
3b50: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  zErr);.  if( rc=
3b60: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
3b70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3b80: 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 53 51 4c   = 1;..  if( SQL
3b90: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
3ba0: 20 20 69 66 28 20 7a 45 72 72 3d 3d 30 20 29 7b    if( zErr==0 ){
3bb0: 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  .      *pzErr = 
3bc0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
3bd0: 62 2c 20 22 76 74 61 62 6c 65 20 63 6f 6e 73 74  b, "vtable const
3be0: 72 75 63 74 6f 72 20 66 61 69 6c 65 64 3a 20 25  ructor failed: %
3bf0: 73 22 2c 20 7a 4d 6f 64 75 6c 65 4e 61 6d 65 29  s", zModuleName)
3c00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20  ;.    }else {.  
3c10: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
3c20: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
3c30: 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  "%s", zErr);.   
3c40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3c50: 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zErr);.    }.   
3c60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3c70: 62 2c 20 70 56 54 61 62 6c 65 29 3b 0a 20 20 7d  b, pVTable);.  }
3c80: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
3c90: 70 56 54 61 62 6c 65 2d 3e 70 56 74 61 62 29 20  pVTable->pVtab) 
3ca0: 29 7b 0a 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  ){.    /* Justif
3cb0: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3cc0: 53 28 29 3a 20 20 41 20 63 6f 72 72 65 63 74 20  S():  A correct 
3cd0: 76 74 61 62 20 63 6f 6e 73 74 72 75 63 74 6f 72  vtab constructor
3ce0: 20 6d 75 73 74 20 61 6c 6c 6f 63 61 74 65 0a 20   must allocate. 
3cf0: 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65     ** the sqlite
3d00: 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20 69 66  3_vtab object if
3d10: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 20 2a 2f   successful.  */
3d20: 0a 20 20 20 20 70 56 54 61 62 6c 65 2d 3e 70 56  .    pVTable->pV
3d30: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 20 3d 20 70  tab->pModule = p
3d40: 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  Mod->pModule;.  
3d50: 20 20 70 56 54 61 62 6c 65 2d 3e 6e 52 65 66 20    pVTable->nRef 
3d60: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  = 1;.    if( db-
3d70: 3e 70 56 54 61 62 20 29 7b 0a 20 20 20 20 20 20  >pVTab ){.      
3d80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
3d90: 6d 61 74 20 3d 20 22 76 74 61 62 6c 65 20 63 6f  mat = "vtable co
3da0: 6e 73 74 72 75 63 74 6f 72 20 64 69 64 20 6e 6f  nstructor did no
3db0: 74 20 64 65 63 6c 61 72 65 20 73 63 68 65 6d 61  t declare schema
3dc0: 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 2a 70 7a  : %s";.      *pz
3dd0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Err = sqlite3MPr
3de0: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
3df0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
3e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
3e10: 62 55 6e 6c 6f 63 6b 28 70 56 54 61 62 6c 65 29  bUnlock(pVTable)
3e20: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
3e30: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
3e40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
3e50: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 2f 2a 20 49  iCol;.      /* I
3e60: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 6e  f everything wen
3e70: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  t according to p
3e80: 6c 61 6e 2c 20 6c 69 6e 6b 20 74 68 65 20 6e 65  lan, link the ne
3e90: 77 20 56 54 61 62 6c 65 20 73 74 72 75 63 74 75  w VTable structu
3ea0: 72 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  re.      ** into
3eb0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
3ec0: 20 68 65 61 64 65 64 20 62 79 20 70 54 61 62 2d   headed by pTab-
3ed0: 3e 70 56 54 61 62 6c 65 2e 20 54 68 65 6e 20 6c  >pVTable. Then l
3ee0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
3ef0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
3f00: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
3f10: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 6f 66 20  o see if any of 
3f20: 74 68 65 6d 20 63 6f 6e 74 61 69 6e 20 74 68 65  them contain the
3f30: 20 74 6f 6b 65 6e 20 22 68 69 64 64 65 6e 22 2e   token "hidden".
3f40: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f 2c  .      ** If so,
3f50: 20 73 65 74 20 74 68 65 20 43 6f 6c 75 6d 6e 2e   set the Column.
3f60: 69 73 48 69 64 64 65 6e 20 66 6c 61 67 20 61 6e  isHidden flag an
3f70: 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 6b  d remove the tok
3f80: 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  en from.      **
3f90: 20 74 68 65 20 74 79 70 65 20 73 74 72 69 6e 67   the type string
3fa0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 56 54 61  .  */.      pVTa
3fb0: 62 6c 65 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  ble->pNext = pTa
3fc0: 62 2d 3e 70 56 54 61 62 6c 65 3b 0a 20 20 20 20  b->pVTable;.    
3fd0: 20 20 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 20    pTab->pVTable 
3fe0: 3d 20 70 56 54 61 62 6c 65 3b 0a 0a 20 20 20 20  = pVTable;..    
3ff0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
4000: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
4010: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
4020: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 54  char *zType = pT
4030: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
4040: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Type;.        in
4050: 74 20 6e 54 79 70 65 3b 0a 20 20 20 20 20 20 20  t nType;.       
4060: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
4070: 20 20 20 20 69 66 28 20 21 7a 54 79 70 65 20 29      if( !zType )
4080: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4090: 20 20 20 6e 54 79 70 65 20 3d 20 73 71 6c 69 74     nType = sqlit
40a0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
40b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
40c0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 22  qlite3StrNICmp("
40d0: 68 69 64 64 65 6e 22 2c 20 7a 54 79 70 65 2c 20  hidden", zType, 
40e0: 36 29 7c 7c 28 7a 54 79 70 65 5b 36 5d 20 26 26  6)||(zType[6] &&
40f0: 20 7a 54 79 70 65 5b 36 5d 21 3d 27 20 27 29 20   zType[6]!=' ') 
4100: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
4110: 28 69 3d 30 3b 20 69 3c 6e 54 79 70 65 3b 20 69  (i=0; i<nType; i
4120: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
4130: 20 69 66 28 20 28 30 3d 3d 73 71 6c 69 74 65 33   if( (0==sqlite3
4140: 53 74 72 4e 49 43 6d 70 28 22 20 68 69 64 64 65  StrNICmp(" hidde
4150: 6e 22 2c 20 26 7a 54 79 70 65 5b 69 5d 2c 20 37  n", &zType[i], 7
4160: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
4170: 26 26 20 28 7a 54 79 70 65 5b 69 2b 37 5d 3d 3d  && (zType[i+7]==
4180: 27 5c 30 27 20 7c 7c 20 7a 54 79 70 65 5b 69 2b  '\0' || zType[i+
4190: 37 5d 3d 3d 27 20 27 29 0a 20 20 20 20 20 20 20  7]==' ').       
41a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
41b0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
41c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
41e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
41f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
4200: 69 3c 6e 54 79 70 65 20 29 7b 0a 20 20 20 20 20  i<nType ){.     
4210: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
4220: 20 20 20 20 20 20 69 6e 74 20 6e 44 65 6c 20 3d        int nDel =
4230: 20 36 20 2b 20 28 7a 54 79 70 65 5b 69 2b 36 5d   6 + (zType[i+6]
4240: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
4250: 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 28 6a       for(j=i; (j
4260: 2b 6e 44 65 6c 29 3c 3d 6e 54 79 70 65 3b 20 6a  +nDel)<=nType; j
4270: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
4280: 20 7a 54 79 70 65 5b 6a 5d 20 3d 20 7a 54 79 70   zType[j] = zTyp
4290: 65 5b 6a 2b 6e 44 65 6c 5d 3b 0a 20 20 20 20 20  e[j+nDel];.     
42a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
42b0: 20 69 66 28 20 7a 54 79 70 65 5b 69 5d 3d 3d 27   if( zType[i]=='
42c0: 5c 30 27 20 26 26 20 69 3e 30 20 29 7b 0a 20 20  \0' && i>0 ){.  
42d0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
42e0: 28 7a 54 79 70 65 5b 69 2d 31 5d 3d 3d 27 20 27  (zType[i-1]==' '
42f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
4300: 54 79 70 65 5b 69 2d 31 5d 20 3d 20 27 5c 30 27  Type[i-1] = '\0'
4310: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4320: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
4330: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 48 69 64 64 65  ol[iCol].isHidde
4340: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
4350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4360: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
4370: 72 65 65 28 64 62 2c 20 7a 4d 6f 64 75 6c 65 4e  ree(db, zModuleN
4380: 61 6d 65 29 3b 0a 20 20 64 62 2d 3e 70 56 54 61  ame);.  db->pVTa
4390: 62 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  b = 0;.  return 
43a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
43b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
43c0: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 70 61 72  voked by the par
43d0: 73 65 72 20 74 6f 20 63 61 6c 6c 20 74 68 65 20  ser to call the 
43e0: 78 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  xConnect() metho
43f0: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74  d.** of the virt
4400: 75 61 6c 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ual table pTab. 
4410: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
4420: 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
4430: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 0a 2a  e is returned .*
4440: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c  * and an error l
4450: 65 66 74 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  eft in pParse..*
4460: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
4470: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 61 62  s a no-op if tab
4480: 6c 65 20 70 54 61 62 20 69 73 20 6e 6f 74 20 61  le pTab is not a
4490: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
44a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74  */.int sqlite3Vt
44b0: 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 50 61  abCallConnect(Pa
44c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
44d0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 73 71 6c  le *pTab){.  sql
44e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
44f0: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
4500: 68 61 72 20 2a 7a 4d 6f 64 3b 0a 20 20 4d 6f 64  har *zMod;.  Mod
4510: 75 6c 65 20 2a 70 4d 6f 64 3b 0a 20 20 69 6e 74  ule *pMod;.  int
4520: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
4530: 70 54 61 62 20 29 3b 0a 20 20 69 66 28 20 28 70  pTab );.  if( (p
4540: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
4550: 54 46 5f 56 69 72 74 75 61 6c 29 3d 3d 30 20 7c  TF_Virtual)==0 |
4560: 7c 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  | sqlite3GetVTab
4570: 6c 65 28 64 62 2c 20 70 54 61 62 29 20 29 7b 0a  le(db, pTab) ){.
4580: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4590: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
45a0: 4c 6f 63 61 74 65 20 74 68 65 20 72 65 71 75 69  Locate the requi
45b0: 72 65 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c  red virtual tabl
45c0: 65 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 7a 4d  e module */.  zM
45d0: 6f 64 20 3d 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  od = pTab->azMod
45e0: 75 6c 65 41 72 67 5b 30 5d 3b 0a 20 20 70 4d 6f  uleArg[0];.  pMo
45f0: 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c  d = (Module*)sql
4600: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
4610: 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4d 6f 64 2c  ->aModule, zMod,
4620: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
4630: 28 7a 4d 6f 64 29 29 3b 0a 0a 20 20 69 66 28 20  (zMod));..  if( 
4640: 21 70 4d 6f 64 20 29 7b 0a 20 20 20 20 63 6f 6e  !pMod ){.    con
4650: 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 75 6c 65  st char *zModule
4660: 20 3d 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c   = pTab->azModul
4670: 65 41 72 67 5b 30 5d 3b 0a 20 20 20 20 73 71 6c  eArg[0];.    sql
4680: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4690: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 6d 6f  rse, "no such mo
46a0: 64 75 6c 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 75  dule: %s", zModu
46b0: 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  le);.    rc = SQ
46c0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
46d0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
46e0: 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Err = 0;.    rc 
46f0: 3d 20 76 74 61 62 43 61 6c 6c 43 6f 6e 73 74 72  = vtabCallConstr
4700: 75 63 74 6f 72 28 64 62 2c 20 70 54 61 62 2c 20  uctor(db, pTab, 
4710: 70 4d 6f 64 2c 20 70 4d 6f 64 2d 3e 70 4d 6f 64  pMod, pMod->pMod
4720: 75 6c 65 2d 3e 78 43 6f 6e 6e 65 63 74 2c 20 26  ule->xConnect, &
4730: 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
4740: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4760: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
4770: 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d  s", zErr);.    }
4780: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4790: 65 65 28 64 62 2c 20 7a 45 72 72 29 3b 0a 20 20  ee(db, zErr);.  
47a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
47b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
47c0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 70   virtual table p
47d0: 56 54 61 62 20 74 6f 20 74 68 65 20 61 72 72 61  VTab to the arra
47e0: 79 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e  y sqlite3.aVTran
47f0: 73 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s[]..*/.static i
4800: 6e 74 20 61 64 64 54 6f 56 54 72 61 6e 73 28 73  nt addToVTrans(s
4810: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 54 61 62  qlite3 *db, VTab
4820: 6c 65 20 2a 70 56 54 61 62 29 7b 0a 20 20 63 6f  le *pVTab){.  co
4830: 6e 73 74 20 69 6e 74 20 41 52 52 41 59 5f 49 4e  nst int ARRAY_IN
4840: 43 52 20 3d 20 35 3b 0a 0a 20 20 2f 2a 20 47 72  CR = 5;..  /* Gr
4850: 6f 77 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  ow the sqlite3.a
4860: 56 54 72 61 6e 73 20 61 72 72 61 79 20 69 66 20  VTrans array if 
4870: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
4880: 28 20 28 64 62 2d 3e 6e 56 54 72 61 6e 73 25 41  ( (db->nVTrans%A
4890: 52 52 41 59 5f 49 4e 43 52 29 3d 3d 30 20 29 7b  RRAY_INCR)==0 ){
48a0: 0a 20 20 20 20 56 54 61 62 6c 65 20 2a 2a 61 56  .    VTable **aV
48b0: 54 72 61 6e 73 3b 0a 20 20 20 20 69 6e 74 20 6e  Trans;.    int n
48c0: 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 73  Bytes = sizeof(s
48d0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 20 2a  qlite3_vtab *) *
48e0: 20 28 64 62 2d 3e 6e 56 54 72 61 6e 73 20 2b 20   (db->nVTrans + 
48f0: 41 52 52 41 59 5f 49 4e 43 52 29 3b 0a 20 20 20  ARRAY_INCR);.   
4900: 20 61 56 54 72 61 6e 73 20 3d 20 73 71 6c 69 74   aVTrans = sqlit
4910: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
4920: 28 76 6f 69 64 20 2a 29 64 62 2d 3e 61 56 54 72  (void *)db->aVTr
4930: 61 6e 73 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20  ans, nBytes);.  
4940: 20 20 69 66 28 20 21 61 56 54 72 61 6e 73 20 29    if( !aVTrans )
4950: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
4960: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4970: 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61   }.    memset(&a
4980: 56 54 72 61 6e 73 5b 64 62 2d 3e 6e 56 54 72 61  VTrans[db->nVTra
4990: 6e 73 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ns], 0, sizeof(s
49a0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 2a 41  qlite3_vtab *)*A
49b0: 52 52 41 59 5f 49 4e 43 52 29 3b 0a 20 20 20 20  RRAY_INCR);.    
49c0: 64 62 2d 3e 61 56 54 72 61 6e 73 20 3d 20 61 56  db->aVTrans = aV
49d0: 54 72 61 6e 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Trans;.  }..  /*
49e0: 20 41 64 64 20 70 56 74 61 62 20 74 6f 20 74 68   Add pVtab to th
49f0: 65 20 65 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  e end of sqlite3
4a00: 2e 61 56 54 72 61 6e 73 20 2a 2f 0a 20 20 64 62  .aVTrans */.  db
4a10: 2d 3e 61 56 54 72 61 6e 73 5b 64 62 2d 3e 6e 56  ->aVTrans[db->nV
4a20: 54 72 61 6e 73 2b 2b 5d 20 3d 20 70 56 54 61 62  Trans++] = pVTab
4a30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c  ;.  sqlite3VtabL
4a40: 6f 63 6b 28 70 56 54 61 62 29 3b 0a 20 20 72 65  ock(pVTab);.  re
4a50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
4a70: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
4a80: 64 20 62 79 20 74 68 65 20 76 64 62 65 20 74 6f  d by the vdbe to
4a90: 20 63 61 6c 6c 20 74 68 65 20 78 43 72 65 61 74   call the xCreat
4aa0: 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
4ab0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
4ac0: 20 6e 61 6d 65 64 20 7a 54 61 62 20 69 6e 20 64   named zTab in d
4ad0: 61 74 61 62 61 73 65 20 69 44 62 2e 20 0a 2a 2a  atabase iDb. .**
4ae0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
4af0: 6f 63 63 75 72 73 2c 20 2a 70 7a 45 72 72 20 69  occurs, *pzErr i
4b00: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61  s set to point a
4b10: 6e 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  n an English lan
4b20: 67 75 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 70  guage.** descrip
4b30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f  tion of the erro
4b40: 72 20 61 6e 64 20 61 6e 20 53 51 4c 49 54 45 5f  r and an SQLITE_
4b50: 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
4b60: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 49  s returned..** I
4b70: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
4b80: 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c  caller must call
4b90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4ba0: 62 2c 20 29 20 6f 6e 20 2a 70 7a 45 72 72 2e 0a  b, ) on *pzErr..
4bb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74  */.int sqlite3Vt
4bc0: 61 62 43 61 6c 6c 43 72 65 61 74 65 28 73 71 6c  abCallCreate(sql
4bd0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4be0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4bf0: 54 61 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72  Tab, char **pzEr
4c00: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
4c10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 61 62 6c  QLITE_OK;.  Tabl
4c20: 65 20 2a 70 54 61 62 3b 0a 20 20 4d 6f 64 75 6c  e *pTab;.  Modul
4c30: 65 20 2a 70 4d 6f 64 3b 0a 20 20 63 6f 6e 73 74  e *pMod;.  const
4c40: 20 63 68 61 72 20 2a 7a 4d 6f 64 3b 0a 0a 20 20   char *zMod;..  
4c50: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
4c60: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62  ndTable(db, zTab
4c70: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
4c80: 4e 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Name);.  assert(
4c90: 20 70 54 61 62 20 26 26 20 28 70 54 61 62 2d 3e   pTab && (pTab->
4ca0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 56 69  tabFlags & TF_Vi
4cb0: 72 74 75 61 6c 29 21 3d 30 20 26 26 20 21 70 54  rtual)!=0 && !pT
4cc0: 61 62 2d 3e 70 56 54 61 62 6c 65 20 29 3b 0a 0a  ab->pVTable );..
4cd0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
4ce0: 72 65 71 75 69 72 65 64 20 76 69 72 74 75 61 6c  required virtual
4cf0: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 2a 2f   table module */
4d00: 0a 20 20 7a 4d 6f 64 20 3d 20 70 54 61 62 2d 3e  .  zMod = pTab->
4d10: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 3b 0a  azModuleArg[0];.
4d20: 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65    pMod = (Module
4d30: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
4d40: 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20  d(&db->aModule, 
4d50: 7a 4d 6f 64 2c 20 73 71 6c 69 74 65 33 53 74 72  zMod, sqlite3Str
4d60: 6c 65 6e 33 30 28 7a 4d 6f 64 29 29 3b 0a 0a 20  len30(zMod));.. 
4d70: 20 2f 2a 20 49 66 20 74 68 65 20 6d 6f 64 75 6c   /* If the modul
4d80: 65 20 68 61 73 20 62 65 65 6e 20 72 65 67 69 73  e has been regis
4d90: 74 65 72 65 64 20 61 6e 64 20 69 6e 63 6c 75 64  tered and includ
4da0: 65 73 20 61 20 43 72 65 61 74 65 20 6d 65 74 68  es a Create meth
4db0: 6f 64 2c 20 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  od, .  ** invoke
4dc0: 20 69 74 20 6e 6f 77 2e 20 49 66 20 74 68 65 20   it now. If the 
4dd0: 6d 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74 20 62  module has not b
4de0: 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 2c 20  een registered, 
4df0: 72 65 74 75 72 6e 20 61 6e 20 0a 20 20 2a 2a 20  return an .  ** 
4e00: 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
4e10: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
4e20: 2a 2f 0a 20 20 69 66 28 20 21 70 4d 6f 64 20 29  */.  if( !pMod )
4e30: 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73  {.    *pzErr = s
4e40: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
4e50: 2c 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c  , "no such modul
4e60: 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 29 3b 0a 20  e: %s", zMod);. 
4e70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
4e80: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
4e90: 20 20 20 72 63 20 3d 20 76 74 61 62 43 61 6c 6c     rc = vtabCall
4ea0: 43 6f 6e 73 74 72 75 63 74 6f 72 28 64 62 2c 20  Constructor(db, 
4eb0: 70 54 61 62 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64  pTab, pMod, pMod
4ec0: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 43 72 65 61  ->pModule->xCrea
4ed0: 74 65 2c 20 70 7a 45 72 72 29 3b 0a 20 20 7d 0a  te, pzErr);.  }.
4ee0: 0a 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74  .  /* Justificat
4ef0: 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3a  ion of ALWAYS():
4f00: 20 20 54 68 65 20 78 43 6f 6e 73 74 72 75 63 74    The xConstruct
4f10: 6f 72 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71  or method is req
4f20: 75 69 72 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72  uired to.  ** cr
4f30: 65 61 74 65 20 61 20 76 61 6c 69 64 20 73 71 6c  eate a valid sql
4f40: 69 74 65 33 5f 76 74 61 62 20 69 66 20 69 74 20  ite3_vtab if it 
4f50: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
4f60: 4b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  K. */.  if( rc==
4f70: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 41 4c 57  SQLITE_OK && ALW
4f80: 41 59 53 28 73 71 6c 69 74 65 33 47 65 74 56 54  AYS(sqlite3GetVT
4f90: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 29 20  able(db, pTab)) 
4fa0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 64  ){.      rc = ad
4fb0: 64 54 6f 56 54 72 61 6e 73 28 64 62 2c 20 73 71  dToVTrans(db, sq
4fc0: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
4fd0: 62 2c 20 70 54 61 62 29 29 3b 0a 20 20 7d 0a 0a  b, pTab));.  }..
4fe0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4ff0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
5000: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
5010: 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  et the schema of
5020: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
5030: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a  .  It is only.**
5040: 20 76 61 6c 69 64 20 74 6f 20 63 61 6c 6c 20 74   valid to call t
5050: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  his function fro
5060: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78 43 72  m within the xCr
5070: 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e 6e 65  eate() or xConne
5080: 63 74 28 29 20 6f 66 20 61 0a 2a 2a 20 76 69 72  ct() of a.** vir
5090: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
50a0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
50b0: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 73  3_declare_vtab(s
50c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
50d0: 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 54  t char *zCreateT
50e0: 61 62 6c 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  able){.  Parse *
50f0: 70 50 61 72 73 65 3b 0a 0a 20 20 69 6e 74 20 72  pParse;..  int r
5100: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5110: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5120: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
5130: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5140: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
5150: 29 3b 0a 20 20 70 54 61 62 20 3d 20 64 62 2d 3e  );.  pTab = db->
5160: 70 56 54 61 62 3b 0a 20 20 69 66 28 20 21 70 54  pVTab;.  if( !pT
5170: 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
5180: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
5190: 45 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a 20 20  E_MISUSE, 0);.  
51a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
51b0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
51c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
51d0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
51e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
51f0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
5200: 20 54 46 5f 56 69 72 74 75 61 6c 29 21 3d 30 20   TF_Virtual)!=0 
5210: 29 3b 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 73  );..  pParse = s
5220: 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
5230: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
5240: 2a 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66 28  *pParse));.  if(
5250: 20 70 50 61 72 73 65 3d 3d 30 20 29 7b 0a 20 20   pParse==0 ){.  
5260: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5270: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
5280: 20 20 70 50 61 72 73 65 2d 3e 64 65 63 6c 61 72    pParse->declar
5290: 65 56 74 61 62 20 3d 20 31 3b 0a 20 20 20 20 70  eVtab = 1;.    p
52a0: 50 61 72 73 65 2d 3e 64 62 20 3d 20 64 62 3b 0a  Parse->db = db;.
52b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
52c0: 72 79 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 0a 20  ryLoop = 1;.  . 
52d0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
52e0: 3d 3d 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73  ==sqlite3RunPars
52f0: 65 72 28 70 50 61 72 73 65 2c 20 7a 43 72 65 61  er(pParse, zCrea
5300: 74 65 54 61 62 6c 65 2c 20 26 7a 45 72 72 29 20  teTable, &zErr) 
5310: 0a 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d  .     && pParse-
5320: 3e 70 4e 65 77 54 61 62 6c 65 0a 20 20 20 20 20  >pNewTable.     
5330: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
5340: 69 6c 65 64 0a 20 20 20 20 20 26 26 20 21 70 50  iled.     && !pP
5350: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2d  arse->pNewTable-
5360: 3e 70 53 65 6c 65 63 74 0a 20 20 20 20 20 26 26  >pSelect.     &&
5370: 20 28 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61   (pParse->pNewTa
5380: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ble->tabFlags & 
5390: 54 46 5f 56 69 72 74 75 61 6c 29 3d 3d 30 0a 20  TF_Virtual)==0. 
53a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
53b0: 21 70 54 61 62 2d 3e 61 43 6f 6c 20 29 7b 0a 20  !pTab->aCol ){. 
53c0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
53d0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  l = pParse->pNew
53e0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 20  Table->aCol;.   
53f0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
5400: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
5410: 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  ble->nCol;.     
5420: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
5430: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
5440: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5450: 70 4e 65 77 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  pNewTable->aCol 
5460: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
5470: 20 20 20 64 62 2d 3e 70 56 54 61 62 20 3d 20 30     db->pVTab = 0
5480: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5490: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
54a0: 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  db, SQLITE_ERROR
54b0: 2c 20 28 7a 45 72 72 20 3f 20 22 25 73 22 20 3a  , (zErr ? "%s" :
54c0: 20 30 29 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20   0), zErr);.    
54d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
54e0: 64 62 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  db, zErr);.     
54f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
5500: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  OR;.    }.    pP
5510: 61 72 73 65 2d 3e 64 65 63 6c 61 72 65 56 74 61  arse->declareVta
5520: 62 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 69 66  b = 0;.  .    if
5530: 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  ( pParse->pVdbe 
5540: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5550: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 70 50 61  VdbeFinalize(pPa
5560: 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a 20 20 20  rse->pVdbe);.   
5570: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
5580: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50  leteTable(db, pP
5590: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
55a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 61  ;.    sqlite3Sta
55b0: 63 6b 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  ckFree(db, pPars
55c0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  e);.  }..  asser
55d0: 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 72 63  t( (rc&0xff)==rc
55e0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
55f0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
5600: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
5610: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
5620: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
5630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5640: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
5650: 6b 65 64 20 62 79 20 74 68 65 20 76 64 62 65 20  ked by the vdbe 
5660: 74 6f 20 63 61 6c 6c 20 74 68 65 20 78 44 65 73  to call the xDes
5670: 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  troy method.** o
5680: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
5690: 62 6c 65 20 6e 61 6d 65 64 20 7a 54 61 62 20 69  ble named zTab i
56a0: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
56b0: 54 68 69 73 20 6f 63 63 75 72 73 0a 2a 2a 20 77  This occurs.** w
56c0: 68 65 6e 20 61 20 44 52 4f 50 20 54 41 42 4c 45  hen a DROP TABLE
56d0: 20 69 73 20 6d 65 6e 74 69 6f 6e 65 64 2e 0a 2a   is mentioned..*
56e0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
56f0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 7a 54 61  s a no-op if zTa
5700: 62 20 69 73 20 6e 6f 74 20 61 20 76 69 72 74 75  b is not a virtu
5710: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  al table..*/.int
5720: 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
5730: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
5740: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
5750: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b  nst char *zTab){
5760: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5770: 54 45 5f 4f 4b 3b 0a 20 20 54 61 62 6c 65 20 2a  TE_OK;.  Table *
5780: 70 54 61 62 3b 0a 0a 20 20 70 54 61 62 20 3d 20  pTab;..  pTab = 
5790: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
57a0: 28 64 62 2c 20 7a 54 61 62 2c 20 64 62 2d 3e 61  (db, zTab, db->a
57b0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a  Db[iDb].zName);.
57c0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
57d0: 62 21 3d 30 20 26 26 20 70 54 61 62 2d 3e 70 56  b!=0 && pTab->pV
57e0: 54 61 62 6c 65 21 3d 30 29 20 29 7b 0a 20 20 20  Table!=0) ){.   
57f0: 20 56 54 61 62 6c 65 20 2a 70 20 3d 20 76 74 61   VTable *p = vta
5800: 62 44 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 28 64  bDisconnectAll(d
5810: 62 2c 20 70 54 61 62 29 3b 0a 0a 20 20 20 20 61  b, pTab);..    a
5820: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
5830: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
5840: 20 70 2d 3e 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c   p->pMod->pModul
5850: 65 2d 3e 78 44 65 73 74 72 6f 79 28 70 2d 3e 70  e->xDestroy(p->p
5860: 56 74 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  Vtab);..    /* R
5870: 65 6d 6f 76 65 20 74 68 65 20 73 71 6c 69 74 65  emove the sqlite
5880: 33 5f 76 74 61 62 2a 20 66 72 6f 6d 20 74 68 65  3_vtab* from the
5890: 20 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79   aVTrans[] array
58a0: 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 20  , if applicable 
58b0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
58c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
58d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
58e0: 70 56 54 61 62 6c 65 3d 3d 70 20 26 26 20 70 2d  pVTable==p && p-
58f0: 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  >pNext==0 );.   
5900: 20 20 20 70 2d 3e 70 56 74 61 62 20 3d 20 30 3b     p->pVtab = 0;
5910: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 56 54  .      pTab->pVT
5920: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
5930: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
5940: 6b 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  k(p);.    }.  }.
5950: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5960: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
5970: 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 65 69 74  tion invokes eit
5980: 68 65 72 20 74 68 65 20 78 52 6f 6c 6c 62 61 63  her the xRollbac
5990: 6b 20 6f 72 20 78 43 6f 6d 6d 69 74 20 6d 65 74  k or xCommit met
59a0: 68 6f 64 0a 2a 2a 20 6f 66 20 65 61 63 68 20 6f  hod.** of each o
59b0: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
59c0: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  bles in the sqli
59d0: 74 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72 61  te3.aVTrans arra
59e0: 79 2e 20 54 68 65 20 6d 65 74 68 6f 64 0a 2a 2a  y. The method.**
59f0: 20 63 61 6c 6c 65 64 20 69 73 20 69 64 65 6e 74   called is ident
5a00: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 65 63  ified by the sec
5a10: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 22 6f  ond argument, "o
5a20: 66 66 73 65 74 22 2c 20 77 68 69 63 68 20 69 73  ffset", which is
5a30: 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 6f  .** the offset o
5a40: 66 20 74 68 65 20 6d 65 74 68 6f 64 20 74 6f 20  f the method to 
5a50: 63 61 6c 6c 20 69 6e 20 74 68 65 20 73 71 6c 69  call in the sqli
5a60: 74 65 33 5f 6d 6f 64 75 6c 65 20 73 74 72 75 63  te3_module struc
5a70: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
5a80: 61 72 72 61 79 20 69 73 20 63 6c 65 61 72 65 64  array is cleared
5a90: 20 61 66 74 65 72 20 69 6e 76 6f 6b 69 6e 67 20   after invoking 
5aa0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2e 20 0a  the callbacks. .
5ab0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5ac0: 61 6c 6c 46 69 6e 61 6c 69 73 65 72 28 73 71 6c  allFinaliser(sql
5ad0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 66  ite3 *db, int of
5ae0: 66 73 65 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  fset){.  int i;.
5af0: 20 20 69 66 28 20 64 62 2d 3e 61 56 54 72 61 6e    if( db->aVTran
5b00: 73 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  s ){.    for(i=0
5b10: 3b 20 69 3c 64 62 2d 3e 6e 56 54 72 61 6e 73 3b  ; i<db->nVTrans;
5b20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 54 61   i++){.      VTa
5b30: 62 6c 65 20 2a 70 56 54 61 62 20 3d 20 64 62 2d  ble *pVTab = db-
5b40: 3e 61 56 54 72 61 6e 73 5b 69 5d 3b 0a 20 20 20  >aVTrans[i];.   
5b50: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
5b60: 2a 70 20 3d 20 70 56 54 61 62 2d 3e 70 56 74 61  *p = pVTab->pVta
5b70: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20 29  b;.      if( p )
5b80: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 28 2a  {.        int (*
5b90: 78 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  x)(sqlite3_vtab 
5ba0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20  *);.        x = 
5bb0: 2a 28 69 6e 74 20 28 2a 2a 29 28 73 71 6c 69 74  *(int (**)(sqlit
5bc0: 65 33 5f 76 74 61 62 20 2a 29 29 28 28 63 68 61  e3_vtab *))((cha
5bd0: 72 20 2a 29 70 2d 3e 70 4d 6f 64 75 6c 65 20 2b  r *)p->pModule +
5be0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
5bf0: 20 20 69 66 28 20 78 20 29 20 78 28 70 29 3b 0a    if( x ) x(p);.
5c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
5c10: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28  lite3VtabUnlock(
5c20: 70 56 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  pVTab);.    }.  
5c30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5c40: 64 62 2c 20 64 62 2d 3e 61 56 54 72 61 6e 73 29  db, db->aVTrans)
5c50: 3b 0a 20 20 20 20 64 62 2d 3e 6e 56 54 72 61 6e  ;.    db->nVTran
5c60: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 61  s = 0;.    db->a
5c70: 56 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 7d 0a  VTrans = 0;.  }.
5c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
5c90: 74 68 65 20 78 53 79 6e 63 20 6d 65 74 68 6f 64  the xSync method
5ca0: 20 6f 66 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   of all virtual 
5cb0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 71  tables in the sq
5cc0: 6c 69 74 65 33 2e 61 56 54 72 61 6e 73 0a 2a 2a  lite3.aVTrans.**
5cd0: 20 61 72 72 61 79 2e 20 52 65 74 75 72 6e 20 74   array. Return t
5ce0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 6f  he error code fo
5cf0: 72 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  r the first erro
5d00: 72 20 74 68 61 74 20 6f 63 63 75 72 73 2c 20 6f  r that occurs, o
5d10: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  r.** SQLITE_OK i
5d20: 66 20 61 6c 6c 20 78 53 79 6e 63 20 6f 70 65 72  f all xSync oper
5d30: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
5d40: 73 73 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 53 65 74  ssful..**.** Set
5d50: 20 2a 70 7a 45 72 72 6d 73 67 20 74 6f 20 70 6f   *pzErrmsg to po
5d60: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
5d70: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 72  that should be r
5d80: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 0a 2a  eleased using .*
5d90: 2a 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  * sqlite3DbFree(
5da0: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  ) containing an 
5db0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 69  error message, i
5dc0: 66 20 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62  f one is availab
5dd0: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
5de0: 65 33 56 74 61 62 53 79 6e 63 28 73 71 6c 69 74  e3VtabSync(sqlit
5df0: 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 2a 70  e3 *db, char **p
5e00: 7a 45 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20  zErrmsg){.  int 
5e10: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
5e20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 56 54 61 62 6c  LITE_OK;.  VTabl
5e30: 65 20 2a 2a 61 56 54 72 61 6e 73 20 3d 20 64 62  e **aVTrans = db
5e40: 2d 3e 61 56 54 72 61 6e 73 3b 0a 0a 20 20 64 62  ->aVTrans;..  db
5e50: 2d 3e 61 56 54 72 61 6e 73 20 3d 20 30 3b 0a 20  ->aVTrans = 0;. 
5e60: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
5e70: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
5e80: 3e 6e 56 54 72 61 6e 73 3b 20 69 2b 2b 29 7b 0a  >nVTrans; i++){.
5e90: 20 20 20 20 69 6e 74 20 28 2a 78 29 28 73 71 6c      int (*x)(sql
5ea0: 69 74 65 33 5f 76 74 61 62 20 2a 29 3b 0a 20 20  ite3_vtab *);.  
5eb0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
5ec0: 70 56 74 61 62 20 3d 20 61 56 54 72 61 6e 73 5b  pVtab = aVTrans[
5ed0: 69 5d 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 69  i]->pVtab;.    i
5ee0: 66 28 20 70 56 74 61 62 20 26 26 20 28 78 20 3d  f( pVtab && (x =
5ef0: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
5f00: 3e 78 53 79 6e 63 29 21 3d 30 20 29 7b 0a 20 20  >xSync)!=0 ){.  
5f10: 20 20 20 20 72 63 20 3d 20 78 28 70 56 74 61 62      rc = x(pVtab
5f20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5f30: 44 62 46 72 65 65 28 64 62 2c 20 2a 70 7a 45 72  DbFree(db, *pzEr
5f40: 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 2a 70 7a  rmsg);.      *pz
5f50: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
5f60: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74  DbStrDup(db, pVt
5f70: 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
5f80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5f90: 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
5fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
5fb0: 2d 3e 61 56 54 72 61 6e 73 20 3d 20 61 56 54 72  ->aVTrans = aVTr
5fc0: 61 6e 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ans;.  return rc
5fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5fe0: 65 20 74 68 65 20 78 52 6f 6c 6c 62 61 63 6b 20  e the xRollback 
5ff0: 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c 20 76 69  method of all vi
6000: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20  rtual tables in 
6010: 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 2e  the .** sqlite3.
6020: 61 56 54 72 61 6e 73 20 61 72 72 61 79 2e 20 54  aVTrans array. T
6030: 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 61 72  hen clear the ar
6040: 72 61 79 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 69  ray itself..*/.i
6050: 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  nt sqlite3VtabRo
6060: 6c 6c 62 61 63 6b 28 73 71 6c 69 74 65 33 20 2a  llback(sqlite3 *
6070: 64 62 29 7b 0a 20 20 63 61 6c 6c 46 69 6e 61 6c  db){.  callFinal
6080: 69 73 65 72 28 64 62 2c 20 6f 66 66 73 65 74 6f  iser(db, offseto
6090: 66 28 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  f(sqlite3_module
60a0: 2c 78 52 6f 6c 6c 62 61 63 6b 29 29 3b 0a 20 20  ,xRollback));.  
60b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
60c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
60d0: 65 20 74 68 65 20 78 43 6f 6d 6d 69 74 20 6d 65  e the xCommit me
60e0: 74 68 6f 64 20 6f 66 20 61 6c 6c 20 76 69 72 74  thod of all virt
60f0: 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ual tables in th
6100: 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 2e 61 56  e .** sqlite3.aV
6110: 54 72 61 6e 73 20 61 72 72 61 79 2e 20 54 68 65  Trans array. The
6120: 6e 20 63 6c 65 61 72 20 74 68 65 20 61 72 72 61  n clear the arra
6130: 79 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 69 6e 74  y itself..*/.int
6140: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
6150: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
6160: 0a 20 20 63 61 6c 6c 46 69 6e 61 6c 69 73 65 72  .  callFinaliser
6170: 28 64 62 2c 20 6f 66 66 73 65 74 6f 66 28 73 71  (db, offsetof(sq
6180: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 2c 78 43 6f  lite3_module,xCo
6190: 6d 6d 69 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  mmit));.  return
61a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
61b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 76 69 72 74  *.** If the virt
61c0: 75 61 6c 20 74 61 62 6c 65 20 70 56 74 61 62 20  ual table pVtab 
61d0: 73 75 70 70 6f 72 74 73 20 74 68 65 20 74 72 61  supports the tra
61e0: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 65 72 66 61  nsaction interfa
61f0: 63 65 0a 2a 2a 20 28 78 42 65 67 69 6e 2f 78 52  ce.** (xBegin/xR
6200: 6f 6c 6c 62 61 63 6b 2f 78 43 6f 6d 6d 69 74 20  ollback/xCommit 
6210: 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 78  and optionally x
6220: 53 79 6e 63 29 20 61 6e 64 20 61 20 74 72 61 6e  Sync) and a tran
6230: 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f  saction is.** no
6240: 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
6250: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 78 42 65  , invoke the xBe
6260: 67 69 6e 20 6d 65 74 68 6f 64 20 6e 6f 77 2e 0a  gin method now..
6270: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 78 42 65  **.** If the xBe
6280: 67 69 6e 20 63 61 6c 6c 20 69 73 20 73 75 63 63  gin call is succ
6290: 65 73 73 66 75 6c 2c 20 70 6c 61 63 65 20 74 68  essful, place th
62a0: 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 70  e sqlite3_vtab p
62b0: 6f 69 6e 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65  ointer.** in the
62c0: 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e 73   sqlite3.aVTrans
62d0: 20 61 72 72 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73   array..*/.int s
62e0: 71 6c 69 74 65 33 56 74 61 62 42 65 67 69 6e 28  qlite3VtabBegin(
62f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 54 61  sqlite3 *db, VTa
6300: 62 6c 65 20 2a 70 56 54 61 62 29 7b 0a 20 20 69  ble *pVTab){.  i
6310: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6320: 4b 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  K;.  const sqlit
6330: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
6340: 6c 65 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61  le;..  /* Specia
6350: 6c 20 63 61 73 65 3a 20 49 66 20 64 62 2d 3e 61  l case: If db->a
6360: 56 54 72 61 6e 73 20 69 73 20 4e 55 4c 4c 20 61  VTrans is NULL a
6370: 6e 64 20 64 62 2d 3e 6e 56 54 72 61 6e 73 20 69  nd db->nVTrans i
6380: 73 20 67 72 65 61 74 65 72 0a 20 20 2a 2a 20 74  s greater.  ** t
6390: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
63a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
63b0: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
63c0: 6d 20 77 69 74 68 69 6e 20 61 0a 20 20 2a 2a 20  m within a.  ** 
63d0: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 78  virtual module x
63e0: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 2e  Sync() callback.
63f0: 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
6400: 6f 20 77 72 69 74 65 20 74 6f 20 0a 20 20 2a 2a  o write to .  **
6410: 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20   virtual module 
6420: 74 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20 63  tables in this c
6430: 61 73 65 2c 20 73 6f 20 72 65 74 75 72 6e 20 53  ase, so return S
6440: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
6450: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
6460: 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 29  VtabInSync(db) )
6470: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6480: 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a  ITE_LOCKED;.  }.
6490: 20 20 69 66 28 20 21 70 56 54 61 62 20 29 7b 0a    if( !pVTab ){.
64a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
64b0: 45 5f 4f 4b 3b 0a 20 20 7d 20 0a 20 20 70 4d 6f  E_OK;.  } .  pMo
64c0: 64 75 6c 65 20 3d 20 70 56 54 61 62 2d 3e 70 56  dule = pVTab->pV
64d0: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20  tab->pModule;.. 
64e0: 20 69 66 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 42   if( pModule->xB
64f0: 65 67 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  egin ){.    int 
6500: 69 3b 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  i;...    /* If p
6510: 56 74 61 62 20 69 73 20 61 6c 72 65 61 64 79 20  Vtab is already 
6520: 69 6e 20 74 68 65 20 61 56 54 72 61 6e 73 20 61  in the aVTrans a
6530: 72 72 61 79 2c 20 72 65 74 75 72 6e 20 65 61 72  rray, return ear
6540: 6c 79 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ly */.    for(i=
6550: 30 3b 20 69 3c 64 62 2d 3e 6e 56 54 72 61 6e 73  0; i<db->nVTrans
6560: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6570: 28 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 69 5d  ( db->aVTrans[i]
6580: 3d 3d 70 56 54 61 62 20 29 7b 0a 20 20 20 20 20  ==pVTab ){.     
6590: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
65a0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
65b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b   }..    /* Invok
65c0: 65 20 74 68 65 20 78 42 65 67 69 6e 20 6d 65 74  e the xBegin met
65d0: 68 6f 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  hod */.    rc = 
65e0: 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 67 69 6e 28  pModule->xBegin(
65f0: 70 56 54 61 62 2d 3e 70 56 74 61 62 29 3b 0a 20  pVTab->pVtab);. 
6600: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6610: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
6620: 20 3d 20 61 64 64 54 6f 56 54 72 61 6e 73 28 64   = addToVTrans(d
6630: 62 2c 20 70 56 54 61 62 29 3b 0a 20 20 20 20 7d  b, pVTab);.    }
6640: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
6660: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 28  irst parameter (
6670: 70 44 65 66 29 20 69 73 20 61 20 66 75 6e 63 74  pDef) is a funct
6680: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ion implementati
6690: 6f 6e 2e 20 20 54 68 65 0a 2a 2a 20 73 65 63 6f  on.  The.** seco
66a0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 28 70 45  nd parameter (pE
66b0: 78 70 72 29 20 69 73 20 74 68 65 20 66 69 72 73  xpr) is the firs
66c0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
66d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
66e0: 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
66f0: 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
6700: 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6c 65  l table, then le
6710: 74 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a  t the virtual.**
6720: 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74   table implement
6730: 61 74 69 6f 6e 20 68 61 76 65 20 61 6e 20 6f 70  ation have an op
6740: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6f 76 65  portunity to ove
6750: 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
6760: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
6770: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
6780: 6f 20 61 6c 6c 6f 77 20 76 69 72 74 75 61 6c 20  o allow virtual 
6790: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
67a0: 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 6f 76 65 72  tions to.** over
67b0: 6c 6f 61 64 20 4d 41 54 43 48 2c 20 4c 49 4b 45  load MATCH, LIKE
67c0: 2c 20 47 4c 4f 42 2c 20 61 6e 64 20 52 45 47 45  , GLOB, and REGE
67d0: 58 50 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a  XP operators..**
67e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 65 69 74 68 65  .** Return eithe
67f0: 72 20 74 68 65 20 70 44 65 66 20 61 72 67 75 6d  r the pDef argum
6800: 65 6e 74 20 28 69 6e 64 69 63 61 74 69 6e 67 20  ent (indicating 
6810: 6e 6f 20 63 68 61 6e 67 65 29 20 6f 72 20 61 20  no change) or a 
6820: 0a 2a 2a 20 6e 65 77 20 46 75 6e 63 44 65 66 20  .** new FuncDef 
6830: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
6840: 73 20 6d 61 72 6b 65 64 20 61 73 20 65 70 68 65  s marked as ephe
6850: 6d 65 72 61 6c 20 75 73 69 6e 67 20 74 68 65 0a  meral using the.
6860: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45  ** SQLITE_FUNC_E
6870: 50 48 45 4d 20 66 6c 61 67 2e 0a 2a 2f 0a 46 75  PHEM flag..*/.Fu
6880: 6e 63 44 65 66 20 2a 73 71 6c 69 74 65 33 56 74  ncDef *sqlite3Vt
6890: 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
68a0: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
68b0: 62 2c 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  b,    /* Databas
68c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
68d0: 20 72 65 70 6f 72 74 69 6e 67 20 6d 61 6c 6c 6f   reporting mallo
68e0: 63 20 70 72 6f 62 6c 65 6d 73 20 2a 2f 0a 20 20  c problems */.  
68f0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 2c 20 20  FuncDef *pDef,  
6900: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 70  /* Function to p
6910: 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64  ossibly overload
6920: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
6930: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6940: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
6950: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
6960: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
6970: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
6980: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
6990: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ion */.){.  Tabl
69a0: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
69b0: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
69c0: 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65    sqlite3_module
69d0: 20 2a 70 4d 6f 64 3b 0a 20 20 76 6f 69 64 20 28   *pMod;.  void (
69e0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
69f0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
6a00: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 20 3d 20  ite3_value**) = 
6a10: 30 3b 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  0;.  void *pArg 
6a20: 3d 20 30 3b 0a 20 20 46 75 6e 63 44 65 66 20 2a  = 0;.  FuncDef *
6a30: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
6a40: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 77   0;.  char *zLow
6a50: 65 72 4e 61 6d 65 3b 0a 20 20 75 6e 73 69 67 6e  erName;.  unsign
6a60: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 0a 0a 20 20  ed char *z;...  
6a70: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
6a80: 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
6a90: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
6aa0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
6ab0: 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
6ac0: 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
6ad0: 6e 20 70 44 65 66 3b 0a 20 20 69 66 28 20 70 45  n pDef;.  if( pE
6ae0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
6af0: 4d 4e 20 29 20 72 65 74 75 72 6e 20 70 44 65 66  MN ) return pDef
6b00: 3b 0a 20 20 70 54 61 62 20 3d 20 70 45 78 70 72  ;.  pTab = pExpr
6b10: 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45  ->pTab;.  if( NE
6b20: 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72  VER(pTab==0) ) r
6b30: 65 74 75 72 6e 20 70 44 65 66 3b 0a 20 20 69 66  eturn pDef;.  if
6b40: 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
6b50: 73 20 26 20 54 46 5f 56 69 72 74 75 61 6c 29 3d  s & TF_Virtual)=
6b60: 3d 30 20 29 20 72 65 74 75 72 6e 20 70 44 65 66  =0 ) return pDef
6b70: 3b 0a 20 20 70 56 74 61 62 20 3d 20 73 71 6c 69  ;.  pVtab = sqli
6b80: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
6b90: 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
6ba0: 20 61 73 73 65 72 74 28 20 70 56 74 61 62 21 3d   assert( pVtab!=
6bb0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6bc0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 21 3d 30  Vtab->pModule!=0
6bd0: 20 29 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 73 71   );.  pMod = (sq
6be0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70  lite3_module *)p
6bf0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
6c00: 20 69 66 28 20 70 4d 6f 64 2d 3e 78 46 69 6e 64   if( pMod->xFind
6c10: 46 75 6e 63 74 69 6f 6e 3d 3d 30 20 29 20 72 65  Function==0 ) re
6c20: 74 75 72 6e 20 70 44 65 66 3b 0a 20 0a 20 20 2f  turn pDef;. .  /
6c30: 2a 20 43 61 6c 6c 20 74 68 65 20 78 46 69 6e 64  * Call the xFind
6c40: 46 75 6e 63 74 69 6f 6e 20 6d 65 74 68 6f 64 20  Function method 
6c50: 6f 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  on the virtual t
6c60: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
6c70: 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  ion.  ** to see 
6c80: 69 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  if the implement
6c90: 61 74 69 6f 6e 20 77 61 6e 74 73 20 74 6f 20 6f  ation wants to o
6ca0: 76 65 72 6c 6f 61 64 20 74 68 69 73 20 66 75 6e  verload this fun
6cb0: 63 74 69 6f 6e 20 0a 20 20 2a 2f 0a 20 20 7a 4c  ction .  */.  zL
6cc0: 6f 77 65 72 4e 61 6d 65 20 3d 20 73 71 6c 69 74  owerName = sqlit
6cd0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
6ce0: 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Def->zName);.  i
6cf0: 66 28 20 7a 4c 6f 77 65 72 4e 61 6d 65 20 29 7b  f( zLowerName ){
6d00: 0a 20 20 20 20 66 6f 72 28 7a 3d 28 75 6e 73 69  .    for(z=(unsi
6d10: 67 6e 65 64 20 63 68 61 72 2a 29 7a 4c 6f 77 65  gned char*)zLowe
6d20: 72 4e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  rName; *z; z++){
6d30: 0a 20 20 20 20 20 20 2a 7a 20 3d 20 73 71 6c 69  .      *z = sqli
6d40: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
6d50: 2a 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  *z];.    }.    r
6d60: 63 20 3d 20 70 4d 6f 64 2d 3e 78 46 69 6e 64 46  c = pMod->xFindF
6d70: 75 6e 63 74 69 6f 6e 28 70 56 74 61 62 2c 20 6e  unction(pVtab, n
6d80: 41 72 67 2c 20 7a 4c 6f 77 65 72 4e 61 6d 65 2c  Arg, zLowerName,
6d90: 20 26 78 46 75 6e 63 2c 20 26 70 41 72 67 29 3b   &xFunc, &pArg);
6da0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6db0: 65 65 28 64 62 2c 20 7a 4c 6f 77 65 72 4e 61 6d  ee(db, zLowerNam
6dc0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
6dd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6de0: 6e 20 70 44 65 66 3b 0a 20 20 7d 0a 0a 20 20 2f  n pDef;.  }..  /
6df0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 65  * Create a new e
6e00: 70 68 65 6d 65 72 61 6c 20 66 75 6e 63 74 69 6f  phemeral functio
6e10: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  n definition for
6e20: 20 74 68 65 20 6f 76 65 72 6c 6f 61 64 65 64 0a   the overloaded.
6e30: 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 2a 2f    ** function */
6e40: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
6e50: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6e60: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 0a  , sizeof(*pNew).
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
6e90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
6ea0: 44 65 66 2d 3e 7a 4e 61 6d 65 29 20 2b 20 31 29  Def->zName) + 1)
6eb0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
6ec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 44  ){.    return pD
6ed0: 65 66 3b 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 20  ef;.  }.  *pNew 
6ee0: 3d 20 2a 70 44 65 66 3b 0a 20 20 70 4e 65 77 2d  = *pDef;.  pNew-
6ef0: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  >zName = (char *
6f00: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d  )&pNew[1];.  mem
6f10: 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c  cpy(pNew->zName,
6f20: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 73 71   pDef->zName, sq
6f30: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
6f40: 65 66 2d 3e 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  ef->zName)+1);. 
6f50: 20 70 4e 65 77 2d 3e 78 46 75 6e 63 20 3d 20 78   pNew->xFunc = x
6f60: 46 75 6e 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 55  Func;.  pNew->pU
6f70: 73 65 72 44 61 74 61 20 3d 20 70 41 72 67 3b 0a  serData = pArg;.
6f80: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6f90: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
6fa0: 45 4d 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  EM;.  return pNe
6fb0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  w;.}../*.** Make
6fc0: 20 73 75 72 65 20 76 69 72 74 75 61 6c 20 74 61   sure virtual ta
6fd0: 62 6c 65 20 70 54 61 62 20 69 73 20 63 6f 6e 74  ble pTab is cont
6fe0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 70 50 61  ained in the pPa
6ff0: 72 73 65 2d 3e 61 70 56 69 72 74 75 61 6c 4c 6f  rse->apVirtualLo
7000: 63 6b 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 73 6f  ck[].** array so
7010: 20 74 68 61 74 20 61 6e 20 4f 50 5f 56 42 65 67   that an OP_VBeg
7020: 69 6e 20 77 69 6c 6c 20 67 65 74 20 67 65 6e 65  in will get gene
7030: 72 61 74 65 64 20 66 6f 72 20 69 74 2e 20 20 41  rated for it.  A
7040: 64 64 20 70 54 61 62 20 74 6f 20 74 68 65 0a 2a  dd pTab to the.*
7050: 2a 20 61 72 72 61 79 20 69 66 20 69 74 20 69 73  * array if it is
7060: 20 6d 69 73 73 69 6e 67 2e 20 20 49 66 20 70 54   missing.  If pT
7070: 61 62 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ab is already in
7080: 20 74 68 65 20 61 72 72 61 79 2c 20 74 68 69 73   the array, this
7090: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61   routine.** is a
70a0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64 20   no-op..*/.void 
70b0: 73 71 6c 69 74 65 33 56 74 61 62 4d 61 6b 65 57  sqlite3VtabMakeW
70c0: 72 69 74 61 62 6c 65 28 50 61 72 73 65 20 2a 70  ritable(Parse *p
70d0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
70e0: 61 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  ab){.  Parse *pT
70f0: 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
7100: 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
7110: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 69 2c  Parse);.  int i,
7120: 20 6e 3b 0a 20 20 54 61 62 6c 65 20 2a 2a 61 70   n;.  Table **ap
7130: 56 74 61 62 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  VtabLock;..  ass
7140: 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
7150: 54 61 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  Tab) );.  for(i=
7160: 30 3b 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e  0; i<pToplevel->
7170: 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b  nVtabLock; i++){
7180: 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70  .    if( pTab==p
7190: 54 6f 70 6c 65 76 65 6c 2d 3e 61 70 56 74 61 62  Toplevel->apVtab
71a0: 4c 6f 63 6b 5b 69 5d 20 29 20 72 65 74 75 72 6e  Lock[i] ) return
71b0: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 28 70 54 6f  ;.  }.  n = (pTo
71c0: 70 6c 65 76 65 6c 2d 3e 6e 56 74 61 62 4c 6f 63  plevel->nVtabLoc
71d0: 6b 2b 31 29 2a 73 69 7a 65 6f 66 28 70 54 6f 70  k+1)*sizeof(pTop
71e0: 6c 65 76 65 6c 2d 3e 61 70 56 74 61 62 4c 6f 63  level->apVtabLoc
71f0: 6b 5b 30 5d 29 3b 0a 20 20 61 70 56 74 61 62 4c  k[0]);.  apVtabL
7200: 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  ock = sqlite3_re
7210: 61 6c 6c 6f 63 28 70 54 6f 70 6c 65 76 65 6c 2d  alloc(pToplevel-
7220: 3e 61 70 56 74 61 62 4c 6f 63 6b 2c 20 6e 29 3b  >apVtabLock, n);
7230: 0a 20 20 69 66 28 20 61 70 56 74 61 62 4c 6f 63  .  if( apVtabLoc
7240: 6b 20 29 7b 0a 20 20 20 20 70 54 6f 70 6c 65 76  k ){.    pToplev
7250: 65 6c 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 20 3d  el->apVtabLock =
7260: 20 61 70 56 74 61 62 4c 6f 63 6b 3b 0a 20 20 20   apVtabLock;.   
7270: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70 56 74   pToplevel->apVt
7280: 61 62 4c 6f 63 6b 5b 70 54 6f 70 6c 65 76 65 6c  abLock[pToplevel
7290: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 2b 2b 5d 20 3d  ->nVtabLock++] =
72a0: 20 70 54 61 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a   pTab;.  }else{.
72b0: 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64      pToplevel->d
72c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
72d0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64  = 1;.  }.}..#end
72e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
72f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
7300: 2f 0a                                            /.