/ Hex Artifact Content
Login

Artifact f575932cb6274d12147a77e13ea4b49d52408513:


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 23 20 20 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 23 20  "sqliteInt.h".# 
06c0: 20 69 66 20 64 65 66 69 6e 65 64 28 49 4e 43 4c   if defined(INCL
06d0: 55 44 45 5f 53 51 4c 49 54 45 5f 54 43 4c 5f 48  UDE_SQLITE_TCL_H
06e0: 29 0a 23 20 20 20 20 69 6e 63 6c 75 64 65 20 22  ).#    include "
06f0: 73 71 6c 69 74 65 5f 74 63 6c 2e 68 22 0a 23 20  sqlite_tcl.h".# 
0700: 20 65 6c 73 65 0a 23 20 20 20 20 69 6e 63 6c 75   else.#    inclu
0710: 64 65 20 22 74 63 6c 2e 68 22 0a 23 20 20 65 6e  de "tcl.h".#  en
0720: 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 6e 63  dif.#else.#  inc
0730: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 65 78 74  lude "sqlite3ext
0740: 2e 68 22 0a 20 20 53 51 4c 49 54 45 5f 45 58 54  .h".  SQLITE_EXT
0750: 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 65 6e  ENSION_INIT1.#en
0760: 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73  dif..#include <s
0770: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
0780: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0790: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
07a0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
07b0: 20 73 63 68 65 6d 61 5f 76 74 61 62 20 73 63 68   schema_vtab sch
07c0: 65 6d 61 5f 76 74 61 62 3b 0a 74 79 70 65 64 65  ema_vtab;.typede
07d0: 66 20 73 74 72 75 63 74 20 73 63 68 65 6d 61 5f  f struct schema_
07e0: 63 75 72 73 6f 72 20 73 63 68 65 6d 61 5f 63 75  cursor schema_cu
07f0: 72 73 6f 72 3b 0a 0a 2f 2a 20 41 20 73 63 68 65  rsor;../* A sche
0800: 6d 61 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  ma table object 
0810: 2a 2f 0a 73 74 72 75 63 74 20 73 63 68 65 6d 61  */.struct schema
0820: 5f 76 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65  _vtab {.  sqlite
0830: 33 5f 76 74 61 62 20 62 61 73 65 3b 0a 20 20 73  3_vtab base;.  s
0840: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a  qlite3 *db;.};..
0850: 2f 2a 20 41 20 73 63 68 65 6d 61 20 74 61 62 6c  /* A schema tabl
0860: 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  e cursor object 
0870: 2a 2f 0a 73 74 72 75 63 74 20 73 63 68 65 6d 61  */.struct schema
0880: 5f 63 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69  _cursor {.  sqli
0890: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
08a0: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  base;.  sqlite3_
08b0: 73 74 6d 74 20 2a 70 44 62 4c 69 73 74 3b 0a 20  stmt *pDbList;. 
08c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
08d0: 54 61 62 6c 65 4c 69 73 74 3b 0a 20 20 73 71 6c  TableList;.  sql
08e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6c 75  ite3_stmt *pColu
08f0: 6d 6e 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 6f  mnList;.  int ro
0900: 77 69 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e  wid;.};../*.** N
0910: 6f 6e 65 20 6f 66 20 74 68 69 73 20 77 6f 72 6b  one of this work
0920: 73 20 75 6e 6c 65 73 73 20 77 65 20 68 61 76 65  s unless we have
0930: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
0940: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0950: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
0960: 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c  ABLE../*.** Tabl
0970: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
0980: 20 74 68 65 20 73 63 68 65 6d 61 20 6d 6f 64 75   the schema modu
0990: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
09a0: 74 20 73 63 68 65 6d 61 44 65 73 74 72 6f 79 28  t schemaDestroy(
09b0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
09c0: 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tab){.  sqlite3_
09d0: 66 72 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72  free(pVtab);.  r
09e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
09f0: 2a 20 54 61 62 6c 65 20 63 6f 6e 73 74 72 75 63  * Table construc
0a00: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 63 68 65  tor for the sche
0a10: 6d 61 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  ma module..*/.st
0a20: 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 43  atic int schemaC
0a30: 72 65 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  reate(.  sqlite3
0a40: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41   *db,.  void *pA
0a50: 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  ux,.  int argc, 
0a60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
0a70: 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65  t*argv,.  sqlite
0a80: 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c  3_vtab **ppVtab,
0a90: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
0aa0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
0ab0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 63  LITE_NOMEM;.  sc
0ac0: 68 65 6d 61 5f 76 74 61 62 20 2a 70 56 74 61 62  hema_vtab *pVtab
0ad0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
0ae0: 63 28 73 69 7a 65 6f 66 28 73 63 68 65 6d 61 5f  c(sizeof(schema_
0af0: 76 74 61 62 29 29 3b 0a 20 20 69 66 28 20 70 56  vtab));.  if( pV
0b00: 74 61 62 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  tab ){.    memse
0b10: 74 28 70 56 74 61 62 2c 20 30 2c 20 73 69 7a 65  t(pVtab, 0, size
0b20: 6f 66 28 73 63 68 65 6d 61 5f 76 74 61 62 29 29  of(schema_vtab))
0b30: 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 64 62 20  ;.    pVtab->db 
0b40: 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  = db;.#ifndef SQ
0b50: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
0b60: 4c 54 41 42 4c 45 0a 20 20 20 20 72 63 20 3d 20  LTABLE.    rc = 
0b70: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
0b80: 76 74 61 62 28 64 62 2c 20 53 43 48 45 4d 41 29  vtab(db, SCHEMA)
0b90: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2a  ;.#endif.  }.  *
0ba0: 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVtab = (sqlite
0bb0: 33 5f 76 74 61 62 20 2a 29 70 56 74 61 62 3b 0a  3_vtab *)pVtab;.
0bc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
0bd0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
0be0: 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 73   cursor on the s
0bf0: 63 68 65 6d 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  chema table..*/.
0c00: 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d  static int schem
0c10: 61 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74  aOpen(sqlite3_vt
0c20: 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74  ab *pVTab, sqlit
0c30: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
0c40: 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e  *ppCursor){.  in
0c50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
0c60: 4d 45 4d 3b 0a 20 20 73 63 68 65 6d 61 5f 63 75  MEM;.  schema_cu
0c70: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43  rsor *pCur;.  pC
0c80: 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ur = sqlite3_mal
0c90: 6c 6f 63 28 73 69 7a 65 6f 66 28 73 63 68 65 6d  loc(sizeof(schem
0ca0: 61 5f 63 75 72 73 6f 72 29 29 3b 0a 20 20 69 66  a_cursor));.  if
0cb0: 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 6d 65  ( pCur ){.    me
0cc0: 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69  mset(pCur, 0, si
0cd0: 7a 65 6f 66 28 73 63 68 65 6d 61 5f 63 75 72 73  zeof(schema_curs
0ce0: 6f 72 29 29 3b 0a 20 20 20 20 2a 70 70 43 75 72  or));.    *ppCur
0cf0: 73 6f 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  sor = (sqlite3_v
0d00: 74 61 62 5f 63 75 72 73 6f 72 20 2a 29 70 43 75  tab_cursor *)pCu
0d10: 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  r;.    rc = SQLI
0d20: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
0d30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
0d40: 20 43 6c 6f 73 65 20 61 20 73 63 68 65 6d 61 20   Close a schema 
0d50: 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  table cursor..*/
0d60: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65  .static int sche
0d70: 6d 61 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  maClose(sqlite3_
0d80: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
0d90: 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73  ){.  schema_curs
0da0: 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65  or *pCur = (sche
0db0: 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b  ma_cursor *)cur;
0dc0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
0dd0: 69 7a 65 28 70 43 75 72 2d 3e 70 44 62 4c 69 73  ize(pCur->pDbLis
0de0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  t);.  sqlite3_fi
0df0: 6e 61 6c 69 7a 65 28 70 43 75 72 2d 3e 70 54 61  nalize(pCur->pTa
0e00: 62 6c 65 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  bleList);.  sqli
0e10: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75  te3_finalize(pCu
0e20: 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 29 3b  r->pColumnList);
0e30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
0e40: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
0e50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
0e60: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 63  .** Retrieve a c
0e70: 6f 6c 75 6d 6e 20 6f 66 20 64 61 74 61 2e 0a 2a  olumn of data..*
0e80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
0e90: 65 6d 61 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  emaColumn(sqlite
0ea0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
0eb0: 75 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ur, sqlite3_cont
0ec0: 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69 29  ext *ctx, int i)
0ed0: 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f  {.  schema_curso
0ee0: 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d  r *pCur = (schem
0ef0: 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  a_cursor *)cur;.
0f00: 20 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20    switch( i ){. 
0f10: 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20     case 0:.     
0f20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0f30: 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74  value(ctx, sqlit
0f40: 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
0f50: 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20 31  pCur->pDbList, 1
0f60: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
0f70: 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20  .    case 1:.   
0f80: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
0f90: 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c  t_value(ctx, sql
0fa0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
0fb0: 65 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69  e(pCur->pTableLi
0fc0: 73 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 62  st, 0));.      b
0fd0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
0fe0: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
0ff0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
1000: 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  x, sqlite3_colum
1010: 6e 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70 43  n_value(pCur->pC
1020: 6f 6c 75 6d 6e 4c 69 73 74 2c 20 69 2d 32 29 29  olumnList, i-2))
1030: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1050: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1060: 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72  Retrieve the cur
1070: 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73  rent rowid..*/.s
1080: 74 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61  tatic int schema
1090: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74  Rowid(sqlite3_vt
10a0: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20  ab_cursor *cur, 
10b0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
10c0: 6f 77 69 64 29 7b 0a 20 20 73 63 68 65 6d 61 5f  owid){.  schema_
10d0: 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
10e0: 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29  schema_cursor *)
10f0: 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d  cur;.  *pRowid =
1100: 20 70 43 75 72 2d 3e 72 6f 77 69 64 3b 0a 20 20   pCur->rowid;.  
1110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1120: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1130: 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  finalize(sqlite3
1140: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 29 7b  _stmt **ppStmt){
1150: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
1160: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 2a 70 70  te3_finalize(*pp
1170: 53 74 6d 74 29 3b 0a 20 20 2a 70 70 53 74 6d 74  Stmt);.  *ppStmt
1180: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1190: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
11a0: 20 73 63 68 65 6d 61 45 6f 66 28 73 71 6c 69 74   schemaEof(sqlit
11b0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
11c0: 63 75 72 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63  cur){.  schema_c
11d0: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73  ursor *pCur = (s
11e0: 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63  chema_cursor *)c
11f0: 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43  ur;.  return (pC
1200: 75 72 2d 3e 70 44 62 4c 69 73 74 20 3f 20 30 20  ur->pDbList ? 0 
1210: 3a 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  : 1);.}../*.** A
1220: 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
1230: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  r to the next ro
1240: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
1250: 20 73 63 68 65 6d 61 4e 65 78 74 28 73 71 6c 69   schemaNext(sqli
1260: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
1270: 2a 63 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  *cur){.  int rc 
1280: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
1290: 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43  chema_cursor *pC
12a0: 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72  ur = (schema_cur
12b0: 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 63 68  sor *)cur;.  sch
12c0: 65 6d 61 5f 76 74 61 62 20 2a 70 56 74 61 62 20  ema_vtab *pVtab 
12d0: 3d 20 28 73 63 68 65 6d 61 5f 76 74 61 62 20 2a  = (schema_vtab *
12e0: 29 28 63 75 72 2d 3e 70 56 74 61 62 29 3b 0a 20  )(cur->pVtab);. 
12f0: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b   char *zSql = 0;
1300: 0a 0a 20 20 77 68 69 6c 65 28 20 21 70 43 75 72  ..  while( !pCur
1310: 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 20 7c 7c  ->pColumnList ||
1320: 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c   SQLITE_ROW!=sql
1330: 69 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d 3e  ite3_step(pCur->
1340: 70 43 6f 6c 75 6d 6e 4c 69 73 74 29 20 29 7b 0a  pColumnList) ){.
1350: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
1360: 4b 21 3d 28 72 63 20 3d 20 66 69 6e 61 6c 69 7a  K!=(rc = finaliz
1370: 65 28 26 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e  e(&pCur->pColumn
1380: 4c 69 73 74 29 29 20 29 20 67 6f 74 6f 20 6e 65  List)) ) goto ne
1390: 78 74 5f 65 78 69 74 3b 0a 0a 20 20 20 20 77 68  xt_exit;..    wh
13a0: 69 6c 65 28 20 21 70 43 75 72 2d 3e 70 54 61 62  ile( !pCur->pTab
13b0: 6c 65 4c 69 73 74 20 7c 7c 20 53 51 4c 49 54 45  leList || SQLITE
13c0: 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW!=sqlite3_st
13d0: 65 70 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c  ep(pCur->pTableL
13e0: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ist) ){.      if
13f0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
1400: 20 3d 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75   = finalize(&pCu
1410: 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 29 29 20  r->pTableList)) 
1420: 29 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74  ) goto next_exit
1430: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
1440: 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a  pCur->pDbList);.
1450: 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c        while( SQL
1460: 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33  ITE_ROW!=sqlite3
1470: 5f 73 74 65 70 28 70 43 75 72 2d 3e 70 44 62 4c  _step(pCur->pDbL
1480: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
1490: 72 63 20 3d 20 66 69 6e 61 6c 69 7a 65 28 26 70  rc = finalize(&p
14a0: 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20  Cur->pDbList);. 
14b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6e 65 78 74         goto next
14c0: 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  _exit;.      }..
14d0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 7a 53 71        /* Set zSq
14e0: 6c 20 74 6f 20 74 68 65 20 53 51 4c 20 74 6f 20  l to the SQL to 
14f0: 70 75 6c 6c 20 74 68 65 20 6c 69 73 74 20 6f 66  pull the list of
1500: 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
1510: 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74   .      ** sqlit
1520: 65 5f 6d 61 73 74 65 72 20 28 6f 72 20 73 71 6c  e_master (or sql
1530: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29  ite_temp_master)
1540: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
1550: 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1560: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
1570: 65 20 72 6f 77 20 70 6f 69 6e 74 65 64 20 74 6f  e row pointed to
1580: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
1590: 65 6d 65 6e 74 20 70 43 75 72 2d 3e 70 44 62 4c  ement pCur->pDbL
15a0: 69 73 74 0a 20 20 20 20 20 20 2a 2a 20 28 69 74  ist.      ** (it
15b0: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
15c0: 61 20 22 50 52 41 47 4d 41 20 64 61 74 61 62 61  a "PRAGMA databa
15d0: 73 65 5f 6c 69 73 74 3b 22 20 73 74 61 74 65 6d  se_list;" statem
15e0: 65 6e 74 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ent)..      */. 
15f0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1600: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 75 72  _column_int(pCur
1610: 2d 3e 70 44 62 4c 69 73 74 2c 20 30 29 3d 3d 31  ->pDbList, 0)==1
1620: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   ){.        zSql
1630: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1640: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
1650: 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
1660: 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  M sqlite_temp_ma
1670: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d  ster WHERE type=
1680: 27 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20  'table'".       
1690: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
16a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16b0: 5f 73 74 6d 74 20 2a 70 44 62 4c 69 73 74 20 3d  _stmt *pDbList =
16c0: 20 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 3b 0a   pCur->pDbList;.
16d0: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
16e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
1700: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25 51  ECT name FROM %Q
1710: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57  .sqlite_master W
1720: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
1730: 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '",.            
1740: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1750: 74 65 78 74 28 70 44 62 4c 69 73 74 2c 20 31 29  text(pDbList, 1)
1760: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1770: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a    }.      if( !z
1780: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Sql ){.        r
1790: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17a0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6e  ;.        goto n
17b0: 65 78 74 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ext_exit;.      
17c0: 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  }..      rc = sq
17d0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 56  lite3_prepare(pV
17e0: 74 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  tab->db, zSql, -
17f0: 31 2c 20 26 70 43 75 72 2d 3e 70 54 61 62 6c 65  1, &pCur->pTable
1800: 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  List, 0);.      
1810: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1820: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
1830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1840: 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a 20 20  to next_exit;.  
1850: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
1860: 7a 53 71 6c 20 74 6f 20 74 68 65 20 53 51 4c 20  zSql to the SQL 
1870: 74 6f 20 74 68 65 20 74 61 62 6c 65 5f 69 6e 66  to the table_inf
1880: 6f 20 70 72 61 67 6d 61 20 66 6f 72 20 74 68 65  o pragma for the
1890: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
18a0: 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 66 69  .    ** identifi
18b0: 65 64 20 62 79 20 74 68 65 20 72 6f 77 73 20 70  ed by the rows p
18c0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 73 74 61  ointed to by sta
18d0: 74 65 6d 65 6e 74 73 20 70 43 75 72 2d 3e 70 44  tements pCur->pD
18e0: 62 4c 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a  bList and.    **
18f0: 20 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73   pCur->pTableLis
1900: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53  t..    */.    zS
1910: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1920: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25 51 2e  intf("PRAGMA %Q.
1930: 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c  table_info(%Q)",
1940: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
1950: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43  3_column_text(pC
1960: 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20 31 29 2c  ur->pDbList, 1),
1970: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1980: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 75  _column_text(pCu
1990: 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2c 20 30  r->pTableList, 0
19a0: 29 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66  ).    );..    if
19b0: 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  ( !zSql ){.     
19c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
19d0: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e  EM;.      goto n
19e0: 65 78 74 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ext_exit;.    }.
19f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a00: 5f 70 72 65 70 61 72 65 28 70 56 74 61 62 2d 3e  _prepare(pVtab->
1a10: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
1a20: 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74  Cur->pColumnList
1a30: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1a40: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
1a50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a60: 5f 4f 4b 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f  _OK ) goto next_
1a70: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  exit;.  }.  pCur
1a80: 2d 3e 72 6f 77 69 64 2b 2b 3b 0a 0a 6e 65 78 74  ->rowid++;..next
1a90: 5f 65 78 69 74 3a 0a 20 20 2f 2a 20 54 4f 44 4f  _exit:.  /* TODO
1aa0: 3a 20 48 61 6e 64 6c 65 20 72 63 20 2a 2f 0a 20  : Handle rc */. 
1ab0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ac0: 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73 63 68  *.** Reset a sch
1ad0: 65 6d 61 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ema table cursor
1ae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1af0: 73 63 68 65 6d 61 46 69 6c 74 65 72 28 0a 20 20  schemaFilter(.  
1b00: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
1b10: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
1b20: 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c  , .  int idxNum,
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78   const char *idx
1b40: 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Str,.  int argc,
1b50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1b60: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1b70: 63 3b 0a 20 20 73 63 68 65 6d 61 5f 76 74 61 62  c;.  schema_vtab
1b80: 20 2a 70 56 74 61 62 20 3d 20 28 73 63 68 65 6d   *pVtab = (schem
1b90: 61 5f 76 74 61 62 20 2a 29 28 70 56 74 61 62 43  a_vtab *)(pVtabC
1ba0: 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
1bb0: 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a   schema_cursor *
1bc0: 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63  pCur = (schema_c
1bd0: 75 72 73 6f 72 20 2a 29 70 56 74 61 62 43 75 72  ursor *)pVtabCur
1be0: 73 6f 72 3b 0a 20 20 70 43 75 72 2d 3e 72 6f 77  sor;.  pCur->row
1bf0: 69 64 20 3d 20 30 3b 0a 20 20 66 69 6e 61 6c 69  id = 0;.  finali
1c00: 7a 65 28 26 70 43 75 72 2d 3e 70 54 61 62 6c 65  ze(&pCur->pTable
1c10: 4c 69 73 74 29 3b 0a 20 20 66 69 6e 61 6c 69 7a  List);.  finaliz
1c20: 65 28 26 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e  e(&pCur->pColumn
1c30: 4c 69 73 74 29 3b 0a 20 20 66 69 6e 61 6c 69 7a  List);.  finaliz
1c40: 65 28 26 70 43 75 72 2d 3e 70 44 62 4c 69 73 74  e(&pCur->pDbList
1c50: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c60: 33 5f 70 72 65 70 61 72 65 28 70 56 74 61 62 2d  3_prepare(pVtab-
1c70: 3e 64 62 2c 22 50 52 41 47 4d 41 20 64 61 74 61  >db,"PRAGMA data
1c80: 62 61 73 65 5f 6c 69 73 74 22 2c 20 2d 31 2c 20  base_list", -1, 
1c90: 26 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20  &pCur->pDbList, 
1ca0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63  0);.  return (rc
1cb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 73 63  ==SQLITE_OK ? sc
1cc0: 68 65 6d 61 4e 65 78 74 28 70 56 74 61 62 43 75  hemaNext(pVtabCu
1cd0: 72 73 6f 72 29 20 3a 20 72 63 29 3b 0a 7d 0a 0a  rsor) : rc);.}..
1ce0: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 73 65 20 74 68  /*.** Analyse th
1cf0: 65 20 57 48 45 52 45 20 63 6f 6e 64 69 74 69 6f  e WHERE conditio
1d00: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1d10: 20 73 63 68 65 6d 61 42 65 73 74 49 6e 64 65 78   schemaBestIndex
1d20: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74  (sqlite3_vtab *t
1d30: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
1d40: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
1d50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
1d60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1d70: 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
1d80: 6d 6f 64 75 6c 65 20 74 68 61 74 20 6d 65 72 65  module that mere
1d90: 6c 79 20 65 63 68 6f 73 20 6d 65 74 68 6f 64 20  ly echos method 
1da0: 63 61 6c 6c 73 20 69 6e 74 6f 20 54 43 4c 0a 2a  calls into TCL.*
1db0: 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a  * variables..*/.
1dc0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d  static sqlite3_m
1dd0: 6f 64 75 6c 65 20 73 63 68 65 6d 61 4d 6f 64 75  odule schemaModu
1de0: 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1e10: 6e 20 2a 2f 0a 20 20 73 63 68 65 6d 61 43 72 65  n */.  schemaCre
1e20: 61 74 65 2c 0a 20 20 73 63 68 65 6d 61 43 72 65  ate,.  schemaCre
1e30: 61 74 65 2c 0a 20 20 73 63 68 65 6d 61 42 65 73  ate,.  schemaBes
1e40: 74 49 6e 64 65 78 2c 0a 20 20 73 63 68 65 6d 61  tIndex,.  schema
1e50: 44 65 73 74 72 6f 79 2c 0a 20 20 73 63 68 65 6d  Destroy,.  schem
1e60: 61 44 65 73 74 72 6f 79 2c 0a 20 20 73 63 68 65  aDestroy,.  sche
1e70: 6d 61 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  maOpen,         
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
1e90: 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f  n - open a curso
1ea0: 72 20 2a 2f 0a 20 20 73 63 68 65 6d 61 43 6c 6f  r */.  schemaClo
1eb0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1ec0: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20      /* xClose - 
1ed0: 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a  close a cursor *
1ee0: 2f 0a 20 20 73 63 68 65 6d 61 46 69 6c 74 65 72  /.  schemaFilter
1ef0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f00: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
1f10: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
1f20: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 73 63  straints */.  sc
1f30: 68 65 6d 61 4e 65 78 74 2c 20 20 20 20 20 20 20  hemaNext,       
1f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
1f50: 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
1f60: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 63 68 65  cursor */.  sche
1f70: 6d 61 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  maEof,          
1f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66           /* xEof
1f90: 20 2a 2f 0a 20 20 73 63 68 65 6d 61 43 6f 6c 75   */.  schemaColu
1fa0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mn,             
1fb0: 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20     /* xColumn - 
1fc0: 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 73  read data */.  s
1fd0: 63 68 65 6d 61 52 6f 77 69 64 2c 20 20 20 20 20  chemaRowid,     
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ff0: 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74  Rowid - read dat
2000: 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a      /* xUpdate *
2030: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20   /* xBegin */.  
2060: 30 2c 20 20 20 20 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 2f 2a 20               /* 
2080: 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  xSync */.  0,   
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
20b0: 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  it */.  0,      
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
20e0: 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  k */.  0,       
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68      /* xFindMeth
2110: 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  od */.  0,      
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
2140: 2a 2f 0a 7d 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  */.};..#endif /*
2150: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2160: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2170: 4c 45 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  LE) */..#ifdef S
2180: 51 4c 49 54 45 5f 54 45 53 54 0a 0a 2f 2a 0a 2a  QLITE_TEST../*.*
2190: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
21a0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
21b0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 65 78 74 65   object..*/.exte
21c0: 72 6e 20 69 6e 74 20 67 65 74 44 62 50 6f 69 6e  rn int getDbPoin
21d0: 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ter(Tcl_Interp *
21e0: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
21f0: 61 72 20 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20  ar *zA, sqlite3 
2200: 2a 2a 70 70 44 62 29 3b 0a 0a 2f 2a 0a 2a 2a 20  **ppDb);../*.** 
2210: 52 65 67 69 73 74 65 72 20 74 68 65 20 73 63 68  Register the sch
2220: 65 6d 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ema virtual tabl
2230: 65 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  e module..*/.sta
2240: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2250: 43 4c 41 50 49 20 72 65 67 69 73 74 65 72 5f 73  CLAPI register_s
2260: 63 68 65 6d 61 5f 6d 6f 64 75 6c 65 28 0a 20 20  chema_module(.  
2270: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2280: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
2290: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
22a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
22b0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
22c0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
22d0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
22e0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2300: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2310: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2320: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2330: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2340: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
2350: 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f  te3 *db;.  if( o
2360: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2370: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2380: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2390: 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
23a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23b0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
23c0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
23d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
23e0: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
23f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 69 66  n TCL_ERROR;.#if
2400: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2410: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2420: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
2430: 6f 64 75 6c 65 28 64 62 2c 20 22 73 63 68 65 6d  odule(db, "schem
2440: 61 22 2c 20 26 73 63 68 65 6d 61 4d 6f 64 75 6c  a", &schemaModul
2450: 65 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e, 0);.#endif.  
2460: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2470: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
2480: 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74   commands with t
2490: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
24a0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74  er..*/.int Sqlit
24b0: 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74  etestschema_Init
24c0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
24d0: 65 72 70 29 7b 0a 20 20 73 74 61 74 69 63 20 73  erp){.  static s
24e0: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
24f0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
2500: 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78  cl_ObjCmdProc *x
2510: 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20  Proc;.     void 
2520: 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d  *clientData;.  }
2530: 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20   aObjCmd[] = {. 
2540: 20 20 20 20 7b 20 22 72 65 67 69 73 74 65 72 5f      { "register_
2550: 73 63 68 65 6d 61 5f 6d 6f 64 75 6c 65 22 2c 20  schema_module", 
2560: 72 65 67 69 73 74 65 72 5f 73 63 68 65 6d 61 5f  register_schema_
2570: 6d 6f 64 75 6c 65 2c 20 30 20 7d 2c 0a 20 20 7d  module, 0 },.  }
2580: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
2590: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
25a0: 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  ObjCmd)/sizeof(a
25b0: 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  ObjCmd[0]); i++)
25c0: 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
25d0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
25e0: 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e  p, aObjCmd[i].zN
25f0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f  ame, .        aO
2600: 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20  bjCmd[i].xProc, 
2610: 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e  aObjCmd[i].clien
2620: 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20  tData, 0);.  }. 
2630: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2640: 7d 0a 0a 23 65 6c 73 65 0a 0a 2f 2a 0a 2a 2a 20  }..#else../*.** 
2650: 45 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20 66  Extension load f
2660: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64  unction..*/.#ifd
2670: 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c  ef _WIN32.__decl
2680: 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a  spec(dllexport).
2690: 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74  #endif.int sqlit
26a0: 65 33 5f 73 63 68 65 6d 61 5f 69 6e 69 74 28 0a  e3_schema_init(.
26b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
26c0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
26d0: 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
26e0: 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
26f0: 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49   *pApi.){.  SQLI
2700: 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
2710: 54 32 28 70 41 70 69 29 3b 0a 23 69 66 6e 64 65  T2(pApi);.#ifnde
2720: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2730: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
2740: 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
2750: 6c 65 28 64 62 2c 20 22 73 63 68 65 6d 61 22 2c  le(db, "schema",
2760: 20 26 73 63 68 65 6d 61 4d 6f 64 75 6c 65 2c 20   &schemaModule, 
2770: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  0);.#endif.  ret
2780: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66  urn 0;.}..#endif
2790: 0a                                               .