/ Hex Artifact Content
Login

Artifact cd12a2223c3a394f4d07bb93bdf6d344c5c121b6:


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 66 69 65 64 20 62 79 20 74 68 65 20 72 6f  ntfied by the ro
1520: 77 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  w pointed to by 
1530: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1540: 74 20 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 0a  t pCur->pDbList.
1550: 20 20 20 20 20 20 2a 2a 20 28 69 74 65 72 61 74        ** (iterat
1560: 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20 22 50  ing through a "P
1570: 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c  RAGMA database_l
1580: 69 73 74 3b 22 20 73 74 61 74 65 6d 65 6e 74 29  ist;" statement)
1590: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15a0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
15b0: 75 6d 6e 5f 69 6e 74 28 70 43 75 72 2d 3e 70 44  umn_int(pCur->pD
15c0: 62 4c 69 73 74 2c 20 30 29 3d 3d 31 20 29 7b 0a  bList, 0)==1 ){.
15d0: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
15e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
1600: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
1610: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
1620: 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
1630: 6c 65 27 22 0a 20 20 20 20 20 20 20 20 29 3b 0a  le'".        );.
1640: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1650: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
1660: 74 20 2a 70 44 62 4c 69 73 74 20 3d 20 70 43 75  t *pDbList = pCu
1670: 72 2d 3e 70 44 62 4c 69 73 74 3b 0a 20 20 20 20  r->pDbList;.    
1680: 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1690: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
16a0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
16b0: 6e 61 6d 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c  name FROM %Q.sql
16c0: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
16d0: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 0a   type='table'",.
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
16f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1700: 28 70 44 62 4c 69 73 74 2c 20 31 29 0a 20 20 20  (pDbList, 1).   
1710: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
1720: 20 20 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20        if( !zSql 
1730: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1740: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1750: 20 20 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f        goto next_
1760: 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  exit;.      }.. 
1770: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1780: 33 5f 70 72 65 70 61 72 65 28 70 56 74 61 62 2d  3_prepare(pVtab-
1790: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
17a0: 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74  pCur->pTableList
17b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
17c0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
17d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17e0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 6e  LITE_OK ) goto n
17f0: 65 78 74 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ext_exit;.    }.
1800: 0a 20 20 20 20 2f 2a 20 53 65 74 20 7a 53 71 6c  .    /* Set zSql
1810: 20 74 6f 20 74 68 65 20 53 51 4c 20 74 6f 20 74   to the SQL to t
1820: 68 65 20 74 61 62 6c 65 5f 69 6e 66 6f 20 70 72  he table_info pr
1830: 61 67 6d 61 20 66 6f 72 20 74 68 65 20 74 61 62  agma for the tab
1840: 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20  le currently.   
1850: 20 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62   ** identified b
1860: 79 20 74 68 65 20 72 6f 77 73 20 70 6f 69 6e 74  y the rows point
1870: 65 64 20 74 6f 20 62 79 20 73 74 61 74 65 6d 65  ed to by stateme
1880: 6e 74 73 20 70 43 75 72 2d 3e 70 44 62 4c 69 73  nts pCur->pDbLis
1890: 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 43 75  t and.    ** pCu
18a0: 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2e 0a 20  r->pTableList.. 
18b0: 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d     */.    zSql =
18c0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
18d0: 28 22 50 52 41 47 4d 41 20 25 51 2e 74 61 62 6c  ("PRAGMA %Q.tabl
18e0: 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 0a 20 20  e_info(%Q)", .  
18f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1900: 6c 75 6d 6e 5f 74 65 78 74 28 70 43 75 72 2d 3e  lumn_text(pCur->
1910: 70 44 62 4c 69 73 74 2c 20 31 29 2c 0a 20 20 20  pDbList, 1),.   
1920: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
1930: 75 6d 6e 5f 74 65 78 74 28 70 43 75 72 2d 3e 70  umn_text(pCur->p
1940: 54 61 62 6c 65 4c 69 73 74 2c 20 30 29 0a 20 20  TableList, 0).  
1950: 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 7a    );..    if( !z
1960: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Sql ){.      rc 
1970: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1980: 20 20 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f        goto next_
1990: 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
19a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
19b0: 70 61 72 65 28 70 56 74 61 62 2d 3e 64 62 2c 20  pare(pVtab->db, 
19c0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72 2d  zSql, -1, &pCur-
19d0: 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 2c 20 30 29  >pColumnList, 0)
19e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
19f0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
1a00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a10: 29 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74  ) goto next_exit
1a20: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 72 6f  ;.  }.  pCur->ro
1a30: 77 69 64 2b 2b 3b 0a 0a 6e 65 78 74 5f 65 78 69  wid++;..next_exi
1a40: 74 3a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 48 61  t:.  /* TODO: Ha
1a50: 6e 64 6c 65 20 72 63 20 2a 2f 0a 20 20 72 65 74  ndle rc */.  ret
1a60: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a70: 20 52 65 73 65 74 20 61 20 73 63 68 65 6d 61 20   Reset a schema 
1a80: 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  table cursor..*/
1a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65  .static int sche
1aa0: 6d 61 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69  maFilter(.  sqli
1ab0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
1ac0: 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20  *pVtabCursor, . 
1ad0: 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e   int idxNum, con
1ae0: 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c  st char *idxStr,
1af0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  .  int argc, sql
1b00: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
1b10: 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
1b20: 20 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 70 56   schema_vtab *pV
1b30: 74 61 62 20 3d 20 28 73 63 68 65 6d 61 5f 76 74  tab = (schema_vt
1b40: 61 62 20 2a 29 28 70 56 74 61 62 43 75 72 73 6f  ab *)(pVtabCurso
1b50: 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 73 63 68  r->pVtab);.  sch
1b60: 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ema_cursor *pCur
1b70: 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f   = (schema_curso
1b80: 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b  r *)pVtabCursor;
1b90: 0a 20 20 70 43 75 72 2d 3e 72 6f 77 69 64 20 3d  .  pCur->rowid =
1ba0: 20 30 3b 0a 20 20 66 69 6e 61 6c 69 7a 65 28 26   0;.  finalize(&
1bb0: 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74  pCur->pTableList
1bc0: 29 3b 0a 20 20 66 69 6e 61 6c 69 7a 65 28 26 70  );.  finalize(&p
1bd0: 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74  Cur->pColumnList
1be0: 29 3b 0a 20 20 66 69 6e 61 6c 69 7a 65 28 26 70  );.  finalize(&p
1bf0: 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20  Cur->pDbList);. 
1c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1c10: 65 70 61 72 65 28 70 56 74 61 62 2d 3e 64 62 2c  epare(pVtab->db,
1c20: 22 50 52 41 47 4d 41 20 64 61 74 61 62 61 73 65  "PRAGMA database
1c30: 5f 6c 69 73 74 22 2c 20 2d 31 2c 20 26 70 43 75  _list", -1, &pCu
1c40: 72 2d 3e 70 44 62 4c 69 73 74 2c 20 30 29 3b 0a  r->pDbList, 0);.
1c50: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
1c60: 4c 49 54 45 5f 4f 4b 20 3f 20 73 63 68 65 6d 61  LITE_OK ? schema
1c70: 4e 65 78 74 28 70 56 74 61 62 43 75 72 73 6f 72  Next(pVtabCursor
1c80: 29 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ) : rc);.}../*.*
1c90: 2a 20 41 6e 61 6c 79 73 65 20 74 68 65 20 57 48  * Analyse the WH
1ca0: 45 52 45 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 2a  ERE condition..*
1cb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
1cc0: 65 6d 61 42 65 73 74 49 6e 64 65 78 28 73 71 6c  emaBestIndex(sql
1cd0: 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20  ite3_vtab *tab, 
1ce0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1cf0: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20  fo *pIdxInfo){. 
1d00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 69  K;.}../*.** A vi
1d20: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
1d30: 6c 65 20 74 68 61 74 20 6d 65 72 65 6c 79 20 65  le that merely e
1d40: 63 68 6f 73 20 6d 65 74 68 6f 64 20 63 61 6c 6c  chos method call
1d50: 73 20 69 6e 74 6f 20 54 43 4c 0a 2a 2a 20 76 61  s into TCL.** va
1d60: 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  riables..*/.stat
1d70: 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  ic sqlite3_modul
1d80: 65 20 73 63 68 65 6d 61 4d 6f 64 75 6c 65 20 3d  e schemaModule =
1d90: 20 7b 0a 20 20 30 2c 20 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 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1dc0: 0a 20 20 73 63 68 65 6d 61 43 72 65 61 74 65 2c  .  schemaCreate,
1dd0: 0a 20 20 73 63 68 65 6d 61 43 72 65 61 74 65 2c  .  schemaCreate,
1de0: 0a 20 20 73 63 68 65 6d 61 42 65 73 74 49 6e 64  .  schemaBestInd
1df0: 65 78 2c 0a 20 20 73 63 68 65 6d 61 44 65 73 74  ex,.  schemaDest
1e00: 72 6f 79 2c 0a 20 20 73 63 68 65 6d 61 44 65 73  roy,.  schemaDes
1e10: 74 72 6f 79 2c 0a 20 20 73 63 68 65 6d 61 4f 70  troy,.  schemaOp
1e20: 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1e30: 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
1e40: 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
1e50: 0a 20 20 73 63 68 65 6d 61 43 6c 6f 73 65 2c 20  .  schemaClose, 
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73  /* xClose - clos
1e80: 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
1e90: 73 63 68 65 6d 61 46 69 6c 74 65 72 2c 20 20 20  schemaFilter,   
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb0: 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67  xFilter - config
1ec0: 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61  ure scan constra
1ed0: 69 6e 74 73 20 2a 2f 0a 20 20 73 63 68 65 6d 61  ints */.  schema
1ee0: 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
1ef0: 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
1f00: 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
1f10: 6f 72 20 2a 2f 0a 20 20 73 63 68 65 6d 61 45 6f  or */.  schemaEo
1f20: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1f30: 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a       /* xEof */.
1f40: 20 20 73 63 68 65 6d 61 43 6f 6c 75 6d 6e 2c 20    schemaColumn, 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f60: 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
1f70: 20 64 61 74 61 20 2a 2f 0a 20 20 73 63 68 65 6d   data */.  schem
1f80: 61 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  aRowid,         
1f90: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
1fa0: 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
1fb0: 0a 20 20 30 2c 20 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: 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20  /* xUpdate */.  
1fe0: 30 2c 20 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 2f 2a 20               /* 
2000: 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 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 2f 2a 20 78 53 79 6e           /* xSyn
2030: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a      /* xCommit *
2060: 2f 0a 20 20 30 2c 20 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 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f   /* xRollback */
2090: 0a 20 20 30 2c 20 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: 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a  /* xFindMethod *
20c0: 2f 0a 20 20 30 2c 20 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 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 7d   /* xRename */.}
20f0: 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  ;..#endif /* !de
2100: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2110: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
2120: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
2130: 45 5f 54 45 53 54 0a 0a 2f 2a 0a 2a 2a 20 44 65  E_TEST../*.** De
2140: 63 6f 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74  code a pointer t
2150: 6f 20 61 6e 20 73 71 6c 69 74 65 33 20 6f 62 6a  o an sqlite3 obj
2160: 65 63 74 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69  ect..*/.extern i
2170: 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  nt getDbPointer(
2180: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2190: 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rp, const char *
21a0: 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  zA, sqlite3 **pp
21b0: 44 62 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  Db);../*.** Regi
21c0: 73 74 65 72 20 74 68 65 20 73 63 68 65 6d 61 20  ster the schema 
21d0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
21e0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
21f0: 69 6e 74 20 72 65 67 69 73 74 65 72 5f 73 63 68  int register_sch
2200: 65 6d 61 5f 6d 6f 64 75 6c 65 28 0a 20 20 43 6c  ema_module(.  Cl
2210: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2220: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
2230: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2240: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2250: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2260: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2270: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2280: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
22a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
22b0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
22c0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
22d0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
22e0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
22f0: 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a  3 *db;.  if( obj
2300: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2310: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2320: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2330: 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  B");.    return 
2340: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2350: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2360: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2370: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2380: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
2390: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64  TCL_ERROR;.#ifnd
23a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
23b0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
23c0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
23d0: 75 6c 65 28 64 62 2c 20 22 73 63 68 65 6d 61 22  ule(db, "schema"
23e0: 2c 20 26 73 63 68 65 6d 61 4d 6f 64 75 6c 65 2c  , &schemaModule,
23f0: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65   0);.#endif.  re
2400: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2410: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63  /*.** Register c
2420: 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65  ommands with the
2430: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2440: 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74  ..*/.int Sqlitet
2450: 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54  estschema_Init(T
2460: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2470: 70 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  p){.  static str
2480: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
2490: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
24a0: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
24b0: 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63  oc;.     void *c
24c0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61  lientData;.  } a
24d0: 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
24e0: 20 20 7b 20 22 72 65 67 69 73 74 65 72 5f 73 63    { "register_sc
24f0: 68 65 6d 61 5f 6d 6f 64 75 6c 65 22 2c 20 72 65  hema_module", re
2500: 67 69 73 74 65 72 5f 73 63 68 65 6d 61 5f 6d 6f  gister_schema_mo
2510: 64 75 6c 65 2c 20 30 20 7d 2c 0a 20 20 7d 3b 0a  dule, 0 },.  };.
2520: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2530: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62  =0; i<sizeof(aOb
2540: 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62  jCmd)/sizeof(aOb
2550: 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  jCmd[0]); i++){.
2560: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
2570: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
2580: 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d   aObjCmd[i].zNam
2590: 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a  e, .        aObj
25a0: 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f  Cmd[i].xProc, aO
25b0: 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44  bjCmd[i].clientD
25c0: 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  ata, 0);.  }.  r
25d0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
25e0: 0a 23 65 6c 73 65 0a 0a 2f 2a 0a 2a 2a 20 45 78  .#else../*.** Ex
25f0: 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20 66 75 6e  tension load fun
2600: 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66  ction..*/.#ifdef
2610: 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70   _WIN32.__declsp
2620: 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65  ec(dllexport).#e
2630: 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33  ndif.int sqlite3
2640: 5f 73 63 68 65 6d 61 5f 69 6e 69 74 28 0a 20 20  _schema_init(.  
2650: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
2660: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c  char **pzErrMsg,
2670: 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65   .  const sqlite
2680: 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a  3_api_routines *
2690: 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45  pApi.){.  SQLITE
26a0: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32  _EXTENSION_INIT2
26b0: 28 70 41 70 69 29 3b 0a 23 69 66 6e 64 65 66 20  (pApi);.#ifndef 
26c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
26d0: 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  UALTABLE.  sqlit
26e0: 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
26f0: 28 64 62 2c 20 22 73 63 68 65 6d 61 22 2c 20 26  (db, "schema", &
2700: 73 63 68 65 6d 61 4d 6f 64 75 6c 65 2c 20 30 29  schemaModule, 0)
2710: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
2720: 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a     n 0;.}..#endif.