/ Hex Artifact Content
Login

Artifact 5a2f06baeb4071ba547db5b47fb0fb43ffe7bdc96e65e0d5045703a726f32c10:


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 43 6f 64 65 20 66 6f 72 20 74 65  *.** Code for te
0180: 73 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  sting the virtua
0190: 6c 20 74 61 62 6c 65 20 69 6e 74 65 72 66 61 63  l table interfac
01a0: 65 73 2e 20 20 54 68 69 73 20 63 6f 64 65 0a 2a  es.  This code.*
01b0: 2a 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  * is not include
01c0: 64 20 69 6e 20 74 68 65 20 53 51 4c 69 74 65 20  d in the SQLite 
01d0: 6c 69 62 72 61 72 79 2e 20 20 49 74 20 69 73 20  library.  It is 
01e0: 75 73 65 64 20 66 6f 72 20 61 75 74 6f 6d 61 74  used for automat
01f0: 65 64 0a 2a 2a 20 74 65 73 74 69 6e 67 20 6f 66  ed.** testing of
0200: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
0210: 61 72 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e  ary..*/../*.** N
0220: 6f 6e 65 20 6f 66 20 74 68 69 73 20 77 6f 72 6b  one of this work
0230: 73 20 75 6e 6c 65 73 73 20 77 65 20 68 61 76 65  s unless we have
0240: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
0250: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
0260: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
0270: 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
0280: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
0290: 54 29 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  T)..#include "sq
02a0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
02b0: 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 0a 2f 2a 20  ude <tcl.h>../* 
02c0: 54 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  The code in this
02d0: 20 66 69 6c 65 20 64 65 66 69 6e 65 73 20 61 20   file defines a 
02e0: 73 71 6c 69 74 65 33 20 76 69 72 74 75 61 6c 2d  sqlite3 virtual-
02f0: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 77 69 74  table module wit
0300: 68 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h.** the followi
0310: 6e 67 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 23 64  ng schema..*/.#d
0320: 65 66 69 6e 65 20 53 43 48 45 4d 41 50 4f 4f 4c  efine SCHEMAPOOL
0330: 5f 53 43 48 45 4d 41 20 5c 0a 22 43 52 45 41 54  _SCHEMA \."CREAT
0340: 45 20 54 41 42 4c 45 20 78 28 22 20 20 20 20 20  E TABLE x("     
0350: 20 20 20 20 5c 0a 22 20 20 63 6b 73 75 6d 20 20      \."  cksum  
0360: 20 49 4e 54 45 47 45 52 2c 20 22 20 20 20 20 20   INTEGER, "     
0370: 5c 0a 22 20 20 6e 72 65 66 20 20 20 20 49 4e 54  \."  nref    INT
0380: 45 47 45 52 2c 20 22 20 20 20 20 20 5c 0a 22 20  EGER, "     \." 
0390: 20 6e 73 63 68 65 6d 61 20 49 4e 54 45 47 45 52   nschema INTEGER
03a0: 20 20 22 20 20 20 20 20 5c 0a 22 29 22 0a 0a 74    "     \.")"..t
03b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 63  ypedef struct sc
03c0: 68 65 6d 61 70 6f 6f 6c 5f 76 74 61 62 20 73 63  hemapool_vtab sc
03d0: 68 65 6d 61 70 6f 6f 6c 5f 76 74 61 62 3b 0a 74  hemapool_vtab;.t
03e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 63  ypedef struct sc
03f0: 68 65 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f 72 20  hemapool_cursor 
0400: 73 63 68 65 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f  schemapool_curso
0410: 72 3b 0a 0a 2f 2a 20 41 20 73 63 68 65 6d 61 20  r;../* A schema 
0420: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  table object */.
0430: 73 74 72 75 63 74 20 73 63 68 65 6d 61 70 6f 6f  struct schemapoo
0440: 6c 5f 76 74 61 62 20 7b 0a 20 20 73 71 6c 69 74  l_vtab {.  sqlit
0450: 65 33 5f 76 74 61 62 20 62 61 73 65 3b 0a 7d 3b  e3_vtab base;.};
0460: 0a 0a 2f 2a 20 41 20 73 63 68 65 6d 61 20 74 61  ../* A schema ta
0470: 62 6c 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63  ble cursor objec
0480: 74 20 2a 2f 0a 73 74 72 75 63 74 20 73 63 68 65  t */.struct sche
0490: 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f 72 20 7b 0a  mapool_cursor {.
04a0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
04b0: 75 72 73 6f 72 20 62 61 73 65 3b 0a 20 20 73 71  ursor base;.  sq
04c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 61 44 61  lite3_int64 *aDa
04d0: 74 61 3b 0a 20 20 69 6e 74 20 69 52 6f 77 3b 0a  ta;.  int iRow;.
04e0: 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 7d 3b 0a 0a    int nRow;.};..
04f0: 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 64 65 73 74  /*.** Table dest
0500: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 73  ructor for the s
0510: 63 68 65 6d 61 20 6d 6f 64 75 6c 65 2e 0a 2a 2f  chema module..*/
0520: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65  .static int sche
0530: 6d 61 50 6f 6f 6c 44 65 73 74 72 6f 79 28 73 71  maPoolDestroy(sq
0540: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
0550: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b){.  sqlite3_fr
0560: 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65 74  ee(pVtab);.  ret
0570: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
0580: 54 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f  Table constructo
0590: 72 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  r for the schema
05a0: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
05b0: 69 63 20 69 6e 74 20 73 63 68 65 6d 61 50 6f 6f  ic int schemaPoo
05c0: 6c 43 72 65 61 74 65 28 0a 20 20 73 71 6c 69 74  lCreate(.  sqlit
05d0: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a  e3 *db,.  void *
05e0: 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  pAux,.  int argc
05f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  , const char *co
0600: 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69  nst*argv,.  sqli
0610: 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61  te3_vtab **ppVta
0620: 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  b,.  char **pzEr
0630: 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
0640: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
0650: 73 63 68 65 6d 61 70 6f 6f 6c 5f 76 74 61 62 20  schemapool_vtab 
0660: 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33  *pVtab = sqlite3
0670: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73  _malloc(sizeof(s
0680: 63 68 65 6d 61 70 6f 6f 6c 5f 76 74 61 62 29 29  chemapool_vtab))
0690: 3b 0a 20 20 69 66 28 20 70 56 74 61 62 20 29 7b  ;.  if( pVtab ){
06a0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 56 74 61  .    memset(pVta
06b0: 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 63 68  b, 0, sizeof(sch
06c0: 65 6d 61 70 6f 6f 6c 5f 76 74 61 62 29 29 3b 0a  emapool_vtab));.
06d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
06e0: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
06f0: 2c 20 53 43 48 45 4d 41 50 4f 4f 4c 5f 53 43 48  , SCHEMAPOOL_SCH
0700: 45 4d 41 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 56  EMA);.  }.  *ppV
0710: 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  tab = (sqlite3_v
0720: 74 61 62 20 2a 29 70 56 74 61 62 3b 0a 20 20 72  tab *)pVtab;.  r
0730: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
0740: 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75  ** Open a new cu
0750: 72 73 6f 72 20 6f 6e 20 74 68 65 20 73 63 68 65  rsor on the sche
0760: 6d 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ma table..*/.sta
0770: 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 50 6f  tic int schemaPo
0780: 6f 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  olOpen(sqlite3_v
0790: 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69  tab *pVTab, sqli
07a0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
07b0: 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 69  **ppCursor){.  i
07c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
07d0: 4f 4d 45 4d 3b 0a 20 20 73 63 68 65 6d 61 70 6f  OMEM;.  schemapo
07e0: 6f 6c 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 3b  ol_cursor *pCur;
07f0: 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65  .  pCur = sqlite
0800: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
0810: 73 63 68 65 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f  schemapool_curso
0820: 72 29 29 3b 0a 20 20 69 66 28 20 70 43 75 72 20  r));.  if( pCur 
0830: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43  ){.    memset(pC
0840: 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 63  ur, 0, sizeof(sc
0850: 68 65 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f 72 29  hemapool_cursor)
0860: 29 3b 0a 20 20 20 20 2a 70 70 43 75 72 73 6f 72  );.    *ppCursor
0870: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62   = (sqlite3_vtab
0880: 5f 63 75 72 73 6f 72 2a 29 70 43 75 72 3b 0a 20  _cursor*)pCur;. 
0890: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
08a0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
08b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
08c0: 73 65 20 61 20 73 63 68 65 6d 61 20 74 61 62 6c  se a schema tabl
08d0: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  e cursor..*/.sta
08e0: 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 50 6f  tic int schemaPo
08f0: 6f 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  olClose(sqlite3_
0900: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
0910: 29 7b 0a 20 20 73 63 68 65 6d 61 70 6f 6f 6c 5f  ){.  schemapool_
0920: 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
0930: 73 63 68 65 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f  schemapool_curso
0940: 72 2a 29 63 75 72 3b 0a 20 20 73 71 6c 69 74 65  r*)cur;.  sqlite
0950: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 44 61  3_free(pCur->aDa
0960: 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ta);.  sqlite3_f
0970: 72 65 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ree(pCur);.  ret
0980: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
0990: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
09a0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 64 61 74   a column of dat
09b0: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  a..*/.static int
09c0: 20 73 63 68 65 6d 61 50 6f 6f 6c 43 6f 6c 75 6d   schemaPoolColum
09d0: 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  n(sqlite3_vtab_c
09e0: 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69  ursor *cur, sqli
09f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
0a00: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 73 63 68 65  , int i){.  sche
0a10: 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f 72 20 2a 70  mapool_cursor *p
0a20: 43 75 72 20 3d 20 28 73 63 68 65 6d 61 70 6f 6f  Cur = (schemapoo
0a30: 6c 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  l_cursor*)cur;. 
0a40: 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 7c 7c   assert( i==0 ||
0a50: 20 69 3d 3d 31 20 7c 7c 20 69 3d 3d 32 20 29 3b   i==1 || i==2 );
0a60: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
0a70: 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 70 43 75  t_int64(ctx, pCu
0a80: 72 2d 3e 61 44 61 74 61 5b 70 43 75 72 2d 3e 69  r->aData[pCur->i
0a90: 52 6f 77 2a 33 20 2b 20 69 5d 29 3b 0a 20 20 72  Row*3 + i]);.  r
0aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0ab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
0ac0: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ve the current r
0ad0: 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owid..*/.static 
0ae0: 69 6e 74 20 73 63 68 65 6d 61 50 6f 6f 6c 52 6f  int schemaPoolRo
0af0: 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  wid(sqlite3_vtab
0b00: 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71  _cursor *cur, sq
0b10: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
0b20: 69 64 29 7b 0a 20 20 73 63 68 65 6d 61 70 6f 6f  id){.  schemapoo
0b30: 6c 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  l_cursor *pCur =
0b40: 20 28 73 63 68 65 6d 61 70 6f 6f 6c 5f 63 75 72   (schemapool_cur
0b50: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f  sor*)cur;.  *pRo
0b60: 77 69 64 20 3d 20 70 43 75 72 2d 3e 69 52 6f 77  wid = pCur->iRow
0b70: 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   + 1;.  return S
0b80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
0b90: 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 50 6f  tic int schemaPo
0ba0: 6f 6c 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  olEof(sqlite3_vt
0bb0: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
0bc0: 0a 20 20 73 63 68 65 6d 61 70 6f 6f 6c 5f 63 75  .  schemapool_cu
0bd0: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63  rsor *pCur = (sc
0be0: 68 65 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f 72 2a  hemapool_cursor*
0bf0: 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  )cur;.  return p
0c00: 43 75 72 2d 3e 69 52 6f 77 3e 3d 70 43 75 72 2d  Cur->iRow>=pCur-
0c10: 3e 6e 52 6f 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >nRow;.}../*.** 
0c20: 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
0c30: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
0c40: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
0c50: 74 20 73 63 68 65 6d 61 50 6f 6f 6c 4e 65 78 74  t schemaPoolNext
0c60: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
0c70: 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 63  rsor *cur){.  sc
0c80: 68 65 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f 72 20  hemapool_cursor 
0c90: 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61 70  *pCur = (schemap
0ca0: 6f 6f 6c 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b  ool_cursor*)cur;
0cb0: 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77 2b 2b 3b  .  pCur->iRow++;
0cc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
0cd0: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 72 75 63 74 20 53  _OK;.}..struct S
0ce0: 63 68 65 6d 61 50 6f 6f 6c 20 7b 0a 20 20 69 6e  chemaPool {.  in
0cf0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d10: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
0d20: 65 72 73 20 74 6f 20 74 68 69 73 20 6f 62 6a 65  ers to this obje
0d30: 63 74 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75  ct */.  u64 cksu
0d40: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
0d50: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
0d60: 73 75 6d 20 66 6f 72 20 74 68 69 73 20 53 63 68  sum for this Sch
0d70: 65 6d 61 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  ema contents */.
0d80: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
0d90: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
0da0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
0db0: 20 6f 66 20 53 63 68 65 6d 61 20 6f 62 6a 65 63   of Schema objec
0dc0: 74 73 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20 73  ts */.  Schema s
0dd0: 53 63 68 65 6d 61 3b 20 20 20 20 20 20 20 20 20  Schema;         
0de0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
0df0: 69 6e 67 6c 65 20 64 75 6d 6d 79 20 73 63 68 65  ingle dummy sche
0e00: 6d 61 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53  ma object */.  S
0e10: 63 68 65 6d 61 50 6f 6f 6c 20 2a 70 4e 65 78 74  chemaPool *pNext
0e20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0e30: 2a 20 4e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  * Next element i
0e40: 6e 20 73 63 68 65 6d 61 50 6f 6f 6c 4c 69 73 74  n schemaPoolList
0e50: 20 2a 2f 0a 7d 3b 0a 65 78 74 65 72 6e 20 53 63   */.};.extern Sc
0e60: 68 65 6d 61 50 6f 6f 6c 20 2a 73 71 6c 69 74 65  hemaPool *sqlite
0e70: 33 53 63 68 65 6d 61 50 6f 6f 6c 4c 69 73 74 28  3SchemaPoolList(
0e80: 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  void);../*.** Re
0e90: 73 65 74 20 61 20 73 63 68 65 6d 61 50 6f 6f 6c  set a schemaPool
0ea0: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a   table cursor..*
0eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
0ec0: 65 6d 61 50 6f 6f 6c 46 69 6c 74 65 72 28 0a 20  emaPoolFilter(. 
0ed0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
0ee0: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
0ef0: 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
0f00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
0f10: 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
0f20: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
0f30: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53 63 68 65  **argv.){.  Sche
0f40: 6d 61 50 6f 6f 6c 20 2a 70 53 50 6f 6f 6c 3b 0a  maPool *pSPool;.
0f50: 20 20 73 63 68 65 6d 61 70 6f 6f 6c 5f 63 75 72    schemapool_cur
0f60: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68  sor *pCur = (sch
0f70: 65 6d 61 70 6f 6f 6c 5f 63 75 72 73 6f 72 2a 29  emapool_cursor*)
0f80: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 0a 20 20  pVtabCursor;..  
0f90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
0fa0: 72 2d 3e 61 44 61 74 61 29 3b 0a 20 20 70 43 75  r->aData);.  pCu
0fb0: 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b 0a 20 20  r->aData = 0;.  
0fc0: 70 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a  pCur->nRow = 0;.
0fd0: 20 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30    pCur->iRow = 0
0fe0: 3b 0a 0a 20 20 66 6f 72 28 70 53 50 6f 6f 6c 20  ;..  for(pSPool 
0ff0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 50  = sqlite3SchemaP
1000: 6f 6f 6c 4c 69 73 74 28 29 3b 20 70 53 50 6f 6f  oolList(); pSPoo
1010: 6c 3b 20 70 53 50 6f 6f 6c 3d 70 53 50 6f 6f 6c  l; pSPool=pSPool
1020: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 43  ->pNext){.    pC
1030: 75 72 2d 3e 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 0a  ur->nRow++;.  }.
1040: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f  .  if( pCur->nRo
1050: 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 52 6f  w ){.    int iRo
1060: 77 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  w = 0;.    pCur-
1070: 3e 61 44 61 74 61 20 3d 20 28 69 36 34 2a 29 73  >aData = (i64*)s
1080: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 33 20  qlite3_malloc(3 
1090: 2a 20 70 43 75 72 2d 3e 6e 52 6f 77 20 2a 20 73  * pCur->nRow * s
10a0: 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 20 20 20  izeof(i64));.   
10b0: 20 69 66 28 20 70 43 75 72 2d 3e 61 44 61 74 61   if( pCur->aData
10c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
10d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 66  ITE_NOMEM;.    f
10e0: 6f 72 28 70 53 50 6f 6f 6c 20 3d 20 73 71 6c 69  or(pSPool = sqli
10f0: 74 65 33 53 63 68 65 6d 61 50 6f 6f 6c 4c 69 73  te3SchemaPoolLis
1100: 74 28 29 3b 20 70 53 50 6f 6f 6c 3b 20 70 53 50  t(); pSPool; pSP
1110: 6f 6f 6c 3d 70 53 50 6f 6f 6c 2d 3e 70 4e 65 78  ool=pSPool->pNex
1120: 74 29 7b 0a 20 20 20 20 20 20 53 63 68 65 6d 61  t){.      Schema
1130: 20 2a 70 3b 0a 20 20 20 20 20 20 69 36 34 20 6e   *p;.      i64 n
1140: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
1150: 20 20 66 6f 72 28 70 3d 70 53 50 6f 6f 6c 2d 3e    for(p=pSPool->
1160: 70 53 63 68 65 6d 61 3b 20 70 3b 20 70 3d 70 2d  pSchema; p; p=p-
1170: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
1180: 20 6e 53 63 68 65 6d 61 2b 2b 3b 0a 20 20 20 20   nSchema++;.    
1190: 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
11a0: 61 44 61 74 61 5b 30 20 2b 20 69 52 6f 77 2a 33  aData[0 + iRow*3
11b0: 5d 20 3d 20 70 53 50 6f 6f 6c 2d 3e 63 6b 73 75  ] = pSPool->cksu
11c0: 6d 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  m;.      pCur->a
11d0: 44 61 74 61 5b 31 20 2b 20 69 52 6f 77 2a 33 5d  Data[1 + iRow*3]
11e0: 20 3d 20 28 69 36 34 29 70 53 50 6f 6f 6c 2d 3e   = (i64)pSPool->
11f0: 6e 52 65 66 3b 0a 20 20 20 20 20 20 70 43 75 72  nRef;.      pCur
1200: 2d 3e 61 44 61 74 61 5b 32 20 2b 20 69 52 6f 77  ->aData[2 + iRow
1210: 2a 33 5d 20 3d 20 6e 53 63 68 65 6d 61 3b 0a 20  *3] = nSchema;. 
1220: 20 20 20 20 20 69 52 6f 77 2b 2b 3b 0a 20 20 20       iRow++;.   
1230: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1240: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1250: 2a 0a 2a 2a 20 41 6e 61 6c 79 73 65 20 74 68 65  *.** Analyse the
1260: 20 57 48 45 52 45 20 63 6f 6e 64 69 74 69 6f 6e   WHERE condition
1270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1280: 73 63 68 65 6d 61 50 6f 6f 6c 42 65 73 74 49 6e  schemaPoolBestIn
1290: 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62  dex(sqlite3_vtab
12a0: 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69   *tab, sqlite3_i
12b0: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
12c0: 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  nfo){.  return S
12d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12e0: 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  ** A virtual tab
12f0: 6c 65 20 6d 6f 64 75 6c 65 20 74 68 61 74 20 6d  le module that m
1300: 65 72 65 6c 79 20 65 63 68 6f 73 20 6d 65 74 68  erely echos meth
1310: 6f 64 20 63 61 6c 6c 73 20 69 6e 74 6f 20 54 43  od calls into TC
1320: 4c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a  L.** variables..
1330: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
1340: 33 5f 6d 6f 64 75 6c 65 20 73 63 68 65 6d 61 50  3_module schemaP
1350: 6f 6f 6c 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20  oolModule = {.  
1360: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1380: 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 63  iVersion */.  sc
1390: 68 65 6d 61 50 6f 6f 6c 43 72 65 61 74 65 2c 0a  hemaPoolCreate,.
13a0: 20 20 73 63 68 65 6d 61 50 6f 6f 6c 43 72 65 61    schemaPoolCrea
13b0: 74 65 2c 0a 20 20 73 63 68 65 6d 61 50 6f 6f 6c  te,.  schemaPool
13c0: 42 65 73 74 49 6e 64 65 78 2c 0a 20 20 73 63 68  BestIndex,.  sch
13d0: 65 6d 61 50 6f 6f 6c 44 65 73 74 72 6f 79 2c 0a  emaPoolDestroy,.
13e0: 20 20 73 63 68 65 6d 61 50 6f 6f 6c 44 65 73 74    schemaPoolDest
13f0: 72 6f 79 2c 0a 20 20 73 63 68 65 6d 61 50 6f 6f  roy,.  schemaPoo
1400: 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
1410: 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f      /* xOpen - o
1420: 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  pen a cursor */.
1430: 20 20 73 63 68 65 6d 61 50 6f 6f 6c 43 6c 6f 73    schemaPoolClos
1440: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
1450: 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
1460: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73   a cursor */.  s
1470: 63 68 65 6d 61 50 6f 6f 6c 46 69 6c 74 65 72 2c  chemaPoolFilter,
1480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1490: 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75  Filter - configu
14a0: 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69  re scan constrai
14b0: 6e 74 73 20 2a 2f 0a 20 20 73 63 68 65 6d 61 50  nts */.  schemaP
14c0: 6f 6f 6c 4e 65 78 74 2c 20 20 20 20 20 20 20 20  oolNext,        
14d0: 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d        /* xNext -
14e0: 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   advance a curso
14f0: 72 20 2a 2f 0a 20 20 73 63 68 65 6d 61 50 6f 6f  r */.  schemaPoo
1500: 6c 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  lEof,           
1510: 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20      /* xEof */. 
1520: 20 73 63 68 65 6d 61 50 6f 6f 6c 43 6f 6c 75 6d   schemaPoolColum
1530: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
1540: 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20   xColumn - read 
1550: 64 61 74 61 20 2a 2f 0a 20 20 73 63 68 65 6d 61  data */.  schema
1560: 50 6f 6f 6c 52 6f 77 69 64 2c 20 20 20 20 20 20  PoolRowid,      
1570: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64         /* xRowid
1580: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
1590: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b0: 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30  * xUpdate */.  0
15c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15e0: 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  Begin */.  0,   
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
1610: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f     /* xCommit */
1640: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  /* xRollback */.
1670: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1690: 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f  * xFindMethod */
16a0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 7d 3b  /* xRename */.};
16d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
16e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
16f0: 71 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a  qlite3 object..*
1700: 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
1710: 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e  DbPointer(Tcl_In
1720: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f  terp *interp, co
1730: 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 73 71  nst char *zA, sq
1740: 6c 69 74 65 33 20 2a 2a 70 70 44 62 29 3b 0a 0a  lite3 **ppDb);..
1750: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  /*.** Register t
1760: 68 65 20 73 63 68 65 6d 61 20 76 69 72 74 75 61  he schema virtua
1770: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 0a  l table module..
1780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1790: 4c 49 54 45 5f 54 43 4c 41 50 49 20 72 65 67 69  LITE_TCLAPI regi
17a0: 73 74 65 72 5f 73 63 68 65 6d 61 70 6f 6f 6c 5f  ster_schemapool_
17b0: 6d 6f 64 75 6c 65 28 0a 20 20 43 6c 69 65 6e 74  module(.  Client
17c0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
17d0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
17e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17f0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1800: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1810: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1820: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1830: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
1840: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1850: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1860: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1870: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
1880: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
1890: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
18a0: 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  b;.  if( objc!=2
18b0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
18c0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
18d0: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
18e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1900: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1910: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1920: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1930: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1940: 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53  ERROR;.#ifndef S
1950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1960: 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
1970: 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28  3_create_module(
1980: 64 62 2c 20 22 73 63 68 65 6d 61 70 6f 6f 6c 22  db, "schemapool"
1990: 2c 20 26 73 63 68 65 6d 61 50 6f 6f 6c 4d 6f 64  , &schemaPoolMod
19a0: 75 6c 65 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ule, 0);.#endif.
19b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19c0: 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .}..#endif../*.*
19d0: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
19e0: 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
19f0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
1a00: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73  .int Sqlitetests
1a10: 63 68 65 6d 61 70 6f 6f 6c 5f 49 6e 69 74 28 54  chemapool_Init(T
1a20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a30: 70 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  p){.  static str
1a40: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
1a50: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
1a60: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
1a70: 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63  oc;.     void *c
1a80: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61  lientData;.  } a
1a90: 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
1aa0: 20 20 7b 20 22 72 65 67 69 73 74 65 72 5f 73 63    { "register_sc
1ab0: 68 65 6d 61 70 6f 6f 6c 5f 6d 6f 64 75 6c 65 22  hemapool_module"
1ac0: 2c 20 72 65 67 69 73 74 65 72 5f 73 63 68 65 6d  , register_schem
1ad0: 61 70 6f 6f 6c 5f 6d 6f 64 75 6c 65 2c 20 30 20  apool_module, 0 
1ae0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
1af0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1b00: 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69  zeof(aObjCmd)/si
1b10: 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29  zeof(aObjCmd[0])
1b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
1b30: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1b40: 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64  (interp, aObjCmd
1b50: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [i].zName, .    
1b60: 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78      aObjCmd[i].x
1b70: 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  Proc, aObjCmd[i]
1b80: 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b  .clientData, 0);
1b90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1ba0: 4c 5f 4f 4b 3b 0a 7d 0a 0a                       L_OK;.}..