/ Hex Artifact Content
Login

Artifact 2bdba21b82f601da69793e1f1d11bf481a79b091:


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 20 54 68 65 20  ary..*/../* The 
0220: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
0230: 65 20 64 65 66 69 6e 65 73 20 61 20 73 71 6c 69  e defines a sqli
0240: 74 65 33 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  te3 virtual-tabl
0250: 65 20 6d 6f 64 75 6c 65 20 74 68 61 74 0a 2a 2a  e module that.**
0260: 20 70 72 6f 76 69 64 65 73 20 61 20 72 65 61 64   provides a read
0270: 2d 6f 6e 6c 79 20 76 69 65 77 20 6f 66 20 74 68  -only view of th
0280: 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
0290: 73 65 20 73 63 68 65 6d 61 2e 20 54 68 65 72 65  se schema. There
02a0: 20 69 73 20 6f 6e 65 0a 2a 2a 20 72 6f 77 20 69   is one.** row i
02b0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62  n the schema tab
02c0: 6c 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  le for each colu
02d0: 6d 6e 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  mn in the databa
02e0: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 23 64  se schema..*/.#d
02f0: 65 66 69 6e 65 20 53 43 48 45 4d 41 20 5c 0a 22  efine SCHEMA \."
0300: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 22  CREATE TABLE x("
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0340: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0350: 22 64 61 74 61 62 61 73 65 2c 22 20 20 20 20 20  "database,"     
0360: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
0370: 64 61 74 61 62 61 73 65 20 28 69 2e 65 2e 20 6d  database (i.e. m
0380: 61 69 6e 2c 20 74 65 6d 70 20 65 74 63 2e 29 20  ain, temp etc.) 
0390: 2a 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22  */         \.  "
03a0: 74 61 62 6c 65 6e 61 6d 65 2c 22 20 20 20 20 20  tablename,"     
03b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
03c0: 61 62 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20  able */         
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 63            \.  "c
03f0: 69 64 2c 22 20 20 20 20 20 20 20 20 20 20 20 20  id,"            
0400: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
0410: 62 65 72 20 28 66 72 6f 6d 20 6c 65 66 74 2d 74  ber (from left-t
0420: 6f 2d 72 69 67 68 74 2c 20 30 20 75 70 77 61 72  o-right, 0 upwar
0430: 64 29 20 2a 2f 20 20 20 20 5c 0a 20 20 22 6e 61  d) */    \.  "na
0440: 6d 65 2c 22 20 20 20 20 20 20 20 20 20 20 20 20  me,"            
0450: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
0460: 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74 79 70          \.  "typ
0490: 65 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  e,"             
04a0: 20 2f 2a 20 53 70 65 63 69 66 69 65 64 20 74 79   /* Specified ty
04b0: 70 65 20 28 69 2e 65 2e 20 56 41 52 43 48 41 52  pe (i.e. VARCHAR
04c0: 28 33 32 29 29 20 2a 2f 20 20 20 20 20 20 20 20  (32)) */        
04d0: 20 20 20 20 20 20 20 5c 0a 20 20 22 6e 6f 74 5f         \.  "not_
04e0: 6e 75 6c 6c 2c 22 20 20 20 20 20 20 20 20 20 20  null,"          
04f0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
0500: 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 77 61 73   if NOT NULL was
0510: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 20 20 20   specified */   
0520: 20 20 20 20 20 20 5c 0a 20 20 22 64 66 6c 74 5f        \.  "dflt_
0530: 76 61 6c 75 65 2c 22 20 20 20 20 20 20 20 20 2f  value,"        /
0540: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
0550: 66 6f 72 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  for this column 
0560: 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
0570: 20 20 20 20 20 5c 0a 20 20 22 70 6b 22 20 20 20       \.  "pk"   
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0590: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63 6f   True if this co
05a0: 6c 75 6d 6e 20 69 73 20 70 61 72 74 20 6f 66 20  lumn is part of 
05b0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
05c0: 2a 2f 20 20 5c 0a 22 29 22 0a 0a 2f 2a 20 49 66  */  \.")"../* If
05d0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
05e0: 64 65 66 69 6e 65 64 20 74 68 69 73 20 63 6f 64  defined this cod
05f0: 65 20 69 73 20 70 72 65 70 72 6f 63 65 73 73 65  e is preprocesse
0600: 64 20 66 6f 72 20 75 73 65 20 61 73 20 70 61 72  d for use as par
0610: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69  t.** of the sqli
0620: 74 65 20 74 65 73 74 20 62 69 6e 61 72 79 20 22  te test binary "
0630: 74 65 73 74 66 69 78 74 75 72 65 22 2e 20 4f 74  testfixture". Ot
0640: 68 65 72 77 69 73 65 20 69 74 20 69 73 20 70 72  herwise it is pr
0650: 65 70 72 6f 63 65 73 73 65 64 0a 2a 2a 20 74 6f  eprocessed.** to
0660: 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 69 6e 74   be compiled int
0670: 6f 20 61 6e 20 73 71 6c 69 74 65 20 64 79 6e 61  o an sqlite dyna
0680: 6d 69 63 20 65 78 74 65 6e 73 69 6f 6e 2e 0a 2a  mic extension..*
0690: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
06a0: 54 45 53 54 0a 20 20 23 69 6e 63 6c 75 64 65 20  TEST.  #include 
06b0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 20 20  "sqliteInt.h".  
06c0: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22  #include "tcl.h"
06d0: 0a 23 65 6c 73 65 0a 20 20 23 69 6e 63 6c 75 64  .#else.  #includ
06e0: 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22  e "sqlite3ext.h"
06f0: 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
0700: 49 4f 4e 5f 49 4e 49 54 31 0a 23 65 6e 64 69 66  ION_INIT1.#endif
0710: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0720: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
0730: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0740: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 74  de <assert.h>..t
0750: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 63  ypedef struct sc
0760: 68 65 6d 61 5f 76 74 61 62 20 73 63 68 65 6d 61  hema_vtab schema
0770: 5f 76 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73  _vtab;.typedef s
0780: 74 72 75 63 74 20 73 63 68 65 6d 61 5f 63 75 72  truct schema_cur
0790: 73 6f 72 20 73 63 68 65 6d 61 5f 63 75 72 73 6f  sor schema_curso
07a0: 72 3b 0a 0a 2f 2a 20 41 20 73 63 68 65 6d 61 20  r;../* A schema 
07b0: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  table object */.
07c0: 73 74 72 75 63 74 20 73 63 68 65 6d 61 5f 76 74  struct schema_vt
07d0: 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ab {.  sqlite3_v
07e0: 74 61 62 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  tab base;.  sqli
07f0: 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 20  te3 *db;.};../* 
0800: 41 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 63  A schema table c
0810: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
0820: 73 74 72 75 63 74 20 73 63 68 65 6d 61 5f 63 75  struct schema_cu
0830: 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  rsor {.  sqlite3
0840: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
0850: 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  e;.  sqlite3_stm
0860: 74 20 2a 70 44 62 4c 69 73 74 3b 0a 20 20 73 71  t *pDbList;.  sq
0870: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 61 62  lite3_stmt *pTab
0880: 6c 65 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  leList;.  sqlite
0890: 33 5f 73 74 6d 74 20 2a 70 43 6f 6c 75 6d 6e 4c  3_stmt *pColumnL
08a0: 69 73 74 3b 0a 20 20 69 6e 74 20 72 6f 77 69 64  ist;.  int rowid
08b0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 6e 65  ;.};../*.** None
08c0: 20 6f 66 20 74 68 69 73 20 77 6f 72 6b 73 20 75   of this works u
08d0: 6e 6c 65 73 73 20 77 65 20 68 61 76 65 20 76 69  nless we have vi
08e0: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
08f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0900: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
0910: 45 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 64  E../*.** Table d
0920: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
0930: 65 20 73 63 68 65 6d 61 20 6d 6f 64 75 6c 65 2e  e schema module.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
0950: 63 68 65 6d 61 44 65 73 74 72 6f 79 28 73 71 6c  chemaDestroy(sql
0960: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
0970: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
0980: 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75  e(pVtab);.  retu
0990: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
09a0: 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72  able constructor
09b0: 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20   for the schema 
09c0: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
09d0: 63 20 69 6e 74 20 73 63 68 65 6d 61 43 72 65 61  c int schemaCrea
09e0: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
09f0: 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
0a00: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
0a10: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
0a20: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
0a30: 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20  tab **ppVtab,.  
0a40: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
0a50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
0a60: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 63 68 65 6d  E_NOMEM;.  schem
0a70: 61 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  a_vtab *pVtab = 
0a80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
0a90: 69 7a 65 6f 66 28 73 63 68 65 6d 61 5f 76 74 61  izeof(schema_vta
0aa0: 62 29 29 3b 0a 20 20 69 66 28 20 70 56 74 61 62  b));.  if( pVtab
0ab0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
0ac0: 56 74 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vtab, 0, sizeof(
0ad0: 73 63 68 65 6d 61 5f 76 74 61 62 29 29 3b 0a 20  schema_vtab));. 
0ae0: 20 20 20 70 56 74 61 62 2d 3e 64 62 20 3d 20 64     pVtab->db = d
0af0: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
0b00: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
0b10: 42 4c 45 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  BLE.    rc = sql
0b20: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
0b30: 62 28 64 62 2c 20 53 43 48 45 4d 41 29 3b 0a 23  b(db, SCHEMA);.#
0b40: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2a 70 70 56  endif.  }.  *ppV
0b50: 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  tab = (sqlite3_v
0b60: 74 61 62 20 2a 29 70 56 74 61 62 3b 0a 20 20 72  tab *)pVtab;.  r
0b70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
0b80: 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75  ** Open a new cu
0b90: 72 73 6f 72 20 6f 6e 20 74 68 65 20 73 63 68 65  rsor on the sche
0ba0: 6d 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ma table..*/.sta
0bb0: 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 4f 70  tic int schemaOp
0bc0: 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  en(sqlite3_vtab 
0bd0: 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f  *pVTab, sqlite3_
0be0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
0bf0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 72  Cursor){.  int r
0c00: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
0c10: 3b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f  ;.  schema_curso
0c20: 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75 72 20  r *pCur;.  pCur 
0c30: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
0c40: 28 73 69 7a 65 6f 66 28 73 63 68 65 6d 61 5f 63  (sizeof(schema_c
0c50: 75 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20 70  ursor));.  if( p
0c60: 43 75 72 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  Cur ){.    memse
0c70: 74 28 70 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f  t(pCur, 0, sizeo
0c80: 66 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 29  f(schema_cursor)
0c90: 29 3b 0a 20 20 20 20 2a 70 70 43 75 72 73 6f 72  );.    *ppCursor
0ca0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62   = (sqlite3_vtab
0cb0: 5f 63 75 72 73 6f 72 20 2a 29 70 43 75 72 3b 0a  _cursor *)pCur;.
0cc0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
0cd0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
0ce0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
0cf0: 6f 73 65 20 61 20 73 63 68 65 6d 61 20 74 61 62  ose a schema tab
0d00: 6c 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74  le cursor..*/.st
0d10: 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 43  atic int schemaC
0d20: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61  lose(sqlite3_vta
0d30: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
0d40: 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20    schema_cursor 
0d50: 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61 5f  *pCur = (schema_
0d60: 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  cursor *)cur;.  
0d70: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
0d80: 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b  (pCur->pDbList);
0d90: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
0da0: 69 7a 65 28 70 43 75 72 2d 3e 70 54 61 62 6c 65  ize(pCur->pTable
0db0: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
0dc0: 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72 2d 3e  _finalize(pCur->
0dd0: 70 43 6f 6c 75 6d 6e 4c 69 73 74 29 3b 0a 20 20  pColumnList);.  
0de0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
0df0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
0e00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
0e10: 20 52 65 74 72 69 65 76 65 20 61 20 63 6f 6c 75   Retrieve a colu
0e20: 6d 6e 20 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a 73  mn of data..*/.s
0e30: 74 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61  tatic int schema
0e40: 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76  Column(sqlite3_v
0e50: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
0e60: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
0e70: 20 2a 63 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20   *ctx, int i){. 
0e80: 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a   schema_cursor *
0e90: 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63  pCur = (schema_c
0ea0: 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73  ursor *)cur;.  s
0eb0: 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20  witch( i ){.    
0ec0: 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20 73 71  case 0:.      sq
0ed0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
0ee0: 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f  ue(ctx, sqlite3_
0ef0: 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 75  column_value(pCu
0f00: 72 2d 3e 70 44 62 4c 69 73 74 2c 20 31 29 29 3b  r->pDbList, 1));
0f10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0f20: 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20    case 1:.      
0f30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
0f40: 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65  alue(ctx, sqlite
0f50: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
0f60: 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2c  Cur->pTableList,
0f70: 20 30 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61   0));.      brea
0f80: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
0f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0fa0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20  sult_value(ctx, 
0fb0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
0fc0: 61 6c 75 65 28 70 43 75 72 2d 3e 70 43 6f 6c 75  alue(pCur->pColu
0fd0: 6d 6e 4c 69 73 74 2c 20 69 2d 32 29 29 3b 0a 20  mnList, i-2));. 
0fe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
0ff0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1000: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
1010: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
1020: 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74  t rowid..*/.stat
1030: 69 63 20 69 6e 74 20 73 63 68 65 6d 61 52 6f 77  ic int schemaRow
1040: 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  id(sqlite3_vtab_
1050: 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c  cursor *cur, sql
1060: 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
1070: 64 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72  d){.  schema_cur
1080: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68  sor *pCur = (sch
1090: 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72  ema_cursor *)cur
10a0: 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43  ;.  *pRowid = pC
10b0: 75 72 2d 3e 72 6f 77 69 64 3b 0a 20 20 72 65 74  ur->rowid;.  ret
10c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  ..static int fin
10e0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 73 74  alize(sqlite3_st
10f0: 6d 74 20 2a 2a 70 70 53 74 6d 74 29 7b 0a 20 20  mt **ppStmt){.  
1100: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1110: 5f 66 69 6e 61 6c 69 7a 65 28 2a 70 70 53 74 6d  _finalize(*ppStm
1120: 74 29 3b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  t);.  *ppStmt = 
1130: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1140: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63  }..static int sc
1150: 68 65 6d 61 45 6f 66 28 73 71 6c 69 74 65 33 5f  hemaEof(sqlite3_
1160: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
1170: 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73  ){.  schema_curs
1180: 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65  or *pCur = (sche
1190: 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b  ma_cursor *)cur;
11a0: 0a 20 20 72 65 74 75 72 6e 20 28 70 43 75 72 2d  .  return (pCur-
11b0: 3e 70 44 62 4c 69 73 74 20 3f 20 30 20 3a 20 31  >pDbList ? 0 : 1
11c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
11d0: 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
11e0: 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a  o the next row..
11f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63  */.static int sc
1200: 68 65 6d 61 4e 65 78 74 28 73 71 6c 69 74 65 33  hemaNext(sqlite3
1210: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
1220: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1230: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 63 68 65  QLITE_OK;.  sche
1240: 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  ma_cursor *pCur 
1250: 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  = (schema_cursor
1260: 20 2a 29 63 75 72 3b 0a 20 20 73 63 68 65 6d 61   *)cur;.  schema
1270: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28  _vtab *pVtab = (
1280: 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 29 28 63  schema_vtab *)(c
1290: 75 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 63 68  ur->pVtab);.  ch
12a0: 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 0a 20  ar *zSql = 0;.. 
12b0: 20 77 68 69 6c 65 28 20 21 70 43 75 72 2d 3e 70   while( !pCur->p
12c0: 43 6f 6c 75 6d 6e 4c 69 73 74 20 7c 7c 20 53 51  ColumnList || SQ
12d0: 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65  LITE_ROW!=sqlite
12e0: 33 5f 73 74 65 70 28 70 43 75 72 2d 3e 70 43 6f  3_step(pCur->pCo
12f0: 6c 75 6d 6e 4c 69 73 74 29 20 29 7b 0a 20 20 20  lumnList) ){.   
1300: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1310: 28 72 63 20 3d 20 66 69 6e 61 6c 69 7a 65 28 26  (rc = finalize(&
1320: 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73  pCur->pColumnLis
1330: 74 29 29 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f  t)) ) goto next_
1340: 65 78 69 74 3b 0a 0a 20 20 20 20 77 68 69 6c 65  exit;..    while
1350: 28 20 21 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c  ( !pCur->pTableL
1360: 69 73 74 20 7c 7c 20 53 51 4c 49 54 45 5f 52 4f  ist || SQLITE_RO
1370: 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W!=sqlite3_step(
1380: 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74  pCur->pTableList
1390: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  ) ){.      if( S
13a0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
13b0: 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e  finalize(&pCur->
13c0: 70 54 61 62 6c 65 4c 69 73 74 29 29 20 29 20 67  pTableList)) ) g
13d0: 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a 0a  oto next_exit;..
13e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 43 75        assert(pCu
13f0: 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 20  r->pDbList);.   
1400: 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
1410: 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW!=sqlite3_st
1420: 65 70 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74  ep(pCur->pDbList
1430: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1440: 3d 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72  = finalize(&pCur
1450: 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 20 20  ->pDbList);.    
1460: 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78      goto next_ex
1470: 69 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  it;.      }..   
1480: 20 20 20 2f 2a 20 53 65 74 20 7a 53 71 6c 20 74     /* Set zSql t
1490: 6f 20 74 68 65 20 53 51 4c 20 74 6f 20 70 75 6c  o the SQL to pul
14a0: 6c 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 61  l the list of ta
14b0: 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  bles from the . 
14c0: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d       ** sqlite_m
14d0: 61 73 74 65 72 20 28 6f 72 20 73 71 6c 69 74 65  aster (or sqlite
14e0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 74 61  _temp_master) ta
14f0: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
1500: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 64 65  ase.      ** ide
1510: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 72  ntified by the r
1520: 6f 77 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ow pointed to by
1530: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1540: 6e 74 20 70 43 75 72 2d 3e 70 44 62 4c 69 73 74  nt pCur->pDbList
1550: 0a 20 20 20 20 20 20 2a 2a 20 28 69 74 65 72 61  .      ** (itera
1560: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20 22  ting through a "
1570: 50 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f  PRAGMA database_
1580: 6c 69 73 74 3b 22 20 73 74 61 74 65 6d 65 6e 74  list;" statement
1590: 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
15a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
15b0: 6c 75 6d 6e 5f 69 6e 74 28 70 43 75 72 2d 3e 70  lumn_int(pCur->p
15c0: 44 62 4c 69 73 74 2c 20 30 29 3d 3d 31 20 29 7b  DbList, 0)==1 ){
15d0: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
15e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45  .            "SE
1600: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
1610: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
1620: 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61  r WHERE type='ta
1630: 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 29 3b  ble'".        );
1640: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
1660: 6d 74 20 2a 70 44 62 4c 69 73 74 20 3d 20 70 43  mt *pDbList = pC
1670: 75 72 2d 3e 70 44 62 4c 69 73 74 3b 0a 20 20 20  ur->pDbList;.   
1680: 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
1690: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
16a0: 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
16b0: 20 6e 61 6d 65 20 46 52 4f 4d 20 25 51 2e 73 71   name FROM %Q.sq
16c0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
16d0: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c  E type='table'",
16e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
16f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1700: 74 28 70 44 62 4c 69 73 74 2c 20 31 29 0a 20 20  t(pDbList, 1).  
1710: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
1720: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 53 71 6c  .      if( !zSql
1730: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1740: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1750: 20 20 20 20 20 20 20 67 6f 74 6f 20 6e 65 78 74         goto next
1760: 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  _exit;.      }..
1770: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1780: 65 33 5f 70 72 65 70 61 72 65 28 70 56 74 61 62  e3_prepare(pVtab
1790: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
17a0: 26 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73  &pCur->pTableLis
17b0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
17c0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
17d0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
17f0: 6e 65 78 74 5f 65 78 69 74 3b 0a 20 20 20 20 7d  next_exit;.    }
1800: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 7a 53 71  ..    /* Set zSq
1810: 6c 20 74 6f 20 74 68 65 20 53 51 4c 20 74 6f 20  l to the SQL to 
1820: 74 68 65 20 74 61 62 6c 65 5f 69 6e 66 6f 20 70  the table_info p
1830: 72 61 67 6d 61 20 66 6f 72 20 74 68 65 20 74 61  ragma for the ta
1840: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  ble currently.  
1850: 20 20 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20    ** identified 
1860: 62 79 20 74 68 65 20 72 6f 77 73 20 70 6f 69 6e  by the rows poin
1870: 74 65 64 20 74 6f 20 62 79 20 73 74 61 74 65 6d  ted to by statem
1880: 65 6e 74 73 20 70 43 75 72 2d 3e 70 44 62 4c 69  ents pCur->pDbLi
1890: 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 43  st and.    ** pC
18a0: 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2e 0a  ur->pTableList..
18b0: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20      */.    zSql 
18c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18d0: 66 28 22 50 52 41 47 4d 41 20 25 51 2e 74 61 62  f("PRAGMA %Q.tab
18e0: 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 0a 20  le_info(%Q)", . 
18f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1900: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 75 72 2d  olumn_text(pCur-
1910: 3e 70 44 62 4c 69 73 74 2c 20 31 29 2c 0a 20 20  >pDbList, 1),.  
1920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1930: 6c 75 6d 6e 5f 74 65 78 74 28 70 43 75 72 2d 3e  lumn_text(pCur->
1940: 70 54 61 62 6c 65 4c 69 73 74 2c 20 30 29 0a 20  pTableList, 0). 
1950: 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 21     );..    if( !
1960: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  zSql ){.      rc
1970: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1980: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 65 78 74  .      goto next
1990: 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
19a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
19b0: 65 70 61 72 65 28 70 56 74 61 62 2d 3e 64 62 2c  epare(pVtab->db,
19c0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72   zSql, -1, &pCur
19d0: 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 2c 20 30  ->pColumnList, 0
19e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19f0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
1a00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a10: 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69   ) goto next_exi
1a20: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 72  t;.  }.  pCur->r
1a30: 6f 77 69 64 2b 2b 3b 0a 0a 6e 65 78 74 5f 65 78  owid++;..next_ex
1a40: 69 74 3a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 48  it:.  /* TODO: H
1a50: 61 6e 64 6c 65 20 72 63 20 2a 2f 0a 20 20 72 65  andle rc */.  re
1a60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a70: 2a 20 52 65 73 65 74 20 61 20 73 63 68 65 6d 61  * Reset a schema
1a80: 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a   table cursor..*
1a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
1aa0: 65 6d 61 46 69 6c 74 65 72 28 0a 20 20 73 71 6c  emaFilter(.  sql
1ab0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
1ac0: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a   *pVtabCursor, .
1ad0: 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f    int idxNum, co
1ae0: 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72  nst char *idxStr
1af0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71  ,.  int argc, sq
1b00: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1b10: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gv.){.  int rc;.
1b20: 20 20 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 70    schema_vtab *p
1b30: 56 74 61 62 20 3d 20 28 73 63 68 65 6d 61 5f 76  Vtab = (schema_v
1b40: 74 61 62 20 2a 29 28 70 56 74 61 62 43 75 72 73  tab *)(pVtabCurs
1b50: 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 73 63  or->pVtab);.  sc
1b60: 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75  hema_cursor *pCu
1b70: 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73  r = (schema_curs
1b80: 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72  or *)pVtabCursor
1b90: 3b 0a 20 20 70 43 75 72 2d 3e 72 6f 77 69 64 20  ;.  pCur->rowid 
1ba0: 3d 20 30 3b 0a 20 20 66 69 6e 61 6c 69 7a 65 28  = 0;.  finalize(
1bb0: 26 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73  &pCur->pTableLis
1bc0: 74 29 3b 0a 20 20 66 69 6e 61 6c 69 7a 65 28 26  t);.  finalize(&
1bd0: 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73  pCur->pColumnLis
1be0: 74 29 3b 0a 20 20 66 69 6e 61 6c 69 7a 65 28 26  t);.  finalize(&
1bf0: 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a  pCur->pDbList);.
1c00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1c10: 72 65 70 61 72 65 28 70 56 74 61 62 2d 3e 64 62  repare(pVtab->db
1c20: 2c 22 50 52 41 47 4d 41 20 64 61 74 61 62 61 73  ,"PRAGMA databas
1c30: 65 5f 6c 69 73 74 22 2c 20 2d 31 2c 20 26 70 43  e_list", -1, &pC
1c40: 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20 30 29 3b  ur->pDbList, 0);
1c50: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
1c60: 51 4c 49 54 45 5f 4f 4b 20 3f 20 73 63 68 65 6d  QLITE_OK ? schem
1c70: 61 4e 65 78 74 28 70 56 74 61 62 43 75 72 73 6f  aNext(pVtabCurso
1c80: 72 29 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  r) : rc);.}../*.
1c90: 2a 2a 20 41 6e 61 6c 79 73 65 20 74 68 65 20 57  ** Analyse the W
1ca0: 48 45 52 45 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a  HERE condition..
1cb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63  */.static int sc
1cc0: 68 65 6d 61 42 65 73 74 49 6e 64 65 78 28 73 71  hemaBestIndex(sq
1cd0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c  lite3_vtab *tab,
1ce0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1cf0: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a  nfo *pIdxInfo){.
1d00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76  OK;.}../*.** A v
1d20: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
1d30: 75 6c 65 20 74 68 61 74 20 6d 65 72 65 6c 79 20  ule that merely 
1d40: 65 63 68 6f 73 20 6d 65 74 68 6f 64 20 63 61 6c  echos method cal
1d50: 6c 73 20 69 6e 74 6f 20 54 43 4c 0a 2a 2a 20 76  ls into TCL.** v
1d60: 61 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  ariables..*/.sta
1d70: 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
1d80: 6c 65 20 73 63 68 65 6d 61 4d 6f 64 75 6c 65 20  le schemaModule 
1d90: 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20  = {.  0,        
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
1dc0: 2f 0a 20 20 73 63 68 65 6d 61 43 72 65 61 74 65  /.  schemaCreate
1dd0: 2c 0a 20 20 73 63 68 65 6d 61 43 72 65 61 74 65  ,.  schemaCreate
1de0: 2c 0a 20 20 73 63 68 65 6d 61 42 65 73 74 49 6e  ,.  schemaBestIn
1df0: 64 65 78 2c 0a 20 20 73 63 68 65 6d 61 44 65 73  dex,.  schemaDes
1e00: 74 72 6f 79 2c 0a 20 20 73 63 68 65 6d 61 44 65  troy,.  schemaDe
1e10: 73 74 72 6f 79 2c 0a 20 20 73 63 68 65 6d 61 4f  stroy,.  schemaO
1e20: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
1e30: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
1e40: 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
1e50: 2f 0a 20 20 73 63 68 65 6d 61 43 6c 6f 73 65 2c  /.  schemaClose,
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
1e80: 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
1e90: 20 73 63 68 65 6d 61 46 69 6c 74 65 72 2c 20 20   schemaFilter,  
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb0: 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
1ec0: 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
1ed0: 61 69 6e 74 73 20 2a 2f 0a 20 20 73 63 68 65 6d  aints */.  schem
1ee0: 61 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  aNext,          
1ef0: 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
1f00: 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
1f10: 73 6f 72 20 2a 2f 0a 20 20 73 63 68 65 6d 61 45  sor */.  schemaE
1f20: 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  of,             
1f30: 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f        /* xEof */
1f40: 0a 20 20 73 63 68 65 6d 61 43 6f 6c 75 6d 6e 2c  .  schemaColumn,
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
1f70: 64 20 64 61 74 61 20 2a 2f 0a 20 20 73 63 68 65  d data */.  sche
1f80: 6d 61 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20  maRowid,        
1f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
1fa0: 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
1fb0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20   /* xUpdate */. 
1fe0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2000: 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20   xBegin */.  0, 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
2030: 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  nc */.  0,      
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20       /* xCommit 
2060: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a    /* xRollback *
2090: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20   /* xFindMethod 
20c0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a    /* xRename */.
20f0: 7d 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  };..#endif /* !d
2100: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2110: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
2120: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
2130: 54 45 5f 54 45 53 54 0a 0a 2f 2a 0a 2a 2a 20 44  TE_TEST../*.** D
2140: 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65 72 20  ecode a pointer 
2150: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 20 6f 62  to an sqlite3 ob
2160: 6a 65 63 74 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20  ject..*/.extern 
2170: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
2180: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
2190: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
21a0: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
21b0: 70 44 62 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  pDb);../*.** Reg
21c0: 69 73 74 65 72 20 74 68 65 20 73 63 68 65 6d 61  ister the schema
21d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d   virtual table m
21e0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
21f0: 20 69 6e 74 20 72 65 67 69 73 74 65 72 5f 73 63   int register_sc
2200: 68 65 6d 61 5f 6d 6f 64 75 6c 65 28 0a 20 20 43  hema_module(.  C
2210: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2220: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
2230: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
2240: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2250: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2260: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2270: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2280: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
2290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22a0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
22b0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
22c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
22d0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
22e0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
22f0: 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62  e3 *db;.  if( ob
2300: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
2310: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2320: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2330: 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
2340: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2350: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2360: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2370: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2380: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
2390: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 69 66 6e   TCL_ERROR;.#ifn
23a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
23c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f  qlite3_create_mo
23d0: 64 75 6c 65 28 64 62 2c 20 22 73 63 68 65 6d 61  dule(db, "schema
23e0: 22 2c 20 26 73 63 68 65 6d 61 4d 6f 64 75 6c 65  ", &schemaModule
23f0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  , 0);.#endif.  r
2400: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2410: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
2420: 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68  commands with th
2430: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2440: 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65  r..*/.int Sqlite
2450: 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
2460: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2470: 72 70 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  rp){.  static st
2480: 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
2490: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63   *zName;.     Tc
24a0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50  l_ObjCmdProc *xP
24b0: 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a  roc;.     void *
24c0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20  clientData;.  } 
24d0: 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20  aObjCmd[] = {.  
24e0: 20 20 20 7b 20 22 72 65 67 69 73 74 65 72 5f 73     { "register_s
24f0: 63 68 65 6d 61 5f 6d 6f 64 75 6c 65 22 2c 20 72  chema_module", r
2500: 65 67 69 73 74 65 72 5f 73 63 68 65 6d 61 5f 6d  egister_schema_m
2510: 6f 64 75 6c 65 2c 20 30 20 7d 2c 0a 20 20 7d 3b  odule, 0 },.  };
2520: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2530: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
2540: 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f  bjCmd)/sizeof(aO
2550: 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  bjCmd[0]); i++){
2560: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
2570: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
2580: 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61  , aObjCmd[i].zNa
2590: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62  me, .        aOb
25a0: 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61  jCmd[i].xProc, a
25b0: 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74  ObjCmd[i].client
25c0: 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Data, 0);.  }.  
25d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
25e0: 0a 0a 23 65 6c 73 65 0a 0a 2f 2a 0a 2a 2a 20 45  ..#else../*.** E
25f0: 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20 66 75  xtension load fu
2600: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65  nction..*/.#ifde
2610: 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73  f _WIN32.__decls
2620: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23  pec(dllexport).#
2630: 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65  endif.int sqlite
2640: 33 5f 73 63 68 65 6d 61 5f 69 6e 69 74 28 0a 20  3_schema_init(. 
2650: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
2660: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
2670: 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  , .  const sqlit
2680: 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20  e3_api_routines 
2690: 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54  *pApi.){.  SQLIT
26a0: 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
26b0: 32 28 70 41 70 69 29 3b 0a 23 69 66 6e 64 65 66  2(pApi);.#ifndef
26c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
26d0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
26e0: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
26f0: 65 28 64 62 2c 20 22 73 63 68 65 6d 61 22 2c 20  e(db, "schema", 
2700: 26 73 63 68 65 6d 61 4d 6f 64 75 6c 65 2c 20 30  &schemaModule, 0
2710: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
2720: 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a  rn 0;.}..#endif.