/ Hex Artifact Content
Login

Artifact bf129928444f1fe3d992894f6e0b4c6d4a534d49:


0000: 23 20 32 30 30 36 20 4a 75 6e 65 20 31 30 0a 23  # 2006 June 10.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66    The.# focus of
01b0: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 63 72   this file is cr
01c0: 65 61 74 69 6e 67 20 61 6e 64 20 64 72 6f 70 70  eating and dropp
01d0: 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ing virtual tabl
01e0: 65 73 2e 0a 23 0a 23 20 24 49 64 3a 20 76 74 61  es..#.# $Id: vta
01f0: 62 31 2e 74 65 73 74 2c 76 20 31 2e 34 32 20 32  b1.test,v 1.42 2
0200: 30 30 37 2f 30 33 2f 33 30 20 31 34 3a 35 36 3a  007/03/30 14:56:
0210: 33 35 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  35 danielk1977 E
0220: 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69  xp $..set testdi
0230: 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  r [file dirname 
0240: 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24  $argv0].source $
0250: 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74  testdir/tester.t
0260: 63 6c 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 76  cl..ifcapable !v
0270: 74 61 62 7c 7c 21 73 63 68 65 6d 61 5f 70 72 61  tab||!schema_pra
0280: 67 6d 61 73 20 7b 0a 20 20 66 69 6e 69 73 68 5f  gmas {.  finish_
0290: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
02a0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4f 72 67 61 6e  --------.# Organ
02f0: 69 7a 61 74 69 6f 6e 20 6f 66 20 74 65 73 74 73  ization of tests
0300: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 3a 0a 23   in this file:.#
0310: 0a 23 20 76 74 61 62 31 2d 31 2e 2a 3a 20 45 72  .# vtab1-1.*: Er
0320: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ror conditions a
0330: 6e 64 20 6f 74 68 65 72 20 69 73 73 75 65 73 20  nd other issues 
0340: 73 75 72 72 6f 75 6e 64 69 6e 67 20 63 72 65 61  surrounding crea
0350: 74 69 6f 6e 2f 63 6f 6e 6e 65 63 74 69 6f 6e 0a  tion/connection.
0360: 23 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20  #            of 
0370: 61 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  a virtual module
0380: 2e 0a 23 20 76 74 61 62 31 2d 32 2e 2a 3a 20 54  ..# vtab1-2.*: T
0390: 65 73 74 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  est sqlite3_decl
03a0: 61 72 65 5f 76 74 61 62 28 29 20 61 6e 64 20 74  are_vtab() and t
03b0: 68 65 20 78 43 6f 6e 6e 65 63 74 2f 78 44 69 73  he xConnect/xDis
03c0: 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 73 2e  connect methods.
03d0: 0a 23 20 76 74 61 62 31 2d 33 2e 2a 3a 20 54 61  .# vtab1-3.*: Ta
03e0: 62 6c 65 20 73 63 61 6e 73 20 61 6e 64 20 57 48  ble scans and WH
03f0: 45 52 45 20 63 6c 61 75 73 65 73 2e 0a 23 20 76  ERE clauses..# v
0400: 74 61 62 31 2d 34 2e 2a 3a 20 54 61 62 6c 65 20  tab1-4.*: Table 
0410: 73 63 61 6e 73 20 61 6e 64 20 4f 52 44 45 52 20  scans and ORDER 
0420: 42 59 20 63 6c 61 75 73 65 73 2e 0a 23 20 76 74  BY clauses..# vt
0430: 61 62 31 2d 35 2e 2a 3a 20 54 65 73 74 20 71 75  ab1-5.*: Test qu
0440: 65 72 69 65 73 20 74 68 61 74 20 69 6e 63 6c 75  eries that inclu
0450: 64 65 20 6a 6f 69 6e 73 2e 20 54 68 69 73 20 62  de joins. This b
0460: 72 69 6e 67 73 20 74 68 65 0a 23 20 20 20 20 20  rings the.#     
0470: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
0480: 6e 64 65 78 5f 69 6e 66 6f 2e 65 73 74 69 6d 61  ndex_info.estima
0490: 74 65 64 43 6f 73 74 20 76 61 72 69 61 62 6c 65  tedCost variable
04a0: 20 69 6e 74 6f 20 70 6c 61 79 2e 0a 23 20 76 74   into play..# vt
04b0: 61 62 31 2d 36 2e 2a 3a 20 54 65 73 74 20 55 50  ab1-6.*: Test UP
04c0: 44 41 54 45 2f 49 4e 53 45 52 54 2f 44 45 4c 45  DATE/INSERT/DELE
04d0: 54 45 20 6f 6e 20 76 74 61 62 6c 65 73 2e 0a 23  TE on vtables..#
04e0: 20 76 74 61 62 31 2d 37 2e 2a 3a 20 54 65 73 74   vtab1-7.*: Test
04f0: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
0500: 73 65 72 74 5f 72 6f 77 69 64 28 29 2e 0a 23 0a  sert_rowid()..#.
0510: 23 20 54 68 69 73 20 66 69 6c 65 20 75 73 65 73  # This file uses
0520: 20 74 68 65 20 22 65 63 68 6f 22 20 6d 6f 64 75   the "echo" modu
0530: 6c 65 20 28 73 65 65 20 73 72 63 2f 74 65 73 74  le (see src/test
0540: 38 2e 63 29 2e 20 52 65 66 65 72 20 74 6f 20 63  8.c). Refer to c
0550: 6f 6d 6d 65 6e 74 73 0a 23 20 69 6e 20 74 68 61  omments.# in tha
0560: 74 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 73  t file for the s
0570: 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72  pecial behaviour
0580: 20 6f 66 20 74 68 65 20 54 63 6c 20 24 65 63 68   of the Tcl $ech
0590: 6f 5f 6d 6f 64 75 6c 65 20 76 61 72 69 61 62 6c  o_module variabl
05a0: 65 2e 0a 23 0a 23 20 54 4f 44 4f 3a 20 0a 23 20  e..#.# TODO: .# 
05b0: 20 20 2a 20 48 6f 77 20 74 6f 20 74 65 73 74 20    * How to test 
05c0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
05d0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
05e0: 67 65 2e 6f 6d 69 74 20 66 69 65 6c 64 3f 0a 23  ge.omit field?.#
05f0: 20 20 20 2a 20 76 74 61 62 31 2d 35 2e 2a 0a 23     * vtab1-5.*.#
0600: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
0650: 74 20 63 61 73 65 73 20 76 74 61 62 31 2e 31 2e  t cases vtab1.1.
0660: 2a 0a 23 0a 0a 23 20 57 65 20 63 61 6e 6e 6f 74  *.#..# We cannot
0670: 20 63 72 65 61 74 65 20 61 20 76 69 72 74 75 61   create a virtua
0680: 6c 20 74 61 62 6c 65 20 69 66 20 74 68 65 20 6d  l table if the m
0690: 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74 20 62 65  odule has not be
06a0: 65 6e 20 72 65 67 69 73 74 65 72 65 64 2e 0a 23  en registered..#
06b0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
06c0: 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .1 {.  catchsql 
06d0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  {.    CREATE VIR
06e0: 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53  TUAL TABLE t1 US
06f0: 49 4e 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20  ING echo;.  }.} 
0700: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64 75  {1 {no such modu
0710: 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74 65  le: echo}}.do_te
0720: 73 74 20 76 74 61 62 31 2d 31 2e 32 20 7b 0a 20  st vtab1-1.2 {. 
0730: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0740: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
0750: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
0760: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b  DER BY 1.  }.} {
0770: 7d 0a 0a 23 20 52 65 67 69 73 74 65 72 20 74 68  }..# Register th
0780: 65 20 6d 6f 64 75 6c 65 0a 72 65 67 69 73 74 65  e module.registe
0790: 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73  r_echo_module [s
07a0: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
07b0: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 0a 23  n_pointer db]..#
07c0: 20 4f 6e 63 65 20 61 20 6d 6f 64 75 6c 65 20 68   Once a module h
07d0: 61 73 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  as been register
07e0: 65 64 2c 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ed, virtual tabl
07f0: 65 73 20 75 73 69 6e 67 20 74 68 61 74 20 6d 6f  es using that mo
0800: 64 75 6c 65 0a 23 20 6d 61 79 20 62 65 20 63 72  dule.# may be cr
0810: 65 61 74 65 64 2e 20 48 6f 77 65 76 65 72 20 69  eated. However i
0820: 66 20 61 20 6d 6f 64 75 6c 65 20 78 43 72 65 61  f a module xCrea
0830: 74 65 28 29 20 66 61 69 6c 73 20 74 6f 20 63 61  te() fails to ca
0840: 6c 6c 0a 23 20 73 71 6c 69 74 65 33 5f 64 65 63  ll.# sqlite3_dec
0850: 6c 61 72 65 5f 76 74 61 62 28 29 20 61 6e 20 65  lare_vtab() an e
0860: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 61 69  rror will be rai
0870: 73 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  sed and the tabl
0880: 65 20 6e 6f 74 20 63 72 65 61 74 65 64 2e 0a 23  e not created..#
0890: 0a 23 20 54 68 65 20 22 65 63 68 6f 22 20 6d 6f  .# The "echo" mo
08a0: 64 75 6c 65 20 64 6f 65 73 20 6e 6f 74 20 69 6e  dule does not in
08b0: 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 64 65 63  voke sqlite3_dec
08c0: 6c 61 72 65 5f 76 74 61 62 28 29 20 69 66 20 69  lare_vtab() if i
08d0: 74 20 69 73 0a 23 20 70 61 73 73 65 64 20 7a 65  t is.# passed ze
08e0: 72 6f 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23 0a  ro arguments..#.
08f0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e  do_test vtab1-1.
0900: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
0910: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
0920: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49  UAL TABLE t1 USI
0930: 4e 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b  NG echo;.  }.} {
0940: 31 20 7b 76 74 61 62 6c 65 20 63 6f 6e 73 74 72  1 {vtable constr
0950: 75 63 74 6f 72 20 64 69 64 20 6e 6f 74 20 64 65  uctor did not de
0960: 63 6c 61 72 65 20 73 63 68 65 6d 61 3a 20 74 31  clare schema: t1
0970: 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }}.do_test vtab1
0980: 2d 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.4 {.  execsql
0990: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61   {.    SELECT na
09a0: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
09b0: 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 31  aster ORDER BY 1
09c0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 68 65  .  }.} {}..# The
09d0: 20 22 65 63 68 6f 22 20 6d 6f 64 75 6c 65 20 78   "echo" module x
09e0: 43 72 65 61 74 65 20 6d 65 74 68 6f 64 20 72 65  Create method re
09f0: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
0a00: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 63 72 65 61  nd does not crea
0a10: 74 65 0a 23 20 74 68 65 20 76 69 72 74 75 61 6c  te.# the virtual
0a20: 20 74 61 62 6c 65 20 69 66 20 69 74 20 69 73 20   table if it is 
0a30: 70 61 73 73 65 64 20 61 6e 20 61 72 67 75 6d 65  passed an argume
0a40: 6e 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  nt that does not
0a50: 20 63 6f 72 72 65 73 70 6f 6e 64 0a 23 20 74 6f   correspond.# to
0a60: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 72 65 61   an existing rea
0a70: 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73  l table in the s
0a80: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a  ame database..#.
0a90: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e  do_test vtab1-1.
0aa0: 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  5 {.  catchsql {
0ab0: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
0ac0: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49  UAL TABLE t1 USI
0ad0: 4e 47 20 65 63 68 6f 28 6e 6f 5f 73 75 63 68 5f  NG echo(no_such_
0ae0: 74 61 62 6c 65 29 3b 0a 20 20 7d 0a 7d 20 7b 31  table);.  }.} {1
0af0: 20 7b 76 74 61 62 6c 65 20 63 6f 6e 73 74 72 75   {vtable constru
0b00: 63 74 6f 72 20 66 61 69 6c 65 64 3a 20 74 31 7d  ctor failed: t1}
0b10: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
0b20: 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.6 {.  execsql 
0b30: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d  {.    SELECT nam
0b40: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
0b50: 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 31 0a  ster ORDER BY 1.
0b60: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 69 63 6b    }.} {}..# Tick
0b70: 65 74 20 23 32 31 35 36 2e 20 20 55 73 69 6e 67  et #2156.  Using
0b80: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70 72 65   the sqlite3_pre
0b90: 70 61 72 65 5f 76 32 28 29 20 41 50 49 2c 20 6d  pare_v2() API, m
0ba0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 23 20  ake sure that.# 
0bb0: 61 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  a CREATE VIRTUAL
0bc0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
0bd0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 6d 75 6c   can be used mul
0be0: 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 23 0a 64  tiple times..#.d
0bf0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e 32  o_test vtab1-1.2
0c00: 31 35 32 2e 31 20 7b 0a 20 20 73 65 74 20 44 42  152.1 {.  set DB
0c10: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   [sqlite3_connec
0c20: 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d  tion_pointer db]
0c30: 0a 20 20 73 65 74 20 73 71 6c 20 7b 43 52 45 41  .  set sql {CREA
0c40: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0c50: 20 74 32 31 35 32 61 20 55 53 49 4e 47 20 65 63   t2152a USING ec
0c60: 68 6f 28 74 32 31 35 32 62 29 7d 0a 20 20 73 65  ho(t2152b)}.  se
0c70: 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  t STMT [sqlite3_
0c80: 70 72 65 70 61 72 65 5f 76 32 20 24 44 42 20 24  prepare_v2 $DB $
0c90: 73 71 6c 20 2d 31 20 54 41 49 4c 5d 0a 20 20 73  sql -1 TAIL].  s
0ca0: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54 4d  qlite3_step $STM
0cb0: 54 0a 7d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  T.} SQLITE_ERROR
0cc0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 2d 31 2e  .do_test vtab-1.
0cd0: 32 31 35 32 2e 32 20 7b 0a 20 20 73 71 6c 69 74  2152.2 {.  sqlit
0ce0: 65 33 5f 72 65 73 65 74 20 24 53 54 4d 54 0a 20  e3_reset $STMT. 
0cf0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53   sqlite3_step $S
0d00: 54 4d 54 0a 7d 20 53 51 4c 49 54 45 5f 45 52 52  TMT.} SQLITE_ERR
0d10: 4f 52 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 2d  OR.do_test vtab-
0d20: 31 2e 32 31 35 32 2e 33 20 7b 0a 20 20 73 71 6c  1.2152.3 {.  sql
0d30: 69 74 65 33 5f 72 65 73 65 74 20 24 53 54 4d 54  ite3_reset $STMT
0d40: 0a 20 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41  .  db eval {CREA
0d50: 54 45 20 54 41 42 4c 45 20 74 32 31 35 32 62 28  TE TABLE t2152b(
0d60: 78 2c 79 29 7d 0a 20 20 73 71 6c 69 74 65 33 5f  x,y)}.  sqlite3_
0d70: 73 74 65 70 20 24 53 54 4d 54 0a 7d 20 53 51 4c  step $STMT.} SQL
0d80: 49 54 45 5f 44 4f 4e 45 0a 64 6f 5f 74 65 73 74  ITE_DONE.do_test
0d90: 20 76 74 61 62 2d 31 2e 32 31 35 32 2e 34 20 7b   vtab-1.2152.4 {
0da0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
0db0: 69 7a 65 20 24 53 54 4d 54 0a 20 20 64 62 20 65  ize $STMT.  db e
0dc0: 76 61 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45 20  val {DROP TABLE 
0dd0: 74 32 31 35 32 61 3b 20 44 52 4f 50 20 54 41 42  t2152a; DROP TAB
0de0: 4c 45 20 74 32 31 35 32 62 7d 0a 7d 20 7b 7d 0a  LE t2152b}.} {}.
0df0: 0a 23 20 54 65 73 74 20 74 6f 20 6d 61 6b 65 20  .# Test to make 
0e00: 73 75 72 65 20 6e 6f 74 68 69 6e 67 20 67 6f 65  sure nothing goe
0e10: 73 20 77 72 6f 6e 67 20 61 6e 64 20 6e 6f 20 6d  s wrong and no m
0e20: 65 6d 6f 72 79 20 69 73 20 6c 65 61 6b 65 64 20  emory is leaked 
0e30: 69 66 20 77 65 20 0a 23 20 73 65 6c 65 63 74 20  if we .# select 
0e40: 61 6e 20 69 6c 6c 65 67 61 6c 20 74 61 62 6c 65  an illegal table
0e50: 2d 6e 61 6d 65 20 28 69 2e 65 20 61 20 72 65 73  -name (i.e a res
0e60: 65 72 76 65 64 20 6e 61 6d 65 20 6f 72 20 74 68  erved name or th
0e70: 65 20 6e 61 6d 65 20 6f 66 20 61 0a 23 20 74 61  e name of a.# ta
0e80: 62 6c 65 20 74 68 61 74 20 61 6c 72 65 61 64 79  ble that already
0e90: 20 65 78 69 73 74 73 29 2e 0a 23 0a 64 6f 5f 74   exists)..#.do_t
0ea0: 65 73 74 20 76 74 61 62 31 2d 31 2e 37 20 7b 0a  est vtab1-1.7 {.
0eb0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0ec0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0ed0: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73  TABLE sqlite_mas
0ee0: 74 65 72 20 55 53 49 4e 47 20 65 63 68 6f 3b 0a  ter USING echo;.
0ef0: 20 20 7d 0a 7d 20 7b 31 20 7b 6f 62 6a 65 63 74    }.} {1 {object
0f00: 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66   name reserved f
0f10: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a  or internal use:
0f20: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 7d   sqlite_master}}
0f30: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
0f40: 2e 38 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .8 {.  catchsql 
0f50: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0f60: 4c 45 20 74 72 65 61 6c 28 61 2c 20 62 2c 20 63  LE treal(a, b, c
0f70: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  );.    CREATE VI
0f80: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 72 65 61  RTUAL TABLE trea
0f90: 6c 20 55 53 49 4e 47 20 65 63 68 6f 28 74 72 65  l USING echo(tre
0fa0: 61 6c 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 74  al);.  }.} {1 {t
0fb0: 61 62 6c 65 20 74 72 65 61 6c 20 61 6c 72 65 61  able treal alrea
0fc0: 64 79 20 65 78 69 73 74 73 7d 7d 0a 64 6f 5f 74  dy exists}}.do_t
0fd0: 65 73 74 20 76 74 61 62 31 2d 31 2e 39 20 7b 0a  est vtab1-1.9 {.
0fe0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0ff0: 44 52 4f 50 20 54 41 42 4c 45 20 74 72 65 61 6c  DROP TABLE treal
1000: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d  ;.    SELECT nam
1010: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
1020: 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 31 0a  ster ORDER BY 1.
1030: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
1040: 74 20 76 74 61 62 31 2d 31 2e 31 30 20 7b 0a 20  t vtab1-1.10 {. 
1050: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1060: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 65 61  REATE TABLE trea
1070: 6c 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  l(a, b, c);.    
1080: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1090: 41 42 4c 45 20 74 65 63 68 6f 20 55 53 49 4e 47  ABLE techo USING
10a0: 20 65 63 68 6f 28 74 72 65 61 6c 29 3b 0a 20 20   echo(treal);.  
10b0: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  }.  db close.  s
10c0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
10d0: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  b.  catchsql {. 
10e0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
10f0: 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31   techo;.  }.} {1
1100: 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65   {no such module
1110: 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74  : echo}}.do_test
1120: 20 76 74 61 62 31 2d 31 2e 31 31 20 7b 0a 20 20   vtab1-1.11 {.  
1130: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
1140: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 63 68 6f  NSERT INTO techo
1150: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
1160: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73  ;.  }.} {1 {no s
1170: 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68 6f  uch module: echo
1180: 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }}.do_test vtab1
1190: 2d 31 2e 31 32 20 7b 0a 20 20 63 61 74 63 68 73  -1.12 {.  catchs
11a0: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
11b0: 74 65 63 68 6f 20 53 45 54 20 61 20 3d 20 31 30  techo SET a = 10
11c0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73  ;.  }.} {1 {no s
11d0: 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68 6f  uch module: echo
11e0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }}.do_test vtab1
11f0: 2d 31 2e 31 33 20 7b 0a 20 20 63 61 74 63 68 73  -1.13 {.  catchs
1200: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
1210: 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 20 7d 0a  FROM techo;.  }.
1220: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f  } {1 {no such mo
1230: 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f  dule: echo}}.do_
1240: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31 34 20  test vtab1-1.14 
1250: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
1260: 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f     PRAGMA table_
1270: 69 6e 66 6f 28 74 65 63 68 6f 29 0a 20 20 7d 0a  info(techo).  }.
1280: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f  } {1 {no such mo
1290: 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f  dule: echo}}.do_
12a0: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31 35 20  test vtab1-1.15 
12b0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
12c0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 65     DROP TABLE te
12d0: 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e  cho;.  }.} {1 {n
12e0: 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65  o such module: e
12f0: 63 68 6f 7d 7d 0a 0a 72 65 67 69 73 74 65 72 5f  cho}}..register_
1300: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c  echo_module [sql
1310: 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f  ite3_connection_
1320: 70 6f 69 6e 74 65 72 20 64 62 5d 0a 64 6f 5f 74  pointer db].do_t
1330: 65 73 74 20 76 74 61 62 31 2d 31 2e 58 20 7b 0a  est vtab1-1.X {.
1340: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1350: 44 52 4f 50 20 54 41 42 4c 45 20 74 65 63 68 6f  DROP TABLE techo
1360: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
1370: 20 74 72 65 61 6c 3b 0a 20 20 20 20 53 45 4c 45   treal;.    SELE
1380: 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
1390: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d  te_master;.  }.}
13a0: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
13f0: 65 73 74 20 63 61 73 65 73 20 76 74 61 62 31 2e  est cases vtab1.
1400: 32 2e 2a 0a 23 0a 23 20 41 74 20 74 68 69 73 20  2.*.#.# At this 
1410: 70 6f 69 6e 74 2c 20 74 68 65 20 64 61 74 61 62  point, the datab
1420: 61 73 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ase is completel
1430: 79 20 65 6d 70 74 79 2e 20 54 68 65 20 65 63 68  y empty. The ech
1440: 6f 20 6d 6f 64 75 6c 65 0a 23 20 68 61 73 20 61  o module.# has a
1450: 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 67 69  lready been regi
1460: 73 74 65 72 65 64 2e 0a 0a 23 20 49 66 20 61 20  stered...# If a 
1470: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
1480: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
1490: 20 65 63 68 6f 20 6d 6f 64 75 6c 65 20 64 75 72   echo module dur
14a0: 69 6e 67 20 74 61 62 6c 65 0a 23 20 63 72 65 61  ing table.# crea
14b0: 74 69 6f 6e 2c 20 69 74 20 69 73 20 61 73 73 75  tion, it is assu
14c0: 6d 65 64 20 74 6f 20 62 65 20 74 68 65 20 6e 61  med to be the na
14d0: 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e  me of a table in
14e0: 20 74 68 65 20 73 61 6d 65 0a 23 20 64 61 74 61   the same.# data
14f0: 62 61 73 65 2e 20 54 68 65 20 65 63 68 6f 20 6d  base. The echo m
1500: 6f 64 75 6c 65 20 61 74 74 65 6d 70 74 73 20 74  odule attempts t
1510: 6f 20 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  o set the schema
1520: 20 6f 66 20 74 68 65 0a 23 20 6e 65 77 20 76 69   of the.# new vi
1530: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 6f 20 62  rtual table to b
1540: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1550: 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
1560: 61 73 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f  ase table..#.do_
1570: 74 65 73 74 20 76 74 61 62 31 2d 32 2e 31 20 7b  test vtab1-2.1 {
1580: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1590: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65   CREATE TABLE te
15a0: 6d 70 6c 61 74 65 28 61 2c 20 62 2c 20 63 29 3b  mplate(a, b, c);
15b0: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
15c0: 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e   PRAGMA table_in
15d0: 66 6f 28 74 65 6d 70 6c 61 74 65 29 3b 20 7d 0a  fo(template); }.
15e0: 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20  } [list         
15f0: 5c 0a 20 20 30 20 61 20 7b 7d 20 30 20 7b 7d 20  \.  0 a {} 0 {} 
1600: 30 20 5c 0a 20 20 31 20 62 20 7b 7d 20 30 20 7b  0 \.  1 b {} 0 {
1610: 7d 20 30 20 5c 0a 20 20 32 20 63 20 7b 7d 20 30  } 0 \.  2 c {} 0
1620: 20 7b 7d 20 30 20 5c 0a 5d 0a 64 6f 5f 74 65 73   {} 0 \.].do_tes
1630: 74 20 76 74 61 62 31 2d 32 2e 32 20 7b 0a 20 20  t vtab1-2.2 {.  
1640: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1650: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1660: 4c 45 20 74 31 20 55 53 49 4e 47 20 65 63 68 6f  LE t1 USING echo
1670: 28 74 65 6d 70 6c 61 74 65 29 3b 0a 20 20 7d 0a  (template);.  }.
1680: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
1690: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74 31  MA table_info(t1
16a0: 29 3b 20 7d 0a 7d 20 5b 6c 69 73 74 20 20 20 20  ); }.} [list    
16b0: 20 20 20 20 20 5c 0a 20 20 30 20 61 20 7b 7d 20       \.  0 a {} 
16c0: 30 20 7b 7d 20 30 20 5c 0a 20 20 31 20 62 20 7b  0 {} 0 \.  1 b {
16d0: 7d 20 30 20 7b 7d 20 30 20 5c 0a 20 20 32 20 63  } 0 {} 0 \.  2 c
16e0: 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 5d 0a 0a   {} 0 {} 0 \.]..
16f0: 23 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20  # Test that the 
1700: 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
1710: 75 6e 6c 6f 61 64 65 64 2e 20 54 68 69 73 20 73  unloaded. This s
1720: 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 74 68 65  hould invoke the
1730: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 0a 23   xDisconnect().#
1740: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
1750: 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  e successfully c
1760: 72 65 61 74 65 20 76 69 72 74 75 61 6c 20 74 61  reate virtual ta
1770: 62 6c 65 20 28 74 31 29 2e 0a 23 0a 64 6f 5f 74  ble (t1)..#.do_t
1780: 65 73 74 20 76 74 61 62 31 2d 32 2e 33 20 7b 0a  est vtab1-2.3 {.
1790: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
17a0: 65 20 5b 6c 69 73 74 5d 0a 20 20 64 62 20 63 6c  e [list].  db cl
17b0: 6f 73 65 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  ose.  set echo_m
17c0: 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 44  odule.} [list xD
17d0: 69 73 63 6f 6e 6e 65 63 74 5d 0a 0a 23 20 52 65  isconnect]..# Re
17e0: 2d 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61  -open the databa
17f0: 73 65 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  se. This should 
1800: 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 76 69  not cause any vi
1810: 72 74 75 61 6c 20 6d 65 74 68 6f 64 73 20 74 6f  rtual methods to
1820: 20 0a 23 20 62 65 20 63 61 6c 6c 65 64 2e 20 54   .# be called. T
1830: 68 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  he invocation of
1840: 20 78 43 6f 6e 6e 65 63 74 28 29 20 69 73 20 64   xConnect() is d
1850: 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
1860: 20 76 69 72 74 75 61 6c 0a 23 20 74 61 62 6c 65   virtual.# table
1870: 20 73 63 68 65 6d 61 20 69 73 20 66 69 72 73 74   schema is first
1880: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1890: 20 63 6f 6d 70 69 6c 65 72 2e 0a 23 0a 64 6f 5f   compiler..#.do_
18a0: 74 65 73 74 20 76 74 61 62 31 2d 32 2e 34 20 7b  test vtab1-2.4 {
18b0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
18c0: 6c 65 20 5b 6c 69 73 74 5d 0a 20 20 73 71 6c 69  le [list].  sqli
18d0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
18e0: 20 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 30   db cache size 0
18f0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
1900: 6c 65 0a 7d 20 7b 7d 0a 0a 23 20 54 72 79 20 74  le.} {}..# Try t
1910: 6f 20 71 75 65 72 79 20 74 68 65 20 76 69 72 74  o query the virt
1920: 75 61 6c 20 74 61 62 6c 65 20 73 63 68 65 6d 61  ual table schema
1930: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61  . This should fa
1940: 69 6c 2c 20 61 73 20 74 68 65 0a 23 20 65 63 68  il, as the.# ech
1950: 6f 20 6d 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74  o module has not
1960: 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
1970: 20 77 69 74 68 20 74 68 69 73 20 64 61 74 61 62   with this datab
1980: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1990: 23 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e  #.do_test vtab1.
19a0: 32 2e 36 20 7b 0a 62 72 65 61 6b 70 6f 69 6e 74  2.6 {.breakpoint
19b0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52  .  catchsql { PR
19c0: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
19d0: 74 31 29 3b 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20  t1); }.} {1 {no 
19e0: 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68  such module: ech
19f0: 6f 7d 7d 0a 0a 23 20 52 65 67 69 73 74 65 72 20  o}}..# Register 
1a00: 74 68 65 20 6d 6f 64 75 6c 65 0a 72 65 67 69 73  the module.regis
1a10: 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  ter_echo_module 
1a20: 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  [sqlite3_connect
1a30: 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a  ion_pointer db].
1a40: 0a 23 20 54 72 79 20 74 6f 20 71 75 65 72 79 20  .# Try to query 
1a50: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1a60: 65 20 73 63 68 65 6d 61 20 61 67 61 69 6e 2e 20  e schema again. 
1a70: 54 68 69 73 20 74 69 6d 65 20 69 74 20 73 68 6f  This time it sho
1a80: 75 6c 64 0a 23 20 69 6e 76 6f 6b 65 20 74 68 65  uld.# invoke the
1a90: 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64   xConnect method
1aa0: 20 61 6e 64 20 73 75 63 63 65 65 64 2e 0a 23 0a   and succeed..#.
1ab0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 32 2e  do_test vtab1.2.
1ac0: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  7 {.  execsql { 
1ad0: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
1ae0: 6f 28 74 31 29 3b 20 7d 0a 7d 20 5b 6c 69 73 74  o(t1); }.} [list
1af0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 30 20 61           \.  0 a
1b00: 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20 20 31   {} 0 {} 0 \.  1
1b10: 20 62 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20   b {} 0 {} 0 \. 
1b20: 20 32 20 63 20 7b 7d 20 30 20 7b 7d 20 30 20 5c   2 c {} 0 {} 0 \
1b30: 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  .].do_test vtab1
1b40: 2e 32 2e 38 20 7b 0a 20 20 73 65 74 20 65 63 68  .2.8 {.  set ech
1b50: 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 7b 78 43 6f 6e  o_module.} {xCon
1b60: 6e 65 63 74 20 65 63 68 6f 20 6d 61 69 6e 20 74  nect echo main t
1b70: 31 20 74 65 6d 70 6c 61 74 65 7d 0a 0a 23 20 44  1 template}..# D
1b80: 72 6f 70 20 74 61 62 6c 65 20 74 31 2e 20 54 68  rop table t1. Th
1b90: 69 73 20 73 68 6f 75 6c 64 20 63 61 75 73 65 20  is should cause 
1ba0: 74 68 65 20 78 44 65 73 74 72 6f 79 20 28 62 75  the xDestroy (bu
1bb0: 74 20 6e 6f 74 20 78 44 69 73 63 6f 6e 6e 65 63  t not xDisconnec
1bc0: 74 29 20 6d 65 74 68 6f 64 20 0a 23 20 74 6f 20  t) method .# to 
1bd0: 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 64 6f 5f 74  be invoked..do_t
1be0: 65 73 74 20 76 74 61 62 31 2d 32 2e 35 20 7b 0a  est vtab1-2.5 {.
1bf0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
1c00: 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b  e "".  execsql {
1c10: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
1c20: 74 31 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63  t1;.  }.  set ec
1c30: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 7b 78 44 65  ho_module.} {xDe
1c40: 73 74 72 6f 79 7d 0a 0a 64 6f 5f 74 65 73 74 20  stroy}..do_test 
1c50: 76 74 61 62 31 2d 32 2e 36 20 7b 0a 20 20 65 78  vtab1-2.6 {.  ex
1c60: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
1c70: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74  GMA table_info(t
1c80: 31 29 3b 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  1); .  }.} {}.do
1c90: 5f 74 65 73 74 20 76 74 61 62 31 2d 32 2e 37 20  _test vtab1-2.7 
1ca0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1cb0: 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f    SELECT sql FRO
1cc0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
1cd0: 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 7b 43 52  .  }.} [list {CR
1ce0: 45 41 54 45 20 54 41 42 4c 45 20 74 65 6d 70 6c  EATE TABLE templ
1cf0: 61 74 65 28 61 2c 20 62 2c 20 63 29 7d 5d 0a 23  ate(a, b, c)}].#
1d00: 20 43 6c 65 61 6e 20 75 70 20 6f 74 68 65 72 20   Clean up other 
1d10: 74 65 73 74 20 61 72 74 69 66 61 63 74 73 3a 0a  test artifacts:.
1d20: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32 2e  do_test vtab1-2.
1d30: 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  8 {.  execsql { 
1d40: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
1d50: 74 65 6d 70 6c 61 74 65 3b 0a 20 20 20 20 53 45  template;.    SE
1d60: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
1d70: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d  lite_master;.  }
1d80: 0a 7d 20 5b 6c 69 73 74 5d 0a 0a 23 2d 2d 2d 2d  .} [list]..#----
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dd0: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 20 76  --.# Test case v
1de0: 74 61 62 31 2d 33 20 74 65 73 74 20 74 61 62 6c  tab1-3 test tabl
1df0: 65 20 73 63 61 6e 73 20 61 6e 64 20 74 68 65 20  e scans and the 
1e00: 65 63 68 6f 20 6d 6f 64 75 6c 65 27 73 20 0a 23  echo module's .#
1e10: 20 78 42 65 73 74 49 6e 64 65 78 2f 78 46 69 6c   xBestIndex/xFil
1e20: 74 65 72 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  ter handling of 
1e30: 57 48 45 52 45 20 63 6f 6e 64 69 74 69 6f 6e 73  WHERE conditions
1e40: 2e 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  ...do_test vtab1
1e50: 2d 33 2e 31 20 7b 0a 20 20 73 65 74 20 65 63 68  -3.1 {.  set ech
1e60: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78  o_module "".  ex
1e70: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
1e80: 54 45 20 54 41 42 4c 45 20 74 72 65 61 6c 28 61  TE TABLE treal(a
1e90: 20 49 4e 54 45 47 45 52 2c 20 62 20 49 4e 54 45   INTEGER, b INTE
1ea0: 47 45 52 2c 20 63 29 3b 20 0a 20 20 20 20 43 52  GER, c); .    CR
1eb0: 45 41 54 45 20 49 4e 44 45 58 20 74 72 65 61 6c  EATE INDEX treal
1ec0: 5f 69 64 78 20 4f 4e 20 74 72 65 61 6c 28 62 29  _idx ON treal(b)
1ed0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  ;.    CREATE VIR
1ee0: 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53  TUAL TABLE t1 US
1ef0: 49 4e 47 20 65 63 68 6f 28 74 72 65 61 6c 29 3b  ING echo(treal);
1f00: 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f  .  }.  set echo_
1f10: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78  module.} [list x
1f20: 43 72 65 61 74 65 20 65 63 68 6f 20 6d 61 69 6e  Create echo main
1f30: 20 74 31 20 74 72 65 61 6c 20 20 20 5c 0a 20 20   t1 treal   \.  
1f40: 20 20 20 20 20 20 78 53 79 6e 63 20 20 20 65 63        xSync   ec
1f50: 68 6f 28 74 72 65 61 6c 29 20 20 5c 0a 20 20 20  ho(treal)  \.   
1f60: 20 20 20 20 20 78 43 6f 6d 6d 69 74 20 65 63 68       xCommit ech
1f70: 6f 28 74 72 65 61 6c 29 20 20 5c 0a 5d 0a 0a 23  o(treal)  \.]..#
1f80: 20 54 65 73 74 20 74 68 61 74 20 61 20 53 45 4c   Test that a SEL
1f90: 45 43 54 20 6f 6e 20 74 31 20 64 6f 65 73 6e 27  ECT on t1 doesn'
1fa0: 74 20 63 72 61 73 68 2e 20 4e 6f 20 72 6f 77 73  t crash. No rows
1fb0: 20 61 72 65 20 72 65 74 75 72 6e 65 64 0a 23 20   are returned.# 
1fc0: 62 65 63 61 75 73 65 20 74 68 65 20 75 6e 64 65  because the unde
1fd0: 72 6c 79 69 6e 67 20 72 65 61 6c 20 74 61 62 6c  rlying real tabl
1fe0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  e is currently e
1ff0: 6d 70 74 79 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  mpty..#.do_test 
2000: 76 74 61 62 31 2d 33 2e 32 20 7b 0a 20 20 65 78  vtab1-3.2 {.  ex
2010: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
2020: 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
2030: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  t1;.  }.} {}..# 
2040: 50 75 74 20 73 6f 6d 65 20 64 61 74 61 20 69 6e  Put some data in
2050: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 72 65  to the table tre
2060: 61 6c 2e 20 54 68 65 6e 20 74 72 79 20 61 20 66  al. Then try a f
2070: 65 77 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54  ew simple SELECT
2080: 20 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20 6f   .# statements o
2090: 6e 20 74 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  n t1..#.do_test 
20a0: 76 74 61 62 31 2d 33 2e 33 20 7b 0a 20 20 65 78  vtab1-3.3 {.  ex
20b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
20c0: 52 54 20 49 4e 54 4f 20 74 72 65 61 6c 20 56 41  RT INTO treal VA
20d0: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
20e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
20f0: 72 65 61 6c 20 56 41 4c 55 45 53 28 34 2c 20 35  real VALUES(4, 5
2100: 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  , 6);.    SELECT
2110: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
2120: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
2130: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e  do_test vtab1-3.
2140: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
2150: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
2160: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 34  M t1;.  }.} {1 4
2170: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
2180: 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.5 {.  execsql 
2190: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77  {.    SELECT row
21a0: 69 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  id FROM t1;.  }.
21b0: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
21c0: 76 74 61 62 31 2d 33 2e 36 20 7b 0a 20 20 73 65  vtab1-3.6 {.  se
21d0: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22  t echo_module ""
21e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
21f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2200: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20  1;.  }.} {1 2 3 
2210: 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76  4 5 6}.do_test v
2220: 74 61 62 31 2d 33 2e 37 20 7b 0a 20 20 65 78 65  tab1-3.7 {.  exe
2230: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2240: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
2250: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32  t1;.  }.} {1 1 2
2260: 20 33 20 32 20 34 20 35 20 36 7d 0a 64 6f 5f 74   3 2 4 5 6}.do_t
2270: 65 73 74 20 76 74 61 62 31 2d 33 2e 38 20 7b 0a  est vtab1-3.8 {.
2280: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2290: 53 45 4c 45 43 54 20 61 20 41 53 20 64 2c 20 62  SELECT a AS d, b
22a0: 20 41 53 20 65 2c 20 63 20 41 53 20 66 20 46 52   AS e, c AS f FR
22b0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
22c0: 32 20 33 20 34 20 35 20 36 7d 0a 0a 23 20 45 78  2 3 4 5 6}..# Ex
22d0: 65 63 75 74 65 20 73 6f 6d 65 20 53 45 4c 45 43  ecute some SELEC
22e0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74  T statements wit
22f0: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  h WHERE clauses 
2300: 6f 6e 20 74 68 65 20 74 31 20 74 61 62 6c 65 2e  on the t1 table.
2310: 0a 23 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  .# Then check th
2320: 65 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 76 61  e echo_module va
2330: 72 69 61 62 6c 65 20 28 77 72 69 74 74 65 6e 20  riable (written 
2340: 74 6f 20 62 79 20 74 68 65 20 6d 6f 64 75 6c 65  to by the module
2350: 20 6d 65 74 68 6f 64 73 0a 23 20 69 6e 20 74 65   methods.# in te
2360: 73 74 38 2e 63 29 20 74 6f 20 6d 61 6b 65 20 73  st8.c) to make s
2370: 75 72 65 20 74 68 65 20 78 42 65 73 74 49 6e 64  ure the xBestInd
2380: 65 78 28 29 20 61 6e 64 20 78 46 69 6c 74 65 72  ex() and xFilter
2390: 28 29 20 6d 65 74 68 6f 64 73 20 77 65 72 65 0a  () methods were.
23a0: 23 20 63 61 6c 6c 65 64 20 63 6f 72 72 65 63 74  # called correct
23b0: 6c 79 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74  ly..#.do_test vt
23c0: 61 62 31 2d 33 2e 38 20 7b 0a 20 20 73 65 74 20  ab1-3.8 {.  set 
23d0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20  echo_module "". 
23e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
23f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
2400: 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f  .  }.  set echo_
2410: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78  module.} [list x
2420: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43  BestIndex {SELEC
2430: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
2440: 27 74 72 65 61 6c 27 7d 20 5c 0a 20 20 20 20 20  'treal'} \.     
2450: 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53     xFilter    {S
2460: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
2470: 52 4f 4d 20 27 74 72 65 61 6c 27 7d 20 5d 0a 64  ROM 'treal'} ].d
2480: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 39  o_test vtab1-3.9
2490: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
24a0: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71  dule "".  execsq
24b0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
24c0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
24d0: 20 3d 20 35 3b 0a 20 20 7d 0a 7d 20 7b 34 20 35   = 5;.  }.} {4 5
24e0: 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62   6}.do_test vtab
24f0: 31 2d 33 2e 31 30 20 7b 0a 20 20 73 65 74 20 65  1-3.10 {.  set e
2500: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69  cho_module.} [li
2510: 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53  st xBestIndex {S
2520: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
2530: 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52  ROM 'treal' WHER
2540: 45 20 62 20 3d 20 3f 7d 20 20 20 5c 0a 20 20 20  E b = ?}   \.   
2550: 20 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20       xFilter    
2560: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
2570: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48   FROM 'treal' WH
2580: 45 52 45 20 62 20 3d 20 3f 7d 20 35 20 5d 0a 64  ERE b = ?} 5 ].d
2590: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31  o_test vtab1-3.1
25a0: 30 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  0 {.  set echo_m
25b0: 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73  odule "".  execs
25c0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
25d0: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
25e0: 62 20 3e 3d 20 35 20 41 4e 44 20 62 20 3c 3d 20  b >= 5 AND b <= 
25f0: 31 30 3b 0a 20 20 7d 0a 7d 20 7b 34 20 35 20 36  10;.  }.} {4 5 6
2600: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
2610: 33 2e 31 31 20 7b 0a 20 20 73 65 74 20 65 63 68  3.11 {.  set ech
2620: 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74  o_module.} [list
2630: 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c   xBestIndex {SEL
2640: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
2650: 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52 45 20  M 'treal' WHERE 
2660: 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c 3d 20  b >= ? AND b <= 
2670: 3f 7d 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20  ?}      \.      
2680: 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53 45    xFilter    {SE
2690: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
26a0: 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52 45  OM 'treal' WHERE
26b0: 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c 3d   b >= ? AND b <=
26c0: 20 3f 7d 20 35 20 31 30 20 5d 0a 64 6f 5f 74 65   ?} 5 10 ].do_te
26d0: 73 74 20 76 74 61 62 31 2d 33 2e 31 32 20 7b 0a  st vtab1-3.12 {.
26e0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
26f0: 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b  e "".  execsql {
2700: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2710: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 42 45  OM t1 WHERE b BE
2720: 54 57 45 45 4e 20 32 20 41 4e 44 20 31 30 3b 0a  TWEEN 2 AND 10;.
2730: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35    }.} {1 2 3 4 5
2740: 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62   6}.do_test vtab
2750: 31 2d 33 2e 31 33 20 7b 0a 20 20 73 65 74 20 65  1-3.13 {.  set e
2760: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69  cho_module.} [li
2770: 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53  st xBestIndex {S
2780: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
2790: 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52  ROM 'treal' WHER
27a0: 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c  E b >= ? AND b <
27b0: 3d 20 3f 7d 20 20 20 20 20 20 5c 0a 20 20 20 20  = ?}      \.    
27c0: 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b      xFilter    {
27d0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
27e0: 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45  FROM 'treal' WHE
27f0: 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20  RE b >= ? AND b 
2800: 3c 3d 20 3f 7d 20 32 20 31 30 20 5d 0a 0a 23 20  <= ?} 2 10 ]..# 
2810: 41 64 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 66  Add a function f
2820: 6f 72 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65  or the MATCH ope
2830: 72 61 74 6f 72 2e 20 45 76 65 72 79 74 68 69 6e  rator. Everythin
2840: 67 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73  g always matches
2850: 21 0a 23 70 72 6f 63 20 74 65 73 74 5f 6d 61 74  !.#proc test_mat
2860: 63 68 20 7b 6c 68 73 20 72 68 73 7d 20 7b 0a 23  ch {lhs rhs} {.#
2870: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 65 63 68 6f    lappend ::echo
2880: 5f 6d 6f 64 75 6c 65 20 4d 41 54 43 48 20 24 6c  _module MATCH $l
2890: 68 73 20 24 72 68 73 0a 23 20 20 72 65 74 75 72  hs $rhs.#  retur
28a0: 6e 20 31 0a 23 7d 0a 23 64 62 20 66 75 6e 63 74  n 1.#}.#db funct
28b0: 69 6f 6e 20 6d 61 74 63 68 20 74 65 73 74 5f 6d  ion match test_m
28c0: 61 74 63 68 0a 0a 73 65 74 20 65 63 68 6f 5f 6d  atch..set echo_m
28d0: 6f 64 75 6c 65 20 22 22 0a 64 6f 5f 74 65 73 74  odule "".do_test
28e0: 20 76 74 61 62 31 2d 33 2e 31 32 20 7b 0a 20 20   vtab1-3.12 {.  
28f0: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  set echo_module 
2900: 22 22 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  "".  catchsql {.
2910: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2920: 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41 54  M t1 WHERE a MAT
2930: 43 48 20 27 73 74 72 69 6e 67 27 3b 0a 20 20 7d  CH 'string';.  }
2940: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
2950: 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41   use function MA
2960: 54 43 48 20 69 6e 20 74 68 65 20 72 65 71 75 65  TCH in the reque
2970: 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 64  sted context}}.d
2980: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31  o_test vtab1-3.1
2990: 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  3 {.  set echo_m
29a0: 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42  odule.} [list xB
29b0: 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54  estIndex {SELECT
29c0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
29d0: 74 72 65 61 6c 27 7d 20 5c 0a 20 20 20 20 20 20  treal'} \.      
29e0: 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53 45    xFilter    {SE
29f0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
2a00: 4f 4d 20 27 74 72 65 61 6c 27 7d 5d 0a 64 6f 5f  OM 'treal'}].do_
2a10: 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31 34 20  test vtab1-3.14 
2a20: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
2a30: 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c  ule "".  execsql
2a40: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
2a50: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20  FROM t1 WHERE b 
2a60: 4d 41 54 43 48 20 27 73 74 72 69 6e 67 27 3b 0a  MATCH 'string';.
2a70: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
2a80: 20 76 74 61 62 31 2d 33 2e 31 35 20 7b 0a 20 20   vtab1-3.15 {.  
2a90: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a  set echo_module.
2aa0: 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64  } [list xBestInd
2ab0: 65 78 20 5c 0a 20 20 20 20 20 20 20 20 7b 53 45  ex \.        {SE
2ac0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
2ad0: 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52 45  OM 'treal' WHERE
2ae0: 20 62 20 4c 49 4b 45 20 28 53 45 4c 45 43 54 20   b LIKE (SELECT 
2af0: 27 25 27 7c 7c 3f 7c 7c 27 25 27 29 7d 20 20 5c  '%'||?||'%')}  \
2b00: 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74 65 72  .        xFilter
2b10: 20 5c 0a 20 20 20 20 20 20 20 20 7b 53 45 4c 45   \.        {SELE
2b20: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
2b30: 20 27 74 72 65 61 6c 27 20 57 48 45 52 45 20 62   'treal' WHERE b
2b40: 20 4c 49 4b 45 20 28 53 45 4c 45 43 54 20 27 25   LIKE (SELECT '%
2b50: 27 7c 7c 3f 7c 7c 27 25 27 29 7d 20 5c 0a 20 20  '||?||'%')} \.  
2b60: 20 20 20 20 20 20 73 74 72 69 6e 67 20 5d 0a 0a        string ]..
2b70: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63  -------.# Test c
2bc0: 61 73 65 20 76 74 61 62 31 2d 33 20 74 65 73 74  ase vtab1-3 test
2bd0: 20 74 61 62 6c 65 20 73 63 61 6e 73 20 61 6e 64   table scans and
2be0: 20 74 68 65 20 65 63 68 6f 20 6d 6f 64 75 6c 65   the echo module
2bf0: 27 73 20 0a 23 20 78 42 65 73 74 49 6e 64 65 78  's .# xBestIndex
2c00: 2f 78 46 69 6c 74 65 72 20 68 61 6e 64 6c 69 6e  /xFilter handlin
2c10: 67 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c  g of ORDER BY cl
2c20: 61 75 73 65 73 2e 0a 0a 23 20 54 68 69 73 20 70  auses...# This p
2c30: 72 6f 63 65 64 75 72 65 20 65 78 65 63 75 74 65  rocedure execute
2c40: 73 20 74 68 65 20 53 51 4c 2e 20 20 54 68 65 6e  s the SQL.  Then
2c50: 20 69 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65   it checks to se
2c60: 65 20 69 66 20 74 68 65 20 4f 50 5f 53 6f 72 74  e if the OP_Sort
2c70: 0a 23 20 6f 70 63 6f 64 65 20 77 61 73 20 65 78  .# opcode was ex
2c80: 65 63 75 74 65 64 2e 20 20 49 66 20 61 6e 20 4f  ecuted.  If an O
2c90: 50 5f 53 6f 72 74 20 64 69 64 20 6f 63 63 75 72  P_Sort did occur
2ca0: 2c 20 74 68 65 6e 20 22 73 6f 72 74 22 20 69 73  , then "sort" is
2cb0: 20 61 70 70 65 6e 64 65 64 0a 23 20 74 6f 20 74   appended.# to t
2cc0: 68 65 20 72 65 73 75 6c 74 2e 20 20 49 66 20 6e  he result.  If n
2cd0: 6f 20 4f 50 5f 53 6f 72 74 20 68 61 70 70 65 6e  o OP_Sort happen
2ce0: 65 64 2c 20 74 68 65 6e 20 22 6e 6f 73 6f 72 74  ed, then "nosort
2cf0: 22 20 69 73 20 61 70 70 65 6e 64 65 64 2e 0a 23  " is appended..#
2d00: 0a 23 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  .# This procedur
2d10: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
2d20: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
2d30: 73 6f 72 74 69 6e 67 20 69 73 20 6f 72 20 69 73  sorting is or is
2d40: 20 6e 6f 74 0a 23 20 6f 63 63 75 72 72 69 6e 67   not.# occurring
2d50: 20 61 73 20 65 78 70 65 63 74 65 64 2e 0a 23 0a   as expected..#.
2d60: 70 72 6f 63 20 63 6b 73 6f 72 74 20 7b 73 71 6c  proc cksort {sql
2d70: 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69  } {.  set ::sqli
2d80: 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 20 30 0a  te_sort_count 0.
2d90: 20 20 73 65 74 20 64 61 74 61 20 5b 65 78 65 63    set data [exec
2da0: 73 71 6c 20 24 73 71 6c 5d 0a 20 20 69 66 20 7b  sql $sql].  if {
2db0: 24 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63  $::sqlite_sort_c
2dc0: 6f 75 6e 74 7d 20 7b 73 65 74 20 78 20 73 6f 72  ount} {set x sor
2dd0: 74 7d 20 7b 73 65 74 20 78 20 6e 6f 73 6f 72 74  t} {set x nosort
2de0: 7d 0a 20 20 6c 61 70 70 65 6e 64 20 64 61 74 61  }.  lappend data
2df0: 20 24 78 0a 20 20 72 65 74 75 72 6e 20 24 64 61   $x.  return $da
2e00: 74 61 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74  ta.}..do_test vt
2e10: 61 62 31 2d 34 2e 31 20 7b 0a 20 20 73 65 74 20  ab1-4.1 {.  set 
2e20: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20  echo_module "". 
2e30: 20 63 6b 73 6f 72 74 20 7b 0a 20 20 20 20 53 45   cksort {.    SE
2e40: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20 4f  LECT b FROM t1 O
2e50: 52 44 45 52 20 42 59 20 62 3b 0a 20 20 7d 0a 7d  RDER BY b;.  }.}
2e60: 20 7b 32 20 35 20 6e 6f 73 6f 72 74 7d 0a 64 6f   {2 5 nosort}.do
2e70: 5f 74 65 73 74 20 76 74 61 62 31 2d 34 2e 32 20  _test vtab1-4.2 
2e80: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
2e90: 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73  ule.} [list xBes
2ea0: 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72  tIndex {SELECT r
2eb0: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72  owid, * FROM 'tr
2ec0: 65 61 6c 27 20 4f 52 44 45 52 20 42 59 20 62 20  eal' ORDER BY b 
2ed0: 41 53 43 7d 20 5c 0a 20 20 20 20 20 20 20 20 78  ASC} \.        x
2ee0: 46 69 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43  Filter    {SELEC
2ef0: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
2f00: 27 74 72 65 61 6c 27 20 4f 52 44 45 52 20 42 59  'treal' ORDER BY
2f10: 20 62 20 41 53 43 7d 20 5d 0a 64 6f 5f 74 65 73   b ASC} ].do_tes
2f20: 74 20 76 74 61 62 31 2d 34 2e 33 20 7b 0a 20 20  t vtab1-4.3 {.  
2f30: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  set echo_module 
2f40: 22 22 0a 20 20 63 6b 73 6f 72 74 20 7b 0a 20 20  "".  cksort {.  
2f50: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
2f60: 74 31 20 4f 52 44 45 52 20 42 59 20 62 20 44 45  t1 ORDER BY b DE
2f70: 53 43 3b 0a 20 20 7d 0a 7d 20 7b 35 20 32 20 6e  SC;.  }.} {5 2 n
2f80: 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20 76  osort}.do_test v
2f90: 74 61 62 31 2d 34 2e 34 20 7b 0a 20 20 73 65 74  tab1-4.4 {.  set
2fa0: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b   echo_module.} [
2fb0: 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20  list xBestIndex 
2fc0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
2fd0: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52   FROM 'treal' OR
2fe0: 44 45 52 20 42 59 20 62 20 44 45 53 43 7d 20 5c  DER BY b DESC} \
2ff0: 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74 65 72  .        xFilter
3000: 20 20 20 20 7b 53 45 4c 45 43 54 20 72 6f 77 69      {SELECT rowi
3010: 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c  d, * FROM 'treal
3020: 27 20 4f 52 44 45 52 20 42 59 20 62 20 44 45 53  ' ORDER BY b DES
3030: 43 7d 20 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61  C} ].do_test vta
3040: 62 31 2d 34 2e 33 20 7b 0a 20 20 73 65 74 20 65  b1-4.3 {.  set e
3050: 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20  cho_module "".  
3060: 63 6b 73 6f 72 74 20 7b 0a 20 20 20 20 53 45 4c  cksort {.    SEL
3070: 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20 4f 52  ECT b FROM t1 OR
3080: 44 45 52 20 42 59 20 62 7c 7c 27 27 3b 0a 20 20  DER BY b||'';.  
3090: 7d 0a 7d 20 7b 32 20 35 20 73 6f 72 74 7d 0a 64  }.} {2 5 sort}.d
30a0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 34 2e 34  o_test vtab1-4.4
30b0: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
30c0: 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65  dule.} [list xBe
30d0: 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20  stIndex {SELECT 
30e0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74  rowid, * FROM 't
30f0: 72 65 61 6c 27 7d 20 5c 0a 20 20 20 20 20 20 20  real'} \.       
3100: 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53 45 4c   xFilter    {SEL
3110: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
3120: 4d 20 27 74 72 65 61 6c 27 7d 20 5d 0a 0a 65 78  M 'treal'} ]..ex
3130: 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54  ecsql {.  DROP T
3140: 41 42 4c 45 20 74 31 3b 0a 20 20 44 52 4f 50 20  ABLE t1;.  DROP 
3150: 54 41 42 4c 45 20 74 72 65 61 6c 3b 0a 7d 0a 0a  TABLE treal;.}..
3160: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63  -------.# Test c
31b0: 61 73 65 73 20 76 74 61 62 31 2d 35 20 74 65 73  ases vtab1-5 tes
31c0: 74 20 53 45 4c 45 43 54 20 71 75 65 72 69 65 73  t SELECT queries
31d0: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 20 6a 6f   that include jo
31e0: 69 6e 73 20 6f 6e 20 76 69 72 74 75 61 6c 20 0a  ins on virtual .
31f0: 23 20 74 61 62 6c 65 73 2e 0a 0a 70 72 6f 63 20  # tables...proc 
3200: 66 69 6c 74 65 72 20 7b 6c 6f 67 7d 20 7b 0a 20  filter {log} {. 
3210: 20 73 65 74 20 6f 75 74 20 5b 6c 69 73 74 5d 0a   set out [list].
3220: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 30 7d    for {set ii 0}
3230: 20 7b 24 69 69 20 3c 20 5b 6c 6c 65 6e 67 74 68   {$ii < [llength
3240: 20 24 6c 6f 67 5d 7d 20 7b 69 6e 63 72 20 69 69   $log]} {incr ii
3250: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 6c 69 6e  } {.    if {[lin
3260: 64 65 78 20 24 6c 6f 67 20 24 69 69 5d 20 65 71  dex $log $ii] eq
3270: 20 22 78 46 69 6c 74 65 72 22 7d 20 7b 0a 20 20   "xFilter"} {.  
3280: 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 75 74 20      lappend out 
3290: 78 46 69 6c 74 65 72 0a 20 20 20 20 20 20 6c 61  xFilter.      la
32a0: 70 70 65 6e 64 20 6f 75 74 20 5b 6c 69 6e 64 65  ppend out [linde
32b0: 78 20 24 6c 6f 67 20 5b 65 78 70 72 20 24 69 69  x $log [expr $ii
32c0: 2b 31 5d 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1]].    }.  }. 
32d0: 20 72 65 74 75 72 6e 20 24 6f 75 74 0a 7d 0a 0a   return $out.}..
32e0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d  do_test vtab1-5-
32f0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
3300: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3310: 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20  E t1(a, b, c);. 
3320: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3330: 74 32 28 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20  t2(d, e, f);.   
3340: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3350: 56 41 4c 55 45 53 28 31 2c 20 27 72 65 64 27 2c  VALUES(1, 'red',
3360: 20 27 67 72 65 65 6e 27 29 3b 0a 20 20 20 20 49   'green');.    I
3370: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3380: 4c 55 45 53 28 32 2c 20 27 62 6c 75 65 27 2c 20  LUES(2, 'blue', 
3390: 27 62 6c 61 63 6b 27 29 3b 0a 20 20 20 20 49 4e  'black');.    IN
33a0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
33b0: 55 45 53 28 31 2c 20 27 73 70 61 64 65 73 27 2c  UES(1, 'spades',
33c0: 20 27 63 6c 75 62 73 27 29 3b 0a 20 20 20 20 49   'clubs');.    I
33d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
33e0: 4c 55 45 53 28 32 2c 20 27 68 65 61 72 74 73 27  LUES(2, 'hearts'
33f0: 2c 20 27 64 69 61 6d 6f 6e 64 73 27 29 3b 0a 20  , 'diamonds');. 
3400: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
3410: 4c 20 54 41 42 4c 45 20 65 74 31 20 55 53 49 4e  L TABLE et1 USIN
3420: 47 20 65 63 68 6f 28 74 31 29 3b 0a 20 20 20 20  G echo(t1);.    
3430: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
3440: 41 42 4c 45 20 65 74 32 20 55 53 49 4e 47 20 65  ABLE et2 USING e
3450: 63 68 6f 28 74 32 29 3b 0a 20 20 7d 0a 7d 20 7b  cho(t2);.  }.} {
3460: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }..do_test vtab1
3470: 2d 35 2d 32 20 7b 0a 20 20 73 65 74 20 65 63 68  -5-2 {.  set ech
3480: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78  o_module "".  ex
3490: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
34a0: 43 54 20 2a 20 46 52 4f 4d 20 65 74 31 2c 20 65  CT * FROM et1, e
34b0: 74 32 3b 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20  t2;.  }.} [list 
34c0: 5c 0a 20 20 31 20 72 65 64 20 67 72 65 65 6e 20  \.  1 red green 
34d0: 31 20 73 70 61 64 65 73 20 63 6c 75 62 73 20 20  1 spades clubs  
34e0: 20 20 20 5c 0a 20 20 31 20 72 65 64 20 67 72 65     \.  1 red gre
34f0: 65 6e 20 32 20 68 65 61 72 74 73 20 64 69 61 6d  en 2 hearts diam
3500: 6f 6e 64 73 20 20 5c 0a 20 20 32 20 62 6c 75 65  onds  \.  2 blue
3510: 20 62 6c 61 63 6b 20 31 20 73 70 61 64 65 73 20   black 1 spades 
3520: 63 6c 75 62 73 20 20 20 20 5c 0a 20 20 32 20 62  clubs    \.  2 b
3530: 6c 75 65 20 62 6c 61 63 6b 20 32 20 68 65 61 72  lue black 2 hear
3540: 74 73 20 64 69 61 6d 6f 6e 64 73 20 5c 0a 5d 0a  ts diamonds \.].
3550: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d  do_test vtab1-5-
3560: 33 20 7b 0a 20 20 66 69 6c 74 65 72 20 24 65 63  3 {.  filter $ec
3570: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
3580: 74 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53  t \.  xFilter {S
3590: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
35a0: 52 4f 4d 20 27 74 31 27 7d 20 5c 0a 20 20 78 46  ROM 't1'} \.  xF
35b0: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f  ilter {SELECT ro
35c0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 32 27  wid, * FROM 't2'
35d0: 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53  } \.  xFilter {S
35e0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
35f0: 52 4f 4d 20 27 74 32 27 7d 20 5c 0a 5d 0a 64 6f  ROM 't2'} \.].do
3600: 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d 34 20  _test vtab1-5-4 
3610: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
3620: 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c  ule "".  execsql
3630: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
3640: 46 52 4f 4d 20 65 74 31 2c 20 65 74 32 20 57 48  FROM et1, et2 WH
3650: 45 52 45 20 65 74 32 2e 64 20 3d 20 32 3b 0a 20  ERE et2.d = 2;. 
3660: 20 7d 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 31   }.} [list \.  1
3670: 20 72 65 64 20 67 72 65 65 6e 20 32 20 68 65 61   red green 2 hea
3680: 72 74 73 20 64 69 61 6d 6f 6e 64 73 20 20 5c 0a  rts diamonds  \.
3690: 20 20 32 20 62 6c 75 65 20 62 6c 61 63 6b 20 32    2 blue black 2
36a0: 20 68 65 61 72 74 73 20 64 69 61 6d 6f 6e 64 73   hearts diamonds
36b0: 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61   \.].do_test vta
36c0: 62 31 2d 35 2d 35 20 7b 0a 20 20 66 69 6c 74 65  b1-5-5 {.  filte
36d0: 72 20 24 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d  r $echo_module.}
36e0: 20 5b 6c 69 73 74 20 5c 0a 20 20 78 46 69 6c 74   [list \.  xFilt
36f0: 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  er {SELECT rowid
3700: 2c 20 2a 20 46 52 4f 4d 20 27 74 31 27 7d 20 5c  , * FROM 't1'} \
3710: 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45  .  xFilter {SELE
3720: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
3730: 20 27 74 32 27 7d 20 5c 0a 20 20 78 46 69 6c 74   't2'} \.  xFilt
3740: 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  er {SELECT rowid
3750: 2c 20 2a 20 46 52 4f 4d 20 27 74 32 27 7d 20 5c  , * FROM 't2'} \
3760: 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  .].do_test vtab1
3770: 2d 35 2d 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5-6 {.  execsql
3780: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e   {.    CREATE IN
3790: 44 45 58 20 69 31 20 4f 4e 20 74 32 28 64 29 3b  DEX i1 ON t2(d);
37a0: 0a 20 20 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65  .  }..  db close
37b0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
37c0: 73 74 2e 64 62 0a 20 20 72 65 67 69 73 74 65 72  st.db.  register
37d0: 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71  _echo_module [sq
37e0: 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e  lite3_connection
37f0: 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 0a 20 20  _pointer db]..  
3800: 73 65 74 20 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c  set ::echo_modul
3810: 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b  e "".  execsql {
3820: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
3830: 4f 4d 20 65 74 31 2c 20 65 74 32 20 57 48 45 52  OM et1, et2 WHER
3840: 45 20 65 74 32 2e 64 20 3d 20 32 3b 0a 20 20 7d  E et2.d = 2;.  }
3850: 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 31 20 72  .} [list \.  1 r
3860: 65 64 20 67 72 65 65 6e 20 32 20 68 65 61 72 74  ed green 2 heart
3870: 73 20 64 69 61 6d 6f 6e 64 73 20 20 5c 0a 20 20  s diamonds  \.  
3880: 32 20 62 6c 75 65 20 62 6c 61 63 6b 20 32 20 68  2 blue black 2 h
3890: 65 61 72 74 73 20 64 69 61 6d 6f 6e 64 73 20 5c  earts diamonds \
38a0: 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  .].do_test vtab1
38b0: 2d 35 2d 37 20 7b 0a 20 20 66 69 6c 74 65 72 20  -5-7 {.  filter 
38c0: 24 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d  $::echo_module.}
38d0: 20 5b 6c 69 73 74 20 5c 0a 20 20 78 46 69 6c 74   [list \.  xFilt
38e0: 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  er {SELECT rowid
38f0: 2c 20 2a 20 46 52 4f 4d 20 27 74 32 27 20 57 48  , * FROM 't2' WH
3900: 45 52 45 20 64 20 3d 20 3f 7d 20 5c 0a 20 20 78  ERE d = ?} \.  x
3910: 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72  Filter {SELECT r
3920: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 31  owid, * FROM 't1
3930: 27 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  '}             \
3940: 0a 5d 0a 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20  .]..execsql {.  
3950: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20  DROP TABLE t1;. 
3960: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
3970: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 65 74 31    DROP TABLE et1
3980: 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 65  ;.  DROP TABLE e
3990: 74 32 3b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  t2;.}..#--------
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
39e0: 20 54 65 73 74 20 63 61 73 65 73 20 76 74 61 62   Test cases vtab
39f0: 31 2d 36 20 74 65 73 74 20 49 4e 53 45 52 54 2c  1-6 test INSERT,
3a00: 20 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45   UPDATE and DELE
3a10: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 23  TE operations .#
3a20: 20 6f 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c   on virtual tabl
3a30: 65 73 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  es..do_test vtab
3a40: 31 2d 36 2d 31 20 7b 0a 20 20 65 78 65 63 73 71  1-6-1 {.  execsq
3a50: 6c 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46  l { SELECT sql F
3a60: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
3a70: 72 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  r }.} {}.do_test
3a80: 20 76 74 61 62 31 2d 36 2d 32 20 7b 0a 20 20 65   vtab1-6-2 {.  e
3a90: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
3aa0: 41 54 45 20 54 41 42 4c 45 20 74 72 65 61 6c 28  ATE TABLE treal(
3ab0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
3ac0: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
3ad0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
3ae0: 65 63 68 6f 20 55 53 49 4e 47 20 65 63 68 6f 28  echo USING echo(
3af0: 74 72 65 61 6c 29 3b 0a 20 20 20 20 53 45 4c 45  treal);.    SELE
3b00: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
3b10: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
3b20: 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 3b   type = 'table';
3b30: 0a 20 20 7d 0a 7d 20 7b 74 72 65 61 6c 20 74 65  .  }.} {treal te
3b40: 63 68 6f 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  cho}.do_test vta
3b50: 62 31 2d 36 2d 33 20 7b 0a 20 20 65 78 65 63 73  b1-6-3 {.  execs
3b60: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
3b70: 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c 55 45  INTO techo VALUE
3b80: 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20  S(1, 2, 3);.    
3b90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
3ba0: 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20  cho;.  }.} {1 2 
3bb0: 33 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  3}.do_test vtab1
3bc0: 2d 36 2d 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6-4 {.  execsql
3bd0: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 65   {.    UPDATE te
3be0: 63 68 6f 20 53 45 54 20 61 20 3d 20 35 3b 0a 20  cho SET a = 5;. 
3bf0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
3c00: 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 35   techo;.  }.} {5
3c10: 20 32 20 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 76   2 3}..do_test v
3c20: 74 61 62 31 2d 36 2d 35 20 7b 0a 20 65 78 65 63  tab1-6-5 {. exec
3c30: 73 71 6c 20 7b 0a 20 20 20 55 50 44 41 54 45 20  sql {.   UPDATE 
3c40: 74 65 63 68 6f 20 73 65 74 20 61 20 3d 20 61 7c  techo set a = a|
3c50: 7c 62 7c 7c 63 3b 0a 20 20 20 53 45 4c 45 43 54  |b||c;.   SELECT
3c60: 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20   * FROM techo;. 
3c70: 7d 0a 7d 20 7b 35 32 33 20 32 20 33 7d 0a 0a 64  }.} {523 2 3}..d
3c80: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 36  o_test vtab1-6-6
3c90: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3ca0: 20 20 20 55 50 44 41 54 45 20 74 65 63 68 6f 20     UPDATE techo 
3cb0: 73 65 74 20 72 6f 77 69 64 20 3d 20 31 30 3b 0a  set rowid = 10;.
3cc0: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
3cd0: 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 20 7d   FROM techo;.  }
3ce0: 0a 7d 20 7b 31 30 7d 0a 0a 64 6f 5f 74 65 73 74  .} {10}..do_test
3cf0: 20 76 74 61 62 31 2d 36 2d 37 20 7b 0a 20 20 65   vtab1-6-7 {.  e
3d00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
3d10: 45 54 45 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a  ETE FROM techo;.
3d20: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3d30: 4d 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b  M techo;.  }.} {
3d40: 7d 0a 0a 0a 66 69 6c 65 20 64 65 6c 65 74 65 20  }...file delete 
3d50: 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 0a  -force test2.db.
3d60: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
3d70: 63 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72  ce test2.db-jour
3d80: 6e 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 32 20  nal.sqlite3 db2 
3d90: 74 65 73 74 32 2e 64 62 0a 65 78 65 63 73 71 6c  test2.db.execsql
3da0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
3db0: 45 20 74 65 63 68 6f 28 61 20 50 52 49 4d 41 52  E techo(a PRIMAR
3dc0: 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 7d 20  Y KEY, b, c);.} 
3dd0: 64 62 32 0a 70 72 6f 63 20 63 68 65 63 6b 5f 65  db2.proc check_e
3de0: 63 68 6f 5f 74 61 62 6c 65 20 7b 74 6e 7d 20 7b  cho_table {tn} {
3df0: 0a 20 20 73 65 74 20 3a 3a 64 61 74 61 31 20 5b  .  set ::data1 [
3e00: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
3e10: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 65  rowid, * FROM te
3e20: 63 68 6f 7d 5d 0a 20 20 73 65 74 20 3a 3a 64 61  cho}].  set ::da
3e30: 74 61 32 20 5b 65 78 65 63 73 71 6c 20 7b 53 45  ta2 [execsql {SE
3e40: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
3e50: 4f 4d 20 74 65 63 68 6f 7d 20 64 62 32 5d 0a 20  OM techo} db2]. 
3e60: 20 64 6f 5f 74 65 73 74 20 24 74 6e 20 7b 0a 20   do_test $tn {. 
3e70: 20 20 20 73 74 72 69 6e 67 20 65 71 75 61 6c 20     string equal 
3e80: 24 3a 3a 64 61 74 61 31 20 24 3a 3a 64 61 74 61  $::data1 $::data
3e90: 32 0a 20 20 7d 20 31 0a 7d 0a 73 65 74 20 74 6e  2.  } 1.}.set tn
3ea0: 20 30 0a 66 6f 72 65 61 63 68 20 73 74 6d 74 20   0.foreach stmt 
3eb0: 5b 6c 69 73 74 20 5c 0a 20 20 7b 49 4e 53 45 52  [list \.  {INSER
3ec0: 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c  T INTO techo VAL
3ed0: 55 45 53 28 27 61 62 63 27 2c 20 27 64 65 66 27  UES('abc', 'def'
3ee0: 2c 20 27 67 68 69 27 29 7d 20 20 20 20 20 20 20  , 'ghi')}       
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 5c 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54   \.  {INSERT INT
3f10: 4f 20 74 65 63 68 6f 20 53 45 4c 45 43 54 20 61  O techo SELECT a
3f20: 7c 7c 27 2e 27 7c 7c 72 6f 77 69 64 2c 20 62 2c  ||'.'||rowid, b,
3f30: 20 63 20 46 52 4f 4d 20 74 65 63 68 6f 7d 20 20   c FROM techo}  
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3f50: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 63  {INSERT INTO tec
3f60: 68 6f 20 53 45 4c 45 43 54 20 61 7c 7c 27 78 27  ho SELECT a||'x'
3f70: 7c 7c 72 6f 77 69 64 2c 20 62 2c 20 63 20 46 52  ||rowid, b, c FR
3f80: 4f 4d 20 74 65 63 68 6f 7d 20 20 20 20 20 20 20  OM techo}       
3f90: 20 20 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53 45         \.  {INSE
3fa0: 52 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 53 45  RT INTO techo SE
3fb0: 4c 45 43 54 20 61 7c 7c 27 79 27 7c 7c 72 6f 77  LECT a||'y'||row
3fc0: 69 64 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 65  id, b, c FROM te
3fd0: 63 68 6f 7d 20 20 20 20 20 20 20 20 20 20 20 20  cho}            
3fe0: 20 20 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46 52    \.  {DELETE FR
3ff0: 4f 4d 20 74 65 63 68 6f 20 57 48 45 52 45 20 28  OM techo WHERE (
4000: 6f 69 64 20 25 20 33 29 20 3d 20 30 7d 20 20 20  oid % 3) = 0}   
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4030: 20 7b 55 50 44 41 54 45 20 74 65 63 68 6f 20 73   {UPDATE techo s
4040: 65 74 20 72 6f 77 69 64 20 3d 20 31 30 30 20 57  et rowid = 100 W
4050: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31 7d 20  HERE rowid = 1} 
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4070: 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53          \.  {INS
4080: 45 52 54 20 49 4e 54 4f 20 74 65 63 68 6f 28 61  ERT INTO techo(a
4090: 2c 20 62 29 20 56 41 4c 55 45 53 28 27 68 65 6c  , b) VALUES('hel
40a0: 6c 6f 27 2c 20 27 77 6f 72 6c 64 27 29 7d 20 20  lo', 'world')}  
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 20 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46     \.  {DELETE F
40d0: 52 4f 4d 20 74 65 63 68 6f 7d 20 20 20 20 20 20  ROM techo}      
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4110: 5d 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 24 73  ] {.  execsql $s
4120: 74 6d 74 0a 20 20 65 78 65 63 73 71 6c 20 24 73  tmt.  execsql $s
4130: 74 6d 74 20 64 62 32 0a 20 20 63 68 65 63 6b 5f  tmt db2.  check_
4140: 65 63 68 6f 5f 74 61 62 6c 65 20 76 74 61 62 31  echo_table vtab1
4150: 2d 36 2e 38 2e 5b 69 6e 63 72 20 74 6e 5d 0a 7d  -6.8.[incr tn].}
4160: 0a 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 0a 0a 23  ..db2 close....#
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41b0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61  ------.# Test ca
41c0: 73 65 73 20 76 74 61 62 31 2d 37 20 74 65 73 74  ses vtab1-7 test
41d0: 73 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  s that the value
41e0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 0a 23 20   returned by .# 
41f0: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
4200: 65 72 74 5f 72 6f 77 69 64 28 29 20 69 73 20 73  ert_rowid() is s
4210: 65 74 20 63 6f 72 72 65 63 74 6c 79 20 77 68 65  et correctly whe
4220: 6e 20 72 6f 77 73 20 61 72 65 20 69 6e 73 65 72  n rows are inser
4230: 74 65 64 0a 23 20 69 6e 74 6f 20 76 69 72 74 75  ted.# into virtu
4240: 61 6c 20 74 61 62 6c 65 73 2e 0a 64 6f 5f 74 65  al tables..do_te
4250: 73 74 20 76 74 61 62 31 2e 37 2d 31 20 7b 0a 20  st vtab1.7-1 {. 
4260: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
4270: 52 45 41 54 45 20 54 41 42 4c 45 20 72 65 61 6c  REATE TABLE real
4280: 5f 61 62 63 28 61 20 50 52 49 4d 41 52 59 20 4b  _abc(a PRIMARY K
4290: 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  EY, b, c);.    C
42a0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
42b0: 42 4c 45 20 65 63 68 6f 5f 61 62 63 20 55 53 49  BLE echo_abc USI
42c0: 4e 47 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63  NG echo(real_abc
42d0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
42e0: 65 73 74 20 76 74 61 62 31 2e 37 2d 32 20 7b 0a  est vtab1.7-2 {.
42f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4300: 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f  INSERT INTO echo
4310: 5f 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32  _abc VALUES(1, 2
4320: 2c 20 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  , 3);.    SELECT
4330: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
4340: 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a  id();.  }.} {1}.
4350: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d  do_test vtab1.7-
4360: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
4370: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4380: 65 63 68 6f 5f 61 62 63 28 72 6f 77 69 64 29 20  echo_abc(rowid) 
4390: 56 41 4c 55 45 53 28 33 31 34 32 37 29 3b 0a 20  VALUES(31427);. 
43a0: 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69     SELECT last_i
43b0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20  nsert_rowid();. 
43c0: 20 7d 0a 7d 20 7b 33 31 34 32 37 7d 0a 64 6f 5f   }.} {31427}.do_
43d0: 74 65 73 74 20 76 74 61 62 31 2e 37 2d 34 20 7b  test vtab1.7-4 {
43e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
43f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68   INSERT INTO ech
4400: 6f 5f 61 62 63 20 53 45 4c 45 43 54 20 61 7c 7c  o_abc SELECT a||
4410: 27 2e 76 32 27 2c 20 62 2c 20 63 20 46 52 4f 4d  '.v2', b, c FROM
4420: 20 65 63 68 6f 5f 61 62 63 3b 0a 20 20 20 20 53   echo_abc;.    S
4430: 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72  ELECT last_inser
4440: 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d  t_rowid();.  }.}
4450: 20 7b 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74   {31429}.do_test
4460: 20 76 74 61 62 31 2e 37 2d 35 20 7b 0a 20 20 65   vtab1.7-5 {.  e
4470: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
4480: 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c  ECT rowid, a, b,
4490: 20 63 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63   c FROM echo_abc
44a0: 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 31 20 20  .  }.} [list 1  
44b0: 20 20 20 31 20 20 20 20 32 20 20 33 20 20 5c 0a     1    2  3  \.
44c0: 20 20 20 20 20 20 20 20 33 31 34 32 37 20 7b 7d          31427 {}
44d0: 20 20 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20 20 20     {} {} \.     
44e0: 20 20 20 33 31 34 32 38 20 31 2e 76 32 20 32 20     31428 1.v2 2 
44f0: 20 33 20 20 5c 0a 20 20 20 20 20 20 20 20 33 31   3  \.        31
4500: 34 32 39 20 7b 7d 20 20 7b 7d 20 7b 7d 20 20 5c  429 {}  {} {}  \
4510: 0a 5d 0a 0a 23 20 4e 6f 77 20 74 65 73 74 20 74  .]..# Now test t
4520: 68 61 74 20 44 45 4c 45 54 45 20 61 6e 64 20 55  hat DELETE and U
4530: 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  PDATE operations
4540: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74   do not modify t
4550: 68 65 20 76 61 6c 75 65 2e 0a 64 6f 5f 74 65 73  he value..do_tes
4560: 74 20 76 74 61 62 31 2e 37 2d 36 20 7b 0a 20 20  t vtab1.7-6 {.  
4570: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
4580: 44 41 54 45 20 65 63 68 6f 5f 61 62 63 20 53 45  DATE echo_abc SE
4590: 54 20 63 20 3d 20 35 20 57 48 45 52 45 20 62 20  T c = 5 WHERE b 
45a0: 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 2;.    SELECT 
45b0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
45c0: 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32  d();.  }.} {3142
45d0: 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  9}.do_test vtab1
45e0: 2e 37 2d 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  .7-7 {.  execsql
45f0: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 65 63   {.    UPDATE ec
4600: 68 6f 5f 61 62 63 20 53 45 54 20 72 6f 77 69 64  ho_abc SET rowid
4610: 20 3d 20 35 20 57 48 45 52 45 20 72 6f 77 69 64   = 5 WHERE rowid
4620: 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 1;.    SELECT
4630: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
4640: 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34  id();.  }.} {314
4650: 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  29}.do_test vtab
4660: 31 2e 37 2d 38 20 7b 0a 20 20 65 78 65 63 73 71  1.7-8 {.  execsq
4670: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
4680: 52 4f 4d 20 65 63 68 6f 5f 61 62 63 20 57 48 45  ROM echo_abc WHE
4690: 52 45 20 62 20 3d 20 32 3b 0a 20 20 20 20 53 45  RE b = 2;.    SE
46a0: 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74  LECT last_insert
46b0: 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20  _rowid();.  }.} 
46c0: 7b 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20  {31429}.do_test 
46d0: 76 74 61 62 31 2e 37 2d 39 20 7b 0a 20 20 65 78  vtab1.7-9 {.  ex
46e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
46f0: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  CT rowid, a, b, 
4700: 63 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63 0a  c FROM echo_abc.
4710: 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 33 31 34 32    }.} [list 3142
4720: 37 20 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20  7 {} {} {} \.   
4730: 20 20 20 20 20 33 31 34 32 39 20 7b 7d 20 7b 7d       31429 {} {}
4740: 20 7b 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20   {} \.].do_test 
4750: 76 74 61 62 31 2e 37 2d 31 30 20 7b 0a 20 20 65  vtab1.7-10 {.  e
4760: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
4770: 45 54 45 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62  ETE FROM echo_ab
4780: 63 20 57 48 45 52 45 20 62 20 3d 20 32 3b 0a 20  c WHERE b = 2;. 
4790: 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69     SELECT last_i
47a0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20  nsert_rowid();. 
47b0: 20 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 6f 5f   }.} {31429}.do_
47c0: 74 65 73 74 20 76 74 61 62 31 2e 37 2d 31 31 20  test vtab1.7-11 
47d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
47e0: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20    SELECT rowid, 
47f0: 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 72 65 61  a, b, c FROM rea
4800: 6c 5f 61 62 63 0a 20 20 7d 0a 7d 20 5b 6c 69 73  l_abc.  }.} [lis
4810: 74 20 33 31 34 32 37 20 7b 7d 20 7b 7d 20 7b 7d  t 31427 {} {} {}
4820: 20 5c 0a 20 20 20 20 20 20 20 20 33 31 34 32 39   \.        31429
4830: 20 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 5d 0a 64 6f   {} {} {} \.].do
4840: 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d 31 32  _test vtab1.7-12
4850: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4860: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 65     DELETE FROM e
4870: 63 68 6f 5f 61 62 63 3b 0a 20 20 20 20 53 45 4c  cho_abc;.    SEL
4880: 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  ECT last_insert_
4890: 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b  rowid();.  }.} {
48a0: 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76  31429}.do_test v
48b0: 74 61 62 31 2e 37 2d 31 33 20 7b 0a 20 20 65 78  tab1.7-13 {.  ex
48c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
48d0: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  CT rowid, a, b, 
48e0: 63 20 46 52 4f 4d 20 72 65 61 6c 5f 61 62 63 0a  c FROM real_abc.
48f0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
4900: 74 20 76 74 61 62 31 2e 38 2d 31 20 7b 0a 20 20  t vtab1.8-1 {.  
4910: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  set echo_module 
4920: 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  "".  execsql {. 
4930: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
4940: 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20 20 20  .db' AS aux;.   
4950: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
4960: 54 41 42 4c 45 20 61 75 78 2e 65 32 20 55 53 49  TABLE aux.e2 USI
4970: 4e 47 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63  NG echo(real_abc
4980: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 68  );.  }.  set ech
4990: 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74  o_module.} [list
49a0: 20 78 43 72 65 61 74 65 20 65 63 68 6f 20 61 75   xCreate echo au
49b0: 78 20 65 32 20 72 65 61 6c 5f 61 62 63 20 20 20  x e2 real_abc   
49c0: 5c 0a 20 20 20 20 20 20 20 20 78 53 79 6e 63 20  \.        xSync 
49d0: 20 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63 29    echo(real_abc)
49e0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
49f0: 20 20 20 78 43 6f 6d 6d 69 74 20 65 63 68 6f 28     xCommit echo(
4a00: 72 65 61 6c 5f 61 62 63 29 20 20 20 20 20 20 20  real_abc)       
4a10: 20 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74    \.].do_test vt
4a20: 61 62 31 2e 38 2d 32 20 7b 0a 20 20 65 78 65 63  ab1.8-2 {.  exec
4a30: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
4a40: 41 42 4c 45 20 61 75 78 2e 65 32 3b 0a 20 20 20  ABLE aux.e2;.   
4a50: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 72 65 61   DROP TABLE trea
4a60: 6c 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  l;.    DROP TABL
4a70: 45 20 74 65 63 68 6f 3b 0a 20 20 20 20 44 52 4f  E techo;.    DRO
4a80: 50 20 54 41 42 4c 45 20 65 63 68 6f 5f 61 62 63  P TABLE echo_abc
4a90: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
4aa0: 20 72 65 61 6c 5f 61 62 63 3b 0a 20 20 7d 0a 7d   real_abc;.  }.}
4ab0: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61   {}..do_test vta
4ac0: 62 31 2e 39 2d 31 20 7b 0a 20 20 73 65 74 20 65  b1.9-1 {.  set e
4ad0: 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20  cho_module "".  
4ae0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
4af0: 45 41 54 45 20 54 41 42 4c 45 20 72 28 61 2c 20  EATE TABLE r(a, 
4b00: 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54  b, c);.    CREAT
4b10: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
4b20: 65 20 55 53 49 4e 47 20 65 63 68 6f 28 72 2c 20  e USING echo(r, 
4b30: 65 5f 6c 6f 67 29 3b 0a 20 20 20 20 53 45 4c 45  e_log);.    SELE
4b40: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
4b50: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a  ite_master;.  }.
4b60: 7d 20 7b 72 20 65 20 65 5f 6c 6f 67 7d 0a 64 6f  } {r e e_log}.do
4b70: 5f 74 65 73 74 20 76 74 61 62 31 2e 39 2d 32 20  _test vtab1.9-2 
4b80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4b90: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 65 3b 0a    DROP TABLE e;.
4ba0: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
4bb0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
4bc0: 65 72 3b 0a 20 20 7d 0a 7d 20 7b 72 7d 0a 0a 64  er;.  }.} {r}..d
4bd0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 39 2d 33  o_test vtab1.9-3
4be0: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
4bf0: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71  dule "".  execsq
4c00: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56  l {.    CREATE V
4c10: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 20 55  IRTUAL TABLE e U
4c20: 53 49 4e 47 20 65 63 68 6f 28 72 2c 20 65 5f 6c  SING echo(r, e_l
4c30: 6f 67 2c 20 76 69 72 74 75 61 6c 20 31 20 32 20  og, virtual 1 2 
4c40: 33 20 76 61 72 63 68 61 72 28 33 32 29 29 3b 0a  3 varchar(32));.
4c50: 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d    }.  set echo_m
4c60: 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 20 20  odule.} [list   
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 5c 0a 20 20 78 43 72 65 61 74 65       \.  xCreate
4cb0: 20 65 63 68 6f 20 6d 61 69 6e 20 65 20 72 20 65   echo main e r e
4cc0: 5f 6c 6f 67 20 7b 76 69 72 74 75 61 6c 20 31 20  _log {virtual 1 
4cd0: 32 20 33 20 76 61 72 63 68 61 72 28 33 32 29 7d  2 3 varchar(32)}
4ce0: 20 20 20 20 20 20 5c 0a 20 20 78 53 79 6e 63 20        \.  xSync 
4cf0: 65 63 68 6f 28 72 29 20 20 20 20 20 20 20 20 20  echo(r)         
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d20: 20 20 20 20 20 20 20 5c 0a 20 20 78 43 6f 6d 6d         \.  xComm
4d30: 69 74 20 65 63 68 6f 28 72 29 20 20 20 20 20 20  it echo(r)      
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 20 20 20 20 20 20 5c 0a 5d 0a 0a 64 6f 5f          \.]..do_
4d70: 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d 31 20  test vtab1.10-1 
4d80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4d90: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64    CREATE TABLE d
4da0: 65 6c 28 64 29 3b 0a 20 20 20 20 43 52 45 41 54  el(d);.    CREAT
4db0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
4dc0: 65 32 20 55 53 49 4e 47 20 65 63 68 6f 28 64 65  e2 USING echo(de
4dd0: 6c 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f  l);.  }.  db clo
4de0: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  se.  sqlite3 db 
4df0: 74 65 73 74 2e 64 62 0a 20 20 72 65 67 69 73 74  test.db.  regist
4e00: 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b  er_echo_module [
4e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69  sqlite3_connecti
4e20: 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 20  on_pointer db]. 
4e30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
4e40: 52 4f 50 20 54 41 42 4c 45 20 64 65 6c 3b 0a 20  ROP TABLE del;. 
4e50: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   }.  catchsql {.
4e60: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4e70: 4d 20 65 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  M e2;.  }.} {1 {
4e80: 76 74 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74  vtable construct
4e90: 6f 72 20 66 61 69 6c 65 64 3a 20 65 32 7d 7d 0a  or failed: e2}}.
4ea0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 30  do_test vtab1.10
4eb0: 2d 32 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63  -2 {.  set rc [c
4ec0: 61 74 63 68 20 7b 0a 20 20 20 20 73 65 74 20 70  atch {.    set p
4ed0: 74 72 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e  tr [sqlite3_conn
4ee0: 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64  ection_pointer d
4ef0: 62 5d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  b].    sqlite3_d
4f00: 65 63 6c 61 72 65 5f 76 74 61 62 20 24 70 74 72  eclare_vtab $ptr
4f10: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 61   {CREATE TABLE a
4f20: 62 63 28 61 2c 20 62 2c 20 63 29 7d 0a 20 20 7d  bc(a, b, c)}.  }
4f30: 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 72 63   msg].  list $rc
4f40: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6c 69 62 72   $msg.} {1 {libr
4f50: 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  ary routine call
4f60: 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e  ed out of sequen
4f70: 63 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  ce}}.do_test vta
4f80: 62 31 2e 31 30 2d 33 20 7b 0a 20 20 73 65 74 20  b1.10-3 {.  set 
4f90: 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 62 65  ::echo_module_be
4fa0: 67 69 6e 5f 66 61 69 6c 20 72 0a 20 20 63 61 74  gin_fail r.  cat
4fb0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  chsql {.    INSE
4fc0: 52 54 20 49 4e 54 4f 20 65 20 56 41 4c 55 45 53  RT INTO e VALUES
4fd0: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d  (1, 2, 3);.  }.}
4fe0: 20 7b 31 20 7b 53 51 4c 20 6c 6f 67 69 63 20 65   {1 {SQL logic e
4ff0: 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20  rror or missing 
5000: 64 61 74 61 62 61 73 65 7d 7d 0a 64 6f 5f 74 65  database}}.do_te
5010: 73 74 20 76 74 61 62 31 2e 31 30 2d 34 20 7b 0a  st vtab1.10-4 {.
5020: 20 20 63 61 74 63 68 20 7b 65 78 65 63 73 71 6c    catch {execsql
5030: 20 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 53   {.    EXPLAIN S
5040: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 20 57  ELECT * FROM e W
5050: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 32 3b 0a  HERE rowid = 2;.
5060: 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52      EXPLAIN QUER
5070: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 2a 20  Y PLAN SELECT * 
5080: 46 52 4f 4d 20 65 20 57 48 45 52 45 20 72 6f 77  FROM e WHERE row
5090: 69 64 20 3d 20 32 20 4f 52 44 45 52 20 42 59 20  id = 2 ORDER BY 
50a0: 72 6f 77 69 64 3b 0a 20 20 7d 7d 0a 7d 20 7b 30  rowid;.  }}.} {0
50b0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }..do_test vtab1
50c0: 2e 31 30 2d 35 20 7b 0a 20 20 73 65 74 20 65 63  .10-5 {.  set ec
50d0: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65  ho_module "".  e
50e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
50f0: 45 43 54 20 2a 20 46 52 4f 4d 20 65 20 57 48 45  ECT * FROM e WHE
5100: 52 45 20 72 6f 77 69 64 7c 7c 27 27 20 4d 41 54  RE rowid||'' MAT
5110: 43 48 20 27 70 61 74 74 65 72 6e 27 3b 0a 20 20  CH 'pattern';.  
5120: 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  }.  set echo_mod
5130: 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20  ule.} [list \.  
5140: 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45  xBestIndex {SELE
5150: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
5160: 20 27 72 27 7d 20 5c 0a 20 20 78 46 69 6c 74 65   'r'} \.  xFilte
5170: 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  r {SELECT rowid,
5180: 20 2a 20 46 52 4f 4d 20 27 72 27 7d 20 20 20 20   * FROM 'r'}    
5190: 5c 0a 5d 0a 70 72 6f 63 20 6d 61 74 63 68 5f 66  \.].proc match_f
51a0: 75 6e 63 20 7b 61 72 67 73 7d 20 7b 72 65 74 75  unc {args} {retu
51b0: 72 6e 20 22 22 7d 0a 64 6f 5f 74 65 73 74 20 76  rn ""}.do_test v
51c0: 74 61 62 31 2e 31 30 2d 36 20 7b 0a 20 20 73 65  tab1.10-6 {.  se
51d0: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22  t echo_module ""
51e0: 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 6d  .  db function m
51f0: 61 74 63 68 20 6d 61 74 63 68 5f 66 75 6e 63 0a  atch match_func.
5200: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5210: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 20  SELECT * FROM e 
5220: 57 48 45 52 45 20 6d 61 74 63 68 28 27 70 61 74  WHERE match('pat
5230: 74 65 72 6e 27 2c 20 72 6f 77 69 64 2c 20 27 70  tern', rowid, 'p
5240: 61 74 74 65 72 6e 32 27 29 3b 0a 20 20 7d 0a 20  attern2');.  }. 
5250: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
5260: 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 78 42 65  .} [list \.  xBe
5270: 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20  stIndex {SELECT 
5280: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 72  rowid, * FROM 'r
5290: 27 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b  '} \.  xFilter {
52a0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
52b0: 46 52 4f 4d 20 27 72 27 7d 20 20 20 20 5c 0a 5d  FROM 'r'}    \.]
52c0: 0a 0a 0a 23 20 54 65 73 74 69 6e 67 20 74 68 65  ...# Testing the
52d0: 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 69   xFindFunction i
52e0: 6e 74 65 72 66 61 63 65 0a 23 0a 63 61 74 63 68  nterface.#.catch
52f0: 20 7b 72 65 6e 61 6d 65 20 3a 3a 65 63 68 6f 5f   {rename ::echo_
5300: 67 6c 6f 62 5f 6f 76 65 72 6c 6f 61 64 20 7b 7d  glob_overload {}
5310: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e  }.do_test vtab1.
5320: 31 31 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  11-1 {.  execsql
5330: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
5340: 54 4f 20 72 28 61 2c 62 2c 63 29 20 56 41 4c 55  TO r(a,b,c) VALU
5350: 45 53 28 31 2c 27 3f 27 2c 39 39 29 3b 0a 20 20  ES(1,'?',99);.  
5360: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 28    INSERT INTO r(
5370: 61 2c 62 2c 63 29 20 56 41 4c 55 45 53 28 32 2c  a,b,c) VALUES(2,
5380: 33 2c 39 39 29 3b 0a 20 20 20 20 53 45 4c 45 43  3,99);.    SELEC
5390: 54 20 61 20 47 4c 4f 42 20 62 20 46 52 4f 4d 20  T a GLOB b FROM 
53a0: 65 0a 20 20 7d 0a 7d 20 7b 31 20 30 7d 0a 70 72  e.  }.} {1 0}.pr
53b0: 6f 63 20 3a 3a 65 63 68 6f 5f 67 6c 6f 62 5f 6f  oc ::echo_glob_o
53c0: 76 65 72 6c 6f 61 64 20 7b 61 20 62 7d 20 7b 0a  verload {a b} {.
53d0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 62   return [list $b
53e0: 20 24 61 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 76   $a].}.do_test v
53f0: 74 61 62 31 2e 31 31 2d 32 20 7b 0a 20 20 65 78  tab1.11-2 {.  ex
5400: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
5410: 43 54 20 61 20 6c 69 6b 65 20 27 62 27 20 46 52  CT a like 'b' FR
5420: 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b 30 20 30 7d  OM e.  }.} {0 0}
5430: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
5440: 31 2d 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1-3 {.  execsql 
5450: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 67  {.    SELECT a g
5460: 6c 6f 62 20 27 32 27 20 46 52 4f 4d 20 65 0a 20  lob '2' FROM e. 
5470: 20 7d 0a 7d 20 7b 7b 31 20 32 7d 20 7b 32 20 32   }.} {{1 2} {2 2
5480: 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }}.do_test vtab1
5490: 2e 31 31 2d 34 20 7b 0a 20 20 65 78 65 63 73 71  .11-4 {.  execsq
54a0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 20  l {.    SELECT  
54b0: 67 6c 6f 62 28 27 32 27 2c 61 29 20 46 52 4f 4d  glob('2',a) FROM
54c0: 20 65 0a 20 20 7d 0a 7d 20 7b 30 20 31 7d 0a 64   e.  }.} {0 1}.d
54d0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 31 2d  o_test vtab1.11-
54e0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
54f0: 20 20 20 20 53 45 4c 45 43 54 20 20 67 6c 6f 62      SELECT  glob
5500: 28 61 2c 27 32 27 29 20 46 52 4f 4d 20 65 0a 20  (a,'2') FROM e. 
5510: 20 7d 0a 7d 20 7b 7b 32 20 31 7d 20 7b 32 20 32   }.} {{2 1} {2 2
5520: 7d 7d 0a 20 0a 0a 75 6e 73 65 74 20 2d 6e 6f 63  }}. ..unset -noc
5530: 6f 6d 70 6c 61 69 6e 20 65 63 68 6f 5f 6d 6f 64  omplain echo_mod
5540: 75 6c 65 5f 62 65 67 69 6e 5f 66 61 69 6c 0a 66  ule_begin_fail.f
5550: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.