/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 06042ea462608aecb6f9a95d5649227121093646:


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 37 20 32 30 30 36 2f 30 36 2f 32 34 20 30  1.7 2006/06/24 0
0240: 39 3a 33 34 3a 32 33 20 64 61 6e 69 65 6c 6b 31  9:34:23 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 76 69 72 74 75 61 6c   sqlite3 virtual
0290: 2d 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68  -table module th
02a0: 61 74 0a 2a 2a 20 70 72 6f 76 69 64 65 73 20 61  at.** provides a
02b0: 20 72 65 61 64 2d 6f 6e 6c 79 20 76 69 65 77 20   read-only view 
02c0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  of the current d
02d0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
02e0: 54 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2a 20  There is one.** 
02f0: 72 6f 77 20 69 6e 20 74 68 65 20 73 63 68 65 6d  row in the schem
0300: 61 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68  a table for each
0310: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 64   column in the d
0320: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
0330: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 43 48 45 4d  */.#define SCHEM
0340: 41 20 5c 0a 22 43 52 45 41 54 45 20 54 41 42 4c  A \."CREATE TABL
0350: 45 20 78 28 22 20 20 20 20 20 20 20 20 20 20 20  E x("           
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 20 20 20 20 20 20 20                  
0390: 20 5c 0a 20 20 22 64 61 74 61 62 61 73 65 2c 22   \.  "database,"
03a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
03b0: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69  e of database (i
03c0: 2e 65 2e 20 6d 61 69 6e 2c 20 74 65 6d 70 20 65  .e. main, temp e
03d0: 74 63 2e 29 20 2a 2f 20 20 20 20 20 20 20 20 20  tc.) */         
03e0: 5c 0a 20 20 22 74 61 62 6c 65 6e 61 6d 65 2c 22  \.  "tablename,"
03f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0400: 20 6f 66 20 74 61 62 6c 65 20 2a 2f 20 20 20 20   of table */    
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 20 20 20 20 20 20 20 20 5c                 \
0430: 0a 20 20 22 63 69 64 2c 22 20 20 20 20 20 20 20  .  "cid,"       
0440: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
0450: 6e 20 6e 75 6d 62 65 72 20 28 66 72 6f 6d 20 6c  n number (from l
0460: 65 66 74 2d 74 6f 2d 72 69 67 68 74 2c 20 30 20  eft-to-right, 0 
0470: 75 70 77 61 72 64 29 20 2a 2f 20 20 20 20 5c 0a  upward) */    \.
0480: 20 20 22 6e 61 6d 65 2c 22 20 20 20 20 20 20 20    "name,"       
0490: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
04a0: 20 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20   name */        
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
04d0: 20 22 74 79 70 65 2c 22 20 20 20 20 20 20 20 20   "type,"        
04e0: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 69        /* Specifi
04f0: 65 64 20 74 79 70 65 20 28 69 2e 65 2e 20 56 41  ed type (i.e. VA
0500: 52 43 48 41 52 28 33 32 29 29 20 2a 2f 20 20 20  RCHAR(32)) */   
0510: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0520: 22 6e 6f 74 5f 6e 75 6c 6c 2c 22 20 20 20 20 20  "not_null,"     
0530: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
0540: 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c   True if NOT NUL
0550: 4c 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20  L was specified 
0560: 2a 2f 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22  */         \.  "
0570: 64 66 6c 74 5f 76 61 6c 75 65 2c 22 20 20 20 20  dflt_value,"    
0580: 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76      /* Default v
0590: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 63 6f  alue for this co
05a0: 6c 75 6d 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  lumn */         
05b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 70            \.  "p
05c0: 6b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k"              
05d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
05e0: 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20 70 61 72  is column is par
05f0: 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79  t of the primary
0600: 20 6b 65 79 20 2a 2f 20 20 5c 0a 22 29 22 0a 0a   key */  \.")"..
0610: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53  /* If SQLITE_TES
0620: 54 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 69  T is defined thi
0630: 73 20 63 6f 64 65 20 69 73 20 70 72 65 70 72 6f  s code is prepro
0640: 63 65 73 73 65 64 20 66 6f 72 20 75 73 65 20 61  cessed for use a
0650: 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  s part.** of the
0660: 20 73 71 6c 69 74 65 20 74 65 73 74 20 62 69 6e   sqlite test bin
0670: 61 72 79 20 22 74 65 73 74 66 69 78 74 75 72 65  ary "testfixture
0680: 22 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74 20  ". Otherwise it 
0690: 69 73 20 70 72 65 70 72 6f 63 65 73 73 65 64 0a  is preprocessed.
06a0: 2a 2a 20 74 6f 20 62 65 20 63 6f 6d 70 69 6c 65  ** to be compile
06b0: 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65  d into an sqlite
06c0: 20 64 79 6e 61 6d 69 63 20 65 78 74 65 6e 73 69   dynamic extensi
06d0: 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  on..*/.#ifdef SQ
06e0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 23 69 6e 63  LITE_TEST.  #inc
06f0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0700: 68 22 0a 20 20 23 69 6e 63 6c 75 64 65 20 22 74  h".  #include "t
0710: 63 6c 2e 68 22 0a 20 20 23 64 65 66 69 6e 65 20  cl.h".  #define 
0720: 4d 41 4c 4c 4f 43 28 78 29 20 73 71 6c 69 74 65  MALLOC(x) sqlite
0730: 4d 61 6c 6c 6f 63 52 61 77 28 78 29 20 0a 20 20  MallocRaw(x) .  
0740: 23 64 65 66 69 6e 65 20 46 52 45 45 28 78 29 20  #define FREE(x) 
0750: 20 20 73 71 6c 69 74 65 46 72 65 65 28 78 29 0a    sqliteFree(x).
0760: 23 65 6c 73 65 0a 20 20 23 69 6e 63 6c 75 64 65  #else.  #include
0770: 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a   "sqlite3ext.h".
0780: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
0790: 4f 4e 5f 49 4e 49 54 31 0a 20 20 23 64 65 66 69  ON_INIT1.  #defi
07a0: 6e 65 20 4d 41 4c 4c 4f 43 28 78 29 20 6d 61 6c  ne MALLOC(x) mal
07b0: 6c 6f 63 28 78 29 20 0a 20 20 23 64 65 66 69 6e  loc(x) .  #defin
07c0: 65 20 46 52 45 45 28 78 29 20 20 20 66 72 65 65  e FREE(x)   free
07d0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  (x).#endif..#inc
07e0: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
07f0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0800: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
0810: 73 65 72 74 2e 68 3e 0a 0a 74 79 70 65 64 65 66  sert.h>..typedef
0820: 20 73 74 72 75 63 74 20 73 63 68 65 6d 61 5f 76   struct schema_v
0830: 74 61 62 20 73 63 68 65 6d 61 5f 76 74 61 62 3b  tab schema_vtab;
0840: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0850: 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 73 63  schema_cursor sc
0860: 68 65 6d 61 5f 63 75 72 73 6f 72 3b 0a 0a 2f 2a  hema_cursor;../*
0870: 20 41 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20   A schema table 
0880: 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75 63 74  object */.struct
0890: 20 73 63 68 65 6d 61 5f 76 74 61 62 20 7b 0a 20   schema_vtab {. 
08a0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61   sqlite3_vtab ba
08b0: 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
08c0: 62 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 63 68 65  b;.};../* A sche
08d0: 6d 61 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  ma table cursor 
08e0: 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75 63 74  object */.struct
08f0: 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 7b   schema_cursor {
0900: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
0910: 63 75 72 73 6f 72 20 62 61 73 65 3b 0a 20 20 73  cursor base;.  s
0920: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 62  qlite3_stmt *pDb
0930: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  List;.  sqlite3_
0940: 73 74 6d 74 20 2a 70 54 61 62 6c 65 4c 69 73 74  stmt *pTableList
0950: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
0960: 20 2a 70 43 6f 6c 75 6d 6e 4c 69 73 74 3b 0a 20   *pColumnList;. 
0970: 20 69 6e 74 20 72 6f 77 69 64 3b 0a 7d 3b 0a 0a   int rowid;.};..
0980: 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 64 65 73 74  /*.** Table dest
0990: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 73  ructor for the s
09a0: 63 68 65 6d 61 20 6d 6f 64 75 6c 65 2e 0a 2a 2f  chema module..*/
09b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65  .static int sche
09c0: 6d 61 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65  maDestroy(sqlite
09d0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
09e0: 20 20 46 52 45 45 28 70 56 74 61 62 29 3b 0a 20    FREE(pVtab);. 
09f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
0a00: 0a 2a 2a 20 54 61 62 6c 65 20 63 6f 6e 73 74 72  .** Table constr
0a10: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 73 63  uctor for the sc
0a20: 68 65 6d 61 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  hema module..*/.
0a30: 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d  static int schem
0a40: 61 43 72 65 61 74 65 28 0a 20 20 73 71 6c 69 74  aCreate(.  sqlit
0a50: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a  e3 *db,.  void *
0a60: 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  pAux,.  int argc
0a70: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 0a 20  , char **argv,. 
0a80: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
0a90: 70 70 56 74 61 62 0a 29 7b 0a 20 20 69 6e 74 20  ppVtab.){.  int 
0aa0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
0ab0: 4d 3b 0a 20 20 73 63 68 65 6d 61 5f 76 74 61 62  M;.  schema_vtab
0ac0: 20 2a 70 56 74 61 62 20 3d 20 4d 41 4c 4c 4f 43   *pVtab = MALLOC
0ad0: 28 73 69 7a 65 6f 66 28 73 63 68 65 6d 61 5f 76  (sizeof(schema_v
0ae0: 74 61 62 29 29 3b 0a 20 20 69 66 28 20 70 56 74  tab));.  if( pVt
0af0: 61 62 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  ab ){.    memset
0b00: 28 70 56 74 61 62 2c 20 30 2c 20 73 69 7a 65 6f  (pVtab, 0, sizeo
0b10: 66 28 73 63 68 65 6d 61 5f 76 74 61 62 29 29 3b  f(schema_vtab));
0b20: 0a 20 20 20 20 70 56 74 61 62 2d 3e 64 62 20 3d  .    pVtab->db =
0b30: 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
0b40: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
0b50: 54 41 42 4c 45 0a 20 20 20 20 72 63 20 3d 20 73  TABLE.    rc = s
0b60: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
0b70: 74 61 62 28 64 62 2c 20 53 43 48 45 4d 41 29 3b  tab(db, SCHEMA);
0b80: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2a 70  .#endif.  }.  *p
0b90: 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33  pVtab = (sqlite3
0ba0: 5f 76 74 61 62 20 2a 29 70 56 74 61 62 3b 0a 20  _vtab *)pVtab;. 
0bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
0bc0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
0bd0: 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 73 63  cursor on the sc
0be0: 68 65 6d 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  hema table..*/.s
0bf0: 74 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61  tatic int schema
0c00: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  Open(sqlite3_vta
0c10: 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65  b *pVTab, sqlite
0c20: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
0c30: 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74  ppCursor){.  int
0c40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
0c50: 45 4d 3b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72  EM;.  schema_cur
0c60: 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75  sor *pCur;.  pCu
0c70: 72 20 3d 20 4d 41 4c 4c 4f 43 28 73 69 7a 65 6f  r = MALLOC(sizeo
0c80: 66 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 29  f(schema_cursor)
0c90: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b  );.  if( pCur ){
0ca0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72  .    memset(pCur
0cb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 63 68 65  , 0, sizeof(sche
0cc0: 6d 61 5f 63 75 72 73 6f 72 29 29 3b 0a 20 20 20  ma_cursor));.   
0cd0: 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 28 73 71   *ppCursor = (sq
0ce0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
0cf0: 72 20 2a 29 70 43 75 72 3b 0a 20 20 20 20 72 63  r *)pCur;.    rc
0d00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
0d10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
0d20: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
0d30: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 63 75 72  schema table cur
0d40: 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sor..*/.static i
0d50: 6e 74 20 73 63 68 65 6d 61 43 6c 6f 73 65 28 73  nt schemaClose(s
0d60: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
0d70: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 63 68 65  or *cur){.  sche
0d80: 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  ma_cursor *pCur 
0d90: 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  = (schema_cursor
0da0: 20 2a 29 63 75 72 3b 0a 20 20 73 71 6c 69 74 65   *)cur;.  sqlite
0db0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72 2d  3_finalize(pCur-
0dc0: 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c  >pDbList);.  sql
0dd0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43  ite3_finalize(pC
0de0: 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 29 3b  ur->pTableList);
0df0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
0e00: 69 7a 65 28 70 43 75 72 2d 3e 70 43 6f 6c 75 6d  ize(pCur->pColum
0e10: 6e 4c 69 73 74 29 3b 0a 20 20 46 52 45 45 28 70  nList);.  FREE(p
0e20: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Cur);.  return S
0e30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
0e40: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 63 6f  ** Retrieve a co
0e50: 6c 75 6d 6e 20 6f 66 20 64 61 74 61 2e 0a 2a 2f  lumn of data..*/
0e60: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65  .static int sche
0e70: 6d 61 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  maColumn(sqlite3
0e80: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
0e90: 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  r, sqlite3_conte
0ea0: 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69 29 7b  xt *ctx, int i){
0eb0: 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  .  schema_cursor
0ec0: 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61   *pCur = (schema
0ed0: 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  _cursor *)cur;. 
0ee0: 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20   switch( i ){.  
0ef0: 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 20 20    case 0:.      
0f00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
0f10: 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65  alue(ctx, sqlite
0f20: 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
0f30: 43 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20 31 29  Cur->pDbList, 1)
0f40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0f50: 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20      case 1:.    
0f60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
0f70: 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69  _value(ctx, sqli
0f80: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
0f90: 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73  (pCur->pTableLis
0fa0: 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 62 72  t, 0));.      br
0fb0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
0fc0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
0fd0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
0fe0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
0ff0: 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70 43 6f  _value(pCur->pCo
1000: 6c 75 6d 6e 4c 69 73 74 2c 20 69 2d 32 29 29 3b  lumnList, i-2));
1010: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1020: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1030: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
1040: 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72  etrieve the curr
1050: 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74  ent rowid..*/.st
1060: 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 52  atic int schemaR
1070: 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61  owid(sqlite3_vta
1080: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73  b_cursor *cur, s
1090: 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
10a0: 77 69 64 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63  wid){.  schema_c
10b0: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73  ursor *pCur = (s
10c0: 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63  chema_cursor *)c
10d0: 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20  ur;.  *pRowid = 
10e0: 70 43 75 72 2d 3e 72 6f 77 69 64 3b 0a 20 20 72  pCur->rowid;.  r
10f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1100: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
1110: 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
1120: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 29 7b 0a  stmt **ppStmt){.
1130: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1140: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 2a 70 70 53  e3_finalize(*ppS
1150: 74 6d 74 29 3b 0a 20 20 2a 70 70 53 74 6d 74 20  tmt);.  *ppStmt 
1160: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1170: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1180: 73 63 68 65 6d 61 45 6f 66 28 73 71 6c 69 74 65  schemaEof(sqlite
1190: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
11a0: 75 72 29 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75  ur){.  schema_cu
11b0: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 63  rsor *pCur = (sc
11c0: 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 29 63 75  hema_cursor *)cu
11d0: 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 43 75  r;.  return (pCu
11e0: 72 2d 3e 70 44 62 4c 69 73 74 20 3f 20 30 20 3a  r->pDbList ? 0 :
11f0: 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   1);.}../*.** Ad
1200: 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
1210: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
1220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1230: 73 63 68 65 6d 61 4e 65 78 74 28 73 71 6c 69 74  schemaNext(sqlit
1240: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1250: 63 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  cur){.  int rc =
1260: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 63   SQLITE_OK;.  sc
1270: 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43 75  hema_cursor *pCu
1280: 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72 73  r = (schema_curs
1290: 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 63 68 65  or *)cur;.  sche
12a0: 6d 61 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  ma_vtab *pVtab =
12b0: 20 28 73 63 68 65 6d 61 5f 76 74 61 62 20 2a 29   (schema_vtab *)
12c0: 28 63 75 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20  (cur->pVtab);.  
12d0: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a  char *zSql = 0;.
12e0: 0a 20 20 77 68 69 6c 65 28 20 21 70 43 75 72 2d  .  while( !pCur-
12f0: 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 20 7c 7c 20  >pColumnList || 
1300: 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71 6c 69  SQLITE_ROW!=sqli
1310: 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d 3e 70  te3_step(pCur->p
1320: 43 6f 6c 75 6d 6e 4c 69 73 74 29 20 29 7b 0a 20  ColumnList) ){. 
1330: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1340: 21 3d 28 72 63 20 3d 20 66 69 6e 61 6c 69 7a 65  !=(rc = finalize
1350: 28 26 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c  (&pCur->pColumnL
1360: 69 73 74 29 29 20 29 20 67 6f 74 6f 20 6e 65 78  ist)) ) goto nex
1370: 74 5f 65 78 69 74 3b 0a 0a 20 20 20 20 77 68 69  t_exit;..    whi
1380: 6c 65 28 20 21 70 43 75 72 2d 3e 70 54 61 62 6c  le( !pCur->pTabl
1390: 65 4c 69 73 74 20 7c 7c 20 53 51 4c 49 54 45 5f  eList || SQLITE_
13a0: 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW!=sqlite3_ste
13b0: 70 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69  p(pCur->pTableLi
13c0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  st) ){.      if(
13d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
13e0: 3d 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72  = finalize(&pCur
13f0: 2d 3e 70 54 61 62 6c 65 4c 69 73 74 29 29 20 29  ->pTableList)) )
1400: 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b   goto next_exit;
1410: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
1420: 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20  Cur->pDbList);. 
1430: 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49       while( SQLI
1440: 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f  TE_ROW!=sqlite3_
1450: 73 74 65 70 28 70 43 75 72 2d 3e 70 44 62 4c 69  step(pCur->pDbLi
1460: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
1470: 63 20 3d 20 66 69 6e 61 6c 69 7a 65 28 26 70 43  c = finalize(&pC
1480: 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20  ur->pDbList);.  
1490: 20 20 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f        goto next_
14a0: 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  exit;.      }.. 
14b0: 20 20 20 20 20 2f 2a 20 53 65 74 20 7a 53 71 6c       /* Set zSql
14c0: 20 74 6f 20 74 68 65 20 53 51 4c 20 74 6f 20 70   to the SQL to p
14d0: 75 6c 6c 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ull the list of 
14e0: 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20  tables from the 
14f0: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
1500: 5f 6d 61 73 74 65 72 20 28 6f 72 20 73 71 6c 69  _master (or sqli
1510: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20  te_temp_master) 
1520: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
1530: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 69  abase.      ** i
1540: 64 65 6e 74 66 69 65 64 20 62 79 20 74 68 65 20  dentfied by the 
1550: 72 6f 77 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  row pointed to b
1560: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
1570: 65 6e 74 20 70 43 75 72 2d 3e 70 44 62 4c 69 73  ent pCur->pDbLis
1580: 74 0a 20 20 20 20 20 20 2a 2a 20 28 69 74 65 72  t.      ** (iter
1590: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20  ating through a 
15a0: 22 50 52 41 47 4d 41 20 64 61 74 61 62 61 73 65  "PRAGMA database
15b0: 5f 6c 69 73 74 3b 22 20 73 74 61 74 65 6d 65 6e  _list;" statemen
15c0: 74 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  t)..      */.   
15d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
15e0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 75 72 2d 3e  olumn_int(pCur->
15f0: 70 44 62 4c 69 73 74 2c 20 30 29 3d 3d 31 20 29  pDbList, 0)==1 )
1600: 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  {.        zSql =
1610: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1620: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  (.            "S
1630: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
1640: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
1650: 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  er WHERE type='t
1660: 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 29  able'".        )
1670: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
1690: 74 6d 74 20 2a 70 44 62 4c 69 73 74 20 3d 20 70  tmt *pDbList = p
16a0: 43 75 72 2d 3e 70 44 62 4c 69 73 74 3b 0a 20 20  Cur->pDbList;.  
16b0: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
16c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
16d0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
16e0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25 51 2e 73  T name FROM %Q.s
16f0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
1700: 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22  RE type='table'"
1710: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,.             s
1720: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1730: 78 74 28 70 44 62 4c 69 73 74 2c 20 31 29 0a 20  xt(pDbList, 1). 
1740: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1750: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a 53 71  }.      if( !zSq
1760: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
1770: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1780: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6e 65 78          goto nex
1790: 74 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  t_exit;.      }.
17a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17b0: 74 65 33 5f 70 72 65 70 61 72 65 28 70 56 74 61  te3_prepare(pVta
17c0: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
17d0: 20 26 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69   &pCur->pTableLi
17e0: 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  st, 0);.      sq
17f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
1800: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1810: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1820: 20 6e 65 78 74 5f 65 78 69 74 3b 0a 20 20 20 20   next_exit;.    
1830: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 7a 53  }..    /* Set zS
1840: 71 6c 20 74 6f 20 74 68 65 20 53 51 4c 20 74 6f  ql to the SQL to
1850: 20 74 68 65 20 74 61 62 6c 65 5f 69 6e 66 6f 20   the table_info 
1860: 70 72 61 67 6d 61 20 66 6f 72 20 74 68 65 20 74  pragma for the t
1870: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 20  able currently. 
1880: 20 20 20 2a 2a 20 69 64 65 6e 74 69 66 69 65 64     ** identified
1890: 20 62 79 20 74 68 65 20 72 6f 77 73 20 70 6f 69   by the rows poi
18a0: 6e 74 65 64 20 74 6f 20 62 79 20 73 74 61 74 65  nted to by state
18b0: 6d 65 6e 74 73 20 70 43 75 72 2d 3e 70 44 62 4c  ments pCur->pDbL
18c0: 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70  ist and.    ** p
18d0: 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2e  Cur->pTableList.
18e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c  .    */.    zSql
18f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1900: 74 66 28 22 50 52 41 47 4d 41 20 25 51 2e 74 61  tf("PRAGMA %Q.ta
1910: 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 0a  ble_info(%Q)", .
1920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1930: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 75 72  column_text(pCur
1940: 2d 3e 70 44 62 4c 69 73 74 2c 20 31 29 2c 0a 20  ->pDbList, 1),. 
1950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1960: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 75 72 2d  olumn_text(pCur-
1970: 3e 70 54 61 62 6c 65 4c 69 73 74 2c 20 30 29 0a  >pTableList, 0).
1980: 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20      );..    if( 
1990: 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72  !zSql ){.      r
19a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19b0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 65 78  ;.      goto nex
19c0: 74 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  t_exit;.    }.  
19d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
19e0: 72 65 70 61 72 65 28 70 56 74 61 62 2d 3e 64 62  repare(pVtab->db
19f0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75  , zSql, -1, &pCu
1a00: 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 2c 20  r->pColumnList, 
1a10: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1a20: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
1a30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a40: 4b 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78  K ) goto next_ex
1a50: 69 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  it;.  }.  pCur->
1a60: 72 6f 77 69 64 2b 2b 3b 0a 0a 6e 65 78 74 5f 65  rowid++;..next_e
1a70: 78 69 74 3a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  xit:.  /* TODO: 
1a80: 48 61 6e 64 6c 65 20 72 63 20 2a 2f 0a 20 20 72  Handle rc */.  r
1a90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1aa0: 2a 2a 20 52 65 73 65 74 20 61 20 73 63 68 65 6d  ** Reset a schem
1ab0: 61 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a  a table cursor..
1ac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63  */.static int sc
1ad0: 68 65 6d 61 46 69 6c 74 65 72 28 0a 20 20 73 71  hemaFilter(.  sq
1ae0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
1af0: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c 20  r *pVtabCursor, 
1b00: 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63  .  int idxNum, c
1b10: 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74  onst char *idxSt
1b20: 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73  r,.  int argc, s
1b30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1b40: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rgv.){.  int rc;
1b50: 0a 20 20 73 63 68 65 6d 61 5f 76 74 61 62 20 2a  .  schema_vtab *
1b60: 70 56 74 61 62 20 3d 20 28 73 63 68 65 6d 61 5f  pVtab = (schema_
1b70: 76 74 61 62 20 2a 29 28 70 56 74 61 62 43 75 72  vtab *)(pVtabCur
1b80: 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 73  sor->pVtab);.  s
1b90: 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43  chema_cursor *pC
1ba0: 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72  ur = (schema_cur
1bb0: 73 6f 72 20 2a 29 70 56 74 61 62 43 75 72 73 6f  sor *)pVtabCurso
1bc0: 72 3b 0a 20 20 70 43 75 72 2d 3e 72 6f 77 69 64  r;.  pCur->rowid
1bd0: 20 3d 20 30 3b 0a 20 20 66 69 6e 61 6c 69 7a 65   = 0;.  finalize
1be0: 28 26 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69  (&pCur->pTableLi
1bf0: 73 74 29 3b 0a 20 20 66 69 6e 61 6c 69 7a 65 28  st);.  finalize(
1c00: 26 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69  &pCur->pColumnLi
1c10: 73 74 29 3b 0a 20 20 66 69 6e 61 6c 69 7a 65 28  st);.  finalize(
1c20: 26 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b  &pCur->pDbList);
1c30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1c40: 70 72 65 70 61 72 65 28 70 56 74 61 62 2d 3e 64  prepare(pVtab->d
1c50: 62 2c 22 50 52 41 47 4d 41 20 64 61 74 61 62 61  b,"PRAGMA databa
1c60: 73 65 5f 6c 69 73 74 22 2c 20 2d 31 2c 20 26 70  se_list", -1, &p
1c70: 43 75 72 2d 3e 70 44 62 4c 69 73 74 2c 20 30 29  Cur->pDbList, 0)
1c80: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ;.  return (rc==
1c90: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 73 63 68 65  SQLITE_OK ? sche
1ca0: 6d 61 4e 65 78 74 28 70 56 74 61 62 43 75 72 73  maNext(pVtabCurs
1cb0: 6f 72 29 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  or) : rc);.}../*
1cc0: 0a 2a 2a 20 41 6e 61 6c 79 73 65 20 74 68 65 20  .** Analyse the 
1cd0: 57 48 45 52 45 20 63 6f 6e 64 69 74 69 6f 6e 2e  WHERE condition.
1ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1cf0: 63 68 65 6d 61 42 65 73 74 49 6e 64 65 78 28 73  chemaBestIndex(s
1d00: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62  qlite3_vtab *tab
1d10: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
1d20: 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b  info *pIdxInfo){
1d30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
1d50: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
1d60: 64 75 6c 65 20 74 68 61 74 20 6d 65 72 65 6c 79  dule that merely
1d70: 20 65 63 68 6f 73 20 6d 65 74 68 6f 64 20 63 61   echos method ca
1d80: 6c 6c 73 20 69 6e 74 6f 20 54 43 4c 0a 2a 2a 20  lls into TCL.** 
1d90: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  variables..*/.st
1da0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64  atic sqlite3_mod
1db0: 75 6c 65 20 73 63 68 65 6d 61 4d 6f 64 75 6c 65  ule schemaModule
1dc0: 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20   = {.  0,       
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
1df0: 2a 2f 0a 20 20 22 73 63 68 65 6d 61 22 2c 20 20  */.  "schema",  
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
1e20: 73 63 68 65 6d 61 43 72 65 61 74 65 2c 0a 20 20  schemaCreate,.  
1e30: 73 63 68 65 6d 61 43 72 65 61 74 65 2c 0a 20 20  schemaCreate,.  
1e40: 73 63 68 65 6d 61 42 65 73 74 49 6e 64 65 78 2c  schemaBestIndex,
1e50: 0a 20 20 73 63 68 65 6d 61 44 65 73 74 72 6f 79  .  schemaDestroy
1e60: 2c 0a 20 20 73 63 68 65 6d 61 44 65 73 74 72 6f  ,.  schemaDestro
1e70: 79 2c 0a 20 20 73 63 68 65 6d 61 4f 70 65 6e 2c  y,.  schemaOpen,
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65    /* xOpen - ope
1ea0: 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  n a cursor */.  
1eb0: 73 63 68 65 6d 61 43 6c 6f 73 65 2c 20 20 20 20  schemaClose,    
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed0: 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61  xClose - close a
1ee0: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 63 68   cursor */.  sch
1ef0: 65 6d 61 46 69 6c 74 65 72 2c 20 20 20 20 20 20  emaFilter,      
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1f10: 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65  lter - configure
1f20: 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74   scan constraint
1f30: 73 20 2a 2f 0a 20 20 73 63 68 65 6d 61 4e 65 78  s */.  schemaNex
1f40: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f50: 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61      /* xNext - a
1f60: 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20  dvance a cursor 
1f70: 2a 2f 0a 20 20 73 63 68 65 6d 61 45 6f 66 2c 20  */.  schemaEof, 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 73    /* xEof */.  s
1fa0: 63 68 65 6d 61 43 6f 6c 75 6d 6e 2c 20 20 20 20  chemaColumn,    
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fc0: 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61  Column - read da
1fd0: 74 61 20 2a 2f 0a 20 20 73 63 68 65 6d 61 52 6f  ta */.  schemaRo
1fe0: 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
1ff0: 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d       /* xRowid -
2000: 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 7d 3b   read data */.};
2010: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
2020: 5f 54 45 53 54 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  _TEST../*.** Dec
2030: 6f 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ode a pointer to
2040: 20 61 6e 20 73 71 6c 69 74 65 33 20 6f 62 6a 65   an sqlite3 obje
2050: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
2060: 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54  t getDbPointer(T
2070: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2080: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
2090: 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  A, sqlite3 **ppD
20a0: 62 29 7b 0a 20 20 2a 70 70 44 62 20 3d 20 28 73  b){.  *ppDb = (s
20b0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
20c0: 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20  extToPtr(zA);.  
20d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
20e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
20f0: 20 74 68 65 20 73 63 68 65 6d 61 20 76 69 72 74   the schema virt
2100: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
2110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2120: 72 65 67 69 73 74 65 72 5f 73 63 68 65 6d 61 5f  register_schema_
2130: 6d 6f 64 75 6c 65 28 0a 20 20 43 6c 69 65 6e 74  module(.  Client
2140: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2150: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
2160: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2170: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2180: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2190: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
21a0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
21b0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
21c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21d0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
21e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
21f0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2200: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2210: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2220: 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  b;.  if( objc!=2
2230: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2240: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2250: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
2260: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2270: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2280: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2290: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
22a0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
22b0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
22c0: 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53  ERROR;.#ifndef S
22d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
22e0: 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
22f0: 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28  3_create_module(
2300: 64 62 2c 20 22 73 63 68 65 6d 61 22 2c 20 26 73  db, "schema", &s
2310: 63 68 65 6d 61 4d 6f 64 75 6c 65 2c 20 30 29 3b  chemaModule, 0);
2320: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
2330: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2340: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
2350: 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
2360: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
2370: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73  .int Sqlitetests
2380: 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49  chema_Init(Tcl_I
2390: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
23a0: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
23b0: 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
23c0: 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  me;.     Tcl_Obj
23d0: 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
23e0: 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e       void *clien
23f0: 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43  tData;.  } aObjC
2400: 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
2410: 22 72 65 67 69 73 74 65 72 5f 73 63 68 65 6d 61  "register_schema
2420: 5f 6d 6f 64 75 6c 65 22 2c 20 72 65 67 69 73 74  _module", regist
2430: 65 72 5f 73 63 68 65 6d 61 5f 6d 6f 64 75 6c 65  er_schema_module
2440: 2c 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  , 0 },.  };.  in
2450: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
2460: 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  i<sizeof(aObjCmd
2470: 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  )/sizeof(aObjCmd
2480: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
2490: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
24a0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62  mand(interp, aOb
24b0: 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a  jCmd[i].zName, .
24c0: 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b          aObjCmd[
24d0: 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d  i].xProc, aObjCm
24e0: 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c  d[i].clientData,
24f0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
2500: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  n TCL_OK;.}..#el
2510: 73 65 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 73  se../*.** Extens
2520: 69 6f 6e 20 6c 6f 61 64 20 66 75 6e 63 74 69 6f  ion load functio
2530: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2540: 33 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74  3_extension_init
2550: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
2560: 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
2570: 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71  Msg, .  const sq
2580: 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2590: 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51  es *pApi.){.  SQ
25a0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
25b0: 4e 49 54 32 28 70 41 70 69 29 3b 0a 23 69 66 6e  NIT2(pApi);.#ifn
25c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25d0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
25e0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f  qlite3_create_mo
25f0: 64 75 6c 65 28 64 62 2c 20 22 73 63 68 65 6d 61  dule(db, "schema
2600: 22 2c 20 26 73 63 68 65 6d 61 4d 6f 64 75 6c 65  ", &schemaModule
2610: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  , 0);.#endif.  r
2620: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64  eturn 0;.}..#end
2630: 69 66 0a                                         if.