/ Hex Artifact Content
Login

Artifact 7026296434de0c3c531c0eb65f8990555575a764:


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 2a 0a 2a 2a 20 24 49 64 3a 20  ary..**.** $Id: 
0220: 74 65 73 74 5f 73 63 68 65 6d 61 2e 63 2c 76 20  test_schema.c,v 
0230: 31 2e 34 20 32 30 30 36 2f 30 36 2f 31 37 20 31  1.4 2006/06/17 1
0240: 33 3a 32 31 3a 33 33 20 64 72 68 20 45 78 70 20  3:21:33 drh Exp 
0250: 24 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20 63 6f 64  $.*/../* The cod
0260: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 64  e in this file d
0270: 65 66 69 6e 65 73 20 61 20 73 71 6c 69 74 65 33  efines a sqlite3
0280: 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 6d   virtual-table m
0290: 6f 64 75 6c 65 20 74 68 61 74 0a 2a 2a 20 70 72  odule that.** pr
02a0: 6f 76 69 64 65 73 20 61 20 72 65 61 64 2d 6f 6e  ovides a read-on
02b0: 6c 79 20 76 69 65 77 20 6f 66 20 74 68 65 20 63  ly view of the c
02c0: 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
02d0: 73 63 68 65 6d 61 2e 20 54 68 65 72 65 20 69 73  schema. There is
02e0: 20 6f 6e 65 0a 2a 2a 20 72 6f 77 20 69 6e 20 74   one.** row in t
02f0: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
0300: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
0310: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
0320: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 23 64 65 66 69  schema..*/.#defi
0330: 6e 65 20 53 43 48 45 4d 41 20 5c 0a 22 43 52 45  ne SCHEMA \."CRE
0340: 41 54 45 20 54 41 42 4c 45 20 78 28 22 20 20 20  ATE TABLE x("   
0350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0380: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 64 61           \.  "da
0390: 74 61 62 61 73 65 2c 22 20 20 20 20 20 20 20 20  tabase,"        
03a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
03b0: 61 62 61 73 65 20 28 69 2e 65 2e 20 6d 61 69 6e  abase (i.e. main
03c0: 2c 20 74 65 6d 70 20 65 74 63 2e 29 20 2a 2f 20  , temp etc.) */ 
03d0: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74 61 62          \.  "tab
03e0: 6c 65 6e 61 6d 65 2c 22 20 20 20 20 20 20 20 20  lename,"        
03f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
0400: 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
0410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0420: 20 20 20 20 20 20 20 5c 0a 20 20 22 63 69 64 2c         \.  "cid,
0430: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
0440: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
0450: 20 28 66 72 6f 6d 20 6c 65 66 74 2d 74 6f 2d 72   (from left-to-r
0460: 69 67 68 74 2c 20 30 20 75 70 77 61 72 64 29 20  ight, 0 upward) 
0470: 2a 2f 20 20 20 20 5c 0a 20 20 22 6e 61 6d 65 2c  */    \.  "name,
0480: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  "              /
0490: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 20 5c 0a 20 20 22 74 79 70 65 2c 22       \.  "type,"
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
04e0: 20 53 70 65 63 69 66 69 65 64 20 74 79 70 65 20   Specified type 
04f0: 28 69 2e 65 2e 20 56 41 52 43 48 41 52 28 33 32  (i.e. VARCHAR(32
0500: 29 29 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  )) */           
0510: 20 20 20 20 5c 0a 20 20 22 6e 6f 74 5f 6e 75 6c      \.  "not_nul
0520: 6c 2c 22 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l,"          /* 
0530: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
0540: 20 4e 4f 54 20 4e 55 4c 4c 20 77 61 73 20 73 70   NOT NULL was sp
0550: 65 63 69 66 69 65 64 20 2a 2f 20 20 20 20 20 20  ecified */      
0560: 20 20 20 5c 0a 20 20 22 64 66 6c 74 5f 76 61 6c     \.  "dflt_val
0570: 75 65 2c 22 20 20 20 20 20 20 20 20 2f 2a 20 44  ue,"        /* D
0580: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
0590: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 20   this column */ 
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05b0: 20 20 5c 0a 20 20 22 70 6b 22 20 20 20 20 20 20    \.  "pk"      
05c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
05d0: 75 65 20 69 66 20 74 68 69 73 20 63 6f 6c 75 6d  ue if this colum
05e0: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
05f0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 20   primary key */ 
0600: 20 5c 0a 22 29 22 0a 0a 2f 2a 20 49 66 20 53 51   \.")"../* If SQ
0610: 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66  LITE_TEST is def
0620: 69 6e 65 64 20 74 68 69 73 20 63 6f 64 65 20 69  ined this code i
0630: 73 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 66  s preprocessed f
0640: 6f 72 20 75 73 65 20 61 73 20 70 61 72 74 0a 2a  or use as part.*
0650: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20  * of the sqlite 
0660: 74 65 73 74 20 62 69 6e 61 72 79 20 22 74 65 73  test binary "tes
0670: 74 66 69 78 74 75 72 65 22 2e 20 4f 74 68 65 72  tfixture". Other
0680: 77 69 73 65 20 69 74 20 69 73 20 70 72 65 70 72  wise it is prepr
0690: 6f 63 65 73 73 65 64 0a 2a 2a 20 74 6f 20 62 65  ocessed.** to be
06a0: 20 63 6f 6d 70 69 6c 65 64 20 69 6e 74 6f 20 61   compiled into a
06b0: 6e 20 73 71 6c 69 74 65 20 64 79 6e 61 6d 69 63  n sqlite dynamic
06c0: 20 65 78 74 65 6e 73 69 6f 6e 2e 0a 2a 2f 0a 23   extension..*/.#
06d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
06e0: 54 0a 20 20 23 69 6e 63 6c 75 64 65 20 22 73 71  T.  #include "sq
06f0: 6c 69 74 65 49 6e 74 2e 68 22 0a 20 20 23 69 6e  liteInt.h".  #in
0700: 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 20 20  clude "tcl.h".  
0710: 23 64 65 66 69 6e 65 20 4d 41 4c 4c 4f 43 28 78  #define MALLOC(x
0720: 29 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  ) sqliteMallocRa
0730: 77 28 78 29 20 0a 20 20 23 64 65 66 69 6e 65 20  w(x) .  #define 
0740: 46 52 45 45 28 78 29 20 20 20 73 71 6c 69 74 65  FREE(x)   sqlite
0750: 46 72 65 65 28 78 29 0a 23 65 6c 73 65 0a 20 20  Free(x).#else.  
0760: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0770: 33 65 78 74 2e 68 22 0a 20 20 53 51 4c 49 54 45  3ext.h".  SQLITE
0780: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31  _EXTENSION_INIT1
0790: 0a 20 20 23 64 65 66 69 6e 65 20 4d 41 4c 4c 4f  .  #define MALLO
07a0: 43 28 78 29 20 6d 61 6c 6c 6f 63 28 78 29 20 0a  C(x) malloc(x) .
07b0: 20 20 23 64 65 66 69 6e 65 20 46 52 45 45 28 78    #define FREE(x
07c0: 29 20 20 20 66 72 65 65 28 78 29 0a 23 65 6e 64  )   free(x).#end
07d0: 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  if..#include <st
07e0: 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dlib.h>.#include
07f0: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
0800: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
0810: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0820: 73 63 68 65 6d 61 5f 76 74 61 62 20 73 63 68 65  schema_vtab sche
0830: 6d 61 5f 76 74 61 62 3b 0a 74 79 70 65 64 65 66  ma_vtab;.typedef
0840: 20 73 74 72 75 63 74 20 73 63 68 65 6d 61 5f 63   struct schema_c
0850: 75 72 73 6f 72 20 73 63 68 65 6d 61 5f 63 75 72  ursor schema_cur
0860: 73 6f 72 3b 0a 0a 2f 2a 20 41 20 73 63 68 65 6d  sor;../* A schem
0870: 61 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a  a table object *
0880: 2f 0a 73 74 72 75 63 74 20 73 63 68 65 6d 61 5f  /.struct schema_
0890: 76 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33  vtab {.  sqlite3
08a0: 5f 76 74 61 62 20 62 61 73 65 3b 0a 20 20 73 71  _vtab base;.  sq
08b0: 6c 69 74 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 2f  lite3 *db;.};../
08c0: 2a 20 41 20 73 63 68 65 6d 61 20 74 61 62 6c 65  * A schema table
08d0: 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   cursor object *
08e0: 2f 0a 73 74 72 75 63 74 20 73 63 68 65 6d 61 5f  /.struct schema_
08f0: 63 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  cursor {.  sqlit
0900: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
0910: 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ase;.  sqlite3_s
0920: 74 6d 74 20 2a 70 44 62 4c 69 73 74 3b 0a 20 20  tmt *pDbList;.  
0930: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
0940: 61 62 6c 65 4c 69 73 74 3b 0a 20 20 73 71 6c 69  ableList;.  sqli
0950: 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6c 75 6d  te3_stmt *pColum
0960: 6e 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 6f 77  nList;.  int row
0970: 69 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 61  id;.};../*.** Ta
0980: 62 6c 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  ble destructor f
0990: 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 6d 6f  or the schema mo
09a0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
09b0: 69 6e 74 20 73 63 68 65 6d 61 44 65 73 74 72 6f  int schemaDestro
09c0: 79 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  y(sqlite3_vtab *
09d0: 70 56 74 61 62 29 7b 0a 20 20 46 52 45 45 28 70  pVtab){.  FREE(p
09e0: 56 74 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  Vtab);.  return 
09f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c  0;.}../*.** Tabl
0a00: 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f  e constructor fo
0a10: 72 20 74 68 65 20 73 63 68 65 6d 61 20 6d 6f 64  r the schema mod
0a20: 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ule..*/.static i
0a30: 6e 74 20 73 63 68 65 6d 61 43 72 65 61 74 65 28  nt schemaCreate(
0a40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
0a50: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
0a60: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
0a70: 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
0a80: 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 0a 29  _vtab **ppVtab.)
0a90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
0aa0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 63 68  ITE_NOMEM;.  sch
0ab0: 65 6d 61 5f 76 74 61 62 20 2a 70 56 74 61 62 20  ema_vtab *pVtab 
0ac0: 3d 20 4d 41 4c 4c 4f 43 28 73 69 7a 65 6f 66 28  = MALLOC(sizeof(
0ad0: 73 63 68 65 6d 61 5f 76 74 61 62 29 29 3b 0a 20  schema_vtab));. 
0ae0: 20 69 66 28 20 70 56 74 61 62 20 29 7b 0a 20 20   if( pVtab ){.  
0af0: 20 20 6d 65 6d 73 65 74 28 70 56 74 61 62 2c 20    memset(pVtab, 
0b00: 30 2c 20 73 69 7a 65 6f 66 28 73 63 68 65 6d 61  0, sizeof(schema
0b10: 5f 76 74 61 62 29 29 3b 0a 20 20 20 20 70 56 74  _vtab));.    pVt
0b20: 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ab->db = db;.   
0b30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
0b40: 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 53  clare_vtab(db, S
0b50: 43 48 45 4d 41 29 3b 0a 20 20 7d 0a 20 20 2a 70  CHEMA);.  }.  *p
0b60: 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33  pVtab = (sqlite3
0b70: 5f 76 74 61 62 20 2a 29 70 56 74 61 62 3b 0a 20  _vtab *)pVtab;. 
0b80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
0b90: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
0ba0: 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 73 63  cursor on the sc
0bb0: 68 65 6d 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  hema table..*/.s
0bc0: 74 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61  tatic int schema
0bd0: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  Open(sqlite3_vta
0be0: 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65  b *pVTab, sqlite
0bf0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
0c00: 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74  ppCursor){.  int
0c10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
0c20: 45 4d 3b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72  EM;.  schema_cur
0c30: 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75  sor *pCur;.  pCu
0c40: 72 20 3d 20 4d 41 4c 4c 4f 43 28 73 69 7a 65 6f  r = MALLOC(sizeo
0c50: 66 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 29  f(schema_cursor)
0c60: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b  );.  if( pCur ){
0c70: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72  .    memset(pCur
0c80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 63 68 65  , 0, sizeof(sche
0c90: 6d 61 5f 63 75 72 73 6f 72 29 29 3b 0a 20 20 20  ma_cursor));.   
0ca0: 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 28 73 71   *ppCursor = (sq
0cb0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
0cc0: 72 20 2a 29 70 43 75 72 3b 0a 20 20 20 20 72 63  r *)pCur;.    rc
0cd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
0ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
0cf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
0d00: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 63 75 72  schema table cur
0d10: 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sor..*/.static i
0d20: 6e 74 20 73 63 68 65 6d 61 43 6c 6f 73 65 28 73  nt schemaClose(s
0d30: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
0d40: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 63 68 65  or *cur){.  sche
0d50: 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  ma_cursor *pCur 
0d60: 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  = (schema_cursor
0d70: 20 2a 29 63 75 72 3b 0a 20 20 73 71 6c 69 74 65   *)cur;.  sqlite
0d80: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72 2d  3_finalize(pCur-
0d90: 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c  >pDbList);.  sql
0da0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
0db0: 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 29 3b  ur->pTableList);
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 43 6f 6c 75 6d  ize(pCur->pColum
0de0: 6e 4c 69 73 74 29 3b 0a 20 20 46 52 45 45 28 70  nList);.  FREE(p
0df0: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Cur);.  return S
0e00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
0e10: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 63 6f  ** Retrieve a co
0e20: 6c 75 6d 6e 20 6f 66 20 64 61 74 61 2e 0a 2a 2f  lumn of data..*/
0e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65  .static int sche
0e40: 6d 61 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  maColumn(sqlite3
0e50: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
0e60: 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  r, sqlite3_conte
0e70: 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69 29 7b  xt *ctx, int i){
0e80: 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  .  schema_cursor
0e90: 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61   *pCur = (schema
0ea0: 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  _cursor *)cur;. 
0eb0: 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20   switch( i ){.  
0ec0: 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20    case 0:.      
0ed0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
0ee0: 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65  alue(ctx, sqlite
0ef0: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
0f00: 43 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20 31 29  Cur->pDbList, 1)
0f10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0f20: 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20      case 1:.    
0f30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0f40: 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69  _value(ctx, sqli
0f50: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
0f60: 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73  (pCur->pTableLis
0f70: 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 62 72  t, 0));.      br
0f80: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
0f90: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
0fa0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
0fb0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
0fc0: 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70 43 6f  _value(pCur->pCo
0fd0: 6c 75 6d 6e 4c 69 73 74 2c 20 69 2d 32 29 29 3b  lumnList, i-2));
0fe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0ff0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1000: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
1010: 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72  etrieve the curr
1020: 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74  ent rowid..*/.st
1030: 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 52  atic int schemaR
1040: 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61  owid(sqlite3_vta
1050: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73  b_cursor *cur, s
1060: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
1070: 77 69 64 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63  wid){.  schema_c
1080: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73  ursor *pCur = (s
1090: 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63  chema_cursor *)c
10a0: 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20  ur;.  *pRowid = 
10b0: 70 43 75 72 2d 3e 72 6f 77 69 64 3b 0a 20 20 72  pCur->rowid;.  r
10c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10d0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
10e0: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
10f0: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 29 7b 0a  stmt **ppStmt){.
1100: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1110: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 2a 70 70 53  e3_finalize(*ppS
1120: 74 6d 74 29 3b 0a 20 20 2a 70 70 53 74 6d 74 20  tmt);.  *ppStmt 
1130: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
1150: 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
1160: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a   the next row..*
1170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
1180: 65 6d 61 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  emaNext(sqlite3_
1190: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
11a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
11b0: 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43  chema_cursor *pC
11c0: 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72  ur = (schema_cur
11d0: 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 63 68  sor *)cur;.  sch
11e0: 65 6d 61 5f 76 74 61 62 20 2a 70 56 74 61 62 20  ema_vtab *pVtab 
11f0: 3d 20 28 73 63 68 65 6d 61 5f 76 74 61 62 20 2a  = (schema_vtab *
1200: 29 28 63 75 72 2d 3e 70 56 74 61 62 29 3b 0a 20  )(cur->pVtab);. 
1210: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b   char *zSql = 0;
1220: 0a 0a 20 20 77 68 69 6c 65 28 20 21 70 43 75 72  ..  while( !pCur
1230: 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 20 7c 7c  ->pColumnList ||
1240: 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c   SQLITE_ROW!=sql
1250: 69 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d 3e  ite3_step(pCur->
1260: 70 43 6f 6c 75 6d 6e 4c 69 73 74 29 20 29 7b 0a  pColumnList) ){.
1270: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
1280: 4b 21 3d 28 72 63 20 3d 20 66 69 6e 61 6c 69 7a  K!=(rc = finaliz
1290: 65 28 26 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e  e(&pCur->pColumn
12a0: 4c 69 73 74 29 29 20 29 20 67 6f 74 6f 20 66 61  List)) ) goto fa
12b0: 69 6c 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  il;..    while( 
12c0: 21 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73  !pCur->pTableLis
12d0: 74 20 7c 7c 20 53 51 4c 49 54 45 5f 52 4f 57 21  t || SQLITE_ROW!
12e0: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43  =sqlite3_step(pC
12f0: 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 29 20  ur->pTableList) 
1300: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
1310: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 69  ITE_OK!=(rc = fi
1320: 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70 54  nalize(&pCur->pT
1330: 61 62 6c 65 4c 69 73 74 29 29 20 29 20 67 6f 74  ableList)) ) got
1340: 6f 20 66 61 69 6c 3b 0a 0a 20 20 20 20 20 20 61  o fail;..      a
1350: 73 73 65 72 74 28 70 43 75 72 2d 3e 70 44 62 4c  ssert(pCur->pDbL
1360: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
1370: 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73  e( SQLITE_ROW!=s
1380: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75 72  qlite3_step(pCur
1390: 2d 3e 70 44 62 4c 69 73 74 29 20 29 7b 0a 20 20  ->pDbList) ){.  
13a0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
13b0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 69 6e 61 6c  _OK!=(rc = final
13c0: 69 7a 65 28 26 70 43 75 72 2d 3e 70 44 62 4c 69  ize(&pCur->pDbLi
13d0: 73 74 29 29 20 29 20 67 6f 74 6f 20 66 61 69 6c  st)) ) goto fail
13e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
1400: 20 20 20 2f 2a 20 53 65 74 20 7a 53 71 6c 20 74     /* Set zSql t
1410: 6f 20 74 68 65 20 53 51 4c 20 74 6f 20 70 75 6c  o the SQL to pul
1420: 6c 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 61  l the list of ta
1430: 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  bles from the . 
1440: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d       ** sqlite_m
1450: 61 73 74 65 72 20 28 6f 72 20 73 71 6c 69 74 65  aster (or sqlite
1460: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 74 61  _temp_master) ta
1470: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
1480: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 64 65  ase.      ** ide
1490: 6e 74 66 69 65 64 20 62 79 20 74 68 65 20 72 6f  ntfied by the ro
14a0: 77 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  w pointed to by 
14b0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
14c0: 74 20 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 0a  t pCur->pDbList.
14d0: 20 20 20 20 20 20 2a 2a 20 28 69 74 65 72 61 74        ** (iterat
14e0: 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20 22 50  ing through a "P
14f0: 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c  RAGMA database_l
1500: 69 73 74 3b 22 20 73 74 61 74 65 6d 65 6e 74 29  ist;" statement)
1510: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1520: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
1530: 75 6d 6e 5f 69 6e 74 28 70 43 75 72 2d 3e 70 44  umn_int(pCur->pD
1540: 62 4c 69 73 74 2c 20 30 29 3d 3d 31 20 29 7b 0a  bList, 0)==1 ){.
1550: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
1560: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1570: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
1580: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
1590: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
15a0: 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
15b0: 6c 65 27 22 0a 20 20 20 20 20 20 20 20 29 3b 0a  le'".        );.
15c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
15e0: 74 20 2a 70 44 62 4c 69 73 74 20 3d 20 70 43 75  t *pDbList = pCu
15f0: 72 2d 3e 70 44 62 4c 69 73 74 3b 0a 20 20 20 20  r->pDbList;.    
1600: 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1610: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
1620: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
1630: 6e 61 6d 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c  name FROM %Q.sql
1640: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
1650: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 0a   type='table'",.
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1670: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1680: 28 70 44 62 4c 69 73 74 2c 20 31 29 0a 20 20 20  (pDbList, 1).   
1690: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
16a0: 20 20 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20        if( !zSql 
16b0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
16d0: 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 3b        goto fail;
16e0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1700: 70 61 72 65 28 70 56 74 61 62 2d 3e 64 62 2c 20  pare(pVtab->db, 
1710: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72 2d  zSql, -1, &pCur-
1720: 3e 70 54 61 62 6c 65 4c 69 73 74 2c 20 30 29 3b  >pTableList, 0);
1730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1740: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ree(zSql);.     
1750: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1760: 4f 4b 20 29 20 67 6f 74 6f 20 66 61 69 6c 3b 0a  OK ) goto fail;.
1770: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
1780: 74 20 7a 53 71 6c 20 74 6f 20 74 68 65 20 53 51  t zSql to the SQ
1790: 4c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 5f 69  L to the table_i
17a0: 6e 66 6f 20 70 72 61 67 6d 61 20 66 6f 72 20 74  nfo pragma for t
17b0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
17c0: 6c 79 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69  ly.    ** identi
17d0: 66 69 65 64 20 62 79 20 74 68 65 20 72 6f 77 73  fied by the rows
17e0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 73   pointed to by s
17f0: 74 61 74 65 6d 65 6e 74 73 20 70 43 75 72 2d 3e  tatements pCur->
1800: 70 44 62 4c 69 73 74 20 61 6e 64 0a 20 20 20 20  pDbList and.    
1810: 2a 2a 20 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c  ** pCur->pTableL
1820: 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ist..    */.    
1830: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1840: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
1850: 51 2e 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29  Q.table_info(%Q)
1860: 22 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ", .        sqli
1870: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1880: 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20 31  pCur->pDbList, 1
1890: 29 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ),.        sqlit
18a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
18b0: 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2c  Cur->pTableList,
18c0: 20 30 29 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20   0).    );..    
18d0: 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20  if( !zSql ){.   
18e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18f0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1900: 20 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 20   fail;.    }.   
1910: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1920: 65 70 61 72 65 28 70 56 74 61 62 2d 3e 64 62 2c  epare(pVtab->db,
1930: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72   zSql, -1, &pCur
1940: 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 2c 20 30  ->pColumnList, 0
1950: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1960: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
1970: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1980: 20 29 20 67 6f 74 6f 20 66 61 69 6c 3b 0a 20 20   ) goto fail;.  
1990: 7d 0a 20 20 70 43 75 72 2d 3e 72 6f 77 69 64 2b  }.  pCur->rowid+
19a0: 2b 3b 0a 0a 66 61 69 6c 3a 0a 20 20 2f 2a 20 54  +;..fail:.  /* T
19b0: 4f 44 4f 3a 20 48 61 6e 64 6c 65 20 72 63 20 2a  ODO: Handle rc *
19c0: 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  /.  return 1;.}.
19d0: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73  ./*.** Reset a s
19e0: 63 68 65 6d 61 20 74 61 62 6c 65 20 63 75 72 73  chema table curs
19f0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
1a00: 74 20 73 63 68 65 6d 61 46 69 6c 74 65 72 28 0a  t schemaFilter(.
1a10: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
1a20: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
1a30: 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75  or, .  int idxNu
1a40: 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
1a50: 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
1a60: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1a70: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1a80: 20 72 63 3b 0a 20 20 73 63 68 65 6d 61 5f 76 74   rc;.  schema_vt
1a90: 61 62 20 2a 70 56 74 61 62 20 3d 20 28 73 63 68  ab *pVtab = (sch
1aa0: 65 6d 61 5f 76 74 61 62 20 2a 29 28 70 56 74 61  ema_vtab *)(pVta
1ab0: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b  bCursor->pVtab);
1ac0: 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  .  schema_cursor
1ad0: 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61   *pCur = (schema
1ae0: 5f 63 75 72 73 6f 72 20 2a 29 70 56 74 61 62 43  _cursor *)pVtabC
1af0: 75 72 73 6f 72 3b 0a 20 20 70 43 75 72 2d 3e 72  ursor;.  pCur->r
1b00: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 66 69 6e 61  owid = 0;.  fina
1b10: 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70 54 61 62  lize(&pCur->pTab
1b20: 6c 65 4c 69 73 74 29 3b 0a 20 20 66 69 6e 61 6c  leList);.  final
1b30: 69 7a 65 28 26 70 43 75 72 2d 3e 70 43 6f 6c 75  ize(&pCur->pColu
1b40: 6d 6e 4c 69 73 74 29 3b 0a 20 20 66 69 6e 61 6c  mnList);.  final
1b50: 69 7a 65 28 26 70 43 75 72 2d 3e 70 44 62 4c 69  ize(&pCur->pDbLi
1b60: 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  st);.  rc = sqli
1b70: 74 65 33 5f 70 72 65 70 61 72 65 28 70 56 74 61  te3_prepare(pVta
1b80: 62 2d 3e 64 62 2c 22 50 52 41 47 4d 41 20 64 61  b->db,"PRAGMA da
1b90: 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 20 2d 31  tabase_list", -1
1ba0: 2c 20 26 70 43 75 72 2d 3e 70 44 62 4c 69 73 74  , &pCur->pDbList
1bb0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  , 0);.  return (
1bc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
1bd0: 73 63 68 65 6d 61 4e 65 78 74 28 70 56 74 61 62  schemaNext(pVtab
1be0: 43 75 72 73 6f 72 29 20 3a 20 72 63 29 3b 0a 7d  Cursor) : rc);.}
1bf0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 73 65 20  ../*.** Analyse 
1c00: 74 68 65 20 57 48 45 52 45 20 63 6f 6e 64 69 74  the WHERE condit
1c10: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1c20: 6e 74 20 73 63 68 65 6d 61 42 65 73 74 49 6e 64  nt schemaBestInd
1c30: 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ex(sqlite3_vtab 
1c40: 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *tab, sqlite3_in
1c50: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
1c60: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  fo){.  return SQ
1c70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c80: 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
1c90: 65 20 6d 6f 64 75 6c 65 20 74 68 61 74 20 6d 65  e module that me
1ca0: 72 65 6c 79 20 65 63 68 6f 73 20 6d 65 74 68 6f  rely echos metho
1cb0: 64 20 63 61 6c 6c 73 20 69 6e 74 6f 20 54 43 4c  d calls into TCL
1cc0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  .** variables..*
1cd0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
1ce0: 5f 6d 6f 64 75 6c 65 20 73 63 68 65 6d 61 4d 6f  _module schemaMo
1cf0: 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20  dule = {.  0,   
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
1d20: 69 6f 6e 20 2a 2f 0a 20 20 22 73 63 68 65 6d 61  ion */.  "schema
1d30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1d40: 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
1d50: 2f 0a 20 20 73 63 68 65 6d 61 43 72 65 61 74 65  /.  schemaCreate
1d60: 2c 0a 20 20 73 63 68 65 6d 61 43 72 65 61 74 65  ,.  schemaCreate
1d70: 2c 0a 20 20 73 63 68 65 6d 61 42 65 73 74 49 6e  ,.  schemaBestIn
1d80: 64 65 78 2c 0a 20 20 73 63 68 65 6d 61 44 65 73  dex,.  schemaDes
1d90: 74 72 6f 79 2c 0a 20 20 73 63 68 65 6d 61 44 65  troy,.  schemaDe
1da0: 73 74 72 6f 79 2c 0a 20 20 73 63 68 65 6d 61 4f  stroy,.  schemaO
1db0: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
1dc0: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
1dd0: 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
1de0: 2f 0a 20 20 73 63 68 65 6d 61 43 6c 6f 73 65 2c  /.  schemaClose,
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
1e10: 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
1e20: 20 73 63 68 65 6d 61 46 69 6c 74 65 72 2c 20 20   schemaFilter,  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e40: 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
1e50: 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
1e60: 61 69 6e 74 73 20 2a 2f 0a 20 20 73 63 68 65 6d  aints */.  schem
1e70: 61 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  aNext,          
1e80: 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
1e90: 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
1ea0: 73 6f 72 20 2a 2f 0a 20 20 73 63 68 65 6d 61 43  sor */.  schemaC
1eb0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
1ec0: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e        /* xColumn
1ed0: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
1ee0: 20 20 73 63 68 65 6d 61 52 6f 77 69 64 2c 20 20    schemaRowid,  
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f00: 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20  * xRowid - read 
1f10: 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 0a 23 69 66  data */.};...#if
1f20: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1f30: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
1f40: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1f50: 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f  lite3 object..*/
1f60: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 44  .static int getD
1f70: 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74  bPointer(Tcl_Int
1f80: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e  erp *interp, con
1f90: 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 73 71 6c  st char *zA, sql
1fa0: 69 74 65 33 20 2a 2a 70 70 44 62 29 7b 0a 20 20  ite3 **ppDb){.  
1fb0: 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74 65 33  *ppDb = (sqlite3
1fc0: 2a 29 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50  *)sqlite3TextToP
1fd0: 74 72 28 7a 41 29 3b 0a 20 20 72 65 74 75 72 6e  tr(zA);.  return
1fe0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1ff0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 73  * Register the s
2000: 63 68 65 6d 61 20 76 69 72 74 75 61 6c 20 74 61  chema virtual ta
2010: 62 6c 65 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73  ble module..*/.s
2020: 74 61 74 69 63 20 69 6e 74 20 72 65 67 69 73 74  tatic int regist
2030: 65 72 5f 73 63 68 65 6d 61 5f 6d 6f 64 75 6c 65  er_schema_module
2040: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2050: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
2060: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
2070: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2080: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2090: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
20a0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
20b0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
20c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
20d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
20e0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
20f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2100: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2110: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2120: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2130: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2140: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2150: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2160: 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
2170: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2180: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2190: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
21a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
21b0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
21c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21e0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
21f0: 45 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  E.  sqlite3_crea
2200: 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73  te_module(db, "s
2210: 63 68 65 6d 61 22 2c 20 26 73 63 68 65 6d 61 4d  chema", &schemaM
2220: 6f 64 75 6c 65 2c 20 30 29 3b 0a 23 65 6e 64 69  odule, 0);.#endi
2230: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
2240: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
2250: 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ster commands wi
2260: 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
2270: 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53  preter..*/.int S
2280: 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f  qlitetestschema_
2290: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
22a0: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74 61 74  *interp){.  stat
22b0: 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
22c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
22d0: 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f     Tcl_ObjCmdPro
22e0: 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20 76  c *xProc;.     v
22f0: 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b  oid *clientData;
2300: 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d  .  } aObjCmd[] =
2310: 20 7b 0a 20 20 20 20 20 7b 20 22 72 65 67 69 73   {.     { "regis
2320: 74 65 72 5f 73 63 68 65 6d 61 5f 6d 6f 64 75 6c  ter_schema_modul
2330: 65 22 2c 20 72 65 67 69 73 74 65 72 5f 73 63 68  e", register_sch
2340: 65 6d 61 5f 6d 6f 64 75 6c 65 2c 20 30 20 7d 2c  ema_module, 0 },
2350: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
2360: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2370: 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65  of(aObjCmd)/size
2380: 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20  of(aObjCmd[0]); 
2390: 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
23a0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
23b0: 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69  nterp, aObjCmd[i
23c0: 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
23d0: 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72    aObjCmd[i].xPr
23e0: 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63  oc, aObjCmd[i].c
23f0: 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20  lientData, 0);. 
2400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
2410: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 0a 2f 2a  OK;.}..#else../*
2420: 0a 2a 2a 20 45 78 74 65 6e 73 69 6f 6e 20 6c 6f  .** Extension lo
2430: 61 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ad function..*/.
2440: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
2450: 6e 73 69 6f 6e 5f 69 6e 69 74 28 0a 20 20 73 71  nsion_init(.  sq
2460: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68  lite3 *db, .  ch
2470: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a  ar **pzErrMsg, .
2480: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
2490: 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41  api_routines *pA
24a0: 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45 5f 45  pi.){.  SQLITE_E
24b0: 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70  XTENSION_INIT2(p
24c0: 41 70 69 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Api);.  sqlite3_
24d0: 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62  create_module(db
24e0: 2c 20 22 73 63 68 65 6d 61 22 2c 20 26 73 63 68  , "schema", &sch
24f0: 65 6d 61 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20  emaModule, 0);. 
2500: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65   return 0;.}..#e
2510: 6e 64 69 66 0a                                   ndif.