SQLite4
Hex Artifact Content
Not logged in

Artifact 8b3d5f17929883a5ea6014a341b025b7d060e1dc:


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 35 37 20 32  b1.test,v 1.57 2
0200: 30 30 38 2f 30 38 2f 30 31 20 31 37 3a 35 31 3a  008/08/01 17:51:
0210: 34 37 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  47 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 34 5f 64 65 63 6c  est sqlite4_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 34 5f 69         sqlite4_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 34 5f 6c 61 73 74 5f 69 6e   sqlite4_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 34 5f 69 6e 64 65  the sqlite4_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 23 20 76 74 61 62 31 2d 31 34 2e 2a 3a 20 54  .# vtab1-14.*: T
0610: 65 73 74 20 27 49 4e 27 20 63 6f 6e 73 74 72 61  est 'IN' constra
0620: 69 6e 74 73 20 2d 20 69 2e 65 2e 20 22 53 45 4c  ints - i.e. "SEL
0630: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
0640: 45 52 45 20 69 64 20 49 4e 28 2e 2e 2e 29 22 0a  ERE id IN(...)".
0650: 23 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #...#-----------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
06a0: 73 74 20 63 61 73 65 73 20 76 74 61 62 31 2e 31  st cases vtab1.1
06b0: 2e 2a 0a 23 0a 0a 23 20 57 65 20 63 61 6e 6e 6f  .*.#..# We canno
06c0: 74 20 63 72 65 61 74 65 20 61 20 76 69 72 74 75  t create a virtu
06d0: 61 6c 20 74 61 62 6c 65 20 69 66 20 74 68 65 20  al table if the 
06e0: 6d 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74 20 62  module has not b
06f0: 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 2e 0a  een registered..
0700: 23 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  #.do_test vtab1-
0710: 31 2e 31 20 7b 0a 20 20 65 78 70 6c 61 69 6e 20  1.1 {.  explain 
0720: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  {.    CREATE VIR
0730: 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53  TUAL TABLE t1 US
0740: 49 4e 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 20 20  ING echo;.  }.  
0750: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43  catchsql {.    C
0760: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0770: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 65 63 68  BLE t1 USING ech
0780: 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20  o;.  }.} {1 {no 
0790: 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68  such module: ech
07a0: 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  o}}.do_test vtab
07b0: 31 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  1-1.2 {.  execsq
07c0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  l {.    SELECT n
07d0: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
07e0: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
07f0: 31 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 52 65  1.  }.} {}..# Re
0800: 67 69 73 74 65 72 20 74 68 65 20 6d 6f 64 75 6c  gister the modul
0810: 65 0a 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f  e.register_echo_
0820: 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 34 5f  module [sqlite4_
0830: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74  connection_point
0840: 65 72 20 64 62 5d 0a 0a 23 20 4f 6e 63 65 20 61  er db]..# Once a
0850: 20 6d 6f 64 75 6c 65 20 68 61 73 20 62 65 65 6e   module has been
0860: 20 72 65 67 69 73 74 65 72 65 64 2c 20 76 69 72   registered, vir
0870: 74 75 61 6c 20 74 61 62 6c 65 73 20 75 73 69 6e  tual tables usin
0880: 67 20 74 68 61 74 20 6d 6f 64 75 6c 65 0a 23 20  g that module.# 
0890: 6d 61 79 20 62 65 20 63 72 65 61 74 65 64 2e 20  may be created. 
08a0: 48 6f 77 65 76 65 72 20 69 66 20 61 20 6d 6f 64  However if a mod
08b0: 75 6c 65 20 78 43 72 65 61 74 65 28 29 20 66 61  ule xCreate() fa
08c0: 69 6c 73 20 74 6f 20 63 61 6c 6c 0a 23 20 73 71  ils to call.# sq
08d0: 6c 69 74 65 34 5f 64 65 63 6c 61 72 65 5f 76 74  lite4_declare_vt
08e0: 61 62 28 29 20 61 6e 20 65 72 72 6f 72 20 77 69  ab() an error wi
08f0: 6c 6c 20 62 65 20 72 61 69 73 65 64 20 61 6e 64  ll be raised and
0900: 20 74 68 65 20 74 61 62 6c 65 20 6e 6f 74 20 63   the table not c
0910: 72 65 61 74 65 64 2e 0a 23 0a 23 20 54 68 65 20  reated..#.# The 
0920: 22 65 63 68 6f 22 20 6d 6f 64 75 6c 65 20 64 6f  "echo" module do
0930: 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  es not invoke sq
0940: 6c 69 74 65 34 5f 64 65 63 6c 61 72 65 5f 76 74  lite4_declare_vt
0950: 61 62 28 29 20 69 66 20 69 74 20 69 73 0a 23 20  ab() if it is.# 
0960: 70 61 73 73 65 64 20 7a 65 72 6f 20 61 72 67 75  passed zero argu
0970: 6d 65 6e 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  ments..#.do_test
0980: 20 76 74 61 62 31 2d 31 2e 33 20 7b 0a 20 20 63   vtab1-1.3 {.  c
0990: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52  atchsql {.    CR
09a0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
09b0: 4c 45 20 74 31 20 55 53 49 4e 47 20 65 63 68 6f  LE t1 USING echo
09c0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 76 74 61 62  ;.  }.} {1 {vtab
09d0: 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 64  le constructor d
09e0: 69 64 20 6e 6f 74 20 64 65 63 6c 61 72 65 20 73  id not declare s
09f0: 63 68 65 6d 61 3a 20 74 31 7d 7d 0a 64 6f 5f 74  chema: t1}}.do_t
0a00: 65 73 74 20 76 74 61 62 31 2d 31 2e 34 20 7b 0a  est vtab1-1.4 {.
0a10: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0a20: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
0a30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f   sqlite_master O
0a40: 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20  RDER BY 1.  }.} 
0a50: 7b 7d 0a 0a 23 20 54 68 65 20 22 65 63 68 6f 22  {}..# The "echo"
0a60: 20 6d 6f 64 75 6c 65 20 78 43 72 65 61 74 65 20   module xCreate 
0a70: 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73 20 61  method returns a
0a80: 6e 20 65 72 72 6f 72 20 61 6e 64 20 64 6f 65 73  n error and does
0a90: 20 6e 6f 74 20 63 72 65 61 74 65 0a 23 20 74 68   not create.# th
0aa0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
0ab0: 69 66 20 69 74 20 69 73 20 70 61 73 73 65 64 20  if it is passed 
0ac0: 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  an argument that
0ad0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 72 72 65 73   does not corres
0ae0: 70 6f 6e 64 0a 23 20 74 6f 20 61 6e 20 65 78 69  pond.# to an exi
0af0: 73 74 69 6e 67 20 72 65 61 6c 20 74 61 62 6c 65  sting real table
0b00: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
0b10: 61 62 61 73 65 2e 0a 23 0a 64 6f 5f 74 65 73 74  abase..#.do_test
0b20: 20 76 74 61 62 31 2d 31 2e 35 20 7b 0a 20 20 63   vtab1-1.5 {.  c
0b30: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52  atchsql {.    CR
0b40: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
0b50: 4c 45 20 74 31 20 55 53 49 4e 47 20 65 63 68 6f  LE t1 USING echo
0b60: 28 6e 6f 5f 73 75 63 68 5f 74 61 62 6c 65 29 3b  (no_such_table);
0b70: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 76 74 61 62 6c  .  }.} {1 {vtabl
0b80: 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 61  e constructor fa
0b90: 69 6c 65 64 3a 20 74 31 7d 7d 0a 64 6f 5f 74 65  iled: t1}}.do_te
0ba0: 73 74 20 76 74 61 62 31 2d 31 2e 36 20 7b 0a 20  st vtab1-1.6 {. 
0bb0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0bc0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
0bd0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
0be0: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b  DER BY 1.  }.} {
0bf0: 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23 32 31 35  }..# Ticket #215
0c00: 36 2e 20 20 55 73 69 6e 67 20 74 68 65 20 73 71  6.  Using the sq
0c10: 6c 69 74 65 34 5f 70 72 65 70 61 72 65 5f 76 32  lite4_prepare_v2
0c20: 28 29 20 41 50 49 2c 20 6d 61 6b 65 20 73 75 72  () API, make sur
0c30: 65 20 74 68 61 74 0a 23 20 61 20 43 52 45 41 54  e that.# a CREAT
0c40: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
0c50: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65  statement can be
0c60: 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 74   used multiple t
0c70: 69 6d 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  imes..#.do_test 
0c80: 76 74 61 62 31 2d 31 2e 32 31 35 32 2e 31 20 7b  vtab1-1.2152.1 {
0c90: 0a 20 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74  .  set DB [sqlit
0ca0: 65 34 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e4_connection_po
0cb0: 69 6e 74 65 72 20 64 62 5d 0a 20 20 73 65 74 20  inter db].  set 
0cc0: 73 71 6c 20 7b 43 52 45 41 54 45 20 56 49 52 54  sql {CREATE VIRT
0cd0: 55 41 4c 20 54 41 42 4c 45 20 74 32 31 35 32 61  UAL TABLE t2152a
0ce0: 20 55 53 49 4e 47 20 65 63 68 6f 28 74 32 31 35   USING echo(t215
0cf0: 32 62 29 7d 0a 20 20 73 65 74 20 53 54 4d 54 20  2b)}.  set STMT 
0d00: 5b 73 71 6c 69 74 65 34 5f 70 72 65 70 61 72 65  [sqlite4_prepare
0d10: 5f 76 32 20 24 44 42 20 24 73 71 6c 20 2d 31 20  _v2 $DB $sql -1 
0d20: 54 41 49 4c 5d 0a 20 20 73 71 6c 69 74 65 34 5f  TAIL].  sqlite4_
0d30: 73 74 65 70 20 24 53 54 4d 54 0a 7d 20 53 51 4c  step $STMT.} SQL
0d40: 49 54 45 34 5f 45 52 52 4f 52 0a 64 6f 5f 74 65  ITE4_ERROR.do_te
0d50: 73 74 20 76 74 61 62 2d 31 2e 32 31 35 32 2e 32  st vtab-1.2152.2
0d60: 20 7b 0a 20 20 73 71 6c 69 74 65 34 5f 72 65 73   {.  sqlite4_res
0d70: 65 74 20 24 53 54 4d 54 0a 20 20 73 71 6c 69 74  et $STMT.  sqlit
0d80: 65 34 5f 73 74 65 70 20 24 53 54 4d 54 0a 7d 20  e4_step $STMT.} 
0d90: 53 51 4c 49 54 45 34 5f 45 52 52 4f 52 0a 64 6f  SQLITE4_ERROR.do
0da0: 5f 74 65 73 74 20 76 74 61 62 2d 31 2e 32 31 35  _test vtab-1.215
0db0: 32 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 34 5f  2.3 {.  sqlite4_
0dc0: 72 65 73 65 74 20 24 53 54 4d 54 0a 20 20 64 62  reset $STMT.  db
0dd0: 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41   eval {CREATE TA
0de0: 42 4c 45 20 74 32 31 35 32 62 28 78 2c 79 29 7d  BLE t2152b(x,y)}
0df0: 0a 20 20 73 71 6c 69 74 65 34 5f 73 74 65 70 20  .  sqlite4_step 
0e00: 24 53 54 4d 54 0a 7d 20 53 51 4c 49 54 45 34 5f  $STMT.} SQLITE4_
0e10: 44 4f 4e 45 0a 64 6f 5f 74 65 73 74 20 76 74 61  DONE.do_test vta
0e20: 62 2d 31 2e 32 31 35 32 2e 34 20 7b 0a 20 20 73  b-1.2152.4 {.  s
0e30: 71 6c 69 74 65 34 5f 66 69 6e 61 6c 69 7a 65 20  qlite4_finalize 
0e40: 24 53 54 4d 54 0a 20 20 64 62 20 65 76 61 6c 20  $STMT.  db eval 
0e50: 7b 44 52 4f 50 20 54 41 42 4c 45 20 74 32 31 35  {DROP TABLE t215
0e60: 32 61 3b 20 44 52 4f 50 20 54 41 42 4c 45 20 74  2a; DROP TABLE t
0e70: 32 31 35 32 62 7d 0a 7d 20 7b 7d 0a 0a 23 20 54  2152b}.} {}..# T
0e80: 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  est to make sure
0e90: 20 6e 6f 74 68 69 6e 67 20 67 6f 65 73 20 77 72   nothing goes wr
0ea0: 6f 6e 67 20 61 6e 64 20 6e 6f 20 6d 65 6d 6f 72  ong and no memor
0eb0: 79 20 69 73 20 6c 65 61 6b 65 64 20 69 66 20 77  y is leaked if w
0ec0: 65 20 0a 23 20 73 65 6c 65 63 74 20 61 6e 20 69  e .# select an i
0ed0: 6c 6c 65 67 61 6c 20 74 61 62 6c 65 2d 6e 61 6d  llegal table-nam
0ee0: 65 20 28 69 2e 65 20 61 20 72 65 73 65 72 76 65  e (i.e a reserve
0ef0: 64 20 6e 61 6d 65 20 6f 72 20 74 68 65 20 6e 61  d name or the na
0f00: 6d 65 20 6f 66 20 61 0a 23 20 74 61 62 6c 65 20  me of a.# table 
0f10: 74 68 61 74 20 61 6c 72 65 61 64 79 20 65 78 69  that already exi
0f20: 73 74 73 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  sts)..#.do_test 
0f30: 76 74 61 62 31 2d 31 2e 37 20 7b 0a 20 20 63 61  vtab1-1.7 {.  ca
0f40: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  tchsql {.    CRE
0f50: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0f60: 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  E sqlite_master 
0f70: 55 53 49 4e 47 20 65 63 68 6f 3b 0a 20 20 7d 0a  USING echo;.  }.
0f80: 7d 20 7b 31 20 7b 6f 62 6a 65 63 74 20 6e 61 6d  } {1 {object nam
0f90: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
0fa0: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 73 71 6c  nternal use: sql
0fb0: 69 74 65 5f 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f  ite_master}}.do_
0fc0: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 38 20 7b  test vtab1-1.8 {
0fd0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
0fe0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0ff0: 72 65 61 6c 28 61 2c 20 62 2c 20 63 29 3b 0a 20  real(a, b, c);. 
1000: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
1010: 4c 20 54 41 42 4c 45 20 74 72 65 61 6c 20 55 53  L TABLE treal US
1020: 49 4e 47 20 65 63 68 6f 28 74 72 65 61 6c 29 3b  ING echo(treal);
1030: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 74 61 62 6c 65  .  }.} {1 {table
1040: 20 74 72 65 61 6c 20 61 6c 72 65 61 64 79 20 65   treal already e
1050: 78 69 73 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20  xists}}.do_test 
1060: 76 74 61 62 31 2d 31 2e 39 20 7b 0a 20 20 65 78  vtab1-1.9 {.  ex
1070: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
1080: 20 54 41 42 4c 45 20 74 72 65 61 6c 3b 0a 20 20   TABLE treal;.  
1090: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
10a0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
10b0: 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a   ORDER BY 1.  }.
10c0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74  } {}..do_test vt
10d0: 61 62 31 2d 31 2e 31 30 20 7b 0a 20 20 65 78 65  ab1-1.10 {.  exe
10e0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
10f0: 45 20 54 41 42 4c 45 20 74 72 65 61 6c 28 61 2c  E TABLE treal(a,
1100: 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41   b, c);.    CREA
1110: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1120: 20 74 65 63 68 6f 20 55 53 49 4e 47 20 65 63 68   techo USING ech
1130: 6f 28 74 72 65 61 6c 29 3b 0a 20 20 7d 0a 20 20  o(treal);.  }.  
1140: 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
1150: 65 34 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e4 db test.db.  
1160: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
1170: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 63  ELECT * FROM tec
1180: 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f  ho;.  }.} {1 {no
1190: 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63   such module: ec
11a0: 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  ho}}.do_test vta
11b0: 62 31 2d 31 2e 31 31 20 7b 0a 20 20 63 61 74 63  b1-1.11 {.  catc
11c0: 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  hsql {.    INSER
11d0: 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c  T INTO techo VAL
11e0: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
11f0: 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  }.} {1 {no such 
1200: 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64  module: echo}}.d
1210: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31  o_test vtab1-1.1
1220: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
1230: 0a 20 20 20 20 55 50 44 41 54 45 20 74 65 63 68  .    UPDATE tech
1240: 6f 20 53 45 54 20 61 20 3d 20 31 30 3b 0a 20 20  o SET a = 10;.  
1250: 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  }.} {1 {no such 
1260: 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64  module: echo}}.d
1270: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31  o_test vtab1-1.1
1280: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
1290: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
12a0: 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31   techo;.  }.} {1
12b0: 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65   {no such module
12c0: 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74  : echo}}.do_test
12d0: 20 76 74 61 62 31 2d 31 2e 31 34 20 7b 0a 20 20   vtab1-1.14 {.  
12e0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 50  catchsql {.    P
12f0: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
1300: 28 74 65 63 68 6f 29 0a 20 20 7d 0a 7d 20 7b 31  (techo).  }.} {1
1310: 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65   {no such module
1320: 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74  : echo}}.do_test
1330: 20 76 74 61 62 31 2d 31 2e 31 35 20 7b 0a 20 20   vtab1-1.15 {.  
1340: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 44  catchsql {.    D
1350: 52 4f 50 20 54 41 42 4c 45 20 74 65 63 68 6f 3b  ROP TABLE techo;
1360: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75  .  }.} {1 {no su
1370: 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d  ch module: echo}
1380: 7d 0a 0a 72 65 67 69 73 74 65 72 5f 65 63 68 6f  }..register_echo
1390: 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 34  _module [sqlite4
13a0: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e  _connection_poin
13b0: 74 65 72 20 64 62 5d 0a 72 65 67 69 73 74 65 72  ter db].register
13c0: 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71  _echo_module [sq
13d0: 6c 69 74 65 34 5f 63 6f 6e 6e 65 63 74 69 6f 6e  lite4_connection
13e0: 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 0a 23 20  _pointer db]..# 
13f0: 54 65 73 74 20 61 6e 20 65 72 72 6f 72 20 6d 65  Test an error me
1400: 73 73 61 67 65 20 72 65 74 75 72 6e 65 64 20 66  ssage returned f
1410: 72 6f 6d 20 61 20 76 2d 74 61 62 6c 65 20 63 6f  rom a v-table co
1420: 6e 73 74 72 75 63 74 6f 72 2e 0a 23 0a 64 6f 5f  nstructor..#.do_
1430: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31 36 20  test vtab1-1.16 
1440: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1450: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 65 63    DROP TABLE tec
1460: 68 6f 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ho;.    CREATE T
1470: 41 42 4c 45 20 6c 6f 67 6d 73 67 28 6c 6f 67 29  ABLE logmsg(log)
1480: 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  ;.  }.  catchsql
1490: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49   {.    CREATE VI
14a0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 63 68  RTUAL TABLE tech
14b0: 6f 20 55 53 49 4e 47 20 65 63 68 6f 28 74 72 65  o USING echo(tre
14c0: 61 6c 2c 20 6c 6f 67 6d 73 67 29 3b 0a 20 20 7d  al, logmsg);.  }
14d0: 0a 7d 20 7b 31 20 7b 74 61 62 6c 65 20 27 6c 6f  .} {1 {table 'lo
14e0: 67 6d 73 67 27 20 61 6c 72 65 61 64 79 20 65 78  gmsg' already ex
14f0: 69 73 74 73 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  ists}}..do_test 
1500: 76 74 61 62 31 2d 31 2e 31 37 20 7b 0a 20 20 65  vtab1-1.17 {.  e
1510: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
1520: 50 20 54 41 42 4c 45 20 74 72 65 61 6c 3b 0a 20  P TABLE treal;. 
1530: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f     DROP TABLE lo
1540: 67 6d 73 67 3b 0a 20 20 20 20 53 45 4c 45 43 54  gmsg;.    SELECT
1550: 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
1560: 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b  _master;.  }.} {
1570: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
15c0: 74 20 63 61 73 65 73 20 76 74 61 62 31 2e 32 2e  t cases vtab1.2.
15d0: 2a 0a 23 0a 23 20 41 74 20 74 68 69 73 20 70 6f  *.#.# At this po
15e0: 69 6e 74 2c 20 74 68 65 20 64 61 74 61 62 61 73  int, the databas
15f0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
1600: 65 6d 70 74 79 2e 20 54 68 65 20 65 63 68 6f 20  empty. The echo 
1610: 6d 6f 64 75 6c 65 0a 23 20 68 61 73 20 61 6c 72  module.# has alr
1620: 65 61 64 79 20 62 65 65 6e 20 72 65 67 69 73 74  eady been regist
1630: 65 72 65 64 2e 0a 0a 23 20 49 66 20 61 20 73 69  ered...# If a si
1640: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 69 73  ngle argument is
1650: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 65   passed to the e
1660: 63 68 6f 20 6d 6f 64 75 6c 65 20 64 75 72 69 6e  cho module durin
1670: 67 20 74 61 62 6c 65 0a 23 20 63 72 65 61 74 69  g table.# creati
1680: 6f 6e 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  on, it is assume
1690: 64 20 74 6f 20 62 65 20 74 68 65 20 6e 61 6d 65  d to be the name
16a0: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74   of a table in t
16b0: 68 65 20 73 61 6d 65 0a 23 20 64 61 74 61 62 61  he same.# databa
16c0: 73 65 2e 20 54 68 65 20 65 63 68 6f 20 6d 6f 64  se. The echo mod
16d0: 75 6c 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ule attempts to 
16e0: 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 6f  set the schema o
16f0: 66 20 74 68 65 0a 23 20 6e 65 77 20 76 69 72 74  f the.# new virt
1700: 75 61 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20  ual table to be 
1710: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1720: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
1730: 65 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65  e table..#.do_te
1740: 73 74 20 76 74 61 62 31 2d 32 2e 31 20 7b 0a 20  st vtab1-2.1 {. 
1750: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1760: 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 6d 70  REATE TABLE temp
1770: 6c 61 74 65 28 61 2c 20 62 2c 20 63 29 3b 0a 20  late(a, b, c);. 
1780: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
1790: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
17a0: 28 74 65 6d 70 6c 61 74 65 29 3b 20 7d 0a 7d 20  (template); }.} 
17b0: 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 5c 0a  [list         \.
17c0: 20 20 30 20 61 20 7b 7d 20 30 20 7b 7d 20 30 20    0 a {} 0 {} 0 
17d0: 5c 0a 20 20 31 20 62 20 7b 7d 20 30 20 7b 7d 20  \.  1 b {} 0 {} 
17e0: 30 20 5c 0a 20 20 32 20 63 20 7b 7d 20 30 20 7b  0 \.  2 c {} 0 {
17f0: 7d 20 30 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20  } 0 \.].do_test 
1800: 76 74 61 62 31 2d 32 2e 32 20 7b 0a 20 20 65 78  vtab1-2.2 {.  ex
1810: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
1820: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1830: 20 74 31 20 55 53 49 4e 47 20 65 63 68 6f 28 74   t1 USING echo(t
1840: 65 6d 70 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20  emplate);.  }.  
1850: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1860: 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74 31 29 3b   table_info(t1);
1870: 20 7d 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 20   }.} [list      
1880: 20 20 20 5c 0a 20 20 30 20 61 20 7b 7d 20 30 20     \.  0 a {} 0 
1890: 7b 7d 20 30 20 5c 0a 20 20 31 20 62 20 7b 7d 20  {} 0 \.  1 b {} 
18a0: 30 20 7b 7d 20 30 20 5c 0a 20 20 32 20 63 20 7b  0 {} 0 \.  2 c {
18b0: 7d 20 30 20 7b 7d 20 30 20 5c 0a 5d 0a 0a 23 20  } 0 {} 0 \.]..# 
18c0: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 64 61  Test that the da
18d0: 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 75 6e  tabase can be un
18e0: 6c 6f 61 64 65 64 2e 20 54 68 69 73 20 73 68 6f  loaded. This sho
18f0: 75 6c 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 78  uld invoke the x
1900: 44 69 73 63 6f 6e 6e 65 63 74 28 29 0a 23 20 63  Disconnect().# c
1910: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
1920: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 72 65  successfully cre
1930: 61 74 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ate virtual tabl
1940: 65 20 28 74 31 29 2e 0a 23 0a 64 6f 5f 74 65 73  e (t1)..#.do_tes
1950: 74 20 76 74 61 62 31 2d 32 2e 33 20 7b 0a 20 20  t vtab1-2.3 {.  
1960: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  set echo_module 
1970: 5b 6c 69 73 74 5d 0a 20 20 64 62 20 63 6c 6f 73  [list].  db clos
1980: 65 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  e.  set echo_mod
1990: 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 44 69 73  ule.} [list xDis
19a0: 63 6f 6e 6e 65 63 74 5d 0a 0a 23 20 52 65 2d 6f  connect]..# Re-o
19b0: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
19c0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  . This should no
19d0: 74 20 63 61 75 73 65 20 61 6e 79 20 76 69 72 74  t cause any virt
19e0: 75 61 6c 20 6d 65 74 68 6f 64 73 20 74 6f 20 0a  ual methods to .
19f0: 23 20 62 65 20 63 61 6c 6c 65 64 2e 20 54 68 65  # be called. The
1a00: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 78   invocation of x
1a10: 43 6f 6e 6e 65 63 74 28 29 20 69 73 20 64 65 6c  Connect() is del
1a20: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 76  ayed until the v
1a30: 69 72 74 75 61 6c 0a 23 20 74 61 62 6c 65 20 73  irtual.# table s
1a40: 63 68 65 6d 61 20 69 73 20 66 69 72 73 74 20 72  chema is first r
1a50: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
1a60: 6f 6d 70 69 6c 65 72 2e 0a 23 0a 64 6f 5f 74 65  ompiler..#.do_te
1a70: 73 74 20 76 74 61 62 31 2d 32 2e 34 20 7b 0a 20  st vtab1-2.4 {. 
1a80: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
1a90: 20 5b 6c 69 73 74 5d 0a 20 20 73 71 6c 69 74 65   [list].  sqlite
1aa0: 34 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  4 db test.db.  d
1ab0: 62 20 63 61 63 68 65 20 73 69 7a 65 20 30 0a 20  b cache size 0. 
1ac0: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
1ad0: 0a 7d 20 7b 7d 0a 0a 23 20 54 72 79 20 74 6f 20  .} {}..# Try to 
1ae0: 71 75 65 72 79 20 74 68 65 20 76 69 72 74 75 61  query the virtua
1af0: 6c 20 74 61 62 6c 65 20 73 63 68 65 6d 61 2e 20  l table schema. 
1b00: 54 68 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c  This should fail
1b10: 2c 20 61 73 20 74 68 65 0a 23 20 65 63 68 6f 20  , as the.# echo 
1b20: 6d 6f 64 75 6c 65 20 68 61 73 20 6e 6f 74 20 62  module has not b
1b30: 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 20 77  een registered w
1b40: 69 74 68 20 74 68 69 73 20 64 61 74 61 62 61 73  ith this databas
1b50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a  e connection..#.
1b60: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 32 2e  do_test vtab1.2.
1b70: 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  6 {.  catchsql {
1b80: 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e   PRAGMA table_in
1b90: 66 6f 28 74 31 29 3b 20 7d 0a 7d 20 7b 31 20 7b  fo(t1); }.} {1 {
1ba0: 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20  no such module: 
1bb0: 65 63 68 6f 7d 7d 0a 0a 23 20 52 65 67 69 73 74  echo}}..# Regist
1bc0: 65 72 20 74 68 65 20 6d 6f 64 75 6c 65 0a 72 65  er the module.re
1bd0: 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75  gister_echo_modu
1be0: 6c 65 20 5b 73 71 6c 69 74 65 34 5f 63 6f 6e 6e  le [sqlite4_conn
1bf0: 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64  ection_pointer d
1c00: 62 5d 0a 0a 23 20 54 72 79 20 74 6f 20 71 75 65  b]..# Try to que
1c10: 72 79 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ry the virtual t
1c20: 61 62 6c 65 20 73 63 68 65 6d 61 20 61 67 61 69  able schema agai
1c30: 6e 2e 20 54 68 69 73 20 74 69 6d 65 20 69 74 20  n. This time it 
1c40: 73 68 6f 75 6c 64 0a 23 20 69 6e 76 6f 6b 65 20  should.# invoke 
1c50: 74 68 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74  the xConnect met
1c60: 68 6f 64 20 61 6e 64 20 73 75 63 63 65 65 64 2e  hod and succeed.
1c70: 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  .#.do_test vtab1
1c80: 2e 32 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.7 {.  execsql
1c90: 20 7b 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f   { PRAGMA table_
1ca0: 69 6e 66 6f 28 74 31 29 3b 20 7d 0a 7d 20 5b 6c  info(t1); }.} [l
1cb0: 69 73 74 20 20 20 20 20 20 20 20 20 5c 0a 20 20  ist         \.  
1cc0: 30 20 61 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a  0 a {} 0 {} 0 \.
1cd0: 20 20 31 20 62 20 7b 7d 20 30 20 7b 7d 20 30 20    1 b {} 0 {} 0 
1ce0: 5c 0a 20 20 32 20 63 20 7b 7d 20 30 20 7b 7d 20  \.  2 c {} 0 {} 
1cf0: 30 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74  0 \.].do_test vt
1d00: 61 62 31 2e 32 2e 38 20 7b 0a 20 20 73 65 74 20  ab1.2.8 {.  set 
1d10: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 7b 78  echo_module.} {x
1d20: 43 6f 6e 6e 65 63 74 20 65 63 68 6f 20 6d 61 69  Connect echo mai
1d30: 6e 20 74 31 20 74 65 6d 70 6c 61 74 65 7d 0a 0a  n t1 template}..
1d40: 23 20 44 72 6f 70 20 74 61 62 6c 65 20 74 31 2e  # Drop table t1.
1d50: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 63 61 75   This should cau
1d60: 73 65 20 74 68 65 20 78 44 65 73 74 72 6f 79 20  se the xDestroy 
1d70: 28 62 75 74 20 6e 6f 74 20 78 44 69 73 63 6f 6e  (but not xDiscon
1d80: 6e 65 63 74 29 20 6d 65 74 68 6f 64 20 0a 23 20  nect) method .# 
1d90: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 64  to be invoked..d
1da0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32 2e 35  o_test vtab1-2.5
1db0: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
1dc0: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71  dule "".  execsq
1dd0: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  l {.    DROP TAB
1de0: 4c 45 20 74 31 3b 0a 20 20 7d 0a 20 20 73 65 74  LE t1;.  }.  set
1df0: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 7b   echo_module.} {
1e00: 78 44 65 73 74 72 6f 79 7d 0a 0a 64 6f 5f 74 65  xDestroy}..do_te
1e10: 73 74 20 76 74 61 62 31 2d 32 2e 36 20 7b 0a 20  st vtab1-2.6 {. 
1e20: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
1e30: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
1e40: 6f 28 74 31 29 3b 20 0a 20 20 7d 0a 7d 20 7b 7d  o(t1); .  }.} {}
1e50: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32  .do_test vtab1-2
1e60: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
1e70: 0a 20 20 20 20 53 45 4c 45 43 54 20 73 71 6c 20  .    SELECT sql 
1e80: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1e90: 65 72 3b 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20  er;.  }.} [list 
1ea0: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65  {CREATE TABLE te
1eb0: 6d 70 6c 61 74 65 28 61 2c 20 62 2c 20 63 29 7d  mplate(a, b, c)}
1ec0: 5d 0a 23 20 43 6c 65 61 6e 20 75 70 20 6f 74 68  ].# Clean up oth
1ed0: 65 72 20 74 65 73 74 20 61 72 74 69 66 61 63 74  er test artifact
1ee0: 73 3a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  s:.do_test vtab1
1ef0: 2d 32 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.8 {.  execsql
1f00: 20 7b 20 0a 20 20 20 20 44 52 4f 50 20 54 41 42   { .    DROP TAB
1f10: 4c 45 20 74 65 6d 70 6c 61 74 65 3b 0a 20 20 20  LE template;.   
1f20: 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
1f30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
1f40: 20 20 7d 0a 7d 20 5b 6c 69 73 74 5d 0a 0a 23 2d    }.} [list]..#-
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73  -----.# Test cas
1fa0: 65 20 76 74 61 62 31 2d 33 20 74 65 73 74 20 74  e vtab1-3 test t
1fb0: 61 62 6c 65 20 73 63 61 6e 73 20 61 6e 64 20 74  able scans and t
1fc0: 68 65 20 65 63 68 6f 20 6d 6f 64 75 6c 65 27 73  he echo module's
1fd0: 20 0a 23 20 78 42 65 73 74 49 6e 64 65 78 2f 78   .# xBestIndex/x
1fe0: 46 69 6c 74 65 72 20 68 61 6e 64 6c 69 6e 67 20  Filter handling 
1ff0: 6f 66 20 57 48 45 52 45 20 63 6f 6e 64 69 74 69  of WHERE conditi
2000: 6f 6e 73 2e 0a 0a 64 6f 5f 74 65 73 74 20 76 74  ons...do_test vt
2010: 61 62 31 2d 33 2e 31 20 7b 0a 20 20 73 65 74 20  ab1-3.1 {.  set 
2020: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20  echo_module "". 
2030: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
2040: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 65 61  REATE TABLE trea
2050: 6c 28 61 20 49 4e 54 45 47 45 52 2c 20 62 20 49  l(a INTEGER, b I
2060: 4e 54 45 47 45 52 2c 20 63 29 3b 20 0a 20 20 20  NTEGER, c); .   
2070: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 72   CREATE INDEX tr
2080: 65 61 6c 5f 69 64 78 20 4f 4e 20 74 72 65 61 6c  eal_idx ON treal
2090: 28 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  (b);.    CREATE 
20a0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31  VIRTUAL TABLE t1
20b0: 20 55 53 49 4e 47 20 65 63 68 6f 28 74 72 65 61   USING echo(trea
20c0: 6c 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63  l);.  }.  set ec
20d0: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
20e0: 74 20 78 43 72 65 61 74 65 20 65 63 68 6f 20 6d  t xCreate echo m
20f0: 61 69 6e 20 74 31 20 74 72 65 61 6c 20 20 20 5c  ain t1 treal   \
2100: 0a 20 20 20 20 20 20 20 20 78 53 79 6e 63 20 20  .        xSync  
2110: 20 65 63 68 6f 28 74 72 65 61 6c 29 20 20 5c 0a   echo(treal)  \.
2120: 20 20 20 20 20 20 20 20 78 43 6f 6d 6d 69 74 20          xCommit 
2130: 65 63 68 6f 28 74 72 65 61 6c 29 20 20 5c 0a 5d  echo(treal)  \.]
2140: 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 20  ..# Test that a 
2150: 53 45 4c 45 43 54 20 6f 6e 20 74 31 20 64 6f 65  SELECT on t1 doe
2160: 73 6e 27 74 20 63 72 61 73 68 2e 20 4e 6f 20 72  sn't crash. No r
2170: 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  ows are returned
2180: 0a 23 20 62 65 63 61 75 73 65 20 74 68 65 20 75  .# because the u
2190: 6e 64 65 72 6c 79 69 6e 67 20 72 65 61 6c 20 74  nderlying real t
21a0: 61 62 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  able is currentl
21b0: 79 20 65 6d 70 74 79 2e 0a 23 0a 64 6f 5f 74 65  y empty..#.do_te
21c0: 73 74 20 76 74 61 62 31 2d 33 2e 32 20 7b 0a 20  st vtab1-3.2 {. 
21d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
21e0: 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52  ELECT a, b, c FR
21f0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM t1;.  }.} {}.
2200: 0a 23 20 50 75 74 20 73 6f 6d 65 20 64 61 74 61  .# Put some data
2210: 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20   into the table 
2220: 74 72 65 61 6c 2e 20 54 68 65 6e 20 74 72 79 20  treal. Then try 
2230: 61 20 66 65 77 20 73 69 6d 70 6c 65 20 53 45 4c  a few simple SEL
2240: 45 43 54 20 0a 23 20 73 74 61 74 65 6d 65 6e 74  ECT .# statement
2250: 73 20 6f 6e 20 74 31 2e 0a 23 0a 64 6f 5f 74 65  s on t1..#.do_te
2260: 73 74 20 76 74 61 62 31 2d 33 2e 33 20 7b 0a 20  st vtab1-3.3 {. 
2270: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
2280: 4e 53 45 52 54 20 49 4e 54 4f 20 74 72 65 61 6c  NSERT INTO treal
2290: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
22a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
22b0: 4f 20 74 72 65 61 6c 20 56 41 4c 55 45 53 28 34  O treal VALUES(4
22c0: 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c  , 5, 6);.    SEL
22d0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
22e0: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20   }.} {1 2 3 4 5 
22f0: 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  6}.do_test vtab1
2300: 2d 33 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -3.4 {.  execsql
2310: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20   {.    SELECT a 
2320: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
2330: 31 20 34 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  1 4}.do_test vta
2340: 62 31 2d 33 2e 35 20 7b 0a 20 20 65 78 65 63 73  b1-3.5 {.  execs
2350: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2360: 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 3b 0a 20  rowid FROM t1;. 
2370: 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65   }.} {1 2}.do_te
2380: 73 74 20 76 74 61 62 31 2d 33 2e 36 20 7b 0a 20  st vtab1-3.6 {. 
2390: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
23a0: 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   "".  execsql {.
23b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23c0: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  M t1;.  }.} {1 2
23d0: 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73   3 4 5 6}.do_tes
23e0: 74 20 76 74 61 62 31 2d 33 2e 37 20 7b 0a 20 20  t vtab1-3.7 {.  
23f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
2400: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
2410: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
2420: 31 20 32 20 33 20 32 20 34 20 35 20 36 7d 0a 64  1 2 3 2 4 5 6}.d
2430: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 38  o_test vtab1-3.8
2440: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2450: 20 20 20 53 45 4c 45 43 54 20 61 20 41 53 20 64     SELECT a AS d
2460: 2c 20 62 20 41 53 20 65 2c 20 63 20 41 53 20 66  , b AS e, c AS f
2470: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
2480: 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 23  {1 2 3 4 5 6}..#
2490: 20 45 78 65 63 75 74 65 20 73 6f 6d 65 20 53 45   Execute some SE
24a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
24b0: 77 69 74 68 20 57 48 45 52 45 20 63 6c 61 75 73  with WHERE claus
24c0: 65 73 20 6f 6e 20 74 68 65 20 74 31 20 74 61 62  es on the t1 tab
24d0: 6c 65 2e 0a 23 20 54 68 65 6e 20 63 68 65 63 6b  le..# Then check
24e0: 20 74 68 65 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   the echo_module
24f0: 20 76 61 72 69 61 62 6c 65 20 28 77 72 69 74 74   variable (writt
2500: 65 6e 20 74 6f 20 62 79 20 74 68 65 20 6d 6f 64  en to by the mod
2510: 75 6c 65 20 6d 65 74 68 6f 64 73 0a 23 20 69 6e  ule methods.# in
2520: 20 74 65 73 74 38 2e 63 29 20 74 6f 20 6d 61 6b   test8.c) to mak
2530: 65 20 73 75 72 65 20 74 68 65 20 78 42 65 73 74  e sure the xBest
2540: 49 6e 64 65 78 28 29 20 61 6e 64 20 78 46 69 6c  Index() and xFil
2550: 74 65 72 28 29 20 6d 65 74 68 6f 64 73 20 77 65  ter() methods we
2560: 72 65 0a 23 20 63 61 6c 6c 65 64 20 63 6f 72 72  re.# called corr
2570: 65 63 74 6c 79 2e 0a 23 0a 64 6f 5f 74 65 73 74  ectly..#.do_test
2580: 20 76 74 61 62 31 2d 33 2e 38 20 7b 0a 20 20 73   vtab1-3.8 {.  s
2590: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22  et echo_module "
25a0: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
25b0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
25c0: 74 31 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63  t1;.  }.  set ec
25d0: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
25e0: 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45  t xBestIndex {SE
25f0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
2600: 4f 4d 20 27 74 72 65 61 6c 27 7d 20 5c 0a 20 20  OM 'treal'} \.  
2610: 20 20 20 20 20 20 78 46 69 6c 74 65 72 20 20 20        xFilter   
2620: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
2630: 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 7d 20  * FROM 'treal'} 
2640: 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ].do_test vtab1-
2650: 33 2e 39 20 7b 0a 20 20 73 65 74 20 65 63 68 6f  3.9 {.  set echo
2660: 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65  _module "".  exe
2670: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2680: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
2690: 45 20 62 20 3d 20 35 3b 0a 20 20 7d 0a 7d 20 7b  E b = 5;.  }.} {
26a0: 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76  4 5 6}.do_test v
26b0: 74 61 62 31 2d 33 2e 31 30 20 7b 0a 20 20 73 65  tab1-3.10 {.  se
26c0: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20  t echo_module.} 
26d0: 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 78  [list xBestIndex
26e0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
26f0: 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57  * FROM 'treal' W
2700: 48 45 52 45 20 62 20 3d 20 3f 7d 20 20 20 5c 0a  HERE b = ?}   \.
2710: 20 20 20 20 20 20 20 20 78 46 69 6c 74 65 72 20          xFilter 
2720: 20 20 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64     {SELECT rowid
2730: 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27  , * FROM 'treal'
2740: 20 57 48 45 52 45 20 62 20 3d 20 3f 7d 20 35 20   WHERE b = ?} 5 
2750: 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ].do_test vtab1-
2760: 33 2e 31 30 20 7b 0a 20 20 73 65 74 20 65 63 68  3.10 {.  set ech
2770: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78  o_module "".  ex
2780: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
2790: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
27a0: 52 45 20 62 20 3e 3d 20 35 20 41 4e 44 20 62 20  RE b >= 5 AND b 
27b0: 3c 3d 20 31 30 3b 0a 20 20 7d 0a 7d 20 7b 34 20  <= 10;.  }.} {4 
27c0: 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  5 6}.do_test vta
27d0: 62 31 2d 33 2e 31 31 20 7b 0a 20 20 73 65 74 20  b1-3.11 {.  set 
27e0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c  echo_module.} [l
27f0: 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b  ist xBestIndex {
2800: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
2810: 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45  FROM 'treal' WHE
2820: 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20  RE b >= ? AND b 
2830: 3c 3d 20 3f 7d 20 20 20 20 20 20 5c 0a 20 20 20  <= ?}      \.   
2840: 20 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20       xFilter    
2850: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
2860: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48   FROM 'treal' WH
2870: 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62  ERE b >= ? AND b
2880: 20 3c 3d 20 3f 7d 20 35 20 31 30 20 5d 0a 64 6f   <= ?} 5 10 ].do
2890: 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31 32  _test vtab1-3.12
28a0: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
28b0: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71  dule "".  execsq
28c0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
28d0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
28e0: 20 42 45 54 57 45 45 4e 20 32 20 41 4e 44 20 31   BETWEEN 2 AND 1
28f0: 30 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20  0;.  }.} {1 2 3 
2900: 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76  4 5 6}.do_test v
2910: 74 61 62 31 2d 33 2e 31 33 20 7b 0a 20 20 73 65  tab1-3.13 {.  se
2920: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20  t echo_module.} 
2930: 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 78  [list xBestIndex
2940: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
2950: 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57  * FROM 'treal' W
2960: 48 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20  HERE b >= ? AND 
2970: 62 20 3c 3d 20 3f 7d 20 20 20 20 20 20 5c 0a 20  b <= ?}      \. 
2980: 20 20 20 20 20 20 20 78 46 69 6c 74 65 72 20 20         xFilter  
2990: 20 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c    {SELECT rowid,
29a0: 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20   * FROM 'treal' 
29b0: 57 48 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44  WHERE b >= ? AND
29c0: 20 62 20 3c 3d 20 3f 7d 20 32 20 31 30 20 5d 0a   b <= ?} 2 10 ].
29d0: 0a 23 20 41 64 64 20 61 20 66 75 6e 63 74 69 6f  .# Add a functio
29e0: 6e 20 66 6f 72 20 74 68 65 20 4d 41 54 43 48 20  n for the MATCH 
29f0: 6f 70 65 72 61 74 6f 72 2e 20 45 76 65 72 79 74  operator. Everyt
2a00: 68 69 6e 67 20 61 6c 77 61 79 73 20 6d 61 74 63  hing always matc
2a10: 68 65 73 21 0a 23 70 72 6f 63 20 74 65 73 74 5f  hes!.#proc test_
2a20: 6d 61 74 63 68 20 7b 6c 68 73 20 72 68 73 7d 20  match {lhs rhs} 
2a30: 7b 0a 23 20 20 6c 61 70 70 65 6e 64 20 3a 3a 65  {.#  lappend ::e
2a40: 63 68 6f 5f 6d 6f 64 75 6c 65 20 4d 41 54 43 48  cho_module MATCH
2a50: 20 24 6c 68 73 20 24 72 68 73 0a 23 20 20 72 65   $lhs $rhs.#  re
2a60: 74 75 72 6e 20 31 0a 23 7d 0a 23 64 62 20 66 75  turn 1.#}.#db fu
2a70: 6e 63 74 69 6f 6e 20 6d 61 74 63 68 20 74 65 73  nction match tes
2a80: 74 5f 6d 61 74 63 68 0a 0a 73 65 74 20 65 63 68  t_match..set ech
2a90: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 64 6f 5f 74  o_module "".do_t
2aa0: 65 73 74 20 76 74 61 62 31 2d 33 2e 31 32 20 7b  est vtab1-3.12 {
2ab0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
2ac0: 6c 65 20 22 22 0a 20 20 63 61 74 63 68 73 71 6c  le "".  catchsql
2ad0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
2ae0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
2af0: 4d 41 54 43 48 20 27 73 74 72 69 6e 67 27 3b 0a  MATCH 'string';.
2b00: 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65    }.} {1 {unable
2b10: 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
2b20: 20 4d 41 54 43 48 20 69 6e 20 74 68 65 20 72 65   MATCH in the re
2b30: 71 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d  quested context}
2b40: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
2b50: 33 2e 31 33 20 7b 0a 20 20 73 65 74 20 65 63 68  3.13 {.  set ech
2b60: 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74  o_module.} [list
2b70: 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c   xBestIndex {SEL
2b80: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
2b90: 4d 20 27 74 72 65 61 6c 27 7d 20 5c 0a 20 20 20  M 'treal'} \.   
2ba0: 20 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20       xFilter    
2bb0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
2bc0: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 7d 5d 0a   FROM 'treal'}].
2bd0: 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65  ifcapable subque
2be0: 72 79 20 7b 0a 23 20 54 68 65 20 65 63 68 6f 20  ry {.# The echo 
2bf0: 6d 6f 64 75 6c 65 20 75 73 65 73 20 61 20 73 75  module uses a su
2c00: 62 71 75 65 72 79 20 69 6e 74 65 72 6e 61 6c 6c  bquery internall
2c10: 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  y to implement t
2c20: 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f  he MATCH operato
2c30: 72 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  r..do_test vtab1
2c40: 2d 33 2e 31 34 20 7b 0a 20 20 73 65 74 20 65 63  -3.14 {.  set ec
2c50: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65  ho_module "".  e
2c60: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
2c70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
2c80: 45 52 45 20 62 20 4d 41 54 43 48 20 27 73 74 72  ERE b MATCH 'str
2c90: 69 6e 67 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  ing';.  }.} {}.d
2ca0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31  o_test vtab1-3.1
2cb0: 35 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  5 {.  set echo_m
2cc0: 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42  odule.} [list xB
2cd0: 65 73 74 49 6e 64 65 78 20 5c 0a 20 20 20 20 20  estIndex \.     
2ce0: 20 20 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64     {SELECT rowid
2cf0: 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27  , * FROM 'treal'
2d00: 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20 28 53   WHERE b LIKE (S
2d10: 45 4c 45 43 54 20 27 25 27 7c 7c 3f 7c 7c 27 25  ELECT '%'||?||'%
2d20: 27 29 7d 20 20 5c 0a 20 20 20 20 20 20 20 20 78  ')}  \.        x
2d30: 46 69 6c 74 65 72 20 5c 0a 20 20 20 20 20 20 20  Filter \.       
2d40: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
2d50: 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57  * FROM 'treal' W
2d60: 48 45 52 45 20 62 20 4c 49 4b 45 20 28 53 45 4c  HERE b LIKE (SEL
2d70: 45 43 54 20 27 25 27 7c 7c 3f 7c 7c 27 25 27 29  ECT '%'||?||'%')
2d80: 7d 20 5c 0a 20 20 20 20 20 20 20 20 73 74 72 69  } \.        stri
2d90: 6e 67 20 5d 0a 7d 3b 20 23 69 66 63 61 70 61 62  ng ].}; #ifcapab
2da0: 6c 65 20 73 75 62 71 75 65 72 79 0a 0a 23 2d 2d  le subquery..#--
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65  ----.# Test case
2e00: 20 76 74 61 62 31 2d 33 20 74 65 73 74 20 74 61   vtab1-3 test ta
2e10: 62 6c 65 20 73 63 61 6e 73 20 61 6e 64 20 74 68  ble scans and th
2e20: 65 20 65 63 68 6f 20 6d 6f 64 75 6c 65 27 73 20  e echo module's 
2e30: 0a 23 20 78 42 65 73 74 49 6e 64 65 78 2f 78 46  .# xBestIndex/xF
2e40: 69 6c 74 65 72 20 68 61 6e 64 6c 69 6e 67 20 6f  ilter handling o
2e50: 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  f ORDER BY claus
2e60: 65 73 2e 0a 0a 23 20 54 68 69 73 20 70 72 6f 63  es...# This proc
2e70: 65 64 75 72 65 20 65 78 65 63 75 74 65 73 20 74  edure executes t
2e80: 68 65 20 53 51 4c 2e 20 20 54 68 65 6e 20 69 74  he SQL.  Then it
2e90: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
2ea0: 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 0a 23 20  f the OP_Sort.# 
2eb0: 6f 70 63 6f 64 65 20 77 61 73 20 65 78 65 63 75  opcode was execu
2ec0: 74 65 64 2e 20 20 49 66 20 61 6e 20 4f 50 5f 53  ted.  If an OP_S
2ed0: 6f 72 74 20 64 69 64 20 6f 63 63 75 72 2c 20 74  ort did occur, t
2ee0: 68 65 6e 20 22 73 6f 72 74 22 20 69 73 20 61 70  hen "sort" is ap
2ef0: 70 65 6e 64 65 64 0a 23 20 74 6f 20 74 68 65 20  pended.# to the 
2f00: 72 65 73 75 6c 74 2e 20 20 49 66 20 6e 6f 20 4f  result.  If no O
2f10: 50 5f 53 6f 72 74 20 68 61 70 70 65 6e 65 64 2c  P_Sort happened,
2f20: 20 74 68 65 6e 20 22 6e 6f 73 6f 72 74 22 20 69   then "nosort" i
2f30: 73 20 61 70 70 65 6e 64 65 64 2e 0a 23 0a 23 20  s appended..#.# 
2f40: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
2f50: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
2f60: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 73 6f 72  to make sure sor
2f70: 74 69 6e 67 20 69 73 20 6f 72 20 69 73 20 6e 6f  ting is or is no
2f80: 74 0a 23 20 6f 63 63 75 72 72 69 6e 67 20 61 73  t.# occurring as
2f90: 20 65 78 70 65 63 74 65 64 2e 0a 23 0a 70 72 6f   expected..#.pro
2fa0: 63 20 63 6b 73 6f 72 74 20 7b 73 71 6c 7d 20 7b  c cksort {sql} {
2fb0: 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f  .  set ::sqlite_
2fc0: 73 6f 72 74 5f 63 6f 75 6e 74 20 30 0a 20 20 73  sort_count 0.  s
2fd0: 65 74 20 64 61 74 61 20 5b 65 78 65 63 73 71 6c  et data [execsql
2fe0: 20 24 73 71 6c 5d 0a 20 20 69 66 20 7b 24 3a 3a   $sql].  if {$::
2ff0: 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e  sqlite_sort_coun
3000: 74 7d 20 7b 73 65 74 20 78 20 73 6f 72 74 7d 20  t} {set x sort} 
3010: 7b 73 65 74 20 78 20 6e 6f 73 6f 72 74 7d 0a 20  {set x nosort}. 
3020: 20 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24 78   lappend data $x
3030: 0a 20 20 72 65 74 75 72 6e 20 24 64 61 74 61 0a  .  return $data.
3040: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }..do_test vtab1
3050: 2d 34 2e 31 20 7b 0a 20 20 73 65 74 20 65 63 68  -4.1 {.  set ech
3060: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63 6b  o_module "".  ck
3070: 73 6f 72 74 20 7b 0a 20 20 20 20 53 45 4c 45 43  sort {.    SELEC
3080: 54 20 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  T b FROM t1 ORDE
3090: 52 20 42 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b 32  R BY b;.  }.} {2
30a0: 20 35 20 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65   5 nosort}.do_te
30b0: 73 74 20 76 74 61 62 31 2d 34 2e 32 20 7b 0a 20  st vtab1-4.2 {. 
30c0: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
30d0: 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e  .} [list xBestIn
30e0: 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  dex {SELECT rowi
30f0: 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c  d, * FROM 'treal
3100: 27 20 4f 52 44 45 52 20 42 59 20 62 20 41 53 43  ' ORDER BY b ASC
3110: 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c  } \.        xFil
3120: 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72  ter    {SELECT r
3130: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72  owid, * FROM 'tr
3140: 65 61 6c 27 20 4f 52 44 45 52 20 42 59 20 62 20  eal' ORDER BY b 
3150: 41 53 43 7d 20 5d 0a 64 6f 5f 74 65 73 74 20 76  ASC} ].do_test v
3160: 74 61 62 31 2d 34 2e 33 20 7b 0a 20 20 73 65 74  tab1-4.3 {.  set
3170: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a   echo_module "".
3180: 20 20 63 6b 73 6f 72 74 20 7b 0a 20 20 20 20 53    cksort {.    S
3190: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20  ELECT b FROM t1 
31a0: 4f 52 44 45 52 20 42 59 20 62 20 44 45 53 43 3b  ORDER BY b DESC;
31b0: 0a 20 20 7d 0a 7d 20 7b 35 20 32 20 6e 6f 73 6f  .  }.} {5 2 noso
31c0: 72 74 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  rt}.do_test vtab
31d0: 31 2d 34 2e 34 20 7b 0a 20 20 73 65 74 20 65 63  1-4.4 {.  set ec
31e0: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
31f0: 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45  t xBestIndex {SE
3200: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
3210: 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52 44 45 52  OM 'treal' ORDER
3220: 20 42 59 20 62 20 44 45 53 43 7d 20 5c 0a 20 20   BY b DESC} \.  
3230: 20 20 20 20 20 20 78 46 69 6c 74 65 72 20 20 20        xFilter   
3240: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
3250: 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f  * FROM 'treal' O
3260: 52 44 45 52 20 42 59 20 62 20 44 45 53 43 7d 20  RDER BY b DESC} 
3270: 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ].do_test vtab1-
3280: 34 2e 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f  4.3 {.  set echo
3290: 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63 6b 73  _module "".  cks
32a0: 6f 72 74 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  ort {.    SELECT
32b0: 20 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   b FROM t1 ORDER
32c0: 20 42 59 20 62 7c 7c 27 27 3b 0a 20 20 7d 0a 7d   BY b||'';.  }.}
32d0: 20 7b 32 20 35 20 73 6f 72 74 7d 0a 64 6f 5f 74   {2 5 sort}.do_t
32e0: 65 73 74 20 76 74 61 62 31 2d 34 2e 34 20 7b 0a  est vtab1-4.4 {.
32f0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
3300: 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49  e.} [list xBestI
3310: 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77  ndex {SELECT row
3320: 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61  id, * FROM 'trea
3330: 6c 27 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46  l'} \.        xF
3340: 69 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54  ilter    {SELECT
3350: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
3360: 74 72 65 61 6c 27 7d 20 5d 0a 0a 65 78 65 63 73  treal'} ]..execs
3370: 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  ql {.  DROP TABL
3380: 45 20 74 31 3b 0a 20 20 44 52 4f 50 20 54 41 42  E t1;.  DROP TAB
3390: 4c 45 20 74 72 65 61 6c 3b 0a 7d 0a 0a 23 2d 2d  LE treal;.}..#--
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65  ----.# Test case
33f0: 73 20 76 74 61 62 31 2d 35 20 74 65 73 74 20 53  s vtab1-5 test S
3400: 45 4c 45 43 54 20 71 75 65 72 69 65 73 20 74 68  ELECT queries th
3410: 61 74 20 69 6e 63 6c 75 64 65 20 6a 6f 69 6e 73  at include joins
3420: 20 6f 6e 20 76 69 72 74 75 61 6c 20 0a 23 20 74   on virtual .# t
3430: 61 62 6c 65 73 2e 0a 0a 70 72 6f 63 20 66 69 6c  ables...proc fil
3440: 74 65 72 20 7b 6c 6f 67 7d 20 7b 0a 20 20 73 65  ter {log} {.  se
3450: 74 20 6f 75 74 20 5b 6c 69 73 74 5d 0a 20 20 66  t out [list].  f
3460: 6f 72 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24  or {set ii 0} {$
3470: 69 69 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 6c  ii < [llength $l
3480: 6f 67 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b  og]} {incr ii} {
3490: 0a 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78  .    if {[lindex
34a0: 20 24 6c 6f 67 20 24 69 69 5d 20 65 71 20 22 78   $log $ii] eq "x
34b0: 46 69 6c 74 65 72 22 7d 20 7b 0a 20 20 20 20 20  Filter"} {.     
34c0: 20 6c 61 70 70 65 6e 64 20 6f 75 74 20 78 46 69   lappend out xFi
34d0: 6c 74 65 72 0a 20 20 20 20 20 20 6c 61 70 70 65  lter.      lappe
34e0: 6e 64 20 6f 75 74 20 5b 6c 69 6e 64 65 78 20 24  nd out [lindex $
34f0: 6c 6f 67 20 5b 65 78 70 72 20 24 69 69 2b 31 5d  log [expr $ii+1]
3500: 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ].    }.  }.  re
3510: 74 75 72 6e 20 24 6f 75 74 0a 7d 0a 0a 64 6f 5f  turn $out.}..do_
3520: 74 65 73 74 20 76 74 61 62 31 2d 35 2d 31 20 7b  test vtab1-5-1 {
3530: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
3540: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3550: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  1(a, b, c);.    
3560: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
3570: 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 49 4e  d, e, f);.    IN
3580: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3590: 55 45 53 28 31 2c 20 27 72 65 64 27 2c 20 27 67  UES(1, 'red', 'g
35a0: 72 65 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45  reen');.    INSE
35b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
35c0: 53 28 32 2c 20 27 62 6c 75 65 27 2c 20 27 62 6c  S(2, 'blue', 'bl
35d0: 61 63 6b 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ack');.    INSER
35e0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
35f0: 28 31 2c 20 27 73 70 61 64 65 73 27 2c 20 27 63  (1, 'spades', 'c
3600: 6c 75 62 73 27 29 3b 0a 20 20 20 20 49 4e 53 45  lubs');.    INSE
3610: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
3620: 53 28 32 2c 20 27 68 65 61 72 74 73 27 2c 20 27  S(2, 'hearts', '
3630: 64 69 61 6d 6f 6e 64 73 27 29 3b 0a 20 20 20 20  diamonds');.    
3640: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
3650: 41 42 4c 45 20 65 74 31 20 55 53 49 4e 47 20 65  ABLE et1 USING e
3660: 63 68 6f 28 74 31 29 3b 0a 20 20 20 20 43 52 45  cho(t1);.    CRE
3670: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
3680: 45 20 65 74 32 20 55 53 49 4e 47 20 65 63 68 6f  E et2 USING echo
3690: 28 74 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  (t2);.  }.} {}..
36a0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d  do_test vtab1-5-
36b0: 32 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  2 {.  set echo_m
36c0: 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73  odule "".  execs
36d0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
36e0: 2a 20 46 52 4f 4d 20 65 74 31 2c 20 65 74 32 3b  * FROM et1, et2;
36f0: 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20  .  }.} [list \. 
3700: 20 31 20 72 65 64 20 67 72 65 65 6e 20 31 20 73   1 red green 1 s
3710: 70 61 64 65 73 20 63 6c 75 62 73 20 20 20 20 20  pades clubs     
3720: 5c 0a 20 20 31 20 72 65 64 20 67 72 65 65 6e 20  \.  1 red green 
3730: 32 20 68 65 61 72 74 73 20 64 69 61 6d 6f 6e 64  2 hearts diamond
3740: 73 20 20 5c 0a 20 20 32 20 62 6c 75 65 20 62 6c  s  \.  2 blue bl
3750: 61 63 6b 20 31 20 73 70 61 64 65 73 20 63 6c 75  ack 1 spades clu
3760: 62 73 20 20 20 20 5c 0a 20 20 32 20 62 6c 75 65  bs    \.  2 blue
3770: 20 62 6c 61 63 6b 20 32 20 68 65 61 72 74 73 20   black 2 hearts 
3780: 64 69 61 6d 6f 6e 64 73 20 5c 0a 5d 0a 64 6f 5f  diamonds \.].do_
3790: 74 65 73 74 20 76 74 61 62 31 2d 35 2d 33 20 7b  test vtab1-5-3 {
37a0: 0a 20 20 66 69 6c 74 65 72 20 24 65 63 68 6f 5f  .  filter $echo_
37b0: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c  module.} [list \
37c0: 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45  .  xFilter {SELE
37d0: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
37e0: 20 27 74 31 27 7d 20 5c 0a 20 20 78 46 69 6c 74   't1'} \.  xFilt
37f0: 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  er {SELECT rowid
3800: 2c 20 2a 20 46 52 4f 4d 20 27 74 32 27 7d 20 5c  , * FROM 't2'} \
3810: 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45  .  xFilter {SELE
3820: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
3830: 20 27 74 32 27 7d 20 5c 0a 5d 0a 64 6f 5f 74 65   't2'} \.].do_te
3840: 73 74 20 76 74 61 62 31 2d 35 2d 34 20 7b 0a 20  st vtab1-5-4 {. 
3850: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
3860: 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   "".  execsql {.
3870: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3880: 4d 20 65 74 31 2c 20 65 74 32 20 57 48 45 52 45  M et1, et2 WHERE
3890: 20 65 74 32 2e 64 20 3d 20 32 3b 0a 20 20 7d 0a   et2.d = 2;.  }.
38a0: 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 31 20 72 65  } [list \.  1 re
38b0: 64 20 67 72 65 65 6e 20 32 20 68 65 61 72 74 73  d green 2 hearts
38c0: 20 64 69 61 6d 6f 6e 64 73 20 20 5c 0a 20 20 32   diamonds  \.  2
38d0: 20 62 6c 75 65 20 62 6c 61 63 6b 20 32 20 68 65   blue black 2 he
38e0: 61 72 74 73 20 64 69 61 6d 6f 6e 64 73 20 5c 0a  arts diamonds \.
38f0: 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ].do_test vtab1-
3900: 35 2d 35 20 7b 0a 20 20 66 69 6c 74 65 72 20 24  5-5 {.  filter $
3910: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c  echo_module.} [l
3920: 69 73 74 20 5c 0a 20 20 78 46 69 6c 74 65 72 20  ist \.  xFilter 
3930: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
3940: 20 46 52 4f 4d 20 27 74 31 27 7d 20 5c 0a 20 20   FROM 't1'} \.  
3950: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20  xFilter {SELECT 
3960: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74  rowid, * FROM 't
3970: 32 27 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20  2'} \.  xFilter 
3980: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
3990: 20 46 52 4f 4d 20 27 74 32 27 7d 20 5c 0a 5d 0a   FROM 't2'} \.].
39a0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d  do_test vtab1-5-
39b0: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
39c0: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
39d0: 20 69 31 20 4f 4e 20 74 32 28 64 29 3b 0a 20 20   i1 ON t2(d);.  
39e0: 7d 0a 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  }..  db close.  
39f0: 73 71 6c 69 74 65 34 20 64 62 20 74 65 73 74 2e  sqlite4 db test.
3a00: 64 62 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63  db.  register_ec
3a10: 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74  ho_module [sqlit
3a20: 65 34 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e4_connection_po
3a30: 69 6e 74 65 72 20 64 62 5d 0a 0a 20 20 73 65 74  inter db]..  set
3a40: 20 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22   ::echo_module "
3a50: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
3a60: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3a70: 65 74 31 2c 20 65 74 32 20 57 48 45 52 45 20 65  et1, et2 WHERE e
3a80: 74 32 2e 64 20 3d 20 32 3b 0a 20 20 7d 0a 7d 20  t2.d = 2;.  }.} 
3a90: 5b 6c 69 73 74 20 5c 0a 20 20 31 20 72 65 64 20  [list \.  1 red 
3aa0: 67 72 65 65 6e 20 32 20 68 65 61 72 74 73 20 64  green 2 hearts d
3ab0: 69 61 6d 6f 6e 64 73 20 20 5c 0a 20 20 32 20 62  iamonds  \.  2 b
3ac0: 6c 75 65 20 62 6c 61 63 6b 20 32 20 68 65 61 72  lue black 2 hear
3ad0: 74 73 20 64 69 61 6d 6f 6e 64 73 20 5c 0a 5d 0a  ts diamonds \.].
3ae0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d  do_test vtab1-5-
3af0: 37 20 7b 0a 20 20 66 69 6c 74 65 72 20 24 3a 3a  7 {.  filter $::
3b00: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c  echo_module.} [l
3b10: 69 73 74 20 5c 0a 20 20 78 46 69 6c 74 65 72 20  ist \.  xFilter 
3b20: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
3b30: 20 46 52 4f 4d 20 27 74 32 27 20 57 48 45 52 45   FROM 't2' WHERE
3b40: 20 64 20 3d 20 3f 7d 20 5c 0a 20 20 78 46 69 6c   d = ?} \.  xFil
3b50: 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  ter {SELECT rowi
3b60: 64 2c 20 2a 20 46 52 4f 4d 20 27 74 31 27 7d 20  d, * FROM 't1'} 
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d 0a              \.].
3b80: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f  .execsql {.  DRO
3b90: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 44 52  P TABLE t1;.  DR
3ba0: 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20 44  OP TABLE t2;.  D
3bb0: 52 4f 50 20 54 41 42 4c 45 20 65 74 31 3b 0a 20  ROP TABLE et1;. 
3bc0: 20 44 52 4f 50 20 54 41 42 4c 45 20 65 74 32 3b   DROP TABLE et2;
3bd0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
3c20: 73 74 20 63 61 73 65 73 20 76 74 61 62 31 2d 36  st cases vtab1-6
3c30: 20 74 65 73 74 20 49 4e 53 45 52 54 2c 20 55 50   test INSERT, UP
3c40: 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20  DATE and DELETE 
3c50: 6f 70 65 72 61 74 69 6f 6e 73 20 0a 23 20 6f 6e  operations .# on
3c60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
3c70: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36  .do_test vtab1-6
3c80: 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  -1 {.  execsql {
3c90: 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d   SELECT sql FROM
3ca0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d   sqlite_master }
3cb0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74  .} {}.do_test vt
3cc0: 61 62 31 2d 36 2d 32 20 7b 0a 20 20 65 78 65 63  ab1-6-2 {.  exec
3cd0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
3ce0: 20 54 41 42 4c 45 20 74 72 65 61 6c 28 61 20 50   TABLE treal(a P
3cf0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
3d00: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  );.    CREATE VI
3d10: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 63 68  RTUAL TABLE tech
3d20: 6f 20 55 53 49 4e 47 20 65 63 68 6f 28 74 72 65  o USING echo(tre
3d30: 61 6c 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  al);.    SELECT 
3d40: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
3d50: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79  _master WHERE ty
3d60: 70 65 20 3d 20 27 74 61 62 6c 65 27 3b 0a 20 20  pe = 'table';.  
3d70: 7d 0a 7d 20 7b 74 72 65 61 6c 20 74 65 63 68 6f  }.} {treal techo
3d80: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
3d90: 36 2d 33 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  6-3.1.1 {.  exec
3da0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
3db0: 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 3d 4f   count_changes=O
3dc0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
3dd0: 54 4f 20 74 65 63 68 6f 20 56 41 4c 55 45 53 28  TO techo VALUES(
3de0: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20  1, 2, 3);.  }.} 
3df0: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  {1}.do_test vtab
3e00: 31 2d 36 2d 33 2e 31 2e 32 20 7b 0a 20 20 64 62  1-6-3.1.2 {.  db
3e10: 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 64   changes.} {1}.d
3e20: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 33  o_test vtab1-6-3
3e30: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
3e40: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
3e50: 4f 4d 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20  OM techo;.  }.} 
3e60: 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20  {1 2 3}.do_test 
3e70: 76 74 61 62 31 2d 36 2d 34 2e 31 20 7b 0a 20 20  vtab1-6-4.1 {.  
3e80: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
3e90: 44 41 54 45 20 74 65 63 68 6f 20 53 45 54 20 61  DATE techo SET a
3ea0: 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 64 62 20 63   = 5;.  }.  db c
3eb0: 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 64 6f 5f  hanges.} {1}.do_
3ec0: 74 65 73 74 20 76 74 61 62 31 2d 36 2d 34 2e 32  test vtab1-6-4.2
3ed0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3ee0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
3ef0: 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 35   techo;.  }.} {5
3f00: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 76 74   2 3}.do_test vt
3f10: 61 62 31 2d 36 2d 34 2e 33 20 7b 0a 20 20 65 78  ab1-6-4.3 {.  ex
3f20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
3f30: 54 45 20 74 65 63 68 6f 20 53 45 54 20 61 3d 36  TE techo SET a=6
3f40: 20 57 48 45 52 45 20 61 3c 30 3b 0a 20 20 7d 0a   WHERE a<0;.  }.
3f50: 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b    db changes.} {
3f60: 30 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  0}.do_test vtab1
3f70: 2d 36 2d 34 2e 34 20 7b 0a 20 20 65 78 65 63 73  -6-4.4 {.  execs
3f80: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3f90: 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 20  * FROM techo;.  
3fa0: 7d 0a 7d 20 7b 35 20 32 20 33 7d 0a 0a 64 6f 5f  }.} {5 2 3}..do_
3fb0: 74 65 73 74 20 76 74 61 62 31 2d 36 2d 35 2e 31  test vtab1-6-5.1
3fc0: 20 7b 0a 20 65 78 65 63 73 71 6c 20 7b 0a 20 20   {. execsql {.  
3fd0: 20 55 50 44 41 54 45 20 74 65 63 68 6f 20 73 65   UPDATE techo se
3fe0: 74 20 61 20 3d 20 61 7c 7c 62 7c 7c 63 3b 0a 20  t a = a||b||c;. 
3ff0: 7d 0a 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20  }. db changes.} 
4000: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  {1}.do_test vtab
4010: 31 2d 36 2d 35 2e 32 20 7b 0a 20 65 78 65 63 73  1-6-5.2 {. execs
4020: 71 6c 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 2a  ql {.   SELECT *
4030: 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 7d 0a   FROM techo;. }.
4040: 7d 20 7b 35 32 33 20 32 20 33 7d 0a 0a 64 6f 5f  } {523 2 3}..do_
4050: 74 65 73 74 20 76 74 61 62 31 2d 36 2d 36 2e 31  test vtab1-6-6.1
4060: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4070: 20 20 20 55 50 44 41 54 45 20 74 65 63 68 6f 20     UPDATE techo 
4080: 73 65 74 20 72 6f 77 69 64 20 3d 20 31 30 3b 0a  set rowid = 10;.
4090: 20 20 7d 0a 20 20 64 62 20 63 68 61 6e 67 65 73    }.  db changes
40a0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76  .} {1}.do_test v
40b0: 74 61 62 31 2d 36 2d 36 2e 32 20 7b 0a 20 20 65  tab1-6-6.2 {.  e
40c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
40d0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
40e0: 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d  echo;.  }.} {10}
40f0: 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ..do_test vtab1-
4100: 36 2d 37 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63  6-7.1.1 {.  exec
4110: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
4120: 20 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c 55   INTO techo VALU
4130: 45 53 28 31 31 2c 31 32 2c 31 33 29 3b 0a 20 20  ES(11,12,13);.  
4140: 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  }.} {1}.do_test 
4150: 76 74 61 62 31 2d 36 2d 37 2e 31 2e 32 20 7b 0a  vtab1-6-7.1.2 {.
4160: 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b    db changes.} {
4170: 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  1}.do_test vtab1
4180: 2d 36 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63 73  -6-7.2 {.  execs
4190: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
41a0: 2a 20 46 52 4f 4d 20 74 65 63 68 6f 20 4f 52 44  * FROM techo ORD
41b0: 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b  ER BY a;.  }.} {
41c0: 31 31 20 31 32 20 31 33 20 35 32 33 20 32 20 33  11 12 13 523 2 3
41d0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
41e0: 36 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  6-7.3 {.  execsq
41f0: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74  l {.    UPDATE t
4200: 65 63 68 6f 20 53 45 54 20 62 3d 62 2b 31 30 30  echo SET b=b+100
4210: 30 0a 20 20 7d 0a 20 20 64 62 20 63 68 61 6e 67  0.  }.  db chang
4220: 65 73 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74  es.} {2}.do_test
4230: 20 76 74 61 62 31 2d 36 2d 37 2e 34 20 7b 0a 20   vtab1-6-7.4 {. 
4240: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
4250: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 63  ELECT * FROM tec
4260: 68 6f 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20  ho ORDER BY a;. 
4270: 20 7d 0a 7d 20 7b 31 31 20 31 30 31 32 20 31 33   }.} {11 1012 13
4280: 20 35 32 33 20 31 30 30 32 20 33 7d 0a 0a 0a 64   523 1002 3}...d
4290: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 38  o_test vtab1-6-8
42a0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
42b0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
42c0: 20 74 65 63 68 6f 20 57 48 45 52 45 20 61 3d 35   techo WHERE a=5
42d0: 3b 0a 20 20 7d 0a 20 20 64 62 20 63 68 61 6e 67  ;.  }.  db chang
42e0: 65 73 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  es.} {0}.do_test
42f0: 20 76 74 61 62 31 2d 36 2d 38 2e 32 20 7b 0a 20   vtab1-6-8.2 {. 
4300: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
4310: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 63  ELECT * FROM tec
4320: 68 6f 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20  ho ORDER BY a;. 
4330: 20 7d 0a 7d 20 7b 31 31 20 31 30 31 32 20 31 33   }.} {11 1012 13
4340: 20 35 32 33 20 31 30 30 32 20 33 7d 0a 64 6f 5f   523 1002 3}.do_
4350: 74 65 73 74 20 76 74 61 62 31 2d 36 2d 38 2e 33  test vtab1-6-8.3
4360: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4370: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
4380: 65 63 68 6f 3b 0a 20 20 7d 0a 20 20 64 62 20 63  echo;.  }.  db c
4390: 68 61 6e 67 65 73 0a 7d 20 7b 32 7d 0a 64 6f 5f  hanges.} {2}.do_
43a0: 74 65 73 74 20 76 74 61 62 31 2d 36 2d 38 2e 34  test vtab1-6-8.4
43b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
43c0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
43d0: 20 74 65 63 68 6f 20 4f 52 44 45 52 20 42 59 20   techo ORDER BY 
43e0: 61 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 65 78 65 63  a;.  }.} {}.exec
43f0: 73 71 6c 20 7b 50 52 41 47 4d 41 20 63 6f 75 6e  sql {PRAGMA coun
4400: 74 5f 63 68 61 6e 67 65 73 3d 4f 46 46 7d 0a 0a  t_changes=OFF}..
4410: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
4420: 32 2e 64 62 0a 66 6f 72 63 65 64 65 6c 65 74 65  2.db.forcedelete
4430: 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61   test2.db-journa
4440: 6c 0a 73 71 6c 69 74 65 34 20 64 62 32 20 74 65  l.sqlite4 db2 te
4450: 73 74 32 2e 64 62 0a 65 78 65 63 73 71 6c 20 7b  st2.db.execsql {
4460: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
4470: 74 65 63 68 6f 28 61 20 50 52 49 4d 41 52 59 20  techo(a PRIMARY 
4480: 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 7d 20 64 62  KEY, b, c);.} db
4490: 32 0a 70 72 6f 63 20 63 68 65 63 6b 5f 65 63 68  2.proc check_ech
44a0: 6f 5f 74 61 62 6c 65 20 7b 74 6e 7d 20 7b 0a 20  o_table {tn} {. 
44b0: 20 73 65 74 20 3a 3a 64 61 74 61 31 20 5b 65 78   set ::data1 [ex
44c0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  ecsql {SELECT ro
44d0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 65 63 68  wid, * FROM tech
44e0: 6f 7d 5d 0a 20 20 73 65 74 20 3a 3a 64 61 74 61  o}].  set ::data
44f0: 32 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  2 [execsql {SELE
4500: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
4510: 20 74 65 63 68 6f 7d 20 64 62 32 5d 0a 20 20 64   techo} db2].  d
4520: 6f 5f 74 65 73 74 20 24 74 6e 20 7b 0a 20 20 20  o_test $tn {.   
4530: 20 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 3a   string equal $:
4540: 3a 64 61 74 61 31 20 24 3a 3a 64 61 74 61 32 0a  :data1 $::data2.
4550: 20 20 7d 20 31 0a 7d 0a 73 65 74 20 74 6e 20 30    } 1.}.set tn 0
4560: 0a 66 6f 72 65 61 63 68 20 73 74 6d 74 20 5b 6c  .foreach stmt [l
4570: 69 73 74 20 5c 0a 20 20 7b 49 4e 53 45 52 54 20  ist \.  {INSERT 
4580: 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c 55 45  INTO techo VALUE
4590: 53 28 27 61 62 63 27 2c 20 27 64 65 66 27 2c 20  S('abc', 'def', 
45a0: 27 67 68 69 27 29 7d 20 20 20 20 20 20 20 20 20  'ghi')}         
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
45c0: 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  .  {INSERT INTO 
45d0: 74 65 63 68 6f 20 53 45 4c 45 43 54 20 61 7c 7c  techo SELECT a||
45e0: 27 2e 27 7c 7c 72 6f 77 69 64 2c 20 62 2c 20 63  '.'||rowid, b, c
45f0: 20 46 52 4f 4d 20 74 65 63 68 6f 7d 20 20 20 20   FROM techo}    
4600: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 49            \.  {I
4610: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 63 68 6f  NSERT INTO techo
4620: 20 53 45 4c 45 43 54 20 61 7c 7c 27 78 27 7c 7c   SELECT a||'x'||
4630: 72 6f 77 69 64 2c 20 62 2c 20 63 20 46 52 4f 4d  rowid, b, c FROM
4640: 20 74 65 63 68 6f 7d 20 20 20 20 20 20 20 20 20   techo}         
4650: 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53 45 52 54       \.  {INSERT
4660: 20 49 4e 54 4f 20 74 65 63 68 6f 20 53 45 4c 45   INTO techo SELE
4670: 43 54 20 61 7c 7c 27 79 27 7c 7c 72 6f 77 69 64  CT a||'y'||rowid
4680: 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 65 63 68  , b, c FROM tech
4690: 6f 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o}              
46a0: 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  \.  {DELETE FROM
46b0: 20 74 65 63 68 6f 20 57 48 45 52 45 20 28 6f 69   techo WHERE (oi
46c0: 64 20 25 20 33 29 20 3d 20 30 7d 20 20 20 20 20  d % 3) = 0}     
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b             \.  {
46f0: 55 50 44 41 54 45 20 74 65 63 68 6f 20 73 65 74  UPDATE techo set
4700: 20 72 6f 77 69 64 20 3d 20 31 30 30 20 57 48 45   rowid = 100 WHE
4710: 52 45 20 72 6f 77 69 64 20 3d 20 31 7d 20 20 20  RE rowid = 1}   
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53 45 52        \.  {INSER
4740: 54 20 49 4e 54 4f 20 74 65 63 68 6f 28 61 2c 20  T INTO techo(a, 
4750: 62 29 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f  b) VALUES('hello
4760: 27 2c 20 27 77 6f 72 6c 64 27 29 7d 20 20 20 20  ', 'world')}    
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46 52 4f   \.  {DELETE FRO
4790: 4d 20 74 65 63 68 6f 7d 20 20 20 20 20 20 20 20  M techo}        
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d 20              \.] 
47d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 24 73 74 6d  {.  execsql $stm
47e0: 74 0a 20 20 65 78 65 63 73 71 6c 20 24 73 74 6d  t.  execsql $stm
47f0: 74 20 64 62 32 0a 20 20 63 68 65 63 6b 5f 65 63  t db2.  check_ec
4800: 68 6f 5f 74 61 62 6c 65 20 76 74 61 62 31 2d 36  ho_table vtab1-6
4810: 2e 38 2e 5b 69 6e 63 72 20 74 6e 5d 0a 7d 0a 0a  .8.[incr tn].}..
4820: 64 62 32 20 63 6c 6f 73 65 0a 0a 0a 0a 23 2d 2d  db2 close....#--
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4870: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65  ----.# Test case
4880: 73 20 76 74 61 62 31 2d 37 20 74 65 73 74 73 20  s vtab1-7 tests 
4890: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 72  that the value r
48a0: 65 74 75 72 6e 65 64 20 62 79 20 0a 23 20 73 71  eturned by .# sq
48b0: 6c 69 74 65 34 5f 6c 61 73 74 5f 69 6e 73 65 72  lite4_last_inser
48c0: 74 5f 72 6f 77 69 64 28 29 20 69 73 20 73 65 74  t_rowid() is set
48d0: 20 63 6f 72 72 65 63 74 6c 79 20 77 68 65 6e 20   correctly when 
48e0: 72 6f 77 73 20 61 72 65 20 69 6e 73 65 72 74 65  rows are inserte
48f0: 64 0a 23 20 69 6e 74 6f 20 76 69 72 74 75 61 6c  d.# into virtual
4900: 20 74 61 62 6c 65 73 2e 0a 64 6f 5f 74 65 73 74   tables..do_test
4910: 20 76 74 61 62 31 2e 37 2d 31 20 7b 0a 20 20 65   vtab1.7-1 {.  e
4920: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
4930: 41 54 45 20 54 41 42 4c 45 20 72 65 61 6c 5f 61  ATE TABLE real_a
4940: 62 63 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  bc(a PRIMARY KEY
4950: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
4960: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
4970: 45 20 65 63 68 6f 5f 61 62 63 20 55 53 49 4e 47  E echo_abc USING
4980: 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63 29 3b   echo(real_abc);
4990: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
49a0: 74 20 76 74 61 62 31 2e 37 2d 32 20 7b 0a 20 20  t vtab1.7-2 {.  
49b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
49c0: 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 61  SERT INTO echo_a
49d0: 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  bc VALUES(1, 2, 
49e0: 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c  3);.    SELECT l
49f0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
4a00: 28 29 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  ();.  }.} {1}.do
4a10: 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d 33 20  _test vtab1.7-3 
4a20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4a30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63    INSERT INTO ec
4a40: 68 6f 5f 61 62 63 28 72 6f 77 69 64 29 20 56 41  ho_abc(rowid) VA
4a50: 4c 55 45 53 28 33 31 34 32 37 29 3b 0a 20 20 20  LUES(31427);.   
4a60: 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73   SELECT last_ins
4a70: 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d  ert_rowid();.  }
4a80: 0a 7d 20 7b 33 31 34 32 37 7d 0a 64 6f 5f 74 65  .} {31427}.do_te
4a90: 73 74 20 76 74 61 62 31 2e 37 2d 34 20 7b 0a 20  st vtab1.7-4 {. 
4aa0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
4ab0: 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f  NSERT INTO echo_
4ac0: 61 62 63 20 53 45 4c 45 43 54 20 61 7c 7c 27 2e  abc SELECT a||'.
4ad0: 76 32 27 2c 20 62 2c 20 63 20 46 52 4f 4d 20 65  v2', b, c FROM e
4ae0: 63 68 6f 5f 61 62 63 3b 0a 20 20 20 20 53 45 4c  cho_abc;.    SEL
4af0: 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  ECT last_insert_
4b00: 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b  rowid();.  }.} {
4b10: 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76  31429}.do_test v
4b20: 74 61 62 31 2e 37 2d 35 20 7b 0a 20 20 65 78 65  tab1.7-5 {.  exe
4b30: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
4b40: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
4b50: 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63 0a 20   FROM echo_abc. 
4b60: 20 7d 0a 7d 20 5b 6c 69 73 74 20 31 20 20 20 20   }.} [list 1    
4b70: 20 31 20 20 20 20 32 20 20 33 20 20 5c 0a 20 20   1    2  3  \.  
4b80: 20 20 20 20 20 20 33 31 34 32 37 20 7b 7d 20 20        31427 {}  
4b90: 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20 20 20 20 20   {} {} \.       
4ba0: 20 33 31 34 32 38 20 31 2e 76 32 20 32 20 20 33   31428 1.v2 2  3
4bb0: 20 20 5c 0a 20 20 20 20 20 20 20 20 33 31 34 32    \.        3142
4bc0: 39 20 7b 7d 20 20 7b 7d 20 7b 7d 20 20 5c 0a 5d  9 {}  {} {}  \.]
4bd0: 0a 0a 23 20 4e 6f 77 20 74 65 73 74 20 74 68 61  ..# Now test tha
4be0: 74 20 44 45 4c 45 54 45 20 61 6e 64 20 55 50 44  t DELETE and UPD
4bf0: 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 64  ATE operations d
4c00: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74 68 65  o not modify the
4c10: 20 76 61 6c 75 65 2e 0a 64 6f 5f 74 65 73 74 20   value..do_test 
4c20: 76 74 61 62 31 2e 37 2d 36 20 7b 0a 20 20 65 78  vtab1.7-6 {.  ex
4c30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
4c40: 54 45 20 65 63 68 6f 5f 61 62 63 20 53 45 54 20  TE echo_abc SET 
4c50: 63 20 3d 20 35 20 57 48 45 52 45 20 62 20 3d 20  c = 5 WHERE b = 
4c60: 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 61  2;.    SELECT la
4c70: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
4c80: 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39 7d  );.  }.} {31429}
4c90: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37  .do_test vtab1.7
4ca0: 2d 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  -7 {.  execsql {
4cb0: 0a 20 20 20 20 55 50 44 41 54 45 20 65 63 68 6f  .    UPDATE echo
4cc0: 5f 61 62 63 20 53 45 54 20 72 6f 77 69 64 20 3d  _abc SET rowid =
4cd0: 20 35 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d   5 WHERE rowid =
4ce0: 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c   1;.    SELECT l
4cf0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
4d00: 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39  ();.  }.} {31429
4d10: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e  }.do_test vtab1.
4d20: 37 2d 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7-8 {.  execsql 
4d30: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
4d40: 4d 20 65 63 68 6f 5f 61 62 63 20 57 48 45 52 45  M echo_abc WHERE
4d50: 20 62 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45   b = 2;.    SELE
4d60: 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  CT last_insert_r
4d70: 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33  owid();.  }.} {3
4d80: 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74  1429}.do_test vt
4d90: 61 62 31 2e 37 2d 39 20 7b 0a 20 20 65 78 65 63  ab1.7-9 {.  exec
4da0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
4db0: 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20   rowid, a, b, c 
4dc0: 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63 0a 20 20  FROM echo_abc.  
4dd0: 7d 0a 7d 20 5b 6c 69 73 74 20 33 31 34 32 37 20  }.} [list 31427 
4de0: 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20 20 20  {} {} {} \.     
4df0: 20 20 20 33 31 34 32 39 20 7b 7d 20 7b 7d 20 7b     31429 {} {} {
4e00: 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74  } \.].do_test vt
4e10: 61 62 31 2e 37 2d 31 30 20 7b 0a 20 20 65 78 65  ab1.7-10 {.  exe
4e20: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
4e30: 45 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63 20  E FROM echo_abc 
4e40: 57 48 45 52 45 20 62 20 3d 20 32 3b 0a 20 20 20  WHERE b = 2;.   
4e50: 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73   SELECT last_ins
4e60: 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d  ert_rowid();.  }
4e70: 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 6f 5f 74 65  .} {31429}.do_te
4e80: 73 74 20 76 74 61 62 31 2e 37 2d 31 31 20 7b 0a  st vtab1.7-11 {.
4e90: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4ea0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c  SELECT rowid, a,
4eb0: 20 62 2c 20 63 20 46 52 4f 4d 20 72 65 61 6c 5f   b, c FROM real_
4ec0: 61 62 63 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20  abc.  }.} [list 
4ed0: 33 31 34 32 37 20 7b 7d 20 7b 7d 20 7b 7d 20 5c  31427 {} {} {} \
4ee0: 0a 20 20 20 20 20 20 20 20 33 31 34 32 39 20 7b  .        31429 {
4ef0: 7d 20 7b 7d 20 7b 7d 20 5c 0a 5d 0a 64 6f 5f 74  } {} {} \.].do_t
4f00: 65 73 74 20 76 74 61 62 31 2e 37 2d 31 32 20 7b  est vtab1.7-12 {
4f10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4f20: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 65 63 68   DELETE FROM ech
4f30: 6f 5f 61 62 63 3b 0a 20 20 20 20 53 45 4c 45 43  o_abc;.    SELEC
4f40: 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  T last_insert_ro
4f50: 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31  wid();.  }.} {31
4f60: 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  429}.do_test vta
4f70: 62 31 2e 37 2d 31 33 20 7b 0a 20 20 65 78 65 63  b1.7-13 {.  exec
4f80: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
4f90: 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20   rowid, a, b, c 
4fa0: 46 52 4f 4d 20 72 65 61 6c 5f 61 62 63 0a 20 20  FROM real_abc.  
4fb0: 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c  }.} {}..ifcapabl
4fc0: 65 20 61 74 74 61 63 68 20 7b 0a 20 20 64 6f 5f  e attach {.  do_
4fd0: 74 65 73 74 20 76 74 61 62 31 2e 38 2d 31 20 7b  test vtab1.8-1 {
4fe0: 0a 20 20 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f  .    set echo_mo
4ff0: 64 75 6c 65 20 22 22 0a 20 20 20 20 65 78 65 63  dule "".    exec
5000: 73 71 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41  sql {.      ATTA
5010: 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41 53  CH 'test2.db' AS
5020: 20 61 75 78 3b 0a 20 20 20 20 20 20 43 52 45 41   aux;.      CREA
5030: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
5040: 20 61 75 78 2e 65 32 20 55 53 49 4e 47 20 65 63   aux.e2 USING ec
5050: 68 6f 28 72 65 61 6c 5f 61 62 63 29 3b 0a 20 20  ho(real_abc);.  
5060: 20 20 7d 0a 20 20 20 20 73 65 74 20 65 63 68 6f    }.    set echo
5070: 5f 6d 6f 64 75 6c 65 0a 20 20 7d 20 5b 6c 69 73  _module.  } [lis
5080: 74 20 78 43 72 65 61 74 65 20 65 63 68 6f 20 61  t xCreate echo a
5090: 75 78 20 65 32 20 72 65 61 6c 5f 61 62 63 20 20  ux e2 real_abc  
50a0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 78 53 79   \.          xSy
50b0: 6e 63 20 20 20 65 63 68 6f 28 72 65 61 6c 5f 61  nc   echo(real_a
50c0: 62 63 29 20 20 20 20 20 20 20 20 20 5c 0a 20 20  bc)         \.  
50d0: 20 20 20 20 20 20 20 20 78 43 6f 6d 6d 69 74 20          xCommit 
50e0: 65 63 68 6f 28 72 65 61 6c 5f 61 62 63 29 20 20  echo(real_abc)  
50f0: 20 20 20 20 20 20 20 5c 0a 20 20 5d 0a 7d 0a 64         \.  ].}.d
5100: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 38 2d 32  o_test vtab1.8-2
5110: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
5120: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 61      DROP TABLE a
5130: 75 78 2e 65 32 3b 0a 20 20 7d 0a 20 20 65 78 65  ux.e2;.  }.  exe
5140: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
5150: 54 41 42 4c 45 20 74 72 65 61 6c 3b 0a 20 20 20  TABLE treal;.   
5160: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 65 63 68   DROP TABLE tech
5170: 6f 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  o;.    DROP TABL
5180: 45 20 65 63 68 6f 5f 61 62 63 3b 0a 20 20 20 20  E echo_abc;.    
5190: 44 52 4f 50 20 54 41 42 4c 45 20 72 65 61 6c 5f  DROP TABLE real_
51a0: 61 62 63 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  abc;.  }.} {}..d
51b0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 39 2d 31  o_test vtab1.9-1
51c0: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
51d0: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71  dule "".  execsq
51e0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
51f0: 41 42 4c 45 20 72 28 61 2c 20 62 2c 20 63 29 3b  ABLE r(a, b, c);
5200: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
5210: 55 41 4c 20 54 41 42 4c 45 20 65 20 55 53 49 4e  UAL TABLE e USIN
5220: 47 20 65 63 68 6f 28 72 2c 20 65 5f 6c 6f 67 29  G echo(r, e_log)
5230: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d  ;.    SELECT nam
5240: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
5250: 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 72 20 65  ster;.  }.} {r e
5260: 20 65 5f 6c 6f 67 7d 0a 64 6f 5f 74 65 73 74 20   e_log}.do_test 
5270: 76 74 61 62 31 2e 39 2d 32 20 7b 0a 20 20 65 78  vtab1.9-2 {.  ex
5280: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
5290: 20 54 41 42 4c 45 20 65 3b 0a 20 20 20 20 53 45   TABLE e;.    SE
52a0: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
52b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
52c0: 7d 0a 7d 20 7b 72 7d 0a 0a 64 6f 5f 74 65 73 74  }.} {r}..do_test
52d0: 20 76 74 61 62 31 2e 39 2d 33 20 7b 0a 20 20 73   vtab1.9-3 {.  s
52e0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22  et echo_module "
52f0: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
5300: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
5310: 20 54 41 42 4c 45 20 65 20 55 53 49 4e 47 20 65   TABLE e USING e
5320: 63 68 6f 28 72 2c 20 65 5f 6c 6f 67 2c 20 76 69  cho(r, e_log, vi
5330: 72 74 75 61 6c 20 31 20 32 20 33 20 76 61 72 63  rtual 1 2 3 varc
5340: 68 61 72 28 33 32 29 29 3b 0a 20 20 7d 0a 20 20  har(32));.  }.  
5350: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a  set echo_module.
5360: 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20  } [list         
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
53a0: 0a 20 20 78 43 72 65 61 74 65 20 65 63 68 6f 20  .  xCreate echo 
53b0: 6d 61 69 6e 20 65 20 72 20 65 5f 6c 6f 67 20 7b  main e r e_log {
53c0: 76 69 72 74 75 61 6c 20 31 20 32 20 33 20 76 61  virtual 1 2 3 va
53d0: 72 63 68 61 72 28 33 32 29 7d 20 20 20 20 20 20  rchar(32)}      
53e0: 5c 0a 20 20 78 53 79 6e 63 20 65 63 68 6f 28 72  \.  xSync echo(r
53f0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 5c 0a 20 20 78 43 6f 6d 6d 69 74 20 65 63 68   \.  xCommit ech
5430: 6f 28 72 29 20 20 20 20 20 20 20 20 20 20 20 20  o(r)            
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 5c 0a 5d 0a 0a 64 6f 5f 74 65 73 74 20 76    \.]..do_test v
5470: 74 61 62 31 2e 31 30 2d 31 20 7b 0a 20 20 65 78  tab1.10-1 {.  ex
5480: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
5490: 54 45 20 54 41 42 4c 45 20 64 65 6c 28 64 29 3b  TE TABLE del(d);
54a0: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
54b0: 55 41 4c 20 54 41 42 4c 45 20 65 32 20 55 53 49  UAL TABLE e2 USI
54c0: 4e 47 20 65 63 68 6f 28 64 65 6c 29 3b 0a 20 20  NG echo(del);.  
54d0: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  }.  db close.  s
54e0: 71 6c 69 74 65 34 20 64 62 20 74 65 73 74 2e 64  qlite4 db test.d
54f0: 62 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63 68  b.  register_ech
5500: 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65  o_module [sqlite
5510: 34 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69  4_connection_poi
5520: 6e 74 65 72 20 64 62 5d 0a 20 20 65 78 65 63 73  nter db].  execs
5530: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
5540: 42 4c 45 20 64 65 6c 3b 0a 20 20 7d 0a 20 20 63  BLE del;.  }.  c
5550: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45  atchsql {.    SE
5560: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 32 3b 0a  LECT * FROM e2;.
5570: 20 20 7d 0a 7d 20 7b 31 20 7b 76 74 61 62 6c 65    }.} {1 {vtable
5580: 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 61 69   constructor fai
5590: 6c 65 64 3a 20 65 32 7d 7d 0a 64 6f 5f 74 65 73  led: e2}}.do_tes
55a0: 74 20 76 74 61 62 31 2e 31 30 2d 32 20 7b 0a 20  t vtab1.10-2 {. 
55b0: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
55c0: 0a 20 20 20 20 73 65 74 20 70 74 72 20 5b 73 71  .    set ptr [sq
55d0: 6c 69 74 65 34 5f 63 6f 6e 6e 65 63 74 69 6f 6e  lite4_connection
55e0: 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 20 20 20  _pointer db].   
55f0: 20 73 71 6c 69 74 65 34 5f 64 65 63 6c 61 72 65   sqlite4_declare
5600: 5f 76 74 61 62 20 24 70 74 72 20 7b 43 52 45 41  _vtab $ptr {CREA
5610: 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c 20  TE TABLE abc(a, 
5620: 62 2c 20 63 29 7d 0a 20 20 7d 20 6d 73 67 5d 0a  b, c)}.  } msg].
5630: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
5640: 7d 20 7b 31 20 7b 6c 69 62 72 61 72 79 20 72 6f  } {1 {library ro
5650: 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74  utine called out
5660: 20 6f 66 20 73 65 71 75 65 6e 63 65 7d 7d 0a 64   of sequence}}.d
5670: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d  o_test vtab1.10-
5680: 33 20 7b 0a 20 20 73 65 74 20 3a 3a 65 63 68 6f  3 {.  set ::echo
5690: 5f 6d 6f 64 75 6c 65 5f 62 65 67 69 6e 5f 66 61  _module_begin_fa
56a0: 69 6c 20 72 0a 20 20 63 61 74 63 68 73 71 6c 20  il r.  catchsql 
56b0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
56c0: 4f 20 65 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  O e VALUES(1, 2,
56d0: 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53   3);.  }.} {1 {S
56e0: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
56f0: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
5700: 73 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  se}}.do_test vta
5710: 62 31 2e 31 30 2d 34 20 7b 0a 20 20 63 61 74 63  b1.10-4 {.  catc
5720: 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  h {execsql {.   
5730: 20 45 58 50 4c 41 49 4e 20 53 45 4c 45 43 54 20   EXPLAIN SELECT 
5740: 2a 20 46 52 4f 4d 20 65 20 57 48 45 52 45 20 72  * FROM e WHERE r
5750: 6f 77 69 64 20 3d 20 32 3b 0a 20 20 20 20 45 58  owid = 2;.    EX
5760: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
5770: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65   SELECT * FROM e
5780: 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 32   WHERE rowid = 2
5790: 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 3b   ORDER BY rowid;
57a0: 0a 20 20 7d 7d 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f  .  }}.} {0}..do_
57b0: 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d 35 20  test vtab1.10-5 
57c0: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
57d0: 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c  ule "".  execsql
57e0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
57f0: 46 52 4f 4d 20 65 20 57 48 45 52 45 20 72 6f 77  FROM e WHERE row
5800: 69 64 7c 7c 27 27 20 4d 41 54 43 48 20 27 70 61  id||'' MATCH 'pa
5810: 74 74 65 72 6e 27 3b 0a 20 20 7d 0a 20 20 73 65  ttern';.  }.  se
5820: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20  t echo_module.} 
5830: 5b 6c 69 73 74 20 5c 0a 20 20 78 42 65 73 74 49  [list \.  xBestI
5840: 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77  ndex {SELECT row
5850: 69 64 2c 20 2a 20 46 52 4f 4d 20 27 72 27 7d 20  id, * FROM 'r'} 
5860: 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c  \.  xFilter {SEL
5870: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
5880: 4d 20 27 72 27 7d 20 20 20 20 5c 0a 5d 0a 70 72  M 'r'}    \.].pr
5890: 6f 63 20 6d 61 74 63 68 5f 66 75 6e 63 20 7b 61  oc match_func {a
58a0: 72 67 73 7d 20 7b 72 65 74 75 72 6e 20 22 22 7d  rgs} {return ""}
58b0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
58c0: 30 2d 36 20 7b 0a 20 20 73 65 74 20 65 63 68 6f  0-6 {.  set echo
58d0: 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 64 62 20  _module "".  db 
58e0: 66 75 6e 63 74 69 6f 6e 20 6d 61 74 63 68 20 6d  function match m
58f0: 61 74 63 68 5f 66 75 6e 63 0a 20 20 65 78 65 63  atch_func.  exec
5900: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
5910: 20 2a 20 46 52 4f 4d 20 65 20 57 48 45 52 45 20   * FROM e WHERE 
5920: 6d 61 74 63 68 28 27 70 61 74 74 65 72 6e 27 2c  match('pattern',
5930: 20 72 6f 77 69 64 2c 20 27 70 61 74 74 65 72 6e   rowid, 'pattern
5940: 32 27 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65  2');.  }.  set e
5950: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69  cho_module.} [li
5960: 73 74 20 5c 0a 20 20 78 42 65 73 74 49 6e 64 65  st \.  xBestInde
5970: 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  x {SELECT rowid,
5980: 20 2a 20 46 52 4f 4d 20 27 72 27 7d 20 5c 0a 20   * FROM 'r'} \. 
5990: 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54   xFilter {SELECT
59a0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
59b0: 72 27 7d 20 20 20 20 5c 0a 5d 0a 0a 0a 23 20 54  r'}    \.]...# T
59c0: 65 73 74 69 6e 67 20 74 68 65 20 78 46 69 6e 64  esting the xFind
59d0: 46 75 6e 63 74 69 6f 6e 20 69 6e 74 65 72 66 61  Function interfa
59e0: 63 65 0a 23 0a 63 61 74 63 68 20 7b 72 65 6e 61  ce.#.catch {rena
59f0: 6d 65 20 3a 3a 65 63 68 6f 5f 67 6c 6f 62 5f 6f  me ::echo_glob_o
5a00: 76 65 72 6c 6f 61 64 20 7b 7d 7d 0a 64 6f 5f 74  verload {}}.do_t
5a10: 65 73 74 20 76 74 61 62 31 2e 31 31 2d 31 20 7b  est vtab1.11-1 {
5a20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5a30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 28 61   INSERT INTO r(a
5a40: 2c 62 2c 63 29 20 56 41 4c 55 45 53 28 31 2c 27  ,b,c) VALUES(1,'
5a50: 3f 27 2c 39 39 29 3b 0a 20 20 20 20 49 4e 53 45  ?',99);.    INSE
5a60: 52 54 20 49 4e 54 4f 20 72 28 61 2c 62 2c 63 29  RT INTO r(a,b,c)
5a70: 20 56 41 4c 55 45 53 28 32 2c 33 2c 39 39 29 3b   VALUES(2,3,99);
5a80: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 47 4c  .    SELECT a GL
5a90: 4f 42 20 62 20 46 52 4f 4d 20 65 0a 20 20 7d 0a  OB b FROM e.  }.
5aa0: 7d 20 7b 31 20 30 7d 0a 70 72 6f 63 20 3a 3a 65  } {1 0}.proc ::e
5ab0: 63 68 6f 5f 67 6c 6f 62 5f 6f 76 65 72 6c 6f 61  cho_glob_overloa
5ac0: 64 20 7b 61 20 62 7d 20 7b 0a 20 72 65 74 75 72  d {a b} {. retur
5ad0: 6e 20 5b 6c 69 73 74 20 24 62 20 24 61 5d 0a 7d  n [list $b $a].}
5ae0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
5af0: 31 2d 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1-2 {.  execsql 
5b00: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 6c  {.    SELECT a l
5b10: 69 6b 65 20 27 62 27 20 46 52 4f 4d 20 65 0a 20  ike 'b' FROM e. 
5b20: 20 7d 0a 7d 20 7b 30 20 30 7d 0a 64 6f 5f 74 65   }.} {0 0}.do_te
5b30: 73 74 20 76 74 61 62 31 2e 31 31 2d 33 20 7b 0a  st vtab1.11-3 {.
5b40: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5b50: 53 45 4c 45 43 54 20 61 20 67 6c 6f 62 20 27 32  SELECT a glob '2
5b60: 27 20 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b  ' FROM e.  }.} {
5b70: 7b 31 20 32 7d 20 7b 32 20 32 7d 7d 0a 64 6f 5f  {1 2} {2 2}}.do_
5b80: 74 65 73 74 20 76 74 61 62 31 2e 31 31 2d 34 20  test vtab1.11-4 
5b90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5ba0: 20 20 53 45 4c 45 43 54 20 20 67 6c 6f 62 28 27    SELECT  glob('
5bb0: 32 27 2c 61 29 20 46 52 4f 4d 20 65 0a 20 20 7d  2',a) FROM e.  }
5bc0: 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74  .} {0 1}.do_test
5bd0: 20 76 74 61 62 31 2e 31 31 2d 35 20 7b 0a 20 20   vtab1.11-5 {.  
5be0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
5bf0: 4c 45 43 54 20 20 67 6c 6f 62 28 61 2c 27 32 27  LECT  glob(a,'2'
5c00: 29 20 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b  ) FROM e.  }.} {
5c10: 7b 32 20 31 7d 20 7b 32 20 32 7d 7d 0a 20 0a 23  {2 1} {2 2}}. .#
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c60: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
5c70: 65 20 6f 75 74 63 6f 6d 65 20 69 66 20 61 20 63  e outcome if a c
5c80: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 65 6e 63  onstraint is enc
5c90: 6f 75 6e 74 65 72 65 64 20 68 61 6c 66 2d 77 61  ountered half-wa
5ca0: 79 20 74 68 72 6f 75 67 68 0a 23 20 61 20 6d 75  y through.# a mu
5cb0: 6c 74 69 2d 72 6f 77 20 49 4e 53 45 52 54 20 74  lti-row INSERT t
5cc0: 68 61 74 20 69 73 20 69 6e 73 69 64 65 20 61 20  hat is inside a 
5cd0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 0a 64 6f  transaction.#.do
5ce0: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d 31  _test vtab1.12-1
5cf0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5d00: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5d10: 62 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  b(a, b, c);.    
5d20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 61  CREATE TABLE c(a
5d30: 20 55 4e 49 51 55 45 2c 20 62 2c 20 63 29 3b 0a   UNIQUE, b, c);.
5d40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5d50: 62 20 56 41 4c 55 45 53 28 31 2c 20 27 41 27 2c  b VALUES(1, 'A',
5d60: 20 27 42 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'B');.    INSER
5d70: 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28  T INTO b VALUES(
5d80: 32 2c 20 27 43 27 2c 20 27 44 27 29 3b 0a 20 20  2, 'C', 'D');.  
5d90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
5da0: 56 41 4c 55 45 53 28 33 2c 20 27 45 27 2c 20 27  VALUES(3, 'E', '
5db0: 46 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  F');.    INSERT 
5dc0: 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 33 2c  INTO c VALUES(3,
5dd0: 20 27 47 27 2c 20 27 48 27 29 3b 0a 20 20 20 20   'G', 'H');.    
5de0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5df0: 41 42 4c 45 20 65 63 68 6f 5f 63 20 55 53 49 4e  ABLE echo_c USIN
5e00: 47 20 65 63 68 6f 28 63 29 3b 0a 20 20 7d 0a 7d  G echo(c);.  }.}
5e10: 20 7b 7d 0a 0a 23 20 46 69 72 73 74 20 74 65 73   {}..# First tes
5e20: 74 20 6f 75 74 73 69 64 65 20 6f 66 20 61 20 74  t outside of a t
5e30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 64 6f 5f 74  ransaction..do_t
5e40: 65 73 74 20 76 74 61 62 31 2e 31 32 2d 32 20 7b  est vtab1.12-2 {
5e50: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
5e60: 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 63  SERT INTO echo_c
5e70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
5e80: 3b 20 7d 0a 7d 20 7b 31 20 7b 65 63 68 6f 2d 76  ; }.} {1 {echo-v
5e90: 74 61 62 2d 65 72 72 6f 72 3a 20 63 6f 6c 75 6d  tab-error: colum
5ea0: 6e 20 61 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  n a is not uniqu
5eb0: 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  e}}.do_test vtab
5ec0: 31 2e 31 32 2d 32 2e 31 20 7b 0a 20 20 73 71 6c  1.12-2.1 {.  sql
5ed0: 69 74 65 34 5f 65 72 72 6d 73 67 20 64 62 0a 7d  ite4_errmsg db.}
5ee0: 20 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72 72 6f   {echo-vtab-erro
5ef0: 72 3a 20 63 6f 6c 75 6d 6e 20 61 20 69 73 20 6e  r: column a is n
5f00: 6f 74 20 75 6e 69 71 75 65 7d 0a 64 6f 5f 74 65  ot unique}.do_te
5f10: 73 74 20 76 74 61 62 31 2e 31 32 2d 33 20 7b 0a  st vtab1.12-3 {.
5f20: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
5f30: 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d 0a 7d 20  CT * FROM c }.} 
5f40: 7b 33 20 47 20 48 7d 0a 0a 23 20 4e 6f 77 20 74  {3 G H}..# Now t
5f50: 68 65 20 72 65 61 6c 20 74 65 73 74 20 2d 20 77  he real test - w
5f60: 72 61 70 70 65 64 20 69 6e 20 61 20 74 72 61 6e  rapped in a tran
5f70: 73 61 63 74 69 6f 6e 2e 0a 64 6f 5f 74 65 73 74  saction..do_test
5f80: 20 76 74 61 62 31 2e 31 32 2d 34 20 7b 0a 20 20   vtab1.12-4 {.  
5f90: 65 78 65 63 73 71 6c 20 20 7b 42 45 47 49 4e 7d  execsql  {BEGIN}
5fa0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
5fb0: 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 63  SERT INTO echo_c
5fc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
5fd0: 3b 20 7d 0a 7d 20 7b 31 20 7b 65 63 68 6f 2d 76  ; }.} {1 {echo-v
5fe0: 74 61 62 2d 65 72 72 6f 72 3a 20 63 6f 6c 75 6d  tab-error: colum
5ff0: 6e 20 61 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  n a is not uniqu
6000: 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  e}}.do_test vtab
6010: 31 2e 31 32 2d 35 20 7b 0a 20 20 65 78 65 63 73  1.12-5 {.  execs
6020: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
6030: 4f 4d 20 63 20 7d 0a 7d 20 7b 33 20 47 20 48 7d  OM c }.} {3 G H}
6040: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
6050: 32 2d 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2-6 {.  execsql 
6060: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65  { COMMIT }.  exe
6070: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
6080: 46 52 4f 4d 20 63 20 7d 0a 7d 20 7b 33 20 47 20  FROM c }.} {3 G 
6090: 48 7d 0a 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69  H}..# At one poi
60a0: 6e 74 20 28 74 69 63 6b 65 74 20 23 32 37 35 39  nt (ticket #2759
60b0: 29 2c 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ), a WHERE claus
60c0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  e of the form "<
60d0: 63 6f 6c 75 6d 6e 3e 20 49 53 20 4e 55 4c 4c 22  column> IS NULL"
60e0: 0a 23 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20  .# on a virtual 
60f0: 74 61 62 6c 65 20 77 61 73 20 63 61 75 73 69 6e  table was causin
6100: 67 20 61 6e 20 61 73 73 65 72 74 28 29 20 74 6f  g an assert() to
6110: 20 66 61 69 6c 20 69 6e 20 74 68 65 20 63 6f 6d   fail in the com
6120: 70 69 6c 65 72 2e 0a 23 0a 23 20 22 49 53 20 4e  piler..#.# "IS N
6130: 55 4c 4c 22 20 63 6c 61 75 73 65 73 20 73 68 6f  ULL" clauses sho
6140: 75 6c 64 20 6e 6f 74 20 62 65 20 70 61 73 73 65  uld not be passe
6150: 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
6160: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 23   virtual table.#
6170: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
6180: 20 54 68 65 79 20 61 72 65 20 68 61 6e 64 6c 65   They are handle
6190: 64 20 62 79 20 53 51 4c 69 74 65 20 61 66 74 65  d by SQLite afte
61a0: 72 20 74 68 65 20 76 74 61 62 20 72 65 74 75 72  r the vtab retur
61b0: 6e 73 20 69 74 73 0a 23 20 64 61 74 61 2e 0a 23  ns its.# data..#
61c0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
61d0: 33 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3-1 {.  execsql 
61e0: 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  { .    SELECT * 
61f0: 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52  FROM echo_c WHER
6200: 45 20 61 20 49 53 20 4e 55 4c 4c 20 0a 20 20 7d  E a IS NULL .  }
6210: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74  .} {}.do_test vt
6220: 61 62 31 2e 31 33 2d 32 20 7b 0a 20 20 65 78 65  ab1.13-2 {.  exe
6230: 63 73 71 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45  csql { .    INSE
6240: 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53  RT INTO c VALUES
6250: 28 4e 55 4c 4c 2c 20 31 35 2c 20 31 36 29 3b 0a  (NULL, 15, 16);.
6260: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
6270: 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61  M echo_c WHERE a
6280: 20 49 53 20 4e 55 4c 4c 20 0a 20 20 7d 0a 7d 20   IS NULL .  }.} 
6290: 7b 7b 7d 20 31 35 20 31 36 7d 0a 64 6f 5f 74 65  {{} 15 16}.do_te
62a0: 73 74 20 76 74 61 62 31 2e 31 33 2d 33 20 7b 0a  st vtab1.13-3 {.
62b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
62c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56   INSERT INTO c V
62d0: 41 4c 55 45 53 28 31 35 2c 20 4e 55 4c 4c 2c 20  ALUES(15, NULL, 
62e0: 31 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  16);.    SELECT 
62f0: 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48  * FROM echo_c WH
6300: 45 52 45 20 62 20 49 53 20 4e 55 4c 4c 20 0a 20  ERE b IS NULL . 
6310: 20 7d 0a 7d 20 7b 31 35 20 7b 7d 20 31 36 7d 0a   }.} {15 {} 16}.
6320: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 33  do_test vtab1.13
6330: 2d 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  -3 {.  execsql {
6340: 20 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46   .    SELECT * F
6350: 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45  ROM echo_c WHERE
6360: 20 62 20 49 53 20 4e 55 4c 4c 20 41 4e 44 20 61   b IS NULL AND a
6370: 20 3d 20 31 35 3b 0a 20 20 7d 0a 7d 20 7b 31 35   = 15;.  }.} {15
6380: 20 7b 7d 20 31 36 7d 0a 0a 0a 64 6f 5f 74 65 73   {} 16}...do_tes
6390: 74 20 76 74 61 62 31 2d 31 34 2e 31 20 7b 0a 20  t vtab1-14.1 {. 
63a0: 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54   execsql { DELET
63b0: 45 20 46 52 4f 4d 20 63 20 7d 0a 20 20 73 65 74  E FROM c }.  set
63c0: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a   echo_module "".
63d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
63e0: 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63  CT * FROM echo_c
63f0: 20 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e 20   WHERE rowid IN 
6400: 28 31 2c 20 32 2c 20 33 29 20 7d 0a 20 20 73 65  (1, 2, 3) }.  se
6410: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20  t echo_module.} 
6420: 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 78  [list xBestIndex
6430: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
6440: 2a 20 46 52 4f 4d 20 27 63 27 7d 20 78 46 69 6c  * FROM 'c'} xFil
6450: 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  ter {SELECT rowi
6460: 64 2c 20 2a 20 46 52 4f 4d 20 27 63 27 7d 5d 0a  d, * FROM 'c'}].
6470: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
6480: 34 2e 32 20 7b 0a 20 20 73 65 74 20 65 63 68 6f  4.2 {.  set echo
6490: 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65  _module "".  exe
64a0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
64b0: 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52  FROM echo_c WHER
64c0: 45 20 72 6f 77 69 64 20 3d 20 31 20 7d 0a 20 20  E rowid = 1 }.  
64d0: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a  set echo_module.
64e0: 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64  } [list xBestInd
64f0: 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  ex {SELECT rowid
6500: 2c 20 2a 20 46 52 4f 4d 20 27 63 27 20 57 48 45  , * FROM 'c' WHE
6510: 52 45 20 72 6f 77 69 64 20 3d 20 3f 7d 20 78 46  RE rowid = ?} xF
6520: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f  ilter {SELECT ro
6530: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 63 27 20  wid, * FROM 'c' 
6540: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 3f 7d  WHERE rowid = ?}
6550: 20 31 5d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61   1]..do_test vta
6560: 62 31 2d 31 34 2e 33 20 7b 0a 20 20 73 65 74 20  b1-14.3 {.  set 
6570: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20  echo_module "". 
6580: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
6590: 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20  T * FROM echo_c 
65a0: 57 48 45 52 45 20 61 20 3d 20 31 20 7d 0a 20 20  WHERE a = 1 }.  
65b0: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a  set echo_module.
65c0: 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64  } [list xBestInd
65d0: 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  ex {SELECT rowid
65e0: 2c 20 2a 20 46 52 4f 4d 20 27 63 27 20 57 48 45  , * FROM 'c' WHE
65f0: 52 45 20 61 20 3d 20 3f 7d 20 78 46 69 6c 74 65  RE a = ?} xFilte
6600: 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  r {SELECT rowid,
6610: 20 2a 20 46 52 4f 4d 20 27 63 27 20 57 48 45 52   * FROM 'c' WHER
6620: 45 20 61 20 3d 20 3f 7d 20 31 5d 0a 0a 64 6f 5f  E a = ?} 1]..do_
6630: 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e 34 20  test vtab1-14.4 
6640: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
6650: 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c  ule "".  execsql
6660: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
6670: 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20   echo_c WHERE a 
6680: 49 4e 20 28 31 2c 20 32 29 20 7d 0a 20 20 73 65  IN (1, 2) }.  se
6690: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20  t echo_module.} 
66a0: 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 78  [list xBestIndex
66b0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
66c0: 2a 20 46 52 4f 4d 20 27 63 27 7d 20 78 46 69 6c  * FROM 'c'} xFil
66d0: 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  ter {SELECT rowi
66e0: 64 2c 20 2a 20 46 52 4f 4d 20 27 63 27 7d 5d 0a  d, * FROM 'c'}].
66f0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
6700: 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.1 {.  execsql 
6710: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
6720: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  LE t1(a, b, c);.
6730: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
6740: 41 4c 20 54 41 42 4c 45 20 65 63 68 6f 5f 74 31  AL TABLE echo_t1
6750: 20 55 53 49 4e 47 20 65 63 68 6f 28 74 31 29 3b   USING echo(t1);
6760: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
6770: 74 20 76 74 61 62 31 2d 31 35 2e 32 20 7b 0a 20  t vtab1-15.2 {. 
6780: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
6790: 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f  NSERT INTO echo_
67a0: 74 31 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53  t1(rowid) VALUES
67b0: 28 34 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  (45);.    SELECT
67c0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65   rowid, * FROM e
67d0: 63 68 6f 5f 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34  cho_t1;.  }.} {4
67e0: 35 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74  5 {} {} {}}.do_t
67f0: 65 73 74 20 76 74 61 62 31 2d 31 35 2e 33 20 7b  est vtab1-15.3 {
6800: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6810: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68   INSERT INTO ech
6820: 6f 5f 74 31 28 72 6f 77 69 64 29 20 56 41 4c 55  o_t1(rowid) VALU
6830: 45 53 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 45  ES(NULL);.    SE
6840: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
6850: 4f 4d 20 65 63 68 6f 5f 74 31 3b 0a 20 20 7d 0a  OM echo_t1;.  }.
6860: 7d 20 7b 34 35 20 7b 7d 20 7b 7d 20 7b 7d 20 34  } {45 {} {} {} 4
6870: 36 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74  6 {} {} {}}.do_t
6880: 65 73 74 20 76 74 61 62 31 2d 31 35 2e 34 20 7b  est vtab1-15.4 {
6890: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
68a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63    INSERT INTO ec
68b0: 68 6f 5f 74 31 28 72 6f 77 69 64 29 20 56 41 4c  ho_t1(rowid) VAL
68c0: 55 45 53 28 27 6e 65 77 20 72 6f 77 69 64 27 29  UES('new rowid')
68d0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61  ;.  }.} {1 {data
68e0: 74 79 70 65 20 6d 69 73 6d 61 74 63 68 7d 7d 0a  type mismatch}}.
68f0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
6900: 20 74 65 73 74 73 20 2d 20 76 74 61 62 31 2d 31   tests - vtab1-1
6910: 36 2e 2a 20 2d 20 61 72 65 20 64 65 73 69 67 6e  6.* - are design
6920: 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  ed to test that 
6930: 73 65 74 74 69 6e 67 20 0a 23 20 73 71 6c 69 74  setting .# sqlit
6940: 65 34 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20  e4_vtab.zErrMsg 
6950: 76 61 72 69 61 62 6c 65 20 63 61 6e 20 62 65 20  variable can be 
6960: 75 73 65 64 20 62 79 20 74 68 65 20 76 74 61 62  used by the vtab
6970: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 0a 23   interface to .#
6980: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
6990: 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
69a0: 75 73 65 72 2e 0a 23 20 0a 64 6f 5f 74 65 73 74  user..# .do_test
69b0: 20 76 74 61 62 31 2d 31 36 2e 31 20 7b 0a 20 20   vtab1-16.1 {.  
69c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
69d0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20  EATE TABLE t2(a 
69e0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20  PRIMARY KEY, b, 
69f0: 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  c);.    INSERT I
6a00: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
6a10: 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45   2, 3);.    INSE
6a20: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
6a30: 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20  S(4, 5, 6);.    
6a40: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
6a50: 41 42 4c 45 20 65 63 68 6f 5f 74 32 20 55 53 49  ABLE echo_t2 USI
6a60: 4e 47 20 65 63 68 6f 28 74 32 29 3b 0a 20 20 7d  NG echo(t2);.  }
6a70: 0a 7d 20 7b 7d 0a 0a 73 65 74 20 74 6e 20 32 0a  .} {}..set tn 2.
6a80: 66 6f 72 65 61 63 68 20 6d 65 74 68 6f 64 20 5b  foreach method [
6a90: 6c 69 73 74 20 5c 0a 20 20 20 20 78 42 65 73 74  list \.    xBest
6aa0: 49 6e 64 65 78 20 20 20 20 20 20 20 5c 0a 20 20  Index       \.  
6ab0: 20 20 78 4f 70 65 6e 20 20 20 20 20 20 20 20 20    xOpen         
6ac0: 20 20 20 5c 0a 20 20 20 20 78 46 69 6c 74 65 72     \.    xFilter
6ad0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
6ae0: 78 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  xNext           
6af0: 20 5c 0a 20 20 20 20 78 43 6f 6c 75 6d 6e 20 20   \.    xColumn  
6b00: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78 52          \.    xR
6b10: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 5c  owid           \
6b20: 0a 5d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 76  .] {.  do_test v
6b30: 74 61 62 31 2d 31 36 2e 24 74 6e 20 7b 0a 20 20  tab1-16.$tn {.  
6b40: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
6b50: 65 5f 66 61 69 6c 28 24 6d 65 74 68 6f 64 2c 74  e_fail($method,t
6b60: 32 29 20 22 74 68 65 20 24 6d 65 74 68 6f 64 20  2) "the $method 
6b70: 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69 6c 65  method has faile
6b80: 64 22 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  d".    catchsql 
6b90: 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20  { SELECT rowid, 
6ba0: 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 74 32 20 57  * FROM echo_t2 W
6bb0: 48 45 52 45 20 61 20 3e 3d 20 31 20 7d 0a 20 20  HERE a >= 1 }.  
6bc0: 7d 20 22 31 20 7b 65 63 68 6f 2d 76 74 61 62 2d  } "1 {echo-vtab-
6bd0: 65 72 72 6f 72 3a 20 74 68 65 20 24 6d 65 74 68  error: the $meth
6be0: 6f 64 20 6d 65 74 68 6f 64 20 68 61 73 20 66 61  od method has fa
6bf0: 69 6c 65 64 7d 22 0a 20 20 75 6e 73 65 74 20 65  iled}".  unset e
6c00: 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28  cho_module_fail(
6c10: 24 6d 65 74 68 6f 64 2c 74 32 29 0a 20 20 69 6e  $method,t2).  in
6c20: 63 72 20 74 6e 0a 7d 0a 0a 66 6f 72 65 61 63 68  cr tn.}..foreach
6c30: 20 6d 65 74 68 6f 64 20 5b 6c 69 73 74 20 5c 0a   method [list \.
6c40: 20 20 78 55 70 64 61 74 65 20 20 20 20 20 20 20    xUpdate       
6c50: 20 20 20 20 20 5c 0a 20 20 78 42 65 67 69 6e 20       \.  xBegin 
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
6c70: 78 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  xSync           
6c80: 20 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 74 65     \.] {.  do_te
6c90: 73 74 20 76 74 61 62 31 2d 31 36 2e 24 74 6e 20  st vtab1-16.$tn 
6ca0: 7b 0a 20 20 20 20 73 65 74 20 65 63 68 6f 5f 6d  {.    set echo_m
6cb0: 6f 64 75 6c 65 5f 66 61 69 6c 28 24 6d 65 74 68  odule_fail($meth
6cc0: 6f 64 2c 74 32 29 20 22 74 68 65 20 24 6d 65 74  od,t2) "the $met
6cd0: 68 6f 64 20 6d 65 74 68 6f 64 20 68 61 73 20 66  hod method has f
6ce0: 61 69 6c 65 64 22 0a 20 20 20 20 63 61 74 63 68  ailed".    catch
6cf0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
6d00: 4f 20 65 63 68 6f 5f 74 32 20 56 41 4c 55 45 53  O echo_t2 VALUES
6d10: 28 37 2c 20 38 2c 20 39 29 20 7d 0a 20 20 7d 20  (7, 8, 9) }.  } 
6d20: 22 31 20 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72  "1 {echo-vtab-er
6d30: 72 6f 72 3a 20 74 68 65 20 24 6d 65 74 68 6f 64  ror: the $method
6d40: 20 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69 6c   method has fail
6d50: 65 64 7d 22 0a 20 20 75 6e 73 65 74 20 65 63 68  ed}".  unset ech
6d60: 6f 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 24 6d  o_module_fail($m
6d70: 65 74 68 6f 64 2c 74 32 29 0a 20 20 69 6e 63 72  ethod,t2).  incr
6d80: 20 74 6e 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65   tn.}..ifcapable
6d90: 20 61 6c 74 65 72 74 61 62 6c 65 20 7b 0a 20 20   altertable {.  
6da0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 36  do_test vtab1-16
6db0: 2e 24 74 6e 20 7b 0a 20 20 20 20 73 65 74 20 65  .$tn {.    set e
6dc0: 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28  cho_module_fail(
6dd0: 78 52 65 6e 61 6d 65 2c 74 32 29 20 22 74 68 65  xRename,t2) "the
6de0: 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 20   xRename method 
6df0: 68 61 73 20 66 61 69 6c 65 64 22 0a 20 20 20 20  has failed".    
6e00: 63 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52  catchsql { ALTER
6e10: 20 54 41 42 4c 45 20 65 63 68 6f 5f 74 32 20 52   TABLE echo_t2 R
6e20: 45 4e 41 4d 45 20 54 4f 20 61 6e 6f 74 68 65 72  ENAME TO another
6e30: 5f 6e 61 6d 65 20 7d 0a 20 20 7d 20 22 31 20 7b  _name }.  } "1 {
6e40: 65 63 68 6f 2d 76 74 61 62 2d 65 72 72 6f 72 3a  echo-vtab-error:
6e50: 20 74 68 65 20 78 52 65 6e 61 6d 65 20 6d 65 74   the xRename met
6e60: 68 6f 64 20 68 61 73 20 66 61 69 6c 65 64 7d 22  hod has failed}"
6e70: 0a 20 20 75 6e 73 65 74 20 65 63 68 6f 5f 6d 6f  .  unset echo_mo
6e80: 64 75 6c 65 5f 66 61 69 6c 28 78 52 65 6e 61 6d  dule_fail(xRenam
6e90: 65 2c 74 32 29 0a 20 20 69 6e 63 72 20 74 6e 0a  e,t2).  incr tn.
6ea0: 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  }..# The followi
6eb0: 6e 67 20 74 65 73 74 20 63 61 73 65 20 65 78 70  ng test case exp
6ec0: 6f 73 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  oses an instance
6ed0: 20 69 6e 20 73 71 6c 69 74 65 34 5f 64 65 63 6c   in sqlite4_decl
6ee0: 61 72 65 5f 76 74 61 62 28 29 0a 23 20 61 6e 20  are_vtab().# an 
6ef0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 61  error message wa
6f00: 73 20 73 65 74 20 75 73 69 6e 67 20 61 20 63 61  s set using a ca
6f10: 6c 6c 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  ll similar to sq
6f20: 6c 69 74 65 34 5f 6d 70 72 69 6e 74 66 28 7a 45  lite4_mprintf(zE
6f30: 72 72 29 2c 0a 23 20 77 68 65 72 65 20 7a 45 72  rr),.# where zEr
6f40: 72 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72  r is an arbitrar
6f50: 79 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20 69  y string. This i
6f60: 73 20 6e 6f 20 67 6f 6f 64 20 69 66 20 74 68 65  s no good if the
6f70: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73   string contains
6f80: 0a 23 20 63 68 61 72 61 63 74 65 72 73 20 74 68  .# characters th
6f90: 61 74 20 63 61 6e 20 62 65 20 6d 69 73 74 61 6b  at can be mistak
6fa0: 65 6e 20 66 6f 72 20 70 72 69 6e 74 66 28 29 20  en for printf() 
6fb0: 66 6f 72 6d 61 74 74 69 6e 67 20 64 69 72 65 63  formatting direc
6fc0: 74 69 76 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  tives..#.do_test
6fd0: 20 76 74 61 62 31 2d 31 37 2e 31 20 7b 0a 20 20   vtab1-17.1 {.  
6fe0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50  execsql { .    P
6ff0: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
7000: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 49  chema = 1;.    I
7010: 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74  NSERT INTO sqlit
7020: 65 5f 6d 61 73 74 65 72 20 56 41 4c 55 45 53 28  e_master VALUES(
7030: 0a 20 20 20 20 20 20 27 74 61 62 6c 65 27 2c 20  .      'table', 
7040: 27 74 33 27 2c 20 27 74 33 27 2c 20 30 2c 20 27  't3', 't3', 0, '
7050: 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 25 73 25  INSERT INTO "%s%
7060: 73 22 20 56 41 4c 55 45 53 28 31 29 27 0a 20 20  s" VALUES(1)'.  
7070: 20 20 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68    );.  }.  catch
7080: 73 71 6c 20 7b 20 43 52 45 41 54 45 20 56 49 52  sql { CREATE VIR
7090: 54 55 41 4c 20 54 41 42 4c 45 20 74 34 20 55 53  TUAL TABLE t4 US
70a0: 49 4e 47 20 65 63 68 6f 28 74 33 29 3b 20 7d 0a  ING echo(t3); }.
70b0: 7d 20 7b 31 20 7b 76 74 61 62 6c 65 20 63 6f 6e  } {1 {vtable con
70c0: 73 74 72 75 63 74 6f 72 20 66 61 69 6c 65 64 3a  structor failed:
70d0: 20 74 34 7d 7d 0a 0a 23 20 54 68 69 73 20 74 65   t4}}..# This te
70e0: 73 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74  st verifies that
70f0: 20 74 69 63 6b 65 74 20 34 38 66 32 39 39 36 33   ticket 48f29963
7100: 20 69 73 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f   is fixed..#.do_
7110: 74 65 73 74 20 76 74 61 62 31 2d 31 37 2e 31 20  test vtab1-17.1 
7120: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
7130: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7140: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t5(a, b);.    CR
7150: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
7160: 4c 45 20 65 35 20 55 53 49 4e 47 20 65 63 68 6f  LE e5 USING echo
7170: 5f 76 32 28 74 35 29 3b 0a 20 20 20 20 42 45 47  _v2(t5);.    BEG
7180: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
7190: 20 49 4e 54 4f 20 65 35 20 56 41 4c 55 45 53 28   INTO e5 VALUES(
71a0: 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 44 52 4f  1, 2);.      DRO
71b0: 50 20 54 41 42 4c 45 20 65 35 3b 0a 20 20 20 20  P TABLE e5;.    
71c0: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
71d0: 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  .      ROLLBACK 
71e0: 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d  TO one;.    COMM
71f0: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 75 6e  IT;.  }.} {}..un
7200: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
7210: 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 62 65 67 69  echo_module_begi
7220: 6e 5f 66 61 69 6c 0a 66 69 6e 69 73 68 5f 74 65  n_fail.finish_te
7230: 73 74 0a                                         st.