/ Hex Artifact Content
Login

Artifact c85eba7e98405e6c3d22ece241ee4e9ea4d154f8:


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 38 2e 63 2c 76 20 31 2e 37 20 32 30  test8.c,v 1.7 20
0230: 30 36 2f 30 36 2f 31 33 20 30 34 3a 31 31 3a 34  06/06/13 04:11:4
0240: 34 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78  4 danielk1977 Ex
0250: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0260: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0270: 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23  nclude "tcl.h".#
0280: 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23  include "os.h".#
0290: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
02a0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
02b0: 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 47 6c  ing.h>../*.** Gl
02c0: 6f 62 61 6c 20 54 63 6c 20 76 61 72 69 61 62 6c  obal Tcl variabl
02d0: 65 20 24 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 69  e $echo_module i
02e0: 73 20 61 20 6c 69 73 74 2e 20 54 68 69 73 20 72  s a list. This r
02f0: 6f 75 74 69 6e 65 20 61 70 70 65 6e 64 73 0a 2a  outine appends.*
0300: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 65 6c 65  * the string ele
0310: 6d 65 6e 74 20 7a 41 72 67 20 74 6f 20 74 68 61  ment zArg to tha
0320: 74 20 6c 69 73 74 20 69 6e 20 69 6e 74 65 72 70  t list in interp
0330: 72 65 74 65 72 20 69 6e 74 65 72 70 2e 0a 2a 2f  reter interp..*/
0340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
0350: 65 6e 64 54 6f 45 63 68 6f 4d 6f 64 75 6c 65 28  endToEchoModule(
0360: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0370: 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rp, const char *
0380: 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 66 6c 61  zArg){.  int fla
0390: 67 73 20 3d 20 28 54 43 4c 5f 41 50 50 45 4e 44  gs = (TCL_APPEND
03a0: 5f 56 41 4c 55 45 20 7c 20 54 43 4c 5f 4c 49 53  _VALUE | TCL_LIS
03b0: 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f  T_ELEMENT | TCL_
03c0: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
03d0: 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
03e0: 70 2c 20 22 65 63 68 6f 5f 6d 6f 64 75 6c 65 22  p, "echo_module"
03f0: 2c 20 7a 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a  , zArg, flags);.
0400: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
0410: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
0420: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
0430: 20 65 63 68 6f 2d 6d 6f 64 75 6c 65 73 20 78 43   echo-modules xC
0440: 72 65 61 74 65 20 61 6e 64 0a 2a 2a 20 78 43 6f  reate and.** xCo
0450: 6e 6e 65 63 74 20 6d 65 74 68 6f 64 73 2e 20 54  nnect methods. T
0460: 68 65 20 61 72 67 63 20 61 6e 64 20 61 72 67 76  he argc and argv
0470: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
0480: 6f 70 69 65 73 20 6f 66 20 74 68 6f 73 65 20 0a  opies of those .
0490: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ** passed to the
04a0: 20 63 61 6c 6c 69 6e 67 20 6d 65 74 68 6f 64 2e   calling method.
04b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
04c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
04d0: 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 73 71 6c  r.** calling sql
04e0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
04f0: 62 28 29 20 74 6f 20 64 65 63 6c 61 72 65 20 74  b() to declare t
0500: 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
0510: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
0520: 65 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  e being created 
0530: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 2e 0a 2a 2a  or connected..**
0540: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 73 74  .** If the const
0550: 72 75 63 74 6f 72 20 77 61 73 20 70 61 73 73 65  ructor was passe
0560: 64 20 6a 75 73 74 20 6f 6e 65 20 61 72 67 75 6d  d just one argum
0570: 65 6e 74 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a  ent, i.e.:.**.**
0580: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0590: 74 31 20 41 53 20 65 63 68 6f 28 74 32 29 3b 0a  t1 AS echo(t2);.
05a0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 32 20 69 73  **.** Then t2 is
05b0: 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 74   assumed to be t
05c0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 2a 72 65  he name of a *re
05d0: 61 6c 2a 20 64 61 74 61 62 61 73 65 20 74 61 62  al* database tab
05e0: 6c 65 2e 20 54 68 65 0a 2a 2a 20 73 63 68 65 6d  le. The.** schem
05f0: 61 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  a of the virtual
0600: 20 74 61 62 6c 65 20 69 73 20 64 65 63 6c 61 72   table is declar
0610: 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 61 20  ed by passing a 
0620: 63 6f 70 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20  copy of the .** 
0630: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
0640: 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 72  tement for the r
0650: 65 61 6c 20 74 61 62 6c 65 20 74 6f 20 73 71 6c  eal table to sql
0660: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
0670: 62 28 29 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 74  b()..** Hence, t
0680: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
0690: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 78 61   should have exa
06a0: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 63 6f  ctly the same co
06b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 0a  lumn names and .
06c0: 2a 2a 20 74 79 70 65 73 20 61 73 20 74 68 65 20  ** types as the 
06d0: 72 65 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  real table..*/.s
06e0: 74 61 74 69 63 20 69 6e 74 20 65 63 68 6f 44 65  tatic int echoDe
06f0: 63 6c 61 72 65 56 74 61 62 28 73 71 6c 69 74 65  clareVtab(sqlite
0700: 33 20 2a 64 62 2c 20 69 6e 74 20 61 72 67 63 2c  3 *db, int argc,
0710: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
0720: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
0730: 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  _OK;..  if( argc
0740: 3d 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==2 ){.    sqlit
0750: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
0760: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
0770: 70 72 65 70 61 72 65 28 64 62 2c 20 0a 20 20 20  prepare(db, .   
0780: 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
0790: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
07a0: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d  ter WHERE type =
07b0: 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d   'table' AND nam
07c0: 65 20 3d 20 3f 22 2c 0a 20 20 20 20 20 20 20 20  e = ?",.        
07d0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
07e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
07f0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
0800: 61 72 67 76 5b 31 5d 2c 20 2d 31 2c 20 30 29 3b  argv[1], -1, 0);
0810: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0820: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
0830: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
0840: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
0850: 72 65 61 74 65 54 61 62 6c 65 20 3d 20 73 71 6c  reateTable = sql
0860: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
0870: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 23 69 66 6e  (pStmt, 0);.#ifn
0880: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0890: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
08a0: 20 20 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61     sqlite3_decla
08b0: 72 65 5f 76 74 61 62 28 64 62 2c 20 7a 43 72 65  re_vtab(db, zCre
08c0: 61 74 65 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69  ateTable);.#endi
08d0: 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  f.    } else {. 
08e0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
08f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
0900: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
0910: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a  ze(pStmt);.  }..
0920: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
0930: 2f 2a 20 41 6e 20 65 63 68 6f 20 76 74 61 62 20  /* An echo vtab 
0940: 6f 62 6a 65 63 74 20 2a 2f 0a 74 79 70 65 64 65  object */.typede
0950: 66 20 73 74 72 75 63 74 20 65 63 68 6f 5f 76 74  f struct echo_vt
0960: 61 62 20 65 63 68 6f 5f 76 74 61 62 3b 0a 73 74  ab echo_vtab;.st
0970: 72 75 63 74 20 65 63 68 6f 5f 76 74 61 62 20 7b  ruct echo_vtab {
0980: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
0990: 62 61 73 65 3b 0a 20 20 54 63 6c 5f 49 6e 74 65  base;.  Tcl_Inte
09a0: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 7d 3b 0a 0a  rp *interp;.};..
09b0: 2f 2a 20 4d 65 74 68 6f 64 73 20 66 6f 72 20 74  /* Methods for t
09c0: 68 65 20 65 63 68 6f 20 6d 6f 64 75 6c 65 20 2a  he echo module *
09d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 63 68  /.static int ech
09e0: 6f 43 72 65 61 74 65 28 0a 20 20 73 71 6c 69 74  oCreate(.  sqlit
09f0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
0a00: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
0a10: 70 4d 6f 64 75 6c 65 2c 0a 20 20 69 6e 74 20 61  pModule,.  int a
0a20: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
0a30: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
0a40: 20 2a 2a 70 70 56 74 61 62 0a 29 7b 0a 20 20 69   **ppVtab.){.  i
0a50: 6e 74 20 69 3b 0a 20 20 65 63 68 6f 5f 76 74 61  nt i;.  echo_vta
0a60: 62 20 2a 70 56 74 61 62 3b 0a 0a 20 20 70 56 74  b *pVtab;..  pVt
0a70: 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ab = sqliteMallo
0a80: 63 28 20 73 69 7a 65 6f 66 28 2a 70 56 74 61 62  c( sizeof(*pVtab
0a90: 29 20 29 3b 0a 20 20 2a 70 70 56 74 61 62 20 3d  ) );.  *ppVtab =
0aa0: 20 26 70 56 74 61 62 2d 3e 62 61 73 65 3b 0a 20   &pVtab->base;. 
0ab0: 20 70 56 74 61 62 2d 3e 62 61 73 65 2e 70 4d 6f   pVtab->base.pMo
0ac0: 64 75 6c 65 20 3d 20 70 4d 6f 64 75 6c 65 3b 0a  dule = pModule;.
0ad0: 20 20 70 56 74 61 62 2d 3e 69 6e 74 65 72 70 20    pVtab->interp 
0ae0: 3d 20 70 4d 6f 64 75 6c 65 2d 3e 70 41 75 78 3b  = pModule->pAux;
0af0: 0a 20 20 61 70 70 65 6e 64 54 6f 45 63 68 6f 4d  .  appendToEchoM
0b00: 6f 64 75 6c 65 28 70 56 74 61 62 2d 3e 69 6e 74  odule(pVtab->int
0b10: 65 72 70 2c 20 22 78 43 72 65 61 74 65 22 29 3b  erp, "xCreate");
0b20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
0b30: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70  gc; i++){.    ap
0b40: 70 65 6e 64 54 6f 45 63 68 6f 4d 6f 64 75 6c 65  pendToEchoModule
0b50: 28 70 56 74 61 62 2d 3e 69 6e 74 65 72 70 2c 20  (pVtab->interp, 
0b60: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20  argv[i]);.  }.. 
0b70: 20 65 63 68 6f 44 65 63 6c 61 72 65 56 74 61 62   echoDeclareVtab
0b80: 28 64 62 2c 20 61 72 67 63 2c 20 61 72 67 76 29  (db, argc, argv)
0b90: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
0ba0: 73 74 61 74 69 63 20 69 6e 74 20 65 63 68 6f 43  static int echoC
0bb0: 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65  onnect(.  sqlite
0bc0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 73  3 *db,.  const s
0bd0: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
0be0: 4d 6f 64 75 6c 65 2c 0a 20 20 69 6e 74 20 61 72  Module,.  int ar
0bf0: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  gc, char **argv,
0c00: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
0c10: 2a 2a 70 70 56 74 61 62 0a 29 7b 0a 20 20 69 6e  **ppVtab.){.  in
0c20: 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  t i;.  Tcl_Inter
0c30: 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 4d 6f 64  p *interp = pMod
0c40: 75 6c 65 2d 3e 70 41 75 78 3b 0a 20 20 65 63 68  ule->pAux;.  ech
0c50: 6f 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 0a  o_vtab *pVtab;..
0c60: 20 20 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65    pVtab = sqlite
0c70: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
0c80: 70 56 74 61 62 29 20 29 3b 0a 20 20 2a 70 70 56  pVtab) );.  *ppV
0c90: 74 61 62 20 3d 20 26 70 56 74 61 62 2d 3e 62 61  tab = &pVtab->ba
0ca0: 73 65 3b 0a 20 20 70 56 74 61 62 2d 3e 62 61 73  se;.  pVtab->bas
0cb0: 65 2e 70 4d 6f 64 75 6c 65 20 3d 20 70 4d 6f 64  e.pModule = pMod
0cc0: 75 6c 65 3b 0a 20 20 70 56 74 61 62 2d 3e 69 6e  ule;.  pVtab->in
0cd0: 74 65 72 70 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e  terp = pModule->
0ce0: 70 41 75 78 3b 0a 20 20 61 70 70 65 6e 64 54 6f  pAux;.  appendTo
0cf0: 45 63 68 6f 4d 6f 64 75 6c 65 28 70 56 74 61 62  EchoModule(pVtab
0d00: 2d 3e 69 6e 74 65 72 70 2c 20 22 78 43 6f 6e 6e  ->interp, "xConn
0d10: 65 63 74 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ect");.  for(i=0
0d20: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
0d30: 20 20 20 20 61 70 70 65 6e 64 54 6f 45 63 68 6f      appendToEcho
0d40: 4d 6f 64 75 6c 65 28 70 56 74 61 62 2d 3e 69 6e  Module(pVtab->in
0d50: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  terp, argv[i]);.
0d60: 20 20 7d 0a 0a 20 20 65 63 68 6f 44 65 63 6c 61    }..  echoDecla
0d70: 72 65 56 74 61 62 28 64 62 2c 20 61 72 67 63 2c  reVtab(db, argc,
0d80: 20 61 72 67 76 29 3b 0a 20 20 72 65 74 75 72 6e   argv);.  return
0d90: 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74   0;.}.static int
0da0: 20 65 63 68 6f 44 69 73 63 6f 6e 6e 65 63 74 28   echoDisconnect(
0db0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
0dc0: 74 61 62 29 7b 0a 20 20 65 63 68 6f 5f 76 74 61  tab){.  echo_vta
0dd0: 62 20 2a 70 20 3d 20 28 65 63 68 6f 5f 76 74 61  b *p = (echo_vta
0de0: 62 2a 29 70 56 74 61 62 3b 0a 20 20 61 70 70 65  b*)pVtab;.  appe
0df0: 6e 64 54 6f 45 63 68 6f 4d 6f 64 75 6c 65 28 70  ndToEchoModule(p
0e00: 2d 3e 69 6e 74 65 72 70 2c 20 22 78 44 69 73 63  ->interp, "xDisc
0e10: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 73 71 6c 69  onnect");.  sqli
0e20: 74 65 46 72 65 65 28 70 56 74 61 62 29 3b 0a 20  teFree(pVtab);. 
0e30: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 73 74 61   return 0;.}.sta
0e40: 74 69 63 20 69 6e 74 20 65 63 68 6f 44 65 73 74  tic int echoDest
0e50: 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61 62  roy(sqlite3_vtab
0e60: 20 2a 70 56 74 61 62 29 7b 0a 20 20 65 63 68 6f   *pVtab){.  echo
0e70: 5f 76 74 61 62 20 2a 70 20 3d 20 28 65 63 68 6f  _vtab *p = (echo
0e80: 5f 76 74 61 62 2a 29 70 56 74 61 62 3b 0a 20 20  _vtab*)pVtab;.  
0e90: 61 70 70 65 6e 64 54 6f 45 63 68 6f 4d 6f 64 75  appendToEchoModu
0ea0: 6c 65 28 70 2d 3e 69 6e 74 65 72 70 2c 20 22 78  le(p->interp, "x
0eb0: 44 65 73 74 72 6f 79 22 29 3b 0a 20 20 73 71 6c  Destroy");.  sql
0ec0: 69 74 65 46 72 65 65 28 70 56 74 61 62 29 3b 0a  iteFree(pVtab);.
0ed0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
0ee0: 2a 0a 2a 2a 20 54 68 65 20 78 42 65 73 74 49 6e  *.** The xBestIn
0ef0: 64 65 78 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  dex method for t
0f00: 68 65 20 65 63 68 6f 20 6d 6f 64 75 6c 65 20 61  he echo module a
0f10: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 0a 2a 2a  lways returns.**
0f20: 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 31 32 33   an index of 123
0f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0f40: 65 63 68 6f 42 65 73 74 49 6e 64 65 78 28 73 71  echoBestIndex(sq
0f50: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
0f60: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
0f70: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29  _info *pIdxInfo)
0f80: 7b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  {.  pIdxInfo->id
0f90: 78 4e 75 6d 20 3d 20 31 32 33 3b 0a 20 20 72 65  xNum = 123;.  re
0fa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 69 72 74 75  }../*.** A virtu
0fc0: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
0fd0: 74 68 61 74 20 6d 65 72 65 6c 79 20 65 63 68 6f  that merely echo
0fe0: 73 20 6d 65 74 68 6f 64 20 63 61 6c 6c 73 20 69  s method calls i
0ff0: 6e 74 6f 20 54 43 4c 0a 2a 2a 20 76 61 72 69 61  nto TCL.** varia
1000: 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1010: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 65  sqlite3_module e
1020: 63 68 6f 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20  choModule = {.  
1030: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
1050: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 22 65 63 68  ersion */.  "ech
1060: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  o",             
1070: 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
1080: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a0: 2f 2a 20 70 41 75 78 20 2a 2f 0a 20 20 65 63 68  /* pAux */.  ech
10b0: 6f 43 72 65 61 74 65 2c 0a 20 20 65 63 68 6f 43  oCreate,.  echoC
10c0: 6f 6e 6e 65 63 74 2c 0a 20 20 65 63 68 6f 42 65  onnect,.  echoBe
10d0: 73 74 49 6e 64 65 78 2c 0a 20 20 65 63 68 6f 44  stIndex,.  echoD
10e0: 69 73 63 6f 6e 6e 65 63 74 2c 20 0a 20 20 65 63  isconnect, .  ec
10f0: 68 6f 44 65 73 74 72 6f 79 2c 0a 7d 3b 0a 0a 2f  hoDestroy,.};../
1100: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f  *.** Decode a po
1110: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
1120: 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  te3 object..*/.s
1130: 74 61 74 69 63 20 69 6e 74 20 67 65 74 44 62 50  tatic int getDbP
1140: 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72  ointer(Tcl_Inter
1150: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74  p *interp, const
1160: 20 63 68 61 72 20 2a 7a 41 2c 20 73 71 6c 69 74   char *zA, sqlit
1170: 65 33 20 2a 2a 70 70 44 62 29 7b 0a 20 20 2a 70  e3 **ppDb){.  *p
1180: 70 44 62 20 3d 20 28 73 71 6c 69 74 65 33 2a 29  pDb = (sqlite3*)
1190: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
11a0: 28 7a 41 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (zA);.  return T
11b0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
11c0: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 65 63   Register the ec
11d0: 68 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ho virtual table
11e0: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
11f0: 69 63 20 69 6e 74 20 72 65 67 69 73 74 65 72 5f  ic int register_
1200: 65 63 68 6f 5f 6d 6f 64 75 6c 65 28 0a 20 20 43  echo_module(.  C
1210: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
1220: 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
1230: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
1240: 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
1250: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1260: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1270: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1280: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1290: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
12a0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
12b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12c0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
12d0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
12e0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
12f0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
1300: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1310: 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63   *db;.  if( objc
1320: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1330: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1340: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
1350: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1360: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1370: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1380: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1390: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
13a0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
13b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 65 63 68 6f  CL_ERROR;.  echo
13c0: 4d 6f 64 75 6c 65 2e 70 41 75 78 20 3d 20 69 6e  Module.pAux = in
13d0: 74 65 72 70 3b 0a 23 69 66 6e 64 65 66 20 53 51  terp;.#ifndef SQ
13e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13f0: 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
1400: 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64  _create_module(d
1410: 62 2c 20 22 65 63 68 6f 22 2c 20 26 65 63 68 6f  b, "echo", &echo
1420: 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
1430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1440: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
1450: 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74  ter commands wit
1460: 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
1470: 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71  reter..*/.int Sq
1480: 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54  litetest8_Init(T
1490: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14a0: 70 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  p){.  static str
14b0: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
14c0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
14d0: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
14e0: 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63  oc;.     void *c
14f0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61  lientData;.  } a
1500: 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
1510: 20 20 7b 20 22 72 65 67 69 73 74 65 72 5f 65 63    { "register_ec
1520: 68 6f 5f 6d 6f 64 75 6c 65 22 2c 20 20 20 72 65  ho_module",   re
1530: 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75  gister_echo_modu
1540: 6c 65 2c 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20  le, 0 },.  };.  
1550: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1560: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43  ; i<sizeof(aObjC
1570: 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43  md)/sizeof(aObjC
1580: 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
1590: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15a0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
15b0: 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  ObjCmd[i].zName,
15c0: 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d   .        aObjCm
15d0: 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a  d[i].xProc, aObj
15e0: 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74  Cmd[i].clientDat
15f0: 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a, 0);.  }.  ret
1600: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a        urn TCL_OK;.}.