/ Hex Artifact Content
Login

Artifact efb4c4a45146193d6d55fb85f7162febd6423f29c72ede09bb96383f49e3abc1:


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 23 20 50 52 41 47 4d   }.} {}..# PRAGM
53d0: 41 20 69 6e 64 65 78 5f 69 6e 66 6f 20 61 6e 64  A index_info and
53e0: 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 61 72 65   index_xinfo are
53f0: 20 6e 6f 2d 6f 70 73 20 6f 6e 20 61 20 76 69 72   no-ops on a vir
5400: 74 75 61 6c 20 74 61 62 6c 65 0a 64 6f 5f 74 65  tual table.do_te
5410: 73 74 20 76 74 61 62 31 2e 37 2d 31 34 20 7b 0a  st vtab1.7-14 {.
5420: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5430: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 69 6e 66  PRAGMA index_inf
5440: 6f 28 27 65 63 68 6f 5f 61 62 63 27 29 3b 0a 20  o('echo_abc');. 
5450: 20 20 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f     PRAGMA index_
5460: 78 69 6e 66 6f 28 27 65 63 68 6f 5f 61 62 63 27  xinfo('echo_abc'
5470: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63  );.  }.} {}..ifc
5480: 61 70 61 62 6c 65 20 61 74 74 61 63 68 20 7b 0a  apable attach {.
5490: 20 20 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e    do_test vtab1.
54a0: 38 2d 31 20 7b 0a 20 20 20 20 73 65 74 20 65 63  8-1 {.    set ec
54b0: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 20  ho_module "".   
54c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
54d0: 20 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64   ATTACH 'test2.d
54e0: 62 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20  b' AS aux;.     
54f0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
5500: 54 41 42 4c 45 20 61 75 78 2e 65 32 20 55 53 49  TABLE aux.e2 USI
5510: 4e 47 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63  NG echo(real_abc
5520: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  );.    }.    set
5530: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 20 20 7d   echo_module.  }
5540: 20 5b 6c 69 73 74 20 78 43 72 65 61 74 65 20 65   [list xCreate e
5550: 63 68 6f 20 61 75 78 20 65 32 20 72 65 61 6c 5f  cho aux e2 real_
5560: 61 62 63 20 20 20 5c 0a 20 20 20 20 20 20 20 20  abc   \.        
5570: 20 20 78 53 79 6e 63 20 20 20 65 63 68 6f 28 72    xSync   echo(r
5580: 65 61 6c 5f 61 62 63 29 20 20 20 20 20 20 20 20  eal_abc)        
5590: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 78 43 6f   \.          xCo
55a0: 6d 6d 69 74 20 65 63 68 6f 28 72 65 61 6c 5f 61  mmit echo(real_a
55b0: 62 63 29 20 20 20 20 20 20 20 20 20 5c 0a 20 20  bc)         \.  
55c0: 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  ].}.do_test vtab
55d0: 31 2e 38 2d 32 20 7b 0a 20 20 63 61 74 63 68 73  1.8-2 {.  catchs
55e0: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
55f0: 42 4c 45 20 61 75 78 2e 65 32 3b 0a 20 20 7d 0a  BLE aux.e2;.  }.
5600: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5610: 44 52 4f 50 20 54 41 42 4c 45 20 74 72 65 61 6c  DROP TABLE treal
5620: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
5630: 20 74 65 63 68 6f 3b 0a 20 20 20 20 44 52 4f 50   techo;.    DROP
5640: 20 54 41 42 4c 45 20 65 63 68 6f 5f 61 62 63 3b   TABLE echo_abc;
5650: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
5660: 72 65 61 6c 5f 61 62 63 3b 0a 20 20 7d 0a 7d 20  real_abc;.  }.} 
5670: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  {}..do_test vtab
5680: 31 2e 39 2d 31 20 7b 0a 20 20 73 65 74 20 65 63  1.9-1 {.  set ec
5690: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65  ho_module "".  e
56a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
56b0: 41 54 45 20 54 41 42 4c 45 20 72 28 61 2c 20 62  ATE TABLE r(a, b
56c0: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , c);.    CREATE
56d0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65   VIRTUAL TABLE e
56e0: 20 55 53 49 4e 47 20 65 63 68 6f 28 72 2c 20 65   USING echo(r, e
56f0: 5f 6c 6f 67 29 3b 0a 20 20 20 20 53 45 4c 45 43  _log);.    SELEC
5700: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
5710: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d  te_master;.  }.}
5720: 20 7b 72 20 65 20 65 5f 6c 6f 67 7d 0a 64 6f 5f   {r e e_log}.do_
5730: 74 65 73 74 20 76 74 61 62 31 2e 39 2d 32 20 7b  test vtab1.9-2 {
5740: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5750: 20 44 52 4f 50 20 54 41 42 4c 45 20 65 3b 0a 20   DROP TABLE e;. 
5760: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46     SELECT name F
5770: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
5780: 72 3b 0a 20 20 7d 0a 7d 20 7b 72 7d 0a 0a 64 6f  r;.  }.} {r}..do
5790: 5f 74 65 73 74 20 76 74 61 62 31 2e 39 2d 33 20  _test vtab1.9-3 
57a0: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
57b0: 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c  ule "".  execsql
57c0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49   {.    CREATE VI
57d0: 52 54 55 41 4c 20 54 41 42 4c 45 20 65 20 55 53  RTUAL TABLE e US
57e0: 49 4e 47 20 65 63 68 6f 28 72 2c 20 65 5f 6c 6f  ING echo(r, e_lo
57f0: 67 2c 20 76 69 72 74 75 61 6c 20 31 20 32 20 33  g, virtual 1 2 3
5800: 20 76 61 72 63 68 61 72 28 33 32 29 29 3b 0a 20   varchar(32));. 
5810: 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   }.  set echo_mo
5820: 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 20 20 20  dule.} [list    
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 5c 0a 20 20 78 43 72 65 61 74 65 20      \.  xCreate 
5870: 65 63 68 6f 20 6d 61 69 6e 20 65 20 72 20 65 5f  echo main e r e_
5880: 6c 6f 67 20 7b 76 69 72 74 75 61 6c 20 31 20 32  log {virtual 1 2
5890: 20 33 20 76 61 72 63 68 61 72 28 33 32 29 7d 20   3 varchar(32)} 
58a0: 20 20 20 20 20 5c 0a 20 20 78 53 79 6e 63 20 65       \.  xSync e
58b0: 63 68 6f 28 72 29 20 20 20 20 20 20 20 20 20 20  cho(r)          
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 20 20 5c 0a 20 20 78 43 6f 6d 6d 69        \.  xCommi
58f0: 74 20 65 63 68 6f 28 72 29 20 20 20 20 20 20 20  t echo(r)       
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 20 20 20 20 20 5c 0a 5d 0a 0a 64 6f 5f 74         \.]..do_t
5930: 65 73 74 20 76 74 61 62 31 2e 31 30 2d 31 20 7b  est vtab1.10-1 {
5940: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5950: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 65   CREATE TABLE de
5960: 6c 28 64 29 3b 0a 20 20 20 20 43 52 45 41 54 45  l(d);.    CREATE
5970: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65   VIRTUAL TABLE e
5980: 32 20 55 53 49 4e 47 20 65 63 68 6f 28 64 65 6c  2 USING echo(del
5990: 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73  );.  }.  db clos
59a0: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
59b0: 65 73 74 2e 64 62 0a 20 20 72 65 67 69 73 74 65  est.db.  registe
59c0: 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73  r_echo_module [s
59d0: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f  qlite3_connectio
59e0: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 20 20  n_pointer db].  
59f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
5a00: 4f 50 20 54 41 42 4c 45 20 64 65 6c 3b 0a 20 20  OP TABLE del;.  
5a10: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  }.  catchsql {. 
5a20: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
5a30: 20 65 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 76   e2;.  }.} {1 {v
5a40: 74 61 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f  table constructo
5a50: 72 20 66 61 69 6c 65 64 3a 20 65 32 7d 7d 0a 64  r failed: e2}}.d
5a60: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d  o_test vtab1.10-
5a70: 32 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61  2 {.  set rc [ca
5a80: 74 63 68 20 7b 0a 20 20 20 20 73 65 74 20 70 74  tch {.    set pt
5a90: 72 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  r [sqlite3_conne
5aa0: 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62  ction_pointer db
5ab0: 5d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 65  ].    sqlite3_de
5ac0: 63 6c 61 72 65 5f 76 74 61 62 20 24 70 74 72 20  clare_vtab $ptr 
5ad0: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62  {CREATE TABLE ab
5ae0: 63 28 61 2c 20 62 2c 20 63 29 7d 0a 20 20 7d 20  c(a, b, c)}.  } 
5af0: 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20  msg].  list $rc 
5b00: 24 6d 73 67 0a 7d 20 7b 31 20 7b 62 61 64 20 70  $msg.} {1 {bad p
5b10: 61 72 61 6d 65 74 65 72 20 6f 72 20 6f 74 68 65  arameter or othe
5b20: 72 20 41 50 49 20 6d 69 73 75 73 65 7d 7d 0a 64  r API misuse}}.d
5b30: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d  o_test vtab1.10-
5b40: 33 20 7b 0a 20 20 73 65 74 20 3a 3a 65 63 68 6f  3 {.  set ::echo
5b50: 5f 6d 6f 64 75 6c 65 5f 62 65 67 69 6e 5f 66 61  _module_begin_fa
5b60: 69 6c 20 72 0a 20 20 63 61 74 63 68 73 71 6c 20  il r.  catchsql 
5b70: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
5b80: 4f 20 65 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  O e VALUES(1, 2,
5b90: 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 53   3);.  }.} {1 {S
5ba0: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 7d 7d  QL logic error}}
5bb0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
5bc0: 30 2d 34 20 7b 0a 20 20 63 61 74 63 68 20 7b 65  0-4 {.  catch {e
5bd0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 45 58 50  xecsql {.    EXP
5be0: 4c 41 49 4e 20 53 45 4c 45 43 54 20 2a 20 46 52  LAIN SELECT * FR
5bf0: 4f 4d 20 65 20 57 48 45 52 45 20 72 6f 77 69 64  OM e WHERE rowid
5c00: 20 3d 20 32 3b 0a 20 20 20 20 45 58 50 4c 41 49   = 2;.    EXPLAI
5c10: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c  N QUERY PLAN SEL
5c20: 45 43 54 20 2a 20 46 52 4f 4d 20 65 20 57 48 45  ECT * FROM e WHE
5c30: 52 45 20 72 6f 77 69 64 20 3d 20 32 20 4f 52 44  RE rowid = 2 ORD
5c40: 45 52 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 7d  ER BY rowid;.  }
5c50: 7d 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74  }.} {0}..do_test
5c60: 20 76 74 61 62 31 2e 31 30 2d 35 20 7b 0a 20 20   vtab1.10-5 {.  
5c70: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  set echo_module 
5c80: 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  "".  execsql {. 
5c90: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
5ca0: 20 65 20 57 48 45 52 45 20 72 6f 77 69 64 7c 7c   e WHERE rowid||
5cb0: 27 27 20 4d 41 54 43 48 20 27 70 61 74 74 65 72  '' MATCH 'patter
5cc0: 6e 27 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63  n';.  }.  set ec
5cd0: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
5ce0: 74 20 5c 0a 20 20 78 42 65 73 74 49 6e 64 65 78  t \.  xBestIndex
5cf0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
5d00: 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 27 72 27  a, b, c FROM 'r'
5d10: 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53  } \.  xFilter {S
5d20: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20  ELECT rowid, a, 
5d30: 62 2c 20 63 20 46 52 4f 4d 20 27 72 27 7d 20 20  b, c FROM 'r'}  
5d40: 20 20 5c 0a 5d 0a 70 72 6f 63 20 6d 61 74 63 68    \.].proc match
5d50: 5f 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 72 65  _func {args} {re
5d60: 74 75 72 6e 20 22 22 7d 0a 64 6f 5f 74 65 73 74  turn ""}.do_test
5d70: 20 76 74 61 62 31 2e 31 30 2d 36 20 7b 0a 20 20   vtab1.10-6 {.  
5d80: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20  set echo_module 
5d90: 22 22 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e  "".  db function
5da0: 20 6d 61 74 63 68 20 6d 61 74 63 68 5f 66 75 6e   match match_fun
5db0: 63 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  c.  execsql {.  
5dc0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5dd0: 65 20 57 48 45 52 45 20 6d 61 74 63 68 28 27 70  e WHERE match('p
5de0: 61 74 74 65 72 6e 27 2c 20 72 6f 77 69 64 2c 20  attern', rowid, 
5df0: 27 70 61 74 74 65 72 6e 32 27 29 3b 0a 20 20 7d  'pattern2');.  }
5e00: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
5e10: 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 78  le.} [list \.  x
5e20: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43  BestIndex {SELEC
5e30: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63  T rowid, a, b, c
5e40: 20 46 52 4f 4d 20 27 72 27 7d 20 5c 0a 20 20 78   FROM 'r'} \.  x
5e50: 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72  Filter {SELECT r
5e60: 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 46 52  owid, a, b, c FR
5e70: 4f 4d 20 27 72 27 7d 20 20 20 20 5c 0a 5d 0a 0a  OM 'r'}    \.]..
5e80: 0a 23 20 54 65 73 74 69 6e 67 20 74 68 65 20 78  .# Testing the x
5e90: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 69 6e 74  FindFunction int
5ea0: 65 72 66 61 63 65 0a 23 0a 63 61 74 63 68 20 7b  erface.#.catch {
5eb0: 72 65 6e 61 6d 65 20 3a 3a 65 63 68 6f 5f 67 6c  rename ::echo_gl
5ec0: 6f 62 5f 6f 76 65 72 6c 6f 61 64 20 7b 7d 7d 0a  ob_overload {}}.
5ed0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 31  do_test vtab1.11
5ee0: 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  -1 {.  execsql {
5ef0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5f00: 20 72 28 61 2c 62 2c 63 29 20 56 41 4c 55 45 53   r(a,b,c) VALUES
5f10: 28 31 2c 27 3f 27 2c 39 39 29 3b 0a 20 20 20 20  (1,'?',99);.    
5f20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 28 61 2c  INSERT INTO r(a,
5f30: 62 2c 63 29 20 56 41 4c 55 45 53 28 32 2c 33 2c  b,c) VALUES(2,3,
5f40: 39 39 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  99);.    SELECT 
5f50: 61 20 47 4c 4f 42 20 62 20 46 52 4f 4d 20 65 0a  a GLOB b FROM e.
5f60: 20 20 7d 0a 7d 20 7b 31 20 30 7d 0a 70 72 6f 63    }.} {1 0}.proc
5f70: 20 3a 3a 65 63 68 6f 5f 67 6c 6f 62 5f 6f 76 65   ::echo_glob_ove
5f80: 72 6c 6f 61 64 20 7b 61 20 62 7d 20 7b 0a 20 72  rload {a b} {. r
5f90: 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 62 20 24  eturn [list $b $
5fa0: 61 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  a].}.do_test vta
5fb0: 62 31 2e 31 31 2d 32 20 7b 0a 20 20 65 78 65 63  b1.11-2 {.  exec
5fc0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
5fd0: 20 61 20 6c 69 6b 65 20 27 62 27 20 46 52 4f 4d   a like 'b' FROM
5fe0: 20 65 0a 20 20 7d 0a 7d 20 7b 30 20 30 7d 0a 64   e.  }.} {0 0}.d
5ff0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 31 2d  o_test vtab1.11-
6000: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
6010: 20 20 20 20 53 45 4c 45 43 54 20 61 20 67 6c 6f      SELECT a glo
6020: 62 20 27 32 27 20 46 52 4f 4d 20 65 0a 20 20 7d  b '2' FROM e.  }
6030: 0a 7d 20 7b 7b 31 20 32 7d 20 7b 32 20 32 7d 7d  .} {{1 2} {2 2}}
6040: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
6050: 31 2d 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1-4 {.  execsql 
6060: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 20 67 6c  {.    SELECT  gl
6070: 6f 62 28 27 32 27 2c 61 29 20 46 52 4f 4d 20 65  ob('2',a) FROM e
6080: 0a 20 20 7d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f  .  }.} {0 1}.do_
6090: 74 65 73 74 20 76 74 61 62 31 2e 31 31 2d 35 20  test vtab1.11-5 
60a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
60b0: 20 20 53 45 4c 45 43 54 20 20 67 6c 6f 62 28 61    SELECT  glob(a
60c0: 2c 27 32 27 29 20 46 52 4f 4d 20 65 0a 20 20 7d  ,'2') FROM e.  }
60d0: 0a 7d 20 7b 7b 32 20 31 7d 20 7b 32 20 32 7d 7d  .} {{2 1} {2 2}}
60e0: 0a 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . .#------------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
6130: 74 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 69 66  t the outcome if
6140: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73   a constraint is
6150: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 68 61 6c   encountered hal
6160: 66 2d 77 61 79 20 74 68 72 6f 75 67 68 0a 23 20  f-way through.# 
6170: 61 20 6d 75 6c 74 69 2d 72 6f 77 20 49 4e 53 45  a multi-row INSE
6180: 52 54 20 74 68 61 74 20 69 73 20 69 6e 73 69 64  RT that is insid
6190: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  e a transaction.
61a0: 23 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e  #.do_test vtab1.
61b0: 31 32 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  12-1 {.  execsql
61c0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
61d0: 42 4c 45 20 62 28 61 2c 20 62 2c 20 63 29 3b 0a  BLE b(a, b, c);.
61e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
61f0: 20 63 28 61 20 55 4e 49 51 55 45 2c 20 62 2c 20   c(a UNIQUE, b, 
6200: 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  c);.    INSERT I
6210: 4e 54 4f 20 62 20 56 41 4c 55 45 53 28 31 2c 20  NTO b VALUES(1, 
6220: 27 41 27 2c 20 27 42 27 29 3b 0a 20 20 20 20 49  'A', 'B');.    I
6230: 4e 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c  NSERT INTO b VAL
6240: 55 45 53 28 32 2c 20 27 43 27 2c 20 27 44 27 29  UES(2, 'C', 'D')
6250: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6260: 4f 20 62 20 56 41 4c 55 45 53 28 33 2c 20 27 45  O b VALUES(3, 'E
6270: 27 2c 20 27 46 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'F');.    INS
6280: 45 52 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45  ERT INTO c VALUE
6290: 53 28 33 2c 20 27 47 27 2c 20 27 48 27 29 3b 0a  S(3, 'G', 'H');.
62a0: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
62b0: 41 4c 20 54 41 42 4c 45 20 65 63 68 6f 5f 63 20  AL TABLE echo_c 
62c0: 55 53 49 4e 47 20 65 63 68 6f 28 63 29 3b 0a 20  USING echo(c);. 
62d0: 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 46 69 72 73 74   }.} {}..# First
62e0: 20 74 65 73 74 20 6f 75 74 73 69 64 65 20 6f 66   test outside of
62f0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
6300: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 32  do_test vtab1.12
6310: 2d 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  -2 {.  catchsql 
6320: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63  { INSERT INTO ec
6330: 68 6f 5f 63 20 53 45 4c 45 43 54 20 2a 20 46 52  ho_c SELECT * FR
6340: 4f 4d 20 62 3b 20 7d 0a 7d 20 7b 31 20 7b 65 63  OM b; }.} {1 {ec
6350: 68 6f 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20 55  ho-vtab-error: U
6360: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
6370: 20 66 61 69 6c 65 64 3a 20 63 2e 61 7d 7d 0a 64   failed: c.a}}.d
6380: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d  o_test vtab1.12-
6390: 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  2.1 {.  sqlite3_
63a0: 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 65 63 68  errmsg db.} {ech
63b0: 6f 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20 55 4e  o-vtab-error: UN
63c0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
63d0: 66 61 69 6c 65 64 3a 20 63 2e 61 7d 0a 64 6f 5f  failed: c.a}.do_
63e0: 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d 33 20  test vtab1.12-3 
63f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
6400: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d 0a  LECT * FROM c }.
6410: 7d 20 7b 33 20 47 20 48 7d 0a 0a 23 20 4e 6f 77  } {3 G H}..# Now
6420: 20 74 68 65 20 72 65 61 6c 20 74 65 73 74 20 2d   the real test -
6430: 20 77 72 61 70 70 65 64 20 69 6e 20 61 20 74 72   wrapped in a tr
6440: 61 6e 73 61 63 74 69 6f 6e 2e 0a 64 6f 5f 74 65  ansaction..do_te
6450: 73 74 20 76 74 61 62 31 2e 31 32 2d 34 20 7b 0a  st vtab1.12-4 {.
6460: 20 20 65 78 65 63 73 71 6c 20 20 7b 42 45 47 49    execsql  {BEGI
6470: 4e 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  N}.  catchsql { 
6480: 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f  INSERT INTO echo
6490: 5f 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  _c SELECT * FROM
64a0: 20 62 3b 20 7d 0a 7d 20 7b 31 20 7b 65 63 68 6f   b; }.} {1 {echo
64b0: 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20 55 4e 49  -vtab-error: UNI
64c0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  QUE constraint f
64d0: 61 69 6c 65 64 3a 20 63 2e 61 7d 7d 0a 64 6f 5f  ailed: c.a}}.do_
64e0: 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d 35 20  test vtab1.12-5 
64f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
6500: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d 0a  LECT * FROM c }.
6510: 7d 20 7b 33 20 47 20 48 7d 0a 64 6f 5f 74 65 73  } {3 G H}.do_tes
6520: 74 20 76 74 61 62 31 2e 31 32 2d 36 20 7b 0a 20  t vtab1.12-6 {. 
6530: 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49   execsql { COMMI
6540: 54 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  T }.  execsql { 
6550: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 20  SELECT * FROM c 
6560: 7d 0a 7d 20 7b 33 20 47 20 48 7d 0a 0a 23 20 41  }.} {3 G H}..# A
6570: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 28 74 69 63  t one point (tic
6580: 6b 65 74 20 23 32 37 35 39 29 2c 20 61 20 57 48  ket #2759), a WH
6590: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
65a0: 65 20 66 6f 72 6d 20 22 3c 63 6f 6c 75 6d 6e 3e  e form "<column>
65b0: 20 49 53 20 4e 55 4c 4c 22 0a 23 20 6f 6e 20 61   IS NULL".# on a
65c0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
65d0: 61 73 20 63 61 75 73 69 6e 67 20 61 6e 20 61 73  as causing an as
65e0: 73 65 72 74 28 29 20 74 6f 20 66 61 69 6c 20 69  sert() to fail i
65f0: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 0a  n the compiler..
6600: 23 0a 23 20 22 49 53 20 4e 55 4c 4c 22 20 63 6c  #.# "IS NULL" cl
6610: 61 75 73 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74  auses should not
6620: 20 62 65 20 70 61 73 73 65 64 20 74 68 72 6f 75   be passed throu
6630: 67 68 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  gh to the virtua
6640: 6c 20 74 61 62 6c 65 0a 23 20 69 6d 70 6c 65 6d  l table.# implem
6650: 65 6e 74 61 74 69 6f 6e 2e 20 54 68 65 79 20 61  entation. They a
6660: 72 65 20 68 61 6e 64 6c 65 64 20 62 79 20 53 51  re handled by SQ
6670: 4c 69 74 65 20 61 66 74 65 72 20 74 68 65 20 76  Lite after the v
6680: 74 61 62 20 72 65 74 75 72 6e 73 20 69 74 73 0a  tab returns its.
6690: 23 20 64 61 74 61 2e 0a 23 0a 64 6f 5f 74 65 73  # data..#.do_tes
66a0: 74 20 76 74 61 62 31 2e 31 33 2d 31 20 7b 0a 20  t vtab1.13-1 {. 
66b0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
66c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63  SELECT * FROM ec
66d0: 68 6f 5f 63 20 57 48 45 52 45 20 61 20 49 53 20  ho_c WHERE a IS 
66e0: 4e 55 4c 4c 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  NULL .  }.} {}.d
66f0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 33 2d  o_test vtab1.13-
6700: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
6710: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6720: 20 63 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20   c VALUES(NULL, 
6730: 31 35 2c 20 31 36 29 3b 0a 20 20 20 20 53 45 4c  15, 16);.    SEL
6740: 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f  ECT * FROM echo_
6750: 63 20 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c  c WHERE a IS NUL
6760: 4c 20 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 31 35 20  L .  }.} {{} 15 
6770: 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  16}.do_test vtab
6780: 31 2e 31 33 2d 33 20 7b 0a 20 20 65 78 65 63 73  1.13-3 {.  execs
6790: 71 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54  ql { .    INSERT
67a0: 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 31   INTO c VALUES(1
67b0: 35 2c 20 4e 55 4c 4c 2c 20 31 36 29 3b 0a 20 20  5, NULL, 16);.  
67c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
67d0: 65 63 68 6f 5f 63 20 57 48 45 52 45 20 62 20 49  echo_c WHERE b I
67e0: 53 20 4e 55 4c 4c 20 0a 20 20 7d 0a 7d 20 7b 31  S NULL .  }.} {1
67f0: 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 73 74  5 {} 16}.do_test
6800: 20 76 74 61 62 31 2e 31 33 2d 34 20 7b 0a 20 20   vtab1.13-4 {.  
6810: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
6820: 6e 20 6e 75 6c 6c 0a 20 20 65 78 65 63 73 71 6c  n null.  execsql
6830: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 2a   { .    SELECT *
6840: 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45   FROM echo_c WHE
6850: 52 45 20 62 20 49 53 20 24 6e 75 6c 6c 0a 20 20  RE b IS $null.  
6860: 7d 0a 7d 20 7b 31 35 20 7b 7d 20 31 36 7d 0a 64  }.} {15 {} 16}.d
6870: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 33 2d  o_test vtab1.13-
6880: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
6890: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
68a0: 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20  OM echo_c WHERE 
68b0: 62 20 49 53 20 4e 55 4c 4c 20 41 4e 44 20 61 20  b IS NULL AND a 
68c0: 3d 20 31 35 3b 0a 20 20 7d 0a 7d 20 7b 31 35 20  = 15;.  }.} {15 
68d0: 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76  {} 16}.do_test v
68e0: 74 61 62 31 2e 31 33 2d 36 20 7b 0a 20 20 65 78  tab1.13-6 {.  ex
68f0: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c  ecsql { .    SEL
6900: 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f  ECT * FROM echo_
6910: 63 20 57 48 45 52 45 20 4e 55 4c 4c 20 49 53 20  c WHERE NULL IS 
6920: 62 20 41 4e 44 20 61 20 49 53 20 31 35 3b 0a 20  b AND a IS 15;. 
6930: 20 7d 0a 7d 20 7b 31 35 20 7b 7d 20 31 36 7d 0a   }.} {15 {} 16}.
6940: 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  ..do_test vtab1-
6950: 31 34 2e 30 30 31 20 7b 0a 20 20 65 78 65 63 73  14.001 {.  execs
6960: 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  ql {SELECT rowid
6970: 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20  , * FROM echo_c 
6980: 57 48 45 52 45 20 2b 72 6f 77 69 64 20 49 4e 20  WHERE +rowid IN 
6990: 28 31 2c 32 2c 33 29 7d 0a 7d 20 7b 31 20 33 20  (1,2,3)}.} {1 3 
69a0: 47 20 48 20 32 20 7b 7d 20 31 35 20 31 36 20 33  G H 2 {} 15 16 3
69b0: 20 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65   15 {} 16}.do_te
69c0: 73 74 20 76 74 61 62 31 2d 31 34 2e 30 30 32 20  st vtab1-14.002 
69d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
69e0: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
69f0: 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 72  M echo_c WHERE r
6a00: 6f 77 69 64 20 49 4e 20 28 31 2c 32 2c 33 29 7d  owid IN (1,2,3)}
6a10: 0a 7d 20 7b 31 20 33 20 47 20 48 20 32 20 7b 7d  .} {1 3 G H 2 {}
6a20: 20 31 35 20 31 36 20 33 20 31 35 20 7b 7d 20 31   15 16 3 15 {} 1
6a30: 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  6}.do_test vtab1
6a40: 2d 31 34 2e 30 30 33 20 7b 0a 20 20 65 78 65 63  -14.003 {.  exec
6a50: 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  sql {SELECT rowi
6a60: 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63  d, * FROM echo_c
6a70: 20 57 48 45 52 45 20 2b 72 6f 77 69 64 20 49 4e   WHERE +rowid IN
6a80: 20 28 30 2c 31 2c 35 2c 32 2c 27 61 27 2c 33 2c   (0,1,5,2,'a',3,
6a90: 4e 55 4c 4c 29 7d 0a 7d 20 7b 31 20 33 20 47 20  NULL)}.} {1 3 G 
6aa0: 48 20 32 20 7b 7d 20 31 35 20 31 36 20 33 20 31  H 2 {} 15 16 3 1
6ab0: 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 73 74  5 {} 16}.do_test
6ac0: 20 76 74 61 62 31 2d 31 34 2e 30 30 34 20 7b 0a   vtab1-14.004 {.
6ad0: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
6ae0: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
6af0: 65 63 68 6f 5f 63 20 57 48 45 52 45 20 72 6f 77  echo_c WHERE row
6b00: 69 64 20 49 4e 20 28 30 2c 31 2c 35 2c 27 61 27  id IN (0,1,5,'a'
6b10: 2c 32 2c 33 2c 4e 55 4c 4c 29 7d 0a 7d 20 7b 31  ,2,3,NULL)}.} {1
6b20: 20 33 20 47 20 48 20 32 20 7b 7d 20 31 35 20 31   3 G H 2 {} 15 1
6b30: 36 20 33 20 31 35 20 7b 7d 20 31 36 7d 0a 64 6f  6 3 15 {} 16}.do
6b40: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e 30  _test vtab1-14.0
6b50: 30 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  05 {.  execsql {
6b60: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
6b70: 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52  FROM echo_c WHER
6b80: 45 20 72 6f 77 69 64 20 4e 4f 54 20 49 4e 20 28  E rowid NOT IN (
6b90: 30 2c 31 2c 35 2c 27 61 27 2c 32 2c 33 29 7d 0a  0,1,5,'a',2,3)}.
6ba0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  } {}.do_test vta
6bb0: 62 31 2d 31 34 2e 30 30 36 20 7b 0a 20 20 65 78  b1-14.006 {.  ex
6bc0: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f  ecsql {SELECT ro
6bd0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f  wid, * FROM echo
6be0: 5f 63 20 57 48 45 52 45 20 72 6f 77 69 64 20 4e  _c WHERE rowid N
6bf0: 4f 54 20 49 4e 20 28 30 2c 35 2c 27 61 27 2c 32  OT IN (0,5,'a',2
6c00: 2c 33 29 7d 0a 7d 20 7b 31 20 33 20 47 20 48 7d  ,3)}.} {1 3 G H}
6c10: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
6c20: 34 2e 30 30 37 20 7b 0a 20 20 65 78 65 63 73 71  4.007 {.  execsq
6c30: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  l {SELECT rowid,
6c40: 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57   * FROM echo_c W
6c50: 48 45 52 45 20 2b 72 6f 77 69 64 20 4e 4f 54 20  HERE +rowid NOT 
6c60: 49 4e 20 28 30 2c 35 2c 27 61 27 2c 32 2c 33 2c  IN (0,5,'a',2,3,
6c70: 4e 55 4c 4c 29 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  NULL)}.} {}.do_t
6c80: 65 73 74 20 76 74 61 62 31 2d 31 34 2e 30 30 38  est vtab1-14.008
6c90: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
6ca0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
6cb0: 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20  OM echo_c WHERE 
6cc0: 72 6f 77 69 64 20 4e 4f 54 20 49 4e 20 28 30 2c  rowid NOT IN (0,
6cd0: 35 2c 27 61 27 2c 32 2c 33 2c 4e 55 4c 4c 29 7d  5,'a',2,3,NULL)}
6ce0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74  .} {}.do_test vt
6cf0: 61 62 31 2d 31 34 2e 30 31 31 20 7b 0a 20 20 65  ab1-14.011 {.  e
6d00: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a  xecsql {SELECT *
6d10: 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45   FROM echo_c WHE
6d20: 52 45 20 2b 61 20 49 4e 20 28 31 2c 33 2c 38 2c  RE +a IN (1,3,8,
6d30: 27 78 27 2c 4e 55 4c 4c 2c 31 35 2c 32 34 29 7d  'x',NULL,15,24)}
6d40: 0a 7d 20 7b 33 20 47 20 48 20 31 35 20 7b 7d 20  .} {3 G H 15 {} 
6d50: 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  16}.do_test vtab
6d60: 31 2d 31 34 2e 30 31 32 20 7b 0a 20 20 65 78 65  1-14.012 {.  exe
6d70: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  csql {SELECT * F
6d80: 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45  ROM echo_c WHERE
6d90: 20 61 20 49 4e 20 28 31 2c 33 2c 38 2c 27 78 27   a IN (1,3,8,'x'
6da0: 2c 4e 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a 7d 20  ,NULL,15,24)}.} 
6db0: 7b 33 20 47 20 48 20 31 35 20 7b 7d 20 31 36 7d  {3 G H 15 {} 16}
6dc0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
6dd0: 34 2e 30 31 33 20 7b 0a 20 20 65 78 65 63 73 71  4.013 {.  execsq
6de0: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
6df0: 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20   echo_c WHERE a 
6e00: 4e 4f 54 20 49 4e 20 28 31 2c 38 2c 27 78 27 2c  NOT IN (1,8,'x',
6e10: 31 35 2c 32 34 29 7d 0a 7d 20 7b 33 20 47 20 48  15,24)}.} {3 G H
6e20: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
6e30: 31 34 2e 30 31 34 20 7b 0a 20 20 65 78 65 63 73  14.014 {.  execs
6e40: 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql {SELECT * FRO
6e50: 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61  M echo_c WHERE a
6e60: 20 4e 4f 54 20 49 4e 20 28 31 2c 38 2c 27 78 27   NOT IN (1,8,'x'
6e70: 2c 4e 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a 7d 20  ,NULL,15,24)}.} 
6e80: 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  {}.do_test vtab1
6e90: 2d 31 34 2e 30 31 35 20 7b 0a 20 20 65 78 65 63  -14.015 {.  exec
6ea0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
6eb0: 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20  OM echo_c WHERE 
6ec0: 2b 61 20 4e 4f 54 20 49 4e 20 28 31 2c 38 2c 27  +a NOT IN (1,8,'
6ed0: 78 27 2c 4e 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a  x',NULL,15,24)}.
6ee0: 7d 20 7b 7d 0a 0a 0a 0a 23 64 6f 5f 74 65 73 74  } {}....#do_test
6ef0: 20 76 74 61 62 31 2d 31 34 2e 31 20 7b 0a 23 20   vtab1-14.1 {.# 
6f00: 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54   execsql { DELET
6f10: 45 20 46 52 4f 4d 20 63 20 7d 0a 23 20 20 73 65  E FROM c }.#  se
6f20: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22  t echo_module ""
6f30: 0a 23 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  .#  execsql { SE
6f40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f  LECT * FROM echo
6f50: 5f 63 20 57 48 45 52 45 20 72 6f 77 69 64 20 49  _c WHERE rowid I
6f60: 4e 20 28 31 2c 20 32 2c 20 33 29 20 7d 0a 23 20  N (1, 2, 3) }.# 
6f70: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
6f80: 0a 23 7d 20 7b 2f 2e 2a 78 42 65 73 74 49 6e 64  .#} {/.*xBestInd
6f90: 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  ex {SELECT rowid
6fa0: 2c 20 2e 20 46 52 4f 4d 20 27 63 27 20 57 48 45  , . FROM 'c' WHE
6fb0: 52 45 20 72 6f 77 69 64 20 3d 20 2e 7d 20 78 46  RE rowid = .} xF
6fc0: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f  ilter {SELECT ro
6fd0: 77 69 64 2c 20 2e 20 46 52 4f 4d 20 27 63 27 7d  wid, . FROM 'c'}
6fe0: 20 31 2f 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74   1/}..do_test vt
6ff0: 61 62 31 2d 31 34 2e 32 20 7b 0a 20 20 73 65 74  ab1-14.2 {.  set
7000: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a   echo_module "".
7010: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
7020: 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63  CT * FROM echo_c
7030: 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31   WHERE rowid = 1
7040: 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   }.  set echo_mo
7050: 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65  dule.} [list xBe
7060: 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20  stIndex {SELECT 
7070: 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 46  rowid, a, b, c F
7080: 52 4f 4d 20 27 63 27 20 57 48 45 52 45 20 72 6f  ROM 'c' WHERE ro
7090: 77 69 64 20 3d 20 3f 7d 20 5c 0a 20 20 20 20 20  wid = ?} \.     
70a0: 20 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45     xFilter {SELE
70b0: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  CT rowid, a, b, 
70c0: 63 20 46 52 4f 4d 20 27 63 27 20 57 48 45 52 45  c FROM 'c' WHERE
70d0: 20 72 6f 77 69 64 20 3d 20 3f 7d 20 31 5d 0a 0a   rowid = ?} 1]..
70e0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34  do_test vtab1-14
70f0: 2e 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  .3 {.  set echo_
7100: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63  module "".  exec
7110: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
7120: 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45  ROM echo_c WHERE
7130: 20 61 20 3d 20 31 20 7d 0a 20 20 73 65 74 20 65   a = 1 }.  set e
7140: 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69  cho_module.} [li
7150: 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53  st xBestIndex {S
7160: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20  ELECT rowid, a, 
7170: 62 2c 20 63 20 46 52 4f 4d 20 27 63 27 20 57 48  b, c FROM 'c' WH
7180: 45 52 45 20 61 20 3d 20 3f 7d 20 5c 0a 20 20 20  ERE a = ?} \.   
7190: 20 20 20 20 20 78 46 69 6c 74 65 72 20 7b 53 45       xFilter {SE
71a0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62  LECT rowid, a, b
71b0: 2c 20 63 20 46 52 4f 4d 20 27 63 27 20 57 48 45  , c FROM 'c' WHE
71c0: 52 45 20 61 20 3d 20 3f 7d 20 31 5d 0a 0a 23 64  RE a = ?} 1]..#d
71d0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e  o_test vtab1-14.
71e0: 34 20 7b 0a 23 20 20 73 65 74 20 65 63 68 6f 5f  4 {.#  set echo_
71f0: 6d 6f 64 75 6c 65 20 22 22 0a 23 20 20 65 78 65  module "".#  exe
7200: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
7210: 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52  FROM echo_c WHER
7220: 45 20 61 20 49 4e 20 28 31 2c 20 32 29 20 7d 0a  E a IN (1, 2) }.
7230: 23 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  #  set echo_modu
7240: 6c 65 0a 23 7d 20 7b 2f 78 42 65 73 74 49 6e 64  le.#} {/xBestInd
7250: 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  ex {SELECT rowid
7260: 2c 20 2e 20 46 52 4f 4d 20 27 63 27 20 57 48 45  , . FROM 'c' WHE
7270: 52 45 20 61 20 3d 20 2e 7d 20 78 46 69 6c 74 65  RE a = .} xFilte
7280: 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  r {SELECT rowid,
7290: 20 2e 20 46 52 4f 4d 20 27 63 27 20 57 48 45 52   . FROM 'c' WHER
72a0: 45 20 61 20 3d 20 2e 7d 20 31 2f 7d 0a 0a 64 6f  E a = .} 1/}..do
72b0: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 35 2e 31  _test vtab1-15.1
72c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
72d0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
72e0: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  t1(a, b, c);.   
72f0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
7300: 54 41 42 4c 45 20 65 63 68 6f 5f 74 31 20 55 53  TABLE echo_t1 US
7310: 49 4e 47 20 65 63 68 6f 28 74 31 29 3b 0a 20 20  ING echo(t1);.  
7320: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76  }.} {}.do_test v
7330: 74 61 62 31 2d 31 35 2e 32 20 7b 0a 20 20 65 78  tab1-15.2 {.  ex
7340: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
7350: 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 74 31 28  RT INTO echo_t1(
7360: 72 6f 77 69 64 29 20 56 41 4c 55 45 53 28 34 35  rowid) VALUES(45
7370: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f  );.    SELECT ro
7380: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f  wid, * FROM echo
7390: 5f 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34 35 20 7b  _t1;.  }.} {45 {
73a0: 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {} {}}.do_test
73b0: 20 76 74 61 62 31 2d 31 35 2e 33 20 7b 0a 20 20   vtab1-15.3 {.  
73c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
73d0: 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 74  SERT INTO echo_t
73e0: 31 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53 28  1(rowid) VALUES(
73f0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 45 4c 45 43  NULL);.    SELEC
7400: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
7410: 65 63 68 6f 5f 74 31 3b 0a 20 20 7d 0a 7d 20 7b  echo_t1;.  }.} {
7420: 34 35 20 7b 7d 20 7b 7d 20 7b 7d 20 34 36 20 7b  45 {} {} {} 46 {
7430: 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {} {}}.do_test
7440: 20 76 74 61 62 31 2d 31 35 2e 34 20 7b 0a 20 20   vtab1-15.4 {.  
7450: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
7460: 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f  NSERT INTO echo_
7470: 74 31 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53  t1(rowid) VALUES
7480: 28 27 6e 65 77 20 72 6f 77 69 64 27 29 3b 0a 20  ('new rowid');. 
7490: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 74 79 70   }.} {1 {datatyp
74a0: 65 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a 23 20  e mismatch}}..# 
74b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
74c0: 73 74 73 20 2d 20 76 74 61 62 31 2d 31 36 2e 2a  sts - vtab1-16.*
74d0: 20 2d 20 61 72 65 20 64 65 73 69 67 6e 65 64 20   - are designed 
74e0: 74 6f 20 74 65 73 74 20 74 68 61 74 20 73 65 74  to test that set
74f0: 74 69 6e 67 20 0a 23 20 73 71 6c 69 74 65 33 5f  ting .# sqlite3_
7500: 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 76 61 72  vtab.zErrMsg var
7510: 69 61 62 6c 65 20 63 61 6e 20 62 65 20 75 73 65  iable can be use
7520: 64 20 62 79 20 74 68 65 20 76 74 61 62 20 69 6e  d by the vtab in
7530: 74 65 72 66 61 63 65 20 74 6f 20 0a 23 20 72 65  terface to .# re
7540: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65  turn an error me
7550: 73 73 61 67 65 20 74 6f 20 74 68 65 20 75 73 65  ssage to the use
7560: 72 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 76 74  r..# .do_test vt
7570: 61 62 31 2d 31 36 2e 31 20 7b 0a 20 20 65 78 65  ab1-16.1 {.  exe
7580: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
7590: 45 20 54 41 42 4c 45 20 74 32 28 61 20 50 52 49  E TABLE t2(a PRI
75a0: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b  MARY KEY, b, c);
75b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
75c0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 2c   t2 VALUES(1, 2,
75d0: 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   3);.    INSERT 
75e0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34  INTO t2 VALUES(4
75f0: 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 43 52 45  , 5, 6);.    CRE
7600: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
7610: 45 20 65 63 68 6f 5f 74 32 20 55 53 49 4e 47 20  E echo_t2 USING 
7620: 65 63 68 6f 28 74 32 29 3b 0a 20 20 7d 0a 7d 20  echo(t2);.  }.} 
7630: 7b 7d 0a 0a 73 65 74 20 74 6e 20 32 0a 66 6f 72  {}..set tn 2.for
7640: 65 61 63 68 20 6d 65 74 68 6f 64 20 5b 6c 69 73  each method [lis
7650: 74 20 5c 0a 20 20 20 20 78 42 65 73 74 49 6e 64  t \.    xBestInd
7660: 65 78 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78  ex       \.    x
7670: 4f 70 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  Open            
7680: 5c 0a 20 20 20 20 78 46 69 6c 74 65 72 20 20 20  \.    xFilter   
7690: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78 4e 65         \.    xNe
76a0: 78 74 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  xt            \.
76b0: 20 20 20 20 78 43 6f 6c 75 6d 6e 20 20 20 20 20      xColumn     
76c0: 20 20 20 20 20 5c 0a 20 20 20 20 78 52 6f 77 69       \.    xRowi
76d0: 64 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d 20  d           \.] 
76e0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 76 74 61 62  {.  do_test vtab
76f0: 31 2d 31 36 2e 24 74 6e 20 7b 0a 20 20 20 20 73  1-16.$tn {.    s
7700: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66  et echo_module_f
7710: 61 69 6c 28 24 6d 65 74 68 6f 64 2c 74 32 29 20  ail($method,t2) 
7720: 22 74 68 65 20 24 6d 65 74 68 6f 64 20 6d 65 74  "the $method met
7730: 68 6f 64 20 68 61 73 20 66 61 69 6c 65 64 22 0a  hod has failed".
7740: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53      catchsql { S
7750: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
7760: 52 4f 4d 20 65 63 68 6f 5f 74 32 20 57 48 45 52  ROM echo_t2 WHER
7770: 45 20 61 20 3e 3d 20 31 20 7d 0a 20 20 7d 20 22  E a >= 1 }.  } "
7780: 31 20 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72 72  1 {echo-vtab-err
7790: 6f 72 3a 20 74 68 65 20 24 6d 65 74 68 6f 64 20  or: the $method 
77a0: 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69 6c 65  method has faile
77b0: 64 7d 22 0a 20 20 75 6e 73 65 74 20 65 63 68 6f  d}".  unset echo
77c0: 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 24 6d 65  _module_fail($me
77d0: 74 68 6f 64 2c 74 32 29 0a 20 20 69 6e 63 72 20  thod,t2).  incr 
77e0: 74 6e 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6d 65  tn.}..foreach me
77f0: 74 68 6f 64 20 5b 6c 69 73 74 20 5c 0a 20 20 78  thod [list \.  x
7800: 55 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20  Update          
7810: 20 20 5c 0a 20 20 78 42 65 67 69 6e 20 20 20 20    \.  xBegin    
7820: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 78 53 79           \.  xSy
7830: 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
7840: 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  \.] {.  do_test 
7850: 76 74 61 62 31 2d 31 36 2e 24 74 6e 20 7b 0a 20  vtab1-16.$tn {. 
7860: 20 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75     set echo_modu
7870: 6c 65 5f 66 61 69 6c 28 24 6d 65 74 68 6f 64 2c  le_fail($method,
7880: 74 32 29 20 22 74 68 65 20 24 6d 65 74 68 6f 64  t2) "the $method
7890: 20 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69 6c   method has fail
78a0: 65 64 22 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ed".    catchsql
78b0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65   { INSERT INTO e
78c0: 63 68 6f 5f 74 32 20 56 41 4c 55 45 53 28 37 2c  cho_t2 VALUES(7,
78d0: 20 38 2c 20 39 29 20 7d 0a 20 20 7d 20 22 31 20   8, 9) }.  } "1 
78e0: 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72 72 6f 72  {echo-vtab-error
78f0: 3a 20 74 68 65 20 24 6d 65 74 68 6f 64 20 6d 65  : the $method me
7900: 74 68 6f 64 20 68 61 73 20 66 61 69 6c 65 64 7d  thod has failed}
7910: 22 0a 20 20 75 6e 73 65 74 20 65 63 68 6f 5f 6d  ".  unset echo_m
7920: 6f 64 75 6c 65 5f 66 61 69 6c 28 24 6d 65 74 68  odule_fail($meth
7930: 6f 64 2c 74 32 29 0a 20 20 69 6e 63 72 20 74 6e  od,t2).  incr tn
7940: 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 61 6c  .}..ifcapable al
7950: 74 65 72 74 61 62 6c 65 20 7b 0a 20 20 64 6f 5f  tertable {.  do_
7960: 74 65 73 74 20 76 74 61 62 31 2d 31 36 2e 24 74  test vtab1-16.$t
7970: 6e 20 7b 0a 20 20 20 20 73 65 74 20 65 63 68 6f  n {.    set echo
7980: 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 78 52 65  _module_fail(xRe
7990: 6e 61 6d 65 2c 74 32 29 20 22 74 68 65 20 78 52  name,t2) "the xR
79a0: 65 6e 61 6d 65 20 6d 65 74 68 6f 64 20 68 61 73  ename method has
79b0: 20 66 61 69 6c 65 64 22 0a 20 20 20 20 63 61 74   failed".    cat
79c0: 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20 54 41  chsql { ALTER TA
79d0: 42 4c 45 20 65 63 68 6f 5f 74 32 20 52 45 4e 41  BLE echo_t2 RENA
79e0: 4d 45 20 54 4f 20 61 6e 6f 74 68 65 72 5f 6e 61  ME TO another_na
79f0: 6d 65 20 7d 0a 20 20 7d 20 22 31 20 7b 65 63 68  me }.  } "1 {ech
7a00: 6f 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20 74 68  o-vtab-error: th
7a10: 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64  e xRename method
7a20: 20 68 61 73 20 66 61 69 6c 65 64 7d 22 0a 20 20   has failed}".  
7a30: 75 6e 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c  unset echo_modul
7a40: 65 5f 66 61 69 6c 28 78 52 65 6e 61 6d 65 2c 74  e_fail(xRename,t
7a50: 32 29 0a 20 20 69 6e 63 72 20 74 6e 0a 7d 0a 0a  2).  incr tn.}..
7a60: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
7a70: 74 65 73 74 20 63 61 73 65 20 65 78 70 6f 73 65  test case expose
7a80: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 69 6e  s an instance in
7a90: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
7aa0: 5f 76 74 61 62 28 29 0a 23 20 61 6e 20 65 72 72  _vtab().# an err
7ab0: 6f 72 20 6d 65 73 73 61 67 65 20 77 61 73 20 73  or message was s
7ac0: 65 74 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  et using a call 
7ad0: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
7ae0: 65 33 5f 6d 70 72 69 6e 74 66 28 7a 45 72 72 29  e3_mprintf(zErr)
7af0: 2c 0a 23 20 77 68 65 72 65 20 7a 45 72 72 20 69  ,.# where zErr i
7b00: 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 73  s an arbitrary s
7b10: 74 72 69 6e 67 2e 20 54 68 69 73 20 69 73 20 6e  tring. This is n
7b20: 6f 20 67 6f 6f 64 20 69 66 20 74 68 65 20 73 74  o good if the st
7b30: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 0a 23 20  ring contains.# 
7b40: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
7b50: 63 61 6e 20 62 65 20 6d 69 73 74 61 6b 65 6e 20  can be mistaken 
7b60: 66 6f 72 20 70 72 69 6e 74 66 28 29 20 66 6f 72  for printf() for
7b70: 6d 61 74 74 69 6e 67 20 64 69 72 65 63 74 69 76  matting directiv
7b80: 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74  es..#.do_test vt
7b90: 61 62 31 2d 31 37 2e 31 20 7b 0a 20 20 73 71 6c  ab1-17.1 {.  sql
7ba0: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 64  ite3_db_config d
7bb0: 62 20 44 45 46 45 4e 53 49 56 45 20 30 0a 20 20  b DEFENSIVE 0.  
7bc0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50  execsql { .    P
7bd0: 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
7be0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 49  chema = 1;.    I
7bf0: 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74  NSERT INTO sqlit
7c00: 65 5f 6d 61 73 74 65 72 20 56 41 4c 55 45 53 28  e_master VALUES(
7c10: 0a 20 20 20 20 20 20 27 74 61 62 6c 65 27 2c 20  .      'table', 
7c20: 27 74 33 27 2c 20 27 74 33 27 2c 20 30 2c 20 27  't3', 't3', 0, '
7c30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 25 73 25  INSERT INTO "%s%
7c40: 73 22 20 56 41 4c 55 45 53 28 31 29 27 0a 20 20  s" VALUES(1)'.  
7c50: 20 20 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68    );.  }.  catch
7c60: 73 71 6c 20 7b 20 43 52 45 41 54 45 20 56 49 52  sql { CREATE VIR
7c70: 54 55 41 4c 20 54 41 42 4c 45 20 74 34 20 55 53  TUAL TABLE t4 US
7c80: 49 4e 47 20 65 63 68 6f 28 74 33 29 3b 20 7d 0a  ING echo(t3); }.
7c90: 7d 20 7b 31 20 7b 76 74 61 62 6c 65 20 63 6f 6e  } {1 {vtable con
7ca0: 73 74 72 75 63 74 6f 72 20 66 61 69 6c 65 64 3a  structor failed:
7cb0: 20 74 34 7d 7d 0a 0a 23 20 54 68 69 73 20 74 65   t4}}..# This te
7cc0: 73 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74  st verifies that
7cd0: 20 74 69 63 6b 65 74 20 34 38 66 32 39 39 36 33   ticket 48f29963
7ce0: 20 69 73 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f   is fixed..#.do_
7cf0: 74 65 73 74 20 76 74 61 62 31 2d 31 37 2e 31 20  test vtab1-17.1 
7d00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
7d10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7d20: 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t5(a, b);.    CR
7d30: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
7d40: 4c 45 20 65 35 20 55 53 49 4e 47 20 65 63 68 6f  LE e5 USING echo
7d50: 5f 76 32 28 74 35 29 3b 0a 20 20 20 20 42 45 47  _v2(t5);.    BEG
7d60: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
7d70: 20 49 4e 54 4f 20 65 35 20 56 41 4c 55 45 53 28   INTO e5 VALUES(
7d80: 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 44 52 4f  1, 2);.      DRO
7d90: 50 20 54 41 42 4c 45 20 65 35 3b 0a 20 20 20 20  P TABLE e5;.    
7da0: 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
7db0: 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  .      ROLLBACK 
7dc0: 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d  TO one;.    COMM
7dd0: 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  IT;.  }.} {}..do
7de0: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 37 2e 32  _test vtab1-17.2
7df0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44   {.  execsql { D
7e00: 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74  ELETE FROM sqlit
7e10: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 73  e_master WHERE s
7e20: 71 6c 20 4c 49 4b 45 20 27 69 6e 73 65 72 74 25  ql LIKE 'insert%
7e30: 27 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  ' }.} {}..#-----
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e80: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
7e90: 77 69 6e 67 20 74 65 73 74 73 20 2d 20 76 74 61  wing tests - vta
7ea0: 62 31 2d 31 38 2e 2a 20 2d 20 74 65 73 74 20 74  b1-18.* - test t
7eb0: 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  hat the optimiza
7ec0: 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 0a 23 20 63  tion of LIKE.# c
7ed0: 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 77 68  onstraints in wh
7ee0: 65 72 65 2e 63 20 70 6c 61 79 73 20 77 65 6c 6c  ere.c plays well
7ef0: 20 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61   with virtual ta
7f00: 62 6c 65 73 2e 0a 23 0a 23 20 20 20 31 38 2e 31  bles..#.#   18.1
7f10: 2e 2a 3a 20 43 61 73 65 2d 69 6e 73 65 6e 73 69  .*: Case-insensi
7f20: 74 69 76 65 20 4c 49 4b 45 2e 0a 23 20 20 20 31  tive LIKE..#   1
7f30: 38 2e 32 2e 2a 3a 20 43 61 73 65 2d 73 65 6e 73  8.2.*: Case-sens
7f40: 69 74 69 76 65 20 4c 49 4b 45 2e 0a 23 0a 75 6e  itive LIKE..#.un
7f50: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
7f60: 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 62 65 67 69  echo_module_begi
7f70: 6e 5f 66 61 69 6c 0a 0a 64 6f 5f 65 78 65 63 73  n_fail..do_execs
7f80: 71 6c 5f 74 65 73 74 20 31 38 2e 31 2e 30 20 7b  ql_test 18.1.0 {
7f90: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
7fa0: 74 36 28 61 2c 20 62 20 54 45 58 54 29 3b 0a 20  t6(a, b TEXT);. 
7fb0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 36   CREATE INDEX i6
7fc0: 20 4f 4e 20 74 36 28 62 2c 20 61 29 3b 0a 20 20   ON t6(b, a);.  
7fd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56  INSERT INTO t6 V
7fe0: 41 4c 55 45 53 28 31 2c 20 27 50 65 74 65 72 27  ALUES(1, 'Peter'
7ff0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
8000: 20 74 36 20 56 41 4c 55 45 53 28 32 2c 20 27 41   t6 VALUES(2, 'A
8010: 6e 64 72 65 77 27 29 3b 0a 20 20 49 4e 53 45 52  ndrew');.  INSER
8020: 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53  T INTO t6 VALUES
8030: 28 33 2c 20 27 38 4a 61 6d 65 73 27 29 3b 0a 20  (3, '8James');. 
8040: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
8050: 56 41 4c 55 45 53 28 34 2c 20 27 38 4a 6f 68 6e  VALUES(4, '8John
8060: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
8070: 4f 20 74 36 20 56 41 4c 55 45 53 28 35 2c 20 27  O t6 VALUES(5, '
8080: 50 68 69 6c 6c 69 70 27 29 3b 0a 20 20 49 4e 53  Phillip');.  INS
8090: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
80a0: 45 53 28 36 2c 20 27 42 61 72 74 68 6f 6c 6f 6d  ES(6, 'Bartholom
80b0: 65 77 27 29 3b 0a 20 20 43 52 45 41 54 45 20 56  ew');.  CREATE V
80c0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 36 20  IRTUAL TABLE e6 
80d0: 55 53 49 4e 47 20 65 63 68 6f 28 74 36 29 3b 0a  USING echo(t6);.
80e0: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 69 63  }..ifcapable !ic
80f0: 75 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 7b 74  u {.  foreach {t
8100: 6e 20 73 71 6c 20 72 65 73 20 66 69 6c 74 65 72  n sql res filter
8110: 7d 20 7b 0a 20 20 20 20 31 2e 31 20 22 53 45 4c  } {.    1.1 "SEL
8120: 45 43 54 20 61 20 46 52 4f 4d 20 65 36 20 57 48  ECT a FROM e6 WH
8130: 45 52 45 20 62 3e 27 38 4a 61 6d 65 73 27 22 20  ERE b>'8James'" 
8140: 7b 34 20 32 20 36 20 31 20 35 7d 0a 20 20 20 20  {4 2 6 1 5}.    
8150: 20 20 7b 78 46 69 6c 74 65 72 20 7b 53 45 4c 45    {xFilter {SELE
8160: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 20 46  CT rowid, a, b F
8170: 52 4f 4d 20 27 74 36 27 20 57 48 45 52 45 20 62  ROM 't6' WHERE b
8180: 20 3e 20 3f 7d 20 38 4a 61 6d 65 73 7d 0a 20 20   > ?} 8James}.  
8190: 0a 20 20 20 20 31 2e 32 20 22 53 45 4c 45 43 54  .    1.2 "SELECT
81a0: 20 61 20 46 52 4f 4d 20 65 36 20 57 48 45 52 45   a FROM e6 WHERE
81b0: 20 62 3e 3d 27 38 27 20 41 4e 44 20 62 3c 27 39   b>='8' AND b<'9
81c0: 27 22 20 7b 33 20 34 7d 0a 20 20 20 20 20 20 7b  '" {3 4}.      {
81d0: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20  xFilter {SELECT 
81e0: 72 6f 77 69 64 2c 20 61 2c 20 62 20 46 52 4f 4d  rowid, a, b FROM
81f0: 20 27 74 36 27 20 57 48 45 52 45 20 62 20 3e 3d   't6' WHERE b >=
8200: 20 3f 20 41 4e 44 20 62 20 3c 20 3f 7d 20 38 20   ? AND b < ?} 8 
8210: 39 7d 0a 20 20 0a 20 20 20 20 31 2e 33 20 22 53  9}.  .    1.3 "S
8220: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 36 20  ELECT a FROM e6 
8230: 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 38 4a  WHERE b LIKE '8J
8240: 25 27 22 20 7b 33 20 34 7d 0a 20 20 20 20 20 20  %'" {3 4}.      
8250: 7b 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54  {xFilter {SELECT
8260: 20 72 6f 77 69 64 2c 20 61 2c 20 62 20 46 52 4f   rowid, a, b FRO
8270: 4d 20 27 74 36 27 20 57 48 45 52 45 20 62 20 3e  M 't6' WHERE b >
8280: 3d 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 41 4e  = ? AND b < ? AN
8290: 44 20 62 20 6c 69 6b 65 20 3f 7d 20 38 4a 20 38  D b like ?} 8J 8
82a0: 6b 20 38 4a 25 7d 0a 20 20 0a 20 20 20 20 31 2e  k 8J%}.  .    1.
82b0: 34 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  4 "SELECT a FROM
82c0: 20 65 36 20 57 48 45 52 45 20 62 20 4c 49 4b 45   e6 WHERE b LIKE
82d0: 20 27 38 6a 25 27 22 20 7b 33 20 34 7d 0a 20 20   '8j%'" {3 4}.  
82e0: 20 20 20 20 7b 78 46 69 6c 74 65 72 20 7b 53 45      {xFilter {SE
82f0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62  LECT rowid, a, b
8300: 20 46 52 4f 4d 20 27 74 36 27 20 57 48 45 52 45   FROM 't6' WHERE
8310: 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c 20   b >= ? AND b < 
8320: 3f 20 41 4e 44 20 62 20 6c 69 6b 65 20 3f 7d 20  ? AND b like ?} 
8330: 38 4a 20 38 6b 20 38 6a 25 7d 0a 20 20 0a 20 20  8J 8k 8j%}.  .  
8340: 20 20 31 2e 35 20 22 53 45 4c 45 43 54 20 61 20    1.5 "SELECT a 
8350: 46 52 4f 4d 20 65 36 20 57 48 45 52 45 20 62 20  FROM e6 WHERE b 
8360: 4c 49 4b 45 20 27 38 25 27 22 20 7b 33 20 34 7d  LIKE '8%'" {3 4}
8370: 0a 20 20 20 20 20 20 7b 78 46 69 6c 74 65 72 20  .      {xFilter 
8380: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 61  {SELECT rowid, a
8390: 2c 20 62 20 46 52 4f 4d 20 27 74 36 27 20 57 48  , b FROM 't6' WH
83a0: 45 52 45 20 62 20 6c 69 6b 65 20 3f 7d 20 38 25  ERE b like ?} 8%
83b0: 7d 0a 20 20 7d 20 7b 0a 20 20 20 20 73 65 74 20  }.  } {.    set 
83c0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 7b 7d 0a 20  echo_module {}. 
83d0: 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65     do_execsql_te
83e0: 73 74 20 31 38 2e 24 74 6e 2e 31 20 24 73 71 6c  st 18.$tn.1 $sql
83f0: 20 24 72 65 73 0a 20 20 20 20 64 6f 5f 74 65 73   $res.    do_tes
8400: 74 20 20 20 20 20 20 20 20 20 31 38 2e 24 74 6e  t         18.$tn
8410: 2e 32 20 7b 20 6c 72 61 6e 67 65 20 24 3a 3a 65  .2 { lrange $::e
8420: 63 68 6f 5f 6d 6f 64 75 6c 65 20 32 20 65 6e 64  cho_module 2 end
8430: 20 7d 20 24 66 69 6c 74 65 72 0a 20 20 7d 0a 7d   } $filter.  }.}
8440: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
8450: 74 20 31 38 2e 32 2e 30 20 7b 20 20 50 52 41 47  t 18.2.0 {  PRAG
8460: 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  MA case_sensitiv
8470: 65 5f 6c 69 6b 65 20 3d 20 4f 4e 20 7d 0a 66 6f  e_like = ON }.fo
8480: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72 65  reach {tn sql re
8490: 73 20 66 69 6c 74 65 72 7d 20 7b 0a 20 20 32 2e  s filter} {.  2.
84a0: 31 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  1 "SELECT a FROM
84b0: 20 65 36 20 57 48 45 52 45 20 62 20 4c 49 4b 45   e6 WHERE b LIKE
84c0: 20 27 38 25 27 22 20 7b 33 20 34 7d 0a 20 20 20   '8%'" {3 4}.   
84d0: 20 7b 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43   {xFilter {SELEC
84e0: 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 20 46 52  T rowid, a, b FR
84f0: 4f 4d 20 27 74 36 27 20 57 48 45 52 45 20 62 20  OM 't6' WHERE b 
8500: 6c 69 6b 65 20 3f 7d 20 38 25 7d 0a 0a 20 20 32  like ?} 8%}..  2
8510: 2e 32 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f  .2 "SELECT a FRO
8520: 4d 20 65 36 20 57 48 45 52 45 20 62 20 4c 49 4b  M e6 WHERE b LIK
8530: 45 20 27 38 6a 25 27 22 20 7b 7d 0a 20 20 20 20  E '8j%'" {}.    
8540: 7b 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54  {xFilter {SELECT
8550: 20 72 6f 77 69 64 2c 20 61 2c 20 62 20 46 52 4f   rowid, a, b FRO
8560: 4d 20 27 74 36 27 20 57 48 45 52 45 20 62 20 3e  M 't6' WHERE b >
8570: 3d 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 41 4e  = ? AND b < ? AN
8580: 44 20 62 20 6c 69 6b 65 20 3f 7d 20 38 6a 20 38  D b like ?} 8j 8
8590: 6b 20 38 6a 25 7d 0a 0a 20 20 32 2e 33 20 22 53  k 8j%}..  2.3 "S
85a0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 36 20  ELECT a FROM e6 
85b0: 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 38 4a  WHERE b LIKE '8J
85c0: 25 27 22 20 7b 33 20 34 7d 0a 20 20 20 20 7b 78  %'" {3 4}.    {x
85d0: 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72  Filter {SELECT r
85e0: 6f 77 69 64 2c 20 61 2c 20 62 20 46 52 4f 4d 20  owid, a, b FROM 
85f0: 27 74 36 27 20 57 48 45 52 45 20 62 20 3e 3d 20  't6' WHERE b >= 
8600: 3f 20 41 4e 44 20 62 20 3c 20 3f 20 41 4e 44 20  ? AND b < ? AND 
8610: 62 20 6c 69 6b 65 20 3f 7d 20 38 4a 20 38 4b 20  b like ?} 8J 8K 
8620: 38 4a 25 7d 0a 7d 20 7b 0a 20 20 73 65 74 20 65  8J%}.} {.  set e
8630: 63 68 6f 5f 6d 6f 64 75 6c 65 20 7b 7d 0a 20 20  cho_module {}.  
8640: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8650: 31 38 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24 72  18.$tn.1 $sql $r
8660: 65 73 0a 20 20 64 6f 5f 74 65 73 74 20 20 20 20  es.  do_test    
8670: 20 20 20 20 20 31 38 2e 24 74 6e 2e 32 20 7b 20       18.$tn.2 { 
8680: 6c 72 61 6e 67 65 20 24 3a 3a 65 63 68 6f 5f 6d  lrange $::echo_m
8690: 6f 64 75 6c 65 20 32 20 65 6e 64 20 7d 20 24 66  odule 2 end } $f
86a0: 69 6c 74 65 72 0a 7d 0a 64 6f 5f 65 78 65 63 73  ilter.}.do_execs
86b0: 71 6c 5f 74 65 73 74 20 31 38 2e 32 2e 78 20 7b  ql_test 18.2.x {
86c0: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
86d0: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 4f  nsitive_like = O
86e0: 46 46 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  FF }..#---------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8730: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20  .# Test that an 
8740: 65 78 69 73 74 69 6e 67 20 6d 6f 64 75 6c 65 20  existing module 
8750: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 76 65 72 72  may not be overr
8760: 69 64 64 65 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74  idden..#.do_test
8770: 20 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65   19.1 {.  sqlite
8780: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
8790: 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f  register_echo_mo
87a0: 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f  dule [sqlite3_co
87b0: 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
87c0: 20 64 62 32 5d 0a 7d 20 53 51 4c 49 54 45 5f 4f   db2].} SQLITE_O
87d0: 4b 0a 64 6f 5f 74 65 73 74 20 31 39 2e 32 20 7b  K.do_test 19.2 {
87e0: 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63 68 6f  .  register_echo
87f0: 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 33  _module [sqlite3
8800: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e  _connection_poin
8810: 74 65 72 20 64 62 32 5d 0a 7d 20 53 51 4c 49 54  ter db2].} SQLIT
8820: 45 5f 4d 49 53 55 53 45 0a 64 6f 5f 74 65 73 74  E_MISUSE.do_test
8830: 20 31 39 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c   19.3 {.  db2 cl
8840: 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  ose.} {}..#-----
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8890: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
88a0: 20 74 68 65 20 62 75 67 20 66 69 78 65 64 20 62   the bug fixed b
88b0: 79 20 5b 62 30 63 31 62 61 36 35 35 64 36 39 5d  y [b0c1ba655d69]
88c0: 20 72 65 61 6c 6c 79 20 69 73 20 66 69 78 65 64   really is fixed
88d0: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
88e0: 65 73 74 20 32 30 2e 31 20 7b 0a 20 20 43 52 45  est 20.1 {.  CRE
88f0: 41 54 45 20 54 41 42 4c 45 20 74 37 20 28 61 2c  ATE TABLE t7 (a,
8900: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   b);.  CREATE TA
8910: 42 4c 45 20 74 38 20 28 63 2c 20 64 29 3b 0a 20  BLE t8 (c, d);. 
8920: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
8930: 20 4f 4e 20 74 37 28 61 29 3b 0a 20 20 43 52 45   ON t7(a);.  CRE
8940: 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20  ATE INDEX i3 ON 
8950: 74 37 28 62 29 3b 0a 20 20 43 52 45 41 54 45 20  t7(b);.  CREATE 
8960: 49 4e 44 45 58 20 69 34 20 4f 4e 20 74 38 28 63  INDEX i4 ON t8(c
8970: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
8980: 58 20 69 35 20 4f 4e 20 74 38 28 64 29 3b 0a 0a  X i5 ON t8(d);..
8990: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
89a0: 20 54 41 42 4c 45 20 74 37 76 20 55 53 49 4e 47   TABLE t7v USING
89b0: 20 65 63 68 6f 28 74 37 29 3b 0a 20 20 43 52 45   echo(t7);.  CRE
89c0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
89d0: 45 20 74 38 76 20 55 53 49 4e 47 20 65 63 68 6f  E t8v USING echo
89e0: 28 74 38 29 3b 0a 7d 0a 0a 64 6f 5f 74 65 73 74  (t8);.}..do_test
89f0: 20 32 30 2e 32 20 7b 0a 20 20 66 6f 72 20 7b 73   20.2 {.  for {s
8a00: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30  et i 0} {$i < 10
8a10: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
8a20: 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45     db eval {INSE
8a30: 52 54 20 49 4e 54 4f 20 74 37 20 56 41 4c 55 45  RT INTO t7 VALUE
8a40: 53 28 24 69 2c 20 24 69 29 7d 0a 20 20 20 20 64  S($i, $i)}.    d
8a50: 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49  b eval {INSERT I
8a60: 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28 24 69  NTO t8 VALUES($i
8a70: 2c 20 24 69 29 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a  , $i)}.  }.} {}.
8a80: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8a90: 20 32 30 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54   20.3 {.  SELECT
8aa0: 20 61 2c 20 62 20 46 52 4f 4d 20 28 0a 20 20 20   a, b FROM (.   
8ab0: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46     SELECT a, b F
8ac0: 52 4f 4d 20 74 37 20 57 48 45 52 45 20 61 3d 31  ROM t7 WHERE a=1
8ad0: 31 20 4f 52 20 62 3d 31 32 0a 20 20 20 20 20 20  1 OR b=12.      
8ae0: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20  UNION ALL.      
8af0: 53 45 4c 45 43 54 20 63 2c 20 64 20 46 52 4f 4d  SELECT c, d FROM
8b00: 20 74 38 20 57 48 45 52 45 20 63 3d 35 20 4f 52   t8 WHERE c=5 OR
8b10: 20 64 3d 36 0a 20 20 29 0a 20 20 4f 52 44 45 52   d=6.  ).  ORDER
8b20: 20 42 59 20 31 2c 20 32 3b 0a 7d 20 7b 35 20 35   BY 1, 2;.} {5 5
8b30: 20 36 20 36 20 31 31 20 31 31 20 31 32 20 31 32   6 6 11 11 12 12
8b40: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
8b50: 73 74 20 32 30 2e 34 20 7b 0a 20 20 53 45 4c 45  st 20.4 {.  SELE
8b60: 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 28 0a 20  CT a, b FROM (. 
8b70: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62       SELECT a, b
8b80: 20 46 52 4f 4d 20 74 37 76 20 57 48 45 52 45 20   FROM t7v WHERE 
8b90: 61 3d 31 31 20 4f 52 20 62 3d 31 32 0a 20 20 20  a=11 OR b=12.   
8ba0: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20     UNION ALL.   
8bb0: 20 20 20 53 45 4c 45 43 54 20 63 2c 20 64 20 46     SELECT c, d F
8bc0: 52 4f 4d 20 74 38 76 20 57 48 45 52 45 20 63 3d  ROM t8v WHERE c=
8bd0: 35 20 4f 52 20 64 3d 36 0a 20 20 29 0a 20 20 4f  5 OR d=6.  ).  O
8be0: 52 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 7d 20  RDER BY 1, 2;.} 
8bf0: 7b 35 20 35 20 36 20 36 20 31 31 20 31 31 20 31  {5 5 6 6 11 11 1
8c00: 32 20 31 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  2 12}..#--------
8c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c50: 2d 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  -.#.do_execsql_t
8c60: 65 73 74 20 32 31 2e 31 20 7b 0a 20 20 43 52 45  est 21.1 {.  CRE
8c70: 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 2c 62  ATE TABLE t9(a,b
8c80: 2c 63 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49  ,c);.  CREATE VI
8c90: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 39 76 20  RTUAL TABLE t9v 
8ca0: 55 53 49 4e 47 20 65 63 68 6f 28 74 39 29 3b 0a  USING echo(t9);.
8cb0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
8cc0: 39 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b  9 VALUES(1,2,3);
8cd0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
8ce0: 39 20 56 41 4c 55 45 53 28 33 2c 32 2c 31 29 3b  9 VALUES(3,2,1);
8cf0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
8d00: 39 20 56 41 4c 55 45 53 28 32 2c 32 2c 32 29 3b  9 VALUES(2,2,2);
8d10: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
8d20: 65 73 74 20 32 31 2e 32 20 7b 0a 20 20 53 45 4c  est 21.2 {.  SEL
8d30: 45 43 54 20 2a 20 46 52 4f 4d 20 74 39 76 20 57  ECT * FROM t9v W
8d40: 48 45 52 45 20 61 3c 62 3b 0a 7d 20 7b 31 20 32  HERE a<b;.} {1 2
8d50: 20 33 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   3}..do_execsql_
8d60: 74 65 73 74 20 32 31 2e 33 20 7b 0a 20 20 53 45  test 21.3 {.  SE
8d70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 39 76 20  LECT * FROM t9v 
8d80: 57 48 45 52 45 20 61 3d 62 3b 0a 7d 20 7b 32 20  WHERE a=b;.} {2 
8d90: 32 20 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  2 2}..#---------
8da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8de0: 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  .# At one point 
8df0: 65 78 65 63 75 74 69 6e 67 20 61 20 43 52 45 41  executing a CREA
8e00: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
8e10: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
8e20: 73 70 65 63 69 66 69 65 64 20 0a 23 20 61 20 64  specified .# a d
8e30: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 62 75 74  atabase name but
8e40: 20 6e 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c   no virtual tabl
8e50: 65 20 61 72 67 75 6d 65 6e 74 73 20 77 61 73 20  e arguments was 
8e60: 63 61 75 73 69 6e 67 20 61 6e 20 69 6e 74 65 72  causing an inter
8e70: 6e 61 6c 0a 23 20 62 75 66 66 65 72 20 6f 76 65  nal.# buffer ove
8e80: 72 72 65 61 64 2e 20 56 61 6c 67 72 69 6e 64 20  rread. Valgrind 
8e90: 77 6f 75 6c 64 20 72 65 70 6f 72 74 20 65 72 72  would report err
8ea0: 6f 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e  ors while runnin
8eb0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
8ec0: 0a 23 20 74 65 73 74 73 2e 20 53 70 65 63 69 66  .# tests. Specif
8ed0: 69 63 61 6c 6c 79 3a 0a 23 0a 23 20 20 20 43 52  ically:.#.#   CR
8ee0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
8ef0: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34  LE t1 USING fts4
8f00: 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20 4f 6b  ;          -- Ok
8f10: 20 2d 20 6e 6f 20 64 62 20 6e 61 6d 65 2e 0a 23   - no db name..#
8f20: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
8f30: 4c 20 54 41 42 4c 45 20 6d 61 69 6e 2e 74 31 20  L TABLE main.t1 
8f40: 55 53 49 4e 47 20 66 74 73 34 28 78 29 3b 20 20  USING fts4(x);  
8f50: 2d 2d 20 4f 6b 20 2d 20 68 61 73 20 76 74 61 62  -- Ok - has vtab
8f60: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23 20 20 20   arguments..#   
8f70: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
8f80: 41 42 4c 45 20 6d 61 69 6e 2e 74 31 20 55 53 49  ABLE main.t1 USI
8f90: 4e 47 20 66 74 73 34 3b 20 20 20 20 20 2d 2d 20  NG fts4;     -- 
8fa0: 48 61 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  Had the problem.
8fb0: 20 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 66 74   .#.ifcapable ft
8fc0: 73 33 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65  s3 {.  forcedele
8fd0: 74 65 20 74 65 73 74 2e 64 62 32 0a 20 20 73 65  te test.db2.  se
8fe0: 74 20 6e 6d 20 5b 73 74 72 69 6e 67 20 72 65 70  t nm [string rep
8ff0: 65 61 74 20 61 62 63 64 65 66 67 68 69 6a 20 31  eat abcdefghij 1
9000: 30 30 5d 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  00].  do_execsql
9010: 5f 74 65 73 74 20 32 32 2e 31 20 7b 0a 20 20 20  _test 22.1 {.   
9020: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
9030: 32 27 20 41 53 20 24 6e 6d 0a 20 20 7d 0a 20 20  2' AS $nm.  }.  
9040: 0a 20 20 65 78 65 63 73 71 6c 20 22 53 45 4c 45  .  execsql "SELE
9050: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
9060: 5f 6d 61 73 74 65 72 22 0a 20 20 64 6f 5f 65 78  _master".  do_ex
9070: 65 63 73 71 6c 5f 74 65 73 74 20 32 32 2e 32 20  ecsql_test 22.2 
9080: 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
9090: 54 41 42 4c 45 20 24 7b 6e 6d 7d 2e 74 31 20 55  TABLE ${nm}.t1 U
90a0: 53 49 4e 47 20 66 74 73 34 22 0a 20 20 0a 20 20  SING fts4".  .  
90b0: 64 6f 5f 74 65 73 74 20 32 32 2e 33 2e 31 20 7b  do_test 22.3.1 {
90c0: 0a 20 20 20 20 73 65 74 20 73 71 6c 20 22 43 52  .    set sql "CR
90d0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
90e0: 4c 45 20 24 7b 6e 6d 7d 2e 74 32 20 55 53 49 4e  LE ${nm}.t2 USIN
90f0: 47 20 66 74 73 34 22 0a 20 20 20 20 73 65 74 20  G fts4".    set 
9100: 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72  stmt [sqlite3_pr
9110: 65 70 61 72 65 5f 76 32 20 64 62 20 24 73 71 6c  epare_v2 db $sql
9120: 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 20 20 73   -1 dummy].    s
9130: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 73 74 6d  qlite3_step $stm
9140: 74 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 44 4f  t.  } {SQLITE_DO
9150: 4e 45 7d 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74  NE}.  .  do_test
9160: 20 32 32 2e 33 2e 32 20 7b 0a 20 20 20 20 73 71   22.3.2 {.    sq
9170: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
9180: 73 74 6d 74 0a 20 20 7d 20 7b 53 51 4c 49 54 45  stmt.  } {SQLITE
9190: 5f 4f 4b 7d 0a 20 20 0a 20 20 64 6f 5f 74 65 73  _OK}.  .  do_tes
91a0: 74 20 32 32 2e 34 2e 31 20 7b 0a 20 20 20 20 73  t 22.4.1 {.    s
91b0: 65 74 20 73 71 6c 20 22 43 52 45 41 54 45 20 56  et sql "CREATE V
91c0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 24 7b 6e  IRTUAL TABLE ${n
91d0: 6d 7d 2e 74 33 20 55 53 49 4e 47 20 66 74 73 34  m}.t3 USING fts4
91e0: 22 0a 20 20 20 20 73 65 74 20 6e 20 5b 73 74 72  ".    set n [str
91f0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 71 6c 5d  ing length $sql]
9200: 0a 20 20 20 20 73 65 74 20 73 74 6d 74 20 5b 73  .    set stmt [s
9210: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 64  qlite3_prepare d
9220: 62 20 22 24 7b 73 71 6c 7d 78 79 7a 22 20 24 6e  b "${sql}xyz" $n
9230: 20 64 75 6d 6d 79 5d 0a 20 20 20 20 73 71 6c 69   dummy].    sqli
9240: 74 65 33 5f 73 74 65 70 20 24 73 74 6d 74 0a 20  te3_step $stmt. 
9250: 20 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d   } {SQLITE_DONE}
9260: 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 32 32  .  .  do_test 22
9270: 2e 34 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74  .4.2 {.    sqlit
9280: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d  e3_finalize $stm
9290: 74 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b  t.  } {SQLITE_OK
92a0: 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}...#---------
92b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92f0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
9300: 20 74 65 73 74 73 20 76 65 72 69 66 79 20 74 68   tests verify th
9310: 61 74 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  at a DROP TABLE 
9320: 63 6f 6d 6d 61 6e 64 20 6f 6e 20 61 20 76 69 72  command on a vir
9330: 74 75 61 6c 0a 23 20 74 61 62 6c 65 20 64 6f 65  tual.# table doe
9340: 73 20 6e 6f 74 20 63 61 75 73 65 20 6f 74 68 65  s not cause othe
9350: 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  r operations to 
9360: 63 72 61 73 68 2e 0a 23 0a 23 20 20 20 32 33 2e  crash..#.#   23.
9370: 31 3a 20 44 72 6f 70 70 69 6e 67 20 61 20 76 74  1: Dropping a vt
9380: 61 62 20 77 68 69 6c 65 20 61 20 53 45 4c 45 43  ab while a SELEC
9390: 54 20 69 73 20 72 75 6e 6e 69 6e 67 20 6f 6e 20  T is running on 
93a0: 69 74 2e 0a 23 0a 23 20 20 20 32 33 2e 32 3a 20  it..#.#   23.2: 
93b0: 44 72 6f 70 70 69 6e 67 20 61 20 76 74 61 62 20  Dropping a vtab 
93c0: 77 68 69 6c 65 20 61 20 53 45 4c 45 43 54 20 74  while a SELECT t
93d0: 68 61 74 20 77 69 6c 6c 2c 20 62 75 74 20 68 61  hat will, but ha
93e0: 73 20 6e 6f 74 20 79 65 74 2c 0a 23 20 20 20 20  s not yet,.#    
93f0: 20 20 20 20 20 6f 70 65 6e 20 61 20 63 75 72 73       open a curs
9400: 6f 72 20 6f 6e 20 74 68 65 20 76 74 61 62 2c 20  or on the vtab, 
9410: 69 73 20 72 75 6e 6e 69 6e 67 2e 20 49 6e 20 74  is running. In t
9420: 68 69 73 20 63 61 73 65 20 74 68 65 0a 23 20 20  his case the.#  
9430: 20 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c         DROP TABL
9440: 45 20 73 75 63 63 65 65 64 73 20 61 6e 64 20 74  E succeeds and t
9450: 68 65 20 53 45 4c 45 43 54 20 68 69 74 73 20 61  he SELECT hits a
9460: 6e 20 65 72 72 6f 72 2e 0a 23 20 20 20 0a 23 20  n error..#   .# 
9470: 20 20 32 33 2e 33 3a 20 44 72 6f 70 70 69 6e 67    23.3: Dropping
9480: 20 61 20 76 74 61 62 20 66 72 6f 6d 20 77 69 74   a vtab from wit
9490: 68 69 6e 20 61 20 75 73 65 72 2d 64 65 66 69 6e  hin a user-defin
94a0: 65 64 2d 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ed-function call
94b0: 62 61 63 6b 0a 23 20 20 20 20 20 20 20 20 20 69  back.#         i
94c0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
94d0: 61 6e 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  an "INSERT INTO 
94e0: 76 74 61 62 20 53 45 4c 45 43 54 20 2e 2e 2e 22  vtab SELECT ..."
94f0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 72 65   statement..#.re
9500: 73 65 74 5f 64 62 0a 6c 6f 61 64 5f 73 74 61 74  set_db.load_stat
9510: 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 64 62 20  ic_extension db 
9520: 77 68 6f 6c 65 6e 75 6d 62 65 72 0a 6c 6f 61 64  wholenumber.load
9530: 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  _static_extensio
9540: 6e 20 64 62 20 65 76 61 6c 0a 72 65 67 69 73 74  n db eval.regist
9550: 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 64  er_echo_module d
9560: 62 0a 0a 64 6f 5f 74 65 73 74 20 32 33 2e 31 20  b..do_test 23.1 
9570: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52  {.  execsql { CR
9580: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
9590: 4c 45 20 74 31 20 55 53 49 4e 47 20 77 68 6f 6c  LE t1 USING whol
95a0: 65 6e 75 6d 62 65 72 20 7d 0a 20 20 73 65 74 20  enumber }.  set 
95b0: 72 65 73 20 22 22 0a 20 20 64 62 20 65 76 61 6c  res "".  db eval
95c0: 20 7b 20 53 45 4c 45 43 54 20 76 61 6c 75 65 20   { SELECT value 
95d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 76 61  FROM t1 WHERE va
95e0: 6c 75 65 3c 31 30 20 7d 20 7b 0a 20 20 20 20 69  lue<10 } {.    i
95f0: 66 20 7b 24 76 61 6c 75 65 20 3d 3d 20 35 7d 20  f {$value == 5} 
9600: 7b 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 20  {.      set res 
9610: 5b 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50  [catchsql { DROP
9620: 20 54 41 42 4c 45 20 74 31 20 7d 5d 0a 20 20 20   TABLE t1 }].   
9630: 20 7d 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 73   }.  }.  set res
9640: 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20  .} {1 {database 
9650: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 7d  table is locked}
9660: 7d 0a 0a 64 6f 5f 74 65 73 74 20 32 33 2e 32 20  }..do_test 23.2 
9670: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
9680: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9690: 74 32 28 76 61 6c 75 65 29 3b 0a 20 20 20 20 49  t2(value);.    I
96a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
96b0: 4c 55 45 53 28 31 29 2c 20 28 32 29 2c 20 28 33  LUES(1), (2), (3
96c0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 65  );.  }..  set re
96d0: 73 32 20 5b 6c 69 73 74 20 5b 63 61 74 63 68 20  s2 [list [catch 
96e0: 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a  {.    db eval {.
96f0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 76 61 6c        SELECT val
9700: 75 65 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e  ue FROM t2 UNION
9710: 20 41 4c 4c 20 0a 20 20 20 20 20 20 53 45 4c 45   ALL .      SELE
9720: 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 31  CT value FROM t1
9730: 20 57 48 45 52 45 20 76 61 6c 75 65 3c 31 30 0a   WHERE value<10.
9740: 20 20 20 20 7d 20 7b 0a 20 20 20 20 20 20 69 66      } {.      if
9750: 20 7b 24 76 61 6c 75 65 20 3d 3d 20 32 7d 20 7b   {$value == 2} {
9760: 20 73 65 74 20 72 65 73 31 20 5b 63 61 74 63 68   set res1 [catch
9770: 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45  sql { DROP TABLE
9780: 20 74 31 20 7d 5d 20 7d 0a 20 20 20 20 7d 0a 20   t1 }] }.    }. 
9790: 20 7d 20 6d 73 67 5d 20 24 6d 73 67 5d 0a 20 20   } msg] $msg].  
97a0: 6c 69 73 74 20 24 72 65 73 31 20 24 72 65 73 32  list $res1 $res2
97b0: 0a 7d 20 7b 7b 30 20 7b 7d 7d 20 7b 31 20 7b 64  .} {{0 {}} {1 {d
97c0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
97d0: 20 6c 6f 63 6b 65 64 7d 7d 7d 0a 0a 64 6f 5f 74   locked}}}..do_t
97e0: 65 73 74 20 32 33 2e 33 2e 31 20 7b 0a 20 20 65  est 23.3.1 {.  e
97f0: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
9800: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31  VIRTUAL TABLE t1
9810: 65 20 55 53 49 4e 47 20 65 63 68 6f 28 74 32 29  e USING echo(t2)
9820: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   }.  execsql { I
9830: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 65 20 53  NSERT INTO t1e S
9840: 45 4c 45 43 54 20 34 20 7d 0a 20 20 63 61 74 63  ELECT 4 }.  catc
9850: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
9860: 54 4f 20 74 31 65 20 53 45 4c 45 43 54 20 65 76  TO t1e SELECT ev
9870: 61 6c 28 27 44 52 4f 50 20 54 41 42 4c 45 20 74  al('DROP TABLE t
9880: 31 65 27 29 20 7d 0a 7d 20 7b 31 20 7b 64 61 74  1e') }.} {1 {dat
9890: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
98a0: 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 65 78 65 63 73  ocked}}.do_execs
98b0: 71 6c 5f 74 65 73 74 20 32 33 2e 33 2e 32 20 7b  ql_test 23.3.2 {
98c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
98d0: 31 65 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 0a  1e } {1 2 3 4}..
98e0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
98f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 74 20  ----------.# At 
9930: 6f 6e 65 20 70 6f 69 6e 74 20 53 51 4c 20 6c 69  one point SQL li
9940: 6b 65 20 74 68 69 73 3a 0a 23 0a 23 20 20 20 53  ke this:.#.#   S
9950: 41 56 45 50 4f 49 4e 54 20 78 79 7a 3b 20 20 20  AVEPOINT xyz;   
9960: 20 20 20 20 2d 2d 20 4f 70 65 6e 73 20 53 51 4c      -- Opens SQL
9970: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 20   transaction.#  
9980: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 76     INSERT INTO v
9990: 74 61 62 20 20 20 2d 2d 20 57 72 69 74 65 20 74  tab   -- Write t
99a0: 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  o virtual table.
99b0: 23 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  #     ROLLBACK T
99c0: 4f 20 78 79 7a 3b 0a 23 20 20 20 52 45 4c 45 41  O xyz;.#   RELEA
99d0: 53 45 20 78 79 7a 3b 0a 23 0a 23 20 77 61 73 20  SE xyz;.#.# was 
99e0: 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
99f0: 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 29 20 63   xRollbackTo() c
9a00: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
9a10: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 0a 23 20 6f  ROLLBACK TO .# o
9a20: 70 65 72 61 74 69 6f 6e 2e 20 57 68 69 63 68 20  peration. Which 
9a30: 6d 65 61 6e 74 20 74 68 61 74 20 76 69 72 74 75  meant that virtu
9a40: 61 6c 20 74 61 62 6c 65 73 20 6c 69 6b 65 20 46  al tables like F
9a50: 54 53 33 20 77 6f 75 6c 64 20 69 6e 63 6f 72 72  TS3 would incorr
9a60: 65 63 74 6c 79 20 0a 23 20 63 6f 6d 6d 69 74 20  ectly .# commit 
9a70: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
9a80: 68 65 20 49 4e 53 45 52 54 20 61 73 20 70 61 72  he INSERT as par
9a90: 74 20 6f 66 20 74 68 65 20 22 52 45 4c 45 41 53  t of the "RELEAS
9aa0: 45 20 78 79 7a 22 20 63 6f 6d 6d 61 6e 64 2e 0a  E xyz" command..
9ab0: 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  #.# The followin
9ac0: 67 20 74 65 73 74 73 20 63 68 65 63 6b 20 74 68  g tests check th
9ad0: 61 74 20 74 68 69 73 20 68 61 73 20 62 65 65 6e  at this has been
9ae0: 20 66 69 78 65 64 2e 0a 23 0a 69 66 63 61 70 61   fixed..#.ifcapa
9af0: 62 6c 65 20 66 74 73 33 20 7b 0a 20 20 64 6f 5f  ble fts3 {.  do_
9b00: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 34 2e  execsql_test 24.
9b10: 30 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56  0 {.    CREATE V
9b20: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 34 20  IRTUAL TABLE t4 
9b30: 55 53 49 4e 47 20 66 74 73 33 28 29 3b 0a 20 20  USING fts3();.  
9b40: 20 20 53 41 56 45 50 4f 49 4e 54 20 61 3b 0a 20    SAVEPOINT a;. 
9b50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9b60: 34 20 56 41 4c 55 45 53 28 27 61 20 62 20 63 27  4 VALUES('a b c'
9b70: 29 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  );.    ROLLBACK 
9b80: 54 4f 20 61 3b 0a 20 20 20 20 52 45 4c 45 41 53  TO a;.    RELEAS
9b90: 45 20 61 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  E a;.    SELECT 
9ba0: 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b  * FROM t4;.  } {
9bb0: 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  }..  do_execsql_
9bc0: 74 65 73 74 20 32 34 2e 31 20 7b 20 53 45 4c 45  test 24.1 { SELE
9bd0: 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 57 48 45  CT * FROM t4 WHE
9be0: 52 45 20 74 34 20 4d 41 54 43 48 20 27 62 27 20  RE t4 MATCH 'b' 
9bf0: 7d 20 7b 7d 0a 20 20 64 6f 5f 65 78 65 63 73 71  } {}.  do_execsq
9c00: 6c 5f 74 65 73 74 20 32 34 2e 32 20 7b 20 49 4e  l_test 24.2 { IN
9c10: 53 45 52 54 20 49 4e 54 4f 20 74 34 28 74 34 29  SERT INTO t4(t4)
9c20: 20 56 41 4c 55 45 53 28 27 69 6e 74 65 67 72 69   VALUES('integri
9c30: 74 79 2d 63 68 65 63 6b 27 29 20 7d 20 7b 7d 0a  ty-check') } {}.
9c40: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
9c50: 73 74 20 32 34 2e 33 20 7b 0a 20 20 20 20 53 41  st 24.3 {.    SA
9c60: 56 45 50 4f 49 4e 54 20 61 3b 0a 20 20 20 20 43  VEPOINT a;.    C
9c70: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
9c80: 42 4c 45 20 74 35 20 55 53 49 4e 47 20 66 74 73  BLE t5 USING fts
9c90: 33 28 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49  3();.    SAVEPOI
9ca0: 4e 54 20 62 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  NT b;.    ROLLBA
9cb0: 43 4b 20 54 4f 20 61 3b 0a 20 20 20 20 53 41 56  CK TO a;.    SAV
9cc0: 45 50 4f 49 4e 54 20 63 3b 0a 20 20 20 20 52 45  EPOINT c;.    RE
9cd0: 4c 45 41 53 45 20 61 3b 0a 20 20 7d 0a 7d 0a 0a  LEASE a;.  }.}..
9ce0: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.