/ Hex Artifact Content
Login

Artifact d78c94f5ebe6947f1509280a533ac1ffe7a84dba:


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 33 33 20 32  b1.test,v 1.33 2
0200: 30 30 36 2f 30 36 2f 32 34 20 31 31 3a 35 31 3a  006/06/24 11:51:
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 65 73 74    }.} {}..# Test
0b70: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f   to make sure no
0b80: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
0b90: 20 61 6e 64 20 6e 6f 20 6d 65 6d 6f 72 79 20 69   and no memory i
0ba0: 73 20 6c 65 61 6b 65 64 20 69 66 20 77 65 20 0a  s leaked if we .
0bb0: 23 20 73 65 6c 65 63 74 20 61 6e 20 69 6c 6c 65  # select an ille
0bc0: 67 61 6c 20 74 61 62 6c 65 2d 6e 61 6d 65 20 28  gal table-name (
0bd0: 69 2e 65 20 61 20 72 65 73 65 72 76 65 64 20 6e  i.e a reserved n
0be0: 61 6d 65 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  ame or the name 
0bf0: 6f 66 20 61 0a 23 20 74 61 62 6c 65 20 74 68 61  of a.# table tha
0c00: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
0c10: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74 61  )..#.do_test vta
0c20: 62 31 2d 31 2e 37 20 7b 0a 20 20 63 61 74 63 68  b1-1.7 {.  catch
0c30: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
0c40: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
0c50: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 53 49  qlite_master USI
0c60: 4e 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b  NG echo;.  }.} {
0c70: 31 20 7b 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  1 {object name r
0c80: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
0c90: 72 6e 61 6c 20 75 73 65 3a 20 73 71 6c 69 74 65  rnal use: sqlite
0ca0: 5f 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f 74 65 73  _master}}.do_tes
0cb0: 74 20 76 74 61 62 31 2d 31 2e 38 20 7b 0a 20 20  t vtab1-1.8 {.  
0cc0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43  catchsql {.    C
0cd0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 65 61  REATE TABLE trea
0ce0: 6c 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  l(a, b, c);.    
0cf0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
0d00: 41 42 4c 45 20 74 72 65 61 6c 20 55 53 49 4e 47  ABLE treal USING
0d10: 20 65 63 68 6f 28 74 72 65 61 6c 29 3b 0a 20 20   echo(treal);.  
0d20: 7d 0a 7d 20 7b 31 20 7b 74 61 62 6c 65 20 74 72  }.} {1 {table tr
0d30: 65 61 6c 20 61 6c 72 65 61 64 79 20 65 78 69 73  eal already exis
0d40: 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  ts}}.do_test vta
0d50: 62 31 2d 31 2e 39 20 7b 0a 20 20 65 78 65 63 73  b1-1.9 {.  execs
0d60: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
0d70: 42 4c 45 20 74 72 65 61 6c 3b 0a 20 20 20 20 53  BLE treal;.    S
0d80: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
0d90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
0da0: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b  DER BY 1.  }.} {
0db0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }..do_test vtab1
0dc0: 2d 31 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71  -1.10 {.  execsq
0dd0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0de0: 41 42 4c 45 20 74 72 65 61 6c 28 61 2c 20 62 2c  ABLE treal(a, b,
0df0: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   c);.    CREATE 
0e00: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65  VIRTUAL TABLE te
0e10: 63 68 6f 20 55 53 49 4e 47 20 65 63 68 6f 28 74  cho USING echo(t
0e20: 72 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 64 62 20  real);.  }.  db 
0e30: 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
0e40: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
0e50: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
0e60: 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b  CT * FROM techo;
0e70: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75  .  }.} {1 {no su
0e80: 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d  ch module: echo}
0e90: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
0ea0: 31 2e 31 31 20 7b 0a 20 20 63 61 74 63 68 73 71  1.11 {.  catchsq
0eb0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
0ec0: 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c 55 45 53  NTO techo VALUES
0ed0: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d  (1, 2, 3);.  }.}
0ee0: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64   {1 {no such mod
0ef0: 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74  ule: echo}}.do_t
0f00: 65 73 74 20 76 74 61 62 31 2d 31 2e 31 32 20 7b  est vtab1-1.12 {
0f10: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
0f20: 20 20 55 50 44 41 54 45 20 74 65 63 68 6f 20 53    UPDATE techo S
0f30: 45 54 20 61 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d  ET a = 10;.  }.}
0f40: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64   {1 {no such mod
0f50: 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74  ule: echo}}.do_t
0f60: 65 73 74 20 76 74 61 62 31 2d 31 2e 31 33 20 7b  est vtab1-1.13 {
0f70: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
0f80: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65    DELETE FROM te
0f90: 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e  cho;.  }.} {1 {n
0fa0: 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65  o such module: e
0fb0: 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74  cho}}.do_test vt
0fc0: 61 62 31 2d 31 2e 31 34 20 7b 0a 20 20 63 61 74  ab1-1.14 {.  cat
0fd0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  chsql {.    PRAG
0fe0: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74 65  MA table_info(te
0ff0: 63 68 6f 29 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e  cho).  }.} {1 {n
1000: 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65  o such module: e
1010: 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74  cho}}.do_test vt
1020: 61 62 31 2d 31 2e 31 35 20 7b 0a 20 20 63 61 74  ab1-1.15 {.  cat
1030: 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  chsql {.    DROP
1040: 20 54 41 42 4c 45 20 74 65 63 68 6f 3b 0a 20 20   TABLE techo;.  
1050: 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  }.} {1 {no such 
1060: 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 0a  module: echo}}..
1070: 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f  register_echo_mo
1080: 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f  dule [sqlite3_co
1090: 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
10a0: 20 64 62 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61   db].do_test vta
10b0: 62 31 2d 31 2e 58 20 7b 0a 20 20 65 78 65 63 73  b1-1.X {.  execs
10c0: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
10d0: 42 4c 45 20 74 65 63 68 6f 3b 0a 20 20 20 20 44  BLE techo;.    D
10e0: 52 4f 50 20 54 41 42 4c 45 20 74 72 65 61 6c 3b  ROP TABLE treal;
10f0: 0a 20 20 20 20 53 45 4c 45 43 54 20 73 71 6c 20  .    SELECT sql 
1100: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1110: 65 72 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d  er;.  }.} {}..#-
1120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1160: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73  -----.# Test cas
1170: 65 73 20 76 74 61 62 31 2e 32 2e 2a 0a 23 0a 23  es vtab1.2.*.#.#
1180: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
1190: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
11a0: 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
11b0: 2e 20 54 68 65 20 65 63 68 6f 20 6d 6f 64 75 6c  . The echo modul
11c0: 65 0a 23 20 68 61 73 20 61 6c 72 65 61 64 79 20  e.# has already 
11d0: 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 2e  been registered.
11e0: 0a 0a 23 20 49 66 20 61 20 73 69 6e 67 6c 65 20  ..# If a single 
11f0: 61 72 67 75 6d 65 6e 74 20 69 73 20 70 61 73 73  argument is pass
1200: 65 64 20 74 6f 20 74 68 65 20 65 63 68 6f 20 6d  ed to the echo m
1210: 6f 64 75 6c 65 20 64 75 72 69 6e 67 20 74 61 62  odule during tab
1220: 6c 65 0a 23 20 63 72 65 61 74 69 6f 6e 2c 20 69  le.# creation, i
1230: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
1240: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
1250: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 61   table in the sa
1260: 6d 65 0a 23 20 64 61 74 61 62 61 73 65 2e 20 54  me.# database. T
1270: 68 65 20 65 63 68 6f 20 6d 6f 64 75 6c 65 20 61  he echo module a
1280: 74 74 65 6d 70 74 73 20 74 6f 20 73 65 74 20 74  ttempts to set t
1290: 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
12a0: 0a 23 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  .# new virtual t
12b0: 61 62 6c 65 20 74 6f 20 62 65 20 74 68 65 20 73  able to be the s
12c0: 61 6d 65 20 61 73 20 74 68 65 20 65 78 69 73 74  ame as the exist
12d0: 69 6e 67 20 64 61 74 61 62 61 73 65 20 74 61 62  ing database tab
12e0: 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74  le..#.do_test vt
12f0: 61 62 31 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63  ab1-2.1 {.  exec
1300: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1310: 20 54 41 42 4c 45 20 74 65 6d 70 6c 61 74 65 28   TABLE template(
1320: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 7d 0a 20 20  a, b, c);.  }.  
1330: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1340: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74 65 6d 70   table_info(temp
1350: 6c 61 74 65 29 3b 20 7d 0a 7d 20 5b 6c 69 73 74  late); }.} [list
1360: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 30 20 61           \.  0 a
1370: 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20 20 31   {} 0 {} 0 \.  1
1380: 20 62 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20   b {} 0 {} 0 \. 
1390: 20 32 20 63 20 7b 7d 20 30 20 7b 7d 20 30 20 5c   2 c {} 0 {} 0 \
13a0: 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  .].do_test vtab1
13b0: 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.2 {.  execsql
13c0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49   {.    CREATE VI
13d0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55  RTUAL TABLE t1 U
13e0: 53 49 4e 47 20 65 63 68 6f 28 74 65 6d 70 6c 61  SING echo(templa
13f0: 74 65 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73  te);.  }.  execs
1400: 71 6c 20 7b 20 50 52 41 47 4d 41 20 74 61 62 6c  ql { PRAGMA tabl
1410: 65 5f 69 6e 66 6f 28 74 31 29 3b 20 7d 0a 7d 20  e_info(t1); }.} 
1420: 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 5c 0a  [list         \.
1430: 20 20 30 20 61 20 7b 7d 20 30 20 7b 7d 20 30 20    0 a {} 0 {} 0 
1440: 5c 0a 20 20 31 20 62 20 7b 7d 20 30 20 7b 7d 20  \.  1 b {} 0 {} 
1450: 30 20 5c 0a 20 20 32 20 63 20 7b 7d 20 30 20 7b  0 \.  2 c {} 0 {
1460: 7d 20 30 20 5c 0a 5d 0a 0a 23 20 54 65 73 74 20  } 0 \.]..# Test 
1470: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1480: 65 20 63 61 6e 20 62 65 20 75 6e 6c 6f 61 64 65  e can be unloade
1490: 64 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 69  d. This should i
14a0: 6e 76 6f 6b 65 20 74 68 65 20 78 44 69 73 63 6f  nvoke the xDisco
14b0: 6e 6e 65 63 74 28 29 0a 23 20 63 61 6c 6c 62 61  nnect().# callba
14c0: 63 6b 20 66 6f 72 20 74 68 65 20 73 75 63 63 65  ck for the succe
14d0: 73 73 66 75 6c 6c 79 20 63 72 65 61 74 65 20 76  ssfully create v
14e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 28 74 31  irtual table (t1
14f0: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74 61  )..#.do_test vta
1500: 62 31 2d 32 2e 33 20 7b 0a 20 20 73 65 74 20 65  b1-2.3 {.  set e
1510: 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 6c 69 73 74  cho_module [list
1520: 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  ].  db close.  s
1530: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d  et echo_module.}
1540: 20 5b 6c 69 73 74 20 78 44 69 73 63 6f 6e 6e 65   [list xDisconne
1550: 63 74 5d 0a 0a 23 20 52 65 2d 6f 70 65 6e 20 74  ct]..# Re-open t
1560: 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  he database. Thi
1570: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 75  s should not cau
1580: 73 65 20 61 6e 79 20 76 69 72 74 75 61 6c 20 6d  se any virtual m
1590: 65 74 68 6f 64 73 20 74 6f 20 0a 23 20 62 65 20  ethods to .# be 
15a0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 69 6e 76 6f  called. The invo
15b0: 63 61 74 69 6f 6e 20 6f 66 20 78 43 6f 6e 6e 65  cation of xConne
15c0: 63 74 28 29 20 69 73 20 64 65 6c 61 79 65 64 20  ct() is delayed 
15d0: 75 6e 74 69 6c 20 74 68 65 20 76 69 72 74 75 61  until the virtua
15e0: 6c 0a 23 20 74 61 62 6c 65 20 73 63 68 65 6d 61  l.# table schema
15f0: 20 69 73 20 66 69 72 73 74 20 72 65 71 75 69 72   is first requir
1600: 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 69 6c  ed by the compil
1610: 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74  er..#.do_test vt
1620: 61 62 31 2d 32 2e 34 20 7b 0a 20 20 73 65 74 20  ab1-2.4 {.  set 
1630: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 6c 69 73  echo_module [lis
1640: 74 5d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  t].  sqlite3 db 
1650: 74 65 73 74 2e 64 62 0a 20 20 64 62 20 63 61 63  test.db.  db cac
1660: 68 65 20 73 69 7a 65 20 30 0a 20 20 73 65 74 20  he size 0.  set 
1670: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 7b 7d  echo_module.} {}
1680: 0a 0a 23 20 54 72 79 20 74 6f 20 71 75 65 72 79  ..# Try to query
1690: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
16a0: 6c 65 20 73 63 68 65 6d 61 2e 20 54 68 69 73 20  le schema. This 
16b0: 73 68 6f 75 6c 64 20 66 61 69 6c 2c 20 61 73 20  should fail, as 
16c0: 74 68 65 0a 23 20 65 63 68 6f 20 6d 6f 64 75 6c  the.# echo modul
16d0: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72  e has not been r
16e0: 65 67 69 73 74 65 72 65 64 20 77 69 74 68 20 74  egistered with t
16f0: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
1700: 6e 65 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65  nection..#.do_te
1710: 73 74 20 76 74 61 62 31 2e 32 2e 36 20 7b 0a 62  st vtab1.2.6 {.b
1720: 72 65 61 6b 70 6f 69 6e 74 0a 20 20 63 61 74 63  reakpoint.  catc
1730: 68 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 74 61  hsql { PRAGMA ta
1740: 62 6c 65 5f 69 6e 66 6f 28 74 31 29 3b 20 7d 0a  ble_info(t1); }.
1750: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f  } {1 {no such mo
1760: 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 0a 23 20  dule: echo}}..# 
1770: 52 65 67 69 73 74 65 72 20 74 68 65 20 6d 6f 64  Register the mod
1780: 75 6c 65 0a 72 65 67 69 73 74 65 72 5f 65 63 68  ule.register_ech
1790: 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65  o_module [sqlite
17a0: 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69  3_connection_poi
17b0: 6e 74 65 72 20 64 62 5d 0a 0a 23 20 54 72 79 20  nter db]..# Try 
17c0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 76 69 72  to query the vir
17d0: 74 75 61 6c 20 74 61 62 6c 65 20 73 63 68 65 6d  tual table schem
17e0: 61 20 61 67 61 69 6e 2e 20 54 68 69 73 20 74 69  a again. This ti
17f0: 6d 65 20 69 74 20 73 68 6f 75 6c 64 0a 23 20 69  me it should.# i
1800: 6e 76 6f 6b 65 20 74 68 65 20 78 43 6f 6e 6e 65  nvoke the xConne
1810: 63 74 20 6d 65 74 68 6f 64 20 61 6e 64 20 73 75  ct method and su
1820: 63 63 65 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  cceed..#.do_test
1830: 20 76 74 61 62 31 2e 32 2e 37 20 7b 0a 20 20 65   vtab1.2.7 {.  e
1840: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
1850: 74 61 62 6c 65 5f 69 6e 66 6f 28 74 31 29 3b 20  table_info(t1); 
1860: 7d 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20  }.} [list       
1870: 20 20 5c 0a 20 20 30 20 61 20 7b 7d 20 30 20 7b    \.  0 a {} 0 {
1880: 7d 20 30 20 5c 0a 20 20 31 20 62 20 7b 7d 20 30  } 0 \.  1 b {} 0
1890: 20 7b 7d 20 30 20 5c 0a 20 20 32 20 63 20 7b 7d   {} 0 \.  2 c {}
18a0: 20 30 20 7b 7d 20 30 20 5c 0a 5d 0a 64 6f 5f 74   0 {} 0 \.].do_t
18b0: 65 73 74 20 76 74 61 62 31 2e 32 2e 38 20 7b 0a  est vtab1.2.8 {.
18c0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
18d0: 65 0a 7d 20 7b 78 43 6f 6e 6e 65 63 74 20 65 63  e.} {xConnect ec
18e0: 68 6f 20 6d 61 69 6e 20 74 31 20 74 65 6d 70 6c  ho main t1 templ
18f0: 61 74 65 7d 0a 0a 23 20 44 72 6f 70 20 74 61 62  ate}..# Drop tab
1900: 6c 65 20 74 31 2e 20 54 68 69 73 20 73 68 6f 75  le t1. This shou
1910: 6c 64 20 63 61 75 73 65 20 74 68 65 20 78 44 65  ld cause the xDe
1920: 73 74 72 6f 79 20 28 62 75 74 20 6e 6f 74 20 78  stroy (but not x
1930: 44 69 73 63 6f 6e 6e 65 63 74 29 20 6d 65 74 68  Disconnect) meth
1940: 6f 64 20 0a 23 20 74 6f 20 62 65 20 69 6e 76 6f  od .# to be invo
1950: 6b 65 64 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61  ked..do_test vta
1960: 62 31 2d 32 2e 35 20 7b 0a 20 20 73 65 74 20 65  b1-2.5 {.  set e
1970: 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20  cho_module "".  
1980: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
1990: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d  OP TABLE t1;.  }
19a0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
19b0: 6c 65 0a 7d 20 7b 78 44 65 73 74 72 6f 79 7d 0a  le.} {xDestroy}.
19c0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32  .do_test vtab1-2
19d0: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
19e0: 20 0a 20 20 20 20 50 52 41 47 4d 41 20 74 61 62   .    PRAGMA tab
19f0: 6c 65 5f 69 6e 66 6f 28 74 31 29 3b 20 0a 20 20  le_info(t1); .  
1a00: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76  }.} {}.do_test v
1a10: 74 61 62 31 2d 32 2e 37 20 7b 0a 20 20 65 78 65  tab1-2.7 {.  exe
1a20: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1a30: 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
1a40: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20  e_master;.  }.} 
1a50: 5b 6c 69 73 74 20 7b 43 52 45 41 54 45 20 54 41  [list {CREATE TA
1a60: 42 4c 45 20 74 65 6d 70 6c 61 74 65 28 61 2c 20  BLE template(a, 
1a70: 62 2c 20 63 29 7d 5d 0a 23 20 43 6c 65 61 6e 20  b, c)}].# Clean 
1a80: 75 70 20 6f 74 68 65 72 20 74 65 73 74 20 61 72  up other test ar
1a90: 74 69 66 61 63 74 73 3a 0a 64 6f 5f 74 65 73 74  tifacts:.do_test
1aa0: 20 76 74 61 62 31 2d 32 2e 38 20 7b 0a 20 20 65   vtab1-2.8 {.  e
1ab0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 52  xecsql { .    DR
1ac0: 4f 50 20 54 41 42 4c 45 20 74 65 6d 70 6c 61 74  OP TABLE templat
1ad0: 65 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 71  e;.    SELECT sq
1ae0: 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
1af0: 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 5b 6c 69 73  ster;.  }.} [lis
1b00: 74 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t]..#-----------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1b50: 73 74 20 63 61 73 65 20 76 74 61 62 31 2d 33 20  st case vtab1-3 
1b60: 74 65 73 74 20 74 61 62 6c 65 20 73 63 61 6e 73  test table scans
1b70: 20 61 6e 64 20 74 68 65 20 65 63 68 6f 20 6d 6f   and the echo mo
1b80: 64 75 6c 65 27 73 20 0a 23 20 78 42 65 73 74 49  dule's .# xBestI
1b90: 6e 64 65 78 2f 78 46 69 6c 74 65 72 20 68 61 6e  ndex/xFilter han
1ba0: 64 6c 69 6e 67 20 6f 66 20 57 48 45 52 45 20 63  dling of WHERE c
1bb0: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 0a 64 6f 5f 74  onditions...do_t
1bc0: 65 73 74 20 76 74 61 62 31 2d 33 2e 31 20 7b 0a  est vtab1-3.1 {.
1bd0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
1be0: 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b  e "".  execsql {
1bf0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1c00: 45 20 74 72 65 61 6c 28 61 20 49 4e 54 45 47 45  E treal(a INTEGE
1c10: 52 2c 20 62 20 49 4e 54 45 47 45 52 2c 20 63 29  R, b INTEGER, c)
1c20: 3b 20 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  ; .    CREATE IN
1c30: 44 45 58 20 74 72 65 61 6c 5f 69 64 78 20 4f 4e  DEX treal_idx ON
1c40: 20 74 72 65 61 6c 28 62 29 3b 0a 20 20 20 20 43   treal(b);.    C
1c50: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1c60: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 65 63 68  BLE t1 USING ech
1c70: 6f 28 74 72 65 61 6c 29 3b 0a 20 20 7d 0a 20 20  o(treal);.  }.  
1c80: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a  set echo_module.
1c90: 7d 20 5b 6c 69 73 74 20 78 43 72 65 61 74 65 20  } [list xCreate 
1ca0: 65 63 68 6f 20 6d 61 69 6e 20 74 31 20 74 72 65  echo main t1 tre
1cb0: 61 6c 20 20 20 5c 0a 20 20 20 20 20 20 20 20 78  al   \.        x
1cc0: 53 79 6e 63 20 20 20 65 63 68 6f 28 74 72 65 61  Sync   echo(trea
1cd0: 6c 29 20 20 5c 0a 20 20 20 20 20 20 20 20 78 43  l)  \.        xC
1ce0: 6f 6d 6d 69 74 20 65 63 68 6f 28 74 72 65 61 6c  ommit echo(treal
1cf0: 29 20 20 5c 0a 5d 0a 0a 23 20 54 65 73 74 20 74  )  \.]..# Test t
1d00: 68 61 74 20 61 20 53 45 4c 45 43 54 20 6f 6e 20  hat a SELECT on 
1d10: 74 31 20 64 6f 65 73 6e 27 74 20 63 72 61 73 68  t1 doesn't crash
1d20: 2e 20 4e 6f 20 72 6f 77 73 20 61 72 65 20 72 65  . No rows are re
1d30: 74 75 72 6e 65 64 0a 23 20 62 65 63 61 75 73 65  turned.# because
1d40: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1d50: 72 65 61 6c 20 74 61 62 6c 65 20 69 73 20 63 75  real table is cu
1d60: 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2e 0a 23  rrently empty..#
1d70: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33  .do_test vtab1-3
1d80: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
1d90: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62  .    SELECT a, b
1da0: 2c 20 63 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  , c FROM t1;.  }
1db0: 0a 7d 20 7b 7d 0a 0a 23 20 50 75 74 20 73 6f 6d  .} {}..# Put som
1dc0: 65 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  e data into the 
1dd0: 74 61 62 6c 65 20 74 72 65 61 6c 2e 20 54 68 65  table treal. The
1de0: 6e 20 74 72 79 20 61 20 66 65 77 20 73 69 6d 70  n try a few simp
1df0: 6c 65 20 53 45 4c 45 43 54 20 0a 23 20 73 74 61  le SELECT .# sta
1e00: 74 65 6d 65 6e 74 73 20 6f 6e 20 74 31 2e 0a 23  tements on t1..#
1e10: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33  .do_test vtab1-3
1e20: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
1e30: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1e40: 20 74 72 65 61 6c 20 56 41 4c 55 45 53 28 31 2c   treal VALUES(1,
1e50: 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45   2, 3);.    INSE
1e60: 52 54 20 49 4e 54 4f 20 74 72 65 61 6c 20 56 41  RT INTO treal VA
1e70: 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20  LUES(4, 5, 6);. 
1e80: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1e90: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20   t1;.  }.} {1 2 
1ea0: 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74  3 4 5 6}.do_test
1eb0: 20 76 74 61 62 31 2d 33 2e 34 20 7b 0a 20 20 65   vtab1-3.4 {.  e
1ec0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1ed0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT a FROM t1;. 
1ee0: 20 7d 0a 7d 20 7b 31 20 34 7d 0a 64 6f 5f 74 65   }.} {1 4}.do_te
1ef0: 73 74 20 76 74 61 62 31 2d 33 2e 35 20 7b 0a 20  st vtab1-3.5 {. 
1f00: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
1f10: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
1f20: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d   t1;.  }.} {1 2}
1f30: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33  .do_test vtab1-3
1f40: 2e 36 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  .6 {.  set echo_
1f50: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63  module "".  exec
1f60: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1f70: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
1f80: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
1f90: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e  do_test vtab1-3.
1fa0: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  7 {.  execsql {.
1fb0: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
1fc0: 2c 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  , * FROM t1;.  }
1fd0: 0a 7d 20 7b 31 20 31 20 32 20 33 20 32 20 34 20  .} {1 1 2 3 2 4 
1fe0: 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  5 6}.do_test vta
1ff0: 62 31 2d 33 2e 38 20 7b 0a 20 20 65 78 65 63 73  b1-3.8 {.  execs
2000: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2010: 61 20 41 53 20 64 2c 20 62 20 41 53 20 65 2c 20  a AS d, b AS e, 
2020: 63 20 41 53 20 66 20 46 52 4f 4d 20 74 31 3b 0a  c AS f FROM t1;.
2030: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35    }.} {1 2 3 4 5
2040: 20 36 7d 0a 0a 23 20 45 78 65 63 75 74 65 20 73   6}..# Execute s
2050: 6f 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ome SELECT state
2060: 6d 65 6e 74 73 20 77 69 74 68 20 57 48 45 52 45  ments with WHERE
2070: 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65 20   clauses on the 
2080: 74 31 20 74 61 62 6c 65 2e 0a 23 20 54 68 65 6e  t1 table..# Then
2090: 20 63 68 65 63 6b 20 74 68 65 20 65 63 68 6f 5f   check the echo_
20a0: 6d 6f 64 75 6c 65 20 76 61 72 69 61 62 6c 65 20  module variable 
20b0: 28 77 72 69 74 74 65 6e 20 74 6f 20 62 79 20 74  (written to by t
20c0: 68 65 20 6d 6f 64 75 6c 65 20 6d 65 74 68 6f 64  he module method
20d0: 73 0a 23 20 69 6e 20 74 65 73 74 38 2e 63 29 20  s.# in test8.c) 
20e0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
20f0: 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 61 6e   xBestIndex() an
2100: 64 20 78 46 69 6c 74 65 72 28 29 20 6d 65 74 68  d xFilter() meth
2110: 6f 64 73 20 77 65 72 65 0a 23 20 63 61 6c 6c 65  ods were.# calle
2120: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 64  d correctly..#.d
2130: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 38  o_test vtab1-3.8
2140: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
2150: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71  dule "".  execsq
2160: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
2170: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20   FROM t1;.  }.  
2180: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a  set echo_module.
2190: 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64  } [list xBestInd
21a0: 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  ex {SELECT rowid
21b0: 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27  , * FROM 'treal'
21c0: 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c  } \.        xFil
21d0: 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72  ter    {SELECT r
21e0: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72  owid, * FROM 'tr
21f0: 65 61 6c 27 7d 20 5d 0a 64 6f 5f 74 65 73 74 20  eal'} ].do_test 
2200: 76 74 61 62 31 2d 33 2e 39 20 7b 0a 20 20 73 65  vtab1-3.9 {.  se
2210: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22  t echo_module ""
2220: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2230: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2240: 31 20 57 48 45 52 45 20 62 20 3d 20 35 3b 0a 20  1 WHERE b = 5;. 
2250: 20 7d 0a 7d 20 7b 34 20 35 20 36 7d 0a 64 6f 5f   }.} {4 5 6}.do_
2260: 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31 30 20  test vtab1-3.10 
2270: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
2280: 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73  ule.} [list xBes
2290: 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72  tIndex {SELECT r
22a0: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72  owid, * FROM 'tr
22b0: 65 61 6c 27 20 57 48 45 52 45 20 62 20 3d 20 3f  eal' WHERE b = ?
22c0: 7d 20 20 20 5c 0a 20 20 20 20 20 20 20 20 78 46  }   \.        xF
22d0: 69 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54  ilter    {SELECT
22e0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
22f0: 74 72 65 61 6c 27 20 57 48 45 52 45 20 62 20 3d  treal' WHERE b =
2300: 20 3f 7d 20 35 20 5d 0a 64 6f 5f 74 65 73 74 20   ?} 5 ].do_test 
2310: 76 74 61 62 31 2d 33 2e 31 30 20 7b 0a 20 20 73  vtab1-3.10 {.  s
2320: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22  et echo_module "
2330: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
2340: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2350: 74 31 20 57 48 45 52 45 20 62 20 3e 3d 20 35 20  t1 WHERE b >= 5 
2360: 41 4e 44 20 62 20 3c 3d 20 31 30 3b 0a 20 20 7d  AND b <= 10;.  }
2370: 0a 7d 20 7b 34 20 35 20 36 7d 0a 64 6f 5f 74 65  .} {4 5 6}.do_te
2380: 73 74 20 76 74 61 62 31 2d 33 2e 31 31 20 7b 0a  st vtab1-3.11 {.
2390: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
23a0: 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49  e.} [list xBestI
23b0: 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77  ndex {SELECT row
23c0: 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61  id, * FROM 'trea
23d0: 6c 27 20 57 48 45 52 45 20 62 20 3e 3d 20 3f 20  l' WHERE b >= ? 
23e0: 41 4e 44 20 62 20 3c 3d 20 3f 7d 20 20 20 20 20  AND b <= ?}     
23f0: 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74   \.        xFilt
2400: 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72 6f  er    {SELECT ro
2410: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65  wid, * FROM 'tre
2420: 61 6c 27 20 57 48 45 52 45 20 62 20 3e 3d 20 3f  al' WHERE b >= ?
2430: 20 41 4e 44 20 62 20 3c 3d 20 3f 7d 20 35 20 31   AND b <= ?} 5 1
2440: 30 20 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  0 ].do_test vtab
2450: 31 2d 33 2e 31 32 20 7b 0a 20 20 73 65 74 20 65  1-3.12 {.  set e
2460: 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20  cho_module "".  
2470: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
2480: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
2490: 48 45 52 45 20 62 20 42 45 54 57 45 45 4e 20 32  HERE b BETWEEN 2
24a0: 20 41 4e 44 20 31 30 3b 0a 20 20 7d 0a 7d 20 7b   AND 10;.  }.} {
24b0: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f  1 2 3 4 5 6}.do_
24c0: 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31 33 20  test vtab1-3.13 
24d0: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
24e0: 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73  ule.} [list xBes
24f0: 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72  tIndex {SELECT r
2500: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72  owid, * FROM 'tr
2510: 65 61 6c 27 20 57 48 45 52 45 20 62 20 3e 3d 20  eal' WHERE b >= 
2520: 3f 20 41 4e 44 20 62 20 3c 3d 20 3f 7d 20 20 20  ? AND b <= ?}   
2530: 20 20 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69     \.        xFi
2540: 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20  lter    {SELECT 
2550: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74  rowid, * FROM 't
2560: 72 65 61 6c 27 20 57 48 45 52 45 20 62 20 3e 3d  real' WHERE b >=
2570: 20 3f 20 41 4e 44 20 62 20 3c 3d 20 3f 7d 20 32   ? AND b <= ?} 2
2580: 20 31 30 20 5d 0a 0a 23 20 41 64 64 20 61 20 66   10 ]..# Add a f
2590: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  unction for the 
25a0: 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 20  MATCH operator. 
25b0: 45 76 65 72 79 74 68 69 6e 67 20 61 6c 77 61 79  Everything alway
25c0: 73 20 6d 61 74 63 68 65 73 21 0a 23 70 72 6f 63  s matches!.#proc
25d0: 20 74 65 73 74 5f 6d 61 74 63 68 20 7b 6c 68 73   test_match {lhs
25e0: 20 72 68 73 7d 20 7b 0a 23 20 20 6c 61 70 70 65   rhs} {.#  lappe
25f0: 6e 64 20 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c 65  nd ::echo_module
2600: 20 4d 41 54 43 48 20 24 6c 68 73 20 24 72 68 73   MATCH $lhs $rhs
2610: 0a 23 20 20 72 65 74 75 72 6e 20 31 0a 23 7d 0a  .#  return 1.#}.
2620: 23 64 62 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74  #db function mat
2630: 63 68 20 74 65 73 74 5f 6d 61 74 63 68 0a 0a 73  ch test_match..s
2640: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22  et echo_module "
2650: 22 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ".do_test vtab1-
2660: 33 2e 31 32 20 7b 0a 20 20 73 65 74 20 65 63 68  3.12 {.  set ech
2670: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63 61  o_module "".  ca
2680: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
2690: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
26a0: 45 52 45 20 61 20 4d 41 54 43 48 20 27 73 74 72  ERE a MATCH 'str
26b0: 69 6e 67 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  ing';.  }.} {1 {
26c0: 4d 41 54 43 48 20 69 73 20 6e 6f 74 20 69 6d 70  MATCH is not imp
26d0: 6c 65 6d 65 6e 74 65 64 7d 7d 0a 64 6f 5f 74 65  lemented}}.do_te
26e0: 73 74 20 76 74 61 62 31 2d 33 2e 31 33 20 7b 0a  st vtab1-3.13 {.
26f0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
2700: 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49  e.} [list xBestI
2710: 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77  ndex {SELECT row
2720: 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61  id, * FROM 'trea
2730: 6c 27 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46  l'} \.        xF
2740: 69 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54  ilter    {SELECT
2750: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
2760: 74 72 65 61 6c 27 7d 5d 0a 64 6f 5f 74 65 73 74  treal'}].do_test
2770: 20 76 74 61 62 31 2d 33 2e 31 34 20 7b 0a 20 20   vtab1-3.14 {.  
2780: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  set echo_module 
2790: 22 22 0a 62 74 72 65 65 5f 62 72 65 61 6b 70 6f  "".btree_breakpo
27a0: 69 6e 74 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  int.  execsql {.
27b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
27c0: 4d 20 74 31 20 57 48 45 52 45 20 62 20 4d 41 54  M t1 WHERE b MAT
27d0: 43 48 20 27 73 74 72 69 6e 67 27 3b 0a 20 20 7d  CH 'string';.  }
27e0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74  .} {}.do_test vt
27f0: 61 62 31 2d 33 2e 31 35 20 7b 0a 20 20 73 65 74  ab1-3.15 {.  set
2800: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b   echo_module.} [
2810: 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20  list xBestIndex 
2820: 5c 0a 20 20 20 20 20 20 20 20 7b 53 45 4c 45 43  \.        {SELEC
2830: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
2840: 27 74 72 65 61 6c 27 20 57 48 45 52 45 20 62 20  'treal' WHERE b 
2850: 4c 49 4b 45 20 28 53 45 4c 45 43 54 20 27 25 27  LIKE (SELECT '%'
2860: 7c 7c 3f 7c 7c 27 25 27 29 7d 20 20 5c 0a 20 20  ||?||'%')}  \.  
2870: 20 20 20 20 20 20 78 46 69 6c 74 65 72 20 5c 0a        xFilter \.
2880: 20 20 20 20 20 20 20 20 7b 53 45 4c 45 43 54 20          {SELECT 
2890: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74  rowid, * FROM 't
28a0: 72 65 61 6c 27 20 57 48 45 52 45 20 62 20 4c 49  real' WHERE b LI
28b0: 4b 45 20 28 53 45 4c 45 43 54 20 27 25 27 7c 7c  KE (SELECT '%'||
28c0: 3f 7c 7c 27 25 27 29 7d 20 5c 0a 20 20 20 20 20  ?||'%')} \.     
28d0: 20 20 20 73 74 72 69 6e 67 20 5d 0a 0a 23 2d 2d     string ]..#--
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65  ----.# Test case
2930: 20 76 74 61 62 31 2d 33 20 74 65 73 74 20 74 61   vtab1-3 test ta
2940: 62 6c 65 20 73 63 61 6e 73 20 61 6e 64 20 74 68  ble scans and th
2950: 65 20 65 63 68 6f 20 6d 6f 64 75 6c 65 27 73 20  e echo module's 
2960: 0a 23 20 78 42 65 73 74 49 6e 64 65 78 2f 78 46  .# xBestIndex/xF
2970: 69 6c 74 65 72 20 68 61 6e 64 6c 69 6e 67 20 6f  ilter handling o
2980: 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  f ORDER BY claus
2990: 65 73 2e 0a 0a 23 20 54 68 69 73 20 70 72 6f 63  es...# This proc
29a0: 65 64 75 72 65 20 65 78 65 63 75 74 65 73 20 74  edure executes t
29b0: 68 65 20 53 51 4c 2e 20 20 54 68 65 6e 20 69 74  he SQL.  Then it
29c0: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
29d0: 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 0a 23 20  f the OP_Sort.# 
29e0: 6f 70 63 6f 64 65 20 77 61 73 20 65 78 65 63 75  opcode was execu
29f0: 74 65 64 2e 20 20 49 66 20 61 6e 20 4f 50 5f 53  ted.  If an OP_S
2a00: 6f 72 74 20 64 69 64 20 6f 63 63 75 72 2c 20 74  ort did occur, t
2a10: 68 65 6e 20 22 73 6f 72 74 22 20 69 73 20 61 70  hen "sort" is ap
2a20: 70 65 6e 64 65 64 0a 23 20 74 6f 20 74 68 65 20  pended.# to the 
2a30: 72 65 73 75 6c 74 2e 20 20 49 66 20 6e 6f 20 4f  result.  If no O
2a40: 50 5f 53 6f 72 74 20 68 61 70 70 65 6e 65 64 2c  P_Sort happened,
2a50: 20 74 68 65 6e 20 22 6e 6f 73 6f 72 74 22 20 69   then "nosort" i
2a60: 73 20 61 70 70 65 6e 64 65 64 2e 0a 23 0a 23 20  s appended..#.# 
2a70: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
2a80: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
2a90: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 73 6f 72  to make sure sor
2aa0: 74 69 6e 67 20 69 73 20 6f 72 20 69 73 20 6e 6f  ting is or is no
2ab0: 74 0a 23 20 6f 63 63 75 72 72 69 6e 67 20 61 73  t.# occurring as
2ac0: 20 65 78 70 65 63 74 65 64 2e 0a 23 0a 70 72 6f   expected..#.pro
2ad0: 63 20 63 6b 73 6f 72 74 20 7b 73 71 6c 7d 20 7b  c cksort {sql} {
2ae0: 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f  .  set ::sqlite_
2af0: 73 6f 72 74 5f 63 6f 75 6e 74 20 30 0a 20 20 73  sort_count 0.  s
2b00: 65 74 20 64 61 74 61 20 5b 65 78 65 63 73 71 6c  et data [execsql
2b10: 20 24 73 71 6c 5d 0a 20 20 69 66 20 7b 24 3a 3a   $sql].  if {$::
2b20: 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e  sqlite_sort_coun
2b30: 74 7d 20 7b 73 65 74 20 78 20 73 6f 72 74 7d 20  t} {set x sort} 
2b40: 7b 73 65 74 20 78 20 6e 6f 73 6f 72 74 7d 0a 20  {set x nosort}. 
2b50: 20 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24 78   lappend data $x
2b60: 0a 20 20 72 65 74 75 72 6e 20 24 64 61 74 61 0a  .  return $data.
2b70: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }..do_test vtab1
2b80: 2d 34 2e 31 20 7b 0a 20 20 73 65 74 20 65 63 68  -4.1 {.  set ech
2b90: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63 6b  o_module "".  ck
2ba0: 73 6f 72 74 20 7b 0a 20 20 20 20 53 45 4c 45 43  sort {.    SELEC
2bb0: 54 20 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  T b FROM t1 ORDE
2bc0: 52 20 42 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b 32  R BY b;.  }.} {2
2bd0: 20 35 20 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65   5 nosort}.do_te
2be0: 73 74 20 76 74 61 62 31 2d 34 2e 32 20 7b 0a 20  st vtab1-4.2 {. 
2bf0: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
2c00: 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e  .} [list xBestIn
2c10: 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  dex {SELECT rowi
2c20: 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c  d, * FROM 'treal
2c30: 27 20 4f 52 44 45 52 20 42 59 20 62 20 41 53 43  ' ORDER BY b ASC
2c40: 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c  } \.        xFil
2c50: 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72  ter    {SELECT r
2c60: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72  owid, * FROM 'tr
2c70: 65 61 6c 27 20 4f 52 44 45 52 20 42 59 20 62 20  eal' ORDER BY b 
2c80: 41 53 43 7d 20 5d 0a 64 6f 5f 74 65 73 74 20 76  ASC} ].do_test v
2c90: 74 61 62 31 2d 34 2e 33 20 7b 0a 20 20 73 65 74  tab1-4.3 {.  set
2ca0: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a   echo_module "".
2cb0: 20 20 63 6b 73 6f 72 74 20 7b 0a 20 20 20 20 53    cksort {.    S
2cc0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20  ELECT b FROM t1 
2cd0: 4f 52 44 45 52 20 42 59 20 62 20 44 45 53 43 3b  ORDER BY b DESC;
2ce0: 0a 20 20 7d 0a 7d 20 7b 35 20 32 20 6e 6f 73 6f  .  }.} {5 2 noso
2cf0: 72 74 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  rt}.do_test vtab
2d00: 31 2d 34 2e 34 20 7b 0a 20 20 73 65 74 20 65 63  1-4.4 {.  set ec
2d10: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
2d20: 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45  t xBestIndex {SE
2d30: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
2d40: 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52 44 45 52  OM 'treal' ORDER
2d50: 20 42 59 20 62 20 44 45 53 43 7d 20 5c 0a 20 20   BY b DESC} \.  
2d60: 20 20 20 20 20 20 78 46 69 6c 74 65 72 20 20 20        xFilter   
2d70: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
2d80: 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f  * FROM 'treal' O
2d90: 52 44 45 52 20 42 59 20 62 20 44 45 53 43 7d 20  RDER BY b DESC} 
2da0: 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ].do_test vtab1-
2db0: 34 2e 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f  4.3 {.  set echo
2dc0: 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63 6b 73  _module "".  cks
2dd0: 6f 72 74 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  ort {.    SELECT
2de0: 20 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   b FROM t1 ORDER
2df0: 20 42 59 20 62 7c 7c 27 27 3b 0a 20 20 7d 0a 7d   BY b||'';.  }.}
2e00: 20 7b 32 20 35 20 73 6f 72 74 7d 0a 64 6f 5f 74   {2 5 sort}.do_t
2e10: 65 73 74 20 76 74 61 62 31 2d 34 2e 34 20 7b 0a  est vtab1-4.4 {.
2e20: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
2e30: 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49  e.} [list xBestI
2e40: 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77  ndex {SELECT row
2e50: 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61  id, * FROM 'trea
2e60: 6c 27 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46  l'} \.        xF
2e70: 69 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54  ilter    {SELECT
2e80: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
2e90: 74 72 65 61 6c 27 7d 20 5d 0a 0a 65 78 65 63 73  treal'} ]..execs
2ea0: 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  ql {.  DROP TABL
2eb0: 45 20 74 31 3b 0a 20 20 44 52 4f 50 20 54 41 42  E t1;.  DROP TAB
2ec0: 4c 45 20 74 72 65 61 6c 3b 0a 7d 0a 0a 23 2d 2d  LE treal;.}..#--
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65  ----.# Test case
2f20: 73 20 76 74 61 62 31 2d 35 20 74 65 73 74 20 53  s vtab1-5 test S
2f30: 45 4c 45 43 54 20 71 75 65 72 69 65 73 20 74 68  ELECT queries th
2f40: 61 74 20 69 6e 63 6c 75 64 65 20 6a 6f 69 6e 73  at include joins
2f50: 20 6f 6e 20 76 69 72 74 75 61 6c 20 0a 23 20 74   on virtual .# t
2f60: 61 62 6c 65 73 2e 0a 0a 70 72 6f 63 20 66 69 6c  ables...proc fil
2f70: 74 65 72 20 7b 6c 6f 67 7d 20 7b 0a 20 20 73 65  ter {log} {.  se
2f80: 74 20 6f 75 74 20 5b 6c 69 73 74 5d 0a 20 20 66  t out [list].  f
2f90: 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24  or {set ii 0} {$
2fa0: 69 69 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 6c  ii < [llength $l
2fb0: 6f 67 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b  og]} {incr ii} {
2fc0: 0a 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78  .    if {[lindex
2fd0: 20 24 6c 6f 67 20 24 69 69 5d 20 65 71 20 22 78   $log $ii] eq "x
2fe0: 46 69 6c 74 65 72 22 7d 20 7b 0a 20 20 20 20 20  Filter"} {.     
2ff0: 20 6c 61 70 70 65 6e 64 20 6f 75 74 20 78 46 69   lappend out xFi
3000: 6c 74 65 72 0a 20 20 20 20 20 20 6c 61 70 70 65  lter.      lappe
3010: 6e 64 20 6f 75 74 20 5b 6c 69 6e 64 65 78 20 24  nd out [lindex $
3020: 6c 6f 67 20 5b 65 78 70 72 20 24 69 69 2b 31 5d  log [expr $ii+1]
3030: 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ].    }.  }.  re
3040: 74 75 72 6e 20 24 6f 75 74 0a 7d 0a 0a 64 6f 5f  turn $out.}..do_
3050: 74 65 73 74 20 76 74 61 62 31 2d 35 2d 31 20 7b  test vtab1-5-1 {
3060: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
3070: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3080: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  1(a, b, c);.    
3090: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
30a0: 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 49 4e  d, e, f);.    IN
30b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
30c0: 55 45 53 28 31 2c 20 27 72 65 64 27 2c 20 27 67  UES(1, 'red', 'g
30d0: 72 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  reen');.    INSE
30e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
30f0: 53 28 32 2c 20 27 62 6c 75 65 27 2c 20 27 62 6c  S(2, 'blue', 'bl
3100: 61 63 6b 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ack');.    INSER
3110: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
3120: 28 31 2c 20 27 73 70 61 64 65 73 27 2c 20 27 63  (1, 'spades', 'c
3130: 6c 75 62 73 27 29 3b 0a 20 20 20 20 49 4e 53 45  lubs');.    INSE
3140: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
3150: 53 28 32 2c 20 27 68 65 61 72 74 73 27 2c 20 27  S(2, 'hearts', '
3160: 64 69 61 6d 6f 6e 64 73 27 29 3b 0a 20 20 20 20  diamonds');.    
3170: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
3180: 41 42 4c 45 20 65 74 31 20 55 53 49 4e 47 20 65  ABLE et1 USING e
3190: 63 68 6f 28 74 31 29 3b 0a 20 20 20 20 43 52 45  cho(t1);.    CRE
31a0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
31b0: 45 20 65 74 32 20 55 53 49 4e 47 20 65 63 68 6f  E et2 USING echo
31c0: 28 74 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  (t2);.  }.} {}..
31d0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d  do_test vtab1-5-
31e0: 32 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  2 {.  set echo_m
31f0: 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73  odule "".  execs
3200: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3210: 2a 20 46 52 4f 4d 20 65 74 31 2c 20 65 74 32 3b  * FROM et1, et2;
3220: 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20  .  }.} [list \. 
3230: 20 31 20 72 65 64 20 67 72 65 65 6e 20 31 20 73   1 red green 1 s
3240: 70 61 64 65 73 20 63 6c 75 62 73 20 20 20 20 20  pades clubs     
3250: 5c 0a 20 20 31 20 72 65 64 20 67 72 65 65 6e 20  \.  1 red green 
3260: 32 20 68 65 61 72 74 73 20 64 69 61 6d 6f 6e 64  2 hearts diamond
3270: 73 20 20 5c 0a 20 20 32 20 62 6c 75 65 20 62 6c  s  \.  2 blue bl
3280: 61 63 6b 20 31 20 73 70 61 64 65 73 20 63 6c 75  ack 1 spades clu
3290: 62 73 20 20 20 20 5c 0a 20 20 32 20 62 6c 75 65  bs    \.  2 blue
32a0: 20 62 6c 61 63 6b 20 32 20 68 65 61 72 74 73 20   black 2 hearts 
32b0: 64 69 61 6d 6f 6e 64 73 20 5c 0a 5d 0a 64 6f 5f  diamonds \.].do_
32c0: 74 65 73 74 20 76 74 61 62 31 2d 35 2d 33 20 7b  test vtab1-5-3 {
32d0: 0a 20 20 66 69 6c 74 65 72 20 24 65 63 68 6f 5f  .  filter $echo_
32e0: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c  module.} [list \
32f0: 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45  .  xFilter {SELE
3300: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
3310: 20 27 74 31 27 7d 20 5c 0a 20 20 78 46 69 6c 74   't1'} \.  xFilt
3320: 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  er {SELECT rowid
3330: 2c 20 2a 20 46 52 4f 4d 20 27 74 32 27 7d 20 5c  , * FROM 't2'} \
3340: 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45  .  xFilter {SELE
3350: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
3360: 20 27 74 32 27 7d 20 5c 0a 5d 0a 64 6f 5f 74 65   't2'} \.].do_te
3370: 73 74 20 76 74 61 62 31 2d 35 2d 34 20 7b 0a 20  st vtab1-5-4 {. 
3380: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
3390: 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   "".  execsql {.
33a0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
33b0: 4d 20 65 74 31 2c 20 65 74 32 20 57 48 45 52 45  M et1, et2 WHERE
33c0: 20 65 74 32 2e 64 20 3d 20 32 3b 0a 20 20 7d 0a   et2.d = 2;.  }.
33d0: 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 31 20 72 65  } [list \.  1 re
33e0: 64 20 67 72 65 65 6e 20 32 20 68 65 61 72 74 73  d green 2 hearts
33f0: 20 64 69 61 6d 6f 6e 64 73 20 20 5c 0a 20 20 32   diamonds  \.  2
3400: 20 62 6c 75 65 20 62 6c 61 63 6b 20 32 20 68 65   blue black 2 he
3410: 61 72 74 73 20 64 69 61 6d 6f 6e 64 73 20 5c 0a  arts diamonds \.
3420: 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ].do_test vtab1-
3430: 35 2d 35 20 7b 0a 20 20 66 69 6c 74 65 72 20 24  5-5 {.  filter $
3440: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c  echo_module.} [l
3450: 69 73 74 20 5c 0a 20 20 78 46 69 6c 74 65 72 20  ist \.  xFilter 
3460: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
3470: 20 46 52 4f 4d 20 27 74 31 27 7d 20 5c 0a 20 20   FROM 't1'} \.  
3480: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20  xFilter {SELECT 
3490: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74  rowid, * FROM 't
34a0: 32 27 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20  2'} \.  xFilter 
34b0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
34c0: 20 46 52 4f 4d 20 27 74 32 27 7d 20 5c 0a 5d 0a   FROM 't2'} \.].
34d0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d  do_test vtab1-5-
34e0: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
34f0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
3500: 20 69 31 20 4f 4e 20 74 32 28 64 29 3b 0a 20 20   i1 ON t2(d);.  
3510: 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  }..  db close.  
3520: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
3530: 64 62 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63  db.  register_ec
3540: 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74  ho_module [sqlit
3550: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
3560: 69 6e 74 65 72 20 64 62 5d 0a 0a 20 20 73 65 74  inter db]..  set
3570: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a   echo_module "".
3580: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3590: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 74  SELECT * FROM et
35a0: 31 2c 20 65 74 32 20 57 48 45 52 45 20 65 74 32  1, et2 WHERE et2
35b0: 2e 64 20 3d 20 32 3b 0a 20 20 7d 0a 7d 20 5b 6c  .d = 2;.  }.} [l
35c0: 69 73 74 20 5c 0a 20 20 31 20 72 65 64 20 67 72  ist \.  1 red gr
35d0: 65 65 6e 20 32 20 68 65 61 72 74 73 20 64 69 61  een 2 hearts dia
35e0: 6d 6f 6e 64 73 20 20 5c 0a 20 20 32 20 62 6c 75  monds  \.  2 blu
35f0: 65 20 62 6c 61 63 6b 20 32 20 68 65 61 72 74 73  e black 2 hearts
3600: 20 64 69 61 6d 6f 6e 64 73 20 5c 0a 5d 0a 64 6f   diamonds \.].do
3610: 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d 37 20  _test vtab1-5-7 
3620: 7b 0a 20 20 66 69 6c 74 65 72 20 24 65 63 68 6f  {.  filter $echo
3630: 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20  _module.} [list 
3640: 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c  \.  xFilter {SEL
3650: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
3660: 4d 20 27 74 32 27 20 57 48 45 52 45 20 64 20 3d  M 't2' WHERE d =
3670: 20 3f 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20   ?} \.  xFilter 
3680: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
3690: 20 46 52 4f 4d 20 27 74 31 27 7d 20 20 20 20 20   FROM 't1'}     
36a0: 20 20 20 20 20 20 20 20 5c 0a 5d 0a 0a 65 78 65          \.]..exe
36b0: 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41  csql {.  DROP TA
36c0: 42 4c 45 20 74 31 3b 0a 20 20 44 52 4f 50 20 54  BLE t1;.  DROP T
36d0: 41 42 4c 45 20 74 32 3b 0a 20 20 44 52 4f 50 20  ABLE t2;.  DROP 
36e0: 54 41 42 4c 45 20 65 74 31 3b 0a 20 20 44 52 4f  TABLE et1;.  DRO
36f0: 50 20 54 41 42 4c 45 20 65 74 32 3b 0a 7d 0a 0a  P TABLE et2;.}..
3700: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63  -------.# Test c
3750: 61 73 65 73 20 76 74 61 62 31 2d 36 20 74 65 73  ases vtab1-6 tes
3760: 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  t INSERT, UPDATE
3770: 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72   and DELETE oper
3780: 61 74 69 6f 6e 73 20 0a 23 20 6f 6e 20 76 69 72  ations .# on vir
3790: 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 64 6f 5f  tual tables..do_
37a0: 74 65 73 74 20 76 74 61 62 31 2d 36 2d 31 20 7b  test vtab1-6-1 {
37b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
37c0: 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
37d0: 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a 7d 20 7b  ite_master }.} {
37e0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
37f0: 36 2d 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6-2 {.  execsql 
3800: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
3810: 4c 45 20 74 72 65 61 6c 28 61 20 50 52 49 4d 41  LE treal(a PRIMA
3820: 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20  RY KEY, b, c);. 
3830: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
3840: 4c 20 54 41 42 4c 45 20 74 65 63 68 6f 20 55 53  L TABLE techo US
3850: 49 4e 47 20 65 63 68 6f 28 74 72 65 61 6c 29 3b  ING echo(treal);
3860: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
3870: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
3880: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d  ter WHERE type =
3890: 20 27 74 61 62 6c 65 27 3b 0a 20 20 7d 0a 7d 20   'table';.  }.} 
38a0: 7b 74 72 65 61 6c 20 74 65 63 68 6f 7d 0a 64 6f  {treal techo}.do
38b0: 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 33 20  _test vtab1-6-3 
38c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
38d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65    INSERT INTO te
38e0: 63 68 6f 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  cho VALUES(1, 2,
38f0: 20 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   3);.    SELECT 
3900: 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 20  * FROM techo;.  
3910: 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74  }.} {1 2 3}.do_t
3920: 65 73 74 20 76 74 61 62 31 2d 36 2d 34 20 7b 0a  est vtab1-6-4 {.
3930: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3940: 55 50 44 41 54 45 20 74 65 63 68 6f 20 53 45 54  UPDATE techo SET
3950: 20 61 20 3d 20 35 3b 0a 20 20 20 20 53 45 4c 45   a = 5;.    SELE
3960: 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b  CT * FROM techo;
3970: 0a 20 20 7d 0a 7d 20 7b 35 20 32 20 33 7d 0a 0a  .  }.} {5 2 3}..
3980: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d  do_test vtab1-6-
3990: 35 20 7b 0a 20 65 78 65 63 73 71 6c 20 7b 0a 20  5 {. execsql {. 
39a0: 20 20 55 50 44 41 54 45 20 74 65 63 68 6f 20 73    UPDATE techo s
39b0: 65 74 20 61 20 3d 20 61 7c 7c 62 7c 7c 63 3b 0a  et a = a||b||c;.
39c0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
39d0: 20 74 65 63 68 6f 3b 0a 20 7d 0a 7d 20 7b 35 32   techo;. }.} {52
39e0: 33 20 32 20 33 7d 0a 0a 64 6f 5f 74 65 73 74 20  3 2 3}..do_test 
39f0: 76 74 61 62 31 2d 36 2d 36 20 7b 0a 20 20 65 78  vtab1-6-6 {.  ex
3a00: 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
3a10: 54 45 20 74 65 63 68 6f 20 73 65 74 20 72 6f 77  TE techo set row
3a20: 69 64 20 3d 20 31 30 3b 0a 20 20 20 20 53 45 4c  id = 10;.    SEL
3a30: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
3a40: 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d  echo;.  }.} {10}
3a50: 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ..do_test vtab1-
3a60: 36 2d 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6-7 {.  execsql 
3a70: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
3a80: 4d 20 74 65 63 68 6f 3b 0a 20 20 20 20 53 45 4c  M techo;.    SEL
3a90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f  ECT * FROM techo
3aa0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a 66 69 6c  ;.  }.} {}...fil
3ab0: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
3ac0: 74 65 73 74 32 2e 64 62 0a 66 69 6c 65 20 64 65  test2.db.file de
3ad0: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
3ae0: 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c  2.db-journal.sql
3af0: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
3b00: 62 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 52  b.execsql {.  CR
3b10: 45 41 54 45 20 54 41 42 4c 45 20 74 65 63 68 6f  EATE TABLE techo
3b20: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
3b30: 62 2c 20 63 29 3b 0a 7d 20 64 62 32 0a 70 72 6f  b, c);.} db2.pro
3b40: 63 20 63 68 65 63 6b 5f 65 63 68 6f 5f 74 61 62  c check_echo_tab
3b50: 6c 65 20 7b 74 6e 7d 20 7b 0a 20 20 73 65 74 20  le {tn} {.  set 
3b60: 3a 3a 64 61 74 61 31 20 5b 65 78 65 63 73 71 6c  ::data1 [execsql
3b70: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
3b80: 2a 20 46 52 4f 4d 20 74 65 63 68 6f 7d 5d 0a 20  * FROM techo}]. 
3b90: 20 73 65 74 20 3a 3a 64 61 74 61 32 20 5b 65 78   set ::data2 [ex
3ba0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  ecsql {SELECT ro
3bb0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 65 63 68  wid, * FROM tech
3bc0: 6f 7d 20 64 62 32 5d 0a 20 20 64 6f 5f 74 65 73  o} db2].  do_tes
3bd0: 74 20 24 74 6e 20 7b 0a 20 20 20 20 73 74 72 69  t $tn {.    stri
3be0: 6e 67 20 65 71 75 61 6c 20 24 3a 3a 64 61 74 61  ng equal $::data
3bf0: 31 20 24 3a 3a 64 61 74 61 32 0a 20 20 7d 20 31  1 $::data2.  } 1
3c00: 0a 7d 0a 73 65 74 20 74 6e 20 30 0a 66 6f 72 65  .}.set tn 0.fore
3c10: 61 63 68 20 73 74 6d 74 20 5b 6c 69 73 74 20 5c  ach stmt [list \
3c20: 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  .  {INSERT INTO 
3c30: 74 65 63 68 6f 20 56 41 4c 55 45 53 28 27 61 62  techo VALUES('ab
3c40: 63 27 2c 20 27 64 65 66 27 2c 20 27 67 68 69 27  c', 'def', 'ghi'
3c50: 29 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )}              
3c60: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 49            \.  {I
3c70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 63 68 6f  NSERT INTO techo
3c80: 20 53 45 4c 45 43 54 20 61 7c 7c 27 2e 27 7c 7c   SELECT a||'.'||
3c90: 72 6f 77 69 64 2c 20 62 2c 20 63 20 46 52 4f 4d  rowid, b, c FROM
3ca0: 20 74 65 63 68 6f 7d 20 20 20 20 20 20 20 20 20   techo}         
3cb0: 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53 45 52 54       \.  {INSERT
3cc0: 20 49 4e 54 4f 20 74 65 63 68 6f 20 53 45 4c 45   INTO techo SELE
3cd0: 43 54 20 61 7c 7c 27 78 27 7c 7c 72 6f 77 69 64  CT a||'x'||rowid
3ce0: 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 65 63 68  , b, c FROM tech
3cf0: 6f 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o}              
3d00: 5c 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  \.  {INSERT INTO
3d10: 20 74 65 63 68 6f 20 53 45 4c 45 43 54 20 61 7c   techo SELECT a|
3d20: 7c 27 79 27 7c 7c 72 6f 77 69 64 2c 20 62 2c 20  |'y'||rowid, b, 
3d30: 63 20 46 52 4f 4d 20 74 65 63 68 6f 7d 20 20 20  c FROM techo}   
3d40: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b             \.  {
3d50: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 63 68  DELETE FROM tech
3d60: 6f 20 57 48 45 52 45 20 28 6f 69 64 20 25 20 33  o WHERE (oid % 3
3d70: 29 20 3d 20 30 7d 20 20 20 20 20 20 20 20 20 20  ) = 0}          
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 20 20 20 5c 0a 20 20 7b 55 50 44 41 54        \.  {UPDAT
3da0: 45 20 74 65 63 68 6f 20 73 65 74 20 72 6f 77 69  E techo set rowi
3db0: 64 20 3d 20 31 30 30 20 57 48 45 52 45 20 72 6f  d = 100 WHERE ro
3dc0: 77 69 64 20 3d 20 31 7d 20 20 20 20 20 20 20 20  wid = 1}        
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 5c 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54   \.  {INSERT INT
3df0: 4f 20 74 65 63 68 6f 28 61 2c 20 62 29 20 56 41  O techo(a, b) VA
3e00: 4c 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20 27 77  LUES('hello', 'w
3e10: 6f 72 6c 64 27 29 7d 20 20 20 20 20 20 20 20 20  orld')}         
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3e30: 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 63  {DELETE FROM tec
3e40: 68 6f 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ho}             
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e70: 20 20 20 20 20 20 20 5c 0a 5d 20 7b 0a 20 20 65         \.] {.  e
3e80: 78 65 63 73 71 6c 20 24 73 74 6d 74 0a 20 20 65  xecsql $stmt.  e
3e90: 78 65 63 73 71 6c 20 24 73 74 6d 74 20 64 62 32  xecsql $stmt db2
3ea0: 0a 20 20 63 68 65 63 6b 5f 65 63 68 6f 5f 74 61  .  check_echo_ta
3eb0: 62 6c 65 20 76 74 61 62 31 2d 36 2e 38 2e 5b 69  ble vtab1-6.8.[i
3ec0: 6e 63 72 20 74 6e 5d 0a 7d 0a 0a 64 62 32 20 63  ncr tn].}..db2 c
3ed0: 6c 6f 73 65 0a 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lose....#-------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3f20: 23 20 54 65 73 74 20 63 61 73 65 73 20 76 74 61  # Test cases vta
3f30: 62 31 2d 37 20 74 65 73 74 73 20 74 68 61 74 20  b1-7 tests that 
3f40: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
3f50: 65 64 20 62 79 20 0a 23 20 73 71 6c 69 74 65 33  ed by .# sqlite3
3f60: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
3f70: 69 64 28 29 20 69 73 20 73 65 74 20 63 6f 72 72  id() is set corr
3f80: 65 63 74 6c 79 20 77 68 65 6e 20 72 6f 77 73 20  ectly when rows 
3f90: 61 72 65 20 69 6e 73 65 72 74 65 64 0a 23 20 69  are inserted.# i
3fa0: 6e 74 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c  nto virtual tabl
3fb0: 65 73 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  es..do_test vtab
3fc0: 31 2e 37 2d 31 20 7b 0a 20 20 65 78 65 63 73 71  1.7-1 {.  execsq
3fd0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
3fe0: 41 42 4c 45 20 72 65 61 6c 5f 61 62 63 28 61 20  ABLE real_abc(a 
3ff0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20  PRIMARY KEY, b, 
4000: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56  c);.    CREATE V
4010: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 63 68  IRTUAL TABLE ech
4020: 6f 5f 61 62 63 20 55 53 49 4e 47 20 65 63 68 6f  o_abc USING echo
4030: 28 72 65 61 6c 5f 61 62 63 29 3b 0a 20 20 7d 0a  (real_abc);.  }.
4040: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  } {}.do_test vta
4050: 62 31 2e 37 2d 32 20 7b 0a 20 20 65 78 65 63 73  b1.7-2 {.  execs
4060: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
4070: 49 4e 54 4f 20 65 63 68 6f 5f 61 62 63 20 56 41  INTO echo_abc VA
4080: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
4090: 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69     SELECT last_i
40a0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20  nsert_rowid();. 
40b0: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
40c0: 20 76 74 61 62 31 2e 37 2d 33 20 7b 0a 20 20 65   vtab1.7-3 {.  e
40d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
40e0: 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 61 62  ERT INTO echo_ab
40f0: 63 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53 28  c(rowid) VALUES(
4100: 33 31 34 32 37 29 3b 0a 20 20 20 20 53 45 4c 45  31427);.    SELE
4110: 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  CT last_insert_r
4120: 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33  owid();.  }.} {3
4130: 31 34 32 37 7d 0a 64 6f 5f 74 65 73 74 20 76 74  1427}.do_test vt
4140: 61 62 31 2e 37 2d 34 20 7b 0a 20 20 65 78 65 63  ab1.7-4 {.  exec
4150: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
4160: 20 49 4e 54 4f 20 65 63 68 6f 5f 61 62 63 20 53   INTO echo_abc S
4170: 45 4c 45 43 54 20 61 7c 7c 27 2e 76 32 27 2c 20  ELECT a||'.v2', 
4180: 62 2c 20 63 20 46 52 4f 4d 20 65 63 68 6f 5f 61  b, c FROM echo_a
4190: 62 63 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c  bc;.    SELECT l
41a0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
41b0: 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39  ();.  }.} {31429
41c0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e  }.do_test vtab1.
41d0: 37 2d 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7-5 {.  execsql 
41e0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77  {.    SELECT row
41f0: 69 64 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  id, a, b, c FROM
4200: 20 65 63 68 6f 5f 61 62 63 0a 20 20 7d 0a 7d 20   echo_abc.  }.} 
4210: 5b 6c 69 73 74 20 31 20 20 20 20 20 31 20 20 20  [list 1     1   
4220: 20 32 20 20 33 20 20 5c 0a 20 20 20 20 20 20 20   2  3  \.       
4230: 20 33 31 34 32 37 20 7b 7d 20 20 20 7b 7d 20 7b   31427 {}   {} {
4240: 7d 20 5c 0a 20 20 20 20 20 20 20 20 33 31 34 32  } \.        3142
4250: 38 20 31 2e 76 32 20 32 20 20 33 20 20 5c 0a 20  8 1.v2 2  3  \. 
4260: 20 20 20 20 20 20 20 33 31 34 32 39 20 7b 7d 20         31429 {} 
4270: 20 7b 7d 20 7b 7d 20 20 5c 0a 5d 0a 0a 23 20 4e   {} {}  \.]..# N
4280: 6f 77 20 74 65 73 74 20 74 68 61 74 20 44 45 4c  ow test that DEL
4290: 45 54 45 20 61 6e 64 20 55 50 44 41 54 45 20 6f  ETE and UPDATE o
42a0: 70 65 72 61 74 69 6f 6e 73 20 64 6f 20 6e 6f 74  perations do not
42b0: 20 6d 6f 64 69 66 79 20 74 68 65 20 76 61 6c 75   modify the valu
42c0: 65 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  e..do_test vtab1
42d0: 2e 37 2d 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  .7-6 {.  execsql
42e0: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 65 63   {.    UPDATE ec
42f0: 68 6f 5f 61 62 63 20 53 45 54 20 63 20 3d 20 35  ho_abc SET c = 5
4300: 20 57 48 45 52 45 20 62 20 3d 20 32 3b 0a 20 20   WHERE b = 2;.  
4310: 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e    SELECT last_in
4320: 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20  sert_rowid();.  
4330: 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 6f 5f 74  }.} {31429}.do_t
4340: 65 73 74 20 76 74 61 62 31 2e 37 2d 37 20 7b 0a  est vtab1.7-7 {.
4350: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4360: 55 50 44 41 54 45 20 65 63 68 6f 5f 61 62 63 20  UPDATE echo_abc 
4370: 53 45 54 20 72 6f 77 69 64 20 3d 20 35 20 57 48  SET rowid = 5 WH
4380: 45 52 45 20 72 6f 77 69 64 20 3d 20 31 3b 0a 20  ERE rowid = 1;. 
4390: 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69     SELECT last_i
43a0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20  nsert_rowid();. 
43b0: 20 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 6f 5f   }.} {31429}.do_
43c0: 74 65 73 74 20 76 74 61 62 31 2e 37 2d 38 20 7b  test vtab1.7-8 {
43d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
43e0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 65 63 68   DELETE FROM ech
43f0: 6f 5f 61 62 63 20 57 48 45 52 45 20 62 20 3d 20  o_abc WHERE b = 
4400: 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 61  2;.    SELECT la
4410: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
4420: 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39 7d  );.  }.} {31429}
4430: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37  .do_test vtab1.7
4440: 2d 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  -9 {.  execsql {
4450: 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69  .    SELECT rowi
4460: 64 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  d, a, b, c FROM 
4470: 65 63 68 6f 5f 61 62 63 0a 20 20 7d 0a 7d 20 5b  echo_abc.  }.} [
4480: 6c 69 73 74 20 33 31 34 32 37 20 7b 7d 20 7b 7d  list 31427 {} {}
4490: 20 7b 7d 20 5c 0a 20 20 20 20 20 20 20 20 33 31   {} \.        31
44a0: 34 32 39 20 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 5d  429 {} {} {} \.]
44b0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37  .do_test vtab1.7
44c0: 2d 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  -10 {.  execsql 
44d0: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
44e0: 4d 20 65 63 68 6f 5f 61 62 63 20 57 48 45 52 45  M echo_abc WHERE
44f0: 20 62 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45   b = 2;.    SELE
4500: 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  CT last_insert_r
4510: 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33  owid();.  }.} {3
4520: 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74  1429}.do_test vt
4530: 61 62 31 2e 37 2d 31 31 20 7b 0a 20 20 65 78 65  ab1.7-11 {.  exe
4540: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
4550: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
4560: 20 46 52 4f 4d 20 72 65 61 6c 5f 61 62 63 0a 20   FROM real_abc. 
4570: 20 7d 0a 7d 20 5b 6c 69 73 74 20 33 31 34 32 37   }.} [list 31427
4580: 20 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20 20   {} {} {} \.    
4590: 20 20 20 20 33 31 34 32 39 20 7b 7d 20 7b 7d 20      31429 {} {} 
45a0: 7b 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76  {} \.].do_test v
45b0: 74 61 62 31 2e 37 2d 31 32 20 7b 0a 20 20 65 78  tab1.7-12 {.  ex
45c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
45d0: 54 45 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63  TE FROM echo_abc
45e0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 61 73  ;.    SELECT las
45f0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
4600: 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a  ;.  }.} {31429}.
4610: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d  do_test vtab1.7-
4620: 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  13 {.  execsql {
4630: 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69  .    SELECT rowi
4640: 64 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  d, a, b, c FROM 
4650: 72 65 61 6c 5f 61 62 63 0a 20 20 7d 0a 7d 20 7b  real_abc.  }.} {
4660: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }..do_test vtab1
4670: 2e 38 2d 31 20 7b 0a 20 20 73 65 74 20 65 63 68  .8-1 {.  set ech
4680: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78  o_module "".  ex
4690: 65 63 73 71 6c 20 7b 0a 20 20 20 20 41 54 54 41  ecsql {.    ATTA
46a0: 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53  CH 'test2.db' AS
46b0: 20 61 75 78 3b 0a 20 20 20 20 43 52 45 41 54 45   aux;.    CREATE
46c0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 61   VIRTUAL TABLE a
46d0: 75 78 2e 65 32 20 55 53 49 4e 47 20 65 63 68 6f  ux.e2 USING echo
46e0: 28 72 65 61 6c 5f 61 62 63 29 3b 0a 20 20 7d 0a  (real_abc);.  }.
46f0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
4700: 65 0a 7d 20 5b 6c 69 73 74 20 78 43 72 65 61 74  e.} [list xCreat
4710: 65 20 65 63 68 6f 20 61 75 78 20 65 32 20 72 65  e echo aux e2 re
4720: 61 6c 5f 61 62 63 20 20 20 5c 0a 20 20 20 20 20  al_abc   \.     
4730: 20 20 20 78 53 79 6e 63 20 20 20 65 63 68 6f 28     xSync   echo(
4740: 72 65 61 6c 5f 61 62 63 29 20 20 20 20 20 20 20  real_abc)       
4750: 20 20 5c 0a 20 20 20 20 20 20 20 20 78 43 6f 6d    \.        xCom
4760: 6d 69 74 20 65 63 68 6f 28 72 65 61 6c 5f 61 62  mit echo(real_ab
4770: 63 29 20 20 20 20 20 20 20 20 20 5c 0a 5d 0a 64  c)         \.].d
4780: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 38 2d 32  o_test vtab1.8-2
4790: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
47a0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 61 75     DROP TABLE au
47b0: 78 2e 65 32 3b 0a 20 20 20 20 44 52 4f 50 20 54  x.e2;.    DROP T
47c0: 41 42 4c 45 20 74 72 65 61 6c 3b 0a 20 20 20 20  ABLE treal;.    
47d0: 44 52 4f 50 20 54 41 42 4c 45 20 74 65 63 68 6f  DROP TABLE techo
47e0: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
47f0: 20 65 63 68 6f 5f 61 62 63 3b 0a 20 20 20 20 44   echo_abc;.    D
4800: 52 4f 50 20 54 41 42 4c 45 20 72 65 61 6c 5f 61  ROP TABLE real_a
4810: 62 63 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  bc;.  }.} {}..do
4820: 5f 74 65 73 74 20 76 74 61 62 31 2e 39 2d 31 20  _test vtab1.9-1 
4830: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
4840: 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c  ule "".  execsql
4850: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
4860: 42 4c 45 20 72 28 61 2c 20 62 2c 20 63 29 3b 0a  BLE r(a, b, c);.
4870: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
4880: 41 4c 20 54 41 42 4c 45 20 65 20 55 53 49 4e 47  AL TABLE e USING
4890: 20 65 63 68 6f 28 72 2c 20 65 5f 6c 6f 67 29 3b   echo(r, e_log);
48a0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
48b0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
48c0: 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 72 20 65 20  ter;.  }.} {r e 
48d0: 65 5f 6c 6f 67 7d 0a 64 6f 5f 74 65 73 74 20 76  e_log}.do_test v
48e0: 74 61 62 31 2e 39 2d 32 20 7b 0a 20 20 65 78 65  tab1.9-2 {.  exe
48f0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
4900: 54 41 42 4c 45 20 65 3b 0a 20 20 20 20 53 45 4c  TABLE e;.    SEL
4910: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
4920: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d  lite_master;.  }
4930: 0a 7d 20 7b 72 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {r}..do_test 
4940: 76 74 61 62 31 2e 39 2d 33 20 7b 0a 20 20 73 65  vtab1.9-3 {.  se
4950: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22  t echo_module ""
4960: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4970: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
4980: 54 41 42 4c 45 20 65 20 55 53 49 4e 47 20 65 63  TABLE e USING ec
4990: 68 6f 28 72 2c 20 65 5f 6c 6f 67 2c 20 76 69 72  ho(r, e_log, vir
49a0: 74 75 61 6c 20 31 20 32 20 33 20 76 61 72 63 68  tual 1 2 3 varch
49b0: 61 72 28 33 32 29 29 3b 0a 20 20 7d 0a 20 20 73  ar(32));.  }.  s
49c0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d  et echo_module.}
49d0: 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20   [list          
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4a10: 20 20 78 43 72 65 61 74 65 20 65 63 68 6f 20 6d    xCreate echo m
4a20: 61 69 6e 20 65 20 72 20 65 5f 6c 6f 67 20 7b 76  ain e r e_log {v
4a30: 69 72 74 75 61 6c 20 31 20 32 20 33 20 76 61 72  irtual 1 2 3 var
4a40: 63 68 61 72 28 33 32 29 7d 20 20 20 20 20 20 5c  char(32)}      \
4a50: 0a 20 20 78 53 79 6e 63 20 65 63 68 6f 28 72 29  .  xSync echo(r)
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a90: 5c 0a 20 20 78 43 6f 6d 6d 69 74 20 65 63 68 6f  \.  xCommit echo
4aa0: 28 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (r)             
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 20 5c 0a 5d 0a 0a 64 6f 5f 74 65 73 74 20 76 74   \.]..do_test vt
4ae0: 61 62 31 2e 31 30 2d 31 20 7b 0a 20 20 65 78 65  ab1.10-1 {.  exe
4af0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
4b00: 45 20 54 41 42 4c 45 20 64 65 6c 28 64 29 3b 0a  E TABLE del(d);.
4b10: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
4b20: 41 4c 20 54 41 42 4c 45 20 65 32 20 55 53 49 4e  AL TABLE e2 USIN
4b30: 47 20 65 63 68 6f 28 64 65 6c 29 3b 0a 20 20 7d  G echo(del);.  }
4b40: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71  .  db close.  sq
4b50: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
4b60: 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63 68 6f  .  register_echo
4b70: 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 33  _module [sqlite3
4b80: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e  _connection_poin
4b90: 74 65 72 20 64 62 5d 0a 20 20 65 78 65 63 73 71  ter db].  execsq
4ba0: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  l {.    DROP TAB
4bb0: 4c 45 20 64 65 6c 3b 0a 20 20 7d 0a 20 20 63 61  LE del;.  }.  ca
4bc0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
4bd0: 45 43 54 20 2a 20 46 52 4f 4d 20 65 32 3b 0a 20  ECT * FROM e2;. 
4be0: 20 7d 0a 7d 20 7b 31 20 7b 76 74 61 62 6c 65 20   }.} {1 {vtable 
4bf0: 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 61 69 6c  constructor fail
4c00: 65 64 3a 20 65 32 7d 7d 0a 64 6f 5f 74 65 73 74  ed: e2}}.do_test
4c10: 20 76 74 61 62 31 2e 31 30 2d 32 20 7b 0a 20 20   vtab1.10-2 {.  
4c20: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a  set rc [catch {.
4c30: 20 20 20 20 73 65 74 20 70 74 72 20 5b 73 71 6c      set ptr [sql
4c40: 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f  ite3_connection_
4c50: 70 6f 69 6e 74 65 72 20 64 62 5d 0a 20 20 20 20  pointer db].    
4c60: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
4c70: 76 74 61 62 20 24 70 74 72 20 7b 43 52 45 41 54  vtab $ptr {CREAT
4c80: 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62  E TABLE abc(a, b
4c90: 2c 20 63 29 7d 0a 20 20 7d 20 6d 73 67 5d 0a 20  , c)}.  } msg]. 
4ca0: 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d   list $rc $msg.}
4cb0: 20 7b 31 20 7b 6c 69 62 72 61 72 79 20 72 6f 75   {1 {library rou
4cc0: 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20  tine called out 
4cd0: 6f 66 20 73 65 71 75 65 6e 63 65 7d 7d 0a 64 6f  of sequence}}.do
4ce0: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d 33  _test vtab1.10-3
4cf0: 20 7b 0a 20 20 73 65 74 20 3a 3a 65 63 68 6f 5f   {.  set ::echo_
4d00: 6d 6f 64 75 6c 65 5f 62 65 67 69 6e 5f 66 61 69  module_begin_fai
4d10: 6c 20 72 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  l r.  catchsql {
4d20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4d30: 20 65 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20   e VALUES(1, 2, 
4d40: 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 51  3);.  }.} {1 {SQ
4d50: 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72  L logic error or
4d60: 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73   missing databas
4d70: 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  e}}.do_test vtab
4d80: 31 2e 31 30 2d 34 20 7b 0a 20 20 63 61 74 63 68  1.10-4 {.  catch
4d90: 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20   {execsql {.    
4da0: 45 58 50 4c 41 49 4e 20 53 45 4c 45 43 54 20 2a  EXPLAIN SELECT *
4db0: 20 46 52 4f 4d 20 65 20 57 48 45 52 45 20 72 6f   FROM e WHERE ro
4dc0: 77 69 64 20 3d 20 32 3b 0a 20 20 20 20 45 58 50  wid = 2;.    EXP
4dd0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
4de0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 20  SELECT * FROM e 
4df0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 32 20  WHERE rowid = 2 
4e00: 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 3b 0a  ORDER BY rowid;.
4e10: 20 20 7d 7d 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74    }}.} {0}..do_t
4e20: 65 73 74 20 76 74 61 62 31 2e 31 30 2d 35 20 7b  est vtab1.10-5 {
4e30: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
4e40: 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  le "".  execsql 
4e50: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
4e60: 52 4f 4d 20 65 20 57 48 45 52 45 20 72 6f 77 69  ROM e WHERE rowi
4e70: 64 7c 7c 27 27 20 4d 41 54 43 48 20 27 70 61 74  d||'' MATCH 'pat
4e80: 74 65 72 6e 27 3b 0a 20 20 7d 0a 20 20 73 65 74  tern';.  }.  set
4e90: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b   echo_module.} [
4ea0: 6c 69 73 74 20 5c 0a 20 20 78 42 65 73 74 49 6e  list \.  xBestIn
4eb0: 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  dex {SELECT rowi
4ec0: 64 2c 20 2a 20 46 52 4f 4d 20 27 72 27 7d 20 5c  d, * FROM 'r'} \
4ed0: 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45  .  xFilter {SELE
4ee0: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
4ef0: 20 27 72 27 7d 20 20 20 20 5c 0a 5d 0a 70 72 6f   'r'}    \.].pro
4f00: 63 20 6d 61 74 63 68 5f 66 75 6e 63 20 7b 61 72  c match_func {ar
4f10: 67 73 7d 20 7b 72 65 74 75 72 6e 20 22 22 7d 0a  gs} {return ""}.
4f20: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 30  do_test vtab1.10
4f30: 2d 36 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  -6 {.  set echo_
4f40: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 64 62 20 66  module "".  db f
4f50: 75 6e 63 74 69 6f 6e 20 6d 61 74 63 68 20 6d 61  unction match ma
4f60: 74 63 68 5f 66 75 6e 63 0a 20 20 65 78 65 63 73  tch_func.  execs
4f70: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
4f80: 2a 20 46 52 4f 4d 20 65 20 57 48 45 52 45 20 6d  * FROM e WHERE m
4f90: 61 74 63 68 28 27 70 61 74 74 65 72 6e 27 2c 20  atch('pattern', 
4fa0: 72 6f 77 69 64 2c 20 27 70 61 74 74 65 72 6e 32  rowid, 'pattern2
4fb0: 27 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63  ');.  }.  set ec
4fc0: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
4fd0: 74 20 5c 0a 20 20 78 42 65 73 74 49 6e 64 65 78  t \.  xBestIndex
4fe0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
4ff0: 2a 20 46 52 4f 4d 20 27 72 27 7d 20 5c 0a 20 20  * FROM 'r'} \.  
5000: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20  xFilter {SELECT 
5010: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 72  rowid, * FROM 'r
5020: 27 7d 20 20 20 20 5c 0a 5d 0a 0a 66 69 6e 69 73  '}    \.]..finis
5030: 68 5f 74 65 73 74 0a 0a                          h_test..