/ Hex Artifact Content
Login

Artifact df9fe1213c2634687a9ca0b0bec0d2119d359ae3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 36 20 4a 75 6e 65 20  /*.** 2006 June 
0010: 31 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  13.**.** 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 54 68 65 20 65  ary..**.** The e
0220: 6d 70 68 61 73 69 73 20 6f 66 20 74 68 69 73 20  mphasis of this 
0230: 66 69 6c 65 20 69 73 20 61 20 76 69 72 74 75 61  file is a virtua
0240: 6c 20 74 61 62 6c 65 20 74 68 61 74 20 70 72 6f  l table that pro
0250: 76 69 64 65 73 0a 2a 2a 20 61 63 63 65 73 73 20  vides.** access 
0260: 74 6f 20 54 43 4c 20 76 61 72 69 61 62 6c 65 73  to TCL variables
0270: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0280: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20  qliteInt.h".#if 
0290: 64 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f  defined(INCLUDE_
02a0: 53 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20  SQLITE_TCL_H).# 
02b0: 20 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65   include "sqlite
02c0: 5f 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20  _tcl.h".#else.# 
02d0: 20 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22   include "tcl.h"
02e0: 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65  .#endif.#include
02f0: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0300: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0310: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0320: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
0330: 45 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 72 61 63 74  E../*.** Charact
0340: 65 72 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ers that make up
0350: 20 74 68 65 20 69 64 78 53 74 72 20 63 72 65 61   the idxStr crea
0360: 74 65 64 20 62 79 20 78 42 65 73 74 49 6e 64 65  ted by xBestInde
0370: 78 20 66 6f 72 20 78 46 69 6c 74 65 72 2e 0a 2a  x for xFilter..*
0380: 2f 0a 23 64 65 66 69 6e 65 20 54 43 4c 56 41 52  /.#define TCLVAR
0390: 5f 4e 41 4d 45 5f 45 51 20 20 20 20 20 20 27 65  _NAME_EQ      'e
03a0: 27 0a 23 64 65 66 69 6e 65 20 54 43 4c 56 41 52  '.#define TCLVAR
03b0: 5f 4e 41 4d 45 5f 4d 41 54 43 48 20 20 20 27 6d  _NAME_MATCH   'm
03c0: 27 0a 23 64 65 66 69 6e 65 20 54 43 4c 56 41 52  '.#define TCLVAR
03d0: 5f 56 41 4c 55 45 5f 47 4c 4f 42 20 20 20 27 67  _VALUE_GLOB   'g
03e0: 27 0a 23 64 65 66 69 6e 65 20 54 43 4c 56 41 52  '.#define TCLVAR
03f0: 5f 56 41 4c 55 45 5f 52 45 47 45 58 50 20 27 72  _VALUE_REGEXP 'r
0400: 27 0a 23 64 65 66 69 6e 65 20 54 43 4c 56 41 52  '.#define TCLVAR
0410: 5f 56 41 4c 55 45 5f 4c 49 4b 45 20 20 20 27 6c  _VALUE_LIKE   'l
0420: 27 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  '..typedef struc
0430: 74 20 74 63 6c 76 61 72 5f 76 74 61 62 20 74 63  t tclvar_vtab tc
0440: 6c 76 61 72 5f 76 74 61 62 3b 0a 74 79 70 65 64  lvar_vtab;.typed
0450: 65 66 20 73 74 72 75 63 74 20 74 63 6c 76 61 72  ef struct tclvar
0460: 5f 63 75 72 73 6f 72 20 74 63 6c 76 61 72 5f 63  _cursor tclvar_c
0470: 75 72 73 6f 72 3b 0a 0a 2f 2a 20 0a 2a 2a 20 41  ursor;../* .** A
0480: 20 74 63 6c 76 61 72 20 76 69 72 74 75 61 6c 2d   tclvar virtual-
0490: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2f  table object .*/
04a0: 0a 73 74 72 75 63 74 20 74 63 6c 76 61 72 5f 76  .struct tclvar_v
04b0: 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tab {.  sqlite3_
04c0: 76 74 61 62 20 62 61 73 65 3b 0a 20 20 54 63 6c  vtab base;.  Tcl
04d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
04e0: 0a 7d 3b 0a 0a 2f 2a 20 41 20 74 63 6c 76 61 72  .};../* A tclvar
04f0: 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   cursor object *
0500: 2f 0a 73 74 72 75 63 74 20 74 63 6c 76 61 72 5f  /.struct tclvar_
0510: 63 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  cursor {.  sqlit
0520: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
0530: 61 73 65 3b 0a 0a 20 20 54 63 6c 5f 4f 62 6a 20  ase;..  Tcl_Obj 
0540: 2a 70 4c 69 73 74 31 3b 20 20 20 20 20 2f 2a 20  *pList1;     /* 
0550: 52 65 73 75 6c 74 20 6f 66 20 5b 69 6e 66 6f 20  Result of [info 
0560: 76 61 72 73 20 3f 70 61 74 74 65 72 6e 3f 5d 20  vars ?pattern?] 
0570: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4c  */.  Tcl_Obj *pL
0580: 69 73 74 32 3b 20 20 20 20 20 2f 2a 20 52 65 73  ist2;     /* Res
0590: 75 6c 74 20 6f 66 20 5b 61 72 72 61 79 20 6e 61  ult of [array na
05a0: 6d 65 73 20 5b 6c 69 6e 64 65 78 20 24 70 4c 69  mes [lindex $pLi
05b0: 73 74 31 20 24 69 31 5d 5d 20 2a 2f 0a 20 20 69  st1 $i1]] */.  i
05c0: 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20 20 20  nt i1;          
05d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69      /* Current i
05e0: 74 65 6d 20 69 6e 20 70 4c 69 73 74 31 20 2a 2f  tem in pList1 */
05f0: 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20  .  int i2;      
0600: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
0610: 6e 74 20 69 74 65 6d 20 28 69 66 20 61 6e 79 29  nt item (if any)
0620: 20 69 6e 20 70 4c 69 73 74 32 20 2a 2f 0a 7d 3b   in pList2 */.};
0630: 0a 0a 2f 2a 20 4d 65 74 68 6f 64 73 20 66 6f 72  ../* Methods for
0640: 20 74 68 65 20 74 63 6c 76 61 72 20 6d 6f 64 75   the tclvar modu
0650: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
0660: 20 74 63 6c 76 61 72 43 6f 6e 6e 65 63 74 28 0a   tclvarConnect(.
0670: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
0680: 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
0690: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
06a0: 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
06b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
06c0: 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72  **ppVtab,.  char
06d0: 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 74 63   **pzErr.){.  tc
06e0: 6c 76 61 72 5f 76 74 61 62 20 2a 70 56 74 61 62  lvar_vtab *pVtab
06f0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0700: 20 63 68 61 72 20 7a 53 63 68 65 6d 61 5b 5d 20   char zSchema[] 
0710: 3d 20 0a 20 20 20 20 20 22 43 52 45 41 54 45 20  = .     "CREATE 
0720: 54 41 42 4c 45 20 77 68 61 74 65 76 65 72 28 6e  TABLE whatever(n
0730: 61 6d 65 20 54 45 58 54 2c 20 61 72 72 61 79 6e  ame TEXT, arrayn
0740: 61 6d 65 20 54 45 58 54 2c 20 76 61 6c 75 65 20  ame TEXT, value 
0750: 54 45 58 54 29 22 3b 0a 20 20 70 56 74 61 62 20  TEXT)";.  pVtab 
0760: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
0770: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 56 74  ero( sizeof(*pVt
0780: 61 62 29 20 29 3b 0a 20 20 69 66 28 20 70 56 74  ab) );.  if( pVt
0790: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ab==0 ) return S
07a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 2a  QLITE_NOMEM;.  *
07b0: 70 70 56 74 61 62 20 3d 20 26 70 56 74 61 62 2d  ppVtab = &pVtab-
07c0: 3e 62 61 73 65 3b 0a 20 20 70 56 74 61 62 2d 3e  >base;.  pVtab->
07d0: 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e  interp = (Tcl_In
07e0: 74 65 72 70 20 2a 29 70 41 75 78 3b 0a 20 20 73  terp *)pAux;.  s
07f0: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
0800: 74 61 62 28 64 62 2c 20 7a 53 63 68 65 6d 61 29  tab(db, zSchema)
0810: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
0820: 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 20 4e 6f 74 65 20  E_OK;.}./* Note 
0830: 74 68 61 74 20 66 6f 72 20 74 68 69 73 20 76 69  that for this vi
0840: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65  rtual table, the
0850: 20 78 43 72 65 61 74 65 20 61 6e 64 20 78 43 6f   xCreate and xCo
0860: 6e 6e 65 63 74 0a 2a 2a 20 6d 65 74 68 6f 64 73  nnect.** methods
0870: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
0880: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  */..static int t
0890: 63 6c 76 61 72 44 69 73 63 6f 6e 6e 65 63 74 28  clvarDisconnect(
08a0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
08b0: 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tab){.  sqlite3_
08c0: 66 72 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72  free(pVtab);.  r
08d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
08e0: 0a 7d 0a 2f 2a 20 54 68 65 20 78 44 69 73 63 6f  .}./* The xDisco
08f0: 6e 6e 65 63 74 20 61 6e 64 20 78 44 65 73 74 72  nnect and xDestr
0900: 6f 79 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61  oy methods are a
0910: 6c 73 6f 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  lso the same */.
0920: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
0930: 77 20 74 63 6c 76 61 72 20 63 75 72 73 6f 72 2e  w tclvar cursor.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
0950: 63 6c 76 61 72 4f 70 65 6e 28 73 71 6c 69 74 65  clvarOpen(sqlite
0960: 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73  3_vtab *pVTab, s
0970: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
0980: 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a  or **ppCursor){.
0990: 20 20 74 63 6c 76 61 72 5f 63 75 72 73 6f 72 20    tclvar_cursor 
09a0: 2a 70 43 75 72 3b 0a 20 20 70 43 75 72 20 3d 20  *pCur;.  pCur = 
09b0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
09c0: 6f 28 73 69 7a 65 6f 66 28 74 63 6c 76 61 72 5f  o(sizeof(tclvar_
09d0: 63 75 72 73 6f 72 29 29 3b 0a 20 20 2a 70 70 43  cursor));.  *ppC
09e0: 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62  ursor = &pCur->b
09f0: 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ase;.  return SQ
0a00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
0a10: 2a 20 43 6c 6f 73 65 20 61 20 74 63 6c 76 61 72  * Close a tclvar
0a20: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
0a30: 69 63 20 69 6e 74 20 74 63 6c 76 61 72 43 6c 6f  ic int tclvarClo
0a40: 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  se(sqlite3_vtab_
0a50: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
0a60: 74 63 6c 76 61 72 5f 63 75 72 73 6f 72 20 2a 70  tclvar_cursor *p
0a70: 43 75 72 20 3d 20 28 74 63 6c 76 61 72 5f 63 75  Cur = (tclvar_cu
0a80: 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 69 66  rsor *)cur;.  if
0a90: 28 20 70 43 75 72 2d 3e 70 4c 69 73 74 31 20 29  ( pCur->pList1 )
0aa0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
0ab0: 66 43 6f 75 6e 74 28 70 43 75 72 2d 3e 70 4c 69  fCount(pCur->pLi
0ac0: 73 74 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  st1);.  }.  if( 
0ad0: 70 43 75 72 2d 3e 70 4c 69 73 74 32 20 29 7b 0a  pCur->pList2 ){.
0ae0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
0af0: 6f 75 6e 74 28 70 43 75 72 2d 3e 70 4c 69 73 74  ount(pCur->pList
0b00: 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  2);.  }.  sqlite
0b10: 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a 20 20  3_free(pCur);.  
0b20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0b30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0b40: 6e 73 20 31 20 69 66 20 64 61 74 61 20 69 73 20  ns 1 if data is 
0b50: 72 65 61 64 79 2c 20 6f 72 20 30 20 69 66 20 6e  ready, or 0 if n
0b60: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
0b70: 74 20 6e 65 78 74 32 28 54 63 6c 5f 49 6e 74 65  t next2(Tcl_Inte
0b80: 72 70 20 2a 69 6e 74 65 72 70 2c 20 74 63 6c 76  rp *interp, tclv
0b90: 61 72 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 2c  ar_cursor *pCur,
0ba0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 29 7b   Tcl_Obj *pObj){
0bb0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b 0a 0a  .  Tcl_Obj *p;..
0bc0: 20 20 69 66 28 20 70 4f 62 6a 20 29 7b 0a 20 20    if( pObj ){.  
0bd0: 20 20 69 66 28 20 21 70 43 75 72 2d 3e 70 4c 69    if( !pCur->pLi
0be0: 73 74 32 20 29 7b 0a 20 20 20 20 20 20 70 20 3d  st2 ){.      p =
0bf0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
0c00: 6a 28 22 61 72 72 61 79 20 6e 61 6d 65 73 22 2c  j("array names",
0c10: 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f   -1);.      Tcl_
0c20: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b  IncrRefCount(p);
0c30: 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
0c40: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
0c50: 30 2c 20 70 2c 20 70 4f 62 6a 29 3b 0a 20 20 20  0, p, pObj);.   
0c60: 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78     Tcl_EvalObjEx
0c70: 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 43 4c 5f  (interp, p, TCL_
0c80: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
0c90: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
0ca0: 6f 75 6e 74 28 70 29 3b 0a 20 20 20 20 20 20 70  ount(p);.      p
0cb0: 43 75 72 2d 3e 70 4c 69 73 74 32 20 3d 20 54 63  Cur->pList2 = Tc
0cc0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
0cd0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54 63  nterp);.      Tc
0ce0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
0cf0: 43 75 72 2d 3e 70 4c 69 73 74 32 29 3b 0a 20 20  Cur->pList2);.  
0d00: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
0d10: 2d 3e 69 32 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ->i2==0 );.    }
0d20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
0d30: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75  n = 0;.      pCu
0d40: 72 2d 3e 69 32 2b 2b 3b 0a 20 20 20 20 20 20 54  r->i2++;.      T
0d50: 63 6c 5f 4c 69 73 74 4f 62 6a 4c 65 6e 67 74 68  cl_ListObjLength
0d60: 28 30 2c 20 70 43 75 72 2d 3e 70 4c 69 73 74 32  (0, pCur->pList2
0d70: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  , &n);.      if(
0d80: 20 70 43 75 72 2d 3e 69 32 3e 3d 6e 20 29 7b 0a   pCur->i2>=n ){.
0d90: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
0da0: 52 65 66 43 6f 75 6e 74 28 70 43 75 72 2d 3e 70  RefCount(pCur->p
0db0: 4c 69 73 74 32 29 3b 0a 20 20 20 20 20 20 20 20  List2);.        
0dc0: 70 43 75 72 2d 3e 70 4c 69 73 74 32 20 3d 20 30  pCur->pList2 = 0
0dd0: 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
0de0: 69 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  i2 = 0;.        
0df0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
0e00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
0e10: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74  eturn 1;.}..stat
0e20: 69 63 20 69 6e 74 20 74 63 6c 76 61 72 4e 65 78  ic int tclvarNex
0e30: 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  t(sqlite3_vtab_c
0e40: 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 54  ursor *cur){.  T
0e50: 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20  cl_Obj *pObj;.  
0e60: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  int n = 0;.  int
0e70: 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 74 63 6c 76   ok = 0;..  tclv
0e80: 61 72 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  ar_cursor *pCur 
0e90: 3d 20 28 74 63 6c 76 61 72 5f 63 75 72 73 6f 72  = (tclvar_cursor
0ea0: 20 2a 29 63 75 72 3b 0a 20 20 54 63 6c 5f 49 6e   *)cur;.  Tcl_In
0eb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 28  terp *interp = (
0ec0: 28 74 63 6c 76 61 72 5f 76 74 61 62 20 2a 29 28  (tclvar_vtab *)(
0ed0: 63 75 72 2d 3e 70 56 74 61 62 29 29 2d 3e 69 6e  cur->pVtab))->in
0ee0: 74 65 72 70 3b 0a 0a 20 20 54 63 6c 5f 4c 69 73  terp;..  Tcl_Lis
0ef0: 74 4f 62 6a 4c 65 6e 67 74 68 28 30 2c 20 70 43  tObjLength(0, pC
0f00: 75 72 2d 3e 70 4c 69 73 74 31 2c 20 26 6e 29 3b  ur->pList1, &n);
0f10: 0a 20 20 77 68 69 6c 65 28 20 21 6f 6b 20 26 26  .  while( !ok &&
0f20: 20 70 43 75 72 2d 3e 69 31 3c 6e 20 29 7b 0a 20   pCur->i1<n ){. 
0f30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e     Tcl_ListObjIn
0f40: 64 65 78 28 30 2c 20 70 43 75 72 2d 3e 70 4c 69  dex(0, pCur->pLi
0f50: 73 74 31 2c 20 70 43 75 72 2d 3e 69 31 2c 20 26  st1, pCur->i1, &
0f60: 70 4f 62 6a 29 3b 0a 20 20 20 20 6f 6b 20 3d 20  pObj);.    ok = 
0f70: 6e 65 78 74 32 28 69 6e 74 65 72 70 2c 20 70 43  next2(interp, pC
0f80: 75 72 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20 69  ur, pObj);.    i
0f90: 66 28 20 21 6f 6b 20 29 7b 0a 20 20 20 20 20 20  f( !ok ){.      
0fa0: 70 43 75 72 2d 3e 69 31 2b 2b 3b 0a 20 20 20 20  pCur->i1++;.    
0fb0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
0fc0: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
0fd0: 20 74 63 6c 76 61 72 46 69 6c 74 65 72 28 0a 20   tclvarFilter(. 
0fe0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
0ff0: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
1000: 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
1010: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
1020: 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
1030: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
1040: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 63 6c 76  **argv.){.  tclv
1050: 61 72 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  ar_cursor *pCur 
1060: 3d 20 28 74 63 6c 76 61 72 5f 63 75 72 73 6f 72  = (tclvar_cursor
1070: 20 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a   *)pVtabCursor;.
1080: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1090: 74 65 72 70 20 3d 20 28 28 74 63 6c 76 61 72 5f  terp = ((tclvar_
10a0: 76 74 61 62 20 2a 29 28 70 56 74 61 62 43 75 72  vtab *)(pVtabCur
10b0: 73 6f 72 2d 3e 70 56 74 61 62 29 29 2d 3e 69 6e  sor->pVtab))->in
10c0: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
10d0: 2a 70 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  *p = Tcl_NewStri
10e0: 6e 67 4f 62 6a 28 22 74 63 6c 76 61 72 5f 66 69  ngObj("tclvar_fi
10f0: 6c 74 65 72 5f 63 6d 64 22 2c 20 2d 31 29 3b 0a  lter_cmd", -1);.
1100: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1110: 45 71 20 3d 20 22 22 3b 0a 20 20 63 6f 6e 73 74  Eq = "";.  const
1120: 20 63 68 61 72 20 2a 7a 4d 61 74 63 68 20 3d 20   char *zMatch = 
1130: 22 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  "";.  const char
1140: 20 2a 7a 47 6c 6f 62 20 3d 20 22 22 3b 0a 20 20   *zGlob = "";.  
1150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 67  const char *zReg
1160: 65 78 70 20 3d 20 22 22 3b 0a 20 20 63 6f 6e 73  exp = "";.  cons
1170: 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20  t char *zLike = 
1180: 22 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  "";.  int i;..  
1190: 66 6f 72 28 69 3d 30 3b 20 69 64 78 53 74 72 5b  for(i=0; idxStr[
11a0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77  i]; i++){.    sw
11b0: 69 74 63 68 28 20 69 64 78 53 74 72 5b 69 5d 20  itch( idxStr[i] 
11c0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 43  ){.      case TC
11d0: 4c 56 41 52 5f 4e 41 4d 45 5f 45 51 3a 0a 20 20  LVAR_NAME_EQ:.  
11e0: 20 20 20 20 20 20 7a 45 71 20 3d 20 28 63 6f 6e        zEq = (con
11f0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1200: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
1210: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72  [i]);.        br
1220: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
1230: 54 43 4c 56 41 52 5f 4e 41 4d 45 5f 4d 41 54 43  TCLVAR_NAME_MATC
1240: 48 3a 0a 20 20 20 20 20 20 20 20 7a 4d 61 74 63  H:.        zMatc
1250: 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  h = (const char*
1260: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1270: 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  ext(argv[i]);.  
1280: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1290: 20 20 20 63 61 73 65 20 54 43 4c 56 41 52 5f 56     case TCLVAR_V
12a0: 41 4c 55 45 5f 47 4c 4f 42 3a 0a 20 20 20 20 20  ALUE_GLOB:.     
12b0: 20 20 20 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73     zGlob = (cons
12c0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
12d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
12e0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  i]);.        bre
12f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54  ak;.      case T
1300: 43 4c 56 41 52 5f 56 41 4c 55 45 5f 52 45 47 45  CLVAR_VALUE_REGE
1310: 58 50 3a 0a 20 20 20 20 20 20 20 20 7a 52 65 67  XP:.        zReg
1320: 65 78 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  exp = (const cha
1330: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1340: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a  _text(argv[i]);.
1350: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1360: 20 20 20 20 20 63 61 73 65 20 54 43 4c 56 41 52       case TCLVAR
1370: 5f 56 41 4c 55 45 5f 4c 49 4b 45 3a 0a 20 20 20  _VALUE_LIKE:.   
1380: 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 28 63 6f       zLike = (co
1390: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
13a0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
13b0: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 62  v[i]);.        b
13c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
13d0: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
13e0: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
13f0: 20 20 7d 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52    }..  Tcl_IncrR
1400: 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20 54 63  efCount(p);.  Tc
1410: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1420: 6c 65 6d 65 6e 74 28 30 2c 20 70 2c 20 54 63 6c  lement(0, p, Tcl
1430: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45  _NewStringObj(zE
1440: 71 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  q, -1));.  Tcl_L
1450: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1460: 65 6e 74 28 30 2c 20 70 2c 20 54 63 6c 5f 4e 65  ent(0, p, Tcl_Ne
1470: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 61 74 63  wStringObj(zMatc
1480: 68 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  h, -1));.  Tcl_L
1490: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14a0: 65 6e 74 28 30 2c 20 70 2c 20 54 63 6c 5f 4e 65  ent(0, p, Tcl_Ne
14b0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 47 6c 6f 62  wStringObj(zGlob
14c0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
14d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14e0: 6e 74 28 30 2c 20 70 2c 20 54 63 6c 5f 4e 65 77  nt(0, p, Tcl_New
14f0: 53 74 72 69 6e 67 4f 62 6a 28 7a 52 65 67 65 78  StringObj(zRegex
1500: 70 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  p, -1));.  Tcl_L
1510: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1520: 65 6e 74 28 30 2c 20 70 2c 20 54 63 6c 5f 4e 65  ent(0, p, Tcl_Ne
1530: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4c 69 6b 65  wStringObj(zLike
1540: 2c 20 2d 31 29 29 3b 0a 0a 20 20 54 63 6c 5f 45  , -1));..  Tcl_E
1550: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
1560: 20 70 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f   p, TCL_EVAL_GLO
1570: 42 41 4c 29 3b 0a 20 20 69 66 28 20 70 43 75 72  BAL);.  if( pCur
1580: 2d 3e 70 4c 69 73 74 31 20 29 7b 0a 20 20 20 20  ->pList1 ){.    
1590: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
15a0: 28 70 43 75 72 2d 3e 70 4c 69 73 74 31 29 3b 0a  (pCur->pList1);.
15b0: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
15c0: 70 4c 69 73 74 32 20 29 7b 0a 20 20 20 20 54 63  pList2 ){.    Tc
15d0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
15e0: 43 75 72 2d 3e 70 4c 69 73 74 32 29 3b 0a 20 20  Cur->pList2);.  
15f0: 20 20 70 43 75 72 2d 3e 70 4c 69 73 74 32 20 3d    pCur->pList2 =
1600: 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e   0;.  }.  pCur->
1610: 69 31 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  i1 = 0;.  pCur->
1620: 69 32 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  i2 = 0;.  pCur->
1630: 70 4c 69 73 74 31 20 3d 20 54 63 6c 5f 47 65 74  pList1 = Tcl_Get
1640: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1650: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
1660: 43 6f 75 6e 74 28 70 43 75 72 2d 3e 70 4c 69 73  Count(pCur->pLis
1670: 74 31 29 3b 0a 0a 20 20 54 63 6c 5f 44 65 63 72  t1);..  Tcl_Decr
1680: 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20 72  RefCount(p);.  r
1690: 65 74 75 72 6e 20 74 63 6c 76 61 72 4e 65 78 74  eturn tclvarNext
16a0: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d  (pVtabCursor);.}
16b0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c  ..static int tcl
16c0: 76 61 72 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  varColumn(sqlite
16d0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
16e0: 75 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ur, sqlite3_cont
16f0: 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69 29  ext *ctx, int i)
1700: 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 31 3b  {.  Tcl_Obj *p1;
1710: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 32 3b 0a  .  Tcl_Obj *p2;.
1720: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
1730: 3b 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ; .  const char 
1740: 2a 7a 32 20 3d 20 22 22 3b 0a 20 20 74 63 6c 76  *z2 = "";.  tclv
1750: 61 72 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  ar_cursor *pCur 
1760: 3d 20 28 74 63 6c 76 61 72 5f 63 75 72 73 6f 72  = (tclvar_cursor
1770: 2a 29 63 75 72 3b 0a 20 20 54 63 6c 5f 49 6e 74  *)cur;.  Tcl_Int
1780: 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 28 28  erp *interp = ((
1790: 74 63 6c 76 61 72 5f 76 74 61 62 20 2a 29 63 75  tclvar_vtab *)cu
17a0: 72 2d 3e 70 56 74 61 62 29 2d 3e 69 6e 74 65 72  r->pVtab)->inter
17b0: 70 3b 0a 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  p;..  Tcl_ListOb
17c0: 6a 49 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 70  jIndex(interp, p
17d0: 43 75 72 2d 3e 70 4c 69 73 74 31 2c 20 70 43 75  Cur->pList1, pCu
17e0: 72 2d 3e 69 31 2c 20 26 70 31 29 3b 0a 20 20 54  r->i1, &p1);.  T
17f0: 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28  cl_ListObjIndex(
1800: 69 6e 74 65 72 70 2c 20 70 43 75 72 2d 3e 70 4c  interp, pCur->pL
1810: 69 73 74 32 2c 20 70 43 75 72 2d 3e 69 32 2c 20  ist2, pCur->i2, 
1820: 26 70 32 29 3b 0a 20 20 7a 31 20 3d 20 54 63 6c  &p2);.  z1 = Tcl
1830: 5f 47 65 74 53 74 72 69 6e 67 28 70 31 29 3b 0a  _GetString(p1);.
1840: 20 20 69 66 28 20 70 32 20 29 7b 0a 20 20 20 20    if( p2 ){.    
1850: 7a 32 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  z2 = Tcl_GetStri
1860: 6e 67 28 70 32 29 3b 0a 20 20 7d 0a 20 20 73 77  ng(p2);.  }.  sw
1870: 69 74 63 68 20 28 69 29 20 7b 0a 20 20 20 20 63  itch (i) {.    c
1880: 61 73 65 20 30 3a 20 7b 0a 20 20 20 20 20 20 73  ase 0: {.      s
1890: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
18a0: 78 74 28 63 74 78 2c 20 7a 31 2c 20 2d 31 2c 20  xt(ctx, z1, -1, 
18b0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
18c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
18e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
18f0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
1900: 78 2c 20 7a 32 2c 20 2d 31 2c 20 53 51 4c 49 54  x, z2, -1, SQLIT
1910: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
1920: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1930: 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 0a 20  .    case 2: {. 
1940: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
1950: 61 6c 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  al = Tcl_GetVar2
1960: 45 78 28 69 6e 74 65 72 70 2c 20 7a 31 2c 20 2a  Ex(interp, z1, *
1970: 7a 32 3f 7a 32 3a 30 2c 20 54 43 4c 5f 47 4c 4f  z2?z2:0, TCL_GLO
1980: 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
1990: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
19a0: 74 65 78 74 28 63 74 78 2c 20 54 63 6c 5f 47 65  text(ctx, Tcl_Ge
19b0: 74 53 74 72 69 6e 67 28 70 56 61 6c 29 2c 20 2d  tString(pVal), -
19c0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
19d0: 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ENT);.      brea
19e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
19f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a00: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
1a10: 63 6c 76 61 72 52 6f 77 69 64 28 73 71 6c 69 74  clvarRowid(sqlit
1a20: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1a30: 63 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  cur, sqlite_int6
1a40: 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 2a 70  4 *pRowid){.  *p
1a50: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74  Rowid = 0;.  ret
1a60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a70: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c  ..static int tcl
1a80: 76 61 72 45 6f 66 28 73 71 6c 69 74 65 33 5f 76  varEof(sqlite3_v
1a90: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
1aa0: 7b 0a 20 20 74 63 6c 76 61 72 5f 63 75 72 73 6f  {.  tclvar_curso
1ab0: 72 20 2a 70 43 75 72 20 3d 20 28 74 63 6c 76 61  r *pCur = (tclva
1ac0: 72 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  r_cursor*)cur;. 
1ad0: 20 72 65 74 75 72 6e 20 28 70 43 75 72 2d 3e 70   return (pCur->p
1ae0: 4c 69 73 74 32 3f 30 3a 31 29 3b 0a 7d 0a 0a 2f  List2?0:1);.}../
1af0: 2a 0a 2a 2a 20 49 66 20 6e 75 6c 2d 74 65 72 6d  *.** If nul-term
1b00: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 7a 53  inated string zS
1b10: 74 72 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  tr does not alre
1b20: 61 64 79 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ady contain the 
1b30: 63 68 61 72 61 63 74 65 72 20 0a 2a 2a 20 70 61  character .** pa
1b40: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1b50: 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 61 70 70  nd argument, app
1b60: 65 6e 64 20 69 74 20 61 6e 64 20 72 65 74 75 72  end it and retur
1b70: 6e 20 30 2e 20 4f 72 2c 20 69 66 20 74 68 65 72  n 0. Or, if ther
1b80: 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
1b90: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 78  an instance of x
1ba0: 20 69 6e 20 7a 53 74 72 2c 20 64 6f 20 6e 6f 74   in zStr, do not
1bb0: 68 69 6e 67 20 72 65 74 75 72 6e 20 31 3b 0a 2a  hing return 1;.*
1bc0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 67 75  *.** There is gu
1bd0: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 65  aranteed to be e
1be0: 6e 6f 75 67 68 20 72 6f 6f 6d 20 69 6e 20 74 68  nough room in th
1bf0: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
1c00: 20 74 6f 20 62 79 20 7a 53 74 72 0a 2a 2a 20 66   to by zStr.** f
1c10: 6f 72 20 74 68 65 20 6e 65 77 20 63 68 61 72 61  or the new chara
1c20: 63 74 65 72 20 61 6e 64 20 6e 75 6c 2d 74 65 72  cter and nul-ter
1c30: 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
1c40: 69 63 20 69 6e 74 20 74 63 6c 76 61 72 41 64 64  ic int tclvarAdd
1c50: 54 6f 49 64 78 73 74 72 28 63 68 61 72 20 2a 7a  ToIdxstr(char *z
1c60: 53 74 72 2c 20 63 68 61 72 20 78 29 7b 0a 20 20  Str, char x){.  
1c70: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1c80: 3b 20 7a 53 74 72 5b 69 5d 3b 20 69 2b 2b 29 7b  ; zStr[i]; i++){
1c90: 0a 20 20 20 20 69 66 28 20 7a 53 74 72 5b 69 5d  .    if( zStr[i]
1ca0: 3d 3d 78 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==x ) return 1;.
1cb0: 20 20 7d 0a 20 20 7a 53 74 72 5b 69 5d 20 3d 20    }.  zStr[i] = 
1cc0: 78 3b 0a 20 20 7a 53 74 72 5b 69 2b 31 5d 20 3d  x;.  zStr[i+1] =
1cd0: 20 27 5c 30 27 3b 0a 20 20 72 65 74 75 72 6e 20   '\0';.  return 
1ce0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1cf0: 72 6e 20 74 72 75 65 20 69 66 20 76 61 72 69 61  rn true if varia
1d00: 62 6c 65 20 24 3a 3a 74 63 6c 76 61 72 5f 73 65  ble $::tclvar_se
1d10: 74 5f 6f 6d 69 74 20 65 78 69 73 74 73 20 61 6e  t_omit exists an
1d20: 64 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  d is set to true
1d30: 2e 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72  ..** False other
1d40: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1d50: 69 6e 74 20 74 63 6c 76 61 72 53 65 74 4f 6d 69  int tclvarSetOmi
1d60: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1d70: 74 65 72 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  terp){.  int rc;
1d80: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a  .  int res = 0;.
1d90: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 3b    Tcl_Obj *pRes;
1da0: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
1db0: 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 22 65 78  (interp,.    "ex
1dc0: 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  pr {[info exists
1dd0: 20 3a 3a 74 63 6c 76 61 72 5f 73 65 74 5f 6f 6d   ::tclvar_set_om
1de0: 69 74 5d 20 26 26 20 24 3a 3a 74 63 6c 76 61 72  it] && $::tclvar
1df0: 5f 73 65 74 5f 6f 6d 69 74 7d 22 0a 20 20 29 3b  _set_omit}".  );
1e00: 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f  .  if( rc==TCL_O
1e10: 4b 20 29 7b 0a 20 20 20 20 70 52 65 73 20 3d 20  K ){.    pRes = 
1e20: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
1e30: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 63  (interp);.    rc
1e40: 20 3d 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61   = Tcl_GetBoolea
1e50: 6e 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 52 65 73  nFromObj(0, pRes
1e60: 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 72  , &res);.  }.  r
1e70: 65 74 75 72 6e 20 28 72 63 3d 3d 54 43 4c 5f 4f  eturn (rc==TCL_O
1e80: 4b 20 26 26 20 72 65 73 29 3b 0a 7d 0a 0a 2f 2a  K && res);.}../*
1e90: 0a 2a 2a 20 54 68 65 20 78 42 65 73 74 49 6e 64  .** The xBestInd
1ea0: 65 78 28 29 20 6d 65 74 68 6f 64 2e 20 54 68 69  ex() method. Thi
1eb0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
1ec0: 73 75 70 70 6f 72 74 73 20 74 68 65 20 66 6f 6c  supports the fol
1ed0: 6c 6f 77 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  lowing.** operat
1ee0: 6f 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6e  ors:.**.**     n
1ef0: 61 6d 65 20 3d 20 3f 20 20 20 20 20 20 20 20 20  ame = ?         
1f00: 20 20 20 20 20 20 20 20 20 20 20 28 6f 6d 69 74             (omit
1f10: 20 66 6c 61 67 20 63 6c 65 61 72 29 0a 2a 2a 20   flag clear).** 
1f20: 20 20 20 20 6e 61 6d 65 20 4d 41 54 43 48 20 3f      name MATCH ?
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 28 6f 6d 69 74 20 66 6c 61 67 20 73 65 74 29 0a  (omit flag set).
1f50: 2a 2a 20 20 20 20 20 76 61 6c 75 65 20 47 4c 4f  **     value GLO
1f60: 42 20 3f 20 20 20 20 20 20 20 20 20 20 20 20 20  B ?             
1f70: 20 20 20 28 6f 6d 69 74 20 66 6c 61 67 20 73 65     (omit flag se
1f80: 74 20 69 66 66 20 24 3a 3a 74 63 6c 76 61 72 5f  t iff $::tclvar_
1f90: 73 65 74 5f 6f 6d 69 74 29 0a 2a 2a 20 20 20 20  set_omit).**    
1fa0: 20 76 61 6c 75 65 20 52 45 47 45 58 50 20 3f 20   value REGEXP ? 
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 6d               (om
1fc0: 69 74 20 66 6c 61 67 20 73 65 74 20 69 66 66 20  it flag set iff 
1fd0: 24 3a 3a 74 63 6c 76 61 72 5f 73 65 74 5f 6f 6d  $::tclvar_set_om
1fe0: 69 74 29 0a 2a 2a 20 20 20 20 20 76 61 6c 75 65  it).**     value
1ff0: 20 4c 49 4b 45 20 3f 20 20 20 20 20 20 20 20 20   LIKE ?         
2000: 20 20 20 20 20 20 20 28 6f 6d 69 74 20 66 6c 61         (omit fla
2010: 67 20 73 65 74 20 69 66 66 20 24 3a 3a 74 63 6c  g set iff $::tcl
2020: 76 61 72 5f 73 65 74 5f 6f 6d 69 74 29 0a 2a 2a  var_set_omit).**
2030: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 63 6f 6e  .** For each con
2040: 73 74 72 61 69 6e 74 20 70 72 65 73 65 6e 74 2c  straint present,
2050: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2060: 6e 67 20 54 43 4c 56 41 52 5f 58 58 58 20 63 68  ng TCLVAR_XXX ch
2070: 61 72 61 63 74 65 72 20 69 73 0a 2a 2a 20 61 70  aracter is.** ap
2080: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 69 64  pended to the id
2090: 78 53 74 72 20 76 61 6c 75 65 2e 20 0a 2a 2f 0a  xStr value. .*/.
20a0: 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 76 61  static int tclva
20b0: 72 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  rBestIndex(sqlit
20c0: 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
20d0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
20e0: 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 74   *pIdxInfo){.  t
20f0: 63 6c 76 61 72 5f 76 74 61 62 20 2a 70 54 61 62  clvar_vtab *pTab
2100: 20 3d 20 28 74 63 6c 76 61 72 5f 76 74 61 62 2a   = (tclvar_vtab*
2110: 29 74 61 62 3b 0a 20 20 69 6e 74 20 69 69 3b 0a  )tab;.  int ii;.
2120: 20 20 63 68 61 72 20 2a 7a 53 74 72 20 3d 20 73    char *zStr = s
2130: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 33 32  qlite3_malloc(32
2140: 29 3b 0a 20 20 69 6e 74 20 69 53 74 72 20 3d 20  );.  int iStr = 
2150: 30 3b 0a 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d  0;..  if( zStr==
2160: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2170: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7a 53 74 72 5b  E_NOMEM;.  zStr[
2180: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 66 6f  0] = '\0';..  fo
2190: 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78 49  r(ii=0; ii<pIdxI
21a0: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
21b0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  ; ii++){.    str
21c0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
21d0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e  x_constraint con
21e0: 73 74 20 2a 70 43 6f 6e 73 20 3d 20 26 70 49 64  st *pCons = &pId
21f0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
2200: 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 73 74 72 75  nt[ii];.    stru
2210: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2220: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
2230: 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 20 20 0a  e *pUsage;.    .
2240: 20 20 20 20 70 55 73 61 67 65 20 3d 20 26 70 49      pUsage = &pI
2250: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2260: 69 6e 74 55 73 61 67 65 5b 69 69 5d 3b 0a 20 20  intUsage[ii];.  
2270: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 75 73 61    if( pCons->usa
2280: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ble ){.      /* 
2290: 6e 61 6d 65 20 3d 20 3f 20 2a 2f 0a 20 20 20 20  name = ? */.    
22a0: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d    if( pCons->op=
22b0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
22c0: 4e 53 54 52 41 49 4e 54 5f 45 51 20 26 26 20 70  NSTRAINT_EQ && p
22d0: 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  Cons->iColumn==0
22e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
22f0: 30 3d 3d 74 63 6c 76 61 72 41 64 64 54 6f 49 64  0==tclvarAddToId
2300: 78 73 74 72 28 7a 53 74 72 2c 20 54 43 4c 56 41  xstr(zStr, TCLVA
2310: 52 5f 4e 41 4d 45 5f 45 51 29 20 29 7b 0a 20 20  R_NAME_EQ) ){.  
2320: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 2d 3e          pUsage->
2330: 61 72 67 76 49 6e 64 65 78 20 3d 20 2b 2b 69 53  argvIndex = ++iS
2340: 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55  tr;.          pU
2350: 73 61 67 65 2d 3e 6f 6d 69 74 20 3d 20 30 3b 0a  sage->omit = 0;.
2360: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2370: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 6e 61 6d 65  }..      /* name
2380: 20 4d 41 54 43 48 20 3f 20 2a 2f 0a 20 20 20 20   MATCH ? */.    
2390: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d    if( pCons->op=
23a0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
23b0: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 26  NSTRAINT_MATCH &
23c0: 26 20 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e  & pCons->iColumn
23d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
23e0: 66 28 20 30 3d 3d 74 63 6c 76 61 72 41 64 64 54  f( 0==tclvarAddT
23f0: 6f 49 64 78 73 74 72 28 7a 53 74 72 2c 20 54 43  oIdxstr(zStr, TC
2400: 4c 56 41 52 5f 4e 41 4d 45 5f 4d 41 54 43 48 29  LVAR_NAME_MATCH)
2410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55   ){.          pU
2420: 73 61 67 65 2d 3e 61 72 67 76 49 6e 64 65 78 20  sage->argvIndex 
2430: 3d 20 2b 2b 69 53 74 72 3b 0a 20 20 20 20 20 20  = ++iStr;.      
2440: 20 20 20 20 70 55 73 61 67 65 2d 3e 6f 6d 69 74      pUsage->omit
2450: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2460: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2470: 2a 20 76 61 6c 75 65 20 47 4c 4f 42 20 3f 20 2a  * value GLOB ? *
2480: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  /.      if( pCon
2490: 73 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  s->op==SQLITE_IN
24a0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
24b0: 4c 4f 42 20 26 26 20 70 43 6f 6e 73 2d 3e 69 43  LOB && pCons->iC
24c0: 6f 6c 75 6d 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  olumn==2 ){.    
24d0: 20 20 20 20 69 66 28 20 30 3d 3d 74 63 6c 76 61      if( 0==tclva
24e0: 72 41 64 64 54 6f 49 64 78 73 74 72 28 7a 53 74  rAddToIdxstr(zSt
24f0: 72 2c 20 54 43 4c 56 41 52 5f 56 41 4c 55 45 5f  r, TCLVAR_VALUE_
2500: 47 4c 4f 42 29 20 29 7b 0a 20 20 20 20 20 20 20  GLOB) ){.       
2510: 20 20 20 70 55 73 61 67 65 2d 3e 61 72 67 76 49     pUsage->argvI
2520: 6e 64 65 78 20 3d 20 2b 2b 69 53 74 72 3b 0a 20  ndex = ++iStr;. 
2530: 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 2d           pUsage-
2540: 3e 6f 6d 69 74 20 3d 20 74 63 6c 76 61 72 53 65  >omit = tclvarSe
2550: 74 4f 6d 69 74 28 70 54 61 62 2d 3e 69 6e 74 65  tOmit(pTab->inte
2560: 72 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rp);.        }. 
2570: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2580: 20 76 61 6c 75 65 20 52 45 47 45 58 50 20 3f 20   value REGEXP ? 
2590: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  */.      if( pCo
25a0: 6e 73 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  ns->op==SQLITE_I
25b0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
25c0: 52 45 47 45 58 50 20 26 26 20 70 43 6f 6e 73 2d  REGEXP && pCons-
25d0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 32 20 29 7b 0a 20  >iColumn==2 ){. 
25e0: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 74 63         if( 0==tc
25f0: 6c 76 61 72 41 64 64 54 6f 49 64 78 73 74 72 28  lvarAddToIdxstr(
2600: 7a 53 74 72 2c 20 54 43 4c 56 41 52 5f 56 41 4c  zStr, TCLVAR_VAL
2610: 55 45 5f 52 45 47 45 58 50 29 20 29 7b 0a 20 20  UE_REGEXP) ){.  
2620: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 2d 3e          pUsage->
2630: 61 72 67 76 49 6e 64 65 78 20 3d 20 2b 2b 69 53  argvIndex = ++iS
2640: 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55  tr;.          pU
2650: 73 61 67 65 2d 3e 6f 6d 69 74 20 3d 20 74 63 6c  sage->omit = tcl
2660: 76 61 72 53 65 74 4f 6d 69 74 28 70 54 61 62 2d  varSetOmit(pTab-
2670: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  >interp);.      
2680: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
2690: 20 20 20 2f 2a 20 76 61 6c 75 65 20 4c 49 4b 45     /* value LIKE
26a0: 20 3f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20   ? */.      if( 
26b0: 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51 4c 49 54  pCons->op==SQLIT
26c0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
26d0: 4e 54 5f 4c 49 4b 45 20 26 26 20 70 43 6f 6e 73  NT_LIKE && pCons
26e0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 32 20 29 7b 0a  ->iColumn==2 ){.
26f0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 74          if( 0==t
2700: 63 6c 76 61 72 41 64 64 54 6f 49 64 78 73 74 72  clvarAddToIdxstr
2710: 28 7a 53 74 72 2c 20 54 43 4c 56 41 52 5f 56 41  (zStr, TCLVAR_VA
2720: 4c 55 45 5f 4c 49 4b 45 29 20 29 7b 0a 20 20 20  LUE_LIKE) ){.   
2730: 20 20 20 20 20 20 20 70 55 73 61 67 65 2d 3e 61         pUsage->a
2740: 72 67 76 49 6e 64 65 78 20 3d 20 2b 2b 69 53 74  rgvIndex = ++iSt
2750: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55 73  r;.          pUs
2760: 61 67 65 2d 3e 6f 6d 69 74 20 3d 20 74 63 6c 76  age->omit = tclv
2770: 61 72 53 65 74 4f 6d 69 74 28 70 54 61 62 2d 3e  arSetOmit(pTab->
2780: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 20  interp);.       
2790: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
27a0: 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d  .  }.  pIdxInfo-
27b0: 3e 69 64 78 53 74 72 20 3d 20 7a 53 74 72 3b 0a  >idxStr = zStr;.
27c0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
27d0: 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 31  ToFreeIdxStr = 1
27e0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
27f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2800: 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
2810: 6d 6f 64 75 6c 65 20 74 68 61 74 20 70 72 6f 76  module that prov
2820: 69 64 65 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61  ides read-only a
2830: 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 54 63  ccess to a.** Tc
2840: 6c 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  l global variabl
2850: 65 20 6e 61 6d 65 73 70 61 63 65 2e 0a 2a 2f 0a  e namespace..*/.
2860: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d  static sqlite3_m
2870: 6f 64 75 6c 65 20 74 63 6c 76 61 72 4d 6f 64 75  odule tclvarModu
2880: 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
28b0: 2a 2f 0a 20 20 74 63 6c 76 61 72 43 6f 6e 6e 65  */.  tclvarConne
28c0: 63 74 2c 0a 20 20 74 63 6c 76 61 72 43 6f 6e 6e  ct,.  tclvarConn
28d0: 65 63 74 2c 0a 20 20 74 63 6c 76 61 72 42 65 73  ect,.  tclvarBes
28e0: 74 49 6e 64 65 78 2c 0a 20 20 74 63 6c 76 61 72  tIndex,.  tclvar
28f0: 44 69 73 63 6f 6e 6e 65 63 74 2c 20 0a 20 20 74  Disconnect, .  t
2900: 63 6c 76 61 72 44 69 73 63 6f 6e 6e 65 63 74 2c  clvarDisconnect,
2910: 0a 20 20 74 63 6c 76 61 72 4f 70 65 6e 2c 20 20  .  tclvarOpen,  
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20  /* xOpen - open 
2940: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 74 63  a cursor */.  tc
2950: 6c 76 61 72 43 6c 6f 73 65 2c 20 20 20 20 20 20  lvarClose,      
2960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2970: 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
2980: 75 72 73 6f 72 20 2a 2f 0a 20 20 74 63 6c 76 61  ursor */.  tclva
2990: 72 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20  rFilter,        
29a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
29b0: 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73  er - configure s
29c0: 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  can constraints 
29d0: 2a 2f 0a 20 20 74 63 6c 76 61 72 4e 65 78 74 2c  */.  tclvarNext,
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
2a00: 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
2a10: 0a 20 20 74 63 6c 76 61 72 45 6f 66 2c 20 20 20  .  tclvarEof,   
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20  /* xEof - check 
2a40: 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20  for end of scan 
2a50: 2a 2f 0a 20 20 74 63 6c 76 61 72 43 6f 6c 75 6d  */.  tclvarColum
2a60: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2a70: 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72    /* xColumn - r
2a80: 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 74 63  ead data */.  tc
2a90: 6c 76 61 72 52 6f 77 69 64 2c 20 20 20 20 20 20  lvarRowid,      
2aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
2ab0: 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
2ac0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f     /* xUpdate */
2af0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30  /* xBegin */.  0
2b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b40: 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Sync */.  0,    
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69         /* xCommi
2b70: 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
2ba0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f     /* xFindMetho
2bd0: 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  d */.  0,       
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a      /* xRename *
2c00: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  /.};../*.** Deco
2c10: 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  de a pointer to 
2c20: 61 6e 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 63  an sqlite3 objec
2c30: 74 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74  t..*/.extern int
2c40: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63   getDbPointer(Tc
2c50: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2c60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  , const char *zA
2c70: 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62  , sqlite3 **ppDb
2c80: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  );../*.** Regist
2c90: 65 72 20 74 68 65 20 65 63 68 6f 20 76 69 72 74  er the echo virt
2ca0: 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
2cb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cc0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 72 65  SQLITE_TCLAPI re
2cd0: 67 69 73 74 65 72 5f 74 63 6c 76 61 72 5f 6d 6f  gister_tclvar_mo
2ce0: 64 75 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  dule(.  ClientDa
2cf0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2d00: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2d10: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
2d20: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
2d30: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2d40: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2d50: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2d60: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2d70: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2d80: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2d90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2da0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2db0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2dc0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2dd0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2de0: 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f    int rc = TCL_O
2df0: 4b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  K;.  sqlite3 *db
2e00: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
2e10: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2e20: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2e30: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
2e40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2e50: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2e60: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2e70: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2e80: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2e90: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2ea0: 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51  RROR;.#ifndef SQ
2eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2ec0: 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
2ed0: 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64  _create_module(d
2ee0: 62 2c 20 22 74 63 6c 76 61 72 22 2c 20 26 74 63  b, "tclvar", &tc
2ef0: 6c 76 61 72 4d 6f 64 75 6c 65 2c 20 28 76 6f 69  lvarModule, (voi
2f00: 64 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 72 63  d*)interp);.  rc
2f10: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65   = Tcl_Eval(inte
2f20: 72 70 2c 20 0a 20 20 20 20 20 20 22 70 72 6f 63  rp, .      "proc
2f30: 20 6c 69 6b 65 20 7b 70 61 74 74 65 72 6e 20 73   like {pattern s
2f40: 74 72 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  tr} {\n".      "
2f50: 20 20 73 65 74 20 70 20 5b 73 74 72 69 6e 67 20    set p [string 
2f60: 6d 61 70 20 7b 25 20 2a 20 5f 20 3f 7d 20 24 70  map {% * _ ?} $p
2f70: 61 74 74 65 72 6e 5d 5c 6e 22 0a 20 20 20 20 20  attern]\n".     
2f80: 20 22 20 20 73 74 72 69 6e 67 20 6d 61 74 63 68   "  string match
2f90: 20 24 70 20 24 73 74 72 5c 6e 22 0a 20 20 20 20   $p $str\n".    
2fa0: 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 70    "}\n".      "p
2fb0: 72 6f 63 20 74 63 6c 76 61 72 5f 66 69 6c 74 65  roc tclvar_filte
2fc0: 72 5f 63 6d 64 20 7b 65 71 20 6d 61 74 63 68 20  r_cmd {eq match 
2fd0: 67 6c 6f 62 20 72 65 67 65 78 70 20 6c 69 6b 65  glob regexp like
2fe0: 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  } {\n".      "  
2ff0: 73 65 74 20 72 65 73 20 7b 7d 5c 6e 22 0a 20 20  set res {}\n".  
3000: 20 20 20 20 22 20 20 73 65 74 20 70 61 74 74 65      "  set patte
3010: 72 6e 20 24 65 71 5c 6e 22 0a 20 20 20 20 20 20  rn $eq\n".      
3020: 22 20 20 69 66 20 7b 24 70 61 74 74 65 72 6e 3d  "  if {$pattern=
3030: 3d 7b 7d 7d 20 7b 20 73 65 74 20 70 61 74 74 65  ={}} { set patte
3040: 72 6e 20 24 6d 61 74 63 68 20 7d 5c 6e 22 0a 20  rn $match }\n". 
3050: 20 20 20 20 20 22 20 20 69 66 20 7b 24 70 61 74       "  if {$pat
3060: 74 65 72 6e 3d 3d 7b 7d 7d 20 7b 20 73 65 74 20  tern=={}} { set 
3070: 70 61 74 74 65 72 6e 20 2a 20 7d 5c 6e 22 0a 20  pattern * }\n". 
3080: 20 20 20 20 20 22 20 20 66 6f 72 65 61 63 68 20       "  foreach 
3090: 76 20 5b 75 70 6c 65 76 65 6c 20 23 30 20 69 6e  v [uplevel #0 in
30a0: 66 6f 20 76 61 72 73 20 24 70 61 74 74 65 72 6e  fo vars $pattern
30b0: 5d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ] {\n".      "  
30c0: 20 20 69 66 20 7b 28 24 67 6c 6f 62 3d 3d 7b 7d    if {($glob=={}
30d0: 20 7c 7c 20 5b 73 74 72 69 6e 67 20 6d 61 74 63   || [string matc
30e0: 68 20 24 67 6c 6f 62 20 5b 75 70 6c 65 76 65 6c  h $glob [uplevel
30f0: 20 23 30 20 73 65 74 20 24 76 5d 5d 29 5c 6e 22   #0 set $v]])\n"
3100: 0a 20 20 20 20 20 20 22 20 20 20 20 20 26 26 20  .      "     && 
3110: 28 24 6c 69 6b 65 3d 3d 7b 7d 20 7c 7c 20 5b 6c  ($like=={} || [l
3120: 69 6b 65 20 24 6c 69 6b 65 20 5b 75 70 6c 65 76  ike $like [uplev
3130: 65 6c 20 23 30 20 73 65 74 20 24 76 5d 5d 29 5c  el #0 set $v]])\
3140: 6e 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 26  n".      "     &
3150: 26 20 28 24 72 65 67 65 78 70 3d 3d 7b 7d 20 7c  & ($regexp=={} |
3160: 7c 20 5b 72 65 67 65 78 70 20 24 72 65 67 65 78  | [regexp $regex
3170: 70 20 5b 75 70 6c 65 76 65 6c 20 23 30 20 73 65  p [uplevel #0 se
3180: 74 20 24 76 5d 5d 29 5c 6e 22 0a 20 20 20 20 20  t $v]])\n".     
3190: 20 22 20 20 20 20 7d 20 7b 5c 6e 22 0a 20 20 20   "    } {\n".   
31a0: 20 20 20 22 20 20 20 20 20 20 6c 61 70 70 65 6e     "      lappen
31b0: 64 20 72 65 73 20 24 76 5c 6e 22 0a 20 20 20 20  d res $v\n".    
31c0: 20 20 22 20 20 20 20 7d 5c 6e 22 0a 20 20 20 20    "    }\n".    
31d0: 20 20 22 20 20 7d 5c 6e 22 0a 20 20 20 20 20 20    "  }\n".      
31e0: 22 20 20 73 65 74 20 72 65 73 5c 6e 22 0a 20 20  "  set res\n".  
31f0: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 29 3b 0a 23      "}\n".  );.#
3200: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
3210: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 0a 2f  c;.}..#endif.../
3220: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f  *.** Register co
3230: 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65 20  mmands with the 
3240: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  TCL interpreter.
3250: 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65  .*/.int Sqlitete
3260: 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63  sttclvar_Init(Tc
3270: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3280: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
3290: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
32a0: 42 4c 45 0a 20 20 73 74 61 74 69 63 20 73 74 72  BLE.  static str
32b0: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
32c0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
32d0: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
32e0: 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63  oc;.     void *c
32f0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61  lientData;.  } a
3300: 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
3310: 20 20 7b 20 22 72 65 67 69 73 74 65 72 5f 74 63    { "register_tc
3320: 6c 76 61 72 5f 6d 6f 64 75 6c 65 22 2c 20 20 20  lvar_module",   
3330: 72 65 67 69 73 74 65 72 5f 74 63 6c 76 61 72 5f  register_tclvar_
3340: 6d 6f 64 75 6c 65 2c 20 30 20 7d 2c 0a 20 20 7d  module, 0 },.  }
3350: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
3360: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
3370: 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  ObjCmd)/sizeof(a
3380: 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  ObjCmd[0]); i++)
3390: 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
33a0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
33b0: 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e  p, aObjCmd[i].zN
33c0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f  ame, .        aO
33d0: 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20  bjCmd[i].xProc, 
33e0: 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e  aObjCmd[i].clien
33f0: 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 23  tData, 0);.  }.#
3400: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
3410: 43 4c 5f 4f 4b 3b 0a 7d 0a                       CL_OK;.}.