/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact a0f8a40274e4261696ef57aa806de2776ab72cda:


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 54 61 62 6c 65 20  VtabClear(Table 
1cf0: 2a 70 29 7b 0a 20 20 76 74 61 62 44 69 73 63 6f  *p){.  vtabDisco
1d00: 6e 6e 65 63 74 41 6c 6c 28 30 2c 20 70 29 3b 0a  nnectAll(0, p);.
1d10: 20 20 69 66 28 20 70 2d 3e 61 7a 4d 6f 64 75 6c    if( p->azModul
1d20: 65 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  eArg ){.    int 
1d30: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
1d40: 69 3c 70 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 3b  i<p->nModuleArg;
1d50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1d60: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
1d70: 4d 65 6d 2c 20 70 2d 3e 61 7a 4d 6f 64 75 6c 65  Mem, p->azModule
1d80: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg[i]);.    }. 
1d90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1da0: 28 70 2d 3e 64 62 4d 65 6d 2c 20 70 2d 3e 61 7a  (p->dbMem, p->az
1db0: 4d 6f 64 75 6c 65 41 72 67 29 3b 0a 20 20 7d 0a  ModuleArg);.  }.
1dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
1dd0: 65 77 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65  ew module argume
1de0: 6e 74 20 74 6f 20 70 54 61 62 6c 65 2d 3e 61 7a  nt to pTable->az
1df0: 4d 6f 64 75 6c 65 41 72 67 5b 5d 2e 0a 2a 2a 20  ModuleArg[]..** 
1e00: 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f  The string is no
1e10: 74 20 63 6f 70 69 65 64 20 2d 20 74 68 65 20 70  t copied - the p
1e20: 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64  ointer is stored
1e30: 2e 20 20 54 68 65 0a 2a 2a 20 73 74 72 69 6e 67  .  The.** string
1e40: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
1e50: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
1e60: 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 0a 2a  n the table is.*
1e70: 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  * deleted..*/.st
1e80: 61 74 69 63 20 76 6f 69 64 20 61 64 64 4d 6f 64  atic void addMod
1e90: 75 6c 65 41 72 67 75 6d 65 6e 74 28 73 71 6c 69  uleArgument(sqli
1ea0: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
1eb0: 70 54 61 62 6c 65 2c 20 63 68 61 72 20 2a 7a 41  pTable, char *zA
1ec0: 72 67 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70  rg){.  int i = p
1ed0: 54 61 62 6c 65 2d 3e 6e 4d 6f 64 75 6c 65 41 72  Table->nModuleAr
1ee0: 67 2b 2b 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  g++;.  int nByte
1ef0: 73 20 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20  s = sizeof(char 
1f00: 2a 29 2a 28 31 2b 70 54 61 62 6c 65 2d 3e 6e 4d  *)*(1+pTable->nM
1f10: 6f 64 75 6c 65 41 72 67 29 3b 0a 20 20 63 68 61  oduleArg);.  cha
1f20: 72 20 2a 2a 61 7a 4d 6f 64 75 6c 65 41 72 67 3b  r **azModuleArg;
1f30: 0a 20 20 61 7a 4d 6f 64 75 6c 65 41 72 67 20 3d  .  azModuleArg =
1f40: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1f50: 63 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 7a  c(db, pTable->az
1f60: 4d 6f 64 75 6c 65 41 72 67 2c 20 6e 42 79 74 65  ModuleArg, nByte
1f70: 73 29 3b 0a 20 20 69 66 28 20 61 7a 4d 6f 64 75  s);.  if( azModu
1f80: 6c 65 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20  leArg==0 ){.    
1f90: 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a  int j;.    for(j
1fa0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
1fb0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1fc0: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
1fd0: 7a 4d 6f 64 75 6c 65 41 72 67 5b 6a 5d 29 3b 0a  zModuleArg[j]);.
1fe0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ff0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 41 72 67  3DbFree(db, zArg
2000: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
2010: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
2020: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 29 3b 0a 20  >azModuleArg);. 
2030: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 4d 6f 64 75     pTable->nModu
2040: 6c 65 41 72 67 20 3d 20 30 3b 0a 20 20 7d 65 6c  leArg = 0;.  }el
2050: 73 65 7b 0a 20 20 20 20 61 7a 4d 6f 64 75 6c 65  se{.    azModule
2060: 41 72 67 5b 69 5d 20 3d 20 7a 41 72 67 3b 0a 20  Arg[i] = zArg;. 
2070: 20 20 20 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 69     azModuleArg[i
2080: 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  +1] = 0;.  }.  p
2090: 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64 75 6c 65 41  Table->azModuleA
20a0: 72 67 20 3d 20 61 7a 4d 6f 64 75 6c 65 41 72 67  rg = azModuleArg
20b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
20c0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
20d0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
20e0: 20 66 69 72 73 74 20 73 65 65 73 20 61 20 43 52   first sees a CR
20f0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2100: 4c 45 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  LE.** statement.
2110: 20 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d    The module nam
2120: 65 20 68 61 73 20 62 65 65 6e 20 70 61 72 73 65  e has been parse
2130: 64 2c 20 62 75 74 20 74 68 65 20 6f 70 74 69 6f  d, but the optio
2140: 6e 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 70  nal list.** of p
2150: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 66  arameters that f
2160: 6f 6c 6c 6f 77 20 74 68 65 20 6d 6f 64 75 6c 65  ollow the module
2170: 20 6e 61 6d 65 20 61 72 65 20 73 74 69 6c 6c 20   name are still 
2180: 70 65 6e 64 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  pending..*/.void
2190: 20 73 71 6c 69 74 65 33 56 74 61 62 42 65 67 69   sqlite3VtabBegi
21a0: 6e 50 61 72 73 65 28 0a 20 20 50 61 72 73 65 20  nParse(.  Parse 
21b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
21c0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
21d0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
21e0: 4e 61 6d 65 31 2c 20 20 20 20 20 20 20 20 2f 2a  Name1,        /*
21f0: 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20 74 61 62   Name of new tab
2200: 6c 65 2c 20 6f 72 20 64 61 74 61 62 61 73 65 20  le, or database 
2210: 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  name */.  Token 
2220: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 20 20  *pName2,        
2230: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6e 65 77 20 74  /* Name of new t
2240: 61 62 6c 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  able or NULL */.
2250: 20 20 54 6f 6b 65 6e 20 2a 70 4d 6f 64 75 6c 65    Token *pModule
2260: 4e 61 6d 65 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Name    /* Name 
2270: 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 20 66 6f  of the module fo
2280: 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  r the virtual ta
2290: 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
22a0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
22b0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22c0: 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 62  e the table is b
22d0: 65 69 6e 67 20 63 72 65 61 74 65 64 20 69 6e 20  eing created in 
22e0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
22f0: 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  le;        /* Th
2300: 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 61  e new virtual ta
2310: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
2320: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
2330: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2340: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 73 71 6c 69  ction */..  sqli
2350: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
2360: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
2370: 61 6d 65 32 2c 20 30 2c 20 30 2c 20 31 2c 20 30  ame2, 0, 0, 1, 0
2380: 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 50  );.  pTable = pP
2390: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
23a0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
23b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
23c0: 65 72 74 28 20 30 3d 3d 70 54 61 62 6c 65 2d 3e  ert( 0==pTable->
23d0: 70 49 6e 64 65 78 20 29 3b 0a 0a 20 20 64 62 20  pIndex );..  db 
23e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
23f0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2400: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2410: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 3b  Table->pSchema);
2420: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
2430: 30 20 29 3b 0a 0a 20 20 70 54 61 62 6c 65 2d 3e  0 );..  pTable->
2440: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 56  tabFlags |= TF_V
2450: 69 72 74 75 61 6c 3b 0a 20 20 70 54 61 62 6c 65  irtual;.  pTable
2460: 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 20 3d 20 30  ->nModuleArg = 0
2470: 3b 0a 20 20 61 64 64 4d 6f 64 75 6c 65 41 72 67  ;.  addModuleArg
2480: 75 6d 65 6e 74 28 64 62 2c 20 70 54 61 62 6c 65  ument(db, pTable
2490: 2c 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  , sqlite3NameFro
24a0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4d 6f 64 75  mToken(db, pModu
24b0: 6c 65 4e 61 6d 65 29 29 3b 0a 20 20 61 64 64 4d  leName));.  addM
24c0: 6f 64 75 6c 65 41 72 67 75 6d 65 6e 74 28 64 62  oduleArgument(db
24d0: 2c 20 70 54 61 62 6c 65 2c 20 73 71 6c 69 74 65  , pTable, sqlite
24e0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 64 62  3DbStrDup(db, db
24f0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
2500: 29 29 3b 0a 20 20 61 64 64 4d 6f 64 75 6c 65 41  ));.  addModuleA
2510: 72 67 75 6d 65 6e 74 28 64 62 2c 20 70 54 61 62  rgument(db, pTab
2520: 6c 65 2c 20 73 71 6c 69 74 65 33 44 62 53 74 72  le, sqlite3DbStr
2530: 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  Dup(db, pTable->
2540: 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 50 61 72 73  zName));.  pPars
2550: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 6e 20  e->sNameToken.n 
2560: 3d 20 28 69 6e 74 29 28 26 70 4d 6f 64 75 6c 65  = (int)(&pModule
2570: 4e 61 6d 65 2d 3e 7a 5b 70 4d 6f 64 75 6c 65 4e  Name->z[pModuleN
2580: 61 6d 65 2d 3e 6e 5d 20 2d 20 70 4e 61 6d 65 31  ame->n] - pName1
2590: 2d 3e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ->z);..#ifndef S
25a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
25b0: 52 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 43 72  RIZATION.  /* Cr
25c0: 65 61 74 69 6e 67 20 61 20 76 69 72 74 75 61 6c  eating a virtual
25d0: 20 74 61 62 6c 65 20 69 6e 76 6f 6b 65 73 20 74   table invokes t
25e0: 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  he authorization
25f0: 20 63 61 6c 6c 62 61 63 6b 20 74 77 69 63 65 2e   callback twice.
2600: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
2610: 69 6e 76 6f 63 61 74 69 6f 6e 2c 20 74 6f 20 6f  invocation, to o
2620: 62 74 61 69 6e 20 70 65 72 6d 69 73 73 69 6f 6e  btain permission
2630: 20 74 6f 20 49 4e 53 45 52 54 20 61 20 72 6f 77   to INSERT a row
2640: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73   into the.  ** s
2650: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
2660: 6c 65 2c 20 68 61 73 20 61 6c 72 65 61 64 79 20  le, has already 
2670: 62 65 65 6e 20 6d 61 64 65 20 62 79 20 73 71 6c  been made by sql
2680: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
2690: 2e 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ..  ** The secon
26a0: 64 20 63 61 6c 6c 2c 20 74 6f 20 6f 62 74 61 69  d call, to obtai
26b0: 6e 20 70 65 72 6d 69 73 73 69 6f 6e 20 74 6f 20  n permission to 
26c0: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
26d0: 2c 20 69 73 20 6d 61 64 65 20 6e 6f 77 2e 0a 20  , is made now.. 
26e0: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
26f0: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 29 7b  ->azModuleArg ){
2700: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
2710: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
2720: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42  LITE_CREATE_VTAB
2730: 4c 45 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  LE, pTable->zNam
2740: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2750: 70 54 61 62 6c 65 2d 3e 61 7a 4d 6f 64 75 6c 65  pTable->azModule
2760: 41 72 67 5b 30 5d 2c 20 70 50 61 72 73 65 2d 3e  Arg[0], pParse->
2770: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
2780: 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  me);.  }.#endif.
2790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
27a0: 75 74 69 6e 65 20 74 61 6b 65 73 20 74 68 65 20  utine takes the 
27b0: 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 20  module argument 
27c0: 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 61 63  that has been ac
27d0: 63 75 6d 75 6c 61 74 69 6e 67 0a 2a 2a 20 69 6e  cumulating.** in
27e0: 20 70 50 61 72 73 65 2d 3e 7a 41 72 67 5b 5d 20   pParse->zArg[] 
27f0: 61 6e 64 20 61 70 70 65 6e 64 73 20 69 74 20 74  and appends it t
2800: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 72  o the list of ar
2810: 67 75 6d 65 6e 74 73 20 6f 6e 20 74 68 65 0a 2a  guments on the.*
2820: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
2830: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
2840: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
2850: 70 50 61 72 73 65 2d 3e 70 54 61 62 6c 65 2e 0a  pParse->pTable..
2860: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2870: 64 64 41 72 67 75 6d 65 6e 74 54 6f 56 74 61 62  ddArgumentToVtab
2880: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2890: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 73  .  if( pParse->s
28a0: 41 72 67 2e 7a 20 26 26 20 41 4c 57 41 59 53 28  Arg.z && ALWAYS(
28b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
28c0: 65 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  e) ){.    const 
28d0: 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  char *z = (const
28e0: 20 63 68 61 72 2a 29 70 50 61 72 73 65 2d 3e 73   char*)pParse->s
28f0: 41 72 67 2e 7a 3b 0a 20 20 20 20 69 6e 74 20 6e  Arg.z;.    int n
2900: 20 3d 20 70 50 61 72 73 65 2d 3e 73 41 72 67 2e   = pParse->sArg.
2910: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  n;.    sqlite3 *
2920: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2930: 0a 20 20 20 20 61 64 64 4d 6f 64 75 6c 65 41 72  .    addModuleAr
2940: 67 75 6d 65 6e 74 28 64 62 2c 20 70 50 61 72 73  gument(db, pPars
2950: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2c 20 73 71  e->pNewTable, sq
2960: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
2970: 62 2c 20 7a 2c 20 6e 29 29 3b 0a 20 20 7d 0a 7d  b, z, n));.  }.}
2980: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ../*.** The pars
2990: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
29a0: 75 74 69 6e 65 20 61 66 74 65 72 20 74 68 65 20  utine after the 
29b0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
29c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 0a 2a  ABLE statement.*
29d0: 2a 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c  * has been compl
29e0: 65 74 65 6c 79 20 70 61 72 73 65 64 2e 0a 2a 2f  etely parsed..*/
29f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
2a00: 62 46 69 6e 69 73 68 50 61 72 73 65 28 50 61 72  bFinishParse(Par
2a10: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
2a20: 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54 61 62 6c  n *pEnd){.  Tabl
2a30: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
2a40: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 20 20 2f 2a  ->pNewTable;  /*
2a50: 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
2a60: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
2a70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2a80: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
2a90: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2aa0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2ab0: 2f 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  /..  if( pTab==0
2ac0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64 64   ) return;.  add
2ad0: 41 72 67 75 6d 65 6e 74 54 6f 56 74 61 62 28 70  ArgumentToVtab(p
2ae0: 50 61 72 73 65 29 3b 0a 20 20 70 50 61 72 73 65  Parse);.  pParse
2af0: 2d 3e 73 41 72 67 2e 7a 20 3d 20 30 3b 0a 20 20  ->sArg.z = 0;.  
2b00: 69 66 28 20 70 54 61 62 2d 3e 6e 4d 6f 64 75 6c  if( pTab->nModul
2b10: 65 41 72 67 3c 31 20 29 20 72 65 74 75 72 6e 3b  eArg<1 ) return;
2b20: 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .  .  /* If the 
2b30: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
2b40: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
2b50: 73 20 62 65 69 6e 67 20 65 6e 74 65 72 65 64 20  s being entered 
2b60: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 66 69 72  for the.  ** fir
2b70: 73 74 20 74 69 6d 65 20 28 69 6e 20 6f 74 68 65  st time (in othe
2b80: 72 20 77 6f 72 64 73 20 69 66 20 74 68 65 20 76  r words if the v
2b90: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
2ba0: 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 0a 20  actually being. 
2bb0: 20 2a 2a 20 63 72 65 61 74 65 64 20 6e 6f 77 20   ** created now 
2bc0: 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74 20  instead of just 
2bd0: 62 65 69 6e 67 20 72 65 61 64 20 6f 75 74 20 6f  being read out o
2be0: 66 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 29  f sqlite_master)
2bf0: 20 74 68 65 6e 0a 20 20 2a 2a 20 64 6f 20 61 64   then.  ** do ad
2c00: 64 69 74 69 6f 6e 61 6c 20 69 6e 69 74 69 61 6c  ditional initial
2c10: 69 7a 61 74 69 6f 6e 20 77 6f 72 6b 20 61 6e 64  ization work and
2c20: 20 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65   store the state
2c30: 6d 65 6e 74 20 74 65 78 74 0a 20 20 2a 2a 20 69  ment text.  ** i
2c40: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
2c50: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ter table..  */.
2c60: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
2c70: 62 75 73 79 20 29 7b 0a 20 20 20 20 63 68 61 72  busy ){.    char
2c80: 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 63 68 61   *zStmt;.    cha
2c90: 72 20 2a 7a 57 68 65 72 65 3b 0a 20 20 20 20 69  r *zWhere;.    i
2ca0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 56 64 62 65  nt iDb;.    Vdbe
2cb0: 20 2a 76 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d   *v;..    /* Com
2cc0: 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
2cd0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
2ce0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2cf0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  LE statement */.
2d00: 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
2d10: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73 4e        pParse->sN
2d20: 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 28 69 6e  ameToken.n = (in
2d30: 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61  t)(pEnd->z - pPa
2d40: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
2d50: 7a 29 20 2b 20 70 45 6e 64 2d 3e 6e 3b 0a 20 20  z) + pEnd->n;.  
2d60: 20 20 7d 0a 20 20 20 20 7a 53 74 6d 74 20 3d 20    }.    zStmt = 
2d70: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
2d80: 62 2c 20 22 43 52 45 41 54 45 20 56 49 52 54 55  b, "CREATE VIRTU
2d90: 41 4c 20 54 41 42 4c 45 20 25 54 22 2c 20 26 70  AL TABLE %T", &p
2da0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
2db0: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c  n);..    /* A sl
2dc0: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
2dd0: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
2de0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
2df0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
2e00: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
2e10: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
2e20: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
2e30: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
2e40: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
2e50: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
2e60: 65 64 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ed.  .    **.   
2e70: 20 2a 2a 20 54 68 65 20 56 4d 20 72 65 67 69 73   ** The VM regis
2e80: 74 65 72 20 6e 75 6d 62 65 72 20 70 50 61 72 73  ter number pPars
2e90: 65 2d 3e 72 65 67 52 6f 77 69 64 20 68 6f 6c 64  e->regRowid hold
2ea0: 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61  s the rowid of a
2eb0: 6e 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 69  n.    ** entry i
2ec0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
2ed0: 74 65 72 20 74 61 62 6c 65 20 74 68 74 20 77 61  ter table tht wa
2ee0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  s created for th
2ef0: 69 73 20 76 74 61 62 0a 20 20 20 20 2a 2a 20 62  is vtab.    ** b
2f00: 79 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  y sqlite3StartTa
2f10: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ble()..    */.  
2f20: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
2f30: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
2f40: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
2f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
2f60: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2f70: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
2f80: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
2f90: 53 45 54 20 74 79 70 65 3d 27 74 61 62 6c 65 27  SET type='table'
2fa0: 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
2fb0: 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
2fc0: 3d 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  =0, sql=%Q ".   
2fd0: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
2fe0: 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
2ff0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
3000: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
3010: 62 29 2c 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  b),.      pTab->
3020: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 54 61  zName,.      pTa
3030: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
3040: 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
3050: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
3060: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
3070: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
3080: 29 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  );.    v = sqlit
3090: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
30a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
30b0: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
30c0: 65 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 73 71  e, iDb);..    sq
30d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30e0: 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c  v, OP_Expire, 0,
30f0: 20 30 29 3b 0a 20 20 20 20 7a 57 68 65 72 65 20   0);.    zWhere 
3100: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
3110: 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 22  (db, "name='%q'"
3120: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
3130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3140: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73  ddOp4(v, OP_Pars
3150: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 31 2c  eSchema, iDb, 1,
3160: 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44   0, zWhere, P4_D
3170: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 73 71 6c  YNAMIC);.    sql
3180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
3190: 2c 20 4f 50 5f 56 43 72 65 61 74 65 2c 20 69 44  , OP_VCreate, iD
31a0: 62 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20  b, 0, 0, .      
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
31d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
31e0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20 2b 20 31  pTab->zName) + 1
31f0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
3200: 77 65 20 61 72 65 20 72 65 72 65 61 64 69 6e 67  we are rereading
3210: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
3220: 65 72 20 74 61 62 6c 65 20 63 72 65 61 74 65 20  er table create 
3230: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20  the in-memory.  
3240: 2a 2a 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  ** record of the
3250: 20 74 61 62 6c 65 2e 20 54 68 65 20 78 43 6f 6e   table. The xCon
3260: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 69 73  nect() method is
3270: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 74 69   not called unti
3280: 6c 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  l.  ** the first
3290: 20 74 69 6d 65 20 74 68 65 20 76 69 72 74 75 61   time the virtua
32a0: 6c 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  l table is used 
32b0: 69 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  in an SQL statem
32c0: 65 6e 74 2e 20 54 68 69 73 0a 20 20 2a 2a 20 61  ent. This.  ** a
32d0: 6c 6c 6f 77 73 20 61 20 73 63 68 65 6d 61 20 74  llows a schema t
32e0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 76 69 72  hat contains vir
32f0: 74 75 61 6c 20 74 61 62 6c 65 73 20 74 6f 20 62  tual tables to b
3300: 65 20 6c 6f 61 64 65 64 20 62 65 66 6f 72 65 0a  e loaded before.
3310: 20 20 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65    ** the require
3320: 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  d virtual table 
3330: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
3340: 61 72 65 20 72 65 67 69 73 74 65 72 65 64 2e 20  are registered. 
3350: 20 2a 2f 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20   */.  else {.   
3360: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
3370: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
3380: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
3390: 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  a;.    const cha
33a0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
33b0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  >zName;.    int 
33c0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
33d0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
33e0: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
33f0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
3400: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
3410: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 54  zName, nName, pT
3420: 61 62 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ab);.    if( pOl
3430: 64 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  d ){.      db->m
3440: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
3450: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3460: 54 61 62 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  Tab==pOld );  /*
3470: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
3480: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
3490: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
34a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
34b0: 20 20 7d 0a 20 20 20 20 70 53 63 68 65 6d 61 2d    }.    pSchema-
34c0: 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  >db = pParse->db
34d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  ;.    pParse->pN
34e0: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d  ewTable = 0;.  }
34f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
3500: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
3510: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20  routine when it 
3520: 73 65 65 73 20 74 68 65 20 66 69 72 73 74 20 74  sees the first t
3530: 6f 6b 65 6e 0a 2a 2a 20 6f 66 20 61 6e 20 61 72  oken.** of an ar
3540: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6d 6f  gument to the mo
3550: 64 75 6c 65 20 6e 61 6d 65 20 69 6e 20 61 20 43  dule name in a C
3560: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
3570: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
3580: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
3590: 61 62 41 72 67 49 6e 69 74 28 50 61 72 73 65 20  abArgInit(Parse 
35a0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 61 64 64 41  *pParse){.  addA
35b0: 72 67 75 6d 65 6e 74 54 6f 56 74 61 62 28 70 50  rgumentToVtab(pP
35c0: 61 72 73 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  arse);.  pParse-
35d0: 3e 73 41 72 67 2e 7a 20 3d 20 30 3b 0a 20 20 70  >sArg.z = 0;.  p
35e0: 50 61 72 73 65 2d 3e 73 41 72 67 2e 6e 20 3d 20  Parse->sArg.n = 
35f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
3600: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
3610: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61  s routine for ea
3620: 63 68 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ch token after t
3630: 68 65 20 66 69 72 73 74 20 74 6f 6b 65 6e 0a 2a  he first token.*
3640: 2a 20 69 6e 20 61 6e 20 61 72 67 75 6d 65 6e 74  * in an argument
3650: 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20 6e   to the module n
3660: 61 6d 65 20 69 6e 20 61 20 43 52 45 41 54 45 20  ame in a CREATE 
3670: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74  VIRTUAL TABLE st
3680: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
3690: 20 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 45   sqlite3VtabArgE
36a0: 78 74 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xtend(Parse *pPa
36b0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 29 7b 0a  rse, Token *p){.
36c0: 20 20 54 6f 6b 65 6e 20 2a 70 41 72 67 20 3d 20    Token *pArg = 
36d0: 26 70 50 61 72 73 65 2d 3e 73 41 72 67 3b 0a 20  &pParse->sArg;. 
36e0: 20 69 66 28 20 70 41 72 67 2d 3e 7a 3d 3d 30 20   if( pArg->z==0 
36f0: 29 7b 0a 20 20 20 20 70 41 72 67 2d 3e 7a 20 3d  ){.    pArg->z =
3700: 20 70 2d 3e 7a 3b 0a 20 20 20 20 70 41 72 67 2d   p->z;.    pArg-
3710: 3e 6e 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 65 6c  >n = p->n;.  }el
3720: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70  se{.    assert(p
3730: 41 72 67 2d 3e 7a 20 3c 20 70 2d 3e 7a 29 3b 0a  Arg->z < p->z);.
3740: 20 20 20 20 70 41 72 67 2d 3e 6e 20 3d 20 28 69      pArg->n = (i
3750: 6e 74 29 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20  nt)(&p->z[p->n] 
3760: 2d 20 70 41 72 67 2d 3e 7a 29 3b 0a 20 20 7d 0a  - pArg->z);.  }.
3770: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
3780: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
3790: 63 6f 6e 73 74 72 75 63 74 6f 72 20 28 65 69 74  constructor (eit
37a0: 68 65 72 20 78 43 72 65 61 74 65 20 6f 72 20 78  her xCreate or x
37b0: 43 6f 6e 6e 65 63 74 29 2e 20 54 68 65 0a 2a 2a  Connect). The.**
37c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
37d0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f  function to invo
37e0: 6b 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ke is passed as 
37f0: 74 68 65 20 66 6f 75 72 74 68 20 70 61 72 61 6d  the fourth param
3800: 65 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20  eter.** to this 
3810: 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74  procedure..*/.st
3820: 61 74 69 63 20 69 6e 74 20 76 74 61 62 43 61 6c  atic int vtabCal
3830: 6c 43 6f 6e 73 74 72 75 63 74 6f 72 28 0a 20 20  lConstructor(.  
3840: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
3850: 54 61 62 6c 65 20 2a 70 54 61 62 2c 0a 20 20 4d  Table *pTab,.  M
3860: 6f 64 75 6c 65 20 2a 70 4d 6f 64 2c 0a 20 20 69  odule *pMod,.  i
3870: 6e 74 20 28 2a 78 43 6f 6e 73 74 72 75 63 74 29  nt (*xConstruct)
3880: 28 73 71 6c 69 74 65 33 2a 2c 76 6f 69 64 2a 2c  (sqlite3*,void*,
3890: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 63  int,const char*c
38a0: 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 76 74  onst*,sqlite3_vt
38b0: 61 62 2a 2a 2c 63 68 61 72 2a 2a 29 2c 0a 20 20  ab**,char**),.  
38c0: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
38d0: 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61 62 6c    VTable *pVTabl
38e0: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  e;.  int rc;.  c
38f0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
3900: 2a 61 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20  *azArg = (const 
3910: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 29 70 54 61  char *const*)pTa
3920: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 3b 0a  b->azModuleArg;.
3930: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 70 54 61    int nArg = pTa
3940: 62 2d 3e 6e 4d 6f 64 75 6c 65 41 72 67 3b 0a 20  b->nModuleArg;. 
3950: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
3960: 0a 20 20 63 68 61 72 20 2a 7a 4d 6f 64 75 6c 65  .  char *zModule
3970: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
3980: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
3990: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
39a0: 20 69 66 28 20 21 7a 4d 6f 64 75 6c 65 4e 61 6d   if( !zModuleNam
39b0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
39c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
39d0: 7d 0a 0a 20 20 70 56 54 61 62 6c 65 20 3d 20 73  }..  pVTable = s
39e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
39f0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56 54  ro(db, sizeof(VT
3a00: 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 21 70  able));.  if( !p
3a10: 56 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  VTable ){.    sq
3a20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3a30: 7a 4d 6f 64 75 6c 65 4e 61 6d 65 29 3b 0a 20 20  zModuleName);.  
3a40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3a50: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 56 54  NOMEM;.  }.  pVT
3a60: 61 62 6c 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  able->db = db;. 
3a70: 20 70 56 54 61 62 6c 65 2d 3e 70 4d 6f 64 20 3d   pVTable->pMod =
3a80: 20 70 4d 6f 64 3b 0a 0a 20 20 61 73 73 65 72 74   pMod;..  assert
3a90: 28 20 21 64 62 2d 3e 70 56 54 61 62 20 29 3b 0a  ( !db->pVTab );.
3aa0: 20 20 61 73 73 65 72 74 28 20 78 43 6f 6e 73 74    assert( xConst
3ab0: 72 75 63 74 20 29 3b 0a 20 20 64 62 2d 3e 70 56  ruct );.  db->pV
3ac0: 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 2f  Tab = pTab;..  /
3ad0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76 69 72  * Invoke the vir
3ae0: 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 73 74  tual table const
3af0: 72 75 63 74 6f 72 20 2a 2f 0a 20 20 72 63 20 3d  ructor */.  rc =
3b00: 20 78 43 6f 6e 73 74 72 75 63 74 28 64 62 2c 20   xConstruct(db, 
3b10: 70 4d 6f 64 2d 3e 70 41 75 78 2c 20 6e 41 72 67  pMod->pAux, nArg
3b20: 2c 20 61 7a 41 72 67 2c 20 26 70 56 54 61 62 6c  , azArg, &pVTabl
3b30: 65 2d 3e 70 56 74 61 62 2c 20 26 7a 45 72 72 29  e->pVtab, &zErr)
3b40: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
3b50: 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d  TE_NOMEM ) db->m
3b60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
3b70: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
3b80: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 69 66 28  K!=rc ){.    if(
3b90: 20 7a 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20   zErr==0 ){.    
3ba0: 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
3bb0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 76  e3MPrintf(db, "v
3bc0: 74 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f  table constructo
3bd0: 72 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 7a  r failed: %s", z
3be0: 4d 6f 64 75 6c 65 4e 61 6d 65 29 3b 0a 20 20 20  ModuleName);.   
3bf0: 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2a   }else {.      *
3c00: 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d  pzErr = sqlite3M
3c10: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
3c20: 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71   zErr);.      sq
3c30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3c40: 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zErr);.    }.   
3c50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3c60: 62 2c 20 70 56 54 61 62 6c 65 29 3b 0a 20 20 7d  b, pVTable);.  }
3c70: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
3c80: 70 56 54 61 62 6c 65 2d 3e 70 56 74 61 62 29 20  pVTable->pVtab) 
3c90: 29 7b 0a 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  ){.    /* Justif
3ca0: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3cb0: 53 28 29 3a 20 20 41 20 63 6f 72 72 65 63 74 20  S():  A correct 
3cc0: 76 74 61 62 20 63 6f 6e 73 74 72 75 63 74 6f 72  vtab constructor
3cd0: 20 6d 75 73 74 20 61 6c 6c 6f 63 61 74 65 0a 20   must allocate. 
3ce0: 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65     ** the sqlite
3cf0: 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 20 69 66  3_vtab object if
3d00: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 20 2a 2f   successful.  */
3d10: 0a 20 20 20 20 70 56 54 61 62 6c 65 2d 3e 70 56  .    pVTable->pV
3d20: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 20 3d 20 70  tab->pModule = p
3d30: 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  Mod->pModule;.  
3d40: 20 20 70 56 54 61 62 6c 65 2d 3e 6e 52 65 66 20    pVTable->nRef 
3d50: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  = 1;.    if( db-
3d60: 3e 70 56 54 61 62 20 29 7b 0a 20 20 20 20 20 20  >pVTab ){.      
3d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
3d80: 6d 61 74 20 3d 20 22 76 74 61 62 6c 65 20 63 6f  mat = "vtable co
3d90: 6e 73 74 72 75 63 74 6f 72 20 64 69 64 20 6e 6f  nstructor did no
3da0: 74 20 64 65 63 6c 61 72 65 20 73 63 68 65 6d 61  t declare schema
3db0: 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 2a 70 7a  : %s";.      *pz
3dc0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Err = sqlite3MPr
3dd0: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
3de0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
3df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
3e00: 62 55 6e 6c 6f 63 6b 28 70 56 54 61 62 6c 65 29  bUnlock(pVTable)
3e10: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
3e20: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
3e30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
3e40: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 2f 2a 20 49  iCol;.      /* I
3e50: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 6e  f everything wen
3e60: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  t according to p
3e70: 6c 61 6e 2c 20 6c 69 6e 6b 20 74 68 65 20 6e 65  lan, link the ne
3e80: 77 20 56 54 61 62 6c 65 20 73 74 72 75 63 74 75  w VTable structu
3e90: 72 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  re.      ** into
3ea0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
3eb0: 20 68 65 61 64 65 64 20 62 79 20 70 54 61 62 2d   headed by pTab-
3ec0: 3e 70 56 54 61 62 6c 65 2e 20 54 68 65 6e 20 6c  >pVTable. Then l
3ed0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
3ee0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
3ef0: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
3f00: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 6f 66 20  o see if any of 
3f10: 74 68 65 6d 20 63 6f 6e 74 61 69 6e 20 74 68 65  them contain the
3f20: 20 74 6f 6b 65 6e 20 22 68 69 64 64 65 6e 22 2e   token "hidden".
3f30: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f 2c  .      ** If so,
3f40: 20 73 65 74 20 74 68 65 20 43 6f 6c 75 6d 6e 2e   set the Column.
3f50: 69 73 48 69 64 64 65 6e 20 66 6c 61 67 20 61 6e  isHidden flag an
3f60: 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 6b  d remove the tok
3f70: 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  en from.      **
3f80: 20 74 68 65 20 74 79 70 65 20 73 74 72 69 6e 67   the type string
3f90: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 56 54 61  .  */.      pVTa
3fa0: 62 6c 65 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  ble->pNext = pTa
3fb0: 62 2d 3e 70 56 54 61 62 6c 65 3b 0a 20 20 20 20  b->pVTable;.    
3fc0: 20 20 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 20    pTab->pVTable 
3fd0: 3d 20 70 56 54 61 62 6c 65 3b 0a 0a 20 20 20 20  = pVTable;..    
3fe0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
3ff0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
4000: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
4010: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 70 54  char *zType = pT
4020: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
4030: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Type;.        in
4040: 74 20 6e 54 79 70 65 3b 0a 20 20 20 20 20 20 20  t nType;.       
4050: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
4060: 20 20 20 20 69 66 28 20 21 7a 54 79 70 65 20 29      if( !zType )
4070: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4080: 20 20 20 6e 54 79 70 65 20 3d 20 73 71 6c 69 74     nType = sqlit
4090: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
40a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
40b0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 22  qlite3StrNICmp("
40c0: 68 69 64 64 65 6e 22 2c 20 7a 54 79 70 65 2c 20  hidden", zType, 
40d0: 36 29 7c 7c 28 7a 54 79 70 65 5b 36 5d 20 26 26  6)||(zType[6] &&
40e0: 20 7a 54 79 70 65 5b 36 5d 21 3d 27 20 27 29 20   zType[6]!=' ') 
40f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
4100: 28 69 3d 30 3b 20 69 3c 6e 54 79 70 65 3b 20 69  (i=0; i<nType; i
4110: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
4120: 20 69 66 28 20 28 30 3d 3d 73 71 6c 69 74 65 33   if( (0==sqlite3
4130: 53 74 72 4e 49 43 6d 70 28 22 20 68 69 64 64 65  StrNICmp(" hidde
4140: 6e 22 2c 20 26 7a 54 79 70 65 5b 69 5d 2c 20 37  n", &zType[i], 7
4150: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
4160: 26 26 20 28 7a 54 79 70 65 5b 69 2b 37 5d 3d 3d  && (zType[i+7]==
4170: 27 5c 30 27 20 7c 7c 20 7a 54 79 70 65 5b 69 2b  '\0' || zType[i+
4180: 37 5d 3d 3d 27 20 27 29 0a 20 20 20 20 20 20 20  7]==' ').       
4190: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
41a0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
41b0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
41d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
41e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
41f0: 69 3c 6e 54 79 70 65 20 29 7b 0a 20 20 20 20 20  i<nType ){.     
4200: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
4210: 20 20 20 20 20 20 69 6e 74 20 6e 44 65 6c 20 3d        int nDel =
4220: 20 36 20 2b 20 28 7a 54 79 70 65 5b 69 2b 36 5d   6 + (zType[i+6]
4230: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
4240: 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 28 6a       for(j=i; (j
4250: 2b 6e 44 65 6c 29 3c 3d 6e 54 79 70 65 3b 20 6a  +nDel)<=nType; j
4260: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
4270: 20 7a 54 79 70 65 5b 6a 5d 20 3d 20 7a 54 79 70   zType[j] = zTyp
4280: 65 5b 6a 2b 6e 44 65 6c 5d 3b 0a 20 20 20 20 20  e[j+nDel];.     
4290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
42a0: 20 69 66 28 20 7a 54 79 70 65 5b 69 5d 3d 3d 27   if( zType[i]=='
42b0: 5c 30 27 20 26 26 20 69 3e 30 20 29 7b 0a 20 20  \0' && i>0 ){.  
42c0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
42d0: 28 7a 54 79 70 65 5b 69 2d 31 5d 3d 3d 27 20 27  (zType[i-1]==' '
42e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
42f0: 54 79 70 65 5b 69 2d 31 5d 20 3d 20 27 5c 30 27  Type[i-1] = '\0'
4300: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4310: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
4320: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 48 69 64 64 65  ol[iCol].isHidde
4330: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
4340: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4350: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
4360: 72 65 65 28 64 62 2c 20 7a 4d 6f 64 75 6c 65 4e  ree(db, zModuleN
4370: 61 6d 65 29 3b 0a 20 20 64 62 2d 3e 70 56 54 61  ame);.  db->pVTa
4380: 62 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  b = 0;.  return 
4390: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
43a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
43b0: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 70 61 72  voked by the par
43c0: 73 65 72 20 74 6f 20 63 61 6c 6c 20 74 68 65 20  ser to call the 
43d0: 78 43 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  xConnect() metho
43e0: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74  d.** of the virt
43f0: 75 61 6c 20 74 61 62 6c 65 20 70 54 61 62 2e 20  ual table pTab. 
4400: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
4410: 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
4420: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 0a 2a  e is returned .*
4430: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c  * and an error l
4440: 65 66 74 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  eft in pParse..*
4450: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
4460: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 61 62  s a no-op if tab
4470: 6c 65 20 70 54 61 62 20 69 73 20 6e 6f 74 20 61  le pTab is not a
4480: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
4490: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74  */.int sqlite3Vt
44a0: 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 50 61  abCallConnect(Pa
44b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
44c0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 73 71 6c  le *pTab){.  sql
44d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
44e0: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
44f0: 68 61 72 20 2a 7a 4d 6f 64 3b 0a 20 20 4d 6f 64  har *zMod;.  Mod
4500: 75 6c 65 20 2a 70 4d 6f 64 3b 0a 20 20 69 6e 74  ule *pMod;.  int
4510: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
4520: 70 54 61 62 20 29 3b 0a 20 20 69 66 28 20 28 70  pTab );.  if( (p
4530: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
4540: 54 46 5f 56 69 72 74 75 61 6c 29 3d 3d 30 20 7c  TF_Virtual)==0 |
4550: 7c 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  | sqlite3GetVTab
4560: 6c 65 28 64 62 2c 20 70 54 61 62 29 20 29 7b 0a  le(db, pTab) ){.
4570: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4580: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
4590: 4c 6f 63 61 74 65 20 74 68 65 20 72 65 71 75 69  Locate the requi
45a0: 72 65 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c  red virtual tabl
45b0: 65 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 7a 4d  e module */.  zM
45c0: 6f 64 20 3d 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  od = pTab->azMod
45d0: 75 6c 65 41 72 67 5b 30 5d 3b 0a 20 20 70 4d 6f  uleArg[0];.  pMo
45e0: 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c  d = (Module*)sql
45f0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
4600: 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4d 6f 64 2c  ->aModule, zMod,
4610: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
4620: 28 7a 4d 6f 64 29 29 3b 0a 0a 20 20 69 66 28 20  (zMod));..  if( 
4630: 21 70 4d 6f 64 20 29 7b 0a 20 20 20 20 63 6f 6e  !pMod ){.    con
4640: 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 75 6c 65  st char *zModule
4650: 20 3d 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c   = pTab->azModul
4660: 65 41 72 67 5b 30 5d 3b 0a 20 20 20 20 73 71 6c  eArg[0];.    sql
4670: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4680: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 6d 6f  rse, "no such mo
4690: 64 75 6c 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 75  dule: %s", zModu
46a0: 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  le);.    rc = SQ
46b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
46c0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
46d0: 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Err = 0;.    rc 
46e0: 3d 20 76 74 61 62 43 61 6c 6c 43 6f 6e 73 74 72  = vtabCallConstr
46f0: 75 63 74 6f 72 28 64 62 2c 20 70 54 61 62 2c 20  uctor(db, pTab, 
4700: 70 4d 6f 64 2c 20 70 4d 6f 64 2d 3e 70 4d 6f 64  pMod, pMod->pMod
4710: 75 6c 65 2d 3e 78 43 6f 6e 6e 65 63 74 2c 20 26  ule->xConnect, &
4720: 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
4730: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4750: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
4760: 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d  s", zErr);.    }
4770: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4780: 65 65 28 64 62 2c 20 7a 45 72 72 29 3b 0a 20 20  ee(db, zErr);.  
4790: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
47a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
47b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 70   virtual table p
47c0: 56 54 61 62 20 74 6f 20 74 68 65 20 61 72 72 61  VTab to the arra
47d0: 79 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e  y sqlite3.aVTran
47e0: 73 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s[]..*/.static i
47f0: 6e 74 20 61 64 64 54 6f 56 54 72 61 6e 73 28 73  nt addToVTrans(s
4800: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 54 61 62  qlite3 *db, VTab
4810: 6c 65 20 2a 70 56 54 61 62 29 7b 0a 20 20 63 6f  le *pVTab){.  co
4820: 6e 73 74 20 69 6e 74 20 41 52 52 41 59 5f 49 4e  nst int ARRAY_IN
4830: 43 52 20 3d 20 35 3b 0a 0a 20 20 2f 2a 20 47 72  CR = 5;..  /* Gr
4840: 6f 77 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  ow the sqlite3.a
4850: 56 54 72 61 6e 73 20 61 72 72 61 79 20 69 66 20  VTrans array if 
4860: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
4870: 28 20 28 64 62 2d 3e 6e 56 54 72 61 6e 73 25 41  ( (db->nVTrans%A
4880: 52 52 41 59 5f 49 4e 43 52 29 3d 3d 30 20 29 7b  RRAY_INCR)==0 ){
4890: 0a 20 20 20 20 56 54 61 62 6c 65 20 2a 2a 61 56  .    VTable **aV
48a0: 54 72 61 6e 73 3b 0a 20 20 20 20 69 6e 74 20 6e  Trans;.    int n
48b0: 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 73  Bytes = sizeof(s
48c0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 20 2a  qlite3_vtab *) *
48d0: 20 28 64 62 2d 3e 6e 56 54 72 61 6e 73 20 2b 20   (db->nVTrans + 
48e0: 41 52 52 41 59 5f 49 4e 43 52 29 3b 0a 20 20 20  ARRAY_INCR);.   
48f0: 20 61 56 54 72 61 6e 73 20 3d 20 73 71 6c 69 74   aVTrans = sqlit
4900: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
4910: 28 76 6f 69 64 20 2a 29 64 62 2d 3e 61 56 54 72  (void *)db->aVTr
4920: 61 6e 73 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20  ans, nBytes);.  
4930: 20 20 69 66 28 20 21 61 56 54 72 61 6e 73 20 29    if( !aVTrans )
4940: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
4950: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4960: 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61   }.    memset(&a
4970: 56 54 72 61 6e 73 5b 64 62 2d 3e 6e 56 54 72 61  VTrans[db->nVTra
4980: 6e 73 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ns], 0, sizeof(s
4990: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 2a 41  qlite3_vtab *)*A
49a0: 52 52 41 59 5f 49 4e 43 52 29 3b 0a 20 20 20 20  RRAY_INCR);.    
49b0: 64 62 2d 3e 61 56 54 72 61 6e 73 20 3d 20 61 56  db->aVTrans = aV
49c0: 54 72 61 6e 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Trans;.  }..  /*
49d0: 20 41 64 64 20 70 56 74 61 62 20 74 6f 20 74 68   Add pVtab to th
49e0: 65 20 65 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  e end of sqlite3
49f0: 2e 61 56 54 72 61 6e 73 20 2a 2f 0a 20 20 64 62  .aVTrans */.  db
4a00: 2d 3e 61 56 54 72 61 6e 73 5b 64 62 2d 3e 6e 56  ->aVTrans[db->nV
4a10: 54 72 61 6e 73 2b 2b 5d 20 3d 20 70 56 54 61 62  Trans++] = pVTab
4a20: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c  ;.  sqlite3VtabL
4a30: 6f 63 6b 28 70 56 54 61 62 29 3b 0a 20 20 72 65  ock(pVTab);.  re
4a40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
4a60: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
4a70: 64 20 62 79 20 74 68 65 20 76 64 62 65 20 74 6f  d by the vdbe to
4a80: 20 63 61 6c 6c 20 74 68 65 20 78 43 72 65 61 74   call the xCreat
4a90: 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
4aa0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
4ab0: 20 6e 61 6d 65 64 20 7a 54 61 62 20 69 6e 20 64   named zTab in d
4ac0: 61 74 61 62 61 73 65 20 69 44 62 2e 20 0a 2a 2a  atabase iDb. .**
4ad0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
4ae0: 6f 63 63 75 72 73 2c 20 2a 70 7a 45 72 72 20 69  occurs, *pzErr i
4af0: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61  s set to point a
4b00: 6e 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  n an English lan
4b10: 67 75 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 70  guage.** descrip
4b20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f  tion of the erro
4b30: 72 20 61 6e 64 20 61 6e 20 53 51 4c 49 54 45 5f  r and an SQLITE_
4b40: 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
4b50: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 49  s returned..** I
4b60: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
4b70: 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c  caller must call
4b80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4b90: 62 2c 20 29 20 6f 6e 20 2a 70 7a 45 72 72 2e 0a  b, ) on *pzErr..
4ba0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 74  */.int sqlite3Vt
4bb0: 61 62 43 61 6c 6c 43 72 65 61 74 65 28 73 71 6c  abCallCreate(sql
4bc0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4bd0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4be0: 54 61 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72  Tab, char **pzEr
4bf0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
4c00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 61 62 6c  QLITE_OK;.  Tabl
4c10: 65 20 2a 70 54 61 62 3b 0a 20 20 4d 6f 64 75 6c  e *pTab;.  Modul
4c20: 65 20 2a 70 4d 6f 64 3b 0a 20 20 63 6f 6e 73 74  e *pMod;.  const
4c30: 20 63 68 61 72 20 2a 7a 4d 6f 64 3b 0a 0a 20 20   char *zMod;..  
4c40: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
4c50: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62  ndTable(db, zTab
4c60: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
4c70: 4e 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Name);.  assert(
4c80: 20 70 54 61 62 20 26 26 20 28 70 54 61 62 2d 3e   pTab && (pTab->
4c90: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 56 69  tabFlags & TF_Vi
4ca0: 72 74 75 61 6c 29 21 3d 30 20 26 26 20 21 70 54  rtual)!=0 && !pT
4cb0: 61 62 2d 3e 70 56 54 61 62 6c 65 20 29 3b 0a 0a  ab->pVTable );..
4cc0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
4cd0: 72 65 71 75 69 72 65 64 20 76 69 72 74 75 61 6c  required virtual
4ce0: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 2a 2f   table module */
4cf0: 0a 20 20 7a 4d 6f 64 20 3d 20 70 54 61 62 2d 3e  .  zMod = pTab->
4d00: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 3b 0a  azModuleArg[0];.
4d10: 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65    pMod = (Module
4d20: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
4d30: 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20  d(&db->aModule, 
4d40: 7a 4d 6f 64 2c 20 73 71 6c 69 74 65 33 53 74 72  zMod, sqlite3Str
4d50: 6c 65 6e 33 30 28 7a 4d 6f 64 29 29 3b 0a 0a 20  len30(zMod));.. 
4d60: 20 2f 2a 20 49 66 20 74 68 65 20 6d 6f 64 75 6c   /* If the modul
4d70: 65 20 68 61 73 20 62 65 65 6e 20 72 65 67 69 73  e has been regis
4d80: 74 65 72 65 64 20 61 6e 64 20 69 6e 63 6c 75 64  tered and includ
4d90: 65 73 20 61 20 43 72 65 61 74 65 20 6d 65 74 68  es a Create meth
4da0: 6f 64 2c 20 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  od, .  ** invoke
4db0: 20 69 74 20 6e 6f 77 2e 20 49 66 20 74 68 65 20   it now. If the 
4dc0: 6d 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74 20 62  module has not b
4dd0: 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 2c 20  een registered, 
4de0: 72 65 74 75 72 6e 20 61 6e 20 0a 20 20 2a 2a 20  return an .  ** 
4df0: 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
4e00: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
4e10: 2a 2f 0a 20 20 69 66 28 20 21 70 4d 6f 64 20 29  */.  if( !pMod )
4e20: 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73  {.    *pzErr = s
4e30: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
4e40: 2c 20 22 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c  , "no such modul
4e50: 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 29 3b 0a 20  e: %s", zMod);. 
4e60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
4e70: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
4e80: 20 20 20 72 63 20 3d 20 76 74 61 62 43 61 6c 6c     rc = vtabCall
4e90: 43 6f 6e 73 74 72 75 63 74 6f 72 28 64 62 2c 20  Constructor(db, 
4ea0: 70 54 61 62 2c 20 70 4d 6f 64 2c 20 70 4d 6f 64  pTab, pMod, pMod
4eb0: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 43 72 65 61  ->pModule->xCrea
4ec0: 74 65 2c 20 70 7a 45 72 72 29 3b 0a 20 20 7d 0a  te, pzErr);.  }.
4ed0: 0a 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74  .  /* Justificat
4ee0: 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3a  ion of ALWAYS():
4ef0: 20 20 54 68 65 20 78 43 6f 6e 73 74 72 75 63 74    The xConstruct
4f00: 6f 72 20 6d 65 74 68 6f 64 20 69 73 20 72 65 71  or method is req
4f10: 75 69 72 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72  uired to.  ** cr
4f20: 65 61 74 65 20 61 20 76 61 6c 69 64 20 73 71 6c  eate a valid sql
4f30: 69 74 65 33 5f 76 74 61 62 20 69 66 20 69 74 20  ite3_vtab if it 
4f40: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
4f50: 4b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  K. */.  if( rc==
4f60: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 41 4c 57  SQLITE_OK && ALW
4f70: 41 59 53 28 73 71 6c 69 74 65 33 47 65 74 56 54  AYS(sqlite3GetVT
4f80: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 29 20  able(db, pTab)) 
4f90: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 64  ){.      rc = ad
4fa0: 64 54 6f 56 54 72 61 6e 73 28 64 62 2c 20 73 71  dToVTrans(db, sq
4fb0: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
4fc0: 62 2c 20 70 54 61 62 29 29 3b 0a 20 20 7d 0a 0a  b, pTab));.  }..
4fd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4fe0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4ff0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
5000: 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  et the schema of
5010: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
5020: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a  .  It is only.**
5030: 20 76 61 6c 69 64 20 74 6f 20 63 61 6c 6c 20 74   valid to call t
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  his function fro
5050: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78 43 72  m within the xCr
5060: 65 61 74 65 28 29 20 6f 72 20 78 43 6f 6e 6e 65  eate() or xConne
5070: 63 74 28 29 20 6f 66 20 61 0a 2a 2a 20 76 69 72  ct() of a.** vir
5080: 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c  tual table modul
5090: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
50a0: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 73  3_declare_vtab(s
50b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
50c0: 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 54  t char *zCreateT
50d0: 61 62 6c 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  able){.  Parse *
50e0: 70 50 61 72 73 65 3b 0a 0a 20 20 69 6e 74 20 72  pParse;..  int r
50f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5100: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5110: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
5120: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5130: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
5140: 29 3b 0a 20 20 70 54 61 62 20 3d 20 64 62 2d 3e  );.  pTab = db->
5150: 70 56 54 61 62 3b 0a 20 20 69 66 28 20 21 70 54  pVTab;.  if( !pT
5160: 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
5170: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
5180: 45 5f 4d 49 53 55 53 45 2c 20 30 29 3b 0a 20 20  E_MISUSE, 0);.  
5190: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
51a0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
51b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
51c0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
51d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
51e0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
51f0: 20 54 46 5f 56 69 72 74 75 61 6c 29 21 3d 30 20   TF_Virtual)!=0 
5200: 29 3b 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 73  );..  pParse = s
5210: 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
5220: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
5230: 2a 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66 28  *pParse));.  if(
5240: 20 70 50 61 72 73 65 3d 3d 30 20 29 7b 0a 20 20   pParse==0 ){.  
5250: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5260: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
5270: 20 20 70 50 61 72 73 65 2d 3e 64 65 63 6c 61 72    pParse->declar
5280: 65 56 74 61 62 20 3d 20 31 3b 0a 20 20 20 20 70  eVtab = 1;.    p
5290: 50 61 72 73 65 2d 3e 64 62 20 3d 20 64 62 3b 0a  Parse->db = db;.
52a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
52b0: 72 79 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 0a 20  ryLoop = 1;.  . 
52c0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
52d0: 3d 3d 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73  ==sqlite3RunPars
52e0: 65 72 28 70 50 61 72 73 65 2c 20 7a 43 72 65 61  er(pParse, zCrea
52f0: 74 65 54 61 62 6c 65 2c 20 26 7a 45 72 72 29 20  teTable, &zErr) 
5300: 0a 20 20 20 20 20 26 26 20 70 50 61 72 73 65 2d  .     && pParse-
5310: 3e 70 4e 65 77 54 61 62 6c 65 0a 20 20 20 20 20  >pNewTable.     
5320: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
5330: 69 6c 65 64 0a 20 20 20 20 20 26 26 20 21 70 50  iled.     && !pP
5340: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2d  arse->pNewTable-
5350: 3e 70 53 65 6c 65 63 74 0a 20 20 20 20 20 26 26  >pSelect.     &&
5360: 20 28 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61   (pParse->pNewTa
5370: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ble->tabFlags & 
5380: 54 46 5f 56 69 72 74 75 61 6c 29 3d 3d 30 0a 20  TF_Virtual)==0. 
5390: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
53a0: 21 70 54 61 62 2d 3e 61 43 6f 6c 20 29 7b 0a 20  !pTab->aCol ){. 
53b0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
53c0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  l = pParse->pNew
53d0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 20  Table->aCol;.   
53e0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
53f0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
5400: 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  ble->nCol;.     
5410: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
5420: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
5430: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5440: 70 4e 65 77 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  pNewTable->aCol 
5450: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
5460: 20 20 20 64 62 2d 3e 70 56 54 61 62 20 3d 20 30     db->pVTab = 0
5470: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5480: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
5490: 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  db, SQLITE_ERROR
54a0: 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73  , zErr);.      s
54b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
54c0: 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72 63   zErr);.      rc
54d0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
54e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
54f0: 65 2d 3e 64 65 63 6c 61 72 65 56 74 61 62 20 3d  e->declareVtab =
5500: 20 30 3b 0a 20 20 0a 20 20 20 20 69 66 28 20 70   0;.  .    if( p
5510: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
5520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5530: 65 46 69 6e 61 6c 69 7a 65 28 70 50 61 72 73 65  eFinalize(pParse
5540: 2d 3e 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a  ->pVdbe);.    }.
5550: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
5560: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  eTable(pParse->p
5570: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 20 20 73  NewTable);.    s
5580: 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
5590: 64 62 2c 20 70 50 61 72 73 65 29 3b 0a 20 20 7d  db, pParse);.  }
55a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 72 63 26  ..  assert( (rc&
55b0: 30 78 66 66 29 3d 3d 72 63 20 29 3b 0a 20 20 72  0xff)==rc );.  r
55c0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
55d0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
55e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
55f0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
5600: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5610: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5620: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  n is invoked by 
5630: 74 68 65 20 76 64 62 65 20 74 6f 20 63 61 6c 6c  the vdbe to call
5640: 20 74 68 65 20 78 44 65 73 74 72 6f 79 20 6d 65   the xDestroy me
5650: 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 76  thod.** of the v
5660: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6e 61 6d  irtual table nam
5670: 65 64 20 7a 54 61 62 20 69 6e 20 64 61 74 61 62  ed zTab in datab
5680: 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 6f 63  ase iDb. This oc
5690: 63 75 72 73 0a 2a 2a 20 77 68 65 6e 20 61 20 44  curs.** when a D
56a0: 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6d 65 6e  ROP TABLE is men
56b0: 74 69 6f 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  tioned..**.** Th
56c0: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
56d0: 6f 70 20 69 66 20 7a 54 61 62 20 69 73 20 6e 6f  op if zTab is no
56e0: 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
56f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5700: 33 56 74 61 62 43 61 6c 6c 44 65 73 74 72 6f 79  3VtabCallDestroy
5710: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
5720: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
5730: 72 20 2a 7a 54 61 62 29 7b 0a 20 20 69 6e 74 20  r *zTab){.  int 
5740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5750: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a    Table *pTab;..
5760: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
5770: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
5780: 61 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ab, db->aDb[iDb]
5790: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 41  .zName);.  if( A
57a0: 4c 57 41 59 53 28 70 54 61 62 21 3d 30 20 26 26  LWAYS(pTab!=0 &&
57b0: 20 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 21 3d   pTab->pVTable!=
57c0: 30 29 20 29 7b 0a 20 20 20 20 56 54 61 62 6c 65  0) ){.    VTable
57d0: 20 2a 70 20 3d 20 76 74 61 62 44 69 73 63 6f 6e   *p = vtabDiscon
57e0: 6e 65 63 74 41 6c 6c 28 64 62 2c 20 70 54 61 62  nectAll(db, pTab
57f0: 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  );..    assert( 
5800: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5810: 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 4d 6f  .    rc = p->pMo
5820: 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73  d->pModule->xDes
5830: 74 72 6f 79 28 70 2d 3e 70 56 74 61 62 29 3b 0a  troy(p->pVtab);.
5840: 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
5850: 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2a  he sqlite3_vtab*
5860: 20 66 72 6f 6d 20 74 68 65 20 61 56 54 72 61 6e   from the aVTran
5870: 73 5b 5d 20 61 72 72 61 79 2c 20 69 66 20 61 70  s[] array, if ap
5880: 70 6c 69 63 61 62 6c 65 20 2a 2f 0a 20 20 20 20  plicable */.    
5890: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
58a0: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
58b0: 74 28 20 70 54 61 62 2d 3e 70 56 54 61 62 6c 65  t( pTab->pVTable
58c0: 3d 3d 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  ==p && p->pNext=
58d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 );.      p->p
58e0: 56 74 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  Vtab = 0;.      
58f0: 70 54 61 62 2d 3e 70 56 54 61 62 6c 65 20 3d 20  pTab->pVTable = 
5900: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
5910: 56 74 61 62 55 6e 6c 6f 63 6b 28 70 29 3b 0a 20  VtabUnlock(p);. 
5920: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
5930: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5940: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
5950: 76 6f 6b 65 73 20 65 69 74 68 65 72 20 74 68 65  vokes either the
5960: 20 78 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 78 43   xRollback or xC
5970: 6f 6d 6d 69 74 20 6d 65 74 68 6f 64 0a 2a 2a 20  ommit method.** 
5980: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 76  of each of the v
5990: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
59a0: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 56 54   the sqlite3.aVT
59b0: 72 61 6e 73 20 61 72 72 61 79 2e 20 54 68 65 20  rans array. The 
59c0: 6d 65 74 68 6f 64 0a 2a 2a 20 63 61 6c 6c 65 64  method.** called
59d0: 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
59e0: 79 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  y the second arg
59f0: 75 6d 65 6e 74 2c 20 22 6f 66 66 73 65 74 22 2c  ument, "offset",
5a00: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
5a10: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 6d   offset of the m
5a20: 65 74 68 6f 64 20 74 6f 20 63 61 6c 6c 20 69 6e  ethod to call in
5a30: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 6f 64   the sqlite3_mod
5a40: 75 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ule structure..*
5a50: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69  *.** The array i
5a60: 73 20 63 6c 65 61 72 65 64 20 61 66 74 65 72 20  s cleared after 
5a70: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 61 6c  invoking the cal
5a80: 6c 62 61 63 6b 73 2e 20 0a 2a 2f 0a 73 74 61 74  lbacks. .*/.stat
5a90: 69 63 20 76 6f 69 64 20 63 61 6c 6c 46 69 6e 61  ic void callFina
5aa0: 6c 69 73 65 72 28 73 71 6c 69 74 65 33 20 2a 64  liser(sqlite3 *d
5ab0: 62 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  b, int offset){.
5ac0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 64    int i;.  if( d
5ad0: 62 2d 3e 61 56 54 72 61 6e 73 20 29 7b 0a 20 20  b->aVTrans ){.  
5ae0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
5af0: 3e 6e 56 54 72 61 6e 73 3b 20 69 2b 2b 29 7b 0a  >nVTrans; i++){.
5b00: 20 20 20 20 20 20 56 54 61 62 6c 65 20 2a 70 56        VTable *pV
5b10: 54 61 62 20 3d 20 64 62 2d 3e 61 56 54 72 61 6e  Tab = db->aVTran
5b20: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  s[i];.      sqli
5b30: 74 65 33 5f 76 74 61 62 20 2a 70 20 3d 20 70 56  te3_vtab *p = pV
5b40: 54 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  Tab->pVtab;.    
5b50: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
5b60: 20 20 20 69 6e 74 20 28 2a 78 29 28 73 71 6c 69     int (*x)(sqli
5b70: 74 65 33 5f 76 74 61 62 20 2a 29 3b 0a 20 20 20  te3_vtab *);.   
5b80: 20 20 20 20 20 78 20 3d 20 2a 28 69 6e 74 20 28       x = *(int (
5b90: 2a 2a 29 28 73 71 6c 69 74 65 33 5f 76 74 61 62  **)(sqlite3_vtab
5ba0: 20 2a 29 29 28 28 63 68 61 72 20 2a 29 70 2d 3e   *))((char *)p->
5bb0: 70 4d 6f 64 75 6c 65 20 2b 20 6f 66 66 73 65 74  pModule + offset
5bc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
5bd0: 20 29 20 78 28 70 29 3b 0a 20 20 20 20 20 20 7d   ) x(p);.      }
5be0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
5bf0: 61 62 55 6e 6c 6f 63 6b 28 70 56 54 61 62 29 3b  abUnlock(pVTab);
5c00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5c10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
5c20: 3e 61 56 54 72 61 6e 73 29 3b 0a 20 20 20 20 64  >aVTrans);.    d
5c30: 62 2d 3e 6e 56 54 72 61 6e 73 20 3d 20 30 3b 0a  b->nVTrans = 0;.
5c40: 20 20 20 20 64 62 2d 3e 61 56 54 72 61 6e 73 20      db->aVTrans 
5c50: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
5c60: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 53 79  * Invoke the xSy
5c70: 6e 63 20 6d 65 74 68 6f 64 20 6f 66 20 61 6c 6c  nc method of all
5c80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
5c90: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  in the sqlite3.a
5ca0: 56 54 72 61 6e 73 0a 2a 2a 20 61 72 72 61 79 2e  VTrans.** array.
5cb0: 20 52 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   Return the erro
5cc0: 72 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  r code for the f
5cd0: 69 72 73 74 20 65 72 72 6f 72 20 74 68 61 74 20  irst error that 
5ce0: 6f 63 63 75 72 73 2c 20 6f 72 0a 2a 2a 20 53 51  occurs, or.** SQ
5cf0: 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 78  LITE_OK if all x
5d00: 53 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  Sync operations 
5d10: 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2e 0a  are successful..
5d20: 2a 2a 0a 2a 2a 20 53 65 74 20 2a 70 7a 45 72 72  **.** Set *pzErr
5d30: 6d 73 67 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  msg to point to 
5d40: 61 20 62 75 66 66 65 72 20 74 68 61 74 20 73 68  a buffer that sh
5d50: 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64  ould be released
5d60: 20 75 73 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74   using .** sqlit
5d70: 65 33 44 62 46 72 65 65 28 29 20 63 6f 6e 74 61  e3DbFree() conta
5d80: 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  ining an error m
5d90: 65 73 73 61 67 65 2c 20 69 66 20 6f 6e 65 20 69  essage, if one i
5da0: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  s available..*/.
5db0: 69 6e 74 20 73 71 6c 69 74 65 33 56 74 61 62 53  int sqlite3VtabS
5dc0: 79 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ync(sqlite3 *db,
5dd0: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
5de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
5df0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5e00: 3b 0a 20 20 56 54 61 62 6c 65 20 2a 2a 61 56 54  ;.  VTable **aVT
5e10: 72 61 6e 73 20 3d 20 64 62 2d 3e 61 56 54 72 61  rans = db->aVTra
5e20: 6e 73 3b 0a 0a 20 20 64 62 2d 3e 61 56 54 72 61  ns;..  db->aVTra
5e30: 6e 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ns = 0;.  for(i=
5e40: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
5e50: 20 26 26 20 69 3c 64 62 2d 3e 6e 56 54 72 61 6e   && i<db->nVTran
5e60: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  s; i++){.    int
5e70: 20 28 2a 78 29 28 73 71 6c 69 74 65 33 5f 76 74   (*x)(sqlite3_vt
5e80: 61 62 20 2a 29 3b 0a 20 20 20 20 73 71 6c 69 74  ab *);.    sqlit
5e90: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
5ea0: 20 61 56 54 72 61 6e 73 5b 69 5d 2d 3e 70 56 74   aVTrans[i]->pVt
5eb0: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 56 74 61  ab;.    if( pVta
5ec0: 62 20 26 26 20 28 78 20 3d 20 70 56 74 61 62 2d  b && (x = pVtab-
5ed0: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 79 6e 63 29  >pModule->xSync)
5ee0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
5ef0: 3d 20 78 28 70 56 74 61 62 29 3b 0a 20 20 20 20  = x(pVtab);.    
5f00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5f10: 64 62 2c 20 2a 70 7a 45 72 72 6d 73 67 29 3b 0a  db, *pzErrmsg);.
5f20: 20 20 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20        *pzErrmsg 
5f30: 3d 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  = pVtab->zErrMsg
5f40: 3b 0a 20 20 20 20 20 20 70 56 74 61 62 2d 3e 7a  ;.      pVtab->z
5f50: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
5f60: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 56 54 72  }.  }.  db->aVTr
5f70: 61 6e 73 20 3d 20 61 56 54 72 61 6e 73 3b 0a 20  ans = aVTrans;. 
5f80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5f90: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
5fa0: 78 52 6f 6c 6c 62 61 63 6b 20 6d 65 74 68 6f 64  xRollback method
5fb0: 20 6f 66 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   of all virtual 
5fc0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 0a 2a  tables in the .*
5fd0: 2a 20 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e  * sqlite3.aVTran
5fe0: 73 20 61 72 72 61 79 2e 20 54 68 65 6e 20 63 6c  s array. Then cl
5ff0: 65 61 72 20 74 68 65 20 61 72 72 61 79 20 69 74  ear the array it
6000: 73 65 6c 66 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  self..*/.int sql
6010: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
6020: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
6030: 20 63 61 6c 6c 46 69 6e 61 6c 69 73 65 72 28 64   callFinaliser(d
6040: 62 2c 20 6f 66 66 73 65 74 6f 66 28 73 71 6c 69  b, offsetof(sqli
6050: 74 65 33 5f 6d 6f 64 75 6c 65 2c 78 52 6f 6c 6c  te3_module,xRoll
6060: 62 61 63 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e  back));.  return
6070: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6080: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
6090: 78 43 6f 6d 6d 69 74 20 6d 65 74 68 6f 64 20 6f  xCommit method o
60a0: 66 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  f all virtual ta
60b0: 62 6c 65 73 20 69 6e 20 74 68 65 20 0a 2a 2a 20  bles in the .** 
60c0: 73 71 6c 69 74 65 33 2e 61 56 54 72 61 6e 73 20  sqlite3.aVTrans 
60d0: 61 72 72 61 79 2e 20 54 68 65 6e 20 63 6c 65 61  array. Then clea
60e0: 72 20 74 68 65 20 61 72 72 61 79 20 69 74 73 65  r the array itse
60f0: 6c 66 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lf..*/.int sqlit
6100: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 73 71 6c  e3VtabCommit(sql
6110: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 61 6c  ite3 *db){.  cal
6120: 6c 46 69 6e 61 6c 69 73 65 72 28 64 62 2c 20 6f  lFinaliser(db, o
6130: 66 66 73 65 74 6f 66 28 73 71 6c 69 74 65 33 5f  ffsetof(sqlite3_
6140: 6d 6f 64 75 6c 65 2c 78 43 6f 6d 6d 69 74 29 29  module,xCommit))
6150: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6160: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
6170: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
6180: 62 6c 65 20 70 56 74 61 62 20 73 75 70 70 6f 72  ble pVtab suppor
6190: 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
61a0: 6f 6e 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 20  on interface.** 
61b0: 28 78 42 65 67 69 6e 2f 78 52 6f 6c 6c 62 61 63  (xBegin/xRollbac
61c0: 6b 2f 78 43 6f 6d 6d 69 74 20 61 6e 64 20 6f 70  k/xCommit and op
61d0: 74 69 6f 6e 61 6c 6c 79 20 78 53 79 6e 63 29 20  tionally xSync) 
61e0: 61 6e 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f  and a transactio
61f0: 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  n is.** not curr
6200: 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 76 6f  ently open, invo
6210: 6b 65 20 74 68 65 20 78 42 65 67 69 6e 20 6d 65  ke the xBegin me
6220: 74 68 6f 64 20 6e 6f 77 2e 0a 2a 2a 0a 2a 2a 20  thod now..**.** 
6230: 49 66 20 74 68 65 20 78 42 65 67 69 6e 20 63 61  If the xBegin ca
6240: 6c 6c 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ll is successful
6250: 2c 20 70 6c 61 63 65 20 74 68 65 20 73 71 6c 69  , place the sqli
6260: 74 65 33 5f 76 74 61 62 20 70 6f 69 6e 74 65 72  te3_vtab pointer
6270: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74  .** in the sqlit
6280: 65 33 2e 61 56 54 72 61 6e 73 20 61 72 72 61 79  e3.aVTrans array
6290: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
62a0: 56 74 61 62 42 65 67 69 6e 28 73 71 6c 69 74 65  VtabBegin(sqlite
62b0: 33 20 2a 64 62 2c 20 56 54 61 62 6c 65 20 2a 70  3 *db, VTable *p
62c0: 56 54 61 62 29 7b 0a 20 20 69 6e 74 20 72 63 20  VTab){.  int rc 
62d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
62e0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
62f0: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20  ule *pModule;.. 
6300: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
6310: 3a 20 49 66 20 64 62 2d 3e 61 56 54 72 61 6e 73  : If db->aVTrans
6320: 20 69 73 20 4e 55 4c 4c 20 61 6e 64 20 64 62 2d   is NULL and db-
6330: 3e 6e 56 54 72 61 6e 73 20 69 73 20 67 72 65 61  >nVTrans is grea
6340: 74 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 7a 65  ter.  ** than ze
6350: 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ro, then this fu
6360: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
6370: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
6380: 69 6e 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61  in a.  ** virtua
6390: 6c 20 6d 6f 64 75 6c 65 20 78 53 79 6e 63 28 29  l module xSync()
63a0: 20 63 61 6c 6c 62 61 63 6b 2e 20 49 74 20 69 73   callback. It is
63b0: 20 69 6c 6c 65 67 61 6c 20 74 6f 20 77 72 69 74   illegal to writ
63c0: 65 20 74 6f 20 0a 20 20 2a 2a 20 76 69 72 74 75  e to .  ** virtu
63d0: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
63e0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   in this case, s
63f0: 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
6400: 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69  LOCKED..  */.  i
6410: 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 49 6e  f( sqlite3VtabIn
6420: 53 79 6e 63 28 64 62 29 20 29 7b 0a 20 20 20 20  Sync(db) ){.    
6430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
6440: 43 4b 45 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  CKED;.  }.  if( 
6450: 21 70 56 54 61 62 20 29 7b 0a 20 20 20 20 72 65  !pVTab ){.    re
6460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6470: 20 20 7d 20 0a 20 20 70 4d 6f 64 75 6c 65 20 3d    } .  pModule =
6480: 20 70 56 54 61 62 2d 3e 70 56 74 61 62 2d 3e 70   pVTab->pVtab->p
6490: 4d 6f 64 75 6c 65 3b 0a 0a 20 20 69 66 28 20 70  Module;..  if( p
64a0: 4d 6f 64 75 6c 65 2d 3e 78 42 65 67 69 6e 20 29  Module->xBegin )
64b0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 0a 20  {.    int i;... 
64c0: 20 20 20 2f 2a 20 49 66 20 70 56 74 61 62 20 69     /* If pVtab i
64d0: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
64e0: 20 61 56 54 72 61 6e 73 20 61 72 72 61 79 2c 20   aVTrans array, 
64f0: 72 65 74 75 72 6e 20 65 61 72 6c 79 20 2a 2f 0a  return early */.
6500: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
6510: 62 2d 3e 6e 56 54 72 61 6e 73 3b 20 69 2b 2b 29  b->nVTrans; i++)
6520: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
6530: 61 56 54 72 61 6e 73 5b 69 5d 3d 3d 70 56 54 61  aVTrans[i]==pVTa
6540: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  b ){.        ret
6550: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6560: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
6570: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
6580: 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20 2a 2f  xBegin method */
6590: 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  .    rc = pModul
65a0: 65 2d 3e 78 42 65 67 69 6e 28 70 56 54 61 62 2d  e->xBegin(pVTab-
65b0: 3e 70 56 74 61 62 29 3b 0a 20 20 20 20 69 66 28  >pVtab);.    if(
65c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
65d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 64 64  {.      rc = add
65e0: 54 6f 56 54 72 61 6e 73 28 64 62 2c 20 70 56 54  ToVTrans(db, pVT
65f0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
6600: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6610: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
6620: 61 72 61 6d 65 74 65 72 20 28 70 44 65 66 29 20  arameter (pDef) 
6630: 69 73 20 61 20 66 75 6e 63 74 69 6f 6e 20 69 6d  is a function im
6640: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
6650: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 70 61 72  he.** second par
6660: 61 6d 65 74 65 72 20 28 70 45 78 70 72 29 20 69  ameter (pExpr) i
6670: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
6680: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
6690: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 70 45 78  ction..** If pEx
66a0: 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  pr is a column i
66b0: 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
66c0: 65 2c 20 74 68 65 6e 20 6c 65 74 20 74 68 65 20  e, then let the 
66d0: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
66e0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
66f0: 68 61 76 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e  have an opportun
6700: 69 74 79 20 74 6f 20 6f 76 65 72 6c 6f 61 64 20  ity to overload 
6710: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  the function..**
6720: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6730: 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
6740: 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  w virtual table 
6750: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
6760: 74 6f 0a 2a 2a 20 6f 76 65 72 6c 6f 61 64 20 4d  to.** overload M
6770: 41 54 43 48 2c 20 4c 49 4b 45 2c 20 47 4c 4f 42  ATCH, LIKE, GLOB
6780: 2c 20 61 6e 64 20 52 45 47 45 58 50 20 6f 70 65  , and REGEXP ope
6790: 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  rators..**.** Re
67a0: 74 75 72 6e 20 65 69 74 68 65 72 20 74 68 65 20  turn either the 
67b0: 70 44 65 66 20 61 72 67 75 6d 65 6e 74 20 28 69  pDef argument (i
67c0: 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 63 68 61  ndicating no cha
67d0: 6e 67 65 29 20 6f 72 20 61 20 0a 2a 2a 20 6e 65  nge) or a .** ne
67e0: 77 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  w FuncDef struct
67f0: 75 72 65 20 74 68 61 74 20 69 73 20 6d 61 72 6b  ure that is mark
6800: 65 64 20 61 73 20 65 70 68 65 6d 65 72 61 6c 20  ed as ephemeral 
6810: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 53 51 4c  using the.** SQL
6820: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 20 66  ITE_FUNC_EPHEM f
6830: 6c 61 67 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20  lag..*/.FuncDef 
6840: 2a 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72  *sqlite3VtabOver
6850: 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  loadFunction(.  
6860: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
6870: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
6880: 65 63 74 69 6f 6e 20 66 6f 72 20 72 65 70 6f 72  ection for repor
6890: 74 69 6e 67 20 6d 61 6c 6c 6f 63 20 70 72 6f 62  ting malloc prob
68a0: 6c 65 6d 73 20 2a 2f 0a 20 20 46 75 6e 63 44 65  lems */.  FuncDe
68b0: 66 20 2a 70 44 65 66 2c 20 20 2f 2a 20 46 75 6e  f *pDef,  /* Fun
68c0: 63 74 69 6f 6e 20 74 6f 20 70 6f 73 73 69 62 6c  ction to possibl
68d0: 79 20 6f 76 65 72 6c 6f 61 64 20 2a 2f 0a 20 20  y overload */.  
68e0: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
68f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
6900: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75  uments to the fu
6910: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  nction */.  Expr
6920: 20 2a 70 45 78 70 72 20 20 20 20 20 2f 2a 20 46   *pExpr     /* F
6930: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
6940: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
6950: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
6960: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  b;.  sqlite3_vta
6970: 62 20 2a 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  b *pVtab;.  sqli
6980: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
6990: 3b 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ;.  void (*xFunc
69a0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
69b0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
69c0: 61 6c 75 65 2a 2a 29 20 3d 20 30 3b 0a 20 20 76  alue**) = 0;.  v
69d0: 6f 69 64 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20  oid *pArg = 0;. 
69e0: 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 77 3b 0a   FuncDef *pNew;.
69f0: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
6a00: 63 68 61 72 20 2a 7a 4c 6f 77 65 72 4e 61 6d 65  char *zLowerName
6a10: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
6a20: 72 20 2a 7a 3b 0a 0a 0a 20 20 2f 2a 20 43 68 65  r *z;...  /* Che
6a30: 63 6b 20 74 6f 20 73 65 65 20 74 68 65 20 6c 65  ck to see the le
6a40: 66 74 20 6f 70 65 72 61 6e 64 20 69 73 20 61 20  ft operand is a 
6a50: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
6a60: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ual table */.  i
6a70: 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
6a80: 30 29 20 29 20 72 65 74 75 72 6e 20 70 44 65 66  0) ) return pDef
6a90: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
6aa0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
6ab0: 65 74 75 72 6e 20 70 44 65 66 3b 0a 20 20 70 54  eturn pDef;.  pT
6ac0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
6ad0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54  ;.  if( NEVER(pT
6ae0: 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  ab==0) ) return 
6af0: 70 44 65 66 3b 0a 20 20 69 66 28 20 28 70 54 61  pDef;.  if( (pTa
6b00: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
6b10: 5f 56 69 72 74 75 61 6c 29 3d 3d 30 20 29 20 72  _Virtual)==0 ) r
6b20: 65 74 75 72 6e 20 70 44 65 66 3b 0a 20 20 70 56  eturn pDef;.  pV
6b30: 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74  tab = sqlite3Get
6b40: 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
6b50: 2d 3e 70 56 74 61 62 3b 0a 20 20 61 73 73 65 72  ->pVtab;.  asser
6b60: 74 28 20 70 56 74 61 62 21 3d 30 20 29 3b 0a 20  t( pVtab!=0 );. 
6b70: 20 61 73 73 65 72 74 28 20 70 56 74 61 62 2d 3e   assert( pVtab->
6b80: 70 4d 6f 64 75 6c 65 21 3d 30 20 29 3b 0a 20 20  pModule!=0 );.  
6b90: 70 4d 6f 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  pMod = (sqlite3_
6ba0: 6d 6f 64 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e  module *)pVtab->
6bb0: 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 66 28 20 70  pModule;.  if( p
6bc0: 4d 6f 64 2d 3e 78 46 69 6e 64 46 75 6e 63 74 69  Mod->xFindFuncti
6bd0: 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70  on==0 ) return p
6be0: 44 65 66 3b 0a 20 0a 20 20 2f 2a 20 43 61 6c 6c  Def;. .  /* Call
6bf0: 20 74 68 65 20 78 46 69 6e 64 46 75 6e 63 74 69   the xFindFuncti
6c00: 6f 6e 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65  on method on the
6c10: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
6c20: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20  mplementation.  
6c30: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ** to see if the
6c40: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
6c50: 77 61 6e 74 73 20 74 6f 20 6f 76 65 72 6c 6f 61  wants to overloa
6c60: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
6c70: 0a 20 20 2a 2f 0a 20 20 7a 4c 6f 77 65 72 4e 61  .  */.  zLowerNa
6c80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
6c90: 72 44 75 70 28 64 62 2c 20 70 44 65 66 2d 3e 7a  rDup(db, pDef->z
6ca0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4c 6f  Name);.  if( zLo
6cb0: 77 65 72 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  werName ){.    f
6cc0: 6f 72 28 7a 3d 28 75 6e 73 69 67 6e 65 64 20 63  or(z=(unsigned c
6cd0: 68 61 72 2a 29 7a 4c 6f 77 65 72 4e 61 6d 65 3b  har*)zLowerName;
6ce0: 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20   *z; z++){.     
6cf0: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 55 70 70   *z = sqlite3Upp
6d00: 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 5d 3b 0a 20  erToLower[*z];. 
6d10: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 4d     }.    rc = pM
6d20: 6f 64 2d 3e 78 46 69 6e 64 46 75 6e 63 74 69 6f  od->xFindFunctio
6d30: 6e 28 70 56 74 61 62 2c 20 6e 41 72 67 2c 20 7a  n(pVtab, nArg, z
6d40: 4c 6f 77 65 72 4e 61 6d 65 2c 20 26 78 46 75 6e  LowerName, &xFun
6d50: 63 2c 20 26 70 41 72 67 29 3b 0a 20 20 20 20 73  c, &pArg);.    s
6d60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6d70: 20 7a 4c 6f 77 65 72 4e 61 6d 65 29 3b 0a 20 20   zLowerName);.  
6d80: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
6d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 44 65 66  .    return pDef
6da0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
6db0: 74 65 20 61 20 6e 65 77 20 65 70 68 65 6d 65 72  te a new ephemer
6dc0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  al function defi
6dd0: 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6f  nition for the o
6de0: 76 65 72 6c 6f 61 64 65 64 0a 20 20 2a 2a 20 66  verloaded.  ** f
6df0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 4e 65  unction */.  pNe
6e00: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
6e10: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
6e20: 6f 66 28 2a 70 4e 65 77 29 0a 20 20 20 20 20 20  of(*pNew).      
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e40: 20 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65 33         + sqlite3
6e50: 53 74 72 6c 65 6e 33 30 28 70 44 65 66 2d 3e 7a  Strlen30(pDef->z
6e60: 4e 61 6d 65 29 20 2b 20 31 29 3b 0a 20 20 69 66  Name) + 1);.  if
6e70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
6e80: 20 72 65 74 75 72 6e 20 70 44 65 66 3b 0a 20 20   return pDef;.  
6e90: 7d 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 44 65  }.  *pNew = *pDe
6ea0: 66 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  f;.  pNew->zName
6eb0: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65 77   = (char *)&pNew
6ec0: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
6ed0: 65 77 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ew->zName, pDef-
6ee0: 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53  >zName, sqlite3S
6ef0: 74 72 6c 65 6e 33 30 28 70 44 65 66 2d 3e 7a 4e  trlen30(pDef->zN
6f00: 61 6d 65 29 2b 31 29 3b 0a 20 20 70 4e 65 77 2d  ame)+1);.  pNew-
6f10: 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a  >xFunc = xFunc;.
6f20: 20 20 70 4e 65 77 2d 3e 70 55 73 65 72 44 61 74    pNew->pUserDat
6f30: 61 20 3d 20 70 41 72 67 3b 0a 20 20 70 4e 65 77  a = pArg;.  pNew
6f40: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
6f50: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 3b 0a 20 20  E_FUNC_EPHEM;.  
6f60: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6f70: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
6f80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 70 54  virtual table pT
6f90: 61 62 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ab is contained 
6fa0: 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  in the pParse->a
6fb0: 70 56 69 72 74 75 61 6c 4c 6f 63 6b 5b 5d 0a 2a  pVirtualLock[].*
6fc0: 2a 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  * array so that 
6fd0: 61 6e 20 4f 50 5f 56 42 65 67 69 6e 20 77 69 6c  an OP_VBegin wil
6fe0: 6c 20 67 65 74 20 67 65 6e 65 72 61 74 65 64 20  l get generated 
6ff0: 66 6f 72 20 69 74 2e 20 20 41 64 64 20 70 54 61  for it.  Add pTa
7000: 62 20 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61  b to the.** arra
7010: 79 20 69 66 20 69 74 20 69 73 20 6d 69 73 73 69  y if it is missi
7020: 6e 67 2e 20 20 49 66 20 70 54 61 62 20 69 73 20  ng.  If pTab is 
7030: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 61  already in the a
7040: 72 72 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69  rray, this routi
7050: 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  ne.** is a no-op
7060: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7070: 33 56 74 61 62 4d 61 6b 65 57 72 69 74 61 62 6c  3VtabMakeWritabl
7080: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7090: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
70a0: 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
70b0: 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
70c0: 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
70d0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
70e0: 54 61 62 6c 65 20 2a 2a 61 70 56 74 61 62 4c 6f  Table **apVtabLo
70f0: 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 49  ck;..  assert( I
7100: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
7110: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7120: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 56 74 61 62 4c  Toplevel->nVtabL
7130: 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ock; i++){.    i
7140: 66 28 20 70 54 61 62 3d 3d 70 54 6f 70 6c 65 76  f( pTab==pToplev
7150: 65 6c 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69  el->apVtabLock[i
7160: 5d 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  ] ) return;.  }.
7170: 20 20 6e 20 3d 20 28 70 54 6f 70 6c 65 76 65 6c    n = (pToplevel
7180: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 2b 31 29 2a 73  ->nVtabLock+1)*s
7190: 69 7a 65 6f 66 28 70 54 6f 70 6c 65 76 65 6c 2d  izeof(pToplevel-
71a0: 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 30 5d 29 3b  >apVtabLock[0]);
71b0: 0a 20 20 61 70 56 74 61 62 4c 6f 63 6b 20 3d 20  .  apVtabLock = 
71c0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
71d0: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70 56 74 61  pToplevel->apVta
71e0: 62 4c 6f 63 6b 2c 20 6e 29 3b 0a 20 20 69 66 28  bLock, n);.  if(
71f0: 20 61 70 56 74 61 62 4c 6f 63 6b 20 29 7b 0a 20   apVtabLock ){. 
7200: 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 70     pToplevel->ap
7210: 56 74 61 62 4c 6f 63 6b 20 3d 20 61 70 56 74 61  VtabLock = apVta
7220: 62 4c 6f 63 6b 3b 0a 20 20 20 20 70 54 6f 70 6c  bLock;.    pTopl
7230: 65 76 65 6c 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  evel->apVtabLock
7240: 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 56 74 61  [pToplevel->nVta
7250: 62 4c 6f 63 6b 2b 2b 5d 20 3d 20 70 54 61 62 3b  bLock++] = pTab;
7260: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
7270: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
7280: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
7290: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
72a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
72b0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a              UALTABLE */.