/ Hex Artifact Content
Login

Artifact 47b935205d7b6290765973abd6fce0e13e94e040017099170f43f81886efa5ba:


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 73 65 74 20 74 65 73 74 70 72 65 66 69  cl.set testprefi
0270: 78 20 76 74 61 62 31 0a 0a 69 66 63 61 70 61 62  x vtab1..ifcapab
0280: 6c 65 20 21 76 74 61 62 7c 7c 21 73 63 68 65 6d  le !vtab||!schem
0290: 61 5f 70 72 61 67 6d 61 73 20 7b 0a 20 20 66 69  a_pragmas {.  fi
02a0: 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75  nish_test.  retu
02b0: 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  rn.}..#---------
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0300: 4f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6f 66 20  Organization of 
0310: 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
0320: 6c 65 3a 0a 23 0a 23 20 76 74 61 62 31 2d 31 2e  le:.#.# vtab1-1.
0330: 2a 3a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  *: Error conditi
0340: 6f 6e 73 20 61 6e 64 20 6f 74 68 65 72 20 69 73  ons and other is
0350: 73 75 65 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  sues surrounding
0360: 20 63 72 65 61 74 69 6f 6e 2f 63 6f 6e 6e 65 63   creation/connec
0370: 74 69 6f 6e 0a 23 20 20 20 20 20 20 20 20 20 20  tion.#          
0380: 20 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 6d    of a virtual m
0390: 6f 64 75 6c 65 2e 0a 23 20 76 74 61 62 31 2d 32  odule..# vtab1-2
03a0: 2e 2a 3a 20 54 65 73 74 20 73 71 6c 69 74 65 33  .*: Test sqlite3
03b0: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20  _declare_vtab() 
03c0: 61 6e 64 20 74 68 65 20 78 43 6f 6e 6e 65 63 74  and the xConnect
03d0: 2f 78 44 69 73 63 6f 6e 6e 65 63 74 20 6d 65 74  /xDisconnect met
03e0: 68 6f 64 73 2e 0a 23 20 76 74 61 62 31 2d 33 2e  hods..# vtab1-3.
03f0: 2a 3a 20 54 61 62 6c 65 20 73 63 61 6e 73 20 61  *: Table scans a
0400: 6e 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  nd WHERE clauses
0410: 2e 0a 23 20 76 74 61 62 31 2d 34 2e 2a 3a 20 54  ..# vtab1-4.*: T
0420: 61 62 6c 65 20 73 63 61 6e 73 20 61 6e 64 20 4f  able scans and O
0430: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
0440: 0a 23 20 76 74 61 62 31 2d 35 2e 2a 3a 20 54 65  .# vtab1-5.*: Te
0450: 73 74 20 71 75 65 72 69 65 73 20 74 68 61 74 20  st queries that 
0460: 69 6e 63 6c 75 64 65 20 6a 6f 69 6e 73 2e 20 54  include joins. T
0470: 68 69 73 20 62 72 69 6e 67 73 20 74 68 65 0a 23  his brings the.#
0480: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
0490: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e 65  te3_index_info.e
04a0: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 76 61 72  stimatedCost var
04b0: 69 61 62 6c 65 20 69 6e 74 6f 20 70 6c 61 79 2e  iable into play.
04c0: 0a 23 20 76 74 61 62 31 2d 36 2e 2a 3a 20 54 65  .# vtab1-6.*: Te
04d0: 73 74 20 55 50 44 41 54 45 2f 49 4e 53 45 52 54  st UPDATE/INSERT
04e0: 2f 44 45 4c 45 54 45 20 6f 6e 20 76 74 61 62 6c  /DELETE on vtabl
04f0: 65 73 2e 0a 23 20 76 74 61 62 31 2d 37 2e 2a 3a  es..# vtab1-7.*:
0500: 20 54 65 73 74 20 73 71 6c 69 74 65 33 5f 6c 61   Test sqlite3_la
0510: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
0520: 29 2e 0a 23 0a 23 20 54 68 69 73 20 66 69 6c 65  )..#.# This file
0530: 20 75 73 65 73 20 74 68 65 20 22 65 63 68 6f 22   uses the "echo"
0540: 20 6d 6f 64 75 6c 65 20 28 73 65 65 20 73 72 63   module (see src
0550: 2f 74 65 73 74 38 2e 63 29 2e 20 52 65 66 65 72  /test8.c). Refer
0560: 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 0a 23 20 69   to comments.# i
0570: 6e 20 74 68 61 74 20 66 69 6c 65 20 66 6f 72 20  n that file for 
0580: 74 68 65 20 73 70 65 63 69 61 6c 20 62 65 68 61  the special beha
0590: 76 69 6f 75 72 20 6f 66 20 74 68 65 20 54 63 6c  viour of the Tcl
05a0: 20 24 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 76 61   $echo_module va
05b0: 72 69 61 62 6c 65 2e 0a 23 0a 23 20 54 4f 44 4f  riable..#.# TODO
05c0: 3a 20 0a 23 20 20 20 2a 20 48 6f 77 20 74 6f 20  : .#   * How to 
05d0: 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  test the sqlite3
05e0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
05f0: 74 5f 75 73 61 67 65 2e 6f 6d 69 74 20 66 69 65  t_usage.omit fie
0600: 6c 64 3f 0a 23 20 20 20 2a 20 76 74 61 62 31 2d  ld?.#   * vtab1-
0610: 35 2e 2a 0a 23 0a 23 20 76 74 61 62 31 2d 31 34  5.*.#.# vtab1-14
0620: 2e 2a 3a 20 54 65 73 74 20 27 49 4e 27 20 63 6f  .*: Test 'IN' co
0630: 6e 73 74 72 61 69 6e 74 73 20 2d 20 69 2e 65 2e  nstraints - i.e.
0640: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
0650: 74 31 20 57 48 45 52 45 20 69 64 20 49 4e 28 2e  t1 WHERE id IN(.
0660: 2e 2e 29 22 0a 23 0a 23 20 76 74 61 62 31 2d 31  ..)".#.# vtab1-1
0670: 38 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20  8.*: Check that 
0680: 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  the LIKE optimiz
0690: 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 70 70  ation is not app
06a0: 6c 69 65 64 20 77 68 65 6e 20 74 68 65 20 6c 68  lied when the lh
06b0: 73 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  s.#             
06c0: 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  is a virtual tab
06d0: 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 0a 0a 23  le column..#...#
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61  ------.# Test ca
0730: 73 65 73 20 76 74 61 62 31 2e 31 2e 2a 0a 23 0a  ses vtab1.1.*.#.
0740: 0a 23 20 57 65 20 63 61 6e 6e 6f 74 20 63 72 65  .# We cannot cre
0750: 61 74 65 20 61 20 76 69 72 74 75 61 6c 20 74 61  ate a virtual ta
0760: 62 6c 65 20 69 66 20 74 68 65 20 6d 6f 64 75 6c  ble if the modul
0770: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72  e has not been r
0780: 65 67 69 73 74 65 72 65 64 2e 0a 23 0a 64 6f 5f  egistered..#.do_
0790: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31 2e 31  test vtab1-1.1.1
07a0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
07b0: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
07c0: 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  AL TABLE t1 USIN
07d0: 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31  G echo;.  }.} {1
07e0: 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65   {no such module
07f0: 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74  : echo}}.do_test
0800: 20 76 74 61 62 31 2d 31 2e 31 2e 32 20 7b 0a 20   vtab1-1.1.2 {. 
0810: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0820: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
0830: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
0840: 54 53 20 74 31 20 55 53 49 4e 47 20 65 63 68 6f  TS t1 USING echo
0850: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73  ;.  }.} {1 {no s
0860: 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68 6f  uch module: echo
0870: 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }}.do_test vtab1
0880: 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.2 {.  execsql
0890: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61   {.    SELECT na
08a0: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
08b0: 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 31  aster ORDER BY 1
08c0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 52 65 67  .  }.} {}..# Reg
08d0: 69 73 74 65 72 20 74 68 65 20 6d 6f 64 75 6c 65  ister the module
08e0: 0a 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d  .register_echo_m
08f0: 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63  odule [sqlite3_c
0900: 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65  onnection_pointe
0910: 72 20 64 62 5d 0a 0a 23 20 4f 6e 63 65 20 61 20  r db]..# Once a 
0920: 6d 6f 64 75 6c 65 20 68 61 73 20 62 65 65 6e 20  module has been 
0930: 72 65 67 69 73 74 65 72 65 64 2c 20 76 69 72 74  registered, virt
0940: 75 61 6c 20 74 61 62 6c 65 73 20 75 73 69 6e 67  ual tables using
0950: 20 74 68 61 74 20 6d 6f 64 75 6c 65 0a 23 20 6d   that module.# m
0960: 61 79 20 62 65 20 63 72 65 61 74 65 64 2e 20 48  ay be created. H
0970: 6f 77 65 76 65 72 20 69 66 20 61 20 6d 6f 64 75  owever if a modu
0980: 6c 65 20 78 43 72 65 61 74 65 28 29 20 66 61 69  le xCreate() fai
0990: 6c 73 20 74 6f 20 63 61 6c 6c 0a 23 20 73 71 6c  ls to call.# sql
09a0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
09b0: 62 28 29 20 61 6e 20 65 72 72 6f 72 20 77 69 6c  b() an error wil
09c0: 6c 20 62 65 20 72 61 69 73 65 64 20 61 6e 64 20  l be raised and 
09d0: 74 68 65 20 74 61 62 6c 65 20 6e 6f 74 20 63 72  the table not cr
09e0: 65 61 74 65 64 2e 0a 23 0a 23 20 54 68 65 20 22  eated..#.# The "
09f0: 65 63 68 6f 22 20 6d 6f 64 75 6c 65 20 64 6f 65  echo" module doe
0a00: 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c  s not invoke sql
0a10: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
0a20: 62 28 29 20 69 66 20 69 74 20 69 73 0a 23 20 70  b() if it is.# p
0a30: 61 73 73 65 64 20 7a 65 72 6f 20 61 72 67 75 6d  assed zero argum
0a40: 65 6e 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ents..#.do_test 
0a50: 76 74 61 62 31 2d 31 2e 33 2e 31 20 7b 0a 20 20  vtab1-1.3.1 {.  
0a60: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43  catchsql {.    C
0a70: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
0a80: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 65 63 68  BLE t1 USING ech
0a90: 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 76 74 61  o;.  }.} {1 {vta
0aa0: 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20  ble constructor 
0ab0: 64 69 64 20 6e 6f 74 20 64 65 63 6c 61 72 65 20  did not declare 
0ac0: 73 63 68 65 6d 61 3a 20 74 31 7d 7d 0a 64 6f 5f  schema: t1}}.do_
0ad0: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 33 2e 32  test vtab1-1.3.2
0ae0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0af0: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
0b00: 41 4c 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  AL TABLE IF NOT 
0b10: 45 58 49 53 54 53 20 74 31 20 55 53 49 4e 47 20  EXISTS t1 USING 
0b20: 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  echo;.  }.} {1 {
0b30: 76 74 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74  vtable construct
0b40: 6f 72 20 64 69 64 20 6e 6f 74 20 64 65 63 6c 61  or did not decla
0b50: 72 65 20 73 63 68 65 6d 61 3a 20 74 31 7d 7d 0a  re schema: t1}}.
0b60: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e  do_test vtab1-1.
0b70: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
0b80: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
0b90: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
0ba0: 65 72 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  er ORDER BY 1.  
0bb0: 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 68 65 20 22 65  }.} {}..# The "e
0bc0: 63 68 6f 22 20 6d 6f 64 75 6c 65 20 78 43 72 65  cho" module xCre
0bd0: 61 74 65 20 6d 65 74 68 6f 64 20 72 65 74 75 72  ate method retur
0be0: 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20  ns an error and 
0bf0: 64 6f 65 73 20 6e 6f 74 20 63 72 65 61 74 65 0a  does not create.
0c00: 23 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  # the virtual ta
0c10: 62 6c 65 20 69 66 20 69 74 20 69 73 20 70 61 73  ble if it is pas
0c20: 73 65 64 20 61 6e 20 61 72 67 75 6d 65 6e 74 20  sed an argument 
0c30: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  that does not co
0c40: 72 72 65 73 70 6f 6e 64 0a 23 20 74 6f 20 61 6e  rrespond.# to an
0c50: 20 65 78 69 73 74 69 6e 67 20 72 65 61 6c 20 74   existing real t
0c60: 61 62 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  able in the same
0c70: 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 64 6f 5f   database..#.do_
0c80: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 35 2e 31  test vtab1-1.5.1
0c90: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0ca0: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
0cb0: 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e  AL TABLE t1 USIN
0cc0: 47 20 65 63 68 6f 28 6e 6f 5f 73 75 63 68 5f 74  G echo(no_such_t
0cd0: 61 62 6c 65 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20  able);.  }.} {1 
0ce0: 7b 76 74 61 62 6c 65 20 63 6f 6e 73 74 72 75 63  {vtable construc
0cf0: 74 6f 72 20 66 61 69 6c 65 64 3a 20 74 31 7d 7d  tor failed: t1}}
0d00: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
0d10: 2e 35 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  .5.2 {.  catchsq
0d20: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56  l {.    CREATE V
0d30: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 46 20  IRTUAL TABLE IF 
0d40: 4e 4f 54 20 45 58 49 53 54 53 20 74 31 20 55 53  NOT EXISTS t1 US
0d50: 49 4e 47 20 65 63 68 6f 28 6e 6f 5f 73 75 63 68  ING echo(no_such
0d60: 5f 74 61 62 6c 65 29 3b 0a 20 20 7d 0a 7d 20 7b  _table);.  }.} {
0d70: 31 20 7b 76 74 61 62 6c 65 20 63 6f 6e 73 74 72  1 {vtable constr
0d80: 75 63 74 6f 72 20 66 61 69 6c 65 64 3a 20 74 31  uctor failed: t1
0d90: 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }}.do_test vtab1
0da0: 2d 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.6 {.  execsql
0db0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61   {.    SELECT na
0dc0: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
0dd0: 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 31  aster ORDER BY 1
0de0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 69 63  .  }.} {}..# Tic
0df0: 6b 65 74 20 23 32 31 35 36 2e 20 20 55 73 69 6e  ket #2156.  Usin
0e00: 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70 72  g the sqlite3_pr
0e10: 65 70 61 72 65 5f 76 32 28 29 20 41 50 49 2c 20  epare_v2() API, 
0e20: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 23  make sure that.#
0e30: 20 61 20 43 52 45 41 54 45 20 56 49 52 54 55 41   a CREATE VIRTUA
0e40: 4c 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  L TABLE statemen
0e50: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 6d 75  t can be used mu
0e60: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 23 0a  ltiple times..#.
0e70: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e  do_test vtab1-1.
0e80: 32 31 35 32 2e 31 20 7b 0a 20 20 73 65 74 20 44  2152.1 {.  set D
0e90: 42 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  B [sqlite3_conne
0ea0: 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62  ction_pointer db
0eb0: 5d 0a 20 20 73 65 74 20 73 71 6c 20 7b 43 52 45  ].  set sql {CRE
0ec0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0ed0: 45 20 74 32 31 35 32 61 20 55 53 49 4e 47 20 65  E t2152a USING e
0ee0: 63 68 6f 28 74 32 31 35 32 62 29 7d 0a 20 20 73  cho(t2152b)}.  s
0ef0: 65 74 20 53 54 4d 54 20 5b 73 71 6c 69 74 65 33  et STMT [sqlite3
0f00: 5f 70 72 65 70 61 72 65 5f 76 32 20 24 44 42 20  _prepare_v2 $DB 
0f10: 24 73 71 6c 20 2d 31 20 54 41 49 4c 5d 0a 20 20  $sql -1 TAIL].  
0f20: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 54  sqlite3_step $ST
0f30: 4d 54 0a 7d 20 53 51 4c 49 54 45 5f 45 52 52 4f  MT.} SQLITE_ERRO
0f40: 52 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 2d 31  R.do_test vtab-1
0f50: 2e 32 31 35 32 2e 32 20 7b 0a 20 20 73 71 6c 69  .2152.2 {.  sqli
0f60: 74 65 33 5f 72 65 73 65 74 20 24 53 54 4d 54 0a  te3_reset $STMT.
0f70: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24    sqlite3_step $
0f80: 53 54 4d 54 0a 7d 20 53 51 4c 49 54 45 5f 45 52  STMT.} SQLITE_ER
0f90: 52 4f 52 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  ROR.do_test vtab
0fa0: 2d 31 2e 32 31 35 32 2e 33 20 7b 0a 20 20 73 71  -1.2152.3 {.  sq
0fb0: 6c 69 74 65 33 5f 72 65 73 65 74 20 24 53 54 4d  lite3_reset $STM
0fc0: 54 0a 20 20 64 62 20 65 76 61 6c 20 7b 43 52 45  T.  db eval {CRE
0fd0: 41 54 45 20 54 41 42 4c 45 20 74 32 31 35 32 62  ATE TABLE t2152b
0fe0: 28 78 2c 79 29 7d 0a 20 20 73 71 6c 69 74 65 33  (x,y)}.  sqlite3
0ff0: 5f 73 74 65 70 20 24 53 54 4d 54 0a 7d 20 53 51  _step $STMT.} SQ
1000: 4c 49 54 45 5f 44 4f 4e 45 0a 64 6f 5f 74 65 73  LITE_DONE.do_tes
1010: 74 20 76 74 61 62 2d 31 2e 32 31 35 32 2e 34 20  t vtab-1.2152.4 
1020: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  {.  sqlite3_fina
1030: 6c 69 7a 65 20 24 53 54 4d 54 0a 20 20 64 62 20  lize $STMT.  db 
1040: 65 76 61 6c 20 7b 44 52 4f 50 20 54 41 42 4c 45  eval {DROP TABLE
1050: 20 74 32 31 35 32 61 3b 20 44 52 4f 50 20 54 41   t2152a; DROP TA
1060: 42 4c 45 20 74 32 31 35 32 62 7d 0a 7d 20 7b 7d  BLE t2152b}.} {}
1070: 0a 0a 23 20 54 65 73 74 20 74 6f 20 6d 61 6b 65  ..# Test to make
1080: 20 73 75 72 65 20 6e 6f 74 68 69 6e 67 20 67 6f   sure nothing go
1090: 65 73 20 77 72 6f 6e 67 20 61 6e 64 20 6e 6f 20  es wrong and no 
10a0: 6d 65 6d 6f 72 79 20 69 73 20 6c 65 61 6b 65 64  memory is leaked
10b0: 20 69 66 20 77 65 20 0a 23 20 73 65 6c 65 63 74   if we .# select
10c0: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 74 61 62 6c   an illegal tabl
10d0: 65 2d 6e 61 6d 65 20 28 69 2e 65 20 61 20 72 65  e-name (i.e a re
10e0: 73 65 72 76 65 64 20 6e 61 6d 65 20 6f 72 20 74  served name or t
10f0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 0a 23 20 74  he name of a.# t
1100: 61 62 6c 65 20 74 68 61 74 20 61 6c 72 65 61 64  able that alread
1110: 79 20 65 78 69 73 74 73 29 2e 0a 23 0a 64 6f 5f  y exists)..#.do_
1120: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 37 2e 31  test vtab1-1.7.1
1130: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
1140: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
1150: 41 4c 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  AL TABLE sqlite_
1160: 6d 61 73 74 65 72 20 55 53 49 4e 47 20 65 63 68  master USING ech
1170: 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6f 62 6a  o;.  }.} {1 {obj
1180: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
1190: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
11a0: 73 65 3a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  se: sqlite_maste
11b0: 72 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  r}}.do_test vtab
11c0: 31 2d 31 2e 37 2e 32 20 7b 0a 20 20 63 61 74 63  1-1.7.2 {.  catc
11d0: 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  hsql {.    CREAT
11e0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
11f0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71  IF NOT EXISTS sq
1200: 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 53 49 4e  lite_master USIN
1210: 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31  G echo;.  }.} {1
1220: 20 7b 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   {object name re
1230: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
1240: 6e 61 6c 20 75 73 65 3a 20 73 71 6c 69 74 65 5f  nal use: sqlite_
1250: 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f 74 65 73 74  master}}.do_test
1260: 20 76 74 61 62 31 2d 31 2e 38 2e 31 20 7b 0a 20   vtab1-1.8.1 {. 
1270: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
1280: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 65  CREATE TABLE tre
1290: 61 6c 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  al(a, b, c);.   
12a0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
12b0: 54 41 42 4c 45 20 74 72 65 61 6c 20 55 53 49 4e  TABLE treal USIN
12c0: 47 20 65 63 68 6f 28 74 72 65 61 6c 29 3b 0a 20  G echo(treal);. 
12d0: 20 7d 0a 7d 20 7b 31 20 7b 74 61 62 6c 65 20 74   }.} {1 {table t
12e0: 72 65 61 6c 20 61 6c 72 65 61 64 79 20 65 78 69  real already exi
12f0: 73 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74  sts}}.do_test vt
1300: 61 62 31 2d 31 2e 38 2e 32 20 7b 0a 20 20 63 61  ab1-1.8.2 {.  ca
1310: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  tchsql {.    CRE
1320: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1330: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
1340: 74 72 65 61 6c 20 55 53 49 4e 47 20 65 63 68 6f  treal USING echo
1350: 28 74 72 65 61 6c 29 3b 0a 20 20 7d 0a 7d 20 7b  (treal);.  }.} {
1360: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74  0 {}}.do_test vt
1370: 61 62 31 2d 31 2e 39 20 7b 0a 20 20 65 78 65 63  ab1-1.9 {.  exec
1380: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
1390: 41 42 4c 45 20 74 72 65 61 6c 3b 0a 20 20 20 20  ABLE treal;.    
13a0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
13b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f   sqlite_master O
13c0: 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20  RDER BY 1.  }.} 
13d0: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  {}..do_test vtab
13e0: 31 2d 31 2e 31 30 20 7b 0a 20 20 65 78 65 63 73  1-1.10 {.  execs
13f0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1400: 54 41 42 4c 45 20 74 72 65 61 6c 28 61 2c 20 62  TABLE treal(a, b
1410: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
1420: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
1430: 65 63 68 6f 20 55 53 49 4e 47 20 65 63 68 6f 28  echo USING echo(
1440: 74 72 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 64 62  treal);.  }.  db
1450: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
1460: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 63 61   db test.db.  ca
1470: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  tchsql {.    SEL
1480: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f  ECT * FROM techo
1490: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73  ;.  }.} {1 {no s
14a0: 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68 6f  uch module: echo
14b0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }}.do_test vtab1
14c0: 2d 31 2e 31 31 20 7b 0a 20 20 63 61 74 63 68 73  -1.11 {.  catchs
14d0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
14e0: 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c 55 45  INTO techo VALUE
14f0: 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a  S(1, 2, 3);.  }.
1500: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f  } {1 {no such mo
1510: 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f  dule: echo}}.do_
1520: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31 32 20  test vtab1-1.12 
1530: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
1540: 20 20 20 55 50 44 41 54 45 20 74 65 63 68 6f 20     UPDATE techo 
1550: 53 45 54 20 61 20 3d 20 31 30 3b 0a 20 20 7d 0a  SET a = 10;.  }.
1560: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f  } {1 {no such mo
1570: 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f  dule: echo}}.do_
1580: 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31 33 20  test vtab1-1.13 
1590: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
15a0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
15b0: 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  echo;.  }.} {1 {
15c0: 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20  no such module: 
15d0: 65 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76  echo}}.do_test v
15e0: 74 61 62 31 2d 31 2e 31 34 20 7b 0a 20 20 63 61  tab1-1.14 {.  ca
15f0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  tchsql {.    PRA
1600: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74  GMA table_info(t
1610: 65 63 68 6f 29 0a 20 20 7d 0a 7d 20 7b 31 20 7b  echo).  }.} {1 {
1620: 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20  no such module: 
1630: 65 63 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76  echo}}.do_test v
1640: 74 61 62 31 2d 31 2e 31 35 20 7b 0a 20 20 63 61  tab1-1.15 {.  ca
1650: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  tchsql {.    DRO
1660: 50 20 54 41 42 4c 45 20 74 65 63 68 6f 3b 0a 20  P TABLE techo;. 
1670: 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68   }.} {1 {no such
1680: 20 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a   module: echo}}.
1690: 0a 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d  .register_echo_m
16a0: 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63  odule [sqlite3_c
16b0: 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65  onnection_pointe
16c0: 72 20 64 62 5d 0a 72 65 67 69 73 74 65 72 5f 65  r db].register_e
16d0: 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69  cho_module [sqli
16e0: 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70  te3_connection_p
16f0: 6f 69 6e 74 65 72 20 64 62 5d 0a 0a 23 20 54 65  ointer db]..# Te
1700: 73 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  st an error mess
1710: 61 67 65 20 72 65 74 75 72 6e 65 64 20 66 72 6f  age returned fro
1720: 6d 20 61 20 76 2d 74 61 62 6c 65 20 63 6f 6e 73  m a v-table cons
1730: 74 72 75 63 74 6f 72 2e 0a 23 0a 64 6f 5f 74 65  tructor..#.do_te
1740: 73 74 20 76 74 61 62 31 2d 31 2e 31 36 20 7b 0a  st vtab1-1.16 {.
1750: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1760: 44 52 4f 50 20 54 41 42 4c 45 20 74 65 63 68 6f  DROP TABLE techo
1770: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
1780: 4c 45 20 6c 6f 67 6d 73 67 28 6c 6f 67 29 3b 0a  LE logmsg(log);.
1790: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
17a0: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
17b0: 55 41 4c 20 54 41 42 4c 45 20 74 65 63 68 6f 20  UAL TABLE techo 
17c0: 55 53 49 4e 47 20 65 63 68 6f 28 74 72 65 61 6c  USING echo(treal
17d0: 2c 20 6c 6f 67 6d 73 67 29 3b 0a 20 20 7d 0a 7d  , logmsg);.  }.}
17e0: 20 7b 31 20 7b 74 61 62 6c 65 20 27 6c 6f 67 6d   {1 {table 'logm
17f0: 73 67 27 20 61 6c 72 65 61 64 79 20 65 78 69 73  sg' already exis
1800: 74 73 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74  ts}}..do_test vt
1810: 61 62 31 2d 31 2e 31 37 20 7b 0a 20 20 65 78 65  ab1-1.17 {.  exe
1820: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
1830: 54 41 42 4c 45 20 74 72 65 61 6c 3b 0a 20 20 20  TABLE treal;.   
1840: 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 6d   DROP TABLE logm
1850: 73 67 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73  sg;.    SELECT s
1860: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
1870: 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  aster;.  }.} {}.
1880: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
18d0: 63 61 73 65 73 20 76 74 61 62 31 2e 32 2e 2a 0a  cases vtab1.2.*.
18e0: 23 0a 23 20 41 74 20 74 68 69 73 20 70 6f 69 6e  #.# At this poin
18f0: 74 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  t, the database 
1900: 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  is completely em
1910: 70 74 79 2e 20 54 68 65 20 65 63 68 6f 20 6d 6f  pty. The echo mo
1920: 64 75 6c 65 0a 23 20 68 61 73 20 61 6c 72 65 61  dule.# has alrea
1930: 64 79 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  dy been register
1940: 65 64 2e 0a 0a 23 20 49 66 20 61 20 73 69 6e 67  ed...# If a sing
1950: 6c 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70  le argument is p
1960: 61 73 73 65 64 20 74 6f 20 74 68 65 20 65 63 68  assed to the ech
1970: 6f 20 6d 6f 64 75 6c 65 20 64 75 72 69 6e 67 20  o module during 
1980: 74 61 62 6c 65 0a 23 20 63 72 65 61 74 69 6f 6e  table.# creation
1990: 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
19a0: 74 6f 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  to be the name o
19b0: 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65  f a table in the
19c0: 20 73 61 6d 65 0a 23 20 64 61 74 61 62 61 73 65   same.# database
19d0: 2e 20 54 68 65 20 65 63 68 6f 20 6d 6f 64 75 6c  . The echo modul
19e0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 73 65  e attempts to se
19f0: 74 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20  t the schema of 
1a00: 74 68 65 0a 23 20 6e 65 77 20 76 69 72 74 75 61  the.# new virtua
1a10: 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20 74 68  l table to be th
1a20: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 65 78  e same as the ex
1a30: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
1a40: 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74  table..#.do_test
1a50: 20 76 74 61 62 31 2d 32 2e 31 20 7b 0a 20 20 65   vtab1-2.1 {.  e
1a60: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
1a70: 41 54 45 20 54 41 42 4c 45 20 74 65 6d 70 6c 61  ATE TABLE templa
1a80: 74 65 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 7d  te(a, b, c);.  }
1a90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
1aa0: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74  GMA table_info(t
1ab0: 65 6d 70 6c 61 74 65 29 3b 20 7d 0a 7d 20 5b 6c  emplate); }.} [l
1ac0: 69 73 74 20 20 20 20 20 20 20 20 20 5c 0a 20 20  ist         \.  
1ad0: 30 20 61 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a  0 a {} 0 {} 0 \.
1ae0: 20 20 31 20 62 20 7b 7d 20 30 20 7b 7d 20 30 20    1 b {} 0 {} 0 
1af0: 5c 0a 20 20 32 20 63 20 7b 7d 20 30 20 7b 7d 20  \.  2 c {} 0 {} 
1b00: 30 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74  0 \.].do_test vt
1b10: 61 62 31 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63  ab1-2.2 {.  exec
1b20: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1b30: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
1b40: 31 20 55 53 49 4e 47 20 65 63 68 6f 28 74 65 6d  1 USING echo(tem
1b50: 70 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 65 78  plate);.  }.  ex
1b60: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 74  ecsql { PRAGMA t
1b70: 61 62 6c 65 5f 69 6e 66 6f 28 74 31 29 3b 20 7d  able_info(t1); }
1b80: 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  .} [list        
1b90: 20 5c 0a 20 20 30 20 61 20 7b 7d 20 30 20 7b 7d   \.  0 a {} 0 {}
1ba0: 20 30 20 5c 0a 20 20 31 20 62 20 7b 7d 20 30 20   0 \.  1 b {} 0 
1bb0: 7b 7d 20 30 20 5c 0a 20 20 32 20 63 20 7b 7d 20  {} 0 \.  2 c {} 
1bc0: 30 20 7b 7d 20 30 20 5c 0a 5d 0a 0a 23 20 54 65  0 {} 0 \.]..# Te
1bd0: 73 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  st that the data
1be0: 62 61 73 65 20 63 61 6e 20 62 65 20 75 6e 6c 6f  base can be unlo
1bf0: 61 64 65 64 2e 20 54 68 69 73 20 73 68 6f 75 6c  aded. This shoul
1c00: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 78 44 69  d invoke the xDi
1c10: 73 63 6f 6e 6e 65 63 74 28 29 0a 23 20 63 61 6c  sconnect().# cal
1c20: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 75  lback for the su
1c30: 63 63 65 73 73 66 75 6c 6c 79 20 63 72 65 61 74  ccessfully creat
1c40: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1c50: 28 74 31 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  (t1)..#.do_test 
1c60: 76 74 61 62 31 2d 32 2e 33 20 7b 0a 20 20 73 65  vtab1-2.3 {.  se
1c70: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 6c  t echo_module [l
1c80: 69 73 74 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a  ist].  db close.
1c90: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
1ca0: 65 0a 7d 20 5b 6c 69 73 74 20 78 44 69 73 63 6f  e.} [list xDisco
1cb0: 6e 6e 65 63 74 5d 0a 0a 23 20 52 65 2d 6f 70 65  nnect]..# Re-ope
1cc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1cd0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  This should not 
1ce0: 63 61 75 73 65 20 61 6e 79 20 76 69 72 74 75 61  cause any virtua
1cf0: 6c 20 6d 65 74 68 6f 64 73 20 74 6f 20 0a 23 20  l methods to .# 
1d00: 62 65 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 69  be called. The i
1d10: 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 78 43 6f  nvocation of xCo
1d20: 6e 6e 65 63 74 28 29 20 69 73 20 64 65 6c 61 79  nnect() is delay
1d30: 65 64 20 75 6e 74 69 6c 20 74 68 65 20 76 69 72  ed until the vir
1d40: 74 75 61 6c 0a 23 20 74 61 62 6c 65 20 73 63 68  tual.# table sch
1d50: 65 6d 61 20 69 73 20 66 69 72 73 74 20 72 65 71  ema is first req
1d60: 75 69 72 65 64 20 62 79 20 74 68 65 20 63 6f 6d  uired by the com
1d70: 70 69 6c 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74  piler..#.do_test
1d80: 20 76 74 61 62 31 2d 32 2e 34 20 7b 0a 20 20 73   vtab1-2.4 {.  s
1d90: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b  et echo_module [
1da0: 6c 69 73 74 5d 0a 20 20 73 71 6c 69 74 65 33 20  list].  sqlite3 
1db0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20  db test.db.  db 
1dc0: 63 61 63 68 65 20 73 69 7a 65 20 30 0a 20 20 73  cache size 0.  s
1dd0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d  et echo_module.}
1de0: 20 7b 7d 0a 0a 23 20 54 72 79 20 74 6f 20 71 75   {}..# Try to qu
1df0: 65 72 79 20 74 68 65 20 76 69 72 74 75 61 6c 20  ery the virtual 
1e00: 74 61 62 6c 65 20 73 63 68 65 6d 61 2e 20 54 68  table schema. Th
1e10: 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2c 20  is should fail, 
1e20: 61 73 20 74 68 65 0a 23 20 65 63 68 6f 20 6d 6f  as the.# echo mo
1e30: 64 75 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  dule has not bee
1e40: 6e 20 72 65 67 69 73 74 65 72 65 64 20 77 69 74  n registered wit
1e50: 68 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  h this database 
1e60: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 64 6f  connection..#.do
1e70: 5f 74 65 73 74 20 76 74 61 62 31 2e 32 2e 36 20  _test vtab1.2.6 
1e80: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50  {.  catchsql { P
1e90: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
1ea0: 28 74 31 29 3b 20 7d 0a 7d 20 7b 31 20 7b 6e 6f  (t1); }.} {1 {no
1eb0: 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63   such module: ec
1ec0: 68 6f 7d 7d 0a 0a 23 20 52 65 67 69 73 74 65 72  ho}}..# Register
1ed0: 20 74 68 65 20 6d 6f 64 75 6c 65 0a 72 65 67 69   the module.regi
1ee0: 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65  ster_echo_module
1ef0: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   [sqlite3_connec
1f00: 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d  tion_pointer db]
1f10: 0a 0a 23 20 54 72 79 20 74 6f 20 71 75 65 72 79  ..# Try to query
1f20: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
1f30: 6c 65 20 73 63 68 65 6d 61 20 61 67 61 69 6e 2e  le schema again.
1f40: 20 54 68 69 73 20 74 69 6d 65 20 69 74 20 73 68   This time it sh
1f50: 6f 75 6c 64 0a 23 20 69 6e 76 6f 6b 65 20 74 68  ould.# invoke th
1f60: 65 20 78 43 6f 6e 6e 65 63 74 20 6d 65 74 68 6f  e xConnect metho
1f70: 64 20 61 6e 64 20 73 75 63 63 65 65 64 2e 0a 23  d and succeed..#
1f80: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 32  .do_test vtab1.2
1f90: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
1fa0: 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e   PRAGMA table_in
1fb0: 66 6f 28 74 31 29 3b 20 7d 0a 7d 20 5b 6c 69 73  fo(t1); }.} [lis
1fc0: 74 20 20 20 20 20 20 20 20 20 5c 0a 20 20 30 20  t         \.  0 
1fd0: 61 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20 20  a {} 0 {} 0 \.  
1fe0: 31 20 62 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a  1 b {} 0 {} 0 \.
1ff0: 20 20 32 20 63 20 7b 7d 20 30 20 7b 7d 20 30 20    2 c {} 0 {} 0 
2000: 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  \.].do_test vtab
2010: 31 2e 32 2e 38 20 7b 0a 20 20 73 65 74 20 65 63  1.2.8 {.  set ec
2020: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 7b 78 43 6f  ho_module.} {xCo
2030: 6e 6e 65 63 74 20 65 63 68 6f 20 6d 61 69 6e 20  nnect echo main 
2040: 74 31 20 74 65 6d 70 6c 61 74 65 7d 0a 0a 23 20  t1 template}..# 
2050: 44 72 6f 70 20 74 61 62 6c 65 20 74 31 2e 20 54  Drop table t1. T
2060: 68 69 73 20 73 68 6f 75 6c 64 20 63 61 75 73 65  his should cause
2070: 20 74 68 65 20 78 44 65 73 74 72 6f 79 20 28 62   the xDestroy (b
2080: 75 74 20 6e 6f 74 20 78 44 69 73 63 6f 6e 6e 65  ut not xDisconne
2090: 63 74 29 20 6d 65 74 68 6f 64 20 0a 23 20 74 6f  ct) method .# to
20a0: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 64 6f 5f   be invoked..do_
20b0: 74 65 73 74 20 76 74 61 62 31 2d 32 2e 35 20 7b  test vtab1-2.5 {
20c0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
20d0: 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  le "".  execsql 
20e0: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  {.    DROP TABLE
20f0: 20 74 31 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65   t1;.  }.  set e
2100: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 7b 78 44  cho_module.} {xD
2110: 65 73 74 72 6f 79 7d 0a 0a 64 6f 5f 74 65 73 74  estroy}..do_test
2120: 20 76 74 61 62 31 2d 32 2e 36 20 7b 0a 20 20 65   vtab1-2.6 {.  e
2130: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52  xecsql { .    PR
2140: 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28  AGMA table_info(
2150: 74 31 29 3b 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  t1); .  }.} {}.d
2160: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32 2e 37  o_test vtab1-2.7
2170: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2180: 20 20 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52     SELECT sql FR
2190: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
21a0: 3b 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 7b 43  ;.  }.} [list {C
21b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 6d 70  REATE TABLE temp
21c0: 6c 61 74 65 28 61 2c 20 62 2c 20 63 29 7d 5d 0a  late(a, b, c)}].
21d0: 23 20 43 6c 65 61 6e 20 75 70 20 6f 74 68 65 72  # Clean up other
21e0: 20 74 65 73 74 20 61 72 74 69 66 61 63 74 73 3a   test artifacts:
21f0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32  .do_test vtab1-2
2200: 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .8 {.  execsql {
2210: 20 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45   .    DROP TABLE
2220: 20 74 65 6d 70 6c 61 74 65 3b 0a 20 20 20 20 53   template;.    S
2230: 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
2240: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
2250: 7d 0a 7d 20 5b 6c 69 73 74 5d 0a 0a 23 2d 2d 2d  }.} [list]..#---
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 20  ---.# Test case 
22b0: 76 74 61 62 31 2d 33 20 74 65 73 74 20 74 61 62  vtab1-3 test tab
22c0: 6c 65 20 73 63 61 6e 73 20 61 6e 64 20 74 68 65  le scans and the
22d0: 20 65 63 68 6f 20 6d 6f 64 75 6c 65 27 73 20 0a   echo module's .
22e0: 23 20 78 42 65 73 74 49 6e 64 65 78 2f 78 46 69  # xBestIndex/xFi
22f0: 6c 74 65 72 20 68 61 6e 64 6c 69 6e 67 20 6f 66  lter handling of
2300: 20 57 48 45 52 45 20 63 6f 6e 64 69 74 69 6f 6e   WHERE condition
2310: 73 2e 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  s...do_test vtab
2320: 31 2d 33 2e 31 20 7b 0a 20 20 73 65 74 20 65 63  1-3.1 {.  set ec
2330: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65  ho_module "".  e
2340: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
2350: 41 54 45 20 54 41 42 4c 45 20 74 72 65 61 6c 28  ATE TABLE treal(
2360: 61 20 49 4e 54 45 47 45 52 2c 20 62 20 49 4e 54  a INTEGER, b INT
2370: 45 47 45 52 2c 20 63 29 3b 20 0a 20 20 20 20 43  EGER, c); .    C
2380: 52 45 41 54 45 20 49 4e 44 45 58 20 74 72 65 61  REATE INDEX trea
2390: 6c 5f 69 64 78 20 4f 4e 20 74 72 65 61 6c 28 62  l_idx ON treal(b
23a0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  );.    CREATE VI
23b0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55  RTUAL TABLE t1 U
23c0: 53 49 4e 47 20 65 63 68 6f 28 74 72 65 61 6c 29  SING echo(treal)
23d0: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f  ;.  }.  set echo
23e0: 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20  _module.} [list 
23f0: 78 43 72 65 61 74 65 20 65 63 68 6f 20 6d 61 69  xCreate echo mai
2400: 6e 20 74 31 20 74 72 65 61 6c 20 20 20 5c 0a 20  n t1 treal   \. 
2410: 20 20 20 20 20 20 20 78 53 79 6e 63 20 20 20 65         xSync   e
2420: 63 68 6f 28 74 72 65 61 6c 29 20 20 5c 0a 20 20  cho(treal)  \.  
2430: 20 20 20 20 20 20 78 43 6f 6d 6d 69 74 20 65 63        xCommit ec
2440: 68 6f 28 74 72 65 61 6c 29 20 20 5c 0a 5d 0a 0a  ho(treal)  \.]..
2450: 23 20 54 65 73 74 20 74 68 61 74 20 61 20 53 45  # Test that a SE
2460: 4c 45 43 54 20 6f 6e 20 74 31 20 64 6f 65 73 6e  LECT on t1 doesn
2470: 27 74 20 63 72 61 73 68 2e 20 4e 6f 20 72 6f 77  't crash. No row
2480: 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 0a 23  s are returned.#
2490: 20 62 65 63 61 75 73 65 20 74 68 65 20 75 6e 64   because the und
24a0: 65 72 6c 79 69 6e 67 20 72 65 61 6c 20 74 61 62  erlying real tab
24b0: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
24c0: 65 6d 70 74 79 2e 0a 23 0a 64 6f 5f 74 65 73 74  empty..#.do_test
24d0: 20 76 74 61 62 31 2d 33 2e 32 20 7b 0a 20 20 65   vtab1-3.2 {.  e
24e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
24f0: 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d  ECT a, b, c FROM
2500: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23   t1;.  }.} {}..#
2510: 20 50 75 74 20 73 6f 6d 65 20 64 61 74 61 20 69   Put some data i
2520: 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 72  nto the table tr
2530: 65 61 6c 2e 20 54 68 65 6e 20 74 72 79 20 61 20  eal. Then try a 
2540: 66 65 77 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  few simple SELEC
2550: 54 20 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20  T .# statements 
2560: 6f 6e 20 74 31 2e 0a 23 0a 64 6f 5f 74 65 73 74  on t1..#.do_test
2570: 20 76 74 61 62 31 2d 33 2e 33 20 7b 0a 20 20 65   vtab1-3.3 {.  e
2580: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
2590: 45 52 54 20 49 4e 54 4f 20 74 72 65 61 6c 20 56  ERT INTO treal V
25a0: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
25b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
25c0: 74 72 65 61 6c 20 56 41 4c 55 45 53 28 34 2c 20  treal VALUES(4, 
25d0: 35 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c 45 43  5, 6);.    SELEC
25e0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
25f0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d  .} {1 2 3 4 5 6}
2600: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33  .do_test vtab1-3
2610: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
2620: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52  .    SELECT a FR
2630: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
2640: 34 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  4}.do_test vtab1
2650: 2d 33 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  -3.5 {.  execsql
2660: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f   {.    SELECT ro
2670: 77 69 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  wid FROM t1;.  }
2680: 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {1 2}.do_test
2690: 20 76 74 61 62 31 2d 33 2e 36 20 7b 0a 20 20 73   vtab1-3.6 {.  s
26a0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22  et echo_module "
26b0: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
26c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
26d0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33  t1;.  }.} {1 2 3
26e0: 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20   4 5 6}.do_test 
26f0: 76 74 61 62 31 2d 33 2e 37 20 7b 0a 20 20 65 78  vtab1-3.7 {.  ex
2700: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
2710: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
2720: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 20   t1;.  }.} {1 1 
2730: 32 20 33 20 32 20 34 20 35 20 36 7d 0a 64 6f 5f  2 3 2 4 5 6}.do_
2740: 74 65 73 74 20 76 74 61 62 31 2d 33 2e 38 2e 31  test vtab1-3.8.1
2750: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2760: 20 20 20 53 45 4c 45 43 54 20 61 20 41 53 20 64     SELECT a AS d
2770: 2c 20 62 20 41 53 20 65 2c 20 63 20 41 53 20 66  , b AS e, c AS f
2780: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
2790: 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 23  {1 2 3 4 5 6}..#
27a0: 20 45 78 65 63 75 74 65 20 73 6f 6d 65 20 53 45   Execute some SE
27b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
27c0: 77 69 74 68 20 57 48 45 52 45 20 63 6c 61 75 73  with WHERE claus
27d0: 65 73 20 6f 6e 20 74 68 65 20 74 31 20 74 61 62  es on the t1 tab
27e0: 6c 65 2e 0a 23 20 54 68 65 6e 20 63 68 65 63 6b  le..# Then check
27f0: 20 74 68 65 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   the echo_module
2800: 20 76 61 72 69 61 62 6c 65 20 28 77 72 69 74 74   variable (writt
2810: 65 6e 20 74 6f 20 62 79 20 74 68 65 20 6d 6f 64  en to by the mod
2820: 75 6c 65 20 6d 65 74 68 6f 64 73 0a 23 20 69 6e  ule methods.# in
2830: 20 74 65 73 74 38 2e 63 29 20 74 6f 20 6d 61 6b   test8.c) to mak
2840: 65 20 73 75 72 65 20 74 68 65 20 78 42 65 73 74  e sure the xBest
2850: 49 6e 64 65 78 28 29 20 61 6e 64 20 78 46 69 6c  Index() and xFil
2860: 74 65 72 28 29 20 6d 65 74 68 6f 64 73 20 77 65  ter() methods we
2870: 72 65 0a 23 20 63 61 6c 6c 65 64 20 63 6f 72 72  re.# called corr
2880: 65 63 74 6c 79 2e 0a 23 0a 64 6f 5f 74 65 73 74  ectly..#.do_test
2890: 20 76 74 61 62 31 2d 33 2e 38 2e 32 20 7b 0a 20   vtab1-3.8.2 {. 
28a0: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
28b0: 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   "".  execsql {.
28c0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
28d0: 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 73 65 74 20  M t1;.  }.  set 
28e0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c  echo_module.} [l
28f0: 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b  ist xBestIndex {
2900: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c  SELECT rowid, a,
2910: 20 62 2c 20 63 20 46 52 4f 4d 20 27 74 72 65 61   b, c FROM 'trea
2920: 6c 27 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46  l'} \.        xF
2930: 69 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54  ilter    {SELECT
2940: 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20   rowid, a, b, c 
2950: 46 52 4f 4d 20 27 74 72 65 61 6c 27 7d 20 5d 0a  FROM 'treal'} ].
2960: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e  do_test vtab1-3.
2970: 39 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  9 {.  set echo_m
2980: 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73  odule "".  execs
2990: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
29a0: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
29b0: 62 20 3d 20 35 3b 0a 20 20 7d 0a 7d 20 7b 34 20  b = 5;.  }.} {4 
29c0: 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  5 6}.do_test vta
29d0: 62 31 2d 33 2e 31 30 20 7b 0a 20 20 73 65 74 20  b1-3.10 {.  set 
29e0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c  echo_module.} [l
29f0: 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b  ist xBestIndex {
2a00: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c  SELECT rowid, a,
2a10: 20 62 2c 20 63 20 46 52 4f 4d 20 27 74 72 65 61   b, c FROM 'trea
2a20: 6c 27 20 57 48 45 52 45 20 62 20 3d 20 3f 7d 20  l' WHERE b = ?} 
2a30: 20 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c    \.        xFil
2a40: 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72  ter    {SELECT r
2a50: 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 46 52  owid, a, b, c FR
2a60: 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52 45  OM 'treal' WHERE
2a70: 20 62 20 3d 20 3f 7d 20 35 20 5d 0a 64 6f 5f 74   b = ?} 5 ].do_t
2a80: 65 73 74 20 76 74 61 62 31 2d 33 2e 31 30 20 7b  est vtab1-3.10 {
2a90: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
2aa0: 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  le "".  execsql 
2ab0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
2ac0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 3e  ROM t1 WHERE b >
2ad0: 3d 20 35 20 41 4e 44 20 62 20 3c 3d 20 31 30 3b  = 5 AND b <= 10;
2ae0: 0a 20 20 7d 0a 7d 20 7b 34 20 35 20 36 7d 0a 64  .  }.} {4 5 6}.d
2af0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31  o_test vtab1-3.1
2b00: 31 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  1 {.  set echo_m
2b10: 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42  odule.} [list xB
2b20: 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54  estIndex {SELECT
2b30: 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20   rowid, a, b, c 
2b40: 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45  FROM 'treal' WHE
2b50: 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20  RE b >= ? AND b 
2b60: 3c 3d 20 3f 7d 5c 0a 20 20 20 20 20 20 20 20 78  <= ?}\.        x
2b70: 46 69 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43  Filter    {SELEC
2b80: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
2b90: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48   FROM 'treal' WH
2ba0: 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62  ERE b >= ? AND b
2bb0: 20 3c 3d 20 3f 7d 5c 0a 20 20 20 20 20 20 20 20   <= ?}\.        
2bc0: 35 20 31 30 20 5d 0a 64 6f 5f 74 65 73 74 20 76  5 10 ].do_test v
2bd0: 74 61 62 31 2d 33 2e 31 32 20 7b 0a 20 20 73 65  tab1-3.12 {.  se
2be0: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22  t echo_module ""
2bf0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2c00: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2c10: 31 20 57 48 45 52 45 20 62 20 42 45 54 57 45 45  1 WHERE b BETWEE
2c20: 4e 20 32 20 41 4e 44 20 31 30 3b 0a 20 20 7d 0a  N 2 AND 10;.  }.
2c30: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
2c40: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e  do_test vtab1-3.
2c50: 31 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  13 {.  set echo_
2c60: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78  module.} [list x
2c70: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43  BestIndex {SELEC
2c80: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
2c90: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48   FROM 'treal' WH
2ca0: 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62  ERE b >= ? AND b
2cb0: 20 3c 3d 20 3f 7d 5c 0a 20 20 20 20 20 20 20 20   <= ?}\.        
2cc0: 78 46 69 6c 74 65 72 20 20 20 20 7b 53 45 4c 45  xFilter    {SELE
2cd0: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  CT rowid, a, b, 
2ce0: 63 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57  c FROM 'treal' W
2cf0: 48 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20  HERE b >= ? AND 
2d00: 62 20 3c 3d 20 3f 7d 5c 0a 20 20 20 20 20 20 20  b <= ?}\.       
2d10: 20 32 20 31 30 20 5d 0a 0a 23 20 41 64 64 20 61   2 10 ]..# Add a
2d20: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68   function for th
2d30: 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72  e MATCH operator
2d40: 2e 20 45 76 65 72 79 74 68 69 6e 67 20 61 6c 77  . Everything alw
2d50: 61 79 73 20 6d 61 74 63 68 65 73 21 0a 23 70 72  ays matches!.#pr
2d60: 6f 63 20 74 65 73 74 5f 6d 61 74 63 68 20 7b 6c  oc test_match {l
2d70: 68 73 20 72 68 73 7d 20 7b 0a 23 20 20 6c 61 70  hs rhs} {.#  lap
2d80: 70 65 6e 64 20 3a 3a 65 63 68 6f 5f 6d 6f 64 75  pend ::echo_modu
2d90: 6c 65 20 4d 41 54 43 48 20 24 6c 68 73 20 24 72  le MATCH $lhs $r
2da0: 68 73 0a 23 20 20 72 65 74 75 72 6e 20 31 0a 23  hs.#  return 1.#
2db0: 7d 0a 23 64 62 20 66 75 6e 63 74 69 6f 6e 20 6d  }.#db function m
2dc0: 61 74 63 68 20 74 65 73 74 5f 6d 61 74 63 68 0a  atch test_match.
2dd0: 0a 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65  .set echo_module
2de0: 20 22 22 0a 64 6f 5f 74 65 73 74 20 76 74 61 62   "".do_test vtab
2df0: 31 2d 33 2e 31 32 20 7b 0a 20 20 73 65 74 20 65  1-3.12 {.  set e
2e00: 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20  cho_module "".  
2e10: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
2e20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2e30: 57 48 45 52 45 20 61 20 4d 41 54 43 48 20 27 73  WHERE a MATCH 's
2e40: 74 72 69 6e 67 27 3b 0a 20 20 7d 0a 7d 20 7b 31  tring';.  }.} {1
2e50: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   {unable to use 
2e60: 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69  function MATCH i
2e70: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
2e80: 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 74 65 73  context}}.do_tes
2e90: 74 20 76 74 61 62 31 2d 33 2e 31 33 20 7b 0a 20  t vtab1-3.13 {. 
2ea0: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
2eb0: 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e  .} [list xBestIn
2ec0: 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  dex {SELECT rowi
2ed0: 64 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  d, a, b, c FROM 
2ee0: 27 74 72 65 61 6c 27 7d 20 5c 0a 20 20 20 20 20  'treal'} \.     
2ef0: 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53     xFilter    {S
2f00: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20  ELECT rowid, a, 
2f10: 62 2c 20 63 20 46 52 4f 4d 20 27 74 72 65 61 6c  b, c FROM 'treal
2f20: 27 7d 5d 0a 69 66 63 61 70 61 62 6c 65 20 73 75  '}].ifcapable su
2f30: 62 71 75 65 72 79 20 7b 0a 23 20 54 68 65 20 65  bquery {.# The e
2f40: 63 68 6f 20 6d 6f 64 75 6c 65 20 75 73 65 73 20  cho module uses 
2f50: 61 20 73 75 62 71 75 65 72 79 20 69 6e 74 65 72  a subquery inter
2f60: 6e 61 6c 6c 79 20 74 6f 20 69 6d 70 6c 65 6d 65  nally to impleme
2f70: 6e 74 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65  nt the MATCH ope
2f80: 72 61 74 6f 72 2e 0a 64 6f 5f 74 65 73 74 20 76  rator..do_test v
2f90: 74 61 62 31 2d 33 2e 31 34 20 7b 0a 20 20 73 65  tab1-3.14 {.  se
2fa0: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22  t echo_module ""
2fb0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2fc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2fd0: 31 20 57 48 45 52 45 20 62 20 4d 41 54 43 48 20  1 WHERE b MATCH 
2fe0: 27 73 74 72 69 6e 67 27 3b 0a 20 20 7d 0a 7d 20  'string';.  }.} 
2ff0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  {}.do_test vtab1
3000: 2d 33 2e 31 35 20 7b 0a 20 20 73 65 74 20 65 63  -3.15 {.  set ec
3010: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
3020: 74 20 78 42 65 73 74 49 6e 64 65 78 20 5c 0a 20  t xBestIndex \. 
3030: 20 20 20 20 20 20 20 7b 53 45 4c 45 43 54 20 72         {SELECT r
3040: 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 46 52  owid, a, b, c FR
3050: 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52 45  OM 'treal' WHERE
3060: 20 62 20 4c 49 4b 45 20 28 53 45 4c 45 43 54 20   b LIKE (SELECT 
3070: 27 25 27 7c 7c 3f 7c 7c 27 25 27 29 7d 20 5c 0a  '%'||?||'%')} \.
3080: 20 20 20 20 20 20 20 20 78 46 69 6c 74 65 72 20          xFilter 
3090: 5c 0a 20 20 20 20 20 20 20 20 7b 53 45 4c 45 43  \.        {SELEC
30a0: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
30b0: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48   FROM 'treal' WH
30c0: 45 52 45 20 62 20 4c 49 4b 45 20 28 53 45 4c 45  ERE b LIKE (SELE
30d0: 43 54 20 27 25 27 7c 7c 3f 7c 7c 27 25 27 29 7d  CT '%'||?||'%')}
30e0: 20 5c 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e   \.        strin
30f0: 67 20 5d 0a 7d 3b 20 23 69 66 63 61 70 61 62 6c  g ].}; #ifcapabl
3100: 65 20 73 75 62 71 75 65 72 79 0a 0a 23 2d 2d 2d  e subquery..#---
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 20  ---.# Test case 
3160: 76 74 61 62 31 2d 33 20 74 65 73 74 20 74 61 62  vtab1-3 test tab
3170: 6c 65 20 73 63 61 6e 73 20 61 6e 64 20 74 68 65  le scans and the
3180: 20 65 63 68 6f 20 6d 6f 64 75 6c 65 27 73 20 0a   echo module's .
3190: 23 20 78 42 65 73 74 49 6e 64 65 78 2f 78 46 69  # xBestIndex/xFi
31a0: 6c 74 65 72 20 68 61 6e 64 6c 69 6e 67 20 6f 66  lter handling of
31b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
31c0: 73 2e 0a 0a 23 20 54 68 69 73 20 70 72 6f 63 65  s...# This proce
31d0: 64 75 72 65 20 65 78 65 63 75 74 65 73 20 74 68  dure executes th
31e0: 65 20 53 51 4c 2e 20 20 54 68 65 6e 20 69 74 20  e SQL.  Then it 
31f0: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
3200: 20 74 68 65 20 4f 50 5f 53 6f 72 74 0a 23 20 6f   the OP_Sort.# o
3210: 70 63 6f 64 65 20 77 61 73 20 65 78 65 63 75 74  pcode was execut
3220: 65 64 2e 20 20 49 66 20 61 6e 20 4f 50 5f 53 6f  ed.  If an OP_So
3230: 72 74 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68  rt did occur, th
3240: 65 6e 20 22 73 6f 72 74 22 20 69 73 20 61 70 70  en "sort" is app
3250: 65 6e 64 65 64 0a 23 20 74 6f 20 74 68 65 20 72  ended.# to the r
3260: 65 73 75 6c 74 2e 20 20 49 66 20 6e 6f 20 4f 50  esult.  If no OP
3270: 5f 53 6f 72 74 20 68 61 70 70 65 6e 65 64 2c 20  _Sort happened, 
3280: 74 68 65 6e 20 22 6e 6f 73 6f 72 74 22 20 69 73  then "nosort" is
3290: 20 61 70 70 65 6e 64 65 64 2e 0a 23 0a 23 20 54   appended..#.# T
32a0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
32b0: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 74   used to check t
32c0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 73 6f 72 74  o make sure sort
32d0: 69 6e 67 20 69 73 20 6f 72 20 69 73 20 6e 6f 74  ing is or is not
32e0: 0a 23 20 6f 63 63 75 72 72 69 6e 67 20 61 73 20  .# occurring as 
32f0: 65 78 70 65 63 74 65 64 2e 0a 23 0a 70 72 6f 63  expected..#.proc
3300: 20 63 6b 73 6f 72 74 20 7b 73 71 6c 7d 20 7b 0a   cksort {sql} {.
3310: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 73    set ::sqlite_s
3320: 6f 72 74 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65  ort_count 0.  se
3330: 74 20 64 61 74 61 20 5b 65 78 65 63 73 71 6c 20  t data [execsql 
3340: 24 73 71 6c 5d 0a 20 20 69 66 20 7b 24 3a 3a 73  $sql].  if {$::s
3350: 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74  qlite_sort_count
3360: 7d 20 7b 73 65 74 20 78 20 73 6f 72 74 7d 20 7b  } {set x sort} {
3370: 73 65 74 20 78 20 6e 6f 73 6f 72 74 7d 0a 20 20  set x nosort}.  
3380: 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24 78 0a  lappend data $x.
3390: 20 20 72 65 74 75 72 6e 20 24 64 61 74 61 0a 7d    return $data.}
33a0: 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ..do_test vtab1-
33b0: 34 2e 31 20 7b 0a 20 20 73 65 74 20 65 63 68 6f  4.1 {.  set echo
33c0: 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63 6b 73  _module "".  cks
33d0: 6f 72 74 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  ort {.    SELECT
33e0: 20 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   b FROM t1 ORDER
33f0: 20 42 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b 32 20   BY b;.  }.} {2 
3400: 35 20 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65 73  5 nosort}.do_tes
3410: 74 20 76 74 61 62 31 2d 34 2e 32 20 7b 0a 20 20  t vtab1-4.2 {.  
3420: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a  set echo_module.
3430: 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64  } [list xBestInd
3440: 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  ex {SELECT rowid
3450: 2c 20 4e 55 4c 4c 2c 20 62 2c 20 4e 55 4c 4c 20  , NULL, b, NULL 
3460: 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52 44  FROM 'treal' ORD
3470: 45 52 20 42 59 20 62 20 41 53 43 7d 20 5c 0a 20  ER BY b ASC} \. 
3480: 20 20 20 20 20 20 20 78 46 69 6c 74 65 72 20 20         xFilter  
3490: 20 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c    {SELECT rowid,
34a0: 20 4e 55 4c 4c 2c 20 62 2c 20 4e 55 4c 4c 20 46   NULL, b, NULL F
34b0: 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52 44 45  ROM 'treal' ORDE
34c0: 52 20 42 59 20 62 20 41 53 43 7d 20 5d 0a 64 6f  R BY b ASC} ].do
34d0: 5f 74 65 73 74 20 76 74 61 62 31 2d 34 2e 33 20  _test vtab1-4.3 
34e0: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
34f0: 75 6c 65 20 22 22 0a 20 20 63 6b 73 6f 72 74 20  ule "".  cksort 
3500: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20 46  {.    SELECT b F
3510: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
3520: 62 20 44 45 53 43 3b 0a 20 20 7d 0a 7d 20 7b 35  b DESC;.  }.} {5
3530: 20 32 20 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65   2 nosort}.do_te
3540: 73 74 20 76 74 61 62 31 2d 34 2e 34 20 7b 0a 20  st vtab1-4.4 {. 
3550: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
3560: 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e  .} [list xBestIn
3570: 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  dex {SELECT rowi
3580: 64 2c 20 4e 55 4c 4c 2c 20 62 2c 20 4e 55 4c 4c  d, NULL, b, NULL
3590: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52   FROM 'treal' OR
35a0: 44 45 52 20 42 59 20 62 20 44 45 53 43 7d 20 5c  DER BY b DESC} \
35b0: 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74 65 72  .        xFilter
35c0: 20 20 20 20 7b 53 45 4c 45 43 54 20 72 6f 77 69      {SELECT rowi
35d0: 64 2c 20 4e 55 4c 4c 2c 20 62 2c 20 4e 55 4c 4c  d, NULL, b, NULL
35e0: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52   FROM 'treal' OR
35f0: 44 45 52 20 42 59 20 62 20 44 45 53 43 7d 20 5d  DER BY b DESC} ]
3600: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 34  .do_test vtab1-4
3610: 2e 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  .3 {.  set echo_
3620: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63 6b 73 6f  module "".  ckso
3630: 72 74 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  rt {.    SELECT 
3640: 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  b FROM t1 ORDER 
3650: 42 59 20 62 7c 7c 27 27 3b 0a 20 20 7d 0a 7d 20  BY b||'';.  }.} 
3660: 7b 32 20 35 20 73 6f 72 74 7d 0a 64 6f 5f 74 65  {2 5 sort}.do_te
3670: 73 74 20 76 74 61 62 31 2d 34 2e 34 20 7b 0a 20  st vtab1-4.4 {. 
3680: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
3690: 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e  .} [list xBestIn
36a0: 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  dex {SELECT rowi
36b0: 64 2c 20 4e 55 4c 4c 2c 20 62 2c 20 4e 55 4c 4c  d, NULL, b, NULL
36c0: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 7d 20 5c   FROM 'treal'} \
36d0: 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74 65 72  .        xFilter
36e0: 20 20 20 20 7b 53 45 4c 45 43 54 20 72 6f 77 69      {SELECT rowi
36f0: 64 2c 20 4e 55 4c 4c 2c 20 62 2c 20 4e 55 4c 4c  d, NULL, b, NULL
3700: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 7d 20 5d   FROM 'treal'} ]
3710: 0a 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 44 52  ..execsql {.  DR
3720: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 44  OP TABLE t1;.  D
3730: 52 4f 50 20 54 41 42 4c 45 20 74 72 65 61 6c 3b  ROP TABLE treal;
3740: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
3790: 73 74 20 63 61 73 65 73 20 76 74 61 62 31 2d 35  st cases vtab1-5
37a0: 20 74 65 73 74 20 53 45 4c 45 43 54 20 71 75 65   test SELECT que
37b0: 72 69 65 73 20 74 68 61 74 20 69 6e 63 6c 75 64  ries that includ
37c0: 65 20 6a 6f 69 6e 73 20 6f 6e 20 76 69 72 74 75  e joins on virtu
37d0: 61 6c 20 0a 23 20 74 61 62 6c 65 73 2e 0a 0a 70  al .# tables...p
37e0: 72 6f 63 20 66 69 6c 74 65 72 20 7b 6c 6f 67 7d  roc filter {log}
37f0: 20 7b 0a 20 20 73 65 74 20 6f 75 74 20 5b 6c 69   {.  set out [li
3800: 73 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  st].  for {set i
3810: 69 20 30 7d 20 7b 24 69 69 20 3c 20 5b 6c 6c 65  i 0} {$ii < [lle
3820: 6e 67 74 68 20 24 6c 6f 67 5d 7d 20 7b 69 6e 63  ngth $log]} {inc
3830: 72 20 69 69 7d 20 7b 0a 20 20 20 20 69 66 20 7b  r ii} {.    if {
3840: 5b 6c 69 6e 64 65 78 20 24 6c 6f 67 20 24 69 69  [lindex $log $ii
3850: 5d 20 65 71 20 22 78 46 69 6c 74 65 72 22 7d 20  ] eq "xFilter"} 
3860: 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  {.      lappend 
3870: 6f 75 74 20 78 46 69 6c 74 65 72 0a 20 20 20 20  out xFilter.    
3880: 20 20 6c 61 70 70 65 6e 64 20 6f 75 74 20 5b 6c    lappend out [l
3890: 69 6e 64 65 78 20 24 6c 6f 67 20 5b 65 78 70 72  index $log [expr
38a0: 20 24 69 69 2b 31 5d 5d 0a 20 20 20 20 7d 0a 20   $ii+1]].    }. 
38b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 24 6f 75 74   }.  return $out
38c0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  .}..do_test vtab
38d0: 31 2d 35 2d 31 20 7b 0a 20 20 65 78 65 63 73 71  1-5-1 {.  execsq
38e0: 6c 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  l { .    CREATE 
38f0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
3900: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
3910: 42 4c 45 20 74 32 28 64 2c 20 65 2c 20 66 29 3b  BLE t2(d, e, f);
3920: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3930: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 72   t1 VALUES(1, 'r
3940: 65 64 27 2c 20 27 67 72 65 65 6e 27 29 3b 0a 20  ed', 'green');. 
3950: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3960: 31 20 56 41 4c 55 45 53 28 32 2c 20 27 62 6c 75  1 VALUES(2, 'blu
3970: 65 27 2c 20 27 62 6c 61 63 6b 27 29 3b 0a 20 20  e', 'black');.  
3980: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
3990: 20 56 41 4c 55 45 53 28 31 2c 20 27 73 70 61 64   VALUES(1, 'spad
39a0: 65 73 27 2c 20 27 63 6c 75 62 73 27 29 3b 0a 20  es', 'clubs');. 
39b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
39c0: 32 20 56 41 4c 55 45 53 28 32 2c 20 27 68 65 61  2 VALUES(2, 'hea
39d0: 72 74 73 27 2c 20 27 64 69 61 6d 6f 6e 64 73 27  rts', 'diamonds'
39e0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  );.    CREATE VI
39f0: 52 54 55 41 4c 20 54 41 42 4c 45 20 65 74 31 20  RTUAL TABLE et1 
3a00: 55 53 49 4e 47 20 65 63 68 6f 28 74 31 29 3b 0a  USING echo(t1);.
3a10: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
3a20: 41 4c 20 54 41 42 4c 45 20 65 74 32 20 55 53 49  AL TABLE et2 USI
3a30: 4e 47 20 65 63 68 6f 28 74 32 29 3b 0a 20 20 7d  NG echo(t2);.  }
3a40: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 76  .} {}..do_test v
3a50: 74 61 62 31 2d 35 2d 32 20 7b 0a 20 20 73 65 74  tab1-5-2 {.  set
3a60: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a   echo_module "".
3a70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3a80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 74  SELECT * FROM et
3a90: 31 2c 20 65 74 32 3b 0a 20 20 7d 0a 7d 20 5b 6c  1, et2;.  }.} [l
3aa0: 69 73 74 20 5c 0a 20 20 31 20 72 65 64 20 67 72  ist \.  1 red gr
3ab0: 65 65 6e 20 31 20 73 70 61 64 65 73 20 63 6c 75  een 1 spades clu
3ac0: 62 73 20 20 20 20 20 5c 0a 20 20 31 20 72 65 64  bs     \.  1 red
3ad0: 20 67 72 65 65 6e 20 32 20 68 65 61 72 74 73 20   green 2 hearts 
3ae0: 64 69 61 6d 6f 6e 64 73 20 20 5c 0a 20 20 32 20  diamonds  \.  2 
3af0: 62 6c 75 65 20 62 6c 61 63 6b 20 31 20 73 70 61  blue black 1 spa
3b00: 64 65 73 20 63 6c 75 62 73 20 20 20 20 5c 0a 20  des clubs    \. 
3b10: 20 32 20 62 6c 75 65 20 62 6c 61 63 6b 20 32 20   2 blue black 2 
3b20: 68 65 61 72 74 73 20 64 69 61 6d 6f 6e 64 73 20  hearts diamonds 
3b30: 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  \.].do_test vtab
3b40: 31 2d 35 2d 33 20 7b 0a 20 20 66 69 6c 74 65 72  1-5-3 {.  filter
3b50: 20 24 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20   $echo_module.} 
3b60: 5b 6c 69 73 74 20 5c 0a 20 20 78 46 69 6c 74 65  [list \.  xFilte
3b70: 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  r {SELECT rowid,
3b80: 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 27 74   a, b, c FROM 't
3b90: 31 27 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20  1'} \.  xFilter 
3ba0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 64  {SELECT rowid, d
3bb0: 2c 20 65 2c 20 66 20 46 52 4f 4d 20 27 74 32 27  , e, f FROM 't2'
3bc0: 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53  } \.  xFilter {S
3bd0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 64 2c 20  ELECT rowid, d, 
3be0: 65 2c 20 66 20 46 52 4f 4d 20 27 74 32 27 7d 20  e, f FROM 't2'} 
3bf0: 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  \.].do_test vtab
3c00: 31 2d 35 2d 34 20 7b 0a 20 20 73 65 74 20 65 63  1-5-4 {.  set ec
3c10: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65  ho_module "".  e
3c20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3c30: 45 43 54 20 2a 20 46 52 4f 4d 20 65 74 31 2c 20  ECT * FROM et1, 
3c40: 65 74 32 20 57 48 45 52 45 20 65 74 32 2e 64 20  et2 WHERE et2.d 
3c50: 3d 20 32 3b 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74  = 2;.  }.} [list
3c60: 20 5c 0a 20 20 31 20 72 65 64 20 67 72 65 65 6e   \.  1 red green
3c70: 20 32 20 68 65 61 72 74 73 20 64 69 61 6d 6f 6e   2 hearts diamon
3c80: 64 73 20 20 5c 0a 20 20 32 20 62 6c 75 65 20 62  ds  \.  2 blue b
3c90: 6c 61 63 6b 20 32 20 68 65 61 72 74 73 20 64 69  lack 2 hearts di
3ca0: 61 6d 6f 6e 64 73 20 5c 0a 5d 0a 64 6f 5f 74 65  amonds \.].do_te
3cb0: 73 74 20 76 74 61 62 31 2d 35 2d 35 20 7b 0a 20  st vtab1-5-5 {. 
3cc0: 20 66 69 6c 74 65 72 20 24 65 63 68 6f 5f 6d 6f   filter $echo_mo
3cd0: 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20  dule.} [list \. 
3ce0: 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54   xFilter {SELECT
3cf0: 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20   rowid, a, b, c 
3d00: 46 52 4f 4d 20 27 74 31 27 7d 20 5c 0a 20 20 78  FROM 't1'} \.  x
3d10: 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72  Filter {SELECT r
3d20: 6f 77 69 64 2c 20 64 2c 20 65 2c 20 66 20 46 52  owid, d, e, f FR
3d30: 4f 4d 20 27 74 32 27 7d 20 5c 0a 20 20 78 46 69  OM 't2'} \.  xFi
3d40: 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77  lter {SELECT row
3d50: 69 64 2c 20 64 2c 20 65 2c 20 66 20 46 52 4f 4d  id, d, e, f FROM
3d60: 20 27 74 32 27 7d 20 5c 0a 5d 0a 64 6f 5f 74 65   't2'} \.].do_te
3d70: 73 74 20 76 74 61 62 31 2d 35 2d 36 20 7b 0a 20  st vtab1-5-6 {. 
3d80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
3d90: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
3da0: 4e 20 74 32 28 64 29 3b 0a 20 20 7d 0a 0a 20 20  N t2(d);.  }..  
3db0: 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
3dc0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
3dd0: 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f  register_echo_mo
3de0: 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f  dule [sqlite3_co
3df0: 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
3e00: 20 64 62 5d 0a 0a 20 20 73 65 74 20 3a 3a 65 63   db]..  set ::ec
3e10: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65  ho_module "".  e
3e20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
3e30: 45 43 54 20 2a 20 46 52 4f 4d 20 65 74 31 2c 20  ECT * FROM et1, 
3e40: 65 74 32 20 57 48 45 52 45 20 65 74 32 2e 64 20  et2 WHERE et2.d 
3e50: 3d 20 32 3b 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74  = 2;.  }.} [list
3e60: 20 5c 0a 20 20 31 20 72 65 64 20 67 72 65 65 6e   \.  1 red green
3e70: 20 32 20 68 65 61 72 74 73 20 64 69 61 6d 6f 6e   2 hearts diamon
3e80: 64 73 20 20 5c 0a 20 20 32 20 62 6c 75 65 20 62  ds  \.  2 blue b
3e90: 6c 61 63 6b 20 32 20 68 65 61 72 74 73 20 64 69  lack 2 hearts di
3ea0: 61 6d 6f 6e 64 73 20 5c 0a 5d 0a 64 6f 5f 74 65  amonds \.].do_te
3eb0: 73 74 20 76 74 61 62 31 2d 35 2d 37 20 7b 0a 20  st vtab1-5-7 {. 
3ec0: 20 66 69 6c 74 65 72 20 24 3a 3a 65 63 68 6f 5f   filter $::echo_
3ed0: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c  module.} [list \
3ee0: 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45  .  xFilter {SELE
3ef0: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  CT rowid, a, b, 
3f00: 63 20 46 52 4f 4d 20 27 74 31 27 7d 20 20 20 20  c FROM 't1'}    
3f10: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 78 46 69           \.  xFi
3f20: 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77  lter {SELECT row
3f30: 69 64 2c 20 64 2c 20 65 2c 20 66 20 46 52 4f 4d  id, d, e, f FROM
3f40: 20 27 74 32 27 20 57 48 45 52 45 20 64 20 3d 20   't2' WHERE d = 
3f50: 3f 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b  ?} \.  xFilter {
3f60: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 64 2c  SELECT rowid, d,
3f70: 20 65 2c 20 66 20 46 52 4f 4d 20 27 74 32 27 20   e, f FROM 't2' 
3f80: 57 48 45 52 45 20 64 20 3d 20 3f 7d 20 5c 0a 5d  WHERE d = ?} \.]
3f90: 0a 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 44 52  ..execsql {.  DR
3fa0: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 44  OP TABLE t1;.  D
3fb0: 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20 20  ROP TABLE t2;.  
3fc0: 44 52 4f 50 20 54 41 42 4c 45 20 65 74 31 3b 0a  DROP TABLE et1;.
3fd0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 65 74 32    DROP TABLE et2
3fe0: 3b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ;.}..#----------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
4030: 65 73 74 20 63 61 73 65 73 20 76 74 61 62 31 2d  est cases vtab1-
4040: 36 20 74 65 73 74 20 49 4e 53 45 52 54 2c 20 55  6 test INSERT, U
4050: 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45  PDATE and DELETE
4060: 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 23 20 6f   operations .# o
4070: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
4080: 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ..do_test vtab1-
4090: 36 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6-1 {.  execsql 
40a0: 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f  { SELECT sql FRO
40b0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
40c0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76  }.} {}.do_test v
40d0: 74 61 62 31 2d 36 2d 32 20 7b 0a 20 20 65 78 65  tab1-6-2 {.  exe
40e0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
40f0: 45 20 54 41 42 4c 45 20 74 72 65 61 6c 28 61 20  E TABLE treal(a 
4100: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20  PRIMARY KEY, b, 
4110: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56  c);.    CREATE V
4120: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 63  IRTUAL TABLE tec
4130: 68 6f 20 55 53 49 4e 47 20 65 63 68 6f 28 74 72  ho USING echo(tr
4140: 65 61 6c 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  eal);.    SELECT
4150: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
4160: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
4170: 79 70 65 20 3d 20 27 74 61 62 6c 65 27 3b 0a 20  ype = 'table';. 
4180: 20 7d 0a 7d 20 7b 74 72 65 61 6c 20 74 65 63 68   }.} {treal tech
4190: 6f 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  o}.do_test vtab1
41a0: 2d 36 2d 33 2e 31 2e 31 20 7b 0a 20 20 65 78 65  -6-3.1.1 {.  exe
41b0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
41c0: 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73 3d  A count_changes=
41d0: 4f 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ON;.    INSERT I
41e0: 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c 55 45 53  NTO techo VALUES
41f0: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d  (1, 2, 3);.  }.}
4200: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   {1}.do_test vta
4210: 62 31 2d 36 2d 33 2e 31 2e 32 20 7b 0a 20 20 64  b1-6-3.1.2 {.  d
4220: 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a  b changes.} {1}.
4230: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d  do_test vtab1-6-
4240: 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.2 {.  execsql 
4250: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
4260: 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d  ROM techo;.  }.}
4270: 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74   {1 2 3}.do_test
4280: 20 76 74 61 62 31 2d 36 2d 34 2e 31 20 7b 0a 20   vtab1-6-4.1 {. 
4290: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
42a0: 50 44 41 54 45 20 74 65 63 68 6f 20 53 45 54 20  PDATE techo SET 
42b0: 61 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 64 62 20  a = 5;.  }.  db 
42c0: 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 64 6f  changes.} {1}.do
42d0: 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 34 2e  _test vtab1-6-4.
42e0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
42f0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4300: 4d 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b  M techo;.  }.} {
4310: 35 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 76  5 2 3}.do_test v
4320: 74 61 62 31 2d 36 2d 34 2e 33 20 7b 0a 20 20 65  tab1-6-4.3 {.  e
4330: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
4340: 41 54 45 20 74 65 63 68 6f 20 53 45 54 20 61 3d  ATE techo SET a=
4350: 36 20 57 48 45 52 45 20 61 3c 30 3b 0a 20 20 7d  6 WHERE a<0;.  }
4360: 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20  .  db changes.} 
4370: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  {0}.do_test vtab
4380: 31 2d 36 2d 34 2e 34 20 7b 0a 20 20 65 78 65 63  1-6-4.4 {.  exec
4390: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
43a0: 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20   * FROM techo;. 
43b0: 20 7d 0a 7d 20 7b 35 20 32 20 33 7d 0a 0a 64 6f   }.} {5 2 3}..do
43c0: 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 35 2e  _test vtab1-6-5.
43d0: 31 20 7b 0a 20 65 78 65 63 73 71 6c 20 7b 0a 20  1 {. execsql {. 
43e0: 20 20 55 50 44 41 54 45 20 74 65 63 68 6f 20 73    UPDATE techo s
43f0: 65 74 20 61 20 3d 20 61 7c 7c 62 7c 7c 63 3b 0a  et a = a||b||c;.
4400: 20 7d 0a 20 64 62 20 63 68 61 6e 67 65 73 0a 7d   }. db changes.}
4410: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   {1}.do_test vta
4420: 62 31 2d 36 2d 35 2e 32 20 7b 0a 20 65 78 65 63  b1-6-5.2 {. exec
4430: 73 71 6c 20 7b 0a 20 20 20 53 45 4c 45 43 54 20  sql {.   SELECT 
4440: 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 7d  * FROM techo;. }
4450: 0a 7d 20 7b 35 32 33 20 32 20 33 7d 0a 0a 64 6f  .} {523 2 3}..do
4460: 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 36 2e  _test vtab1-6-6.
4470: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
4480: 20 20 20 20 55 50 44 41 54 45 20 74 65 63 68 6f      UPDATE techo
4490: 20 73 65 74 20 72 6f 77 69 64 20 3d 20 31 30 3b   set rowid = 10;
44a0: 0a 20 20 7d 0a 20 20 64 62 20 63 68 61 6e 67 65  .  }.  db change
44b0: 73 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  s.} {1}.do_test 
44c0: 76 74 61 62 31 2d 36 2d 36 2e 32 20 7b 0a 20 20  vtab1-6-6.2 {.  
44d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
44e0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
44f0: 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 30  techo;.  }.} {10
4500: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  }..do_test vtab1
4510: 2d 36 2d 37 2e 31 2e 31 20 7b 0a 20 20 65 78 65  -6-7.1.1 {.  exe
4520: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
4530: 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c  T INTO techo VAL
4540: 55 45 53 28 31 31 2c 31 32 2c 31 33 29 3b 0a 20  UES(11,12,13);. 
4550: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
4560: 20 76 74 61 62 31 2d 36 2d 37 2e 31 2e 32 20 7b   vtab1-6-7.1.2 {
4570: 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20  .  db changes.} 
4580: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  {1}.do_test vtab
4590: 31 2d 36 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63  1-6-7.2 {.  exec
45a0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
45b0: 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 20 4f 52   * FROM techo OR
45c0: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20  DER BY a;.  }.} 
45d0: 7b 31 31 20 31 32 20 31 33 20 35 32 33 20 32 20  {11 12 13 523 2 
45e0: 33 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  3}.do_test vtab1
45f0: 2d 36 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73  -6-7.3 {.  execs
4600: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
4610: 74 65 63 68 6f 20 53 45 54 20 62 3d 62 2b 31 30  techo SET b=b+10
4620: 30 30 0a 20 20 7d 0a 20 20 64 62 20 63 68 61 6e  00.  }.  db chan
4630: 67 65 73 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73  ges.} {2}.do_tes
4640: 74 20 76 74 61 62 31 2d 36 2d 37 2e 34 20 7b 0a  t vtab1-6-7.4 {.
4650: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4660: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
4670: 63 68 6f 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  cho ORDER BY a;.
4680: 20 20 7d 0a 7d 20 7b 31 31 20 31 30 31 32 20 31    }.} {11 1012 1
4690: 33 20 35 32 33 20 31 30 30 32 20 33 7d 0a 0a 0a  3 523 1002 3}...
46a0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d  do_test vtab1-6-
46b0: 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.1 {.  execsql 
46c0: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
46d0: 4d 20 74 65 63 68 6f 20 57 48 45 52 45 20 61 3d  M techo WHERE a=
46e0: 35 3b 0a 20 20 7d 0a 20 20 64 62 20 63 68 61 6e  5;.  }.  db chan
46f0: 67 65 73 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73  ges.} {0}.do_tes
4700: 74 20 76 74 61 62 31 2d 36 2d 38 2e 32 20 7b 0a  t vtab1-6-8.2 {.
4710: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4720: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
4730: 63 68 6f 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  cho ORDER BY a;.
4740: 20 20 7d 0a 7d 20 7b 31 31 20 31 30 31 32 20 31    }.} {11 1012 1
4750: 33 20 35 32 33 20 31 30 30 32 20 33 7d 0a 64 6f  3 523 1002 3}.do
4760: 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 38 2e  _test vtab1-6-8.
4770: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
4780: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
4790: 74 65 63 68 6f 3b 0a 20 20 7d 0a 20 20 64 62 20  techo;.  }.  db 
47a0: 63 68 61 6e 67 65 73 0a 7d 20 7b 32 7d 0a 64 6f  changes.} {2}.do
47b0: 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 38 2e  _test vtab1-6-8.
47c0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
47d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
47e0: 4d 20 74 65 63 68 6f 20 4f 52 44 45 52 20 42 59  M techo ORDER BY
47f0: 20 61 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 65 78 65   a;.  }.} {}.exe
4800: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 63 6f 75  csql {PRAGMA cou
4810: 6e 74 5f 63 68 61 6e 67 65 73 3d 4f 46 46 7d 0a  nt_changes=OFF}.
4820: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
4830: 74 32 2e 64 62 0a 66 6f 72 63 65 64 65 6c 65 74  t2.db.forcedelet
4840: 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e  e test2.db-journ
4850: 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74  al.sqlite3 db2 t
4860: 65 73 74 32 2e 64 62 0a 65 78 65 63 73 71 6c 20  est2.db.execsql 
4870: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
4880: 20 74 65 63 68 6f 28 61 20 50 52 49 4d 41 52 59   techo(a PRIMARY
4890: 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 7d 20 64   KEY, b, c);.} d
48a0: 62 32 0a 70 72 6f 63 20 63 68 65 63 6b 5f 65 63  b2.proc check_ec
48b0: 68 6f 5f 74 61 62 6c 65 20 7b 74 6e 7d 20 7b 0a  ho_table {tn} {.
48c0: 20 20 73 65 74 20 3a 3a 64 61 74 61 31 20 5b 65    set ::data1 [e
48d0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72  xecsql {SELECT r
48e0: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 65 63  owid, * FROM tec
48f0: 68 6f 7d 5d 0a 20 20 73 65 74 20 3a 3a 64 61 74  ho}].  set ::dat
4900: 61 32 20 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c  a2 [execsql {SEL
4910: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
4920: 4d 20 74 65 63 68 6f 7d 20 64 62 32 5d 0a 20 20  M techo} db2].  
4930: 64 6f 5f 74 65 73 74 20 24 74 6e 20 7b 0a 20 20  do_test $tn {.  
4940: 20 20 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24    string equal $
4950: 3a 3a 64 61 74 61 31 20 24 3a 3a 64 61 74 61 32  ::data1 $::data2
4960: 0a 20 20 7d 20 31 0a 7d 0a 73 65 74 20 74 6e 20  .  } 1.}.set tn 
4970: 30 0a 66 6f 72 65 61 63 68 20 73 74 6d 74 20 5b  0.foreach stmt [
4980: 6c 69 73 74 20 5c 0a 20 20 7b 49 4e 53 45 52 54  list \.  {INSERT
4990: 20 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c 55   INTO techo VALU
49a0: 45 53 28 27 61 62 63 27 2c 20 27 64 65 66 27 2c  ES('abc', 'def',
49b0: 20 27 67 68 69 27 29 7d 20 20 20 20 20 20 20 20   'ghi')}        
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 5c 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  \.  {INSERT INTO
49e0: 20 74 65 63 68 6f 20 53 45 4c 45 43 54 20 61 7c   techo SELECT a|
49f0: 7c 27 2e 27 7c 7c 72 6f 77 69 64 2c 20 62 2c 20  |'.'||rowid, b, 
4a00: 63 20 46 52 4f 4d 20 74 65 63 68 6f 7d 20 20 20  c FROM techo}   
4a10: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b             \.  {
4a20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 63 68  INSERT INTO tech
4a30: 6f 20 53 45 4c 45 43 54 20 61 7c 7c 27 78 27 7c  o SELECT a||'x'|
4a40: 7c 72 6f 77 69 64 2c 20 62 2c 20 63 20 46 52 4f  |rowid, b, c FRO
4a50: 4d 20 74 65 63 68 6f 7d 20 20 20 20 20 20 20 20  M techo}        
4a60: 20 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53 45 52        \.  {INSER
4a70: 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 53 45 4c  T INTO techo SEL
4a80: 45 43 54 20 61 7c 7c 27 79 27 7c 7c 72 6f 77 69  ECT a||'y'||rowi
4a90: 64 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 65 63  d, b, c FROM tec
4aa0: 68 6f 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ho}             
4ab0: 20 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46 52 4f   \.  {DELETE FRO
4ac0: 4d 20 74 65 63 68 6f 20 57 48 45 52 45 20 28 6f  M techo WHERE (o
4ad0: 69 64 20 25 20 33 29 20 3d 20 30 7d 20 20 20 20  id % 3) = 0}    
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
4b00: 7b 55 50 44 41 54 45 20 74 65 63 68 6f 20 73 65  {UPDATE techo se
4b10: 74 20 72 6f 77 69 64 20 3d 20 31 30 30 20 57 48  t rowid = 100 WH
4b20: 45 52 45 20 72 6f 77 69 64 20 3d 20 31 7d 20 20  ERE rowid = 1}  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53 45         \.  {INSE
4b50: 52 54 20 49 4e 54 4f 20 74 65 63 68 6f 28 61 2c  RT INTO techo(a,
4b60: 20 62 29 20 56 41 4c 55 45 53 28 27 68 65 6c 6c   b) VALUES('hell
4b70: 6f 27 2c 20 27 77 6f 72 6c 64 27 29 7d 20 20 20  o', 'world')}   
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46 52    \.  {DELETE FR
4ba0: 4f 4d 20 74 65 63 68 6f 7d 20 20 20 20 20 20 20  OM techo}       
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d               \.]
4be0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 24 73 74   {.  execsql $st
4bf0: 6d 74 0a 20 20 65 78 65 63 73 71 6c 20 24 73 74  mt.  execsql $st
4c00: 6d 74 20 64 62 32 0a 20 20 63 68 65 63 6b 5f 65  mt db2.  check_e
4c10: 63 68 6f 5f 74 61 62 6c 65 20 76 74 61 62 31 2d  cho_table vtab1-
4c20: 36 2e 38 2e 5b 69 6e 63 72 20 74 6e 5d 0a 7d 0a  6.8.[incr tn].}.
4c30: 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 0a 0a 23 2d  .db2 close....#-
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c80: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73  -----.# Test cas
4c90: 65 73 20 76 74 61 62 31 2d 37 20 74 65 73 74 73  es vtab1-7 tests
4ca0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
4cb0: 72 65 74 75 72 6e 65 64 20 62 79 20 0a 23 20 73  returned by .# s
4cc0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
4cd0: 72 74 5f 72 6f 77 69 64 28 29 20 69 73 20 73 65  rt_rowid() is se
4ce0: 74 20 63 6f 72 72 65 63 74 6c 79 20 77 68 65 6e  t correctly when
4cf0: 20 72 6f 77 73 20 61 72 65 20 69 6e 73 65 72 74   rows are insert
4d00: 65 64 0a 23 20 69 6e 74 6f 20 76 69 72 74 75 61  ed.# into virtua
4d10: 6c 20 74 61 62 6c 65 73 2e 0a 64 6f 5f 74 65 73  l tables..do_tes
4d20: 74 20 76 74 61 62 31 2e 37 2d 31 20 7b 0a 20 20  t vtab1.7-1 {.  
4d30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
4d40: 45 41 54 45 20 54 41 42 4c 45 20 72 65 61 6c 5f  EATE TABLE real_
4d50: 61 62 63 28 61 20 50 52 49 4d 41 52 59 20 4b 45  abc(a PRIMARY KE
4d60: 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52  Y, b, c);.    CR
4d70: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
4d80: 4c 45 20 65 63 68 6f 5f 61 62 63 20 55 53 49 4e  LE echo_abc USIN
4d90: 47 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63 29  G echo(real_abc)
4da0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
4db0: 73 74 20 76 74 61 62 31 2e 37 2d 32 20 7b 0a 20  st vtab1.7-2 {. 
4dc0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
4dd0: 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f  NSERT INTO echo_
4de0: 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  abc VALUES(1, 2,
4df0: 20 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   3);.    SELECT 
4e00: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
4e10: 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64  d();.  }.} {1}.d
4e20: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d 33  o_test vtab1.7-3
4e30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4e40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65     INSERT INTO e
4e50: 63 68 6f 5f 61 62 63 28 72 6f 77 69 64 29 20 56  cho_abc(rowid) V
4e60: 41 4c 55 45 53 28 33 31 34 32 37 29 3b 0a 20 20  ALUES(31427);.  
4e70: 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e    SELECT last_in
4e80: 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20  sert_rowid();.  
4e90: 7d 0a 7d 20 7b 33 31 34 32 37 7d 0a 64 6f 5f 74  }.} {31427}.do_t
4ea0: 65 73 74 20 76 74 61 62 31 2e 37 2d 34 20 7b 0a  est vtab1.7-4 {.
4eb0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4ec0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f  INSERT INTO echo
4ed0: 5f 61 62 63 20 53 45 4c 45 43 54 20 61 7c 7c 27  _abc SELECT a||'
4ee0: 2e 76 32 27 2c 20 62 2c 20 63 20 46 52 4f 4d 20  .v2', b, c FROM 
4ef0: 65 63 68 6f 5f 61 62 63 3b 0a 20 20 20 20 53 45  echo_abc;.    SE
4f00: 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74  LECT last_insert
4f10: 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20  _rowid();.  }.} 
4f20: 7b 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20  {31429}.do_test 
4f30: 76 74 61 62 31 2e 37 2d 35 20 7b 0a 20 20 65 78  vtab1.7-5 {.  ex
4f40: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
4f50: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  CT rowid, a, b, 
4f60: 63 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63 0a  c FROM echo_abc.
4f70: 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 31 20 20 20    }.} [list 1   
4f80: 20 20 31 20 20 20 20 32 20 20 33 20 20 5c 0a 20    1    2  3  \. 
4f90: 20 20 20 20 20 20 20 33 31 34 32 37 20 7b 7d 20         31427 {} 
4fa0: 20 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20 20 20 20    {} {} \.      
4fb0: 20 20 33 31 34 32 38 20 31 2e 76 32 20 32 20 20    31428 1.v2 2  
4fc0: 33 20 20 5c 0a 20 20 20 20 20 20 20 20 33 31 34  3  \.        314
4fd0: 32 39 20 7b 7d 20 20 7b 7d 20 7b 7d 20 20 5c 0a  29 {}  {} {}  \.
4fe0: 5d 0a 0a 23 20 4e 6f 77 20 74 65 73 74 20 74 68  ]..# Now test th
4ff0: 61 74 20 44 45 4c 45 54 45 20 61 6e 64 20 55 50  at DELETE and UP
5000: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  DATE operations 
5010: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74 68  do not modify th
5020: 65 20 76 61 6c 75 65 2e 0a 64 6f 5f 74 65 73 74  e value..do_test
5030: 20 76 74 61 62 31 2e 37 2d 36 20 7b 0a 20 20 65   vtab1.7-6 {.  e
5040: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
5050: 41 54 45 20 65 63 68 6f 5f 61 62 63 20 53 45 54  ATE echo_abc SET
5060: 20 63 20 3d 20 35 20 57 48 45 52 45 20 62 20 3d   c = 5 WHERE b =
5070: 20 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c   2;.    SELECT l
5080: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
5090: 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39  ();.  }.} {31429
50a0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e  }.do_test vtab1.
50b0: 37 2d 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7-7 {.  execsql 
50c0: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 65 63 68  {.    UPDATE ech
50d0: 6f 5f 61 62 63 20 53 45 54 20 72 6f 77 69 64 20  o_abc SET rowid 
50e0: 3d 20 35 20 57 48 45 52 45 20 72 6f 77 69 64 20  = 5 WHERE rowid 
50f0: 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 1;.    SELECT 
5100: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
5110: 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32  d();.  }.} {3142
5120: 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  9}.do_test vtab1
5130: 2e 37 2d 38 20 7b 0a 20 20 65 78 65 63 73 71 6c  .7-8 {.  execsql
5140: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
5150: 4f 4d 20 65 63 68 6f 5f 61 62 63 20 57 48 45 52  OM echo_abc WHER
5160: 45 20 62 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c  E b = 2;.    SEL
5170: 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  ECT last_insert_
5180: 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b  rowid();.  }.} {
5190: 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76  31429}.do_test v
51a0: 74 61 62 31 2e 37 2d 39 20 7b 0a 20 20 65 78 65  tab1.7-9 {.  exe
51b0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
51c0: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
51d0: 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63 0a 20   FROM echo_abc. 
51e0: 20 7d 0a 7d 20 5b 6c 69 73 74 20 33 31 34 32 37   }.} [list 31427
51f0: 20 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20 20   {} {} {} \.    
5200: 20 20 20 20 33 31 34 32 39 20 7b 7d 20 7b 7d 20      31429 {} {} 
5210: 7b 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76  {} \.].do_test v
5220: 74 61 62 31 2e 37 2d 31 30 20 7b 0a 20 20 65 78  tab1.7-10 {.  ex
5230: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
5240: 54 45 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63  TE FROM echo_abc
5250: 20 57 48 45 52 45 20 62 20 3d 20 32 3b 0a 20 20   WHERE b = 2;.  
5260: 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e    SELECT last_in
5270: 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20  sert_rowid();.  
5280: 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 6f 5f 74  }.} {31429}.do_t
5290: 65 73 74 20 76 74 61 62 31 2e 37 2d 31 31 20 7b  est vtab1.7-11 {
52a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
52b0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61   SELECT rowid, a
52c0: 2c 20 62 2c 20 63 20 46 52 4f 4d 20 72 65 61 6c  , b, c FROM real
52d0: 5f 61 62 63 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74  _abc.  }.} [list
52e0: 20 33 31 34 32 37 20 7b 7d 20 7b 7d 20 7b 7d 20   31427 {} {} {} 
52f0: 5c 0a 20 20 20 20 20 20 20 20 33 31 34 32 39 20  \.        31429 
5300: 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 5d 0a 64 6f 5f  {} {} {} \.].do_
5310: 74 65 73 74 20 76 74 61 62 31 2e 37 2d 31 32 20  test vtab1.7-12 
5320: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5330: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 65 63    DELETE FROM ec
5340: 68 6f 5f 61 62 63 3b 0a 20 20 20 20 53 45 4c 45  ho_abc;.    SELE
5350: 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  CT last_insert_r
5360: 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33  owid();.  }.} {3
5370: 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74  1429}.do_test vt
5380: 61 62 31 2e 37 2d 31 33 20 7b 0a 20 20 65 78 65  ab1.7-13 {.  exe
5390: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
53a0: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
53b0: 20 46 52 4f 4d 20 72 65 61 6c 5f 61 62 63 0a 20   FROM real_abc. 
53c0: 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62   }.} {}..ifcapab
53d0: 6c 65 20 61 74 74 61 63 68 20 7b 0a 20 20 64 6f  le attach {.  do
53e0: 5f 74 65 73 74 20 76 74 61 62 31 2e 38 2d 31 20  _test vtab1.8-1 
53f0: 7b 0a 20 20 20 20 73 65 74 20 65 63 68 6f 5f 6d  {.    set echo_m
5400: 6f 64 75 6c 65 20 22 22 0a 20 20 20 20 65 78 65  odule "".    exe
5410: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 41 54 54  csql {.      ATT
5420: 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41  ACH 'test2.db' A
5430: 53 20 61 75 78 3b 0a 20 20 20 20 20 20 43 52 45  S aux;.      CRE
5440: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
5450: 45 20 61 75 78 2e 65 32 20 55 53 49 4e 47 20 65  E aux.e2 USING e
5460: 63 68 6f 28 72 65 61 6c 5f 61 62 63 29 3b 0a 20  cho(real_abc);. 
5470: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 65 63 68     }.    set ech
5480: 6f 5f 6d 6f 64 75 6c 65 0a 20 20 7d 20 5b 6c 69  o_module.  } [li
5490: 73 74 20 78 43 72 65 61 74 65 20 65 63 68 6f 20  st xCreate echo 
54a0: 61 75 78 20 65 32 20 72 65 61 6c 5f 61 62 63 20  aux e2 real_abc 
54b0: 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 78 53    \.          xS
54c0: 79 6e 63 20 20 20 65 63 68 6f 28 72 65 61 6c 5f  ync   echo(real_
54d0: 61 62 63 29 20 20 20 20 20 20 20 20 20 5c 0a 20  abc)         \. 
54e0: 20 20 20 20 20 20 20 20 20 78 43 6f 6d 6d 69 74           xCommit
54f0: 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63 29 20   echo(real_abc) 
5500: 20 20 20 20 20 20 20 20 5c 0a 20 20 5d 0a 7d 0a          \.  ].}.
5510: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 38 2d  do_test vtab1.8-
5520: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
5530: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
5540: 61 75 78 2e 65 32 3b 0a 20 20 7d 0a 20 20 65 78  aux.e2;.  }.  ex
5550: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
5560: 20 54 41 42 4c 45 20 74 72 65 61 6c 3b 0a 20 20   TABLE treal;.  
5570: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 65 63    DROP TABLE tec
5580: 68 6f 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  ho;.    DROP TAB
5590: 4c 45 20 65 63 68 6f 5f 61 62 63 3b 0a 20 20 20  LE echo_abc;.   
55a0: 20 44 52 4f 50 20 54 41 42 4c 45 20 72 65 61 6c   DROP TABLE real
55b0: 5f 61 62 63 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  _abc;.  }.} {}..
55c0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 39 2d  do_test vtab1.9-
55d0: 31 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  1 {.  set echo_m
55e0: 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73  odule "".  execs
55f0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
5600: 54 41 42 4c 45 20 72 28 61 2c 20 62 2c 20 63 29  TABLE r(a, b, c)
5610: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  ;.    CREATE VIR
5620: 54 55 41 4c 20 54 41 42 4c 45 20 65 20 55 53 49  TUAL TABLE e USI
5630: 4e 47 20 65 63 68 6f 28 72 2c 20 65 5f 6c 6f 67  NG echo(r, e_log
5640: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61  );.    SELECT na
5650: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
5660: 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 72 20  aster;.  }.} {r 
5670: 65 20 65 5f 6c 6f 67 7d 0a 64 6f 5f 74 65 73 74  e e_log}.do_test
5680: 20 76 74 61 62 31 2e 39 2d 32 20 7b 0a 20 20 65   vtab1.9-2 {.  e
5690: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
56a0: 50 20 54 41 42 4c 45 20 65 3b 0a 20 20 20 20 53  P TABLE e;.    S
56b0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
56c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
56d0: 20 7d 0a 7d 20 7b 72 7d 0a 0a 64 6f 5f 74 65 73   }.} {r}..do_tes
56e0: 74 20 76 74 61 62 31 2e 39 2d 33 20 7b 0a 20 20  t vtab1.9-3 {.  
56f0: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  set echo_module 
5700: 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  "".  execsql {. 
5710: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
5720: 4c 20 54 41 42 4c 45 20 65 20 55 53 49 4e 47 20  L TABLE e USING 
5730: 65 63 68 6f 28 72 2c 20 65 5f 6c 6f 67 2c 20 76  echo(r, e_log, v
5740: 69 72 74 75 61 6c 20 31 20 32 20 33 20 76 61 72  irtual 1 2 3 var
5750: 63 68 61 72 28 33 32 29 29 3b 0a 20 20 7d 0a 20  char(32));.  }. 
5760: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
5770: 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  .} [list        
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 5c 0a 20 20 78 43 72 65 61 74 65 20 65 63 68 6f  \.  xCreate echo
57c0: 20 6d 61 69 6e 20 65 20 72 20 65 5f 6c 6f 67 20   main e r e_log 
57d0: 7b 76 69 72 74 75 61 6c 20 31 20 32 20 33 20 76  {virtual 1 2 3 v
57e0: 61 72 63 68 61 72 28 33 32 29 7d 20 20 20 20 20  archar(32)}     
57f0: 20 5c 0a 20 20 78 53 79 6e 63 20 65 63 68 6f 28   \.  xSync echo(
5800: 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 5c 0a 20 20 78 43 6f 6d 6d 69 74 20 65 63    \.  xCommit ec
5840: 68 6f 28 72 29 20 20 20 20 20 20 20 20 20 20 20  ho(r)           
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 5c 0a 5d 0a 0a 64 6f 5f 74 65 73 74 20     \.]..do_test 
5880: 76 74 61 62 31 2e 31 30 2d 31 20 7b 0a 20 20 65  vtab1.10-1 {.  e
5890: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
58a0: 41 54 45 20 54 41 42 4c 45 20 64 65 6c 28 64 29  ATE TABLE del(d)
58b0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52  ;.    CREATE VIR
58c0: 54 55 41 4c 20 54 41 42 4c 45 20 65 32 20 55 53  TUAL TABLE e2 US
58d0: 49 4e 47 20 65 63 68 6f 28 64 65 6c 29 3b 0a 20  ING echo(del);. 
58e0: 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   }.  db close.  
58f0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
5900: 64 62 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63  db.  register_ec
5910: 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74  ho_module [sqlit
5920: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f  e3_connection_po
5930: 69 6e 74 65 72 20 64 62 5d 0a 20 20 65 78 65 63  inter db].  exec
5940: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
5950: 41 42 4c 45 20 64 65 6c 3b 0a 20 20 7d 0a 20 20  ABLE del;.  }.  
5960: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
5970: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 32 3b  ELECT * FROM e2;
5980: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 76 74 61 62 6c  .  }.} {1 {vtabl
5990: 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 61  e constructor fa
59a0: 69 6c 65 64 3a 20 65 32 7d 7d 0a 64 6f 5f 74 65  iled: e2}}.do_te
59b0: 73 74 20 76 74 61 62 31 2e 31 30 2d 32 20 7b 0a  st vtab1.10-2 {.
59c0: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
59d0: 7b 0a 20 20 20 20 73 65 74 20 70 74 72 20 5b 73  {.    set ptr [s
59e0: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
59f0: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 20 20  n_pointer db].  
5a00: 20 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72    sqlite3_declar
5a10: 65 5f 76 74 61 62 20 24 70 74 72 20 7b 43 52 45  e_vtab $ptr {CRE
5a20: 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 2c  ATE TABLE abc(a,
5a30: 20 62 2c 20 63 29 7d 0a 20 20 7d 20 6d 73 67 5d   b, c)}.  } msg]
5a40: 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67  .  list $rc $msg
5a50: 0a 7d 20 7b 31 20 7b 62 61 64 20 70 61 72 61 6d  .} {1 {bad param
5a60: 65 74 65 72 20 6f 72 20 6f 74 68 65 72 20 41 50  eter or other AP
5a70: 49 20 6d 69 73 75 73 65 7d 7d 0a 64 6f 5f 74 65  I misuse}}.do_te
5a80: 73 74 20 76 74 61 62 31 2e 31 30 2d 33 20 7b 0a  st vtab1.10-3 {.
5a90: 20 20 73 65 74 20 3a 3a 65 63 68 6f 5f 6d 6f 64    set ::echo_mod
5aa0: 75 6c 65 5f 62 65 67 69 6e 5f 66 61 69 6c 20 72  ule_begin_fail r
5ab0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
5ac0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 20    INSERT INTO e 
5ad0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
5ae0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53 51 4c 20 6c  .  }.} {1 {SQL l
5af0: 6f 67 69 63 20 65 72 72 6f 72 7d 7d 0a 64 6f 5f  ogic error}}.do_
5b00: 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d 34 20  test vtab1.10-4 
5b10: 7b 0a 20 20 63 61 74 63 68 20 7b 65 78 65 63 73  {.  catch {execs
5b20: 71 6c 20 7b 0a 20 20 20 20 45 58 50 4c 41 49 4e  ql {.    EXPLAIN
5b30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65   SELECT * FROM e
5b40: 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 32   WHERE rowid = 2
5b50: 3b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55  ;.    EXPLAIN QU
5b60: 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20  ERY PLAN SELECT 
5b70: 2a 20 46 52 4f 4d 20 65 20 57 48 45 52 45 20 72  * FROM e WHERE r
5b80: 6f 77 69 64 20 3d 20 32 20 4f 52 44 45 52 20 42  owid = 2 ORDER B
5b90: 59 20 72 6f 77 69 64 3b 0a 20 20 7d 7d 0a 7d 20  Y rowid;.  }}.} 
5ba0: 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61  {0}..do_test vta
5bb0: 62 31 2e 31 30 2d 35 20 7b 0a 20 20 73 65 74 20  b1.10-5 {.  set 
5bc0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20  echo_module "". 
5bd0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
5be0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 20 57  ELECT * FROM e W
5bf0: 48 45 52 45 20 72 6f 77 69 64 7c 7c 27 27 20 4d  HERE rowid||'' M
5c00: 41 54 43 48 20 27 70 61 74 74 65 72 6e 27 3b 0a  ATCH 'pattern';.
5c10: 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d    }.  set echo_m
5c20: 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c 0a  odule.} [list \.
5c30: 20 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45    xBestIndex {SE
5c40: 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62  LECT rowid, a, b
5c50: 2c 20 63 20 46 52 4f 4d 20 27 72 27 7d 20 5c 0a  , c FROM 'r'} \.
5c60: 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43    xFilter {SELEC
5c70: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
5c80: 20 46 52 4f 4d 20 27 72 27 7d 20 20 20 20 5c 0a   FROM 'r'}    \.
5c90: 5d 0a 70 72 6f 63 20 6d 61 74 63 68 5f 66 75 6e  ].proc match_fun
5ca0: 63 20 7b 61 72 67 73 7d 20 7b 72 65 74 75 72 6e  c {args} {return
5cb0: 20 22 22 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   ""}.do_test vta
5cc0: 62 31 2e 31 30 2d 36 20 7b 0a 20 20 73 65 74 20  b1.10-6 {.  set 
5cd0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20  echo_module "". 
5ce0: 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74   db function mat
5cf0: 63 68 20 6d 61 74 63 68 5f 66 75 6e 63 0a 20 20  ch match_func.  
5d00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
5d10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 20 57 48  LECT * FROM e WH
5d20: 45 52 45 20 6d 61 74 63 68 28 27 70 61 74 74 65  ERE match('patte
5d30: 72 6e 27 2c 20 72 6f 77 69 64 2c 20 27 70 61 74  rn', rowid, 'pat
5d40: 74 65 72 6e 32 27 29 3b 0a 20 20 7d 0a 20 20 73  tern2');.  }.  s
5d50: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d  et echo_module.}
5d60: 20 5b 6c 69 73 74 20 5c 0a 20 20 78 42 65 73 74   [list \.  xBest
5d70: 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f  Index {SELECT ro
5d80: 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f  wid, a, b, c FRO
5d90: 4d 20 27 72 27 7d 20 5c 0a 20 20 78 46 69 6c 74  M 'r'} \.  xFilt
5da0: 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  er {SELECT rowid
5db0: 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 27  , a, b, c FROM '
5dc0: 72 27 7d 20 20 20 20 5c 0a 5d 0a 0a 0a 23 20 54  r'}    \.]...# T
5dd0: 65 73 74 69 6e 67 20 74 68 65 20 78 46 69 6e 64  esting the xFind
5de0: 46 75 6e 63 74 69 6f 6e 20 69 6e 74 65 72 66 61  Function interfa
5df0: 63 65 0a 23 0a 63 61 74 63 68 20 7b 72 65 6e 61  ce.#.catch {rena
5e00: 6d 65 20 3a 3a 65 63 68 6f 5f 67 6c 6f 62 5f 6f  me ::echo_glob_o
5e10: 76 65 72 6c 6f 61 64 20 7b 7d 7d 0a 64 6f 5f 74  verload {}}.do_t
5e20: 65 73 74 20 76 74 61 62 31 2e 31 31 2d 31 20 7b  est vtab1.11-1 {
5e30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5e40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 28 61   INSERT INTO r(a
5e50: 2c 62 2c 63 29 20 56 41 4c 55 45 53 28 31 2c 27  ,b,c) VALUES(1,'
5e60: 3f 27 2c 39 39 29 3b 0a 20 20 20 20 49 4e 53 45  ?',99);.    INSE
5e70: 52 54 20 49 4e 54 4f 20 72 28 61 2c 62 2c 63 29  RT INTO r(a,b,c)
5e80: 20 56 41 4c 55 45 53 28 32 2c 33 2c 39 39 29 3b   VALUES(2,3,99);
5e90: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 47 4c  .    SELECT a GL
5ea0: 4f 42 20 62 20 46 52 4f 4d 20 65 0a 20 20 7d 0a  OB b FROM e.  }.
5eb0: 7d 20 7b 31 20 30 7d 0a 70 72 6f 63 20 3a 3a 65  } {1 0}.proc ::e
5ec0: 63 68 6f 5f 67 6c 6f 62 5f 6f 76 65 72 6c 6f 61  cho_glob_overloa
5ed0: 64 20 7b 61 20 62 7d 20 7b 0a 20 72 65 74 75 72  d {a b} {. retur
5ee0: 6e 20 5b 6c 69 73 74 20 24 62 20 24 61 5d 0a 7d  n [list $b $a].}
5ef0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
5f00: 31 2d 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1-2 {.  execsql 
5f10: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 6c  {.    SELECT a l
5f20: 69 6b 65 20 27 62 27 20 46 52 4f 4d 20 65 0a 20  ike 'b' FROM e. 
5f30: 20 7d 0a 7d 20 7b 30 20 30 7d 0a 64 6f 5f 74 65   }.} {0 0}.do_te
5f40: 73 74 20 76 74 61 62 31 2e 31 31 2d 33 20 7b 0a  st vtab1.11-3 {.
5f50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5f60: 53 45 4c 45 43 54 20 61 20 67 6c 6f 62 20 27 32  SELECT a glob '2
5f70: 27 20 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b  ' FROM e.  }.} {
5f80: 7b 31 20 32 7d 20 7b 32 20 32 7d 7d 0a 64 6f 5f  {1 2} {2 2}}.do_
5f90: 74 65 73 74 20 76 74 61 62 31 2e 31 31 2d 34 20  test vtab1.11-4 
5fa0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5fb0: 20 20 53 45 4c 45 43 54 20 20 67 6c 6f 62 28 27    SELECT  glob('
5fc0: 32 27 2c 61 29 20 46 52 4f 4d 20 65 0a 20 20 7d  2',a) FROM e.  }
5fd0: 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74  .} {0 1}.do_test
5fe0: 20 76 74 61 62 31 2e 31 31 2d 35 20 7b 0a 20 20   vtab1.11-5 {.  
5ff0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
6000: 4c 45 43 54 20 20 67 6c 6f 62 28 61 2c 27 32 27  LECT  glob(a,'2'
6010: 29 20 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b  ) FROM e.  }.} {
6020: 7b 32 20 31 7d 20 7b 32 20 32 7d 7d 0a 20 0a 23  {2 1} {2 2}}. .#
6030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6070: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
6080: 65 20 6f 75 74 63 6f 6d 65 20 69 66 20 61 20 63  e outcome if a c
6090: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 65 6e 63  onstraint is enc
60a0: 6f 75 6e 74 65 72 65 64 20 68 61 6c 66 2d 77 61  ountered half-wa
60b0: 79 20 74 68 72 6f 75 67 68 0a 23 20 61 20 6d 75  y through.# a mu
60c0: 6c 74 69 2d 72 6f 77 20 49 4e 53 45 52 54 20 74  lti-row INSERT t
60d0: 68 61 74 20 69 73 20 69 6e 73 69 64 65 20 61 20  hat is inside a 
60e0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 0a 64 6f  transaction.#.do
60f0: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d 31  _test vtab1.12-1
6100: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6110: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6120: 62 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  b(a, b, c);.    
6130: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 28 61  CREATE TABLE c(a
6140: 20 55 4e 49 51 55 45 2c 20 62 2c 20 63 29 3b 0a   UNIQUE, b, c);.
6150: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6160: 62 20 56 41 4c 55 45 53 28 31 2c 20 27 41 27 2c  b VALUES(1, 'A',
6170: 20 27 42 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'B');.    INSER
6180: 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 28  T INTO b VALUES(
6190: 32 2c 20 27 43 27 2c 20 27 44 27 29 3b 0a 20 20  2, 'C', 'D');.  
61a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 20    INSERT INTO b 
61b0: 56 41 4c 55 45 53 28 33 2c 20 27 45 27 2c 20 27  VALUES(3, 'E', '
61c0: 46 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  F');.    INSERT 
61d0: 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 33 2c  INTO c VALUES(3,
61e0: 20 27 47 27 2c 20 27 48 27 29 3b 0a 20 20 20 20   'G', 'H');.    
61f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
6200: 41 42 4c 45 20 65 63 68 6f 5f 63 20 55 53 49 4e  ABLE echo_c USIN
6210: 47 20 65 63 68 6f 28 63 29 3b 0a 20 20 7d 0a 7d  G echo(c);.  }.}
6220: 20 7b 7d 0a 0a 23 20 46 69 72 73 74 20 74 65 73   {}..# First tes
6230: 74 20 6f 75 74 73 69 64 65 20 6f 66 20 61 20 74  t outside of a t
6240: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 64 6f 5f 74  ransaction..do_t
6250: 65 73 74 20 76 74 61 62 31 2e 31 32 2d 32 20 7b  est vtab1.12-2 {
6260: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
6270: 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 63  SERT INTO echo_c
6280: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
6290: 3b 20 7d 0a 7d 20 7b 31 20 7b 65 63 68 6f 2d 76  ; }.} {1 {echo-v
62a0: 74 61 62 2d 65 72 72 6f 72 3a 20 55 4e 49 51 55  tab-error: UNIQU
62b0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  E constraint fai
62c0: 6c 65 64 3a 20 63 2e 61 7d 7d 0a 64 6f 5f 74 65  led: c.a}}.do_te
62d0: 73 74 20 76 74 61 62 31 2e 31 32 2d 32 2e 31 20  st vtab1.12-2.1 
62e0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  {.  sqlite3_errm
62f0: 73 67 20 64 62 0a 7d 20 7b 65 63 68 6f 2d 76 74  sg db.} {echo-vt
6300: 61 62 2d 65 72 72 6f 72 3a 20 55 4e 49 51 55 45  ab-error: UNIQUE
6310: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
6320: 65 64 3a 20 63 2e 61 7d 0a 64 6f 5f 74 65 73 74  ed: c.a}.do_test
6330: 20 76 74 61 62 31 2e 31 32 2d 33 20 7b 0a 20 20   vtab1.12-3 {.  
6340: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
6350: 20 2a 20 46 52 4f 4d 20 63 20 7d 0a 7d 20 7b 33   * FROM c }.} {3
6360: 20 47 20 48 7d 0a 0a 23 20 4e 6f 77 20 74 68 65   G H}..# Now the
6370: 20 72 65 61 6c 20 74 65 73 74 20 2d 20 77 72 61   real test - wra
6380: 70 70 65 64 20 69 6e 20 61 20 74 72 61 6e 73 61  pped in a transa
6390: 63 74 69 6f 6e 2e 0a 64 6f 5f 74 65 73 74 20 76  ction..do_test v
63a0: 74 61 62 31 2e 31 32 2d 34 20 7b 0a 20 20 65 78  tab1.12-4 {.  ex
63b0: 65 63 73 71 6c 20 20 7b 42 45 47 49 4e 7d 0a 20  ecsql  {BEGIN}. 
63c0: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
63d0: 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 63 20 53  RT INTO echo_c S
63e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 3b 20  ELECT * FROM b; 
63f0: 7d 0a 7d 20 7b 31 20 7b 65 63 68 6f 2d 76 74 61  }.} {1 {echo-vta
6400: 62 2d 65 72 72 6f 72 3a 20 55 4e 49 51 55 45 20  b-error: UNIQUE 
6410: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
6420: 64 3a 20 63 2e 61 7d 7d 0a 64 6f 5f 74 65 73 74  d: c.a}}.do_test
6430: 20 76 74 61 62 31 2e 31 32 2d 35 20 7b 0a 20 20   vtab1.12-5 {.  
6440: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
6450: 20 2a 20 46 52 4f 4d 20 63 20 7d 0a 7d 20 7b 33   * FROM c }.} {3
6460: 20 47 20 48 7d 0a 64 6f 5f 74 65 73 74 20 76 74   G H}.do_test vt
6470: 61 62 31 2e 31 32 2d 36 20 7b 0a 20 20 65 78 65  ab1.12-6 {.  exe
6480: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  csql { COMMIT }.
6490: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
64a0: 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d 0a 7d 20  CT * FROM c }.} 
64b0: 7b 33 20 47 20 48 7d 0a 0a 23 20 41 74 20 6f 6e  {3 G H}..# At on
64c0: 65 20 70 6f 69 6e 74 20 28 74 69 63 6b 65 74 20  e point (ticket 
64d0: 23 32 37 35 39 29 2c 20 61 20 57 48 45 52 45 20  #2759), a WHERE 
64e0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
64f0: 72 6d 20 22 3c 63 6f 6c 75 6d 6e 3e 20 49 53 20  rm "<column> IS 
6500: 4e 55 4c 4c 22 0a 23 20 6f 6e 20 61 20 76 69 72  NULL".# on a vir
6510: 74 75 61 6c 20 74 61 62 6c 65 20 77 61 73 20 63  tual table was c
6520: 61 75 73 69 6e 67 20 61 6e 20 61 73 73 65 72 74  ausing an assert
6530: 28 29 20 74 6f 20 66 61 69 6c 20 69 6e 20 74 68  () to fail in th
6540: 65 20 63 6f 6d 70 69 6c 65 72 2e 0a 23 0a 23 20  e compiler..#.# 
6550: 22 49 53 20 4e 55 4c 4c 22 20 63 6c 61 75 73 65  "IS NULL" clause
6560: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
6570: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
6580: 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  o the virtual ta
6590: 62 6c 65 0a 23 20 69 6d 70 6c 65 6d 65 6e 74 61  ble.# implementa
65a0: 74 69 6f 6e 2e 20 54 68 65 79 20 61 72 65 20 68  tion. They are h
65b0: 61 6e 64 6c 65 64 20 62 79 20 53 51 4c 69 74 65  andled by SQLite
65c0: 20 61 66 74 65 72 20 74 68 65 20 76 74 61 62 20   after the vtab 
65d0: 72 65 74 75 72 6e 73 20 69 74 73 0a 23 20 64 61  returns its.# da
65e0: 74 61 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74  ta..#.do_test vt
65f0: 61 62 31 2e 31 33 2d 31 20 7b 0a 20 20 65 78 65  ab1.13-1 {.  exe
6600: 63 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45  csql { .    SELE
6610: 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63  CT * FROM echo_c
6620: 20 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c   WHERE a IS NULL
6630: 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65   .  }.} {}.do_te
6640: 73 74 20 76 74 61 62 31 2e 31 33 2d 32 20 7b 0a  st vtab1.13-2 {.
6650: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
6660: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 20 56   INSERT INTO c V
6670: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 31 35 2c 20  ALUES(NULL, 15, 
6680: 31 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  16);.    SELECT 
6690: 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48  * FROM echo_c WH
66a0: 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20 0a 20  ERE a IS NULL . 
66b0: 20 7d 0a 7d 20 7b 7b 7d 20 31 35 20 31 36 7d 0a   }.} {{} 15 16}.
66c0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 33  do_test vtab1.13
66d0: 2d 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  -3 {.  execsql {
66e0: 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54   .    INSERT INT
66f0: 4f 20 63 20 56 41 4c 55 45 53 28 31 35 2c 20 4e  O c VALUES(15, N
6700: 55 4c 4c 2c 20 31 36 29 3b 0a 20 20 20 20 53 45  ULL, 16);.    SE
6710: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f  LECT * FROM echo
6720: 5f 63 20 57 48 45 52 45 20 62 20 49 53 20 4e 55  _c WHERE b IS NU
6730: 4c 4c 20 0a 20 20 7d 0a 7d 20 7b 31 35 20 7b 7d  LL .  }.} {15 {}
6740: 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   16}.do_test vta
6750: 62 31 2e 31 33 2d 34 20 7b 0a 20 20 75 6e 73 65  b1.13-4 {.  unse
6760: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6e 75  t -nocomplain nu
6770: 6c 6c 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  ll.  execsql { .
6780: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
6790: 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 62  M echo_c WHERE b
67a0: 20 49 53 20 24 6e 75 6c 6c 0a 20 20 7d 0a 7d 20   IS $null.  }.} 
67b0: 7b 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65  {15 {} 16}.do_te
67c0: 73 74 20 76 74 61 62 31 2e 31 33 2d 35 20 7b 0a  st vtab1.13-5 {.
67d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
67e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65   SELECT * FROM e
67f0: 63 68 6f 5f 63 20 57 48 45 52 45 20 62 20 49 53  cho_c WHERE b IS
6800: 20 4e 55 4c 4c 20 41 4e 44 20 61 20 3d 20 31 35   NULL AND a = 15
6810: 3b 0a 20 20 7d 0a 7d 20 7b 31 35 20 7b 7d 20 31  ;.  }.} {15 {} 1
6820: 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  6}.do_test vtab1
6830: 2e 31 33 2d 36 20 7b 0a 20 20 65 78 65 63 73 71  .13-6 {.  execsq
6840: 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20  l { .    SELECT 
6850: 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48  * FROM echo_c WH
6860: 45 52 45 20 4e 55 4c 4c 20 49 53 20 62 20 41 4e  ERE NULL IS b AN
6870: 44 20 61 20 49 53 20 31 35 3b 0a 20 20 7d 0a 7d  D a IS 15;.  }.}
6880: 20 7b 31 35 20 7b 7d 20 31 36 7d 0a 0a 0a 64 6f   {15 {} 16}...do
6890: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e 30  _test vtab1-14.0
68a0: 30 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  01 {.  execsql {
68b0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
68c0: 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52  FROM echo_c WHER
68d0: 45 20 2b 72 6f 77 69 64 20 49 4e 20 28 31 2c 32  E +rowid IN (1,2
68e0: 2c 33 29 7d 0a 7d 20 7b 31 20 33 20 47 20 48 20  ,3)}.} {1 3 G H 
68f0: 32 20 7b 7d 20 31 35 20 31 36 20 33 20 31 35 20  2 {} 15 16 3 15 
6900: 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76  {} 16}.do_test v
6910: 74 61 62 31 2d 31 34 2e 30 30 32 20 7b 0a 20 20  tab1-14.002 {.  
6920: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
6930: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63  rowid, * FROM ec
6940: 68 6f 5f 63 20 57 48 45 52 45 20 72 6f 77 69 64  ho_c WHERE rowid
6950: 20 49 4e 20 28 31 2c 32 2c 33 29 7d 0a 7d 20 7b   IN (1,2,3)}.} {
6960: 31 20 33 20 47 20 48 20 32 20 7b 7d 20 31 35 20  1 3 G H 2 {} 15 
6970: 31 36 20 33 20 31 35 20 7b 7d 20 31 36 7d 0a 64  16 3 15 {} 16}.d
6980: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e  o_test vtab1-14.
6990: 30 30 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  003 {.  execsql 
69a0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
69b0: 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45   FROM echo_c WHE
69c0: 52 45 20 2b 72 6f 77 69 64 20 49 4e 20 28 30 2c  RE +rowid IN (0,
69d0: 31 2c 35 2c 32 2c 27 61 27 2c 33 2c 4e 55 4c 4c  1,5,2,'a',3,NULL
69e0: 29 7d 0a 7d 20 7b 31 20 33 20 47 20 48 20 32 20  )}.} {1 3 G H 2 
69f0: 7b 7d 20 31 35 20 31 36 20 33 20 31 35 20 7b 7d  {} 15 16 3 15 {}
6a00: 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   16}.do_test vta
6a10: 62 31 2d 31 34 2e 30 30 34 20 7b 0a 20 20 65 78  b1-14.004 {.  ex
6a20: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  ecsql {SELECT ro
6a30: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f  wid, * FROM echo
6a40: 5f 63 20 57 48 45 52 45 20 72 6f 77 69 64 20 49  _c WHERE rowid I
6a50: 4e 20 28 30 2c 31 2c 35 2c 27 61 27 2c 32 2c 33  N (0,1,5,'a',2,3
6a60: 2c 4e 55 4c 4c 29 7d 0a 7d 20 7b 31 20 33 20 47  ,NULL)}.} {1 3 G
6a70: 20 48 20 32 20 7b 7d 20 31 35 20 31 36 20 33 20   H 2 {} 15 16 3 
6a80: 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 73  15 {} 16}.do_tes
6a90: 74 20 76 74 61 62 31 2d 31 34 2e 30 30 35 20 7b  t vtab1-14.005 {
6aa0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
6ab0: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
6ac0: 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 72 6f   echo_c WHERE ro
6ad0: 77 69 64 20 4e 4f 54 20 49 4e 20 28 30 2c 31 2c  wid NOT IN (0,1,
6ae0: 35 2c 27 61 27 2c 32 2c 33 29 7d 0a 7d 20 7b 7d  5,'a',2,3)}.} {}
6af0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
6b00: 34 2e 30 30 36 20 7b 0a 20 20 65 78 65 63 73 71  4.006 {.  execsq
6b10: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  l {SELECT rowid,
6b20: 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57   * FROM echo_c W
6b30: 48 45 52 45 20 72 6f 77 69 64 20 4e 4f 54 20 49  HERE rowid NOT I
6b40: 4e 20 28 30 2c 35 2c 27 61 27 2c 32 2c 33 29 7d  N (0,5,'a',2,3)}
6b50: 0a 7d 20 7b 31 20 33 20 47 20 48 7d 0a 64 6f 5f  .} {1 3 G H}.do_
6b60: 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e 30 30  test vtab1-14.00
6b70: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  7 {.  execsql {S
6b80: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
6b90: 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45  ROM echo_c WHERE
6ba0: 20 2b 72 6f 77 69 64 20 4e 4f 54 20 49 4e 20 28   +rowid NOT IN (
6bb0: 30 2c 35 2c 27 61 27 2c 32 2c 33 2c 4e 55 4c 4c  0,5,'a',2,3,NULL
6bc0: 29 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  )}.} {}.do_test 
6bd0: 76 74 61 62 31 2d 31 34 2e 30 30 38 20 7b 0a 20  vtab1-14.008 {. 
6be0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
6bf0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65   rowid, * FROM e
6c00: 63 68 6f 5f 63 20 57 48 45 52 45 20 72 6f 77 69  cho_c WHERE rowi
6c10: 64 20 4e 4f 54 20 49 4e 20 28 30 2c 35 2c 27 61  d NOT IN (0,5,'a
6c20: 27 2c 32 2c 33 2c 4e 55 4c 4c 29 7d 0a 7d 20 7b  ',2,3,NULL)}.} {
6c30: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
6c40: 31 34 2e 30 31 31 20 7b 0a 20 20 65 78 65 63 73  14.011 {.  execs
6c50: 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql {SELECT * FRO
6c60: 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 2b  M echo_c WHERE +
6c70: 61 20 49 4e 20 28 31 2c 33 2c 38 2c 27 78 27 2c  a IN (1,3,8,'x',
6c80: 4e 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a 7d 20 7b  NULL,15,24)}.} {
6c90: 33 20 47 20 48 20 31 35 20 7b 7d 20 31 36 7d 0a  3 G H 15 {} 16}.
6ca0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34  do_test vtab1-14
6cb0: 2e 30 31 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .012 {.  execsql
6cc0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
6cd0: 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20 49  echo_c WHERE a I
6ce0: 4e 20 28 31 2c 33 2c 38 2c 27 78 27 2c 4e 55 4c  N (1,3,8,'x',NUL
6cf0: 4c 2c 31 35 2c 32 34 29 7d 0a 7d 20 7b 33 20 47  L,15,24)}.} {3 G
6d00: 20 48 20 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f   H 15 {} 16}.do_
6d10: 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e 30 31  test vtab1-14.01
6d20: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  3 {.  execsql {S
6d30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68  ELECT * FROM ech
6d40: 6f 5f 63 20 57 48 45 52 45 20 61 20 4e 4f 54 20  o_c WHERE a NOT 
6d50: 49 4e 20 28 31 2c 38 2c 27 78 27 2c 31 35 2c 32  IN (1,8,'x',15,2
6d60: 34 29 7d 0a 7d 20 7b 33 20 47 20 48 7d 0a 64 6f  4)}.} {3 G H}.do
6d70: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e 30  _test vtab1-14.0
6d80: 31 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  14 {.  execsql {
6d90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63  SELECT * FROM ec
6da0: 68 6f 5f 63 20 57 48 45 52 45 20 61 20 4e 4f 54  ho_c WHERE a NOT
6db0: 20 49 4e 20 28 31 2c 38 2c 27 78 27 2c 4e 55 4c   IN (1,8,'x',NUL
6dc0: 4c 2c 31 35 2c 32 34 29 7d 0a 7d 20 7b 7d 0a 64  L,15,24)}.} {}.d
6dd0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e  o_test vtab1-14.
6de0: 30 31 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  015 {.  execsql 
6df0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65  {SELECT * FROM e
6e00: 63 68 6f 5f 63 20 57 48 45 52 45 20 2b 61 20 4e  cho_c WHERE +a N
6e10: 4f 54 20 49 4e 20 28 31 2c 38 2c 27 78 27 2c 4e  OT IN (1,8,'x',N
6e20: 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a 7d 20 7b 7d  ULL,15,24)}.} {}
6e30: 0a 0a 0a 0a 23 64 6f 5f 74 65 73 74 20 76 74 61  ....#do_test vta
6e40: 62 31 2d 31 34 2e 31 20 7b 0a 23 20 20 65 78 65  b1-14.1 {.#  exe
6e50: 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52  csql { DELETE FR
6e60: 4f 4d 20 63 20 7d 0a 23 20 20 73 65 74 20 65 63  OM c }.#  set ec
6e70: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 23 20 20  ho_module "".#  
6e80: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
6e90: 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57   * FROM echo_c W
6ea0: 48 45 52 45 20 72 6f 77 69 64 20 49 4e 20 28 31  HERE rowid IN (1
6eb0: 2c 20 32 2c 20 33 29 20 7d 0a 23 20 20 73 65 74  , 2, 3) }.#  set
6ec0: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 23 7d 20   echo_module.#} 
6ed0: 7b 2f 2e 2a 78 42 65 73 74 49 6e 64 65 78 20 7b  {/.*xBestIndex {
6ee0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2e 20  SELECT rowid, . 
6ef0: 46 52 4f 4d 20 27 63 27 20 57 48 45 52 45 20 72  FROM 'c' WHERE r
6f00: 6f 77 69 64 20 3d 20 2e 7d 20 78 46 69 6c 74 65  owid = .} xFilte
6f10: 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  r {SELECT rowid,
6f20: 20 2e 20 46 52 4f 4d 20 27 63 27 7d 20 31 2f 7d   . FROM 'c'} 1/}
6f30: 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ..do_test vtab1-
6f40: 31 34 2e 32 20 7b 0a 20 20 73 65 74 20 65 63 68  14.2 {.  set ech
6f50: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78  o_module "".  ex
6f60: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
6f70: 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45   FROM echo_c WHE
6f80: 52 45 20 72 6f 77 69 64 20 3d 20 31 20 7d 0a 20  RE rowid = 1 }. 
6f90: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
6fa0: 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e  .} [list xBestIn
6fb0: 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  dex {SELECT rowi
6fc0: 64 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  d, a, b, c FROM 
6fd0: 27 63 27 20 57 48 45 52 45 20 72 6f 77 69 64 20  'c' WHERE rowid 
6fe0: 3d 20 3f 7d 20 5c 0a 20 20 20 20 20 20 20 20 78  = ?} \.        x
6ff0: 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72  Filter {SELECT r
7000: 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 46 52  owid, a, b, c FR
7010: 4f 4d 20 27 63 27 20 57 48 45 52 45 20 72 6f 77  OM 'c' WHERE row
7020: 69 64 20 3d 20 3f 7d 20 31 5d 0a 0a 64 6f 5f 74  id = ?} 1]..do_t
7030: 65 73 74 20 76 74 61 62 31 2d 31 34 2e 33 20 7b  est vtab1-14.3 {
7040: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
7050: 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  le "".  execsql 
7060: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
7070: 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20 3d  echo_c WHERE a =
7080: 20 31 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f   1 }.  set echo_
7090: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78  module.} [list x
70a0: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43  BestIndex {SELEC
70b0: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
70c0: 20 46 52 4f 4d 20 27 63 27 20 57 48 45 52 45 20   FROM 'c' WHERE 
70d0: 61 20 3d 20 3f 7d 20 5c 0a 20 20 20 20 20 20 20  a = ?} \.       
70e0: 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54   xFilter {SELECT
70f0: 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20   rowid, a, b, c 
7100: 46 52 4f 4d 20 27 63 27 20 57 48 45 52 45 20 61  FROM 'c' WHERE a
7110: 20 3d 20 3f 7d 20 31 5d 0a 0a 23 64 6f 5f 74 65   = ?} 1]..#do_te
7120: 73 74 20 76 74 61 62 31 2d 31 34 2e 34 20 7b 0a  st vtab1-14.4 {.
7130: 23 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  #  set echo_modu
7140: 6c 65 20 22 22 0a 23 20 20 65 78 65 63 73 71 6c  le "".#  execsql
7150: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
7160: 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20   echo_c WHERE a 
7170: 49 4e 20 28 31 2c 20 32 29 20 7d 0a 23 20 20 73  IN (1, 2) }.#  s
7180: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 23  et echo_module.#
7190: 7d 20 7b 2f 78 42 65 73 74 49 6e 64 65 78 20 7b  } {/xBestIndex {
71a0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2e 20  SELECT rowid, . 
71b0: 46 52 4f 4d 20 27 63 27 20 57 48 45 52 45 20 61  FROM 'c' WHERE a
71c0: 20 3d 20 2e 7d 20 78 46 69 6c 74 65 72 20 7b 53   = .} xFilter {S
71d0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2e 20 46  ELECT rowid, . F
71e0: 52 4f 4d 20 27 63 27 20 57 48 45 52 45 20 61 20  ROM 'c' WHERE a 
71f0: 3d 20 2e 7d 20 31 2f 7d 0a 0a 64 6f 5f 74 65 73  = .} 1/}..do_tes
7200: 74 20 76 74 61 62 31 2d 31 35 2e 31 20 7b 0a 20  t vtab1-15.1 {. 
7210: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
7220: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
7230: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
7240: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
7250: 45 20 65 63 68 6f 5f 74 31 20 55 53 49 4e 47 20  E echo_t1 USING 
7260: 65 63 68 6f 28 74 31 29 3b 0a 20 20 7d 0a 7d 20  echo(t1);.  }.} 
7270: 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  {}.do_test vtab1
7280: 2d 31 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -15.2 {.  execsq
7290: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
72a0: 4e 54 4f 20 65 63 68 6f 5f 74 31 28 72 6f 77 69  NTO echo_t1(rowi
72b0: 64 29 20 56 41 4c 55 45 53 28 34 35 29 3b 0a 20  d) VALUES(45);. 
72c0: 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c     SELECT rowid,
72d0: 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 74 31 3b   * FROM echo_t1;
72e0: 0a 20 20 7d 0a 7d 20 7b 34 35 20 7b 7d 20 7b 7d  .  }.} {45 {} {}
72f0: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   {}}.do_test vta
7300: 62 31 2d 31 35 2e 33 20 7b 0a 20 20 65 78 65 63  b1-15.3 {.  exec
7310: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
7320: 20 49 4e 54 4f 20 65 63 68 6f 5f 74 31 28 72 6f   INTO echo_t1(ro
7330: 77 69 64 29 20 56 41 4c 55 45 53 28 4e 55 4c 4c  wid) VALUES(NULL
7340: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f  );.    SELECT ro
7350: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f  wid, * FROM echo
7360: 5f 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34 35 20 7b  _t1;.  }.} {45 {
7370: 7d 20 7b 7d 20 7b 7d 20 34 36 20 7b 7d 20 7b 7d  } {} {} 46 {} {}
7380: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   {}}.do_test vta
7390: 62 31 2d 31 35 2e 34 20 7b 0a 20 20 63 61 74 63  b1-15.4 {.  catc
73a0: 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  hsql {.    INSER
73b0: 54 20 49 4e 54 4f 20 65 63 68 6f 5f 74 31 28 72  T INTO echo_t1(r
73c0: 6f 77 69 64 29 20 56 41 4c 55 45 53 28 27 6e 65  owid) VALUES('ne
73d0: 77 20 72 6f 77 69 64 27 29 3b 0a 20 20 7d 0a 7d  w rowid');.  }.}
73e0: 20 7b 31 20 7b 64 61 74 61 74 79 70 65 20 6d 69   {1 {datatype mi
73f0: 73 6d 61 74 63 68 7d 7d 0a 0a 23 20 54 68 65 20  smatch}}..# The 
7400: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
7410: 2d 20 76 74 61 62 31 2d 31 36 2e 2a 20 2d 20 61  - vtab1-16.* - a
7420: 72 65 20 64 65 73 69 67 6e 65 64 20 74 6f 20 74  re designed to t
7430: 65 73 74 20 74 68 61 74 20 73 65 74 74 69 6e 67  est that setting
7440: 20 0a 23 20 73 71 6c 69 74 65 33 5f 76 74 61 62   .# sqlite3_vtab
7450: 2e 7a 45 72 72 4d 73 67 20 76 61 72 69 61 62 6c  .zErrMsg variabl
7460: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 62 79  e can be used by
7470: 20 74 68 65 20 76 74 61 62 20 69 6e 74 65 72 66   the vtab interf
7480: 61 63 65 20 74 6f 20 0a 23 20 72 65 74 75 72 6e  ace to .# return
7490: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
74a0: 65 20 74 6f 20 74 68 65 20 75 73 65 72 2e 0a 23  e to the user..#
74b0: 20 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d   .do_test vtab1-
74c0: 31 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  16.1 {.  execsql
74d0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
74e0: 42 4c 45 20 74 32 28 61 20 50 52 49 4d 41 52 59  BLE t2(a PRIMARY
74f0: 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20   KEY, b, c);.   
7500: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
7510: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
7520: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
7530: 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 35 2c   t2 VALUES(4, 5,
7540: 20 36 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   6);.    CREATE 
7550: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 63  VIRTUAL TABLE ec
7560: 68 6f 5f 74 32 20 55 53 49 4e 47 20 65 63 68 6f  ho_t2 USING echo
7570: 28 74 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  (t2);.  }.} {}..
7580: 73 65 74 20 74 6e 20 32 0a 66 6f 72 65 61 63 68  set tn 2.foreach
7590: 20 6d 65 74 68 6f 64 20 5b 6c 69 73 74 20 5c 0a   method [list \.
75a0: 20 20 20 20 78 42 65 73 74 49 6e 64 65 78 20 20      xBestIndex  
75b0: 20 20 20 20 20 5c 0a 20 20 20 20 78 4f 70 65 6e       \.    xOpen
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
75d0: 20 20 78 46 69 6c 74 65 72 20 20 20 20 20 20 20    xFilter       
75e0: 20 20 20 5c 0a 20 20 20 20 78 4e 65 78 74 20 20     \.    xNext  
75f0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
7600: 78 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 20  xColumn         
7610: 20 5c 0a 20 20 20 20 78 52 6f 77 69 64 20 20 20   \.    xRowid   
7620: 20 20 20 20 20 20 20 20 5c 0a 5d 20 7b 0a 20 20          \.] {.  
7630: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 36  do_test vtab1-16
7640: 2e 24 74 6e 20 7b 0a 20 20 20 20 73 65 74 20 65  .$tn {.    set e
7650: 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28  cho_module_fail(
7660: 24 6d 65 74 68 6f 64 2c 74 32 29 20 22 74 68 65  $method,t2) "the
7670: 20 24 6d 65 74 68 6f 64 20 6d 65 74 68 6f 64 20   $method method 
7680: 68 61 73 20 66 61 69 6c 65 64 22 0a 20 20 20 20  has failed".    
7690: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
76a0: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
76b0: 65 63 68 6f 5f 74 32 20 57 48 45 52 45 20 61 20  echo_t2 WHERE a 
76c0: 3e 3d 20 31 20 7d 0a 20 20 7d 20 22 31 20 7b 65  >= 1 }.  } "1 {e
76d0: 63 68 6f 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20  cho-vtab-error: 
76e0: 74 68 65 20 24 6d 65 74 68 6f 64 20 6d 65 74 68  the $method meth
76f0: 6f 64 20 68 61 73 20 66 61 69 6c 65 64 7d 22 0a  od has failed}".
7700: 20 20 75 6e 73 65 74 20 65 63 68 6f 5f 6d 6f 64    unset echo_mod
7710: 75 6c 65 5f 66 61 69 6c 28 24 6d 65 74 68 6f 64  ule_fail($method
7720: 2c 74 32 29 0a 20 20 69 6e 63 72 20 74 6e 0a 7d  ,t2).  incr tn.}
7730: 0a 0a 66 6f 72 65 61 63 68 20 6d 65 74 68 6f 64  ..foreach method
7740: 20 5b 6c 69 73 74 20 5c 0a 20 20 78 55 70 64 61   [list \.  xUpda
7750: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  te            \.
7760: 20 20 78 42 65 67 69 6e 20 20 20 20 20 20 20 20    xBegin        
7770: 20 20 20 20 20 5c 0a 20 20 78 53 79 6e 63 20 20       \.  xSync  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d 20              \.] 
7790: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 76 74 61 62  {.  do_test vtab
77a0: 31 2d 31 36 2e 24 74 6e 20 7b 0a 20 20 20 20 73  1-16.$tn {.    s
77b0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66  et echo_module_f
77c0: 61 69 6c 28 24 6d 65 74 68 6f 64 2c 74 32 29 20  ail($method,t2) 
77d0: 22 74 68 65 20 24 6d 65 74 68 6f 64 20 6d 65 74  "the $method met
77e0: 68 6f 64 20 68 61 73 20 66 61 69 6c 65 64 22 0a  hod has failed".
77f0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
7800: 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f  NSERT INTO echo_
7810: 74 32 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20  t2 VALUES(7, 8, 
7820: 39 29 20 7d 0a 20 20 7d 20 22 31 20 7b 65 63 68  9) }.  } "1 {ech
7830: 6f 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20 74 68  o-vtab-error: th
7840: 65 20 24 6d 65 74 68 6f 64 20 6d 65 74 68 6f 64  e $method method
7850: 20 68 61 73 20 66 61 69 6c 65 64 7d 22 0a 20 20   has failed}".  
7860: 75 6e 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c  unset echo_modul
7870: 65 5f 66 61 69 6c 28 24 6d 65 74 68 6f 64 2c 74  e_fail($method,t
7880: 32 29 0a 20 20 69 6e 63 72 20 74 6e 0a 7d 0a 0a  2).  incr tn.}..
7890: 69 66 63 61 70 61 62 6c 65 20 61 6c 74 65 72 74  ifcapable altert
78a0: 61 62 6c 65 20 7b 0a 20 20 64 6f 5f 74 65 73 74  able {.  do_test
78b0: 20 76 74 61 62 31 2d 31 36 2e 24 74 6e 20 7b 0a   vtab1-16.$tn {.
78c0: 20 20 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64      set echo_mod
78d0: 75 6c 65 5f 66 61 69 6c 28 78 52 65 6e 61 6d 65  ule_fail(xRename
78e0: 2c 74 32 29 20 22 74 68 65 20 78 52 65 6e 61 6d  ,t2) "the xRenam
78f0: 65 20 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69  e method has fai
7900: 6c 65 64 22 0a 20 20 20 20 63 61 74 63 68 73 71  led".    catchsq
7910: 6c 20 7b 20 41 4c 54 45 52 20 54 41 42 4c 45 20  l { ALTER TABLE 
7920: 65 63 68 6f 5f 74 32 20 52 45 4e 41 4d 45 20 54  echo_t2 RENAME T
7930: 4f 20 61 6e 6f 74 68 65 72 5f 6e 61 6d 65 20 7d  O another_name }
7940: 0a 20 20 7d 20 22 31 20 7b 65 63 68 6f 2d 76 74  .  } "1 {echo-vt
7950: 61 62 2d 65 72 72 6f 72 3a 20 74 68 65 20 78 52  ab-error: the xR
7960: 65 6e 61 6d 65 20 6d 65 74 68 6f 64 20 68 61 73  ename method has
7970: 20 66 61 69 6c 65 64 7d 22 0a 20 20 75 6e 73 65   failed}".  unse
7980: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66 61  t echo_module_fa
7990: 69 6c 28 78 52 65 6e 61 6d 65 2c 74 32 29 0a 20  il(xRename,t2). 
79a0: 20 69 6e 63 72 20 74 6e 0a 7d 0a 0a 23 20 54 68   incr tn.}..# Th
79b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
79c0: 20 63 61 73 65 20 65 78 70 6f 73 65 73 20 61 6e   case exposes an
79d0: 20 69 6e 73 74 61 6e 63 65 20 69 6e 20 73 71 6c   instance in sql
79e0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
79f0: 62 28 29 0a 23 20 61 6e 20 65 72 72 6f 72 20 6d  b().# an error m
7a00: 65 73 73 61 67 65 20 77 61 73 20 73 65 74 20 75  essage was set u
7a10: 73 69 6e 67 20 61 20 63 61 6c 6c 20 73 69 6d 69  sing a call simi
7a20: 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d  lar to sqlite3_m
7a30: 70 72 69 6e 74 66 28 7a 45 72 72 29 2c 0a 23 20  printf(zErr),.# 
7a40: 77 68 65 72 65 20 7a 45 72 72 20 69 73 20 61 6e  where zErr is an
7a50: 20 61 72 62 69 74 72 61 72 79 20 73 74 72 69 6e   arbitrary strin
7a60: 67 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 67 6f  g. This is no go
7a70: 6f 64 20 69 66 20 74 68 65 20 73 74 72 69 6e 67  od if the string
7a80: 20 63 6f 6e 74 61 69 6e 73 0a 23 20 63 68 61 72   contains.# char
7a90: 61 63 74 65 72 73 20 74 68 61 74 20 63 61 6e 20  acters that can 
7aa0: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
7ab0: 70 72 69 6e 74 66 28 29 20 66 6f 72 6d 61 74 74  printf() formatt
7ac0: 69 6e 67 20 64 69 72 65 63 74 69 76 65 73 2e 0a  ing directives..
7ad0: 23 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  #.do_test vtab1-
7ae0: 31 37 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  17.1 {.  sqlite3
7af0: 5f 64 62 5f 63 6f 6e 66 69 67 20 64 62 20 44 45  _db_config db DE
7b00: 46 45 4e 53 49 56 45 20 30 0a 20 20 65 78 65 63  FENSIVE 0.  exec
7b10: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
7b20: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
7b30: 61 20 3d 20 31 3b 0a 20 20 20 20 49 4e 53 45 52  a = 1;.    INSER
7b40: 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61  T INTO sqlite_ma
7b50: 73 74 65 72 20 56 41 4c 55 45 53 28 0a 20 20 20  ster VALUES(.   
7b60: 20 20 20 27 74 61 62 6c 65 27 2c 20 27 74 33 27     'table', 't3'
7b70: 2c 20 27 74 33 27 2c 20 30 2c 20 27 49 4e 53 45  , 't3', 0, 'INSE
7b80: 52 54 20 49 4e 54 4f 20 22 25 73 25 73 22 20 56  RT INTO "%s%s" V
7b90: 41 4c 55 45 53 28 31 29 27 0a 20 20 20 20 29 3b  ALUES(1)'.    );
7ba0: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
7bb0: 7b 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  { CREATE VIRTUAL
7bc0: 20 54 41 42 4c 45 20 74 34 20 55 53 49 4e 47 20   TABLE t4 USING 
7bd0: 65 63 68 6f 28 74 33 29 3b 20 7d 0a 7d 20 7b 31  echo(t3); }.} {1
7be0: 20 7b 76 74 61 62 6c 65 20 63 6f 6e 73 74 72 75   {vtable constru
7bf0: 63 74 6f 72 20 66 61 69 6c 65 64 3a 20 74 34 7d  ctor failed: t4}
7c00: 7d 0a 0a 23 20 54 68 69 73 20 74 65 73 74 20 76  }..# This test v
7c10: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 69 63  erifies that tic
7c20: 6b 65 74 20 34 38 66 32 39 39 36 33 20 69 73 20  ket 48f29963 is 
7c30: 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  fixed..#.do_test
7c40: 20 76 74 61 62 31 2d 31 37 2e 31 20 7b 0a 20 20   vtab1-17.1 {.  
7c50: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43  execsql { .    C
7c60: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61  REATE TABLE t5(a
7c70: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
7c80: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65   VIRTUAL TABLE e
7c90: 35 20 55 53 49 4e 47 20 65 63 68 6f 5f 76 32 28  5 USING echo_v2(
7ca0: 74 35 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  t5);.    BEGIN;.
7cb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
7cc0: 4f 20 65 35 20 56 41 4c 55 45 53 28 31 2c 20 32  O e5 VALUES(1, 2
7cd0: 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  );.      DROP TA
7ce0: 42 4c 45 20 65 35 3b 0a 20 20 20 20 20 20 53 41  BLE e5;.      SA
7cf0: 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 20  VEPOINT one;.   
7d00: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
7d10: 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ne;.    COMMIT;.
7d20: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
7d30: 74 20 76 74 61 62 31 2d 31 37 2e 32 20 7b 0a 20  t vtab1-17.2 {. 
7d40: 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54   execsql { DELET
7d50: 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  E FROM sqlite_ma
7d60: 73 74 65 72 20 57 48 45 52 45 20 73 71 6c 20 4c  ster WHERE sql L
7d70: 49 4b 45 20 27 69 6e 73 65 72 74 25 27 20 7d 0a  IKE 'insert%' }.
7d80: 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
7de0: 20 74 65 73 74 73 20 2d 20 76 74 61 62 31 2d 31   tests - vtab1-1
7df0: 38 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20  8.* - test that 
7e00: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
7e10: 20 6f 66 20 4c 49 4b 45 0a 23 20 63 6f 6e 73 74   of LIKE.# const
7e20: 72 61 69 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  raints in where.
7e30: 63 20 70 6c 61 79 73 20 77 65 6c 6c 20 77 69 74  c plays well wit
7e40: 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  h virtual tables
7e50: 2e 0a 23 0a 23 20 20 20 31 38 2e 31 2e 2a 3a 20  ..#.#   18.1.*: 
7e60: 43 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  Case-insensitive
7e70: 20 4c 49 4b 45 2e 0a 23 20 20 20 31 38 2e 32 2e   LIKE..#   18.2.
7e80: 2a 3a 20 43 61 73 65 2d 73 65 6e 73 69 74 69 76  *: Case-sensitiv
7e90: 65 20 4c 49 4b 45 2e 0a 23 0a 75 6e 73 65 74 20  e LIKE..#.unset 
7ea0: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 65 63 68 6f  -nocomplain echo
7eb0: 5f 6d 6f 64 75 6c 65 5f 62 65 67 69 6e 5f 66 61  _module_begin_fa
7ec0: 69 6c 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  il..do_execsql_t
7ed0: 65 73 74 20 31 38 2e 31 2e 30 20 7b 0a 20 20 43  est 18.1.0 {.  C
7ee0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 61  REATE TABLE t6(a
7ef0: 2c 20 62 20 54 45 58 54 29 3b 0a 20 20 43 52 45  , b TEXT);.  CRE
7f00: 41 54 45 20 49 4e 44 45 58 20 69 36 20 4f 4e 20  ATE INDEX i6 ON 
7f10: 74 36 28 62 2c 20 61 29 3b 0a 20 20 49 4e 53 45  t6(b, a);.  INSE
7f20: 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45  RT INTO t6 VALUE
7f30: 53 28 31 2c 20 27 50 65 74 65 72 27 29 3b 0a 20  S(1, 'Peter');. 
7f40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
7f50: 56 41 4c 55 45 53 28 32 2c 20 27 41 6e 64 72 65  VALUES(2, 'Andre
7f60: 77 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  w');.  INSERT IN
7f70: 54 4f 20 74 36 20 56 41 4c 55 45 53 28 33 2c 20  TO t6 VALUES(3, 
7f80: 27 38 4a 61 6d 65 73 27 29 3b 0a 20 20 49 4e 53  '8James');.  INS
7f90: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
7fa0: 45 53 28 34 2c 20 27 38 4a 6f 68 6e 27 29 3b 0a  ES(4, '8John');.
7fb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
7fc0: 20 56 41 4c 55 45 53 28 35 2c 20 27 50 68 69 6c   VALUES(5, 'Phil
7fd0: 6c 69 70 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  lip');.  INSERT 
7fe0: 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 36  INTO t6 VALUES(6
7ff0: 2c 20 27 42 61 72 74 68 6f 6c 6f 6d 65 77 27 29  , 'Bartholomew')
8000: 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55  ;.  CREATE VIRTU
8010: 41 4c 20 54 41 42 4c 45 20 65 36 20 55 53 49 4e  AL TABLE e6 USIN
8020: 47 20 65 63 68 6f 28 74 36 29 3b 0a 7d 0a 0a 66  G echo(t6);.}..f
8030: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72  oreach {tn sql r
8040: 65 73 20 66 69 6c 74 65 72 7d 20 7b 0a 20 20 31  es filter} {.  1
8050: 2e 31 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f  .1 "SELECT a FRO
8060: 4d 20 65 36 20 57 48 45 52 45 20 62 3e 27 38 4a  M e6 WHERE b>'8J
8070: 61 6d 65 73 27 22 20 7b 34 20 32 20 36 20 31 20  ames'" {4 2 6 1 
8080: 35 7d 0a 20 20 20 20 7b 78 46 69 6c 74 65 72 20  5}.    {xFilter 
8090: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61  {SELECT rowid, a
80a0: 2c 20 62 20 46 52 4f 4d 20 27 74 36 27 20 57 48  , b FROM 't6' WH
80b0: 45 52 45 20 62 20 3e 20 3f 7d 20 38 4a 61 6d 65  ERE b > ?} 8Jame
80c0: 73 7d 0a 0a 20 20 31 2e 32 20 22 53 45 4c 45 43  s}..  1.2 "SELEC
80d0: 54 20 61 20 46 52 4f 4d 20 65 36 20 57 48 45 52  T a FROM e6 WHER
80e0: 45 20 62 3e 3d 27 38 27 20 41 4e 44 20 62 3c 27  E b>='8' AND b<'
80f0: 39 27 22 20 7b 33 20 34 7d 0a 20 20 20 20 7b 78  9'" {3 4}.    {x
8100: 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72  Filter {SELECT r
8110: 6f 77 69 64 2c 20 61 2c 20 62 20 46 52 4f 4d 20  owid, a, b FROM 
8120: 27 74 36 27 20 57 48 45 52 45 20 62 20 3e 3d 20  't6' WHERE b >= 
8130: 3f 20 41 4e 44 20 62 20 3c 20 3f 7d 20 38 20 39  ? AND b < ?} 8 9
8140: 7d 0a 0a 20 20 31 2e 33 20 22 53 45 4c 45 43 54  }..  1.3 "SELECT
8150: 20 61 20 46 52 4f 4d 20 65 36 20 57 48 45 52 45   a FROM e6 WHERE
8160: 20 62 20 4c 49 4b 45 20 27 38 4a 25 27 22 20 7b   b LIKE '8J%'" {
8170: 33 20 34 7d 0a 20 20 20 20 7b 78 46 69 6c 74 65  3 4}.    {xFilte
8180: 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  r {SELECT rowid,
8190: 20 61 2c 20 62 20 46 52 4f 4d 20 27 74 36 27 20   a, b FROM 't6' 
81a0: 57 48 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44  WHERE b >= ? AND
81b0: 20 62 20 3c 20 3f 20 41 4e 44 20 62 20 6c 69 6b   b < ? AND b lik
81c0: 65 20 3f 7d 20 38 4a 20 38 6b 20 38 4a 25 7d 0a  e ?} 8J 8k 8J%}.
81d0: 0a 20 20 31 2e 34 20 22 53 45 4c 45 43 54 20 61  .  1.4 "SELECT a
81e0: 20 46 52 4f 4d 20 65 36 20 57 48 45 52 45 20 62   FROM e6 WHERE b
81f0: 20 4c 49 4b 45 20 27 38 6a 25 27 22 20 7b 33 20   LIKE '8j%'" {3 
8200: 34 7d 0a 20 20 20 20 7b 78 46 69 6c 74 65 72 20  4}.    {xFilter 
8210: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61  {SELECT rowid, a
8220: 2c 20 62 20 46 52 4f 4d 20 27 74 36 27 20 57 48  , b FROM 't6' WH
8230: 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62  ERE b >= ? AND b
8240: 20 3c 20 3f 20 41 4e 44 20 62 20 6c 69 6b 65 20   < ? AND b like 
8250: 3f 7d 20 38 4a 20 38 6b 20 38 6a 25 7d 0a 0a 20  ?} 8J 8k 8j%}.. 
8260: 20 31 2e 35 20 22 53 45 4c 45 43 54 20 61 20 46   1.5 "SELECT a F
8270: 52 4f 4d 20 65 36 20 57 48 45 52 45 20 62 20 4c  ROM e6 WHERE b L
8280: 49 4b 45 20 27 38 25 27 22 20 7b 33 20 34 7d 0a  IKE '8%'" {3 4}.
8290: 20 20 20 20 7b 78 46 69 6c 74 65 72 20 7b 53 45      {xFilter {SE
82a0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62  LECT rowid, a, b
82b0: 20 46 52 4f 4d 20 27 74 36 27 20 57 48 45 52 45   FROM 't6' WHERE
82c0: 20 62 20 6c 69 6b 65 20 3f 7d 20 38 25 7d 0a 7d   b like ?} 8%}.}
82d0: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
82e0: 64 75 6c 65 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  dule {}.  do_exe
82f0: 63 73 71 6c 5f 74 65 73 74 20 31 38 2e 24 74 6e  csql_test 18.$tn
8300: 2e 31 20 24 73 71 6c 20 24 72 65 73 0a 20 20 64  .1 $sql $res.  d
8310: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 31  o_test         1
8320: 38 2e 24 74 6e 2e 32 20 7b 20 6c 72 61 6e 67 65  8.$tn.2 { lrange
8330: 20 24 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c 65 20   $::echo_module 
8340: 32 20 65 6e 64 20 7d 20 24 66 69 6c 74 65 72 0a  2 end } $filter.
8350: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
8360: 73 74 20 31 38 2e 32 2e 30 20 7b 20 20 50 52 41  st 18.2.0 {  PRA
8370: 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69  GMA case_sensiti
8380: 76 65 5f 6c 69 6b 65 20 3d 20 4f 4e 20 7d 0a 66  ve_like = ON }.f
8390: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72  oreach {tn sql r
83a0: 65 73 20 66 69 6c 74 65 72 7d 20 7b 0a 20 20 32  es filter} {.  2
83b0: 2e 31 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f  .1 "SELECT a FRO
83c0: 4d 20 65 36 20 57 48 45 52 45 20 62 20 4c 49 4b  M e6 WHERE b LIK
83d0: 45 20 27 38 25 27 22 20 7b 33 20 34 7d 0a 20 20  E '8%'" {3 4}.  
83e0: 20 20 7b 78 46 69 6c 74 65 72 20 7b 53 45 4c 45    {xFilter {SELE
83f0: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 20 46  CT rowid, a, b F
8400: 52 4f 4d 20 27 74 36 27 20 57 48 45 52 45 20 62  ROM 't6' WHERE b
8410: 20 6c 69 6b 65 20 3f 7d 20 38 25 7d 0a 0a 20 20   like ?} 8%}..  
8420: 32 2e 32 20 22 53 45 4c 45 43 54 20 61 20 46 52  2.2 "SELECT a FR
8430: 4f 4d 20 65 36 20 57 48 45 52 45 20 62 20 4c 49  OM e6 WHERE b LI
8440: 4b 45 20 27 38 6a 25 27 22 20 7b 7d 0a 20 20 20  KE '8j%'" {}.   
8450: 20 7b 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43   {xFilter {SELEC
8460: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 20 46 52  T rowid, a, b FR
8470: 4f 4d 20 27 74 36 27 20 57 48 45 52 45 20 62 20  OM 't6' WHERE b 
8480: 3e 3d 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 41  >= ? AND b < ? A
8490: 4e 44 20 62 20 6c 69 6b 65 20 3f 7d 20 38 6a 20  ND b like ?} 8j 
84a0: 38 6b 20 38 6a 25 7d 0a 0a 20 20 32 2e 33 20 22  8k 8j%}..  2.3 "
84b0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 36  SELECT a FROM e6
84c0: 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 38   WHERE b LIKE '8
84d0: 4a 25 27 22 20 7b 33 20 34 7d 0a 20 20 20 20 7b  J%'" {3 4}.    {
84e0: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20  xFilter {SELECT 
84f0: 72 6f 77 69 64 2c 20 61 2c 20 62 20 46 52 4f 4d  rowid, a, b FROM
8500: 20 27 74 36 27 20 57 48 45 52 45 20 62 20 3e 3d   't6' WHERE b >=
8510: 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 41 4e 44   ? AND b < ? AND
8520: 20 62 20 6c 69 6b 65 20 3f 7d 20 38 4a 20 38 4b   b like ?} 8J 8K
8530: 20 38 4a 25 7d 0a 7d 20 7b 0a 20 20 73 65 74 20   8J%}.} {.  set 
8540: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 7b 7d 0a 20  echo_module {}. 
8550: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
8560: 20 31 38 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24   18.$tn.1 $sql $
8570: 72 65 73 0a 20 20 64 6f 5f 74 65 73 74 20 20 20  res.  do_test   
8580: 20 20 20 20 20 20 31 38 2e 24 74 6e 2e 32 20 7b        18.$tn.2 {
8590: 20 6c 72 61 6e 67 65 20 24 3a 3a 65 63 68 6f 5f   lrange $::echo_
85a0: 6d 6f 64 75 6c 65 20 32 20 65 6e 64 20 7d 20 24  module 2 end } $
85b0: 66 69 6c 74 65 72 0a 7d 0a 64 6f 5f 65 78 65 63  filter.}.do_exec
85c0: 73 71 6c 5f 74 65 73 74 20 31 38 2e 32 2e 78 20  sql_test 18.2.x 
85d0: 7b 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73  {  PRAGMA case_s
85e0: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20  ensitive_like = 
85f0: 4f 46 46 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  OFF }..#--------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8640: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 6e  -.# Test that an
8650: 20 65 78 69 73 74 69 6e 67 20 6d 6f 64 75 6c 65   existing module
8660: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 76 65 72   may not be over
8670: 72 69 64 64 65 6e 2e 0a 23 0a 64 6f 5f 74 65 73  ridden..#.do_tes
8680: 74 20 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74  t 19.1 {.  sqlit
8690: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  e3 db2 test.db. 
86a0: 20 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d   register_echo_m
86b0: 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63  odule [sqlite3_c
86c0: 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65  onnection_pointe
86d0: 72 20 64 62 32 5d 0a 7d 20 53 51 4c 49 54 45 5f  r db2].} SQLITE_
86e0: 4f 4b 0a 64 6f 5f 74 65 73 74 20 31 39 2e 32 20  OK.do_test 19.2 
86f0: 7b 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63 68  {.  register_ech
8700: 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65  o_module [sqlite
8710: 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69  3_connection_poi
8720: 6e 74 65 72 20 64 62 32 5d 0a 7d 20 53 51 4c 49  nter db2].} SQLI
8730: 54 45 5f 4d 49 53 55 53 45 0a 64 6f 5f 74 65 73  TE_MISUSE.do_tes
8740: 74 20 31 39 2e 33 20 7b 0a 20 20 64 62 32 20 63  t 19.3 {.  db2 c
8750: 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  lose.} {}..#----
8760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87a0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
87b0: 74 20 74 68 65 20 62 75 67 20 66 69 78 65 64 20  t the bug fixed 
87c0: 62 79 20 5b 62 30 63 31 62 61 36 35 35 64 36 39  by [b0c1ba655d69
87d0: 5d 20 72 65 61 6c 6c 79 20 69 73 20 66 69 78 65  ] really is fixe
87e0: 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  d..#.do_execsql_
87f0: 74 65 73 74 20 32 30 2e 31 20 7b 0a 20 20 43 52  test 20.1 {.  CR
8800: 45 41 54 45 20 54 41 42 4c 45 20 74 37 20 28 61  EATE TABLE t7 (a
8810: 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54  , b);.  CREATE T
8820: 41 42 4c 45 20 74 38 20 28 63 2c 20 64 29 3b 0a  ABLE t8 (c, d);.
8830: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
8840: 32 20 4f 4e 20 74 37 28 61 29 3b 0a 20 20 43 52  2 ON t7(a);.  CR
8850: 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
8860: 20 74 37 28 62 29 3b 0a 20 20 43 52 45 41 54 45   t7(b);.  CREATE
8870: 20 49 4e 44 45 58 20 69 34 20 4f 4e 20 74 38 28   INDEX i4 ON t8(
8880: 63 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44  c);.  CREATE IND
8890: 45 58 20 69 35 20 4f 4e 20 74 38 28 64 29 3b 0a  EX i5 ON t8(d);.
88a0: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
88b0: 4c 20 54 41 42 4c 45 20 74 37 76 20 55 53 49 4e  L TABLE t7v USIN
88c0: 47 20 65 63 68 6f 28 74 37 29 3b 0a 20 20 43 52  G echo(t7);.  CR
88d0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
88e0: 4c 45 20 74 38 76 20 55 53 49 4e 47 20 65 63 68  LE t8v USING ech
88f0: 6f 28 74 38 29 3b 0a 7d 0a 0a 64 6f 5f 74 65 73  o(t8);.}..do_tes
8900: 74 20 32 30 2e 32 20 7b 0a 20 20 66 6f 72 20 7b  t 20.2 {.  for {
8910: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31  set i 0} {$i < 1
8920: 30 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  000} {incr i} {.
8930: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53      db eval {INS
8940: 45 52 54 20 49 4e 54 4f 20 74 37 20 56 41 4c 55  ERT INTO t7 VALU
8950: 45 53 28 24 69 2c 20 24 69 29 7d 0a 20 20 20 20  ES($i, $i)}.    
8960: 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20  db eval {INSERT 
8970: 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28 24  INTO t8 VALUES($
8980: 69 2c 20 24 69 29 7d 0a 20 20 7d 0a 7d 20 7b 7d  i, $i)}.  }.} {}
8990: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
89a0: 74 20 32 30 2e 33 20 7b 0a 20 20 53 45 4c 45 43  t 20.3 {.  SELEC
89b0: 54 20 61 2c 20 62 20 46 52 4f 4d 20 28 0a 20 20  T a, b FROM (.  
89c0: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20      SELECT a, b 
89d0: 46 52 4f 4d 20 74 37 20 57 48 45 52 45 20 61 3d  FROM t7 WHERE a=
89e0: 31 31 20 4f 52 20 62 3d 31 32 0a 20 20 20 20 20  11 OR b=12.     
89f0: 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20   UNION ALL.     
8a00: 20 53 45 4c 45 43 54 20 63 2c 20 64 20 46 52 4f   SELECT c, d FRO
8a10: 4d 20 74 38 20 57 48 45 52 45 20 63 3d 35 20 4f  M t8 WHERE c=5 O
8a20: 52 20 64 3d 36 0a 20 20 29 0a 20 20 4f 52 44 45  R d=6.  ).  ORDE
8a30: 52 20 42 59 20 31 2c 20 32 3b 0a 7d 20 7b 35 20  R BY 1, 2;.} {5 
8a40: 35 20 36 20 36 20 31 31 20 31 31 20 31 32 20 31  5 6 6 11 11 12 1
8a50: 32 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  2}..do_execsql_t
8a60: 65 73 74 20 32 30 2e 34 20 7b 0a 20 20 53 45 4c  est 20.4 {.  SEL
8a70: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 28 0a  ECT a, b FROM (.
8a80: 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20        SELECT a, 
8a90: 62 20 46 52 4f 4d 20 74 37 76 20 57 48 45 52 45  b FROM t7v WHERE
8aa0: 20 61 3d 31 31 20 4f 52 20 62 3d 31 32 0a 20 20   a=11 OR b=12.  
8ab0: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
8ac0: 20 20 20 20 53 45 4c 45 43 54 20 63 2c 20 64 20      SELECT c, d 
8ad0: 46 52 4f 4d 20 74 38 76 20 57 48 45 52 45 20 63  FROM t8v WHERE c
8ae0: 3d 35 20 4f 52 20 64 3d 36 0a 20 20 29 0a 20 20  =5 OR d=6.  ).  
8af0: 4f 52 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 7d  ORDER BY 1, 2;.}
8b00: 20 7b 35 20 35 20 36 20 36 20 31 31 20 31 31 20   {5 5 6 6 11 11 
8b10: 31 32 20 31 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  12 12}..#-------
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b60: 2d 2d 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  --.#.do_execsql_
8b70: 74 65 73 74 20 32 31 2e 31 20 7b 0a 20 20 43 52  test 21.1 {.  CR
8b80: 45 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 2c  EATE TABLE t9(a,
8b90: 62 2c 63 29 3b 0a 20 20 43 52 45 41 54 45 20 56  b,c);.  CREATE V
8ba0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 39 76  IRTUAL TABLE t9v
8bb0: 20 55 53 49 4e 47 20 65 63 68 6f 28 74 39 29 3b   USING echo(t9);
8bc0: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
8bd0: 74 39 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29  t9 VALUES(1,2,3)
8be0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
8bf0: 74 39 20 56 41 4c 55 45 53 28 33 2c 32 2c 31 29  t9 VALUES(3,2,1)
8c00: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
8c10: 74 39 20 56 41 4c 55 45 53 28 32 2c 32 2c 32 29  t9 VALUES(2,2,2)
8c20: 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ;.}..do_execsql_
8c30: 74 65 73 74 20 32 31 2e 32 20 7b 0a 20 20 53 45  test 21.2 {.  SE
8c40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 39 76 20  LECT * FROM t9v 
8c50: 57 48 45 52 45 20 61 3c 62 3b 0a 7d 20 7b 31 20  WHERE a<b;.} {1 
8c60: 32 20 33 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  2 3}..do_execsql
8c70: 5f 74 65 73 74 20 32 31 2e 33 20 7b 0a 20 20 53  _test 21.3 {.  S
8c80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 39 76  ELECT * FROM t9v
8c90: 20 57 48 45 52 45 20 61 3d 62 3b 0a 7d 20 7b 32   WHERE a=b;.} {2
8ca0: 20 32 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   2 2}..#--------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cf0: 2d 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  -.# At one point
8d00: 20 65 78 65 63 75 74 69 6e 67 20 61 20 43 52 45   executing a CRE
8d10: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
8d20: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
8d30: 20 73 70 65 63 69 66 69 65 64 20 0a 23 20 61 20   specified .# a 
8d40: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 62 75  database name bu
8d50: 74 20 6e 6f 20 76 69 72 74 75 61 6c 20 74 61 62  t no virtual tab
8d60: 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 77 61 73  le arguments was
8d70: 20 63 61 75 73 69 6e 67 20 61 6e 20 69 6e 74 65   causing an inte
8d80: 72 6e 61 6c 0a 23 20 62 75 66 66 65 72 20 6f 76  rnal.# buffer ov
8d90: 65 72 72 65 61 64 2e 20 56 61 6c 67 72 69 6e 64  erread. Valgrind
8da0: 20 77 6f 75 6c 64 20 72 65 70 6f 72 74 20 65 72   would report er
8db0: 72 6f 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  rors while runni
8dc0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
8dd0: 20 0a 23 20 74 65 73 74 73 2e 20 53 70 65 63 69   .# tests. Speci
8de0: 66 69 63 61 6c 6c 79 3a 0a 23 0a 23 20 20 20 43  fically:.#.#   C
8df0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
8e00: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73  BLE t1 USING fts
8e10: 34 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4f  4;          -- O
8e20: 6b 20 2d 20 6e 6f 20 64 62 20 6e 61 6d 65 2e 0a  k - no db name..
8e30: 23 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55  #   CREATE VIRTU
8e40: 41 4c 20 54 41 42 4c 45 20 6d 61 69 6e 2e 74 31  AL TABLE main.t1
8e50: 20 55 53 49 4e 47 20 66 74 73 34 28 78 29 3b 20   USING fts4(x); 
8e60: 20 2d 2d 20 4f 6b 20 2d 20 68 61 73 20 76 74 61   -- Ok - has vta
8e70: 62 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23 20 20  b arguments..#  
8e80: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
8e90: 54 41 42 4c 45 20 6d 61 69 6e 2e 74 31 20 55 53  TABLE main.t1 US
8ea0: 49 4e 47 20 66 74 73 34 3b 20 20 20 20 20 2d 2d  ING fts4;     --
8eb0: 20 48 61 64 20 74 68 65 20 70 72 6f 62 6c 65 6d   Had the problem
8ec0: 2e 20 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 66  . .#.ifcapable f
8ed0: 74 73 33 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c  ts3 {.  forcedel
8ee0: 65 74 65 20 74 65 73 74 2e 64 62 32 0a 20 20 73  ete test.db2.  s
8ef0: 65 74 20 6e 6d 20 5b 73 74 72 69 6e 67 20 72 65  et nm [string re
8f00: 70 65 61 74 20 61 62 63 64 65 66 67 68 69 6a 20  peat abcdefghij 
8f10: 31 30 30 5d 0a 20 20 64 6f 5f 65 78 65 63 73 71  100].  do_execsq
8f20: 6c 5f 74 65 73 74 20 32 32 2e 31 20 7b 0a 20 20  l_test 22.1 {.  
8f30: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
8f40: 62 32 27 20 41 53 20 24 6e 6d 0a 20 20 7d 0a 20  b2' AS $nm.  }. 
8f50: 20 0a 20 20 65 78 65 63 73 71 6c 20 22 53 45 4c   .  execsql "SEL
8f60: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
8f70: 65 5f 6d 61 73 74 65 72 22 0a 20 20 64 6f 5f 65  e_master".  do_e
8f80: 78 65 63 73 71 6c 5f 74 65 73 74 20 32 32 2e 32  xecsql_test 22.2
8f90: 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
8fa0: 20 54 41 42 4c 45 20 24 7b 6e 6d 7d 2e 74 31 20   TABLE ${nm}.t1 
8fb0: 55 53 49 4e 47 20 66 74 73 34 22 0a 20 20 0a 20  USING fts4".  . 
8fc0: 20 64 6f 5f 74 65 73 74 20 32 32 2e 33 2e 31 20   do_test 22.3.1 
8fd0: 7b 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22 43  {.    set sql "C
8fe0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
8ff0: 42 4c 45 20 24 7b 6e 6d 7d 2e 74 32 20 55 53 49  BLE ${nm}.t2 USI
9000: 4e 47 20 66 74 73 34 22 0a 20 20 20 20 73 65 74  NG fts4".    set
9010: 20 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70   stmt [sqlite3_p
9020: 72 65 70 61 72 65 5f 76 32 20 64 62 20 24 73 71  repare_v2 db $sq
9030: 6c 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 20 20  l -1 dummy].    
9040: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 73 74  sqlite3_step $st
9050: 6d 74 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 44  mt.  } {SQLITE_D
9060: 4f 4e 45 7d 0a 20 20 0a 20 20 64 6f 5f 74 65 73  ONE}.  .  do_tes
9070: 74 20 32 32 2e 33 2e 32 20 7b 0a 20 20 20 20 73  t 22.3.2 {.    s
9080: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
9090: 24 73 74 6d 74 0a 20 20 7d 20 7b 53 51 4c 49 54  $stmt.  } {SQLIT
90a0: 45 5f 4f 4b 7d 0a 20 20 0a 20 20 64 6f 5f 74 65  E_OK}.  .  do_te
90b0: 73 74 20 32 32 2e 34 2e 31 20 7b 0a 20 20 20 20  st 22.4.1 {.    
90c0: 73 65 74 20 73 71 6c 20 22 43 52 45 41 54 45 20  set sql "CREATE 
90d0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 24 7b  VIRTUAL TABLE ${
90e0: 6e 6d 7d 2e 74 33 20 55 53 49 4e 47 20 66 74 73  nm}.t3 USING fts
90f0: 34 22 0a 20 20 20 20 73 65 74 20 6e 20 5b 73 74  4".    set n [st
9100: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 71 6c  ring length $sql
9110: 5d 0a 20 20 20 20 73 65 74 20 73 74 6d 74 20 5b  ].    set stmt [
9120: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
9130: 64 62 20 22 24 7b 73 71 6c 7d 78 79 7a 22 20 24  db "${sql}xyz" $
9140: 6e 20 64 75 6d 6d 79 5d 0a 20 20 20 20 73 71 6c  n dummy].    sql
9150: 69 74 65 33 5f 73 74 65 70 20 24 73 74 6d 74 0a  ite3_step $stmt.
9160: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45    } {SQLITE_DONE
9170: 7d 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 32  }.  .  do_test 2
9180: 32 2e 34 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  2.4.2 {.    sqli
9190: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74  te3_finalize $st
91a0: 6d 74 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f  mt.  } {SQLITE_O
91b0: 4b 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  K}.}...#--------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9200: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
9210: 67 20 74 65 73 74 73 20 76 65 72 69 66 79 20 74  g tests verify t
9220: 68 61 74 20 61 20 44 52 4f 50 20 54 41 42 4c 45  hat a DROP TABLE
9230: 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 61 20 76 69   command on a vi
9240: 72 74 75 61 6c 0a 23 20 74 61 62 6c 65 20 64 6f  rtual.# table do
9250: 65 73 20 6e 6f 74 20 63 61 75 73 65 20 6f 74 68  es not cause oth
9260: 65 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  er operations to
9270: 20 63 72 61 73 68 2e 0a 23 0a 23 20 20 20 32 33   crash..#.#   23
9280: 2e 31 3a 20 44 72 6f 70 70 69 6e 67 20 61 20 76  .1: Dropping a v
9290: 74 61 62 20 77 68 69 6c 65 20 61 20 53 45 4c 45  tab while a SELE
92a0: 43 54 20 69 73 20 72 75 6e 6e 69 6e 67 20 6f 6e  CT is running on
92b0: 20 69 74 2e 0a 23 0a 23 20 20 20 32 33 2e 32 3a   it..#.#   23.2:
92c0: 20 44 72 6f 70 70 69 6e 67 20 61 20 76 74 61 62   Dropping a vtab
92d0: 20 77 68 69 6c 65 20 61 20 53 45 4c 45 43 54 20   while a SELECT 
92e0: 74 68 61 74 20 77 69 6c 6c 2c 20 62 75 74 20 68  that will, but h
92f0: 61 73 20 6e 6f 74 20 79 65 74 2c 0a 23 20 20 20  as not yet,.#   
9300: 20 20 20 20 20 20 6f 70 65 6e 20 61 20 63 75 72        open a cur
9310: 73 6f 72 20 6f 6e 20 74 68 65 20 76 74 61 62 2c  sor on the vtab,
9320: 20 69 73 20 72 75 6e 6e 69 6e 67 2e 20 49 6e 20   is running. In 
9330: 74 68 69 73 20 63 61 73 65 20 74 68 65 0a 23 20  this case the.# 
9340: 20 20 20 20 20 20 20 20 44 52 4f 50 20 54 41 42          DROP TAB
9350: 4c 45 20 73 75 63 63 65 65 64 73 20 61 6e 64 20  LE succeeds and 
9360: 74 68 65 20 53 45 4c 45 43 54 20 68 69 74 73 20  the SELECT hits 
9370: 61 6e 20 65 72 72 6f 72 2e 0a 23 20 20 20 0a 23  an error..#   .#
9380: 20 20 20 32 33 2e 33 3a 20 44 72 6f 70 70 69 6e     23.3: Droppin
9390: 67 20 61 20 76 74 61 62 20 66 72 6f 6d 20 77 69  g a vtab from wi
93a0: 74 68 69 6e 20 61 20 75 73 65 72 2d 64 65 66 69  thin a user-defi
93b0: 6e 65 64 2d 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ned-function cal
93c0: 6c 62 61 63 6b 0a 23 20 20 20 20 20 20 20 20 20  lback.#         
93d0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
93e0: 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e 54 4f   an "INSERT INTO
93f0: 20 76 74 61 62 20 53 45 4c 45 43 54 20 2e 2e 2e   vtab SELECT ...
9400: 22 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 72  " statement..#.r
9410: 65 73 65 74 5f 64 62 0a 6c 6f 61 64 5f 73 74 61  eset_db.load_sta
9420: 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 64 62  tic_extension db
9430: 20 77 68 6f 6c 65 6e 75 6d 62 65 72 0a 6c 6f 61   wholenumber.loa
9440: 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69  d_static_extensi
9450: 6f 6e 20 64 62 20 65 76 61 6c 0a 72 65 67 69 73  on db eval.regis
9460: 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  ter_echo_module 
9470: 64 62 0a 0a 64 6f 5f 74 65 73 74 20 32 33 2e 31  db..do_test 23.1
9480: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
9490: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
94a0: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 77 68 6f  BLE t1 USING who
94b0: 6c 65 6e 75 6d 62 65 72 20 7d 0a 20 20 73 65 74  lenumber }.  set
94c0: 20 72 65 73 20 22 22 0a 20 20 64 62 20 65 76 61   res "".  db eva
94d0: 6c 20 7b 20 53 45 4c 45 43 54 20 76 61 6c 75 65  l { SELECT value
94e0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 76   FROM t1 WHERE v
94f0: 61 6c 75 65 3c 31 30 20 7d 20 7b 0a 20 20 20 20  alue<10 } {.    
9500: 69 66 20 7b 24 76 61 6c 75 65 20 3d 3d 20 35 7d  if {$value == 5}
9510: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72 65 73   {.      set res
9520: 20 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f   [catchsql { DRO
9530: 50 20 54 41 42 4c 45 20 74 31 20 7d 5d 0a 20 20  P TABLE t1 }].  
9540: 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 72 65    }.  }.  set re
9550: 73 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  s.} {1 {database
9560: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
9570: 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 32 33 2e 32  }}..do_test 23.2
9580: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
9590: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
95a0: 20 74 32 28 76 61 6c 75 65 29 3b 0a 20 20 20 20   t2(value);.    
95b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
95c0: 41 4c 55 45 53 28 31 29 2c 20 28 32 29 2c 20 28  ALUES(1), (2), (
95d0: 33 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72  3);.  }..  set r
95e0: 65 73 32 20 5b 6c 69 73 74 20 5b 63 61 74 63 68  es2 [list [catch
95f0: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   {.    db eval {
9600: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 76 61  .      SELECT va
9610: 6c 75 65 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  lue FROM t2 UNIO
9620: 4e 20 41 4c 4c 20 0a 20 20 20 20 20 20 53 45 4c  N ALL .      SEL
9630: 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74  ECT value FROM t
9640: 31 20 57 48 45 52 45 20 76 61 6c 75 65 3c 31 30  1 WHERE value<10
9650: 0a 20 20 20 20 7d 20 7b 0a 20 20 20 20 20 20 69  .    } {.      i
9660: 66 20 7b 24 76 61 6c 75 65 20 3d 3d 20 32 7d 20  f {$value == 2} 
9670: 7b 20 73 65 74 20 72 65 73 31 20 5b 63 61 74 63  { set res1 [catc
9680: 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c  hsql { DROP TABL
9690: 45 20 74 31 20 7d 5d 20 7d 0a 20 20 20 20 7d 0a  E t1 }] }.    }.
96a0: 20 20 7d 20 6d 73 67 5d 20 24 6d 73 67 5d 0a 20    } msg] $msg]. 
96b0: 20 6c 69 73 74 20 24 72 65 73 31 20 24 72 65 73   list $res1 $res
96c0: 32 0a 7d 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b  2.} {{0 {}} {1 {
96d0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
96e0: 73 20 6c 6f 63 6b 65 64 7d 7d 7d 0a 0a 64 6f 5f  s locked}}}..do_
96f0: 74 65 73 74 20 32 33 2e 33 2e 31 20 7b 0a 20 20  test 23.3.1 {.  
9700: 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45  execsql { CREATE
9710: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
9720: 31 65 20 55 53 49 4e 47 20 65 63 68 6f 28 74 32  1e USING echo(t2
9730: 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ) }.  execsql { 
9740: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 65 20  INSERT INTO t1e 
9750: 53 45 4c 45 43 54 20 34 20 7d 0a 20 20 63 61 74  SELECT 4 }.  cat
9760: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
9770: 4e 54 4f 20 74 31 65 20 53 45 4c 45 43 54 20 65  NTO t1e SELECT e
9780: 76 61 6c 28 27 44 52 4f 50 20 54 41 42 4c 45 20  val('DROP TABLE 
9790: 74 31 65 27 29 20 7d 0a 7d 20 7b 31 20 7b 64 61  t1e') }.} {1 {da
97a0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
97b0: 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 65 78 65 63  locked}}.do_exec
97c0: 73 71 6c 5f 74 65 73 74 20 32 33 2e 33 2e 32 20  sql_test 23.3.2 
97d0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
97e0: 74 31 65 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a  t1e } {1 2 3 4}.
97f0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
9800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 74  -----------.# At
9840: 20 6f 6e 65 20 70 6f 69 6e 74 20 53 51 4c 20 6c   one point SQL l
9850: 69 6b 65 20 74 68 69 73 3a 0a 23 0a 23 20 20 20  ike this:.#.#   
9860: 53 41 56 45 50 4f 49 4e 54 20 78 79 7a 3b 20 20  SAVEPOINT xyz;  
9870: 20 20 20 20 20 2d 2d 20 4f 70 65 6e 73 20 53 51       -- Opens SQ
9880: 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20  L transaction.# 
9890: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
98a0: 76 74 61 62 20 20 20 2d 2d 20 57 72 69 74 65 20  vtab   -- Write 
98b0: 74 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  to virtual table
98c0: 0a 23 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  .#     ROLLBACK 
98d0: 54 4f 20 78 79 7a 3b 0a 23 20 20 20 52 45 4c 45  TO xyz;.#   RELE
98e0: 41 53 45 20 78 79 7a 3b 0a 23 0a 23 20 77 61 73  ASE xyz;.#.# was
98f0: 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
9900: 65 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 29 20  e xRollbackTo() 
9910: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
9920: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 0a 23 20   ROLLBACK TO .# 
9930: 6f 70 65 72 61 74 69 6f 6e 2e 20 57 68 69 63 68  operation. Which
9940: 20 6d 65 61 6e 74 20 74 68 61 74 20 76 69 72 74   meant that virt
9950: 75 61 6c 20 74 61 62 6c 65 73 20 6c 69 6b 65 20  ual tables like 
9960: 46 54 53 33 20 77 6f 75 6c 64 20 69 6e 63 6f 72  FTS3 would incor
9970: 72 65 63 74 6c 79 20 0a 23 20 63 6f 6d 6d 69 74  rectly .# commit
9980: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
9990: 74 68 65 20 49 4e 53 45 52 54 20 61 73 20 70 61  the INSERT as pa
99a0: 72 74 20 6f 66 20 74 68 65 20 22 52 45 4c 45 41  rt of the "RELEA
99b0: 53 45 20 78 79 7a 22 20 63 6f 6d 6d 61 6e 64 2e  SE xyz" command.
99c0: 0a 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  .#.# The followi
99d0: 6e 67 20 74 65 73 74 73 20 63 68 65 63 6b 20 74  ng tests check t
99e0: 68 61 74 20 74 68 69 73 20 68 61 73 20 62 65 65  hat this has bee
99f0: 6e 20 66 69 78 65 64 2e 0a 23 0a 69 66 63 61 70  n fixed..#.ifcap
9a00: 61 62 6c 65 20 66 74 73 33 20 7b 0a 20 20 64 6f  able fts3 {.  do
9a10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 34  _execsql_test 24
9a20: 2e 30 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  .0 {.    CREATE 
9a30: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 34  VIRTUAL TABLE t4
9a40: 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b 0a 20   USING fts3();. 
9a50: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 61 3b 0a     SAVEPOINT a;.
9a60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9a70: 74 34 20 56 41 4c 55 45 53 28 27 61 20 62 20 63  t4 VALUES('a b c
9a80: 27 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ');.    ROLLBACK
9a90: 20 54 4f 20 61 3b 0a 20 20 20 20 52 45 4c 45 41   TO a;.    RELEA
9aa0: 53 45 20 61 3b 0a 20 20 20 20 53 45 4c 45 43 54  SE a;.    SELECT
9ab0: 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20   * FROM t4;.  } 
9ac0: 7b 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  {}..  do_execsql
9ad0: 5f 74 65 73 74 20 32 34 2e 31 20 7b 20 53 45 4c  _test 24.1 { SEL
9ae0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57 48  ECT * FROM t4 WH
9af0: 45 52 45 20 74 34 20 4d 41 54 43 48 20 27 62 27  ERE t4 MATCH 'b'
9b00: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73   } {}.  do_execs
9b10: 71 6c 5f 74 65 73 74 20 32 34 2e 32 20 7b 20 49  ql_test 24.2 { I
9b20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 28 74 34  NSERT INTO t4(t4
9b30: 29 20 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72  ) VALUES('integr
9b40: 69 74 79 2d 63 68 65 63 6b 27 29 20 7d 20 7b 7d  ity-check') } {}
9b50: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
9b60: 65 73 74 20 32 34 2e 33 20 7b 0a 20 20 20 20 53  est 24.3 {.    S
9b70: 41 56 45 50 4f 49 4e 54 20 61 3b 0a 20 20 20 20  AVEPOINT a;.    
9b80: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
9b90: 41 42 4c 45 20 74 35 20 55 53 49 4e 47 20 66 74  ABLE t5 USING ft
9ba0: 73 33 28 29 3b 0a 20 20 20 20 53 41 56 45 50 4f  s3();.    SAVEPO
9bb0: 49 4e 54 20 62 3b 0a 20 20 20 20 52 4f 4c 4c 42  INT b;.    ROLLB
9bc0: 41 43 4b 20 54 4f 20 61 3b 0a 20 20 20 20 53 41  ACK TO a;.    SA
9bd0: 56 45 50 4f 49 4e 54 20 63 3b 0a 20 20 20 20 52  VEPOINT c;.    R
9be0: 45 4c 45 41 53 45 20 61 3b 0a 20 20 7d 0a 7d 0a  ELEASE a;.  }.}.
9bf0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.