/ Hex Artifact Content
Login

Artifact 889fde757c78b11538c7e448c392198a1ccc8be3:


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 32 20 32 30 30 36 2f 30 36 2f 31 35 20 31  1.2 2006/06/15 1
0240: 36 3a 32 36 3a 34 35 20 64 61 6e 69 65 6c 6b 31  6:26:45 danielk1
0250: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 0a 2f 2a  977 Exp $.*/../*
0260: 20 54 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69   The code in thi
0270: 73 20 66 69 6c 65 20 64 65 66 69 6e 65 73 20 61  s file defines a
0280: 20 73 71 6c 69 74 65 33 20 6d 6f 64 75 6c 65 20   sqlite3 module 
0290: 74 68 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a  that provides.**
02a0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 76 69 65   a read-only vie
02b0: 77 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  w of the current
02c0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
02d0: 2e 20 54 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a  . There is one.*
02e0: 2a 20 72 6f 77 20 69 6e 20 74 68 65 20 73 63 68  * row in the sch
02f0: 65 6d 61 20 74 61 62 6c 65 20 66 6f 72 20 65 61  ema table for ea
0300: 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ch column in the
0310: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 64   database..*/.#d
0320: 65 66 69 6e 65 20 53 43 48 45 4d 41 20 5c 0a 22  efine SCHEMA \."
0330: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 22  CREATE TABLE x("
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20              \.  
0380: 22 64 61 74 61 62 61 73 65 2c 22 20 20 20 20 20  "database,"     
0390: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
03a0: 64 61 74 61 62 61 73 65 20 28 69 2e 65 2e 20 6d  database (i.e. m
03b0: 61 69 6e 2c 20 74 65 6d 70 20 65 74 63 2e 29 20  ain, temp etc.) 
03c0: 2a 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22  */         \.  "
03d0: 74 61 62 6c 65 6e 61 6d 65 2c 22 20 20 20 20 20  tablename,"     
03e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
03f0: 61 62 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20  able */         
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 63            \.  "c
0420: 69 64 2c 22 20 20 20 20 20 20 20 20 20 20 20 20  id,"            
0430: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
0440: 62 65 72 20 28 66 72 6f 6d 20 6c 65 66 74 2d 74  ber (from left-t
0450: 6f 2d 72 69 67 68 74 2c 20 30 20 75 70 77 61 72  o-right, 0 upwar
0460: 64 29 20 2a 2f 20 20 20 20 5c 0a 20 20 22 6e 61  d) */    \.  "na
0470: 6d 65 2c 22 20 20 20 20 20 20 20 20 20 20 20 20  me,"            
0480: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
0490: 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
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 5c 0a 20 20 22 74 79 70          \.  "typ
04c0: 65 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  e,"             
04d0: 20 2f 2a 20 53 70 65 63 69 66 69 65 64 20 74 79   /* Specified ty
04e0: 70 65 20 28 69 2e 65 2e 20 56 41 52 43 48 41 52  pe (i.e. VARCHAR
04f0: 28 33 32 29 29 20 2a 2f 20 20 20 20 20 20 20 20  (32)) */        
0500: 20 20 20 20 20 20 20 5c 0a 20 20 22 6e 6f 74 5f         \.  "not_
0510: 6e 75 6c 6c 2c 22 20 20 20 20 20 20 20 20 20 20  null,"          
0520: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
0530: 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 77 61 73   if NOT NULL was
0540: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 20 20 20   specified */   
0550: 20 20 20 20 20 20 5c 0a 20 20 22 64 66 6c 74 5f        \.  "dflt_
0560: 76 61 6c 75 65 2c 22 20 20 20 20 20 20 20 20 2f  value,"        /
0570: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
0580: 66 6f 72 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  for this column 
0590: 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
05a0: 20 20 20 20 20 5c 0a 20 20 22 70 6b 22 20 20 20       \.  "pk"   
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
05c0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63 6f   True if this co
05d0: 6c 75 6d 6e 20 69 73 20 70 61 72 74 20 6f 66 20  lumn is part of 
05e0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
05f0: 2a 2f 20 20 5c 0a 22 29 22 0a 0a 2f 2a 20 49 66  */  \.")"../* If
0600: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
0610: 64 65 66 69 6e 65 64 20 74 68 69 73 20 63 6f 64  defined this cod
0620: 65 20 69 73 20 70 72 65 70 72 6f 63 65 73 73 65  e is preprocesse
0630: 64 20 66 6f 72 20 75 73 65 20 61 73 20 70 61 72  d for use as par
0640: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69  t.** of the sqli
0650: 74 65 20 74 65 73 74 20 62 69 6e 61 72 79 20 22  te test binary "
0660: 74 65 73 74 66 69 78 74 75 72 65 22 2e 20 4f 74  testfixture". Ot
0670: 68 65 72 77 69 73 65 20 69 74 20 69 73 20 70 72  herwise it is pr
0680: 65 70 72 6f 63 65 73 73 65 64 0a 2a 2a 20 74 6f  eprocessed.** to
0690: 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 69 6e 74   be compiled int
06a0: 6f 20 61 6e 20 73 71 6c 69 74 65 20 64 79 6e 61  o an sqlite dyna
06b0: 6d 69 63 20 65 78 74 65 6e 73 69 6f 6e 2e 0a 2a  mic extension..*
06c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
06d0: 54 45 53 54 0a 20 20 23 69 6e 63 6c 75 64 65 20  TEST.  #include 
06e0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 20 20  "sqliteInt.h".  
06f0: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22  #include "tcl.h"
0700: 0a 20 20 23 64 65 66 69 6e 65 20 4d 41 4c 4c 4f  .  #define MALLO
0710: 43 28 78 29 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  C(x) sqliteMallo
0720: 63 52 61 77 28 78 29 20 0a 20 20 23 64 65 66 69  cRaw(x) .  #defi
0730: 6e 65 20 46 52 45 45 28 78 29 20 20 20 73 71 6c  ne FREE(x)   sql
0740: 69 74 65 46 72 65 65 28 78 29 0a 23 65 6c 73 65  iteFree(x).#else
0750: 0a 20 20 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  .  #include "sql
0760: 69 74 65 33 65 78 74 2e 68 22 0a 20 20 53 51 4c  ite3ext.h".  SQL
0770: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
0780: 49 54 31 0a 20 20 23 64 65 66 69 6e 65 20 4d 41  IT1.  #define MA
0790: 4c 4c 4f 43 28 78 29 20 6d 61 6c 6c 6f 63 28 78  LLOC(x) malloc(x
07a0: 29 20 0a 20 20 23 64 65 66 69 6e 65 20 46 52 45  ) .  #define FRE
07b0: 45 28 78 29 20 20 20 66 72 65 65 28 78 29 0a 23  E(x)   free(x).#
07c0: 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20  endif..#include 
07d0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
07e0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
07f0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0800: 68 3e 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  h>..typedef stru
0810: 63 74 20 73 63 68 65 6d 61 5f 76 74 61 62 20 73  ct schema_vtab s
0820: 63 68 65 6d 61 5f 76 74 61 62 3b 0a 74 79 70 65  chema_vtab;.type
0830: 64 65 66 20 73 74 72 75 63 74 20 73 63 68 65 6d  def struct schem
0840: 61 5f 63 75 72 73 6f 72 20 73 63 68 65 6d 61 5f  a_cursor schema_
0850: 63 75 72 73 6f 72 3b 0a 0a 2f 2a 20 41 20 73 63  cursor;../* A sc
0860: 68 65 6d 61 20 74 61 62 6c 65 20 6f 62 6a 65 63  hema table objec
0870: 74 20 2a 2f 0a 73 74 72 75 63 74 20 73 63 68 65  t */.struct sche
0880: 6d 61 5f 76 74 61 62 20 7b 0a 20 20 73 71 6c 69  ma_vtab {.  sqli
0890: 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 0a 20  te3_vtab base;. 
08a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 7d 3b   sqlite3 *db;.};
08b0: 0a 0a 2f 2a 20 41 20 73 63 68 65 6d 61 20 74 61  ../* A schema ta
08c0: 62 6c 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63  ble cursor objec
08d0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 73 63 68 65  t */.struct sche
08e0: 6d 61 5f 63 75 72 73 6f 72 20 7b 0a 20 20 73 71  ma_cursor {.  sq
08f0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
0900: 72 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  r base;.  sqlite
0910: 33 5f 73 74 6d 74 20 2a 70 44 62 4c 69 73 74 3b  3_stmt *pDbList;
0920: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
0930: 2a 70 54 61 62 6c 65 4c 69 73 74 3b 0a 20 20 73  *pTableList;.  s
0940: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f  qlite3_stmt *pCo
0950: 6c 75 6d 6e 4c 69 73 74 3b 0a 20 20 69 6e 74 20  lumnList;.  int 
0960: 72 6f 77 69 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  rowid;.};../*.**
0970: 20 54 61 62 6c 65 20 64 65 73 74 72 75 63 74 6f   Table destructo
0980: 72 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  r for the schema
0990: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
09a0: 69 63 20 69 6e 74 20 73 63 68 65 6d 61 44 65 73  ic int schemaDes
09b0: 74 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61  troy(sqlite3_vta
09c0: 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 46 52 45  b *pVtab){.  FRE
09d0: 45 28 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75  E(pVtab);.  retu
09e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
09f0: 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72  able constructor
0a00: 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20   for the schema 
0a10: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
0a20: 63 20 69 6e 74 20 73 63 68 65 6d 61 43 72 65 61  c int schemaCrea
0a30: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
0a40: 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
0a50: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  .  int argc, cha
0a60: 72 20 2a 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69  r **argv,.  sqli
0a70: 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61  te3_vtab **ppVta
0a80: 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  b.){.  int rc = 
0a90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
0aa0: 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 70 56 74  schema_vtab *pVt
0ab0: 61 62 20 3d 20 4d 41 4c 4c 4f 43 28 73 69 7a 65  ab = MALLOC(size
0ac0: 6f 66 28 73 63 68 65 6d 61 5f 76 74 61 62 29 29  of(schema_vtab))
0ad0: 3b 0a 20 20 69 66 28 20 70 56 74 61 62 20 29 7b  ;.  if( pVtab ){
0ae0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 56 74 61  .    memset(pVta
0af0: 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 63 68  b, 0, sizeof(sch
0b00: 65 6d 61 5f 76 74 61 62 29 29 3b 0a 20 20 20 20  ema_vtab));.    
0b10: 70 56 74 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a  pVtab->db = db;.
0b20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
0b30: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
0b40: 2c 20 53 43 48 45 4d 41 29 3b 0a 20 20 7d 0a 20  , SCHEMA);.  }. 
0b50: 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69   *ppVtab = (sqli
0b60: 74 65 33 5f 76 74 61 62 20 2a 29 70 56 74 61 62  te3_vtab *)pVtab
0b70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
0b80: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
0b90: 65 77 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  ew cursor on the
0ba0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2e 0a 2a   schema table..*
0bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
0bc0: 65 6d 61 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  emaOpen(sqlite3_
0bd0: 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c  vtab *pVTab, sql
0be0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
0bf0: 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20   **ppCursor){.  
0c00: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0c10: 4e 4f 4d 45 4d 3b 0a 20 20 73 63 68 65 6d 61 5f  NOMEM;.  schema_
0c20: 63 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  cursor *pCur;.  
0c30: 70 43 75 72 20 3d 20 4d 41 4c 4c 4f 43 28 73 69  pCur = MALLOC(si
0c40: 7a 65 6f 66 28 73 63 68 65 6d 61 5f 63 75 72 73  zeof(schema_curs
0c50: 6f 72 29 29 3b 0a 20 20 69 66 28 20 70 43 75 72  or));.  if( pCur
0c60: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
0c70: 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Cur, 0, sizeof(s
0c80: 63 68 65 6d 61 5f 63 75 72 73 6f 72 29 29 3b 0a  chema_cursor));.
0c90: 20 20 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20      *ppCursor = 
0ca0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
0cb0: 72 73 6f 72 20 2a 29 70 43 75 72 3b 0a 20 20 20  rsor *)pCur;.   
0cc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
0cd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
0ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
0cf0: 20 61 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20   a schema table 
0d00: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  cursor..*/.stati
0d10: 63 20 69 6e 74 20 73 63 68 65 6d 61 43 6c 6f 73  c int schemaClos
0d20: 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  e(sqlite3_vtab_c
0d30: 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73  ursor *cur){.  s
0d40: 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43  chema_cursor *pC
0d50: 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72  ur = (schema_cur
0d60: 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 71 6c  sor *)cur;.  sql
0d70: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
0d80: 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20  ur->pDbList);.  
0d90: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
0da0: 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73  (pCur->pTableLis
0db0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  t);.  sqlite3_fi
0dc0: 6e 61 6c 69 7a 65 28 70 43 75 72 2d 3e 70 43 6f  nalize(pCur->pCo
0dd0: 6c 75 6d 6e 4c 69 73 74 29 3b 0a 20 20 46 52 45  lumnList);.  FRE
0de0: 45 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  E(pCur);.  retur
0df0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
0e00: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
0e10: 20 63 6f 6c 75 6d 6e 20 6f 66 20 64 61 74 61 2e   column of data.
0e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
0e30: 63 68 65 6d 61 43 6f 6c 75 6d 6e 28 73 71 6c 69  chemaColumn(sqli
0e40: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
0e50: 2a 63 75 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f  *cur, sqlite3_co
0e60: 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20  ntext *ctx, int 
0e70: 69 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72  i){.  schema_cur
0e80: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68  sor *pCur = (sch
0e90: 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72  ema_cursor *)cur
0ea0: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 20 29 7b  ;.  switch( i ){
0eb0: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20  .    case 0:.   
0ec0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
0ed0: 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c  t_value(ctx, sql
0ee0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
0ef0: 65 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 2c  e(pCur->pDbList,
0f00: 20 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61   1));.      brea
0f10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  k;.    case 1:. 
0f20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
0f30: 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73  ult_value(ctx, s
0f40: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
0f50: 6c 75 65 28 70 43 75 72 2d 3e 70 54 61 62 6c 65  lue(pCur->pTable
0f60: 4c 69 73 74 2c 20 30 29 29 3b 0a 20 20 20 20 20  List, 0));.     
0f70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
0f80: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
0f90: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
0fa0: 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ctx, sqlite3_col
0fb0: 75 6d 6e 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e  umn_value(pCur->
0fc0: 70 43 6f 6c 75 6d 6e 4c 69 73 74 2c 20 69 2d 32  pColumnList, i-2
0fd0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
0fe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
0ff0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1000: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
1010: 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f  urrent rowid..*/
1020: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65  .static int sche
1030: 6d 61 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  maRowid(sqlite3_
1040: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
1050: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
1060: 70 52 6f 77 69 64 29 7b 0a 20 20 73 63 68 65 6d  pRowid){.  schem
1070: 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  a_cursor *pCur =
1080: 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20   (schema_cursor 
1090: 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64  *)cur;.  *pRowid
10a0: 20 3d 20 70 43 75 72 2d 3e 72 6f 77 69 64 3b 0a   = pCur->rowid;.
10b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10c0: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
10d0: 74 20 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  t finalize(sqlit
10e0: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
10f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
1100: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 2a  lite3_finalize(*
1110: 70 70 53 74 6d 74 29 3b 0a 20 20 2a 70 70 53 74  ppStmt);.  *ppSt
1120: 6d 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  mt = 0;.  return
1130: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1140: 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
1150: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
1160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1170: 73 63 68 65 6d 61 4e 65 78 74 28 73 71 6c 69 74  schemaNext(sqlit
1180: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1190: 63 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  cur){.  int rc;.
11a0: 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20    schema_cursor 
11b0: 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61 5f  *pCur = (schema_
11c0: 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  cursor *)cur;.  
11d0: 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 70 56 74  schema_vtab *pVt
11e0: 61 62 20 3d 20 28 73 63 68 65 6d 61 5f 76 74 61  ab = (schema_vta
11f0: 62 20 2a 29 28 63 75 72 2d 3e 70 56 74 61 62 29  b *)(cur->pVtab)
1200: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  ;.  char *zSql =
1210: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 21 70   0;..  while( !p
1220: 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74  Cur->pColumnList
1230: 20 7c 7c 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d   || SQLITE_ROW!=
1240: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75  sqlite3_step(pCu
1250: 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 29 20  r->pColumnList) 
1260: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
1270: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 69 6e 61  E_OK!=(rc = fina
1280: 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70 43 6f 6c  lize(&pCur->pCol
1290: 75 6d 6e 4c 69 73 74 29 29 20 29 20 67 6f 74 6f  umnList)) ) goto
12a0: 20 66 61 69 6c 3b 0a 0a 20 20 20 20 77 68 69 6c   fail;..    whil
12b0: 65 28 20 21 70 43 75 72 2d 3e 70 54 61 62 6c 65  e( !pCur->pTable
12c0: 4c 69 73 74 20 7c 7c 20 53 51 4c 49 54 45 5f 52  List || SQLITE_R
12d0: 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW!=sqlite3_step
12e0: 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73  (pCur->pTableLis
12f0: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
1300: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
1310: 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d   finalize(&pCur-
1320: 3e 70 54 61 62 6c 65 4c 69 73 74 29 29 20 29 20  >pTableList)) ) 
1330: 67 6f 74 6f 20 66 61 69 6c 3b 0a 0a 20 20 20 20  goto fail;..    
1340: 20 20 61 73 73 65 72 74 28 70 43 75 72 2d 3e 70    assert(pCur->p
1350: 44 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  DbList);.      w
1360: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
1370: 21 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  !=sqlite3_step(p
1380: 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 20 29 7b  Cur->pDbList) ){
1390: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
13a0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 69  ITE_OK!=(rc = fi
13b0: 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70 44  nalize(&pCur->pD
13c0: 62 4c 69 73 74 29 29 20 29 20 67 6f 74 6f 20 66  bList)) ) goto f
13d0: 61 69 6c 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ail;.        ret
13e0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  urn 0;.      }..
13f0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 7a 53 71        /* Set zSq
1400: 6c 20 74 6f 20 74 68 65 20 53 51 4c 20 74 6f 20  l to the SQL to 
1410: 70 75 6c 6c 20 74 68 65 20 6c 69 73 74 20 6f 66  pull the list of
1420: 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
1430: 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74   .      ** sqlit
1440: 65 5f 6d 61 73 74 65 72 20 28 6f 72 20 73 71 6c  e_master (or sql
1450: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29  ite_temp_master)
1460: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
1470: 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1480: 69 64 65 6e 74 66 69 65 64 20 62 79 20 74 68 65  identfied by the
1490: 20 72 6f 77 20 70 6f 69 6e 74 65 64 20 74 6f 20   row pointed to 
14a0: 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  by the SQL state
14b0: 6d 65 6e 74 20 70 43 75 72 2d 3e 70 44 62 4c 69  ment pCur->pDbLi
14c0: 73 74 0a 20 20 20 20 20 20 2a 2a 20 28 69 74 65  st.      ** (ite
14d0: 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
14e0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 62 61 73   "PRAGMA databas
14f0: 65 5f 6c 69 73 74 3b 22 20 73 74 61 74 65 6d 65  e_list;" stateme
1500: 6e 74 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nt)..      */.  
1510: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1520: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 75 72 2d  column_int(pCur-
1530: 3e 70 44 62 4c 69 73 74 2c 20 30 29 3d 3d 31 20  >pDbList, 0)==1 
1540: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
1550: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1560: 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  f(.            "
1570: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
1580: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
1590: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27  ter WHERE type='
15a0: 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20  table'".        
15b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15d0: 73 74 6d 74 20 2a 70 44 62 4c 69 73 74 20 3d 20  stmt *pDbList = 
15e0: 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 3b 0a 20  pCur->pDbList;. 
15f0: 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
1600: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
1610: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
1620: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25 51 2e  CT name FROM %Q.
1630: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
1640: 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
1650: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1660: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1670: 65 78 74 28 70 44 62 4c 69 73 74 2c 20 31 29 0a  ext(pDbList, 1).
1680: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1690: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a 53   }.      if( !zS
16a0: 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ql ){.        rc
16b0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
16c0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
16d0: 69 6c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  il;.      }..   
16e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
16f0: 70 72 65 70 61 72 65 28 70 56 74 61 62 2d 3e 64  prepare(pVtab->d
1700: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
1710: 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2c 20  ur->pTableList, 
1720: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1730: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
1740: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1750: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 61 69  TE_OK ) goto fai
1760: 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  l;.    }..    /*
1770: 20 53 65 74 20 7a 53 71 6c 20 74 6f 20 74 68 65   Set zSql to the
1780: 20 53 51 4c 20 74 6f 20 74 68 65 20 74 61 62 6c   SQL to the tabl
1790: 65 5f 69 6e 66 6f 20 70 72 61 67 6d 61 20 66 6f  e_info pragma fo
17a0: 72 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  r the table curr
17b0: 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 69 64 65  ently.    ** ide
17c0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 72  ntified by the r
17d0: 6f 77 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ows pointed to b
17e0: 79 20 73 74 61 74 65 6d 65 6e 74 73 20 70 43 75  y statements pCu
17f0: 72 2d 3e 70 44 62 4c 69 73 74 20 61 6e 64 0a 20  r->pDbList and. 
1800: 20 20 20 2a 2a 20 70 43 75 72 2d 3e 70 54 61 62     ** pCur->pTab
1810: 6c 65 4c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20  leList..    */. 
1820: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
1830: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
1840: 41 20 25 51 2e 74 61 62 6c 65 5f 69 6e 66 6f 28  A %Q.table_info(
1850: 25 51 29 22 2c 20 0a 20 20 20 20 20 20 20 20 73  %Q)", .        s
1860: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1870: 78 74 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74  xt(pCur->pDbList
1880: 2c 20 31 29 2c 0a 20 20 20 20 20 20 20 20 73 71  , 1),.        sq
1890: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
18a0: 74 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69  t(pCur->pTableLi
18b0: 73 74 2c 20 30 29 0a 20 20 20 20 29 3b 0a 0a 20  st, 0).    );.. 
18c0: 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a     if( !zSql ){.
18d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
18f0: 6f 74 6f 20 66 61 69 6c 3b 0a 20 20 20 20 7d 0a  oto fail;.    }.
1900: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1910: 5f 70 72 65 70 61 72 65 28 70 56 74 61 62 2d 3e  _prepare(pVtab->
1920: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
1930: 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74  Cur->pColumnList
1940: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1950: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
1960: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1970: 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 61 69 6c 3b  _OK ) goto fail;
1980: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 72 6f 77  .  }.  pCur->row
1990: 69 64 2b 2b 3b 0a 0a 66 61 69 6c 3a 0a 20 20 2f  id++;..fail:.  /
19a0: 2a 20 54 4f 44 4f 3a 20 48 61 6e 64 6c 65 20 72  * TODO: Handle r
19b0: 63 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b  c */.  return 1;
19c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
19d0: 61 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 63  a schema table c
19e0: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
19f0: 20 69 6e 74 20 73 63 68 65 6d 61 46 69 6c 74 65   int schemaFilte
1a00: 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  r(.  sqlite3_vta
1a10: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
1a20: 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64  ursor, .  int id
1a30: 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  xNum, const char
1a40: 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20   *idxStr,.  int 
1a50: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
1a60: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
1a70: 69 6e 74 20 72 63 3b 0a 20 20 73 63 68 65 6d 61  int rc;.  schema
1a80: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28  _vtab *pVtab = (
1a90: 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 29 28 70  schema_vtab *)(p
1aa0: 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
1ab0: 62 29 3b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72  b);.  schema_cur
1ac0: 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68  sor *pCur = (sch
1ad0: 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 70 56 74  ema_cursor *)pVt
1ae0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 70 43 75 72  abCursor;.  pCur
1af0: 2d 3e 72 6f 77 69 64 20 3d 20 30 3b 0a 20 20 66  ->rowid = 0;.  f
1b00: 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70  inalize(&pCur->p
1b10: 54 61 62 6c 65 4c 69 73 74 29 3b 0a 20 20 66 69  TableList);.  fi
1b20: 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70 43  nalize(&pCur->pC
1b30: 6f 6c 75 6d 6e 4c 69 73 74 29 3b 0a 20 20 66 69  olumnList);.  fi
1b40: 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70 44  nalize(&pCur->pD
1b50: 62 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73  bList);.  rc = s
1b60: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
1b70: 56 74 61 62 2d 3e 64 62 2c 22 50 52 41 47 4d 41  Vtab->db,"PRAGMA
1b80: 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c   database_list",
1b90: 20 2d 31 2c 20 26 70 43 75 72 2d 3e 70 44 62 4c   -1, &pCur->pDbL
1ba0: 69 73 74 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ist, 0);.  retur
1bb0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
1bc0: 20 3f 20 73 63 68 65 6d 61 4e 65 78 74 28 70 56   ? schemaNext(pV
1bd0: 74 61 62 43 75 72 73 6f 72 29 20 3a 20 72 63 29  tabCursor) : rc)
1be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
1bf0: 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6f 6e  se the WHERE con
1c00: 64 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  dition..*/.stati
1c10: 63 20 69 6e 74 20 73 63 68 65 6d 61 42 65 73 74  c int schemaBest
1c20: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74  Index(sqlite3_vt
1c30: 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33  ab *tab, sqlite3
1c40: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
1c50: 78 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  xInfo){.  return
1c60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1c70: 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 74  *.** A virtual t
1c80: 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68 61 74  able module that
1c90: 20 6d 65 72 65 6c 79 20 65 63 68 6f 73 20 6d 65   merely echos me
1ca0: 74 68 6f 64 20 63 61 6c 6c 73 20 69 6e 74 6f 20  thod calls into 
1cb0: 54 43 4c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73  TCL.** variables
1cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
1cd0: 74 65 33 5f 6d 6f 64 75 6c 65 20 73 63 68 65 6d  te3_module schem
1ce0: 61 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c  aModule = {.  0,
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
1d10: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 22 73 63 68  ersion */.  "sch
1d20: 65 6d 61 22 2c 20 20 20 20 20 20 20 20 20 20 20  ema",           
1d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
1d40: 65 20 2a 2f 0a 20 20 73 63 68 65 6d 61 43 72 65  e */.  schemaCre
1d50: 61 74 65 2c 0a 20 20 73 63 68 65 6d 61 43 72 65  ate,.  schemaCre
1d60: 61 74 65 2c 0a 20 20 73 63 68 65 6d 61 42 65 73  ate,.  schemaBes
1d70: 74 49 6e 64 65 78 2c 0a 20 20 73 63 68 65 6d 61  tIndex,.  schema
1d80: 44 65 73 74 72 6f 79 2c 0a 20 20 73 63 68 65 6d  Destroy,.  schem
1d90: 61 44 65 73 74 72 6f 79 2c 0a 20 20 73 63 68 65  aDestroy,.  sche
1da0: 6d 61 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  maOpen,         
1db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
1dc0: 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f  n - open a curso
1dd0: 72 20 2a 2f 0a 20 20 73 63 68 65 6d 61 43 6c 6f  r */.  schemaClo
1de0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1df0: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20      /* xClose - 
1e00: 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a  close a cursor *
1e10: 2f 0a 20 20 73 63 68 65 6d 61 46 69 6c 74 65 72  /.  schemaFilter
1e20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e30: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
1e40: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
1e50: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 73 63  straints */.  sc
1e60: 68 65 6d 61 4e 65 78 74 2c 20 20 20 20 20 20 20  hemaNext,       
1e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
1e80: 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
1e90: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 63 68 65  cursor */.  sche
1ea0: 6d 61 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  maColumn,       
1eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
1ec0: 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
1ed0: 2a 2f 0a 20 20 73 63 68 65 6d 61 52 6f 77 69 64  */.  schemaRowid
1ee0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ef0: 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
1f00: 61 64 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 0a  ad data */.};...
1f10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1f20: 53 54 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  ST../*.** Decode
1f30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1f40: 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e   sqlite3 object.
1f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1f60: 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
1f70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
1f90: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29 7b  sqlite3 **ppDb){
1fa0: 0a 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69  .  *ppDb = (sqli
1fb0: 74 65 33 2a 29 73 71 6c 69 74 65 33 54 65 78 74  te3*)sqlite3Text
1fc0: 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65 74  ToPtr(zA);.  ret
1fd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1fe0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
1ff0: 65 20 73 63 68 65 6d 61 20 76 69 72 74 75 61 6c  e schema virtual
2000: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 0a 2a   table module..*
2010: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 67  /.static int reg
2020: 69 73 74 65 72 5f 73 63 68 65 6d 61 5f 6d 6f 64  ister_schema_mod
2030: 75 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ule(.  ClientDat
2040: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2050: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
2060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2070: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2080: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2090: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
20a0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
20b0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
20c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20d0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
20e0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
20f0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2100: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2110: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2120: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2130: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2140: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2150: 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
2160: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2170: 4f 52 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  OR;.  }.#ifndef 
2180: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2190: 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  UALTABLE.  sqlit
21a0: 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
21b0: 28 64 62 2c 20 22 73 63 68 65 6d 61 22 2c 20 26  (db, "schema", &
21c0: 73 63 68 65 6d 61 4d 6f 64 75 6c 65 2c 20 30 29  schemaModule, 0)
21d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
21e0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
21f0: 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d  ** Register comm
2200: 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43  ands with the TC
2210: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
2220: 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  /.int Sqlitetest
2230: 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f  schema_Init(Tcl_
2240: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
2250: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
2260: 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
2270: 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62  ame;.     Tcl_Ob
2280: 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  jCmdProc *xProc;
2290: 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65  .     void *clie
22a0: 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a  ntData;.  } aObj
22b0: 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  Cmd[] = {.     {
22c0: 20 22 72 65 67 69 73 74 65 72 5f 73 63 68 65 6d   "register_schem
22d0: 61 5f 6d 6f 64 75 6c 65 22 2c 20 72 65 67 69 73  a_module", regis
22e0: 74 65 72 5f 73 63 68 65 6d 61 5f 6d 6f 64 75 6c  ter_schema_modul
22f0: 65 2c 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  e, 0 },.  };.  i
2300: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
2310: 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d   i<sizeof(aObjCm
2320: 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d  d)/sizeof(aObjCm
2330: 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
2340: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
2350: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f  mmand(interp, aO
2360: 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  bjCmd[i].zName, 
2370: 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64  .        aObjCmd
2380: 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43  [i].xProc, aObjC
2390: 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61  md[i].clientData
23a0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
23b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65  rn TCL_OK;.}..#e
23c0: 6c 73 65 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e  lse../*.** Exten
23d0: 73 69 6f 6e 20 6c 6f 61 64 20 66 75 6e 63 74 69  sion load functi
23e0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 63 68 65 6d  on..*/.int schem
23f0: 61 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65  a_init(.  sqlite
2400: 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a  3 *db, .  char *
2410: 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f  *pzErrMsg, .  co
2420: 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2430: 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29  routines *pApi.)
2440: 7b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  {.  SQLITE_EXTEN
2450: 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29  SION_INIT2(pApi)
2460: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
2470: 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73  te_module(db, "s
2480: 63 68 65 6d 61 22 2c 20 26 73 63 68 65 6d 61 4d  chema", &schemaM
2490: 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74  odule, 0);.  ret
24a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66  urn 0;.}..#endif
24b0: 0a                                               .