/ Hex Artifact Content
Login

Artifact 02f182f156e8e431a9508184df5638b370850495:


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 38 20 32 30 30 36 2f 30 36 2f 32 36 20 31  1.8 2006/06/26 1
0240: 39 3a 31 30 3a 33 32 20 64 72 68 20 45 78 70 20  9:10:32 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 23 69 66  ab->db = db;.#if
0b30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0b40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
0b50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
0b60: 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20  eclare_vtab(db, 
0b70: 53 43 48 45 4d 41 29 3b 0a 23 65 6e 64 69 66 0a  SCHEMA);.#endif.
0b80: 20 20 7d 0a 20 20 2a 70 70 56 74 61 62 20 3d 20    }.  *ppVtab = 
0b90: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29  (sqlite3_vtab *)
0ba0: 70 56 74 61 62 3b 0a 20 20 72 65 74 75 72 6e 20  pVtab;.  return 
0bb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
0bc0: 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 6f  n a new cursor o
0bd0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62  n the schema tab
0be0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
0bf0: 74 20 73 63 68 65 6d 61 4f 70 65 6e 28 73 71 6c  t schemaOpen(sql
0c00: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
0c10: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
0c20: 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
0c30: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
0c40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 63  LITE_NOMEM;.  sc
0c50: 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75  hema_cursor *pCu
0c60: 72 3b 0a 20 20 70 43 75 72 20 3d 20 4d 41 4c 4c  r;.  pCur = MALL
0c70: 4f 43 28 73 69 7a 65 6f 66 28 73 63 68 65 6d 61  OC(sizeof(schema
0c80: 5f 63 75 72 73 6f 72 29 29 3b 0a 20 20 69 66 28  _cursor));.  if(
0c90: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 6d 65 6d   pCur ){.    mem
0ca0: 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69 7a  set(pCur, 0, siz
0cb0: 65 6f 66 28 73 63 68 65 6d 61 5f 63 75 72 73 6f  eof(schema_curso
0cc0: 72 29 29 3b 0a 20 20 20 20 2a 70 70 43 75 72 73  r));.    *ppCurs
0cd0: 6f 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74  or = (sqlite3_vt
0ce0: 61 62 5f 63 75 72 73 6f 72 20 2a 29 70 43 75 72  ab_cursor *)pCur
0cf0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
0d00: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
0d10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
0d20: 43 6c 6f 73 65 20 61 20 73 63 68 65 6d 61 20 74  Close a schema t
0d30: 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  able cursor..*/.
0d40: 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d  static int schem
0d50: 61 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  aClose(sqlite3_v
0d60: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
0d70: 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f  {.  schema_curso
0d80: 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d  r *pCur = (schem
0d90: 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  a_cursor *)cur;.
0da0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
0db0: 7a 65 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74  ze(pCur->pDbList
0dc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
0dd0: 61 6c 69 7a 65 28 70 43 75 72 2d 3e 70 54 61 62  alize(pCur->pTab
0de0: 6c 65 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  leList);.  sqlit
0df0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72  e3_finalize(pCur
0e00: 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 29 3b 0a  ->pColumnList);.
0e10: 20 20 46 52 45 45 28 70 43 75 72 29 3b 0a 20 20    FREE(pCur);.  
0e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
0e40: 65 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20  eve a column of 
0e50: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
0e60: 69 6e 74 20 73 63 68 65 6d 61 43 6f 6c 75 6d 6e  int schemaColumn
0e70: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
0e80: 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74  rsor *cur, sqlit
0e90: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
0ea0: 20 69 6e 74 20 69 29 7b 0a 20 20 73 63 68 65 6d   int i){.  schem
0eb0: 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  a_cursor *pCur =
0ec0: 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20   (schema_cursor 
0ed0: 2a 29 63 75 72 3b 0a 20 20 73 77 69 74 63 68 28  *)cur;.  switch(
0ee0: 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30   i ){.    case 0
0ef0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
0f00: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
0f10: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
0f20: 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70 44 62  _value(pCur->pDb
0f30: 4c 69 73 74 2c 20 31 29 29 3b 0a 20 20 20 20 20  List, 1));.     
0f40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0f50: 20 31 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1:.      sqlite
0f60: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
0f70: 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  tx, sqlite3_colu
0f80: 6d 6e 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70  mn_value(pCur->p
0f90: 54 61 62 6c 65 4c 69 73 74 2c 20 30 29 29 3b 0a  TableList, 0));.
0fa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0fb0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
0fc0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
0fd0: 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65  alue(ctx, sqlite
0fe0: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
0ff0: 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74  Cur->pColumnList
1000: 2c 20 69 2d 32 29 29 3b 0a 20 20 20 20 20 20 62  , i-2));.      b
1010: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1020: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1030: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
1040: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69  the current rowi
1050: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1060: 20 73 63 68 65 6d 61 52 6f 77 69 64 28 73 71 6c   schemaRowid(sql
1070: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
1080: 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e   *cur, sqlite_in
1090: 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20  t64 *pRowid){.  
10a0: 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70  schema_cursor *p
10b0: 43 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75  Cur = (schema_cu
10c0: 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 2a 70  rsor *)cur;.  *p
10d0: 52 6f 77 69 64 20 3d 20 70 43 75 72 2d 3e 72 6f  Rowid = pCur->ro
10e0: 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  wid;.  return SQ
10f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
1100: 69 63 20 69 6e 74 20 66 69 6e 61 6c 69 7a 65 28  ic int finalize(
1110: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
1120: 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63  pStmt){.  int rc
1130: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
1140: 69 7a 65 28 2a 70 70 53 74 6d 74 29 3b 0a 20 20  ize(*ppStmt);.  
1150: 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 72  *ppStmt = 0;.  r
1160: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
1170: 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 45 6f  tic int schemaEo
1180: 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  f(sqlite3_vtab_c
1190: 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73  ursor *cur){.  s
11a0: 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43  chema_cursor *pC
11b0: 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72  ur = (schema_cur
11c0: 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 72 65 74  sor *)cur;.  ret
11d0: 75 72 6e 20 28 70 43 75 72 2d 3e 70 44 62 4c 69  urn (pCur->pDbLi
11e0: 73 74 20 3f 20 30 20 3a 20 31 29 3b 0a 7d 0a 0a  st ? 0 : 1);.}..
11f0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
1200: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1210: 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  next row..*/.sta
1220: 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 4e 65  tic int schemaNe
1230: 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  xt(sqlite3_vtab_
1240: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
1250: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1260: 4f 4b 3b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72  OK;.  schema_cur
1270: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68  sor *pCur = (sch
1280: 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72  ema_cursor *)cur
1290: 3b 0a 20 20 73 63 68 65 6d 61 5f 76 74 61 62 20  ;.  schema_vtab 
12a0: 2a 70 56 74 61 62 20 3d 20 28 73 63 68 65 6d 61  *pVtab = (schema
12b0: 5f 76 74 61 62 20 2a 29 28 63 75 72 2d 3e 70 56  _vtab *)(cur->pV
12c0: 74 61 62 29 3b 0a 20 20 63 68 61 72 20 2a 7a 53  tab);.  char *zS
12d0: 71 6c 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ql = 0;..  while
12e0: 28 20 21 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e  ( !pCur->pColumn
12f0: 4c 69 73 74 20 7c 7c 20 53 51 4c 49 54 45 5f 52  List || SQLITE_R
1300: 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW!=sqlite3_step
1310: 28 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69  (pCur->pColumnLi
1320: 73 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 53  st) ){.    if( S
1330: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
1340: 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e  finalize(&pCur->
1350: 70 43 6f 6c 75 6d 6e 4c 69 73 74 29 29 20 29 20  pColumnList)) ) 
1360: 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a  goto next_exit;.
1370: 0a 20 20 20 20 77 68 69 6c 65 28 20 21 70 43 75  .    while( !pCu
1380: 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 20 7c 7c  r->pTableList ||
1390: 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c   SQLITE_ROW!=sql
13a0: 69 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d 3e  ite3_step(pCur->
13b0: 70 54 61 62 6c 65 4c 69 73 74 29 20 29 7b 0a 20  pTableList) ){. 
13c0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
13d0: 4f 4b 21 3d 28 72 63 20 3d 20 66 69 6e 61 6c 69  OK!=(rc = finali
13e0: 7a 65 28 26 70 43 75 72 2d 3e 70 54 61 62 6c 65  ze(&pCur->pTable
13f0: 4c 69 73 74 29 29 20 29 20 67 6f 74 6f 20 6e 65  List)) ) goto ne
1400: 78 74 5f 65 78 69 74 3b 0a 0a 20 20 20 20 20 20  xt_exit;..      
1410: 61 73 73 65 72 74 28 70 43 75 72 2d 3e 70 44 62  assert(pCur->pDb
1420: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
1430: 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d  le( SQLITE_ROW!=
1440: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75  sqlite3_step(pCu
1450: 72 2d 3e 70 44 62 4c 69 73 74 29 20 29 7b 0a 20  r->pDbList) ){. 
1460: 20 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 61         rc = fina
1470: 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70 44 62 4c  lize(&pCur->pDbL
1480: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ist);.        go
1490: 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a 20 20  to next_exit;.  
14a0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
14b0: 53 65 74 20 7a 53 71 6c 20 74 6f 20 74 68 65 20  Set zSql to the 
14c0: 53 51 4c 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  SQL to pull the 
14d0: 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 66  list of tables f
14e0: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  rom the .      *
14f0: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
1500: 28 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  (or sqlite_temp_
1510: 6d 61 73 74 65 72 29 20 74 61 62 6c 65 20 6f 66  master) table of
1520: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1530: 20 20 20 20 2a 2a 20 69 64 65 6e 74 66 69 65 64      ** identfied
1540: 20 62 79 20 74 68 65 20 72 6f 77 20 70 6f 69 6e   by the row poin
1550: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 53 51  ted to by the SQ
1560: 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 43 75 72  L statement pCur
1570: 2d 3e 70 44 62 4c 69 73 74 0a 20 20 20 20 20 20  ->pDbList.      
1580: 2a 2a 20 28 69 74 65 72 61 74 69 6e 67 20 74 68  ** (iterating th
1590: 72 6f 75 67 68 20 61 20 22 50 52 41 47 4d 41 20  rough a "PRAGMA 
15a0: 64 61 74 61 62 61 73 65 5f 6c 69 73 74 3b 22 20  database_list;" 
15b0: 73 74 61 74 65 6d 65 6e 74 29 2e 0a 20 20 20 20  statement)..    
15c0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
15d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
15e0: 74 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 2c  t(pCur->pDbList,
15f0: 20 30 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20   0)==1 ){.      
1600: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1610: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
1620: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
1630: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  me FROM sqlite_t
1640: 65 6d 70 5f 6d 61 73 74 65 72 20 57 48 45 52 45  emp_master WHERE
1650: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 0a 20   type='table'". 
1660: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1670: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1680: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 62  qlite3_stmt *pDb
1690: 4c 69 73 74 20 3d 20 70 43 75 72 2d 3e 70 44 62  List = pCur->pDb
16a0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 7a 53  List;.        zS
16b0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
16c0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
16d0: 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46    "SELECT name F
16e0: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 6d 61  ROM %Q.sqlite_ma
16f0: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d  ster WHERE type=
1700: 27 74 61 62 6c 65 27 22 2c 0a 20 20 20 20 20 20  'table'",.      
1710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1720: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 44 62 4c 69  olumn_text(pDbLi
1730: 73 74 2c 20 31 29 0a 20 20 20 20 20 20 20 20 29  st, 1).        )
1740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1750: 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20  if( !zSql ){.   
1760: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1770: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1780: 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a  goto next_exit;.
1790: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
17a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
17b0: 61 72 65 28 70 56 74 61 62 2d 3e 64 62 2c 20 7a  are(pVtab->db, z
17c0: 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72 2d 3e  Sql, -1, &pCur->
17d0: 70 54 61 62 6c 65 4c 69 73 74 2c 20 30 29 3b 0a  pTableList, 0);.
17e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
17f0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ee(zSql);.      
1800: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1810: 4b 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78  K ) goto next_ex
1820: 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  it;.    }..    /
1830: 2a 20 53 65 74 20 7a 53 71 6c 20 74 6f 20 74 68  * Set zSql to th
1840: 65 20 53 51 4c 20 74 6f 20 74 68 65 20 74 61 62  e SQL to the tab
1850: 6c 65 5f 69 6e 66 6f 20 70 72 61 67 6d 61 20 66  le_info pragma f
1860: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  or the table cur
1870: 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 69 64  rently.    ** id
1880: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
1890: 72 6f 77 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  rows pointed to 
18a0: 62 79 20 73 74 61 74 65 6d 65 6e 74 73 20 70 43  by statements pC
18b0: 75 72 2d 3e 70 44 62 4c 69 73 74 20 61 6e 64 0a  ur->pDbList and.
18c0: 20 20 20 20 2a 2a 20 70 43 75 72 2d 3e 70 54 61      ** pCur->pTa
18d0: 62 6c 65 4c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a  bleList..    */.
18e0: 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
18f0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
1900: 4d 41 20 25 51 2e 74 61 62 6c 65 5f 69 6e 66 6f  MA %Q.table_info
1910: 28 25 51 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%Q)", .        
1920: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1930: 65 78 74 28 70 43 75 72 2d 3e 70 44 62 4c 69 73  ext(pCur->pDbLis
1940: 74 2c 20 31 29 2c 0a 20 20 20 20 20 20 20 20 73  t, 1),.        s
1950: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1960: 78 74 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c  xt(pCur->pTableL
1970: 69 73 74 2c 20 30 29 0a 20 20 20 20 29 3b 0a 0a  ist, 0).    );..
1980: 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b      if( !zSql ){
1990: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
19b0: 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a  goto next_exit;.
19c0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
19d0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
19e0: 56 74 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  Vtab->db, zSql, 
19f0: 2d 31 2c 20 26 70 43 75 72 2d 3e 70 43 6f 6c 75  -1, &pCur->pColu
1a00: 6d 6e 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  mnList, 0);.    
1a10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1a20: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
1a30: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a40: 20 6e 65 78 74 5f 65 78 69 74 3b 0a 20 20 7d 0a   next_exit;.  }.
1a50: 20 20 70 43 75 72 2d 3e 72 6f 77 69 64 2b 2b 3b    pCur->rowid++;
1a60: 0a 0a 6e 65 78 74 5f 65 78 69 74 3a 0a 20 20 2f  ..next_exit:.  /
1a70: 2a 20 54 4f 44 4f 3a 20 48 61 6e 64 6c 65 20 72  * TODO: Handle r
1a80: 63 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  c */.  return rc
1a90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
1aa0: 20 61 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20   a schema table 
1ab0: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  cursor..*/.stati
1ac0: 63 20 69 6e 74 20 73 63 68 65 6d 61 46 69 6c 74  c int schemaFilt
1ad0: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  er(.  sqlite3_vt
1ae0: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
1af0: 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69  Cursor, .  int i
1b00: 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61  dxNum, const cha
1b10: 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74  r *idxStr,.  int
1b20: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
1b30: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
1b40: 20 69 6e 74 20 72 63 3b 0a 20 20 73 63 68 65 6d   int rc;.  schem
1b50: 61 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  a_vtab *pVtab = 
1b60: 28 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 29 28  (schema_vtab *)(
1b70: 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
1b80: 61 62 29 3b 0a 20 20 73 63 68 65 6d 61 5f 63 75  ab);.  schema_cu
1b90: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63  rsor *pCur = (sc
1ba0: 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 70 56  hema_cursor *)pV
1bb0: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 70 43 75  tabCursor;.  pCu
1bc0: 72 2d 3e 72 6f 77 69 64 20 3d 20 30 3b 0a 20 20  r->rowid = 0;.  
1bd0: 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e  finalize(&pCur->
1be0: 70 54 61 62 6c 65 4c 69 73 74 29 3b 0a 20 20 66  pTableList);.  f
1bf0: 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70  inalize(&pCur->p
1c00: 43 6f 6c 75 6d 6e 4c 69 73 74 29 3b 0a 20 20 66  ColumnList);.  f
1c10: 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70  inalize(&pCur->p
1c20: 44 62 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20  DbList);.  rc = 
1c30: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
1c40: 70 56 74 61 62 2d 3e 64 62 2c 22 50 52 41 47 4d  pVtab->db,"PRAGM
1c50: 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22  A database_list"
1c60: 2c 20 2d 31 2c 20 26 70 43 75 72 2d 3e 70 44 62  , -1, &pCur->pDb
1c70: 4c 69 73 74 2c 20 30 29 3b 0a 20 20 72 65 74 75  List, 0);.  retu
1c80: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
1c90: 4b 20 3f 20 73 63 68 65 6d 61 4e 65 78 74 28 70  K ? schemaNext(p
1ca0: 56 74 61 62 43 75 72 73 6f 72 29 20 3a 20 72 63  VtabCursor) : rc
1cb0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  );.}../*.** Anal
1cc0: 79 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6f  yse the WHERE co
1cd0: 6e 64 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ndition..*/.stat
1ce0: 69 63 20 69 6e 74 20 73 63 68 65 6d 61 42 65 73  ic int schemaBes
1cf0: 74 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76  tIndex(sqlite3_v
1d00: 74 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65  tab *tab, sqlite
1d10: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
1d20: 64 78 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  dxInfo){.  retur
1d30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d40: 2f 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20  /*.** A virtual 
1d50: 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68 61  table module tha
1d60: 74 20 6d 65 72 65 6c 79 20 65 63 68 6f 73 20 6d  t merely echos m
1d70: 65 74 68 6f 64 20 63 61 6c 6c 73 20 69 6e 74 6f  ethod calls into
1d80: 20 54 43 4c 0a 2a 2a 20 76 61 72 69 61 62 6c 65   TCL.** variable
1d90: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  s..*/.static sql
1da0: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 73 63 68 65  ite3_module sche
1db0: 6d 61 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30  maModule = {.  0
1dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1de0: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 63 68  Version */.  sch
1df0: 65 6d 61 43 72 65 61 74 65 2c 0a 20 20 73 63 68  emaCreate,.  sch
1e00: 65 6d 61 43 72 65 61 74 65 2c 0a 20 20 73 63 68  emaCreate,.  sch
1e10: 65 6d 61 42 65 73 74 49 6e 64 65 78 2c 0a 20 20  emaBestIndex,.  
1e20: 73 63 68 65 6d 61 44 65 73 74 72 6f 79 2c 0a 20  schemaDestroy,. 
1e30: 20 73 63 68 65 6d 61 44 65 73 74 72 6f 79 2c 0a   schemaDestroy,.
1e40: 20 20 73 63 68 65 6d 61 4f 70 65 6e 2c 20 20 20    schemaOpen,   
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e60: 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
1e70: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 63 68   cursor */.  sch
1e80: 65 6d 61 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  emaClose,       
1e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1ea0: 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75  ose - close a cu
1eb0: 72 73 6f 72 20 2a 2f 0a 20 20 73 63 68 65 6d 61  rsor */.  schema
1ec0: 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
1ed0: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
1ee0: 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
1ef0: 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
1f00: 2f 0a 20 20 73 63 68 65 6d 61 4e 65 78 74 2c 20  /.  schemaNext, 
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
1f30: 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
1f40: 20 20 73 63 68 65 6d 61 45 6f 66 2c 20 20 20 20    schemaEof,    
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f60: 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 73 63 68 65  * xEof */.  sche
1f70: 6d 61 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  maColumn,       
1f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
1f90: 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
1fa0: 2a 2f 0a 20 20 73 63 68 65 6d 61 52 6f 77 69 64  */.  schemaRowid
1fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fc0: 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
1fd0: 61 64 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 0a  ad data */.};...
1fe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1ff0: 53 54 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  ST../*.** Decode
2000: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2010: 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e   sqlite3 object.
2020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
2030: 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
2040: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
2060: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29 7b  sqlite3 **ppDb){
2070: 0a 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69  .  *ppDb = (sqli
2080: 74 65 33 2a 29 73 71 6c 69 74 65 33 54 65 78 74  te3*)sqlite3Text
2090: 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65 74  ToPtr(zA);.  ret
20a0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20b0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
20c0: 65 20 73 63 68 65 6d 61 20 76 69 72 74 75 61 6c  e schema virtual
20d0: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 0a 2a   table module..*
20e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67  /.static int reg
20f0: 69 73 74 65 72 5f 73 63 68 65 6d 61 5f 6d 6f 64  ister_schema_mod
2100: 75 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ule(.  ClientDat
2110: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2120: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
2130: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2140: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2150: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2160: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2170: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2180: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2190: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
21b0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
21c0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
21d0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
21e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
21f0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2200: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2210: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2220: 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
2230: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2240: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2250: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2260: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2270: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2280: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2290: 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  OR;.#ifndef SQLI
22a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
22b0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 5f 63  ABLE.  sqlite3_c
22c0: 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c  reate_module(db,
22d0: 20 22 73 63 68 65 6d 61 22 2c 20 26 73 63 68 65   "schema", &sche
22e0: 6d 61 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 23 65  maModule, 0);.#e
22f0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
2300: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
2310: 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
2320: 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
2330: 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
2340: 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65  t Sqlitetestsche
2350: 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ma_Init(Tcl_Inte
2360: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73  rp *interp){.  s
2370: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
2380: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2390: 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64  .     Tcl_ObjCmd
23a0: 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20  Proc *xProc;.   
23b0: 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
23c0: 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b  ta;.  } aObjCmd[
23d0: 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 72 65  ] = {.     { "re
23e0: 67 69 73 74 65 72 5f 73 63 68 65 6d 61 5f 6d 6f  gister_schema_mo
23f0: 64 75 6c 65 22 2c 20 72 65 67 69 73 74 65 72 5f  dule", register_
2400: 73 63 68 65 6d 61 5f 6d 6f 64 75 6c 65 2c 20 30  schema_module, 0
2410: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
2420: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
2430: 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73  izeof(aObjCmd)/s
2440: 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d  izeof(aObjCmd[0]
2450: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ); i++){.    Tcl
2460: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
2470: 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d  d(interp, aObjCm
2480: 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20  d[i].zName, .   
2490: 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e       aObjCmd[i].
24a0: 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69  xProc, aObjCmd[i
24b0: 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29  ].clientData, 0)
24c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
24d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  CL_OK;.}..#else.
24e0: 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 73 69 6f 6e  ./*.** Extension
24f0: 20 6c 6f 61 64 20 66 75 6e 63 74 69 6f 6e 2e 0a   load function..
2500: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
2510: 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 28 0a 20  xtension_init(. 
2520: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
2530: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
2540: 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  , .  const sqlit
2550: 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20  e3_api_routines 
2560: 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54  *pApi.){.  SQLIT
2570: 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
2580: 32 28 70 41 70 69 29 3b 0a 23 69 66 6e 64 65 66  2(pApi);.#ifndef
2590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
25a0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
25b0: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
25c0: 65 28 64 62 2c 20 22 73 63 68 65 6d 61 22 2c 20  e(db, "schema", 
25d0: 26 73 63 68 65 6d 61 4d 6f 64 75 6c 65 2c 20 30  &schemaModule, 0
25e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
25f0: 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a  rn 0;.}..#endif.