/ Hex Artifact Content
Login

Artifact 4b4bf7bb329326458c491b0e6facd4c8c4c5b479:


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 31 35 20 32 30 30 38 2f 30 37 2f 30 37 20  1.15 2008/07/07 
0240: 31 34 3a 35 30 3a 31 34 20 64 72 68 20 45 78 70  14:50:14 drh Exp
0250: 20 24 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20 63 6f   $.*/../* The co
0260: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0270: 64 65 66 69 6e 65 73 20 61 20 73 71 6c 69 74 65  defines a sqlite
0280: 33 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  3 virtual-table 
0290: 6d 6f 64 75 6c 65 20 74 68 61 74 0a 2a 2a 20 70  module that.** p
02a0: 72 6f 76 69 64 65 73 20 61 20 72 65 61 64 2d 6f  rovides a read-o
02b0: 6e 6c 79 20 76 69 65 77 20 6f 66 20 74 68 65 20  nly view of the 
02c0: 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
02d0: 20 73 63 68 65 6d 61 2e 20 54 68 65 72 65 20 69   schema. There i
02e0: 73 20 6f 6e 65 0a 2a 2a 20 72 6f 77 20 69 6e 20  s one.** row in 
02f0: 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65  the schema table
0300: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
0310: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0320: 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 23 64 65 66   schema..*/.#def
0330: 69 6e 65 20 53 43 48 45 4d 41 20 5c 0a 22 43 52  ine SCHEMA \."CR
0340: 45 41 54 45 20 54 41 42 4c 45 20 78 28 22 20 20  EATE 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 20 5c 0a 20 20 22 64            \.  "d
0390: 61 74 61 62 61 73 65 2c 22 20 20 20 20 20 20 20  atabase,"       
03a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61     /* Name of da
03b0: 74 61 62 61 73 65 20 28 69 2e 65 2e 20 6d 61 69  tabase (i.e. mai
03c0: 6e 2c 20 74 65 6d 70 20 65 74 63 2e 29 20 2a 2f  n, temp etc.) */
03d0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74 61           \.  "ta
03e0: 62 6c 65 6e 61 6d 65 2c 22 20 20 20 20 20 20 20  blename,"       
03f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
0400: 6c 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  le */           
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 5c 0a 20 20 22 63 69 64          \.  "cid
0430: 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,"              
0440: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
0450: 72 20 28 66 72 6f 6d 20 6c 65 66 74 2d 74 6f 2d  r (from left-to-
0460: 72 69 67 68 74 2c 20 30 20 75 70 77 61 72 64 29  right, 0 upward)
0470: 20 2a 2f 20 20 20 20 5c 0a 20 20 22 6e 61 6d 65   */    \.  "name
0480: 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,"              
0490: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
04a0: 2f 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 20 5c 0a 20 20 22 74 79 70 65 2c        \.  "type,
04d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  "              /
04e0: 2a 20 53 70 65 63 69 66 69 65 64 20 74 79 70 65  * Specified type
04f0: 20 28 69 2e 65 2e 20 56 41 52 43 48 41 52 28 33   (i.e. VARCHAR(3
0500: 32 29 29 20 2a 2f 20 20 20 20 20 20 20 20 20 20  2)) */          
0510: 20 20 20 20 20 5c 0a 20 20 22 6e 6f 74 5f 6e 75       \.  "not_nu
0520: 6c 6c 2c 22 20 20 20 20 20 20 20 20 20 20 2f 2a  ll,"          /*
0530: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
0540: 66 20 4e 4f 54 20 4e 55 4c 4c 20 77 61 73 20 73  f NOT NULL was s
0550: 70 65 63 69 66 69 65 64 20 2a 2f 20 20 20 20 20  pecified */     
0560: 20 20 20 20 5c 0a 20 20 22 64 66 6c 74 5f 76 61      \.  "dflt_va
0570: 6c 75 65 2c 22 20 20 20 20 20 20 20 20 2f 2a 20  lue,"        /* 
0580: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  Default value fo
0590: 72 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f  r this column */
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05b0: 20 20 20 5c 0a 20 20 22 70 6b 22 20 20 20 20 20     \.  "pk"     
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
05d0: 72 75 65 20 69 66 20 74 68 69 73 20 63 6f 6c 75  rue if this colu
05e0: 6d 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  mn is part of th
05f0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
0600: 20 20 5c 0a 22 29 22 0a 0a 2f 2a 20 49 66 20 53    \.")"../* If S
0610: 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
0620: 66 69 6e 65 64 20 74 68 69 73 20 63 6f 64 65 20  fined this code 
0630: 69 73 20 70 72 65 70 72 6f 63 65 73 73 65 64 20  is preprocessed 
0640: 66 6f 72 20 75 73 65 20 61 73 20 70 61 72 74 0a  for use as part.
0650: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
0660: 20 74 65 73 74 20 62 69 6e 61 72 79 20 22 74 65   test binary "te
0670: 73 74 66 69 78 74 75 72 65 22 2e 20 4f 74 68 65  stfixture". Othe
0680: 72 77 69 73 65 20 69 74 20 69 73 20 70 72 65 70  rwise it is prep
0690: 72 6f 63 65 73 73 65 64 0a 2a 2a 20 74 6f 20 62  rocessed.** to b
06a0: 65 20 63 6f 6d 70 69 6c 65 64 20 69 6e 74 6f 20  e compiled into 
06b0: 61 6e 20 73 71 6c 69 74 65 20 64 79 6e 61 6d 69  an sqlite dynami
06c0: 63 20 65 78 74 65 6e 73 69 6f 6e 2e 0a 2a 2f 0a  c extension..*/.
06d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
06e0: 53 54 0a 20 20 23 69 6e 63 6c 75 64 65 20 22 73  ST.  #include "s
06f0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 20 20 23 69  qliteInt.h".  #i
0700: 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23  nclude "tcl.h".#
0710: 65 6c 73 65 0a 20 20 23 69 6e 63 6c 75 64 65 20  else.  #include 
0720: 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 20  "sqlite3ext.h". 
0730: 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f   SQLITE_EXTENSIO
0740: 4e 5f 49 4e 49 54 31 0a 23 65 6e 64 69 66 0a 0a  N_INIT1.#endif..
0750: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0760: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0770: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0780: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 74 79 70   <assert.h>..typ
0790: 65 64 65 66 20 73 74 72 75 63 74 20 73 63 68 65  edef struct sche
07a0: 6d 61 5f 76 74 61 62 20 73 63 68 65 6d 61 5f 76  ma_vtab schema_v
07b0: 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72  tab;.typedef str
07c0: 75 63 74 20 73 63 68 65 6d 61 5f 63 75 72 73 6f  uct schema_curso
07d0: 72 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 3b  r schema_cursor;
07e0: 0a 0a 2f 2a 20 41 20 73 63 68 65 6d 61 20 74 61  ../* A schema ta
07f0: 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74  ble object */.st
0800: 72 75 63 74 20 73 63 68 65 6d 61 5f 76 74 61 62  ruct schema_vtab
0810: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
0820: 62 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  b base;.  sqlite
0830: 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20  3 *db;.};../* A 
0840: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 63 75 72  schema table cur
0850: 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74  sor object */.st
0860: 72 75 63 74 20 73 63 68 65 6d 61 5f 63 75 72 73  ruct schema_curs
0870: 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  or {.  sqlite3_v
0880: 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b  tab_cursor base;
0890: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
08a0: 2a 70 44 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  *pDbList;.  sqli
08b0: 74 65 33 5f 73 74 6d 74 20 2a 70 54 61 62 6c 65  te3_stmt *pTable
08c0: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  List;.  sqlite3_
08d0: 73 74 6d 74 20 2a 70 43 6f 6c 75 6d 6e 4c 69 73  stmt *pColumnLis
08e0: 74 3b 0a 20 20 69 6e 74 20 72 6f 77 69 64 3b 0a  t;.  int rowid;.
08f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 6e 65 20 6f  };../*.** None o
0900: 66 20 74 68 69 73 20 77 6f 72 6b 73 20 75 6e 6c  f this works unl
0910: 65 73 73 20 77 65 20 68 61 76 65 20 76 69 72 74  ess we have virt
0920: 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 23  ual tables..*/.#
0930: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0940: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
0950: 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 64 65 73  ./*.** Table des
0960: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20  tructor for the 
0970: 73 63 68 65 6d 61 20 6d 6f 64 75 6c 65 2e 0a 2a  schema module..*
0980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68  /.static int sch
0990: 65 6d 61 44 65 73 74 72 6f 79 28 73 71 6c 69 74  emaDestroy(sqlit
09a0: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
09b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
09c0: 70 56 74 61 62 29 3b 0a 20 20 72 65 74 75 72 6e  pVtab);.  return
09d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 62   0;.}../*.** Tab
09e0: 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66  le constructor f
09f0: 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 6d 6f  or the schema mo
0a00: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
0a10: 69 6e 74 20 73 63 68 65 6d 61 43 72 65 61 74 65  int schemaCreate
0a20: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
0a30: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
0a40: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
0a50: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
0a60: 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
0a70: 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
0a80: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
0a90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0aa0: 4e 4f 4d 45 4d 3b 0a 20 20 73 63 68 65 6d 61 5f  NOMEM;.  schema_
0ab0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71  vtab *pVtab = sq
0ac0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
0ad0: 65 6f 66 28 73 63 68 65 6d 61 5f 76 74 61 62 29  eof(schema_vtab)
0ae0: 29 3b 0a 20 20 69 66 28 20 70 56 74 61 62 20 29  );.  if( pVtab )
0af0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 56 74  {.    memset(pVt
0b00: 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 63  ab, 0, sizeof(sc
0b10: 68 65 6d 61 5f 76 74 61 62 29 29 3b 0a 20 20 20  hema_vtab));.   
0b20: 20 70 56 74 61 62 2d 3e 64 62 20 3d 20 64 62 3b   pVtab->db = db;
0b30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0b40: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
0b50: 45 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  E.    rc = sqlit
0b60: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
0b70: 64 62 2c 20 53 43 48 45 4d 41 29 3b 0a 23 65 6e  db, SCHEMA);.#en
0b80: 64 69 66 0a 20 20 7d 0a 20 20 2a 70 70 56 74 61  dif.  }.  *ppVta
0b90: 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  b = (sqlite3_vta
0ba0: 62 20 2a 29 70 56 74 61 62 3b 0a 20 20 72 65 74  b *)pVtab;.  ret
0bb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
0bc0: 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73   Open a new curs
0bd0: 6f 72 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  or on the schema
0be0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
0bf0: 63 20 69 6e 74 20 73 63 68 65 6d 61 4f 70 65 6e  c int schemaOpen
0c00: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
0c10: 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74  VTab, sqlite3_vt
0c20: 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75  ab_cursor **ppCu
0c30: 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  rsor){.  int rc 
0c40: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
0c50: 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20    schema_cursor 
0c60: 2a 70 43 75 72 3b 0a 20 20 70 43 75 72 20 3d 20  *pCur;.  pCur = 
0c70: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
0c80: 69 7a 65 6f 66 28 73 63 68 65 6d 61 5f 63 75 72  izeof(schema_cur
0c90: 73 6f 72 29 29 3b 0a 20 20 69 66 28 20 70 43 75  sor));.  if( pCu
0ca0: 72 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  r ){.    memset(
0cb0: 70 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCur, 0, sizeof(
0cc0: 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 29 29 3b  schema_cursor));
0cd0: 0a 20 20 20 20 2a 70 70 43 75 72 73 6f 72 20 3d  .    *ppCursor =
0ce0: 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63   (sqlite3_vtab_c
0cf0: 75 72 73 6f 72 20 2a 29 70 43 75 72 3b 0a 20 20  ursor *)pCur;.  
0d00: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
0d10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
0d20: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
0d30: 65 20 61 20 73 63 68 65 6d 61 20 74 61 62 6c 65  e a schema table
0d40: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
0d50: 69 63 20 69 6e 74 20 73 63 68 65 6d 61 43 6c 6f  ic int schemaClo
0d60: 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  se(sqlite3_vtab_
0d70: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
0d80: 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70  schema_cursor *p
0d90: 43 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75  Cur = (schema_cu
0da0: 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 71  rsor *)cur;.  sq
0db0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
0dc0: 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20  Cur->pDbList);. 
0dd0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
0de0: 65 28 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69  e(pCur->pTableLi
0df0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  st);.  sqlite3_f
0e00: 69 6e 61 6c 69 7a 65 28 70 43 75 72 2d 3e 70 43  inalize(pCur->pC
0e10: 6f 6c 75 6d 6e 4c 69 73 74 29 3b 0a 20 20 73 71  olumnList);.  sq
0e20: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
0e30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0e40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
0e50: 65 74 72 69 65 76 65 20 61 20 63 6f 6c 75 6d 6e  etrieve a column
0e60: 20 6f 66 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61   of data..*/.sta
0e70: 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61 43 6f  tic int schemaCo
0e80: 6c 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  lumn(sqlite3_vta
0e90: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73  b_cursor *cur, s
0ea0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0eb0: 63 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 73  ctx, int i){.  s
0ec0: 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a 70 43  chema_cursor *pC
0ed0: 75 72 20 3d 20 28 73 63 68 65 6d 61 5f 63 75 72  ur = (schema_cur
0ee0: 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 77 69  sor *)cur;.  swi
0ef0: 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61  tch( i ){.    ca
0f00: 73 65 20 30 3a 0a 20 20 20 20 20 20 73 71 6c 69  se 0:.      sqli
0f10: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
0f20: 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f  (ctx, sqlite3_co
0f30: 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 75 72 2d  lumn_value(pCur-
0f40: 3e 70 44 62 4c 69 73 74 2c 20 31 29 29 3b 0a 20  >pDbList, 1));. 
0f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0f60: 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 73 71  case 1:.      sq
0f70: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
0f80: 75 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f  ue(ctx, sqlite3_
0f90: 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 75  column_value(pCu
0fa0: 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2c 20 30  r->pTableList, 0
0fb0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
0fc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
0fd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0fe0: 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71  lt_value(ctx, sq
0ff0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
1000: 75 65 28 70 43 75 72 2d 3e 70 43 6f 6c 75 6d 6e  ue(pCur->pColumn
1010: 4c 69 73 74 2c 20 69 2d 32 29 29 3b 0a 20 20 20  List, i-2));.   
1020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
1030: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
1050: 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  eve the current 
1060: 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rowid..*/.static
1070: 20 69 6e 74 20 73 63 68 65 6d 61 52 6f 77 69 64   int schemaRowid
1080: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
1090: 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74  rsor *cur, sqlit
10a0: 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29  e_int64 *pRowid)
10b0: 7b 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f  {.  schema_curso
10c0: 72 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d  r *pCur = (schem
10d0: 61 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  a_cursor *)cur;.
10e0: 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72    *pRowid = pCur
10f0: 2d 3e 72 6f 77 69 64 3b 0a 20 20 72 65 74 75 72  ->rowid;.  retur
1100: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1110: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 61 6c  static int final
1120: 69 7a 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  ize(sqlite3_stmt
1130: 20 2a 2a 70 70 53 74 6d 74 29 7b 0a 20 20 69 6e   **ppStmt){.  in
1140: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66  t rc = sqlite3_f
1150: 69 6e 61 6c 69 7a 65 28 2a 70 70 53 74 6d 74 29  inalize(*ppStmt)
1160: 3b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b  ;.  *ppStmt = 0;
1170: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1180: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65  .static int sche
1190: 6d 61 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  maEof(sqlite3_vt
11a0: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
11b0: 0a 20 20 73 63 68 65 6d 61 5f 63 75 72 73 6f 72  .  schema_cursor
11c0: 20 2a 70 43 75 72 20 3d 20 28 73 63 68 65 6d 61   *pCur = (schema
11d0: 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  _cursor *)cur;. 
11e0: 20 72 65 74 75 72 6e 20 28 70 43 75 72 2d 3e 70   return (pCur->p
11f0: 44 62 4c 69 73 74 20 3f 20 30 20 3a 20 31 29 3b  DbList ? 0 : 1);
1200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
1210: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1220: 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f  the next row..*/
1230: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65  .static int sche
1240: 6d 61 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76  maNext(sqlite3_v
1250: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
1260: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1270: 49 54 45 5f 4f 4b 3b 0a 20 20 73 63 68 65 6d 61  ITE_OK;.  schema
1280: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
1290: 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20 2a  (schema_cursor *
12a0: 29 63 75 72 3b 0a 20 20 73 63 68 65 6d 61 5f 76  )cur;.  schema_v
12b0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 28 73 63  tab *pVtab = (sc
12c0: 68 65 6d 61 5f 76 74 61 62 20 2a 29 28 63 75 72  hema_vtab *)(cur
12d0: 2d 3e 70 56 74 61 62 29 3b 0a 20 20 63 68 61 72  ->pVtab);.  char
12e0: 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 0a 20 20 77   *zSql = 0;..  w
12f0: 68 69 6c 65 28 20 21 70 43 75 72 2d 3e 70 43 6f  hile( !pCur->pCo
1300: 6c 75 6d 6e 4c 69 73 74 20 7c 7c 20 53 51 4c 49  lumnList || SQLI
1310: 54 45 5f 52 4f 57 21 3d 73 71 6c 69 74 65 33 5f  TE_ROW!=sqlite3_
1320: 73 74 65 70 28 70 43 75 72 2d 3e 70 43 6f 6c 75  step(pCur->pColu
1330: 6d 6e 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 69  mnList) ){.    i
1340: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
1350: 63 20 3d 20 66 69 6e 61 6c 69 7a 65 28 26 70 43  c = finalize(&pC
1360: 75 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 29  ur->pColumnList)
1370: 29 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78  ) ) goto next_ex
1380: 69 74 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  it;..    while( 
1390: 21 70 43 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73  !pCur->pTableLis
13a0: 74 20 7c 7c 20 53 51 4c 49 54 45 5f 52 4f 57 21  t || SQLITE_ROW!
13b0: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43  =sqlite3_step(pC
13c0: 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 29 20  ur->pTableList) 
13d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
13e0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 69  ITE_OK!=(rc = fi
13f0: 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e 70 54  nalize(&pCur->pT
1400: 61 62 6c 65 4c 69 73 74 29 29 20 29 20 67 6f 74  ableList)) ) got
1410: 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a 0a 20 20  o next_exit;..  
1420: 20 20 20 20 61 73 73 65 72 74 28 70 43 75 72 2d      assert(pCur-
1430: 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 20 20 20  >pDbList);.     
1440: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
1450: 4f 57 21 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW!=sqlite3_step
1460: 28 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 29 20  (pCur->pDbList) 
1470: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1480: 66 69 6e 61 6c 69 7a 65 28 26 70 43 75 72 2d 3e  finalize(&pCur->
1490: 70 44 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  pDbList);.      
14a0: 20 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74    goto next_exit
14b0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14c0: 20 2f 2a 20 53 65 74 20 7a 53 71 6c 20 74 6f 20   /* Set zSql to 
14d0: 74 68 65 20 53 51 4c 20 74 6f 20 70 75 6c 6c 20  the SQL to pull 
14e0: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  the list of tabl
14f0: 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  es from the .   
1500: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73     ** sqlite_mas
1510: 74 65 72 20 28 6f 72 20 73 71 6c 69 74 65 5f 74  ter (or sqlite_t
1520: 65 6d 70 5f 6d 61 73 74 65 72 29 20 74 61 62 6c  emp_master) tabl
1530: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1540: 65 0a 20 20 20 20 20 20 2a 2a 20 69 64 65 6e 74  e.      ** ident
1550: 66 69 65 64 20 62 79 20 74 68 65 20 72 6f 77 20  fied by the row 
1560: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
1570: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
1580: 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 0a 20 20  pCur->pDbList.  
1590: 20 20 20 20 2a 2a 20 28 69 74 65 72 61 74 69 6e      ** (iteratin
15a0: 67 20 74 68 72 6f 75 67 68 20 61 20 22 50 52 41  g through a "PRA
15b0: 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73  GMA database_lis
15c0: 74 3b 22 20 73 74 61 74 65 6d 65 6e 74 29 2e 0a  t;" statement)..
15d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
15e0: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
15f0: 6e 5f 69 6e 74 28 70 43 75 72 2d 3e 70 44 62 4c  n_int(pCur->pDbL
1600: 69 73 74 2c 20 30 29 3d 3d 31 20 29 7b 0a 20 20  ist, 0)==1 ){.  
1610: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
1620: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
1630: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
1640: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
1650: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 57  te_temp_master W
1660: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
1670: 27 22 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  '".        );.  
1680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1690: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
16a0: 2a 70 44 62 4c 69 73 74 20 3d 20 70 43 75 72 2d  *pDbList = pCur-
16b0: 3e 70 44 62 4c 69 73 74 3b 0a 20 20 20 20 20 20  >pDbList;.      
16c0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
16d0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
16e0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
16f0: 6d 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  me FROM %Q.sqlit
1700: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
1710: 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 0a 20 20  ype='table'",.  
1720: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1730: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1740: 44 62 4c 69 73 74 2c 20 31 29 0a 20 20 20 20 20  DbList, 1).     
1750: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
1760: 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b      if( !zSql ){
1770: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1780: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1790: 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78      goto next_ex
17a0: 69 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  it;.      }..   
17b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
17c0: 70 72 65 70 61 72 65 28 70 56 74 61 62 2d 3e 64  prepare(pVtab->d
17d0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
17e0: 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 2c 20  ur->pTableList, 
17f0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1800: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
1810: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1820: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 6e 65 78  TE_OK ) goto nex
1830: 74 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  t_exit;.    }.. 
1840: 20 20 20 2f 2a 20 53 65 74 20 7a 53 71 6c 20 74     /* Set zSql t
1850: 6f 20 74 68 65 20 53 51 4c 20 74 6f 20 74 68 65  o the SQL to the
1860: 20 74 61 62 6c 65 5f 69 6e 66 6f 20 70 72 61 67   table_info prag
1870: 6d 61 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ma for the table
1880: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
1890: 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  * identified by 
18a0: 74 68 65 20 72 6f 77 73 20 70 6f 69 6e 74 65 64  the rows pointed
18b0: 20 74 6f 20 62 79 20 73 74 61 74 65 6d 65 6e 74   to by statement
18c0: 73 20 70 43 75 72 2d 3e 70 44 62 4c 69 73 74 20  s pCur->pDbList 
18d0: 61 6e 64 0a 20 20 20 20 2a 2a 20 70 43 75 72 2d  and.    ** pCur-
18e0: 3e 70 54 61 62 6c 65 4c 69 73 74 2e 0a 20 20 20  >pTableList..   
18f0: 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73   */.    zSql = s
1900: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1910: 50 52 41 47 4d 41 20 25 51 2e 74 61 62 6c 65 5f  PRAGMA %Q.table_
1920: 69 6e 66 6f 28 25 51 29 22 2c 20 0a 20 20 20 20  info(%Q)", .    
1930: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
1940: 6d 6e 5f 74 65 78 74 28 70 43 75 72 2d 3e 70 44  mn_text(pCur->pD
1950: 62 4c 69 73 74 2c 20 31 29 2c 0a 20 20 20 20 20  bList, 1),.     
1960: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1970: 6e 5f 74 65 78 74 28 70 43 75 72 2d 3e 70 54 61  n_text(pCur->pTa
1980: 62 6c 65 4c 69 73 74 2c 20 30 29 0a 20 20 20 20  bleList, 0).    
1990: 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 7a 53 71  );..    if( !zSq
19a0: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
19b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
19c0: 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 65 78      goto next_ex
19d0: 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  it;.    }.    rc
19e0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
19f0: 72 65 28 70 56 74 61 62 2d 3e 64 62 2c 20 7a 53  re(pVtab->db, zS
1a00: 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72 2d 3e 70  ql, -1, &pCur->p
1a10: 43 6f 6c 75 6d 6e 4c 69 73 74 2c 20 30 29 3b 0a  ColumnList, 0);.
1a20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a30: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
1a40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a50: 67 6f 74 6f 20 6e 65 78 74 5f 65 78 69 74 3b 0a  goto next_exit;.
1a60: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 72 6f 77 69    }.  pCur->rowi
1a70: 64 2b 2b 3b 0a 0a 6e 65 78 74 5f 65 78 69 74 3a  d++;..next_exit:
1a80: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 48 61 6e 64  .  /* TODO: Hand
1a90: 6c 65 20 72 63 20 2a 2f 0a 20 20 72 65 74 75 72  le rc */.  retur
1aa0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1ab0: 65 73 65 74 20 61 20 73 63 68 65 6d 61 20 74 61  eset a schema ta
1ac0: 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  ble cursor..*/.s
1ad0: 74 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d 61  tatic int schema
1ae0: 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65  Filter(.  sqlite
1af0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
1b00: 56 74 61 62 43 75 72 73 6f 72 2c 20 0a 20 20 69  VtabCursor, .  i
1b10: 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74  nt idxNum, const
1b20: 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20   char *idxStr,. 
1b30: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
1b40: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
1b50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1b60: 63 68 65 6d 61 5f 76 74 61 62 20 2a 70 56 74 61  chema_vtab *pVta
1b70: 62 20 3d 20 28 73 63 68 65 6d 61 5f 76 74 61 62  b = (schema_vtab
1b80: 20 2a 29 28 70 56 74 61 62 43 75 72 73 6f 72 2d   *)(pVtabCursor-
1b90: 3e 70 56 74 61 62 29 3b 0a 20 20 73 63 68 65 6d  >pVtab);.  schem
1ba0: 61 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  a_cursor *pCur =
1bb0: 20 28 73 63 68 65 6d 61 5f 63 75 72 73 6f 72 20   (schema_cursor 
1bc0: 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
1bd0: 20 70 43 75 72 2d 3e 72 6f 77 69 64 20 3d 20 30   pCur->rowid = 0
1be0: 3b 0a 20 20 66 69 6e 61 6c 69 7a 65 28 26 70 43  ;.  finalize(&pC
1bf0: 75 72 2d 3e 70 54 61 62 6c 65 4c 69 73 74 29 3b  ur->pTableList);
1c00: 0a 20 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75  .  finalize(&pCu
1c10: 72 2d 3e 70 43 6f 6c 75 6d 6e 4c 69 73 74 29 3b  r->pColumnList);
1c20: 0a 20 20 66 69 6e 61 6c 69 7a 65 28 26 70 43 75  .  finalize(&pCu
1c30: 72 2d 3e 70 44 62 4c 69 73 74 29 3b 0a 20 20 72  r->pDbList);.  r
1c40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1c50: 61 72 65 28 70 56 74 61 62 2d 3e 64 62 2c 22 50  are(pVtab->db,"P
1c60: 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c  RAGMA database_l
1c70: 69 73 74 22 2c 20 2d 31 2c 20 26 70 43 75 72 2d  ist", -1, &pCur-
1c80: 3e 70 44 62 4c 69 73 74 2c 20 30 29 3b 0a 20 20  >pDbList, 0);.  
1c90: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
1ca0: 54 45 5f 4f 4b 20 3f 20 73 63 68 65 6d 61 4e 65  TE_OK ? schemaNe
1cb0: 78 74 28 70 56 74 61 62 43 75 72 73 6f 72 29 20  xt(pVtabCursor) 
1cc0: 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1cd0: 41 6e 61 6c 79 73 65 20 74 68 65 20 57 48 45 52  Analyse the WHER
1ce0: 45 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 2a 2f 0a  E condition..*/.
1cf0: 73 74 61 74 69 63 20 69 6e 74 20 73 63 68 65 6d  static int schem
1d00: 61 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  aBestIndex(sqlit
1d10: 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
1d20: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1d30: 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 72   *pIdxInfo){.  r
1d40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 69 72 74  .}../*.** A virt
1d60: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
1d70: 20 74 68 61 74 20 6d 65 72 65 6c 79 20 65 63 68   that merely ech
1d80: 6f 73 20 6d 65 74 68 6f 64 20 63 61 6c 6c 73 20  os method calls 
1d90: 69 6e 74 6f 20 54 43 4c 0a 2a 2a 20 76 61 72 69  into TCL.** vari
1da0: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
1db0: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
1dc0: 73 63 68 65 6d 61 4d 6f 64 75 6c 65 20 3d 20 7b  schemaModule = {
1dd0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
1e00: 20 73 63 68 65 6d 61 43 72 65 61 74 65 2c 0a 20   schemaCreate,. 
1e10: 20 73 63 68 65 6d 61 43 72 65 61 74 65 2c 0a 20   schemaCreate,. 
1e20: 20 73 63 68 65 6d 61 42 65 73 74 49 6e 64 65 78   schemaBestIndex
1e30: 2c 0a 20 20 73 63 68 65 6d 61 44 65 73 74 72 6f  ,.  schemaDestro
1e40: 79 2c 0a 20 20 73 63 68 65 6d 61 44 65 73 74 72  y,.  schemaDestr
1e50: 6f 79 2c 0a 20 20 73 63 68 65 6d 61 4f 70 65 6e  oy,.  schemaOpen
1e60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e70: 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70     /* xOpen - op
1e80: 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  en a cursor */. 
1e90: 20 73 63 68 65 6d 61 43 6c 6f 73 65 2c 20 20 20   schemaClose,   
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb0: 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
1ec0: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 63  a cursor */.  sc
1ed0: 68 65 6d 61 46 69 6c 74 65 72 2c 20 20 20 20 20  hemaFilter,     
1ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1ef0: 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
1f00: 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
1f10: 74 73 20 2a 2f 0a 20 20 73 63 68 65 6d 61 4e 65  ts */.  schemaNe
1f20: 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
1f30: 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20       /* xNext - 
1f40: 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72  advance a cursor
1f50: 20 2a 2f 0a 20 20 73 63 68 65 6d 61 45 6f 66 2c   */.  schemaEof,
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 2f 2a 20 78 45 6f 66 20 2a 2f 0a 20 20     /* xEof */.  
1f80: 73 63 68 65 6d 61 43 6f 6c 75 6d 6e 2c 20 20 20  schemaColumn,   
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa0: 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
1fb0: 61 74 61 20 2a 2f 0a 20 20 73 63 68 65 6d 61 52  ata */.  schemaR
1fc0: 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
1fd0: 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20        /* xRowid 
1fe0: 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
1ff0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2010: 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c   xUpdate */.  0,
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
2040: 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  egin */.  0,    
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
2070: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a    /* xCommit */.
20a0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c0: 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  * xRollback */. 
20d0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20f0: 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a   xFindMethod */.
2100: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2120: 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a  * xRename */.};.
2130: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2140: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2150: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
2160: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2170: 54 45 53 54 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  TEST../*.** Deco
2180: 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  de a pointer to 
2190: 61 6e 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 63  an sqlite3 objec
21a0: 74 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74  t..*/.extern int
21b0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63   getDbPointer(Tc
21c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
21d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  , const char *zA
21e0: 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62  , sqlite3 **ppDb
21f0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  );../*.** Regist
2200: 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 76 69  er the schema vi
2210: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
2220: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2230: 74 20 72 65 67 69 73 74 65 72 5f 73 63 68 65 6d  t register_schem
2240: 61 5f 6d 6f 64 75 6c 65 28 0a 20 20 43 6c 69 65  a_module(.  Clie
2250: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2260: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
2270: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
2280: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2290: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
22a0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
22b0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
22c0: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
22d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22e0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
22f0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
2300: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
2310: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2320: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2330: 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  *db;.  if( objc!
2340: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
2350: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2360: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
2370: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2380: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2390: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
23a0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
23b0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
23c0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
23d0: 4c 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66  L_ERROR;.#ifndef
23e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
23f0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
2400: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
2410: 65 28 64 62 2c 20 22 73 63 68 65 6d 61 22 2c 20  e(db, "schema", 
2420: 26 73 63 68 65 6d 61 4d 6f 64 75 6c 65 2c 20 30  &schemaModule, 0
2430: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
2440: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2450: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d  .** Register com
2460: 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54  mands with the T
2470: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  CL interpreter..
2480: 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73  */.int Sqlitetes
2490: 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
24a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
24b0: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
24c0: 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
24d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
24e0: 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
24f0: 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
2500: 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
2510: 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
2520: 7b 20 22 72 65 67 69 73 74 65 72 5f 73 63 68 65  { "register_sche
2530: 6d 61 5f 6d 6f 64 75 6c 65 22 2c 20 72 65 67 69  ma_module", regi
2540: 73 74 65 72 5f 73 63 68 65 6d 61 5f 6d 6f 64 75  ster_schema_modu
2550: 6c 65 2c 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20  le, 0 },.  };.  
2560: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
2570: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43  ; i<sizeof(aObjC
2580: 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43  md)/sizeof(aObjC
2590: 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
25a0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
25b0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
25c0: 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  ObjCmd[i].zName,
25d0: 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d   .        aObjCm
25e0: 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a  d[i].xProc, aObj
25f0: 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74  Cmd[i].clientDat
2600: 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a, 0);.  }.  ret
2610: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
2620: 65 6c 73 65 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65  else../*.** Exte
2630: 6e 73 69 6f 6e 20 6c 6f 61 64 20 66 75 6e 63 74  nsion load funct
2640: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
2650: 74 65 33 5f 65 78 74 65 6e 73 69 6f 6e 5f 69 6e  te3_extension_in
2660: 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  it(.  sqlite3 *d
2670: 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  b, .  char **pzE
2680: 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20  rrMsg, .  const 
2690: 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
26a0: 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20  ines *pApi.){.  
26b0: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
26c0: 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 23 69  _INIT2(pApi);.#i
26d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
26f0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
2700: 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73 63 68 65  module(db, "sche
2710: 6d 61 22 2c 20 26 73 63 68 65 6d 61 4d 6f 64 75  ma", &schemaModu
2720: 6c 65 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  le, 0);.#endif. 
2730: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65   return 0;.}..#e
2740: 6e 64 69 66 0a                                   ndif.