/ Hex Artifact Content
Login

Artifact b40b7e531dea8f0f7e78c76ff96eed103f58d015:


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 33 5f 64 65 63 6c  est sqlite3_decl
03a0: 61 72 65 5f 76 74 61 62 28 29 20 61 6e 64 20 74  are_vtab() and t
03b0: 68 65 20 78 43 6f 6e 6e 65 63 74 2f 78 44 69 73  he xConnect/xDis
03c0: 63 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64 73 2e  connect methods.
03d0: 0a 23 20 76 74 61 62 31 2d 33 2e 2a 3a 20 54 61  .# vtab1-3.*: Ta
03e0: 62 6c 65 20 73 63 61 6e 73 20 61 6e 64 20 57 48  ble scans and WH
03f0: 45 52 45 20 63 6c 61 75 73 65 73 2e 0a 23 20 76  ERE clauses..# v
0400: 74 61 62 31 2d 34 2e 2a 3a 20 54 61 62 6c 65 20  tab1-4.*: Table 
0410: 73 63 61 6e 73 20 61 6e 64 20 4f 52 44 45 52 20  scans and ORDER 
0420: 42 59 20 63 6c 61 75 73 65 73 2e 0a 23 20 76 74  BY clauses..# vt
0430: 61 62 31 2d 35 2e 2a 3a 20 54 65 73 74 20 71 75  ab1-5.*: Test qu
0440: 65 72 69 65 73 20 74 68 61 74 20 69 6e 63 6c 75  eries that inclu
0450: 64 65 20 6a 6f 69 6e 73 2e 20 54 68 69 73 20 62  de joins. This b
0460: 72 69 6e 67 73 20 74 68 65 0a 23 20 20 20 20 20  rings the.#     
0470: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
0480: 6e 64 65 78 5f 69 6e 66 6f 2e 65 73 74 69 6d 61  ndex_info.estima
0490: 74 65 64 43 6f 73 74 20 76 61 72 69 61 62 6c 65  tedCost variable
04a0: 20 69 6e 74 6f 20 70 6c 61 79 2e 0a 23 20 76 74   into play..# vt
04b0: 61 62 31 2d 36 2e 2a 3a 20 54 65 73 74 20 55 50  ab1-6.*: Test UP
04c0: 44 41 54 45 2f 49 4e 53 45 52 54 2f 44 45 4c 45  DATE/INSERT/DELE
04d0: 54 45 20 6f 6e 20 76 74 61 62 6c 65 73 2e 0a 23  TE on vtables..#
04e0: 20 76 74 61 62 31 2d 37 2e 2a 3a 20 54 65 73 74   vtab1-7.*: Test
04f0: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
0500: 73 65 72 74 5f 72 6f 77 69 64 28 29 2e 0a 23 0a  sert_rowid()..#.
0510: 23 20 54 68 69 73 20 66 69 6c 65 20 75 73 65 73  # This file uses
0520: 20 74 68 65 20 22 65 63 68 6f 22 20 6d 6f 64 75   the "echo" modu
0530: 6c 65 20 28 73 65 65 20 73 72 63 2f 74 65 73 74  le (see src/test
0540: 38 2e 63 29 2e 20 52 65 66 65 72 20 74 6f 20 63  8.c). Refer to c
0550: 6f 6d 6d 65 6e 74 73 0a 23 20 69 6e 20 74 68 61  omments.# in tha
0560: 74 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 73  t file for the s
0570: 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72  pecial behaviour
0580: 20 6f 66 20 74 68 65 20 54 63 6c 20 24 65 63 68   of the Tcl $ech
0590: 6f 5f 6d 6f 64 75 6c 65 20 76 61 72 69 61 62 6c  o_module variabl
05a0: 65 2e 0a 23 0a 23 20 54 4f 44 4f 3a 20 0a 23 20  e..#.# TODO: .# 
05b0: 20 20 2a 20 48 6f 77 20 74 6f 20 74 65 73 74 20    * How to test 
05c0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
05d0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
05e0: 67 65 2e 6f 6d 69 74 20 66 69 65 6c 64 3f 0a 23  ge.omit field?.#
05f0: 20 20 20 2a 20 76 74 61 62 31 2d 35 2e 2a 0a 23     * vtab1-5.*.#
0600: 0a 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 33 5f  module [sqlite3_
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 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_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 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_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 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_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 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_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 33 5f 70 72 65 70 61 72 65  [sqlite3_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 33 5f  TAIL].  sqlite3_
0d30: 73 74 65 70 20 24 53 54 4d 54 0a 7d 20 53 51 4c  step $STMT.} SQL
0d40: 49 54 45 5f 45 52 52 4f 52 0a 64 6f 5f 74 65 73  ITE_ERROR.do_tes
0d50: 74 20 76 74 61 62 2d 31 2e 32 31 35 32 2e 32 20  t vtab-1.2152.2 
0d60: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  {.  sqlite3_rese
0d70: 74 20 24 53 54 4d 54 0a 20 20 73 71 6c 69 74 65  t $STMT.  sqlite
0d80: 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 7d 20 53  3_step $STMT.} S
0d90: 51 4c 49 54 45 5f 45 52 52 4f 52 0a 64 6f 5f 74  QLITE_ERROR.do_t
0da0: 65 73 74 20 76 74 61 62 2d 31 2e 32 31 35 32 2e  est vtab-1.2152.
0db0: 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  3 {.  sqlite3_re
0dc0: 73 65 74 20 24 53 54 4d 54 0a 20 20 64 62 20 65  set $STMT.  db e
0dd0: 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  val {CREATE TABL
0de0: 45 20 74 32 31 35 32 62 28 78 2c 79 29 7d 0a 20  E t2152b(x,y)}. 
0df0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53   sqlite3_step $S
0e00: 54 4d 54 0a 7d 20 53 51 4c 49 54 45 5f 44 4f 4e  TMT.} SQLITE_DON
0e10: 45 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 2d 31  E.do_test vtab-1
0e20: 2e 32 31 35 32 2e 34 20 7b 0a 20 20 73 71 6c 69  .2152.4 {.  sqli
0e30: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 54  te3_finalize $ST
0e40: 4d 54 0a 20 20 64 62 20 65 76 61 6c 20 7b 44 52  MT.  db eval {DR
0e50: 4f 50 20 54 41 42 4c 45 20 74 32 31 35 32 61 3b  OP TABLE t2152a;
0e60: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 31 35   DROP TABLE t215
0e70: 32 62 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74  2b}.} {}..# Test
0e80: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f   to make sure no
0e90: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
0ea0: 20 61 6e 64 20 6e 6f 20 6d 65 6d 6f 72 79 20 69   and no memory i
0eb0: 73 20 6c 65 61 6b 65 64 20 69 66 20 77 65 20 0a  s leaked if we .
0ec0: 23 20 73 65 6c 65 63 74 20 61 6e 20 69 6c 6c 65  # select an ille
0ed0: 67 61 6c 20 74 61 62 6c 65 2d 6e 61 6d 65 20 28  gal table-name (
0ee0: 69 2e 65 20 61 20 72 65 73 65 72 76 65 64 20 6e  i.e a reserved n
0ef0: 61 6d 65 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  ame or the name 
0f00: 6f 66 20 61 0a 23 20 74 61 62 6c 65 20 74 68 61  of a.# table tha
0f10: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
0f20: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74 61  )..#.do_test vta
0f30: 62 31 2d 31 2e 37 20 7b 0a 20 20 63 61 74 63 68  b1-1.7 {.  catch
0f40: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
0f50: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
0f60: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 53 49  qlite_master USI
0f70: 4e 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b  NG echo;.  }.} {
0f80: 31 20 7b 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  1 {object name r
0f90: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
0fa0: 72 6e 61 6c 20 75 73 65 3a 20 73 71 6c 69 74 65  rnal use: sqlite
0fb0: 5f 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f 74 65 73  _master}}.do_tes
0fc0: 74 20 76 74 61 62 31 2d 31 2e 38 20 7b 0a 20 20  t vtab1-1.8 {.  
0fd0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43  catchsql {.    C
0fe0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 65 61  REATE TABLE trea
0ff0: 6c 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  l(a, b, c);.    
1000: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1010: 41 42 4c 45 20 74 72 65 61 6c 20 55 53 49 4e 47  ABLE treal USING
1020: 20 65 63 68 6f 28 74 72 65 61 6c 29 3b 0a 20 20   echo(treal);.  
1030: 7d 0a 7d 20 7b 31 20 7b 74 61 62 6c 65 20 74 72  }.} {1 {table tr
1040: 65 61 6c 20 61 6c 72 65 61 64 79 20 65 78 69 73  eal already exis
1050: 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  ts}}.do_test vta
1060: 62 31 2d 31 2e 39 20 7b 0a 20 20 65 78 65 63 73  b1-1.9 {.  execs
1070: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
1080: 42 4c 45 20 74 72 65 61 6c 3b 0a 20 20 20 20 53  BLE treal;.    S
1090: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
10a0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
10b0: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b  DER BY 1.  }.} {
10c0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }..do_test vtab1
10d0: 2d 31 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71  -1.10 {.  execsq
10e0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
10f0: 41 42 4c 45 20 74 72 65 61 6c 28 61 2c 20 62 2c  ABLE treal(a, b,
1100: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   c);.    CREATE 
1110: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65  VIRTUAL TABLE te
1120: 63 68 6f 20 55 53 49 4e 47 20 65 63 68 6f 28 74  cho USING echo(t
1130: 72 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 64 62 20  real);.  }.  db 
1140: 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
1150: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61 74  db test.db.  cat
1160: 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  chsql {.    SELE
1170: 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b  CT * FROM techo;
1180: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75  .  }.} {1 {no su
1190: 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d  ch module: echo}
11a0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
11b0: 31 2e 31 31 20 7b 0a 20 20 63 61 74 63 68 73 71  1.11 {.  catchsq
11c0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
11d0: 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c 55 45 53  NTO techo VALUES
11e0: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d  (1, 2, 3);.  }.}
11f0: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64   {1 {no such mod
1200: 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74  ule: echo}}.do_t
1210: 65 73 74 20 76 74 61 62 31 2d 31 2e 31 32 20 7b  est vtab1-1.12 {
1220: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1230: 20 20 55 50 44 41 54 45 20 74 65 63 68 6f 20 53    UPDATE techo S
1240: 45 54 20 61 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d  ET a = 10;.  }.}
1250: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64   {1 {no such mod
1260: 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74  ule: echo}}.do_t
1270: 65 73 74 20 76 74 61 62 31 2d 31 2e 31 33 20 7b  est vtab1-1.13 {
1280: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1290: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65    DELETE FROM te
12a0: 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e  cho;.  }.} {1 {n
12b0: 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65  o such module: e
12c0: 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74  cho}}.do_test vt
12d0: 61 62 31 2d 31 2e 31 34 20 7b 0a 20 20 63 61 74  ab1-1.14 {.  cat
12e0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  chsql {.    PRAG
12f0: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74 65  MA table_info(te
1300: 63 68 6f 29 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e  cho).  }.} {1 {n
1310: 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65  o such module: e
1320: 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74  cho}}.do_test vt
1330: 61 62 31 2d 31 2e 31 35 20 7b 0a 20 20 63 61 74  ab1-1.15 {.  cat
1340: 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  chsql {.    DROP
1350: 20 54 41 42 4c 45 20 74 65 63 68 6f 3b 0a 20 20   TABLE techo;.  
1360: 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  }.} {1 {no such 
1370: 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 0a  module: echo}}..
1380: 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f  register_echo_mo
1390: 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f  dule [sqlite3_co
13a0: 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
13b0: 20 64 62 5d 0a 72 65 67 69 73 74 65 72 5f 65 63   db].register_ec
13c0: 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74  ho_module [sqlit
13d0: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
13e0: 69 6e 74 65 72 20 64 62 5d 0a 0a 23 20 54 65 73  inter db]..# Tes
13f0: 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
1400: 67 65 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ge returned from
1410: 20 61 20 76 2d 74 61 62 6c 65 20 63 6f 6e 73 74   a v-table const
1420: 72 75 63 74 6f 72 2e 0a 23 0a 64 6f 5f 74 65 73  ructor..#.do_tes
1430: 74 20 76 74 61 62 31 2d 31 2e 31 36 20 7b 0a 20  t vtab1-1.16 {. 
1440: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
1450: 52 4f 50 20 54 41 42 4c 45 20 74 65 63 68 6f 3b  ROP TABLE techo;
1460: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1470: 45 20 6c 6f 67 6d 73 67 28 6c 6f 67 29 3b 0a 20  E logmsg(log);. 
1480: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   }.  catchsql {.
1490: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
14a0: 41 4c 20 54 41 42 4c 45 20 74 65 63 68 6f 20 55  AL TABLE techo U
14b0: 53 49 4e 47 20 65 63 68 6f 28 74 72 65 61 6c 2c  SING echo(treal,
14c0: 20 6c 6f 67 6d 73 67 29 3b 0a 20 20 7d 0a 7d 20   logmsg);.  }.} 
14d0: 7b 31 20 7b 74 61 62 6c 65 20 27 6c 6f 67 6d 73  {1 {table 'logms
14e0: 67 27 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  g' already exist
14f0: 73 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61  s}}..do_test vta
1500: 62 31 2d 31 2e 31 37 20 7b 0a 20 20 65 78 65 63  b1-1.17 {.  exec
1510: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
1520: 41 42 4c 45 20 74 72 65 61 6c 3b 0a 20 20 20 20  ABLE treal;.    
1530: 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 6d 73  DROP TABLE logms
1540: 67 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 71  g;.    SELECT sq
1550: 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
1560: 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  ster;.  }.} {}..
1570: 23 2d 2d 2d 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 0a 23 20 54 65 73 74 20 63  -------.# Test c
15c0: 61 73 65 73 20 76 74 61 62 31 2e 32 2e 2a 0a 23  ases vtab1.2.*.#
15d0: 0a 23 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  .# At this point
15e0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  , the database i
15f0: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
1600: 74 79 2e 20 54 68 65 20 65 63 68 6f 20 6d 6f 64  ty. The echo mod
1610: 75 6c 65 0a 23 20 68 61 73 20 61 6c 72 65 61 64  ule.# has alread
1620: 79 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65  y been registere
1630: 64 2e 0a 0a 23 20 49 66 20 61 20 73 69 6e 67 6c  d...# If a singl
1640: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70 61  e argument is pa
1650: 73 73 65 64 20 74 6f 20 74 68 65 20 65 63 68 6f  ssed to the echo
1660: 20 6d 6f 64 75 6c 65 20 64 75 72 69 6e 67 20 74   module during t
1670: 61 62 6c 65 0a 23 20 63 72 65 61 74 69 6f 6e 2c  able.# creation,
1680: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1690: 6f 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  o be the name of
16a0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
16b0: 73 61 6d 65 0a 23 20 64 61 74 61 62 61 73 65 2e  same.# database.
16c0: 20 54 68 65 20 65 63 68 6f 20 6d 6f 64 75 6c 65   The echo module
16d0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 73 65 74   attempts to set
16e0: 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74   the schema of t
16f0: 68 65 0a 23 20 6e 65 77 20 76 69 72 74 75 61 6c  he.# new virtual
1700: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 74 68 65   table to be the
1710: 20 73 61 6d 65 20 61 73 20 74 68 65 20 65 78 69   same as the exi
1720: 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 74  sting database t
1730: 61 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  able..#.do_test 
1740: 76 74 61 62 31 2d 32 2e 31 20 7b 0a 20 20 65 78  vtab1-2.1 {.  ex
1750: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
1760: 54 45 20 54 41 42 4c 45 20 74 65 6d 70 6c 61 74  TE TABLE templat
1770: 65 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 7d 0a  e(a, b, c);.  }.
1780: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
1790: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74 65  MA table_info(te
17a0: 6d 70 6c 61 74 65 29 3b 20 7d 0a 7d 20 5b 6c 69  mplate); }.} [li
17b0: 73 74 20 20 20 20 20 20 20 20 20 5c 0a 20 20 30  st         \.  0
17c0: 20 61 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20   a {} 0 {} 0 \. 
17d0: 20 31 20 62 20 7b 7d 20 30 20 7b 7d 20 30 20 5c   1 b {} 0 {} 0 \
17e0: 0a 20 20 32 20 63 20 7b 7d 20 30 20 7b 7d 20 30  .  2 c {} 0 {} 0
17f0: 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61   \.].do_test vta
1800: 62 31 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  b1-2.2 {.  execs
1810: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1820: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31  VIRTUAL TABLE t1
1830: 20 55 53 49 4e 47 20 65 63 68 6f 28 74 65 6d 70   USING echo(temp
1840: 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 65 78 65  late);.  }.  exe
1850: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 74 61  csql { PRAGMA ta
1860: 62 6c 65 5f 69 6e 66 6f 28 74 31 29 3b 20 7d 0a  ble_info(t1); }.
1870: 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20  } [list         
1880: 5c 0a 20 20 30 20 61 20 7b 7d 20 30 20 7b 7d 20  \.  0 a {} 0 {} 
1890: 30 20 5c 0a 20 20 31 20 62 20 7b 7d 20 30 20 7b  0 \.  1 b {} 0 {
18a0: 7d 20 30 20 5c 0a 20 20 32 20 63 20 7b 7d 20 30  } 0 \.  2 c {} 0
18b0: 20 7b 7d 20 30 20 5c 0a 5d 0a 0a 23 20 54 65 73   {} 0 \.]..# Tes
18c0: 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
18d0: 61 73 65 20 63 61 6e 20 62 65 20 75 6e 6c 6f 61  ase can be unloa
18e0: 64 65 64 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ded. This should
18f0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 78 44 69 73   invoke the xDis
1900: 63 6f 6e 6e 65 63 74 28 29 0a 23 20 63 61 6c 6c  connect().# call
1910: 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 75 63  back for the suc
1920: 63 65 73 73 66 75 6c 6c 79 20 63 72 65 61 74 65  cessfully create
1930: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 28   virtual table (
1940: 74 31 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76  t1)..#.do_test v
1950: 74 61 62 31 2d 32 2e 33 20 7b 0a 20 20 73 65 74  tab1-2.3 {.  set
1960: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 6c 69   echo_module [li
1970: 73 74 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  st].  db close. 
1980: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
1990: 0a 7d 20 5b 6c 69 73 74 20 78 44 69 73 63 6f 6e  .} [list xDiscon
19a0: 6e 65 63 74 5d 0a 0a 23 20 52 65 2d 6f 70 65 6e  nect]..# Re-open
19b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54   the database. T
19c0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  his should not c
19d0: 61 75 73 65 20 61 6e 79 20 76 69 72 74 75 61 6c  ause any virtual
19e0: 20 6d 65 74 68 6f 64 73 20 74 6f 20 0a 23 20 62   methods to .# b
19f0: 65 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 69 6e  e called. The in
1a00: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 78 43 6f 6e  vocation of xCon
1a10: 6e 65 63 74 28 29 20 69 73 20 64 65 6c 61 79 65  nect() is delaye
1a20: 64 20 75 6e 74 69 6c 20 74 68 65 20 76 69 72 74  d until the virt
1a30: 75 61 6c 0a 23 20 74 61 62 6c 65 20 73 63 68 65  ual.# table sche
1a40: 6d 61 20 69 73 20 66 69 72 73 74 20 72 65 71 75  ma is first requ
1a50: 69 72 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  ired by the comp
1a60: 69 6c 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  iler..#.do_test 
1a70: 76 74 61 62 31 2d 32 2e 34 20 7b 0a 20 20 73 65  vtab1-2.4 {.  se
1a80: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 6c  t echo_module [l
1a90: 69 73 74 5d 0a 20 20 73 71 6c 69 74 65 33 20 64  ist].  sqlite3 d
1aa0: 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 63  b test.db.  db c
1ab0: 61 63 68 65 20 73 69 7a 65 20 30 0a 20 20 73 65  ache size 0.  se
1ac0: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20  t echo_module.} 
1ad0: 7b 7d 0a 0a 23 20 54 72 79 20 74 6f 20 71 75 65  {}..# Try to que
1ae0: 72 79 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  ry the virtual t
1af0: 61 62 6c 65 20 73 63 68 65 6d 61 2e 20 54 68 69  able schema. Thi
1b00: 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2c 20 61  s should fail, a
1b10: 73 20 74 68 65 0a 23 20 65 63 68 6f 20 6d 6f 64  s the.# echo mod
1b20: 75 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ule has not been
1b30: 20 72 65 67 69 73 74 65 72 65 64 20 77 69 74 68   registered with
1b40: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
1b50: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f  onnection..#.do_
1b60: 74 65 73 74 20 76 74 61 62 31 2e 32 2e 36 20 7b  test vtab1.2.6 {
1b70: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52  .  catchsql { PR
1b80: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
1b90: 74 31 29 3b 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20  t1); }.} {1 {no 
1ba0: 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68  such module: ech
1bb0: 6f 7d 7d 0a 0a 23 20 52 65 67 69 73 74 65 72 20  o}}..# Register 
1bc0: 74 68 65 20 6d 6f 64 75 6c 65 0a 72 65 67 69 73  the module.regis
1bd0: 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  ter_echo_module 
1be0: 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74  [sqlite3_connect
1bf0: 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a  ion_pointer db].
1c00: 0a 23 20 54 72 79 20 74 6f 20 71 75 65 72 79 20  .# Try to query 
1c10: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1c20: 65 20 73 63 68 65 6d 61 20 61 67 61 69 6e 2e 20  e schema again. 
1c30: 54 68 69 73 20 74 69 6d 65 20 69 74 20 73 68 6f  This time it sho
1c40: 75 6c 64 0a 23 20 69 6e 76 6f 6b 65 20 74 68 65  uld.# invoke the
1c50: 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f 64   xConnect method
1c60: 20 61 6e 64 20 73 75 63 63 65 65 64 2e 0a 23 0a   and succeed..#.
1c70: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 32 2e  do_test vtab1.2.
1c80: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  7 {.  execsql { 
1c90: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
1ca0: 6f 28 74 31 29 3b 20 7d 0a 7d 20 5b 6c 69 73 74  o(t1); }.} [list
1cb0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 30 20 61           \.  0 a
1cc0: 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20 20 31   {} 0 {} 0 \.  1
1cd0: 20 62 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20   b {} 0 {} 0 \. 
1ce0: 20 32 20 63 20 7b 7d 20 30 20 7b 7d 20 30 20 5c   2 c {} 0 {} 0 \
1cf0: 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  .].do_test vtab1
1d00: 2e 32 2e 38 20 7b 0a 20 20 73 65 74 20 65 63 68  .2.8 {.  set ech
1d10: 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 7b 78 43 6f 6e  o_module.} {xCon
1d20: 6e 65 63 74 20 65 63 68 6f 20 6d 61 69 6e 20 74  nect echo main t
1d30: 31 20 74 65 6d 70 6c 61 74 65 7d 0a 0a 23 20 44  1 template}..# D
1d40: 72 6f 70 20 74 61 62 6c 65 20 74 31 2e 20 54 68  rop table t1. Th
1d50: 69 73 20 73 68 6f 75 6c 64 20 63 61 75 73 65 20  is should cause 
1d60: 74 68 65 20 78 44 65 73 74 72 6f 79 20 28 62 75  the xDestroy (bu
1d70: 74 20 6e 6f 74 20 78 44 69 73 63 6f 6e 6e 65 63  t not xDisconnec
1d80: 74 29 20 6d 65 74 68 6f 64 20 0a 23 20 74 6f 20  t) method .# to 
1d90: 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 64 6f 5f 74  be invoked..do_t
1da0: 65 73 74 20 76 74 61 62 31 2d 32 2e 35 20 7b 0a  est vtab1-2.5 {.
1db0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
1dc0: 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b  e "".  execsql {
1dd0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
1de0: 74 31 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63  t1;.  }.  set ec
1df0: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 7b 78 44 65  ho_module.} {xDe
1e00: 73 74 72 6f 79 7d 0a 0a 64 6f 5f 74 65 73 74 20  stroy}..do_test 
1e10: 76 74 61 62 31 2d 32 2e 36 20 7b 0a 20 20 65 78  vtab1-2.6 {.  ex
1e20: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
1e30: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74  GMA table_info(t
1e40: 31 29 3b 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  1); .  }.} {}.do
1e50: 5f 74 65 73 74 20 76 74 61 62 31 2d 32 2e 37 20  _test vtab1-2.7 
1e60: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1e70: 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f    SELECT sql FRO
1e80: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
1e90: 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 7b 43 52  .  }.} [list {CR
1ea0: 45 41 54 45 20 54 41 42 4c 45 20 74 65 6d 70 6c  EATE TABLE templ
1eb0: 61 74 65 28 61 2c 20 62 2c 20 63 29 7d 5d 0a 23  ate(a, b, c)}].#
1ec0: 20 43 6c 65 61 6e 20 75 70 20 6f 74 68 65 72 20   Clean up other 
1ed0: 74 65 73 74 20 61 72 74 69 66 61 63 74 73 3a 0a  test artifacts:.
1ee0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32 2e  do_test vtab1-2.
1ef0: 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  8 {.  execsql { 
1f00: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
1f10: 74 65 6d 70 6c 61 74 65 3b 0a 20 20 20 20 53 45  template;.    SE
1f20: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
1f30: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d  lite_master;.  }
1f40: 0a 7d 20 5b 6c 69 73 74 5d 0a 0a 23 2d 2d 2d 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 0a 23 20 54 65 73 74 20 63 61 73 65 20 76  --.# Test case v
1fa0: 74 61 62 31 2d 33 20 74 65 73 74 20 74 61 62 6c  tab1-3 test tabl
1fb0: 65 20 73 63 61 6e 73 20 61 6e 64 20 74 68 65 20  e scans and the 
1fc0: 65 63 68 6f 20 6d 6f 64 75 6c 65 27 73 20 0a 23  echo module's .#
1fd0: 20 78 42 65 73 74 49 6e 64 65 78 2f 78 46 69 6c   xBestIndex/xFil
1fe0: 74 65 72 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  ter handling of 
1ff0: 57 48 45 52 45 20 63 6f 6e 64 69 74 69 6f 6e 73  WHERE conditions
2000: 2e 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  ...do_test vtab1
2010: 2d 33 2e 31 20 7b 0a 20 20 73 65 74 20 65 63 68  -3.1 {.  set ech
2020: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78  o_module "".  ex
2030: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
2040: 54 45 20 54 41 42 4c 45 20 74 72 65 61 6c 28 61  TE TABLE treal(a
2050: 20 49 4e 54 45 47 45 52 2c 20 62 20 49 4e 54 45   INTEGER, b INTE
2060: 47 45 52 2c 20 63 29 3b 20 0a 20 20 20 20 43 52  GER, c); .    CR
2070: 45 41 54 45 20 49 4e 44 45 58 20 74 72 65 61 6c  EATE INDEX treal
2080: 5f 69 64 78 20 4f 4e 20 74 72 65 61 6c 28 62 29  _idx ON treal(b)
2090: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  ;.    CREATE VIR
20a0: 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53  TUAL TABLE t1 US
20b0: 49 4e 47 20 65 63 68 6f 28 74 72 65 61 6c 29 3b  ING echo(treal);
20c0: 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f  .  }.  set echo_
20d0: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78  module.} [list x
20e0: 43 72 65 61 74 65 20 65 63 68 6f 20 6d 61 69 6e  Create echo main
20f0: 20 74 31 20 74 72 65 61 6c 20 20 20 5c 0a 20 20   t1 treal   \.  
2100: 20 20 20 20 20 20 78 53 79 6e 63 20 20 20 65 63        xSync   ec
2110: 68 6f 28 74 72 65 61 6c 29 20 20 5c 0a 20 20 20  ho(treal)  \.   
2120: 20 20 20 20 20 78 43 6f 6d 6d 69 74 20 65 63 68       xCommit ech
2130: 6f 28 74 72 65 61 6c 29 20 20 5c 0a 5d 0a 0a 23  o(treal)  \.]..#
2140: 20 54 65 73 74 20 74 68 61 74 20 61 20 53 45 4c   Test that a SEL
2150: 45 43 54 20 6f 6e 20 74 31 20 64 6f 65 73 6e 27  ECT on t1 doesn'
2160: 74 20 63 72 61 73 68 2e 20 4e 6f 20 72 6f 77 73  t crash. No rows
2170: 20 61 72 65 20 72 65 74 75 72 6e 65 64 0a 23 20   are returned.# 
2180: 62 65 63 61 75 73 65 20 74 68 65 20 75 6e 64 65  because the unde
2190: 72 6c 79 69 6e 67 20 72 65 61 6c 20 74 61 62 6c  rlying real tabl
21a0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  e is currently e
21b0: 6d 70 74 79 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  mpty..#.do_test 
21c0: 76 74 61 62 31 2d 33 2e 32 20 7b 0a 20 20 65 78  vtab1-3.2 {.  ex
21d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
21e0: 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
21f0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  t1;.  }.} {}..# 
2200: 50 75 74 20 73 6f 6d 65 20 64 61 74 61 20 69 6e  Put some data in
2210: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 72 65  to the table tre
2220: 61 6c 2e 20 54 68 65 6e 20 74 72 79 20 61 20 66  al. Then try a f
2230: 65 77 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54  ew simple SELECT
2240: 20 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20 6f   .# statements o
2250: 6e 20 74 31 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  n t1..#.do_test 
2260: 76 74 61 62 31 2d 33 2e 33 20 7b 0a 20 20 65 78  vtab1-3.3 {.  ex
2270: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
2280: 52 54 20 49 4e 54 4f 20 74 72 65 61 6c 20 56 41  RT INTO treal VA
2290: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
22a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
22b0: 72 65 61 6c 20 56 41 4c 55 45 53 28 34 2c 20 35  real VALUES(4, 5
22c0: 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  , 6);.    SELECT
22d0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
22e0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
22f0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e  do_test vtab1-3.
2300: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
2310: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
2320: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 34  M t1;.  }.} {1 4
2330: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
2340: 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.5 {.  execsql 
2350: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77  {.    SELECT row
2360: 69 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  id FROM t1;.  }.
2370: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
2380: 76 74 61 62 31 2d 33 2e 36 20 7b 0a 20 20 73 65  vtab1-3.6 {.  se
2390: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22  t echo_module ""
23a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
23b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
23c0: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20  1;.  }.} {1 2 3 
23d0: 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76  4 5 6}.do_test v
23e0: 74 61 62 31 2d 33 2e 37 20 7b 0a 20 20 65 78 65  tab1-3.7 {.  exe
23f0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2400: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
2410: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20 32  t1;.  }.} {1 1 2
2420: 20 33 20 32 20 34 20 35 20 36 7d 0a 64 6f 5f 74   3 2 4 5 6}.do_t
2430: 65 73 74 20 76 74 61 62 31 2d 33 2e 38 20 7b 0a  est vtab1-3.8 {.
2440: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2450: 53 45 4c 45 43 54 20 61 20 41 53 20 64 2c 20 62  SELECT a AS d, b
2460: 20 41 53 20 65 2c 20 63 20 41 53 20 66 20 46 52   AS e, c AS f FR
2470: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
2480: 32 20 33 20 34 20 35 20 36 7d 0a 0a 23 20 45 78  2 3 4 5 6}..# Ex
2490: 65 63 75 74 65 20 73 6f 6d 65 20 53 45 4c 45 43  ecute some SELEC
24a0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74  T statements wit
24b0: 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  h WHERE clauses 
24c0: 6f 6e 20 74 68 65 20 74 31 20 74 61 62 6c 65 2e  on the t1 table.
24d0: 0a 23 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  .# Then check th
24e0: 65 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 76 61  e echo_module va
24f0: 72 69 61 62 6c 65 20 28 77 72 69 74 74 65 6e 20  riable (written 
2500: 74 6f 20 62 79 20 74 68 65 20 6d 6f 64 75 6c 65  to by the module
2510: 20 6d 65 74 68 6f 64 73 0a 23 20 69 6e 20 74 65   methods.# in te
2520: 73 74 38 2e 63 29 20 74 6f 20 6d 61 6b 65 20 73  st8.c) to make s
2530: 75 72 65 20 74 68 65 20 78 42 65 73 74 49 6e 64  ure the xBestInd
2540: 65 78 28 29 20 61 6e 64 20 78 46 69 6c 74 65 72  ex() and xFilter
2550: 28 29 20 6d 65 74 68 6f 64 73 20 77 65 72 65 0a  () methods were.
2560: 23 20 63 61 6c 6c 65 64 20 63 6f 72 72 65 63 74  # called correct
2570: 6c 79 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74  ly..#.do_test vt
2580: 61 62 31 2d 33 2e 38 20 7b 0a 20 20 73 65 74 20  ab1-3.8 {.  set 
2590: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20  echo_module "". 
25a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
25b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
25c0: 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f  .  }.  set echo_
25d0: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78  module.} [list x
25e0: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43  BestIndex {SELEC
25f0: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
2600: 27 74 72 65 61 6c 27 7d 20 5c 0a 20 20 20 20 20  'treal'} \.     
2610: 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53     xFilter    {S
2620: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
2630: 52 4f 4d 20 27 74 72 65 61 6c 27 7d 20 5d 0a 64  ROM 'treal'} ].d
2640: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 39  o_test vtab1-3.9
2650: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
2660: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71  dule "".  execsq
2670: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
2680: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
2690: 20 3d 20 35 3b 0a 20 20 7d 0a 7d 20 7b 34 20 35   = 5;.  }.} {4 5
26a0: 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62   6}.do_test vtab
26b0: 31 2d 33 2e 31 30 20 7b 0a 20 20 73 65 74 20 65  1-3.10 {.  set e
26c0: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69  cho_module.} [li
26d0: 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53  st xBestIndex {S
26e0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
26f0: 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52  ROM 'treal' WHER
2700: 45 20 62 20 3d 20 3f 7d 20 20 20 5c 0a 20 20 20  E b = ?}   \.   
2710: 20 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20       xFilter    
2720: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
2730: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48   FROM 'treal' WH
2740: 45 52 45 20 62 20 3d 20 3f 7d 20 35 20 5d 0a 64  ERE b = ?} 5 ].d
2750: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31  o_test vtab1-3.1
2760: 30 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  0 {.  set echo_m
2770: 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73  odule "".  execs
2780: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2790: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
27a0: 62 20 3e 3d 20 35 20 41 4e 44 20 62 20 3c 3d 20  b >= 5 AND b <= 
27b0: 31 30 3b 0a 20 20 7d 0a 7d 20 7b 34 20 35 20 36  10;.  }.} {4 5 6
27c0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
27d0: 33 2e 31 31 20 7b 0a 20 20 73 65 74 20 65 63 68  3.11 {.  set ech
27e0: 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74  o_module.} [list
27f0: 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c   xBestIndex {SEL
2800: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
2810: 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52 45 20  M 'treal' WHERE 
2820: 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c 3d 20  b >= ? AND b <= 
2830: 3f 7d 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20  ?}      \.      
2840: 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53 45    xFilter    {SE
2850: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
2860: 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52 45  OM 'treal' WHERE
2870: 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c 3d   b >= ? AND b <=
2880: 20 3f 7d 20 35 20 31 30 20 5d 0a 64 6f 5f 74 65   ?} 5 10 ].do_te
2890: 73 74 20 76 74 61 62 31 2d 33 2e 31 32 20 7b 0a  st vtab1-3.12 {.
28a0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
28b0: 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b  e "".  execsql {
28c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
28d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 42 45  OM t1 WHERE b BE
28e0: 54 57 45 45 4e 20 32 20 41 4e 44 20 31 30 3b 0a  TWEEN 2 AND 10;.
28f0: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35    }.} {1 2 3 4 5
2900: 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62   6}.do_test vtab
2910: 31 2d 33 2e 31 33 20 7b 0a 20 20 73 65 74 20 65  1-3.13 {.  set e
2920: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69  cho_module.} [li
2930: 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53  st xBestIndex {S
2940: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
2950: 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52  ROM 'treal' WHER
2960: 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c  E b >= ? AND b <
2970: 3d 20 3f 7d 20 20 20 20 20 20 5c 0a 20 20 20 20  = ?}      \.    
2980: 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b      xFilter    {
2990: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
29a0: 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45  FROM 'treal' WHE
29b0: 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20  RE b >= ? AND b 
29c0: 3c 3d 20 3f 7d 20 32 20 31 30 20 5d 0a 0a 23 20  <= ?} 2 10 ]..# 
29d0: 41 64 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 66  Add a function f
29e0: 6f 72 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65  or the MATCH ope
29f0: 72 61 74 6f 72 2e 20 45 76 65 72 79 74 68 69 6e  rator. Everythin
2a00: 67 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73  g always matches
2a10: 21 0a 23 70 72 6f 63 20 74 65 73 74 5f 6d 61 74  !.#proc test_mat
2a20: 63 68 20 7b 6c 68 73 20 72 68 73 7d 20 7b 0a 23  ch {lhs rhs} {.#
2a30: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 65 63 68 6f    lappend ::echo
2a40: 5f 6d 6f 64 75 6c 65 20 4d 41 54 43 48 20 24 6c  _module MATCH $l
2a50: 68 73 20 24 72 68 73 0a 23 20 20 72 65 74 75 72  hs $rhs.#  retur
2a60: 6e 20 31 0a 23 7d 0a 23 64 62 20 66 75 6e 63 74  n 1.#}.#db funct
2a70: 69 6f 6e 20 6d 61 74 63 68 20 74 65 73 74 5f 6d  ion match test_m
2a80: 61 74 63 68 0a 0a 73 65 74 20 65 63 68 6f 5f 6d  atch..set echo_m
2a90: 6f 64 75 6c 65 20 22 22 0a 64 6f 5f 74 65 73 74  odule "".do_test
2aa0: 20 76 74 61 62 31 2d 33 2e 31 32 20 7b 0a 20 20   vtab1-3.12 {.  
2ab0: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  set echo_module 
2ac0: 22 22 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  "".  catchsql {.
2ad0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2ae0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41 54  M t1 WHERE a MAT
2af0: 43 48 20 27 73 74 72 69 6e 67 27 3b 0a 20 20 7d  CH 'string';.  }
2b00: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
2b10: 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41   use function MA
2b20: 54 43 48 20 69 6e 20 74 68 65 20 72 65 71 75 65  TCH in the reque
2b30: 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 64  sted context}}.d
2b40: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31  o_test vtab1-3.1
2b50: 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  3 {.  set echo_m
2b60: 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42  odule.} [list xB
2b70: 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54  estIndex {SELECT
2b80: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
2b90: 74 72 65 61 6c 27 7d 20 5c 0a 20 20 20 20 20 20  treal'} \.      
2ba0: 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53 45    xFilter    {SE
2bb0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
2bc0: 4f 4d 20 27 74 72 65 61 6c 27 7d 5d 0a 69 66 63  OM 'treal'}].ifc
2bd0: 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79 20  apable subquery 
2be0: 7b 0a 23 20 54 68 65 20 65 63 68 6f 20 6d 6f 64  {.# The echo mod
2bf0: 75 6c 65 20 75 73 65 73 20 61 20 73 75 62 71 75  ule uses a subqu
2c00: 65 72 79 20 69 6e 74 65 72 6e 61 6c 6c 79 20 74  ery internally t
2c10: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2c20: 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 0a  MATCH operator..
2c30: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e  do_test vtab1-3.
2c40: 31 34 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  14 {.  set echo_
2c50: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63  module "".  exec
2c60: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
2c70: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2c80: 20 62 20 4d 41 54 43 48 20 27 73 74 72 69 6e 67   b MATCH 'string
2c90: 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  ';.  }.} {}.do_t
2ca0: 65 73 74 20 76 74 61 62 31 2d 33 2e 31 35 20 7b  est vtab1-3.15 {
2cb0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
2cc0: 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74  le.} [list xBest
2cd0: 49 6e 64 65 78 20 5c 0a 20 20 20 20 20 20 20 20  Index \.        
2ce0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
2cf0: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48   FROM 'treal' WH
2d00: 45 52 45 20 62 20 4c 49 4b 45 20 28 53 45 4c 45  ERE b LIKE (SELE
2d10: 43 54 20 27 25 27 7c 7c 3f 7c 7c 27 25 27 29 7d  CT '%'||?||'%')}
2d20: 20 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c    \.        xFil
2d30: 74 65 72 20 5c 0a 20 20 20 20 20 20 20 20 7b 53  ter \.        {S
2d40: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
2d50: 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52  ROM 'treal' WHER
2d60: 45 20 62 20 4c 49 4b 45 20 28 53 45 4c 45 43 54  E b LIKE (SELECT
2d70: 20 27 25 27 7c 7c 3f 7c 7c 27 25 27 29 7d 20 5c   '%'||?||'%')} \
2d80: 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20  .        string 
2d90: 5d 0a 7d 3b 20 23 69 66 63 61 70 61 62 6c 65 20  ].}; #ifcapable 
2da0: 73 75 62 71 75 65 72 79 0a 0a 23 2d 2d 2d 2d 2d  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 0a 23 20 54 65 73 74 20 63 61 73 65 20 76 74  -.# Test case vt
2e00: 61 62 31 2d 33 20 74 65 73 74 20 74 61 62 6c 65  ab1-3 test table
2e10: 20 73 63 61 6e 73 20 61 6e 64 20 74 68 65 20 65   scans and the e
2e20: 63 68 6f 20 6d 6f 64 75 6c 65 27 73 20 0a 23 20  cho module's .# 
2e30: 78 42 65 73 74 49 6e 64 65 78 2f 78 46 69 6c 74  xBestIndex/xFilt
2e40: 65 72 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 4f  er handling of O
2e50: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
2e60: 0a 0a 23 20 54 68 69 73 20 70 72 6f 63 65 64 75  ..# This procedu
2e70: 72 65 20 65 78 65 63 75 74 65 73 20 74 68 65 20  re executes the 
2e80: 53 51 4c 2e 20 20 54 68 65 6e 20 69 74 20 63 68  SQL.  Then it ch
2e90: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
2ea0: 68 65 20 4f 50 5f 53 6f 72 74 0a 23 20 6f 70 63  he OP_Sort.# opc
2eb0: 6f 64 65 20 77 61 73 20 65 78 65 63 75 74 65 64  ode was executed
2ec0: 2e 20 20 49 66 20 61 6e 20 4f 50 5f 53 6f 72 74  .  If an OP_Sort
2ed0: 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65 6e   did occur, then
2ee0: 20 22 73 6f 72 74 22 20 69 73 20 61 70 70 65 6e   "sort" is appen
2ef0: 64 65 64 0a 23 20 74 6f 20 74 68 65 20 72 65 73  ded.# to the res
2f00: 75 6c 74 2e 20 20 49 66 20 6e 6f 20 4f 50 5f 53  ult.  If no OP_S
2f10: 6f 72 74 20 68 61 70 70 65 6e 65 64 2c 20 74 68  ort happened, th
2f20: 65 6e 20 22 6e 6f 73 6f 72 74 22 20 69 73 20 61  en "nosort" is a
2f30: 70 70 65 6e 64 65 64 2e 0a 23 0a 23 20 54 68 69  ppended..#.# Thi
2f40: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 75  s procedure is u
2f50: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  sed to check to 
2f60: 6d 61 6b 65 20 73 75 72 65 20 73 6f 72 74 69 6e  make sure sortin
2f70: 67 20 69 73 20 6f 72 20 69 73 20 6e 6f 74 0a 23  g is or is not.#
2f80: 20 6f 63 63 75 72 72 69 6e 67 20 61 73 20 65 78   occurring as ex
2f90: 70 65 63 74 65 64 2e 0a 23 0a 70 72 6f 63 20 63  pected..#.proc c
2fa0: 6b 73 6f 72 74 20 7b 73 71 6c 7d 20 7b 0a 20 20  ksort {sql} {.  
2fb0: 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 73 6f 72  set ::sqlite_sor
2fc0: 74 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20  t_count 0.  set 
2fd0: 64 61 74 61 20 5b 65 78 65 63 73 71 6c 20 24 73  data [execsql $s
2fe0: 71 6c 5d 0a 20 20 69 66 20 7b 24 3a 3a 73 71 6c  ql].  if {$::sql
2ff0: 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 7d 20  ite_sort_count} 
3000: 7b 73 65 74 20 78 20 73 6f 72 74 7d 20 7b 73 65  {set x sort} {se
3010: 74 20 78 20 6e 6f 73 6f 72 74 7d 0a 20 20 6c 61  t x nosort}.  la
3020: 70 70 65 6e 64 20 64 61 74 61 20 24 78 0a 20 20  ppend data $x.  
3030: 72 65 74 75 72 6e 20 24 64 61 74 61 0a 7d 0a 0a  return $data.}..
3040: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 34 2e  do_test vtab1-4.
3050: 31 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  1 {.  set echo_m
3060: 6f 64 75 6c 65 20 22 22 0a 20 20 63 6b 73 6f 72  odule "".  cksor
3070: 74 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62  t {.    SELECT b
3080: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
3090: 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b 32 20 35 20  Y b;.  }.} {2 5 
30a0: 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20  nosort}.do_test 
30b0: 76 74 61 62 31 2d 34 2e 32 20 7b 0a 20 20 73 65  vtab1-4.2 {.  se
30c0: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20  t echo_module.} 
30d0: 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 78  [list xBestIndex
30e0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
30f0: 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f  * FROM 'treal' O
3100: 52 44 45 52 20 42 59 20 62 20 41 53 43 7d 20 5c  RDER BY b ASC} \
3110: 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74 65 72  .        xFilter
3120: 20 20 20 20 7b 53 45 4c 45 43 54 20 72 6f 77 69      {SELECT rowi
3130: 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c  d, * FROM 'treal
3140: 27 20 4f 52 44 45 52 20 42 59 20 62 20 41 53 43  ' ORDER BY b ASC
3150: 7d 20 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  } ].do_test vtab
3160: 31 2d 34 2e 33 20 7b 0a 20 20 73 65 74 20 65 63  1-4.3 {.  set ec
3170: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63  ho_module "".  c
3180: 6b 73 6f 72 74 20 7b 0a 20 20 20 20 53 45 4c 45  ksort {.    SELE
3190: 43 54 20 62 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT b FROM t1 ORD
31a0: 45 52 20 42 59 20 62 20 44 45 53 43 3b 0a 20 20  ER BY b DESC;.  
31b0: 7d 0a 7d 20 7b 35 20 32 20 6e 6f 73 6f 72 74 7d  }.} {5 2 nosort}
31c0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 34  .do_test vtab1-4
31d0: 2e 34 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  .4 {.  set echo_
31e0: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78  module.} [list x
31f0: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43  BestIndex {SELEC
3200: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
3210: 27 74 72 65 61 6c 27 20 4f 52 44 45 52 20 42 59  'treal' ORDER BY
3220: 20 62 20 44 45 53 43 7d 20 5c 0a 20 20 20 20 20   b DESC} \.     
3230: 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53     xFilter    {S
3240: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
3250: 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52 44 45  ROM 'treal' ORDE
3260: 52 20 42 59 20 62 20 44 45 53 43 7d 20 5d 0a 64  R BY b DESC} ].d
3270: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 34 2e 33  o_test vtab1-4.3
3280: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
3290: 64 75 6c 65 20 22 22 0a 20 20 63 6b 73 6f 72 74  dule "".  cksort
32a0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20   {.    SELECT b 
32b0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
32c0: 20 62 7c 7c 27 27 3b 0a 20 20 7d 0a 7d 20 7b 32   b||'';.  }.} {2
32d0: 20 35 20 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74   5 sort}.do_test
32e0: 20 76 74 61 62 31 2d 34 2e 34 20 7b 0a 20 20 73   vtab1-4.4 {.  s
32f0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d  et echo_module.}
3300: 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65   [list xBestInde
3310: 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  x {SELECT rowid,
3320: 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 7d   * FROM 'treal'}
3330: 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74   \.        xFilt
3340: 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72 6f  er    {SELECT ro
3350: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65  wid, * FROM 'tre
3360: 61 6c 27 7d 20 5d 0a 0a 65 78 65 63 73 71 6c 20  al'} ]..execsql 
3370: 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74  {.  DROP TABLE t
3380: 31 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20  1;.  DROP TABLE 
3390: 74 72 65 61 6c 3b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  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 0a 23 20 54 65 73 74 20 63 61 73 65 73 20 76  -.# Test cases v
33f0: 74 61 62 31 2d 35 20 74 65 73 74 20 53 45 4c 45  tab1-5 test SELE
3400: 43 54 20 71 75 65 72 69 65 73 20 74 68 61 74 20  CT queries that 
3410: 69 6e 63 6c 75 64 65 20 6a 6f 69 6e 73 20 6f 6e  include joins on
3420: 20 76 69 72 74 75 61 6c 20 0a 23 20 74 61 62 6c   virtual .# tabl
3430: 65 73 2e 0a 0a 70 72 6f 63 20 66 69 6c 74 65 72  es...proc filter
3440: 20 7b 6c 6f 67 7d 20 7b 0a 20 20 73 65 74 20 6f   {log} {.  set o
3450: 75 74 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 20  ut [list].  for 
3460: 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69 20  {set ii 0} {$ii 
3470: 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 6c 6f 67 5d  < [llength $log]
3480: 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20  } {incr ii} {.  
3490: 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 24 6c    if {[lindex $l
34a0: 6f 67 20 24 69 69 5d 20 65 71 20 22 78 46 69 6c  og $ii] eq "xFil
34b0: 74 65 72 22 7d 20 7b 0a 20 20 20 20 20 20 6c 61  ter"} {.      la
34c0: 70 70 65 6e 64 20 6f 75 74 20 78 46 69 6c 74 65  ppend out xFilte
34d0: 72 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  r.      lappend 
34e0: 6f 75 74 20 5b 6c 69 6e 64 65 78 20 24 6c 6f 67  out [lindex $log
34f0: 20 5b 65 78 70 72 20 24 69 69 2b 31 5d 5d 0a 20   [expr $ii+1]]. 
3500: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3510: 6e 20 24 6f 75 74 0a 7d 0a 0a 64 6f 5f 74 65 73  n $out.}..do_tes
3520: 74 20 76 74 61 62 31 2d 35 2d 31 20 7b 0a 20 20  t vtab1-5-1 {.  
3530: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43  execsql { .    C
3540: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
3550: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
3560: 41 54 45 20 54 41 42 4c 45 20 74 32 28 64 2c 20  ATE TABLE t2(d, 
3570: 65 2c 20 66 29 3b 0a 20 20 20 20 49 4e 53 45 52  e, f);.    INSER
3580: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3590: 28 31 2c 20 27 72 65 64 27 2c 20 27 67 72 65 65  (1, 'red', 'gree
35a0: 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  n');.    INSERT 
35b0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
35c0: 2c 20 27 62 6c 75 65 27 2c 20 27 62 6c 61 63 6b  , 'blue', 'black
35d0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
35e0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
35f0: 20 27 73 70 61 64 65 73 27 2c 20 27 63 6c 75 62   'spades', 'club
3600: 73 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  s');.    INSERT 
3610: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32  INTO t2 VALUES(2
3620: 2c 20 27 68 65 61 72 74 73 27 2c 20 27 64 69 61  , 'hearts', 'dia
3630: 6d 6f 6e 64 73 27 29 3b 0a 20 20 20 20 43 52 45  monds');.    CRE
3640: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
3650: 45 20 65 74 31 20 55 53 49 4e 47 20 65 63 68 6f  E et1 USING echo
3660: 28 74 31 29 3b 0a 20 20 20 20 43 52 45 41 54 45  (t1);.    CREATE
3670: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65   VIRTUAL TABLE e
3680: 74 32 20 55 53 49 4e 47 20 65 63 68 6f 28 74 32  t2 USING echo(t2
3690: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  );.  }.} {}..do_
36a0: 74 65 73 74 20 76 74 61 62 31 2d 35 2d 32 20 7b  test vtab1-5-2 {
36b0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
36c0: 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  le "".  execsql 
36d0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
36e0: 52 4f 4d 20 65 74 31 2c 20 65 74 32 3b 0a 20 20  ROM et1, et2;.  
36f0: 7d 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 31 20  }.} [list \.  1 
3700: 72 65 64 20 67 72 65 65 6e 20 31 20 73 70 61 64  red green 1 spad
3710: 65 73 20 63 6c 75 62 73 20 20 20 20 20 5c 0a 20  es clubs     \. 
3720: 20 31 20 72 65 64 20 67 72 65 65 6e 20 32 20 68   1 red green 2 h
3730: 65 61 72 74 73 20 64 69 61 6d 6f 6e 64 73 20 20  earts diamonds  
3740: 5c 0a 20 20 32 20 62 6c 75 65 20 62 6c 61 63 6b  \.  2 blue black
3750: 20 31 20 73 70 61 64 65 73 20 63 6c 75 62 73 20   1 spades clubs 
3760: 20 20 20 5c 0a 20 20 32 20 62 6c 75 65 20 62 6c     \.  2 blue bl
3770: 61 63 6b 20 32 20 68 65 61 72 74 73 20 64 69 61  ack 2 hearts dia
3780: 6d 6f 6e 64 73 20 5c 0a 5d 0a 64 6f 5f 74 65 73  monds \.].do_tes
3790: 74 20 76 74 61 62 31 2d 35 2d 33 20 7b 0a 20 20  t vtab1-5-3 {.  
37a0: 66 69 6c 74 65 72 20 24 65 63 68 6f 5f 6d 6f 64  filter $echo_mod
37b0: 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20  ule.} [list \.  
37c0: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20  xFilter {SELECT 
37d0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74  rowid, * FROM 't
37e0: 31 27 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20  1'} \.  xFilter 
37f0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
3800: 20 46 52 4f 4d 20 27 74 32 27 7d 20 5c 0a 20 20   FROM 't2'} \.  
3810: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20  xFilter {SELECT 
3820: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74  rowid, * FROM 't
3830: 32 27 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20  2'} \.].do_test 
3840: 76 74 61 62 31 2d 35 2d 34 20 7b 0a 20 20 73 65  vtab1-5-4 {.  se
3850: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22  t echo_module ""
3860: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3870: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65   SELECT * FROM e
3880: 74 31 2c 20 65 74 32 20 57 48 45 52 45 20 65 74  t1, et2 WHERE et
3890: 32 2e 64 20 3d 20 32 3b 0a 20 20 7d 0a 7d 20 5b  2.d = 2;.  }.} [
38a0: 6c 69 73 74 20 5c 0a 20 20 31 20 72 65 64 20 67  list \.  1 red g
38b0: 72 65 65 6e 20 32 20 68 65 61 72 74 73 20 64 69  reen 2 hearts di
38c0: 61 6d 6f 6e 64 73 20 20 5c 0a 20 20 32 20 62 6c  amonds  \.  2 bl
38d0: 75 65 20 62 6c 61 63 6b 20 32 20 68 65 61 72 74  ue black 2 heart
38e0: 73 20 64 69 61 6d 6f 6e 64 73 20 5c 0a 5d 0a 64  s diamonds \.].d
38f0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d 35  o_test vtab1-5-5
3900: 20 7b 0a 20 20 66 69 6c 74 65 72 20 24 65 63 68   {.  filter $ech
3910: 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74  o_module.} [list
3920: 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45   \.  xFilter {SE
3930: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
3940: 4f 4d 20 27 74 31 27 7d 20 5c 0a 20 20 78 46 69  OM 't1'} \.  xFi
3950: 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77  lter {SELECT row
3960: 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 32 27 7d  id, * FROM 't2'}
3970: 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45   \.  xFilter {SE
3980: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
3990: 4f 4d 20 27 74 32 27 7d 20 5c 0a 5d 0a 64 6f 5f  OM 't2'} \.].do_
39a0: 74 65 73 74 20 76 74 61 62 31 2d 35 2d 36 20 7b  test vtab1-5-6 {
39b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
39c0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
39d0: 20 4f 4e 20 74 32 28 64 29 3b 0a 20 20 7d 0a 0a   ON t2(d);.  }..
39e0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c    db close.  sql
39f0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
3a00: 20 20 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f    register_echo_
3a10: 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f  module [sqlite3_
3a20: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74  connection_point
3a30: 65 72 20 64 62 5d 0a 0a 20 20 73 65 74 20 3a 3a  er db]..  set ::
3a40: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20  echo_module "". 
3a50: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
3a60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 74 31  ELECT * FROM et1
3a70: 2c 20 65 74 32 20 57 48 45 52 45 20 65 74 32 2e  , et2 WHERE et2.
3a80: 64 20 3d 20 32 3b 0a 20 20 7d 0a 7d 20 5b 6c 69  d = 2;.  }.} [li
3a90: 73 74 20 5c 0a 20 20 31 20 72 65 64 20 67 72 65  st \.  1 red gre
3aa0: 65 6e 20 32 20 68 65 61 72 74 73 20 64 69 61 6d  en 2 hearts diam
3ab0: 6f 6e 64 73 20 20 5c 0a 20 20 32 20 62 6c 75 65  onds  \.  2 blue
3ac0: 20 62 6c 61 63 6b 20 32 20 68 65 61 72 74 73 20   black 2 hearts 
3ad0: 64 69 61 6d 6f 6e 64 73 20 5c 0a 5d 0a 64 6f 5f  diamonds \.].do_
3ae0: 74 65 73 74 20 76 74 61 62 31 2d 35 2d 37 20 7b  test vtab1-5-7 {
3af0: 0a 20 20 66 69 6c 74 65 72 20 24 3a 3a 65 63 68  .  filter $::ech
3b00: 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74  o_module.} [list
3b10: 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45   \.  xFilter {SE
3b20: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
3b30: 4f 4d 20 27 74 32 27 20 57 48 45 52 45 20 64 20  OM 't2' WHERE d 
3b40: 3d 20 3f 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72  = ?} \.  xFilter
3b50: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
3b60: 2a 20 46 52 4f 4d 20 27 74 31 27 7d 20 20 20 20  * FROM 't1'}    
3b70: 20 20 20 20 20 20 20 20 20 5c 0a 5d 0a 0a 65 78           \.]..ex
3b80: 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54  ecsql {.  DROP T
3b90: 41 42 4c 45 20 74 31 3b 0a 20 20 44 52 4f 50 20  ABLE t1;.  DROP 
3ba0: 54 41 42 4c 45 20 74 32 3b 0a 20 20 44 52 4f 50  TABLE t2;.  DROP
3bb0: 20 54 41 42 4c 45 20 65 74 31 3b 0a 20 20 44 52   TABLE et1;.  DR
3bc0: 4f 50 20 54 41 42 4c 45 20 65 74 32 3b 0a 7d 0a  OP TABLE et2;.}.
3bd0: 0a 23 2d 2d 2d 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 0a 23 20 54 65 73 74 20  --------.# Test 
3c20: 63 61 73 65 73 20 76 74 61 62 31 2d 36 20 74 65  cases vtab1-6 te
3c30: 73 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  st INSERT, UPDAT
3c40: 45 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65  E and DELETE ope
3c50: 72 61 74 69 6f 6e 73 20 0a 23 20 6f 6e 20 76 69  rations .# on vi
3c60: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 64 6f  rtual tables..do
3c70: 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 31 20  _test vtab1-6-1 
3c80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
3c90: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
3ca0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a 7d 20  lite_master }.} 
3cb0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  {}.do_test vtab1
3cc0: 2d 36 2d 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6-2 {.  execsql
3cd0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
3ce0: 42 4c 45 20 74 72 65 61 6c 28 61 20 50 52 49 4d  BLE treal(a PRIM
3cf0: 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a  ARY KEY, b, c);.
3d00: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
3d10: 41 4c 20 54 41 42 4c 45 20 74 65 63 68 6f 20 55  AL TABLE techo U
3d20: 53 49 4e 47 20 65 63 68 6f 28 74 72 65 61 6c 29  SING echo(treal)
3d30: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d  ;.    SELECT nam
3d40: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
3d50: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20  ster WHERE type 
3d60: 3d 20 27 74 61 62 6c 65 27 3b 0a 20 20 7d 0a 7d  = 'table';.  }.}
3d70: 20 7b 74 72 65 61 6c 20 74 65 63 68 6f 7d 0a 64   {treal techo}.d
3d80: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 33  o_test vtab1-6-3
3d90: 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.1 {.  execsql
3da0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 6f   {.    PRAGMA co
3db0: 75 6e 74 5f 63 68 61 6e 67 65 73 3d 4f 4e 3b 0a  unt_changes=ON;.
3dc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3dd0: 74 65 63 68 6f 20 56 41 4c 55 45 53 28 31 2c 20  techo VALUES(1, 
3de0: 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 7d  2, 3);.  }.} {1}
3df0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36  .do_test vtab1-6
3e00: 2d 33 2e 31 2e 32 20 7b 0a 20 20 64 62 20 63 68  -3.1.2 {.  db ch
3e10: 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  anges.} {1}.do_t
3e20: 65 73 74 20 76 74 61 62 31 2d 36 2d 33 2e 32 20  est vtab1-6-3.2 
3e30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3e40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3e50: 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20  techo;.  }.} {1 
3e60: 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  2 3}.do_test vta
3e70: 62 31 2d 36 2d 34 2e 31 20 7b 0a 20 20 65 78 65  b1-6-4.1 {.  exe
3e80: 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  csql {.    UPDAT
3e90: 45 20 74 65 63 68 6f 20 53 45 54 20 61 20 3d 20  E techo SET a = 
3ea0: 35 3b 0a 20 20 7d 0a 20 20 64 62 20 63 68 61 6e  5;.  }.  db chan
3eb0: 67 65 73 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  ges.} {1}.do_tes
3ec0: 74 20 76 74 61 62 31 2d 36 2d 34 2e 32 20 7b 0a  t vtab1-6-4.2 {.
3ed0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3ee0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
3ef0: 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 35 20 32 20  cho;.  }.} {5 2 
3f00: 33 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  3}.do_test vtab1
3f10: 2d 36 2d 34 2e 33 20 7b 0a 20 20 65 78 65 63 73  -6-4.3 {.  execs
3f20: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
3f30: 74 65 63 68 6f 20 53 45 54 20 61 3d 36 20 57 48  techo SET a=6 WH
3f40: 45 52 45 20 61 3c 30 3b 0a 20 20 7d 0a 20 20 64  ERE a<0;.  }.  d
3f50: 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b 30 7d 0a  b changes.} {0}.
3f60: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d  do_test vtab1-6-
3f70: 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.4 {.  execsql 
3f80: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
3f90: 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d  ROM techo;.  }.}
3fa0: 20 7b 35 20 32 20 33 7d 0a 0a 64 6f 5f 74 65 73   {5 2 3}..do_tes
3fb0: 74 20 76 74 61 62 31 2d 36 2d 35 2e 31 20 7b 0a  t vtab1-6-5.1 {.
3fc0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 55 50   execsql {.   UP
3fd0: 44 41 54 45 20 74 65 63 68 6f 20 73 65 74 20 61  DATE techo set a
3fe0: 20 3d 20 61 7c 7c 62 7c 7c 63 3b 0a 20 7d 0a 20   = a||b||c;. }. 
3ff0: 64 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d  db changes.} {1}
4000: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36  .do_test vtab1-6
4010: 2d 35 2e 32 20 7b 0a 20 65 78 65 63 73 71 6c 20  -5.2 {. execsql 
4020: 7b 0a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  {.   SELECT * FR
4030: 4f 4d 20 74 65 63 68 6f 3b 0a 20 7d 0a 7d 20 7b  OM techo;. }.} {
4040: 35 32 33 20 32 20 33 7d 0a 0a 64 6f 5f 74 65 73  523 2 3}..do_tes
4050: 74 20 76 74 61 62 31 2d 36 2d 36 2e 31 20 7b 0a  t vtab1-6-6.1 {.
4060: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4070: 55 50 44 41 54 45 20 74 65 63 68 6f 20 73 65 74  UPDATE techo set
4080: 20 72 6f 77 69 64 20 3d 20 31 30 3b 0a 20 20 7d   rowid = 10;.  }
4090: 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20  .  db changes.} 
40a0: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  {1}.do_test vtab
40b0: 31 2d 36 2d 36 2e 32 20 7b 0a 20 20 65 78 65 63  1-6-6.2 {.  exec
40c0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
40d0: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 65 63 68   rowid FROM tech
40e0: 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 30 7d 0a 0a 64  o;.  }.} {10}..d
40f0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 37  o_test vtab1-6-7
4100: 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .1.1 {.  execsql
4110: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
4120: 54 4f 20 74 65 63 68 6f 20 56 41 4c 55 45 53 28  TO techo VALUES(
4130: 31 31 2c 31 32 2c 31 33 29 3b 0a 20 20 7d 0a 7d  11,12,13);.  }.}
4140: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   {1}.do_test vta
4150: 62 31 2d 36 2d 37 2e 31 2e 32 20 7b 0a 20 20 64  b1-6-7.1.2 {.  d
4160: 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a  b changes.} {1}.
4170: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d  do_test vtab1-6-
4180: 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.2 {.  execsql 
4190: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
41a0: 52 4f 4d 20 74 65 63 68 6f 20 4f 52 44 45 52 20  ROM techo ORDER 
41b0: 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 31 31 20  BY a;.  }.} {11 
41c0: 31 32 20 31 33 20 35 32 33 20 32 20 33 7d 0a 64  12 13 523 2 3}.d
41d0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 37  o_test vtab1-6-7
41e0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
41f0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 65 63 68  .    UPDATE tech
4200: 6f 20 53 45 54 20 62 3d 62 2b 31 30 30 30 0a 20  o SET b=b+1000. 
4210: 20 7d 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a   }.  db changes.
4220: 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 76 74  } {2}.do_test vt
4230: 61 62 31 2d 36 2d 37 2e 34 20 7b 0a 20 20 65 78  ab1-6-7.4 {.  ex
4240: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
4250: 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 20  CT * FROM techo 
4260: 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a  ORDER BY a;.  }.
4270: 7d 20 7b 31 31 20 31 30 31 32 20 31 33 20 35 32  } {11 1012 13 52
4280: 33 20 31 30 30 32 20 33 7d 0a 0a 0a 64 6f 5f 74  3 1002 3}...do_t
4290: 65 73 74 20 76 74 61 62 31 2d 36 2d 38 2e 31 20  est vtab1-6-8.1 
42a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
42b0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65    DELETE FROM te
42c0: 63 68 6f 20 57 48 45 52 45 20 61 3d 35 3b 0a 20  cho WHERE a=5;. 
42d0: 20 7d 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a   }.  db changes.
42e0: 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 76 74  } {0}.do_test vt
42f0: 61 62 31 2d 36 2d 38 2e 32 20 7b 0a 20 20 65 78  ab1-6-8.2 {.  ex
4300: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
4310: 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 20  CT * FROM techo 
4320: 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a  ORDER BY a;.  }.
4330: 7d 20 7b 31 31 20 31 30 31 32 20 31 33 20 35 32  } {11 1012 13 52
4340: 33 20 31 30 30 32 20 33 7d 0a 64 6f 5f 74 65 73  3 1002 3}.do_tes
4350: 74 20 76 74 61 62 31 2d 36 2d 38 2e 33 20 7b 0a  t vtab1-6-8.3 {.
4360: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4370: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 63 68  DELETE FROM tech
4380: 6f 3b 0a 20 20 7d 0a 20 20 64 62 20 63 68 61 6e  o;.  }.  db chan
4390: 67 65 73 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73  ges.} {2}.do_tes
43a0: 74 20 76 74 61 62 31 2d 36 2d 38 2e 34 20 7b 0a  t vtab1-6-8.4 {.
43b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
43c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
43d0: 63 68 6f 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  cho ORDER BY a;.
43e0: 20 20 7d 0a 7d 20 7b 7d 0a 65 78 65 63 73 71 6c    }.} {}.execsql
43f0: 20 7b 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63   {PRAGMA count_c
4400: 68 61 6e 67 65 73 3d 4f 46 46 7d 0a 0a 66 6f 72  hanges=OFF}..for
4410: 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64  cedelete test2.d
4420: 62 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65  b.forcedelete te
4430: 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 73  st2.db-journal.s
4440: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 32  qlite3 db2 test2
4450: 2e 64 62 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20  .db.execsql {.  
4460: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 63  CREATE TABLE tec
4470: 68 6f 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ho(a PRIMARY KEY
4480: 2c 20 62 2c 20 63 29 3b 0a 7d 20 64 62 32 0a 70  , b, c);.} db2.p
4490: 72 6f 63 20 63 68 65 63 6b 5f 65 63 68 6f 5f 74  roc check_echo_t
44a0: 61 62 6c 65 20 7b 74 6e 7d 20 7b 0a 20 20 73 65  able {tn} {.  se
44b0: 74 20 3a 3a 64 61 74 61 31 20 5b 65 78 65 63 73  t ::data1 [execs
44c0: 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  ql {SELECT rowid
44d0: 2c 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 7d 5d  , * FROM techo}]
44e0: 0a 20 20 73 65 74 20 3a 3a 64 61 74 61 32 20 5b  .  set ::data2 [
44f0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
4500: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 65  rowid, * FROM te
4510: 63 68 6f 7d 20 64 62 32 5d 0a 20 20 64 6f 5f 74  cho} db2].  do_t
4520: 65 73 74 20 24 74 6e 20 7b 0a 20 20 20 20 73 74  est $tn {.    st
4530: 72 69 6e 67 20 65 71 75 61 6c 20 24 3a 3a 64 61  ring equal $::da
4540: 74 61 31 20 24 3a 3a 64 61 74 61 32 0a 20 20 7d  ta1 $::data2.  }
4550: 20 31 0a 7d 0a 73 65 74 20 74 6e 20 30 0a 66 6f   1.}.set tn 0.fo
4560: 72 65 61 63 68 20 73 74 6d 74 20 5b 6c 69 73 74  reach stmt [list
4570: 20 5c 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54   \.  {INSERT INT
4580: 4f 20 74 65 63 68 6f 20 56 41 4c 55 45 53 28 27  O techo VALUES('
4590: 61 62 63 27 2c 20 27 64 65 66 27 2c 20 27 67 68  abc', 'def', 'gh
45a0: 69 27 29 7d 20 20 20 20 20 20 20 20 20 20 20 20  i')}            
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
45c0: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 63  {INSERT INTO tec
45d0: 68 6f 20 53 45 4c 45 43 54 20 61 7c 7c 27 2e 27  ho SELECT a||'.'
45e0: 7c 7c 72 6f 77 69 64 2c 20 62 2c 20 63 20 46 52  ||rowid, b, c FR
45f0: 4f 4d 20 74 65 63 68 6f 7d 20 20 20 20 20 20 20  OM techo}       
4600: 20 20 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53 45         \.  {INSE
4610: 52 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 53 45  RT INTO techo SE
4620: 4c 45 43 54 20 61 7c 7c 27 78 27 7c 7c 72 6f 77  LECT a||'x'||row
4630: 69 64 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 65  id, b, c FROM te
4640: 63 68 6f 7d 20 20 20 20 20 20 20 20 20 20 20 20  cho}            
4650: 20 20 5c 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e    \.  {INSERT IN
4660: 54 4f 20 74 65 63 68 6f 20 53 45 4c 45 43 54 20  TO techo SELECT 
4670: 61 7c 7c 27 79 27 7c 7c 72 6f 77 69 64 2c 20 62  a||'y'||rowid, b
4680: 2c 20 63 20 46 52 4f 4d 20 74 65 63 68 6f 7d 20  , c FROM techo} 
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
46a0: 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65   {DELETE FROM te
46b0: 63 68 6f 20 57 48 45 52 45 20 28 6f 69 64 20 25  cho WHERE (oid %
46c0: 20 33 29 20 3d 20 30 7d 20 20 20 20 20 20 20 20   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 5c 0a 20 20 7b 55 50 44          \.  {UPD
46f0: 41 54 45 20 74 65 63 68 6f 20 73 65 74 20 72 6f  ATE techo set ro
4700: 77 69 64 20 3d 20 31 30 30 20 57 48 45 52 45 20  wid = 100 WHERE 
4710: 72 6f 77 69 64 20 3d 20 31 7d 20 20 20 20 20 20  rowid = 1}      
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 5c 0a 20 20 7b 49 4e 53 45 52 54 20 49     \.  {INSERT I
4740: 4e 54 4f 20 74 65 63 68 6f 28 61 2c 20 62 29 20  NTO techo(a, b) 
4750: 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20  VALUES('hello', 
4760: 27 77 6f 72 6c 64 27 29 7d 20 20 20 20 20 20 20  'world')}       
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4780: 20 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74    {DELETE FROM t
4790: 65 63 68 6f 7d 20 20 20 20 20 20 20 20 20 20 20  echo}           
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 5c 0a 5d 20 7b 0a 20           \.] {. 
47d0: 20 65 78 65 63 73 71 6c 20 24 73 74 6d 74 0a 20   execsql $stmt. 
47e0: 20 65 78 65 63 73 71 6c 20 24 73 74 6d 74 20 64   execsql $stmt d
47f0: 62 32 0a 20 20 63 68 65 63 6b 5f 65 63 68 6f 5f  b2.  check_echo_
4800: 74 61 62 6c 65 20 76 74 61 62 31 2d 36 2e 38 2e  table vtab1-6.8.
4810: 5b 69 6e 63 72 20 74 6e 5d 0a 7d 0a 0a 64 62 32  [incr tn].}..db2
4820: 20 63 6c 6f 73 65 0a 0a 0a 0a 23 2d 2d 2d 2d 2d   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 0a 23 20 54 65 73 74 20 63 61 73 65 73 20 76  -.# Test cases v
4880: 74 61 62 31 2d 37 20 74 65 73 74 73 20 74 68 61  tab1-7 tests tha
4890: 74 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  t the value retu
48a0: 72 6e 65 64 20 62 79 20 0a 23 20 73 71 6c 69 74  rned by .# sqlit
48b0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
48c0: 6f 77 69 64 28 29 20 69 73 20 73 65 74 20 63 6f  owid() is set co
48d0: 72 72 65 63 74 6c 79 20 77 68 65 6e 20 72 6f 77  rrectly when row
48e0: 73 20 61 72 65 20 69 6e 73 65 72 74 65 64 0a 23  s are inserted.#
48f0: 20 69 6e 74 6f 20 76 69 72 74 75 61 6c 20 74 61   into virtual ta
4900: 62 6c 65 73 2e 0a 64 6f 5f 74 65 73 74 20 76 74  bles..do_test vt
4910: 61 62 31 2e 37 2d 31 20 7b 0a 20 20 65 78 65 63  ab1.7-1 {.  exec
4920: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
4930: 20 54 41 42 4c 45 20 72 65 61 6c 5f 61 62 63 28   TABLE real_abc(
4940: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
4950: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
4960: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65   VIRTUAL TABLE e
4970: 63 68 6f 5f 61 62 63 20 55 53 49 4e 47 20 65 63  cho_abc USING ec
4980: 68 6f 28 72 65 61 6c 5f 61 62 63 29 3b 0a 20 20  ho(real_abc);.  
4990: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76  }.} {}.do_test v
49a0: 74 61 62 31 2e 37 2d 32 20 7b 0a 20 20 65 78 65  tab1.7-2 {.  exe
49b0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
49c0: 54 20 49 4e 54 4f 20 65 63 68 6f 5f 61 62 63 20  T INTO echo_abc 
49d0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
49e0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74  .    SELECT last
49f0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b  _insert_rowid();
4a00: 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  .  }.} {1}.do_te
4a10: 73 74 20 76 74 61 62 31 2e 37 2d 33 20 7b 0a 20  st vtab1.7-3 {. 
4a20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
4a30: 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f  NSERT INTO echo_
4a40: 61 62 63 28 72 6f 77 69 64 29 20 56 41 4c 55 45  abc(rowid) VALUE
4a50: 53 28 33 31 34 32 37 29 3b 0a 20 20 20 20 53 45  S(31427);.    SE
4a60: 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74  LECT last_insert
4a70: 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20  _rowid();.  }.} 
4a80: 7b 33 31 34 32 37 7d 0a 64 6f 5f 74 65 73 74 20  {31427}.do_test 
4a90: 76 74 61 62 31 2e 37 2d 34 20 7b 0a 20 20 65 78  vtab1.7-4 {.  ex
4aa0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
4ab0: 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 61 62 63  RT INTO echo_abc
4ac0: 20 53 45 4c 45 43 54 20 61 7c 7c 27 2e 76 32 27   SELECT a||'.v2'
4ad0: 2c 20 62 2c 20 63 20 46 52 4f 4d 20 65 63 68 6f  , b, c FROM echo
4ae0: 5f 61 62 63 3b 0a 20 20 20 20 53 45 4c 45 43 54  _abc;.    SELECT
4af0: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
4b00: 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34  id();.  }.} {314
4b10: 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  29}.do_test vtab
4b20: 31 2e 37 2d 35 20 7b 0a 20 20 65 78 65 63 73 71  1.7-5 {.  execsq
4b30: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72  l {.    SELECT r
4b40: 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 46 52  owid, a, b, c FR
4b50: 4f 4d 20 65 63 68 6f 5f 61 62 63 0a 20 20 7d 0a  OM echo_abc.  }.
4b60: 7d 20 5b 6c 69 73 74 20 31 20 20 20 20 20 31 20  } [list 1     1 
4b70: 20 20 20 32 20 20 33 20 20 5c 0a 20 20 20 20 20     2  3  \.     
4b80: 20 20 20 33 31 34 32 37 20 7b 7d 20 20 20 7b 7d     31427 {}   {}
4b90: 20 7b 7d 20 5c 0a 20 20 20 20 20 20 20 20 33 31   {} \.        31
4ba0: 34 32 38 20 31 2e 76 32 20 32 20 20 33 20 20 5c  428 1.v2 2  3  \
4bb0: 0a 20 20 20 20 20 20 20 20 33 31 34 32 39 20 7b  .        31429 {
4bc0: 7d 20 20 7b 7d 20 7b 7d 20 20 5c 0a 5d 0a 0a 23  }  {} {}  \.]..#
4bd0: 20 4e 6f 77 20 74 65 73 74 20 74 68 61 74 20 44   Now test that D
4be0: 45 4c 45 54 45 20 61 6e 64 20 55 50 44 41 54 45  ELETE and UPDATE
4bf0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 6f 20 6e   operations do n
4c00: 6f 74 20 6d 6f 64 69 66 79 20 74 68 65 20 76 61  ot modify the va
4c10: 6c 75 65 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61  lue..do_test vta
4c20: 62 31 2e 37 2d 36 20 7b 0a 20 20 65 78 65 63 73  b1.7-6 {.  execs
4c30: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
4c40: 65 63 68 6f 5f 61 62 63 20 53 45 54 20 63 20 3d  echo_abc SET c =
4c50: 20 35 20 57 48 45 52 45 20 62 20 3d 20 32 3b 0a   5 WHERE b = 2;.
4c60: 20 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f      SELECT last_
4c70: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a  insert_rowid();.
4c80: 20 20 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 6f    }.} {31429}.do
4c90: 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d 37 20  _test vtab1.7-7 
4ca0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4cb0: 20 20 55 50 44 41 54 45 20 65 63 68 6f 5f 61 62    UPDATE echo_ab
4cc0: 63 20 53 45 54 20 72 6f 77 69 64 20 3d 20 35 20  c SET rowid = 5 
4cd0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31 3b  WHERE rowid = 1;
4ce0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74  .    SELECT last
4cf0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b  _insert_rowid();
4d00: 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a 64  .  }.} {31429}.d
4d10: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d 38  o_test vtab1.7-8
4d20: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4d30: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 65     DELETE FROM e
4d40: 63 68 6f 5f 61 62 63 20 57 48 45 52 45 20 62 20  cho_abc WHERE b 
4d50: 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 2;.    SELECT 
4d60: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
4d70: 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32  d();.  }.} {3142
4d80: 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  9}.do_test vtab1
4d90: 2e 37 2d 39 20 7b 0a 20 20 65 78 65 63 73 71 6c  .7-9 {.  execsql
4da0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f   {.    SELECT ro
4db0: 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f  wid, a, b, c FRO
4dc0: 4d 20 65 63 68 6f 5f 61 62 63 0a 20 20 7d 0a 7d  M echo_abc.  }.}
4dd0: 20 5b 6c 69 73 74 20 33 31 34 32 37 20 7b 7d 20   [list 31427 {} 
4de0: 7b 7d 20 7b 7d 20 5c 0a 20 20 20 20 20 20 20 20  {} {} \.        
4df0: 33 31 34 32 39 20 7b 7d 20 7b 7d 20 7b 7d 20 5c  31429 {} {} {} \
4e00: 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  .].do_test vtab1
4e10: 2e 37 2d 31 30 20 7b 0a 20 20 65 78 65 63 73 71  .7-10 {.  execsq
4e20: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
4e30: 52 4f 4d 20 65 63 68 6f 5f 61 62 63 20 57 48 45  ROM echo_abc WHE
4e40: 52 45 20 62 20 3d 20 32 3b 0a 20 20 20 20 53 45  RE b = 2;.    SE
4e50: 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74  LECT last_insert
4e60: 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20  _rowid();.  }.} 
4e70: 7b 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20  {31429}.do_test 
4e80: 76 74 61 62 31 2e 37 2d 31 31 20 7b 0a 20 20 65  vtab1.7-11 {.  e
4e90: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
4ea0: 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c  ECT rowid, a, b,
4eb0: 20 63 20 46 52 4f 4d 20 72 65 61 6c 5f 61 62 63   c FROM real_abc
4ec0: 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 33 31 34  .  }.} [list 314
4ed0: 32 37 20 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 20 20  27 {} {} {} \.  
4ee0: 20 20 20 20 20 20 33 31 34 32 39 20 7b 7d 20 7b        31429 {} {
4ef0: 7d 20 7b 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74  } {} \.].do_test
4f00: 20 76 74 61 62 31 2e 37 2d 31 32 20 7b 0a 20 20   vtab1.7-12 {.  
4f10: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
4f20: 4c 45 54 45 20 46 52 4f 4d 20 65 63 68 6f 5f 61  LETE FROM echo_a
4f30: 62 63 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c  bc;.    SELECT l
4f40: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
4f50: 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39  ();.  }.} {31429
4f60: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e  }.do_test vtab1.
4f70: 37 2d 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  7-13 {.  execsql
4f80: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f   {.    SELECT ro
4f90: 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f  wid, a, b, c FRO
4fa0: 4d 20 72 65 61 6c 5f 61 62 63 0a 20 20 7d 0a 7d  M real_abc.  }.}
4fb0: 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 61   {}..ifcapable a
4fc0: 74 74 61 63 68 20 7b 0a 20 20 64 6f 5f 74 65 73  ttach {.  do_tes
4fd0: 74 20 76 74 61 62 31 2e 38 2d 31 20 7b 0a 20 20  t vtab1.8-1 {.  
4fe0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
4ff0: 65 20 22 22 0a 20 20 20 20 65 78 65 63 73 71 6c  e "".    execsql
5000: 20 7b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20   {.      ATTACH 
5010: 27 74 65 73 74 32 2e 64 62 27 20 41 53 20 61 75  'test2.db' AS au
5020: 78 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  x;.      CREATE 
5030: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 61 75  VIRTUAL TABLE au
5040: 78 2e 65 32 20 55 53 49 4e 47 20 65 63 68 6f 28  x.e2 USING echo(
5050: 72 65 61 6c 5f 61 62 63 29 3b 0a 20 20 20 20 7d  real_abc);.    }
5060: 0a 20 20 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f  .    set echo_mo
5070: 64 75 6c 65 0a 20 20 7d 20 5b 6c 69 73 74 20 78  dule.  } [list x
5080: 43 72 65 61 74 65 20 65 63 68 6f 20 61 75 78 20  Create echo aux 
5090: 65 32 20 72 65 61 6c 5f 61 62 63 20 20 20 5c 0a  e2 real_abc   \.
50a0: 20 20 20 20 20 20 20 20 20 20 78 53 79 6e 63 20            xSync 
50b0: 20 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63 29    echo(real_abc)
50c0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
50d0: 20 20 20 20 20 78 43 6f 6d 6d 69 74 20 65 63 68       xCommit ech
50e0: 6f 28 72 65 61 6c 5f 61 62 63 29 20 20 20 20 20  o(real_abc)     
50f0: 20 20 20 20 5c 0a 20 20 5d 0a 7d 0a 64 6f 5f 74      \.  ].}.do_t
5100: 65 73 74 20 76 74 61 62 31 2e 38 2d 32 20 7b 0a  est vtab1.8-2 {.
5110: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
5120: 20 44 52 4f 50 20 54 41 42 4c 45 20 61 75 78 2e   DROP TABLE aux.
5130: 65 32 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  e2;.  }.  execsq
5140: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  l {.    DROP TAB
5150: 4c 45 20 74 72 65 61 6c 3b 0a 20 20 20 20 44 52  LE treal;.    DR
5160: 4f 50 20 54 41 42 4c 45 20 74 65 63 68 6f 3b 0a  OP TABLE techo;.
5170: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 65      DROP TABLE e
5180: 63 68 6f 5f 61 62 63 3b 0a 20 20 20 20 44 52 4f  cho_abc;.    DRO
5190: 50 20 54 41 42 4c 45 20 72 65 61 6c 5f 61 62 63  P TABLE real_abc
51a0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74  ;.  }.} {}..do_t
51b0: 65 73 74 20 76 74 61 62 31 2e 39 2d 31 20 7b 0a  est vtab1.9-1 {.
51c0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
51d0: 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b  e "".  execsql {
51e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
51f0: 45 20 72 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20  E r(a, b, c);.  
5200: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
5210: 20 54 41 42 4c 45 20 65 20 55 53 49 4e 47 20 65   TABLE e USING e
5220: 63 68 6f 28 72 2c 20 65 5f 6c 6f 67 29 3b 0a 20  cho(r, e_log);. 
5230: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46     SELECT name F
5240: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
5250: 72 3b 0a 20 20 7d 0a 7d 20 7b 72 20 65 20 65 5f  r;.  }.} {r e e_
5260: 6c 6f 67 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  log}.do_test vta
5270: 62 31 2e 39 2d 32 20 7b 0a 20 20 65 78 65 63 73  b1.9-2 {.  execs
5280: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
5290: 42 4c 45 20 65 3b 0a 20 20 20 20 53 45 4c 45 43  BLE e;.    SELEC
52a0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
52b0: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d  te_master;.  }.}
52c0: 20 7b 72 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74   {r}..do_test vt
52d0: 61 62 31 2e 39 2d 33 20 7b 0a 20 20 73 65 74 20  ab1.9-3 {.  set 
52e0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20  echo_module "". 
52f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
5300: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
5310: 42 4c 45 20 65 20 55 53 49 4e 47 20 65 63 68 6f  BLE e USING echo
5320: 28 72 2c 20 65 5f 6c 6f 67 2c 20 76 69 72 74 75  (r, e_log, virtu
5330: 61 6c 20 31 20 32 20 33 20 76 61 72 63 68 61 72  al 1 2 3 varchar
5340: 28 33 32 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74  (32));.  }.  set
5350: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b   echo_module.} [
5360: 6c 69 73 74 20 20 20 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 5c 0a 20 20              \.  
53a0: 78 43 72 65 61 74 65 20 65 63 68 6f 20 6d 61 69  xCreate echo mai
53b0: 6e 20 65 20 72 20 65 5f 6c 6f 67 20 7b 76 69 72  n e r e_log {vir
53c0: 74 75 61 6c 20 31 20 32 20 33 20 76 61 72 63 68  tual 1 2 3 varch
53d0: 61 72 28 33 32 29 7d 20 20 20 20 20 20 5c 0a 20  ar(32)}      \. 
53e0: 20 78 53 79 6e 63 20 65 63 68 6f 28 72 29 20 20   xSync echo(r)  
53f0: 20 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 5c 0a                \.
5420: 20 20 78 43 6f 6d 6d 69 74 20 65 63 68 6f 28 72    xCommit echo(r
5430: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
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 5c                 \
5460: 0a 5d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  .]..do_test vtab
5470: 31 2e 31 30 2d 31 20 7b 0a 20 20 65 78 65 63 73  1.10-1 {.  execs
5480: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
5490: 54 41 42 4c 45 20 64 65 6c 28 64 29 3b 0a 20 20  TABLE del(d);.  
54a0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
54b0: 20 54 41 42 4c 45 20 65 32 20 55 53 49 4e 47 20   TABLE e2 USING 
54c0: 65 63 68 6f 28 64 65 6c 29 3b 0a 20 20 7d 0a 20  echo(del);.  }. 
54d0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
54e0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
54f0: 20 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d   register_echo_m
5500: 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63  odule [sqlite3_c
5510: 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65  onnection_pointe
5520: 72 20 64 62 5d 0a 20 20 65 78 65 63 73 71 6c 20  r db].  execsql 
5530: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  {.    DROP TABLE
5540: 20 64 65 6c 3b 0a 20 20 7d 0a 20 20 63 61 74 63   del;.  }.  catc
5550: 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  hsql {.    SELEC
5560: 54 20 2a 20 46 52 4f 4d 20 65 32 3b 0a 20 20 7d  T * FROM e2;.  }
5570: 0a 7d 20 7b 31 20 7b 76 74 61 62 6c 65 20 63 6f  .} {1 {vtable co
5580: 6e 73 74 72 75 63 74 6f 72 20 66 61 69 6c 65 64  nstructor failed
5590: 3a 20 65 32 7d 7d 0a 64 6f 5f 74 65 73 74 20 76  : e2}}.do_test v
55a0: 74 61 62 31 2e 31 30 2d 32 20 7b 0a 20 20 73 65  tab1.10-2 {.  se
55b0: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20  t rc [catch {.  
55c0: 20 20 73 65 74 20 70 74 72 20 5b 73 71 6c 69 74    set ptr [sqlit
55d0: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
55e0: 69 6e 74 65 72 20 64 62 5d 0a 20 20 20 20 73 71  inter db].    sq
55f0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
5600: 61 62 20 24 70 74 72 20 7b 43 52 45 41 54 45 20  ab $ptr {CREATE 
5610: 54 41 42 4c 45 20 61 62 63 28 61 2c 20 62 2c 20  TABLE abc(a, b, 
5620: 63 29 7d 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 6c  c)}.  } msg].  l
5630: 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b  ist $rc $msg.} {
5640: 31 20 7b 6c 69 62 72 61 72 79 20 72 6f 75 74 69  1 {library routi
5650: 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66  ne called out of
5660: 20 73 65 71 75 65 6e 63 65 7d 7d 0a 64 6f 5f 74   sequence}}.do_t
5670: 65 73 74 20 76 74 61 62 31 2e 31 30 2d 33 20 7b  est vtab1.10-3 {
5680: 0a 20 20 73 65 74 20 3a 3a 65 63 68 6f 5f 6d 6f  .  set ::echo_mo
5690: 64 75 6c 65 5f 62 65 67 69 6e 5f 66 61 69 6c 20  dule_begin_fail 
56a0: 72 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  r.  catchsql {. 
56b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65     INSERT INTO e
56c0: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
56d0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 51 4c 20  ;.  }.} {1 {SQL 
56e0: 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d  logic error or m
56f0: 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 7d  issing database}
5700: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e  }.do_test vtab1.
5710: 31 30 2d 34 20 7b 0a 20 20 63 61 74 63 68 20 7b  10-4 {.  catch {
5720: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 45 58  execsql {.    EX
5730: 50 4c 41 49 4e 20 53 45 4c 45 43 54 20 2a 20 46  PLAIN SELECT * F
5740: 52 4f 4d 20 65 20 57 48 45 52 45 20 72 6f 77 69  ROM e WHERE rowi
5750: 64 20 3d 20 32 3b 0a 20 20 20 20 45 58 50 4c 41  d = 2;.    EXPLA
5760: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
5770: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 20 57 48  LECT * FROM e WH
5780: 45 52 45 20 72 6f 77 69 64 20 3d 20 32 20 4f 52  ERE rowid = 2 OR
5790: 44 45 52 20 42 59 20 72 6f 77 69 64 3b 0a 20 20  DER BY rowid;.  
57a0: 7d 7d 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73  }}.} {0}..do_tes
57b0: 74 20 76 74 61 62 31 2e 31 30 2d 35 20 7b 0a 20  t vtab1.10-5 {. 
57c0: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
57d0: 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   "".  execsql {.
57e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
57f0: 4d 20 65 20 57 48 45 52 45 20 72 6f 77 69 64 7c  M e WHERE rowid|
5800: 7c 27 27 20 4d 41 54 43 48 20 27 70 61 74 74 65  |'' MATCH 'patte
5810: 72 6e 27 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65  rn';.  }.  set e
5820: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69  cho_module.} [li
5830: 73 74 20 5c 0a 20 20 78 42 65 73 74 49 6e 64 65  st \.  xBestInde
5840: 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  x {SELECT rowid,
5850: 20 2a 20 46 52 4f 4d 20 27 72 27 7d 20 5c 0a 20   * FROM 'r'} \. 
5860: 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54   xFilter {SELECT
5870: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
5880: 72 27 7d 20 20 20 20 5c 0a 5d 0a 70 72 6f 63 20  r'}    \.].proc 
5890: 6d 61 74 63 68 5f 66 75 6e 63 20 7b 61 72 67 73  match_func {args
58a0: 7d 20 7b 72 65 74 75 72 6e 20 22 22 7d 0a 64 6f  } {return ""}.do
58b0: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d 36  _test vtab1.10-6
58c0: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
58d0: 64 75 6c 65 20 22 22 0a 20 20 64 62 20 66 75 6e  dule "".  db fun
58e0: 63 74 69 6f 6e 20 6d 61 74 63 68 20 6d 61 74 63  ction match matc
58f0: 68 5f 66 75 6e 63 0a 20 20 65 78 65 63 73 71 6c  h_func.  execsql
5900: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
5910: 46 52 4f 4d 20 65 20 57 48 45 52 45 20 6d 61 74  FROM e WHERE mat
5920: 63 68 28 27 70 61 74 74 65 72 6e 27 2c 20 72 6f  ch('pattern', ro
5930: 77 69 64 2c 20 27 70 61 74 74 65 72 6e 32 27 29  wid, 'pattern2')
5940: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f  ;.  }.  set echo
5950: 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20  _module.} [list 
5960: 5c 0a 20 20 78 42 65 73 74 49 6e 64 65 78 20 7b  \.  xBestIndex {
5970: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
5980: 46 52 4f 4d 20 27 72 27 7d 20 5c 0a 20 20 78 46  FROM 'r'} \.  xF
5990: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f  ilter {SELECT ro
59a0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 72 27 7d  wid, * FROM 'r'}
59b0: 20 20 20 20 5c 0a 5d 0a 0a 0a 23 20 54 65 73 74      \.]...# Test
59c0: 69 6e 67 20 74 68 65 20 78 46 69 6e 64 46 75 6e  ing the xFindFun
59d0: 63 74 69 6f 6e 20 69 6e 74 65 72 66 61 63 65 0a  ction interface.
59e0: 23 0a 63 61 74 63 68 20 7b 72 65 6e 61 6d 65 20  #.catch {rename 
59f0: 3a 3a 65 63 68 6f 5f 67 6c 6f 62 5f 6f 76 65 72  ::echo_glob_over
5a00: 6c 6f 61 64 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  load {}}.do_test
5a10: 20 76 74 61 62 31 2e 31 31 2d 31 20 7b 0a 20 20   vtab1.11-1 {.  
5a20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
5a30: 53 45 52 54 20 49 4e 54 4f 20 72 28 61 2c 62 2c  SERT INTO r(a,b,
5a40: 63 29 20 56 41 4c 55 45 53 28 31 2c 27 3f 27 2c  c) VALUES(1,'?',
5a50: 39 39 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  99);.    INSERT 
5a60: 49 4e 54 4f 20 72 28 61 2c 62 2c 63 29 20 56 41  INTO r(a,b,c) VA
5a70: 4c 55 45 53 28 32 2c 33 2c 39 39 29 3b 0a 20 20  LUES(2,3,99);.  
5a80: 20 20 53 45 4c 45 43 54 20 61 20 47 4c 4f 42 20    SELECT a GLOB 
5a90: 62 20 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b  b FROM e.  }.} {
5aa0: 31 20 30 7d 0a 70 72 6f 63 20 3a 3a 65 63 68 6f  1 0}.proc ::echo
5ab0: 5f 67 6c 6f 62 5f 6f 76 65 72 6c 6f 61 64 20 7b  _glob_overload {
5ac0: 61 20 62 7d 20 7b 0a 20 72 65 74 75 72 6e 20 5b  a b} {. return [
5ad0: 6c 69 73 74 20 24 62 20 24 61 5d 0a 7d 0a 64 6f  list $b $a].}.do
5ae0: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 31 2d 32  _test vtab1.11-2
5af0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5b00: 20 20 20 53 45 4c 45 43 54 20 61 20 6c 69 6b 65     SELECT a like
5b10: 20 27 62 27 20 46 52 4f 4d 20 65 0a 20 20 7d 0a   'b' FROM e.  }.
5b20: 7d 20 7b 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20  } {0 0}.do_test 
5b30: 76 74 61 62 31 2e 31 31 2d 33 20 7b 0a 20 20 65  vtab1.11-3 {.  e
5b40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
5b50: 45 43 54 20 61 20 67 6c 6f 62 20 27 32 27 20 46  ECT a glob '2' F
5b60: 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b 7b 31 20  ROM e.  }.} {{1 
5b70: 32 7d 20 7b 32 20 32 7d 7d 0a 64 6f 5f 74 65 73  2} {2 2}}.do_tes
5b80: 74 20 76 74 61 62 31 2e 31 31 2d 34 20 7b 0a 20  t vtab1.11-4 {. 
5b90: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
5ba0: 45 4c 45 43 54 20 20 67 6c 6f 62 28 27 32 27 2c  ELECT  glob('2',
5bb0: 61 29 20 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20  a) FROM e.  }.} 
5bc0: 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74  {0 1}.do_test vt
5bd0: 61 62 31 2e 31 31 2d 35 20 7b 0a 20 20 65 78 65  ab1.11-5 {.  exe
5be0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
5bf0: 54 20 20 67 6c 6f 62 28 61 2c 27 32 27 29 20 46  T  glob(a,'2') F
5c00: 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b 7b 32 20  ROM e.  }.} {{2 
5c10: 31 7d 20 7b 32 20 32 7d 7d 0a 20 0a 23 2d 2d 2d  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 0a 23 20 54 65 73 74 20 74 68 65 20 6f  ---.# Test the o
5c70: 75 74 63 6f 6d 65 20 69 66 20 61 20 63 6f 6e 73  utcome if a cons
5c80: 74 72 61 69 6e 74 20 69 73 20 65 6e 63 6f 75 6e  traint is encoun
5c90: 74 65 72 65 64 20 68 61 6c 66 2d 77 61 79 20 74  tered half-way t
5ca0: 68 72 6f 75 67 68 0a 23 20 61 20 6d 75 6c 74 69  hrough.# a multi
5cb0: 2d 72 6f 77 20 49 4e 53 45 52 54 20 74 68 61 74  -row INSERT that
5cc0: 20 69 73 20 69 6e 73 69 64 65 20 61 20 74 72 61   is inside a tra
5cd0: 6e 73 61 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74 65  nsaction.#.do_te
5ce0: 73 74 20 76 74 61 62 31 2e 31 32 2d 31 20 7b 0a  st vtab1.12-1 {.
5cf0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5d00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 28 61  CREATE TABLE b(a
5d10: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
5d20: 41 54 45 20 54 41 42 4c 45 20 63 28 61 20 55 4e  ATE TABLE c(a UN
5d30: 49 51 55 45 2c 20 62 2c 20 63 29 3b 0a 20 20 20  IQUE, b, c);.   
5d40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56   INSERT INTO b V
5d50: 41 4c 55 45 53 28 31 2c 20 27 41 27 2c 20 27 42  ALUES(1, 'A', 'B
5d60: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
5d70: 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 32 2c 20  NTO b VALUES(2, 
5d80: 27 43 27 2c 20 27 44 27 29 3b 0a 20 20 20 20 49  'C', 'D');.    I
5d90: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c  NSERT INTO b VAL
5da0: 55 45 53 28 33 2c 20 27 45 27 2c 20 27 46 27 29  UES(3, 'E', 'F')
5db0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5dc0: 4f 20 63 20 56 41 4c 55 45 53 28 33 2c 20 27 47  O c VALUES(3, 'G
5dd0: 27 2c 20 27 48 27 29 3b 0a 20 20 20 20 43 52 45  ', 'H');.    CRE
5de0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
5df0: 45 20 65 63 68 6f 5f 63 20 55 53 49 4e 47 20 65  E echo_c USING e
5e00: 63 68 6f 28 63 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  cho(c);.  }.} {}
5e10: 0a 0a 23 20 46 69 72 73 74 20 74 65 73 74 20 6f  ..# First test o
5e20: 75 74 73 69 64 65 20 6f 66 20 61 20 74 72 61 6e  utside of a tran
5e30: 73 61 63 74 69 6f 6e 2e 0a 64 6f 5f 74 65 73 74  saction..do_test
5e40: 20 76 74 61 62 31 2e 31 32 2d 32 20 7b 0a 20 20   vtab1.12-2 {.  
5e50: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
5e60: 54 20 49 4e 54 4f 20 65 63 68 6f 5f 63 20 53 45  T INTO echo_c SE
5e70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 3b 20 7d  LECT * FROM b; }
5e80: 0a 7d 20 7b 31 20 7b 65 63 68 6f 2d 76 74 61 62  .} {1 {echo-vtab
5e90: 2d 65 72 72 6f 72 3a 20 63 6f 6c 75 6d 6e 20 61  -error: column a
5ea0: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d   is not unique}}
5eb0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
5ec0: 32 2d 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  2-2.1 {.  sqlite
5ed0: 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 65  3_errmsg db.} {e
5ee0: 63 68 6f 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20  cho-vtab-error: 
5ef0: 63 6f 6c 75 6d 6e 20 61 20 69 73 20 6e 6f 74 20  column a is not 
5f00: 75 6e 69 71 75 65 7d 0a 64 6f 5f 74 65 73 74 20  unique}.do_test 
5f10: 76 74 61 62 31 2e 31 32 2d 33 20 7b 0a 20 20 65  vtab1.12-3 {.  e
5f20: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
5f30: 2a 20 46 52 4f 4d 20 63 20 7d 0a 7d 20 7b 33 20  * FROM c }.} {3 
5f40: 47 20 48 7d 0a 0a 23 20 4e 6f 77 20 74 68 65 20  G H}..# Now the 
5f50: 72 65 61 6c 20 74 65 73 74 20 2d 20 77 72 61 70  real test - wrap
5f60: 70 65 64 20 69 6e 20 61 20 74 72 61 6e 73 61 63  ped in a transac
5f70: 74 69 6f 6e 2e 0a 64 6f 5f 74 65 73 74 20 76 74  tion..do_test vt
5f80: 61 62 31 2e 31 32 2d 34 20 7b 0a 20 20 65 78 65  ab1.12-4 {.  exe
5f90: 63 73 71 6c 20 20 7b 42 45 47 49 4e 7d 0a 20 20  csql  {BEGIN}.  
5fa0: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
5fb0: 54 20 49 4e 54 4f 20 65 63 68 6f 5f 63 20 53 45  T INTO echo_c SE
5fc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 3b 20 7d  LECT * FROM b; }
5fd0: 0a 7d 20 7b 31 20 7b 65 63 68 6f 2d 76 74 61 62  .} {1 {echo-vtab
5fe0: 2d 65 72 72 6f 72 3a 20 63 6f 6c 75 6d 6e 20 61  -error: column a
5ff0: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d   is not unique}}
6000: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
6010: 32 2d 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2-5 {.  execsql 
6020: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6030: 63 20 7d 0a 7d 20 7b 33 20 47 20 48 7d 0a 64 6f  c }.} {3 G H}.do
6040: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d 36  _test vtab1.12-6
6050: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
6060: 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65 63 73 71  OMMIT }.  execsq
6070: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
6080: 4d 20 63 20 7d 0a 7d 20 7b 33 20 47 20 48 7d 0a  M c }.} {3 G H}.
6090: 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  .# At one point 
60a0: 28 74 69 63 6b 65 74 20 23 32 37 35 39 29 2c 20  (ticket #2759), 
60b0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  a WHERE clause o
60c0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 63 6f 6c  f the form "<col
60d0: 75 6d 6e 3e 20 49 53 20 4e 55 4c 4c 22 0a 23 20  umn> IS NULL".# 
60e0: 6f 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  on a virtual tab
60f0: 6c 65 20 77 61 73 20 63 61 75 73 69 6e 67 20 61  le was causing a
6100: 6e 20 61 73 73 65 72 74 28 29 20 74 6f 20 66 61  n assert() to fa
6110: 69 6c 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c  il in the compil
6120: 65 72 2e 0a 23 0a 23 20 22 49 53 20 4e 55 4c 4c  er..#.# "IS NULL
6130: 22 20 63 6c 61 75 73 65 73 20 73 68 6f 75 6c 64  " clauses should
6140: 20 6e 6f 74 20 62 65 20 70 61 73 73 65 64 20 74   not be passed t
6150: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 76 69  hrough to the vi
6160: 72 74 75 61 6c 20 74 61 62 6c 65 0a 23 20 69 6d  rtual table.# im
6170: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 54 68  plementation. Th
6180: 65 79 20 61 72 65 20 68 61 6e 64 6c 65 64 20 62  ey are handled b
6190: 79 20 53 51 4c 69 74 65 20 61 66 74 65 72 20 74  y SQLite after t
61a0: 68 65 20 76 74 61 62 20 72 65 74 75 72 6e 73 20  he vtab returns 
61b0: 69 74 73 0a 23 20 64 61 74 61 2e 0a 23 0a 64 6f  its.# data..#.do
61c0: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 33 2d 31  _test vtab1.13-1
61d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
61e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
61f0: 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61  M echo_c WHERE a
6200: 20 49 53 20 4e 55 4c 4c 20 0a 20 20 7d 0a 7d 20   IS NULL .  }.} 
6210: 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  {}.do_test vtab1
6220: 2e 31 33 2d 32 20 7b 0a 20 20 65 78 65 63 73 71  .13-2 {.  execsq
6230: 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20  l { .    INSERT 
6240: 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 4e 55  INTO c VALUES(NU
6250: 4c 4c 2c 20 31 35 2c 20 31 36 29 3b 0a 20 20 20  LL, 15, 16);.   
6260: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65   SELECT * FROM e
6270: 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20 49 53  cho_c WHERE a IS
6280: 20 4e 55 4c 4c 20 0a 20 20 7d 0a 7d 20 7b 7b 7d   NULL .  }.} {{}
6290: 20 31 35 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20   15 16}.do_test 
62a0: 76 74 61 62 31 2e 31 33 2d 33 20 7b 0a 20 20 65  vtab1.13-3 {.  e
62b0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 49 4e  xecsql { .    IN
62c0: 53 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55  SERT INTO c VALU
62d0: 45 53 28 31 35 2c 20 4e 55 4c 4c 2c 20 31 36 29  ES(15, NULL, 16)
62e0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
62f0: 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45  ROM echo_c WHERE
6300: 20 62 20 49 53 20 4e 55 4c 4c 20 0a 20 20 7d 0a   b IS NULL .  }.
6310: 7d 20 7b 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f  } {15 {} 16}.do_
6320: 74 65 73 74 20 76 74 61 62 31 2e 31 33 2d 33 20  test vtab1.13-3 
6330: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
6340: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
6350: 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 62 20   echo_c WHERE b 
6360: 49 53 20 4e 55 4c 4c 20 41 4e 44 20 61 20 3d 20  IS NULL AND a = 
6370: 31 35 3b 0a 20 20 7d 0a 7d 20 7b 31 35 20 7b 7d  15;.  }.} {15 {}
6380: 20 31 36 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 76   16}...do_test v
6390: 74 61 62 31 2d 31 34 2e 31 20 7b 0a 20 20 65 78  tab1-14.1 {.  ex
63a0: 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  ecsql { DELETE F
63b0: 52 4f 4d 20 63 20 7d 0a 20 20 73 65 74 20 65 63  ROM c }.  set ec
63c0: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65  ho_module "".  e
63d0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
63e0: 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48  * FROM echo_c WH
63f0: 45 52 45 20 72 6f 77 69 64 20 49 4e 20 28 31 2c  ERE rowid IN (1,
6400: 20 32 2c 20 33 29 20 7d 0a 20 20 73 65 74 20 65   2, 3) }.  set e
6410: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69  cho_module.} [li
6420: 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53  st xBestIndex {S
6430: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
6440: 52 4f 4d 20 27 63 27 7d 20 78 46 69 6c 74 65 72  ROM 'c'} xFilter
6450: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
6460: 2a 20 46 52 4f 4d 20 27 63 27 7d 5d 0a 0a 64 6f  * FROM 'c'}]..do
6470: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e 32  _test vtab1-14.2
6480: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
6490: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71  dule "".  execsq
64a0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
64b0: 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 72  M echo_c WHERE r
64c0: 6f 77 69 64 20 3d 20 31 20 7d 0a 20 20 73 65 74  owid = 1 }.  set
64d0: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b   echo_module.} [
64e0: 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20  list xBestIndex 
64f0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
6500: 20 46 52 4f 4d 20 27 63 27 20 57 48 45 52 45 20   FROM 'c' WHERE 
6510: 72 6f 77 69 64 20 3d 20 3f 7d 20 78 46 69 6c 74  rowid = ?} xFilt
6520: 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  er {SELECT rowid
6530: 2c 20 2a 20 46 52 4f 4d 20 27 63 27 20 57 48 45  , * FROM 'c' WHE
6540: 52 45 20 72 6f 77 69 64 20 3d 20 3f 7d 20 31 5d  RE rowid = ?} 1]
6550: 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ..do_test vtab1-
6560: 31 34 2e 33 20 7b 0a 20 20 73 65 74 20 65 63 68  14.3 {.  set ech
6570: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78  o_module "".  ex
6580: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
6590: 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45   FROM echo_c WHE
65a0: 52 45 20 61 20 3d 20 31 20 7d 0a 20 20 73 65 74  RE a = 1 }.  set
65b0: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b   echo_module.} [
65c0: 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20  list xBestIndex 
65d0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
65e0: 20 46 52 4f 4d 20 27 63 27 20 57 48 45 52 45 20   FROM 'c' WHERE 
65f0: 61 20 3d 20 3f 7d 20 78 46 69 6c 74 65 72 20 7b  a = ?} xFilter {
6600: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
6610: 46 52 4f 4d 20 27 63 27 20 57 48 45 52 45 20 61  FROM 'c' WHERE a
6620: 20 3d 20 3f 7d 20 31 5d 0a 0a 64 6f 5f 74 65 73   = ?} 1]..do_tes
6630: 74 20 76 74 61 62 31 2d 31 34 2e 34 20 7b 0a 20  t vtab1-14.4 {. 
6640: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
6650: 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 20   "".  execsql { 
6660: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63  SELECT * FROM ec
6670: 68 6f 5f 63 20 57 48 45 52 45 20 61 20 49 4e 20  ho_c WHERE a IN 
6680: 28 31 2c 20 32 29 20 7d 0a 20 20 73 65 74 20 65  (1, 2) }.  set e
6690: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69  cho_module.} [li
66a0: 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53  st xBestIndex {S
66b0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
66c0: 52 4f 4d 20 27 63 27 7d 20 78 46 69 6c 74 65 72  ROM 'c'} xFilter
66d0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
66e0: 2a 20 46 52 4f 4d 20 27 63 27 7d 5d 0a 0a 64 6f  * FROM 'c'}]..do
66f0: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 35 2e 31  _test vtab1-15.1
6700: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6710: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6720: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  t1(a, b, c);.   
6730: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
6740: 54 41 42 4c 45 20 65 63 68 6f 5f 74 31 20 55 53  TABLE echo_t1 US
6750: 49 4e 47 20 65 63 68 6f 28 74 31 29 3b 0a 20 20  ING echo(t1);.  
6760: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76  }.} {}.do_test v
6770: 74 61 62 31 2d 31 35 2e 32 20 7b 0a 20 20 65 78  tab1-15.2 {.  ex
6780: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
6790: 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 74 31 28  RT INTO echo_t1(
67a0: 72 6f 77 69 64 29 20 56 41 4c 55 45 53 28 34 35  rowid) VALUES(45
67b0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f  );.    SELECT ro
67c0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f  wid, * FROM echo
67d0: 5f 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34 35 20 7b  _t1;.  }.} {45 {
67e0: 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {} {}}.do_test
67f0: 20 76 74 61 62 31 2d 31 35 2e 33 20 7b 0a 20 20   vtab1-15.3 {.  
6800: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
6810: 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 74  SERT INTO echo_t
6820: 31 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53 28  1(rowid) VALUES(
6830: 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 45 4c 45 43  NULL);.    SELEC
6840: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
6850: 65 63 68 6f 5f 74 31 3b 0a 20 20 7d 0a 7d 20 7b  echo_t1;.  }.} {
6860: 34 35 20 7b 7d 20 7b 7d 20 7b 7d 20 34 36 20 7b  45 {} {} {} 46 {
6870: 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {} {}}.do_test
6880: 20 76 74 61 62 31 2d 31 35 2e 34 20 7b 0a 20 20   vtab1-15.4 {.  
6890: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
68a0: 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f  NSERT INTO echo_
68b0: 74 31 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53  t1(rowid) VALUES
68c0: 28 27 6e 65 77 20 72 6f 77 69 64 27 29 3b 0a 20  ('new rowid');. 
68d0: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 74 79 70   }.} {1 {datatyp
68e0: 65 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a 23 20  e mismatch}}..# 
68f0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
6900: 73 74 73 20 2d 20 76 74 61 62 31 2d 31 36 2e 2a  sts - vtab1-16.*
6910: 20 2d 20 61 72 65 20 64 65 73 69 67 6e 65 64 20   - are designed 
6920: 74 6f 20 74 65 73 74 20 74 68 61 74 20 73 65 74  to test that set
6930: 74 69 6e 67 20 0a 23 20 73 71 6c 69 74 65 33 5f  ting .# sqlite3_
6940: 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 76 61 72  vtab.zErrMsg var
6950: 69 61 62 6c 65 20 63 61 6e 20 62 65 20 75 73 65  iable can be use
6960: 64 20 62 79 20 74 68 65 20 76 74 61 62 20 69 6e  d by the vtab in
6970: 74 65 72 66 61 63 65 20 74 6f 20 0a 23 20 72 65  terface to .# re
6980: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65  turn an error me
6990: 73 73 61 67 65 20 74 6f 20 74 68 65 20 75 73 65  ssage to the use
69a0: 72 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 76 74  r..# .do_test vt
69b0: 61 62 31 2d 31 36 2e 31 20 7b 0a 20 20 65 78 65  ab1-16.1 {.  exe
69c0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
69d0: 45 20 54 41 42 4c 45 20 74 32 28 61 20 50 52 49  E TABLE t2(a PRI
69e0: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b  MARY KEY, b, c);
69f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6a00: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   t2 VALUES(1, 2,
6a10: 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   3);.    INSERT 
6a20: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34  INTO t2 VALUES(4
6a30: 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 43 52 45  , 5, 6);.    CRE
6a40: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
6a50: 45 20 65 63 68 6f 5f 74 32 20 55 53 49 4e 47 20  E echo_t2 USING 
6a60: 65 63 68 6f 28 74 32 29 3b 0a 20 20 7d 0a 7d 20  echo(t2);.  }.} 
6a70: 7b 7d 0a 0a 73 65 74 20 74 6e 20 32 0a 66 6f 72  {}..set tn 2.for
6a80: 65 61 63 68 20 6d 65 74 68 6f 64 20 5b 6c 69 73  each method [lis
6a90: 74 20 5c 0a 20 20 20 20 78 42 65 73 74 49 6e 64  t \.    xBestInd
6aa0: 65 78 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78  ex       \.    x
6ab0: 4f 70 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  Open            
6ac0: 5c 0a 20 20 20 20 78 46 69 6c 74 65 72 20 20 20  \.    xFilter   
6ad0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78 4e 65         \.    xNe
6ae0: 78 74 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  xt            \.
6af0: 20 20 20 20 78 43 6f 6c 75 6d 6e 20 20 20 20 20      xColumn     
6b00: 20 20 20 20 20 5c 0a 20 20 20 20 78 52 6f 77 69       \.    xRowi
6b10: 64 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d 20  d           \.] 
6b20: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 76 74 61 62  {.  do_test vtab
6b30: 31 2d 31 36 2e 24 74 6e 20 7b 0a 20 20 20 20 73  1-16.$tn {.    s
6b40: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66  et echo_module_f
6b50: 61 69 6c 28 24 6d 65 74 68 6f 64 2c 74 32 29 20  ail($method,t2) 
6b60: 22 74 68 65 20 24 6d 65 74 68 6f 64 20 6d 65 74  "the $method met
6b70: 68 6f 64 20 68 61 73 20 66 61 69 6c 65 64 22 0a  hod has failed".
6b80: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53      catchsql { S
6b90: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
6ba0: 52 4f 4d 20 65 63 68 6f 5f 74 32 20 57 48 45 52  ROM echo_t2 WHER
6bb0: 45 20 61 20 3e 3d 20 31 20 7d 0a 20 20 7d 20 22  E a >= 1 }.  } "
6bc0: 31 20 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72 72  1 {echo-vtab-err
6bd0: 6f 72 3a 20 74 68 65 20 24 6d 65 74 68 6f 64 20  or: the $method 
6be0: 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69 6c 65  method has faile
6bf0: 64 7d 22 0a 20 20 75 6e 73 65 74 20 65 63 68 6f  d}".  unset echo
6c00: 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 24 6d 65  _module_fail($me
6c10: 74 68 6f 64 2c 74 32 29 0a 20 20 69 6e 63 72 20  thod,t2).  incr 
6c20: 74 6e 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6d 65  tn.}..foreach me
6c30: 74 68 6f 64 20 5b 6c 69 73 74 20 5c 0a 20 20 78  thod [list \.  x
6c40: 55 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20  Update          
6c50: 20 20 5c 0a 20 20 78 42 65 67 69 6e 20 20 20 20    \.  xBegin    
6c60: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 78 53 79           \.  xSy
6c70: 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
6c80: 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  \.] {.  do_test 
6c90: 76 74 61 62 31 2d 31 36 2e 24 74 6e 20 7b 0a 20  vtab1-16.$tn {. 
6ca0: 20 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75     set echo_modu
6cb0: 6c 65 5f 66 61 69 6c 28 24 6d 65 74 68 6f 64 2c  le_fail($method,
6cc0: 74 32 29 20 22 74 68 65 20 24 6d 65 74 68 6f 64  t2) "the $method
6cd0: 20 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69 6c   method has fail
6ce0: 65 64 22 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ed".    catchsql
6cf0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65   { INSERT INTO e
6d00: 63 68 6f 5f 74 32 20 56 41 4c 55 45 53 28 37 2c  cho_t2 VALUES(7,
6d10: 20 38 2c 20 39 29 20 7d 0a 20 20 7d 20 22 31 20   8, 9) }.  } "1 
6d20: 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72 72 6f 72  {echo-vtab-error
6d30: 3a 20 74 68 65 20 24 6d 65 74 68 6f 64 20 6d 65  : the $method me
6d40: 74 68 6f 64 20 68 61 73 20 66 61 69 6c 65 64 7d  thod has failed}
6d50: 22 0a 20 20 75 6e 73 65 74 20 65 63 68 6f 5f 6d  ".  unset echo_m
6d60: 6f 64 75 6c 65 5f 66 61 69 6c 28 24 6d 65 74 68  odule_fail($meth
6d70: 6f 64 2c 74 32 29 0a 20 20 69 6e 63 72 20 74 6e  od,t2).  incr tn
6d80: 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 61 6c  .}..ifcapable al
6d90: 74 65 72 74 61 62 6c 65 20 7b 0a 20 20 64 6f 5f  tertable {.  do_
6da0: 74 65 73 74 20 76 74 61 62 31 2d 31 36 2e 24 74  test vtab1-16.$t
6db0: 6e 20 7b 0a 20 20 20 20 73 65 74 20 65 63 68 6f  n {.    set echo
6dc0: 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 78 52 65  _module_fail(xRe
6dd0: 6e 61 6d 65 2c 74 32 29 20 22 74 68 65 20 78 52  name,t2) "the xR
6de0: 65 6e 61 6d 65 20 6d 65 74 68 6f 64 20 68 61 73  ename method has
6df0: 20 66 61 69 6c 65 64 22 0a 20 20 20 20 63 61 74   failed".    cat
6e00: 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41  chsql { ALTER TA
6e10: 42 4c 45 20 65 63 68 6f 5f 74 32 20 52 45 4e 41  BLE echo_t2 RENA
6e20: 4d 45 20 54 4f 20 61 6e 6f 74 68 65 72 5f 6e 61  ME TO another_na
6e30: 6d 65 20 7d 0a 20 20 7d 20 22 31 20 7b 65 63 68  me }.  } "1 {ech
6e40: 6f 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20 74 68  o-vtab-error: th
6e50: 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64  e xRename method
6e60: 20 68 61 73 20 66 61 69 6c 65 64 7d 22 0a 20 20   has failed}".  
6e70: 75 6e 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c  unset echo_modul
6e80: 65 5f 66 61 69 6c 28 78 52 65 6e 61 6d 65 2c 74  e_fail(xRename,t
6e90: 32 29 0a 20 20 69 6e 63 72 20 74 6e 0a 7d 0a 0a  2).  incr tn.}..
6ea0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
6eb0: 74 65 73 74 20 63 61 73 65 20 65 78 70 6f 73 65  test case expose
6ec0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 69 6e  s an instance in
6ed0: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
6ee0: 5f 76 74 61 62 28 29 0a 23 20 61 6e 20 65 72 72  _vtab().# an err
6ef0: 6f 72 20 6d 65 73 73 61 67 65 20 77 61 73 20 73  or message was s
6f00: 65 74 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  et using a call 
6f10: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
6f20: 65 33 5f 6d 70 72 69 6e 74 66 28 7a 45 72 72 29  e3_mprintf(zErr)
6f30: 2c 0a 23 20 77 68 65 72 65 20 7a 45 72 72 20 69  ,.# where zErr i
6f40: 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 73  s an arbitrary s
6f50: 74 72 69 6e 67 2e 20 54 68 69 73 20 69 73 20 6e  tring. This is n
6f60: 6f 20 67 6f 6f 64 20 69 66 20 74 68 65 20 73 74  o good if the st
6f70: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 0a 23 20  ring contains.# 
6f80: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
6f90: 63 61 6e 20 62 65 20 6d 69 73 74 61 6b 65 6e 20  can be mistaken 
6fa0: 66 6f 72 20 70 72 69 6e 74 66 28 29 20 66 6f 72  for printf() for
6fb0: 6d 61 74 74 69 6e 67 20 64 69 72 65 63 74 69 76  matting directiv
6fc0: 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74  es..#.do_test vt
6fd0: 61 62 31 2d 31 37 2e 31 20 7b 0a 20 20 65 78 65  ab1-17.1 {.  exe
6fe0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
6ff0: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
7000: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 49 4e 53 45  ma = 1;.    INSE
7010: 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d  RT INTO sqlite_m
7020: 61 73 74 65 72 20 56 41 4c 55 45 53 28 0a 20 20  aster VALUES(.  
7030: 20 20 20 20 27 74 61 62 6c 65 27 2c 20 27 74 33      'table', 't3
7040: 27 2c 20 27 74 33 27 2c 20 30 2c 20 27 49 4e 53  ', 't3', 0, 'INS
7050: 45 52 54 20 49 4e 54 4f 20 22 25 73 25 73 22 20  ERT INTO "%s%s" 
7060: 56 41 4c 55 45 53 28 31 29 27 0a 20 20 20 20 29  VALUES(1)'.    )
7070: 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  ;.  }.  catchsql
7080: 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55 41   { CREATE VIRTUA
7090: 4c 20 54 41 42 4c 45 20 74 34 20 55 53 49 4e 47  L TABLE t4 USING
70a0: 20 65 63 68 6f 28 74 33 29 3b 20 7d 0a 7d 20 7b   echo(t3); }.} {
70b0: 31 20 7b 76 74 61 62 6c 65 20 63 6f 6e 73 74 72  1 {vtable constr
70c0: 75 63 74 6f 72 20 66 61 69 6c 65 64 3a 20 74 34  uctor failed: t4
70d0: 7d 7d 0a 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  }}..unset -nocom
70e0: 70 6c 61 69 6e 20 65 63 68 6f 5f 6d 6f 64 75 6c  plain echo_modul
70f0: 65 5f 62 65 67 69 6e 5f 66 61 69 6c 0a 66 69 6e  e_begin_fail.fin
7100: 69 73 68 5f 74 65 73 74 0a                       ish_test.