/ Hex Artifact Content
Login

Artifact 6210e076997f176bedc300a87ad6404651b601dd:


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 20 7b  test vtab1-3.8 {
2750: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2760: 20 53 45 4c 45 43 54 20 61 20 41 53 20 64 2c 20   SELECT a AS d, 
2770: 62 20 41 53 20 65 2c 20 63 20 41 53 20 66 20 46  b AS e, c AS f F
2780: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
2790: 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 23 20 45   2 3 4 5 6}..# E
27a0: 78 65 63 75 74 65 20 73 6f 6d 65 20 53 45 4c 45  xecute some SELE
27b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69  CT statements wi
27c0: 74 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  th WHERE clauses
27d0: 20 6f 6e 20 74 68 65 20 74 31 20 74 61 62 6c 65   on the t1 table
27e0: 2e 0a 23 20 54 68 65 6e 20 63 68 65 63 6b 20 74  ..# Then check t
27f0: 68 65 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 76  he echo_module v
2800: 61 72 69 61 62 6c 65 20 28 77 72 69 74 74 65 6e  ariable (written
2810: 20 74 6f 20 62 79 20 74 68 65 20 6d 6f 64 75 6c   to by the modul
2820: 65 20 6d 65 74 68 6f 64 73 0a 23 20 69 6e 20 74  e methods.# in t
2830: 65 73 74 38 2e 63 29 20 74 6f 20 6d 61 6b 65 20  est8.c) to make 
2840: 73 75 72 65 20 74 68 65 20 78 42 65 73 74 49 6e  sure the xBestIn
2850: 64 65 78 28 29 20 61 6e 64 20 78 46 69 6c 74 65  dex() and xFilte
2860: 72 28 29 20 6d 65 74 68 6f 64 73 20 77 65 72 65  r() methods were
2870: 0a 23 20 63 61 6c 6c 65 64 20 63 6f 72 72 65 63  .# called correc
2880: 74 6c 79 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76  tly..#.do_test v
2890: 74 61 62 31 2d 33 2e 38 20 7b 0a 20 20 73 65 74  tab1-3.8 {.  set
28a0: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a   echo_module "".
28b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
28c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
28d0: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f  ;.  }.  set echo
28e0: 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20  _module.} [list 
28f0: 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45  xBestIndex {SELE
2900: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
2910: 20 27 74 72 65 61 6c 27 7d 20 5c 0a 20 20 20 20   'treal'} \.    
2920: 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b      xFilter    {
2930: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
2940: 46 52 4f 4d 20 27 74 72 65 61 6c 27 7d 20 5d 0a  FROM 'treal'} ].
2950: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e  do_test vtab1-3.
2960: 39 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  9 {.  set echo_m
2970: 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73  odule "".  execs
2980: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2990: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
29a0: 62 20 3d 20 35 3b 0a 20 20 7d 0a 7d 20 7b 34 20  b = 5;.  }.} {4 
29b0: 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  5 6}.do_test vta
29c0: 62 31 2d 33 2e 31 30 20 7b 0a 20 20 73 65 74 20  b1-3.10 {.  set 
29d0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c  echo_module.} [l
29e0: 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b  ist xBestIndex {
29f0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
2a00: 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45  FROM 'treal' WHE
2a10: 52 45 20 62 20 3d 20 3f 7d 20 20 20 5c 0a 20 20  RE b = ?}   \.  
2a20: 20 20 20 20 20 20 78 46 69 6c 74 65 72 20 20 20        xFilter   
2a30: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
2a40: 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57  * FROM 'treal' W
2a50: 48 45 52 45 20 62 20 3d 20 3f 7d 20 35 20 5d 0a  HERE b = ?} 5 ].
2a60: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e  do_test vtab1-3.
2a70: 31 30 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  10 {.  set echo_
2a80: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63  module "".  exec
2a90: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
2aa0: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
2ab0: 20 62 20 3e 3d 20 35 20 41 4e 44 20 62 20 3c 3d   b >= 5 AND b <=
2ac0: 20 31 30 3b 0a 20 20 7d 0a 7d 20 7b 34 20 35 20   10;.  }.} {4 5 
2ad0: 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  6}.do_test vtab1
2ae0: 2d 33 2e 31 31 20 7b 0a 20 20 73 65 74 20 65 63  -3.11 {.  set ec
2af0: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
2b00: 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45  t xBestIndex {SE
2b10: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
2b20: 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52 45  OM 'treal' WHERE
2b30: 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c 3d   b >= ? AND b <=
2b40: 20 3f 7d 20 20 20 20 20 20 5c 0a 20 20 20 20 20   ?}      \.     
2b50: 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53     xFilter    {S
2b60: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
2b70: 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45 52  ROM 'treal' WHER
2b80: 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c  E b >= ? AND b <
2b90: 3d 20 3f 7d 20 35 20 31 30 20 5d 0a 64 6f 5f 74  = ?} 5 10 ].do_t
2ba0: 65 73 74 20 76 74 61 62 31 2d 33 2e 31 32 20 7b  est vtab1-3.12 {
2bb0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
2bc0: 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20  le "".  execsql 
2bd0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
2be0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 20 42  ROM t1 WHERE b B
2bf0: 45 54 57 45 45 4e 20 32 20 41 4e 44 20 31 30 3b  ETWEEN 2 AND 10;
2c00: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20  .  }.} {1 2 3 4 
2c10: 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61  5 6}.do_test vta
2c20: 62 31 2d 33 2e 31 33 20 7b 0a 20 20 73 65 74 20  b1-3.13 {.  set 
2c30: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c  echo_module.} [l
2c40: 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 7b  ist xBestIndex {
2c50: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
2c60: 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45  FROM 'treal' WHE
2c70: 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20  RE b >= ? AND b 
2c80: 3c 3d 20 3f 7d 20 20 20 20 20 20 5c 0a 20 20 20  <= ?}      \.   
2c90: 20 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20       xFilter    
2ca0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
2cb0: 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48   FROM 'treal' WH
2cc0: 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62  ERE b >= ? AND b
2cd0: 20 3c 3d 20 3f 7d 20 32 20 31 30 20 5d 0a 0a 23   <= ?} 2 10 ]..#
2ce0: 20 41 64 64 20 61 20 66 75 6e 63 74 69 6f 6e 20   Add a function 
2cf0: 66 6f 72 20 74 68 65 20 4d 41 54 43 48 20 6f 70  for the MATCH op
2d00: 65 72 61 74 6f 72 2e 20 45 76 65 72 79 74 68 69  erator. Everythi
2d10: 6e 67 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65  ng always matche
2d20: 73 21 0a 23 70 72 6f 63 20 74 65 73 74 5f 6d 61  s!.#proc test_ma
2d30: 74 63 68 20 7b 6c 68 73 20 72 68 73 7d 20 7b 0a  tch {lhs rhs} {.
2d40: 23 20 20 6c 61 70 70 65 6e 64 20 3a 3a 65 63 68  #  lappend ::ech
2d50: 6f 5f 6d 6f 64 75 6c 65 20 4d 41 54 43 48 20 24  o_module MATCH $
2d60: 6c 68 73 20 24 72 68 73 0a 23 20 20 72 65 74 75  lhs $rhs.#  retu
2d70: 72 6e 20 31 0a 23 7d 0a 23 64 62 20 66 75 6e 63  rn 1.#}.#db func
2d80: 74 69 6f 6e 20 6d 61 74 63 68 20 74 65 73 74 5f  tion match test_
2d90: 6d 61 74 63 68 0a 0a 73 65 74 20 65 63 68 6f 5f  match..set echo_
2da0: 6d 6f 64 75 6c 65 20 22 22 0a 64 6f 5f 74 65 73  module "".do_tes
2db0: 74 20 76 74 61 62 31 2d 33 2e 31 32 20 7b 0a 20  t vtab1-3.12 {. 
2dc0: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
2dd0: 20 22 22 0a 20 20 63 61 74 63 68 73 71 6c 20 7b   "".  catchsql {
2de0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2df0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 4d 41  OM t1 WHERE a MA
2e00: 54 43 48 20 27 73 74 72 69 6e 67 27 3b 0a 20 20  TCH 'string';.  
2e10: 7d 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74  }.} {1 {unable t
2e20: 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d  o use function M
2e30: 41 54 43 48 20 69 6e 20 74 68 65 20 72 65 71 75  ATCH in the requ
2e40: 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d 0a  ested context}}.
2e50: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e  do_test vtab1-3.
2e60: 31 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  13 {.  set echo_
2e70: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78  module.} [list x
2e80: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43  BestIndex {SELEC
2e90: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
2ea0: 27 74 72 65 61 6c 27 7d 20 5c 0a 20 20 20 20 20  'treal'} \.     
2eb0: 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53     xFilter    {S
2ec0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
2ed0: 52 4f 4d 20 27 74 72 65 61 6c 27 7d 5d 0a 69 66  ROM 'treal'}].if
2ee0: 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79  capable subquery
2ef0: 20 7b 0a 23 20 54 68 65 20 65 63 68 6f 20 6d 6f   {.# The echo mo
2f00: 64 75 6c 65 20 75 73 65 73 20 61 20 73 75 62 71  dule uses a subq
2f10: 75 65 72 79 20 69 6e 74 65 72 6e 61 6c 6c 79 20  uery internally 
2f20: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2f30: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e   MATCH operator.
2f40: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33  .do_test vtab1-3
2f50: 2e 31 34 20 7b 0a 20 20 73 65 74 20 65 63 68 6f  .14 {.  set echo
2f60: 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65  _module "".  exe
2f70: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2f80: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
2f90: 45 20 62 20 4d 41 54 43 48 20 27 73 74 72 69 6e  E b MATCH 'strin
2fa0: 67 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  g';.  }.} {}.do_
2fb0: 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31 35 20  test vtab1-3.15 
2fc0: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
2fd0: 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73  ule.} [list xBes
2fe0: 74 49 6e 64 65 78 20 5c 0a 20 20 20 20 20 20 20  tIndex \.       
2ff0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
3000: 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57  * FROM 'treal' W
3010: 48 45 52 45 20 62 20 4c 49 4b 45 20 28 53 45 4c  HERE b LIKE (SEL
3020: 45 43 54 20 27 25 27 7c 7c 3f 7c 7c 27 25 27 29  ECT '%'||?||'%')
3030: 7d 20 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69  }  \.        xFi
3040: 6c 74 65 72 20 5c 0a 20 20 20 20 20 20 20 20 7b  lter \.        {
3050: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
3060: 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 57 48 45  FROM 'treal' WHE
3070: 52 45 20 62 20 4c 49 4b 45 20 28 53 45 4c 45 43  RE b LIKE (SELEC
3080: 54 20 27 25 27 7c 7c 3f 7c 7c 27 25 27 29 7d 20  T '%'||?||'%')} 
3090: 5c 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67  \.        string
30a0: 20 5d 0a 7d 3b 20 23 69 66 63 61 70 61 62 6c 65   ].}; #ifcapable
30b0: 20 73 75 62 71 75 65 72 79 0a 0a 23 2d 2d 2d 2d   subquery..#----
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 20 76  --.# Test case v
3110: 74 61 62 31 2d 33 20 74 65 73 74 20 74 61 62 6c  tab1-3 test tabl
3120: 65 20 73 63 61 6e 73 20 61 6e 64 20 74 68 65 20  e scans and the 
3130: 65 63 68 6f 20 6d 6f 64 75 6c 65 27 73 20 0a 23  echo module's .#
3140: 20 78 42 65 73 74 49 6e 64 65 78 2f 78 46 69 6c   xBestIndex/xFil
3150: 74 65 72 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  ter handling of 
3160: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
3170: 2e 0a 0a 23 20 54 68 69 73 20 70 72 6f 63 65 64  ...# This proced
3180: 75 72 65 20 65 78 65 63 75 74 65 73 20 74 68 65  ure executes the
3190: 20 53 51 4c 2e 20 20 54 68 65 6e 20 69 74 20 63   SQL.  Then it c
31a0: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
31b0: 74 68 65 20 4f 50 5f 53 6f 72 74 0a 23 20 6f 70  the OP_Sort.# op
31c0: 63 6f 64 65 20 77 61 73 20 65 78 65 63 75 74 65  code was execute
31d0: 64 2e 20 20 49 66 20 61 6e 20 4f 50 5f 53 6f 72  d.  If an OP_Sor
31e0: 74 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  t did occur, the
31f0: 6e 20 22 73 6f 72 74 22 20 69 73 20 61 70 70 65  n "sort" is appe
3200: 6e 64 65 64 0a 23 20 74 6f 20 74 68 65 20 72 65  nded.# to the re
3210: 73 75 6c 74 2e 20 20 49 66 20 6e 6f 20 4f 50 5f  sult.  If no OP_
3220: 53 6f 72 74 20 68 61 70 70 65 6e 65 64 2c 20 74  Sort happened, t
3230: 68 65 6e 20 22 6e 6f 73 6f 72 74 22 20 69 73 20  hen "nosort" is 
3240: 61 70 70 65 6e 64 65 64 2e 0a 23 0a 23 20 54 68  appended..#.# Th
3250: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
3260: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f  used to check to
3270: 20 6d 61 6b 65 20 73 75 72 65 20 73 6f 72 74 69   make sure sorti
3280: 6e 67 20 69 73 20 6f 72 20 69 73 20 6e 6f 74 0a  ng is or is not.
3290: 23 20 6f 63 63 75 72 72 69 6e 67 20 61 73 20 65  # occurring as e
32a0: 78 70 65 63 74 65 64 2e 0a 23 0a 70 72 6f 63 20  xpected..#.proc 
32b0: 63 6b 73 6f 72 74 20 7b 73 71 6c 7d 20 7b 0a 20  cksort {sql} {. 
32c0: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f 73 6f   set ::sqlite_so
32d0: 72 74 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65 74  rt_count 0.  set
32e0: 20 64 61 74 61 20 5b 65 78 65 63 73 71 6c 20 24   data [execsql $
32f0: 73 71 6c 5d 0a 20 20 69 66 20 7b 24 3a 3a 73 71  sql].  if {$::sq
3300: 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 7d  lite_sort_count}
3310: 20 7b 73 65 74 20 78 20 73 6f 72 74 7d 20 7b 73   {set x sort} {s
3320: 65 74 20 78 20 6e 6f 73 6f 72 74 7d 0a 20 20 6c  et x nosort}.  l
3330: 61 70 70 65 6e 64 20 64 61 74 61 20 24 78 0a 20  append data $x. 
3340: 20 72 65 74 75 72 6e 20 24 64 61 74 61 0a 7d 0a   return $data.}.
3350: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 34  .do_test vtab1-4
3360: 2e 31 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  .1 {.  set echo_
3370: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63 6b 73 6f  module "".  ckso
3380: 72 74 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  rt {.    SELECT 
3390: 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  b FROM t1 ORDER 
33a0: 42 59 20 62 3b 0a 20 20 7d 0a 7d 20 7b 32 20 35  BY b;.  }.} {2 5
33b0: 20 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74   nosort}.do_test
33c0: 20 76 74 61 62 31 2d 34 2e 32 20 7b 0a 20 20 73   vtab1-4.2 {.  s
33d0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d  et echo_module.}
33e0: 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65   [list xBestInde
33f0: 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  x {SELECT rowid,
3400: 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 20   * FROM 'treal' 
3410: 4f 52 44 45 52 20 42 59 20 62 20 41 53 43 7d 20  ORDER BY b ASC} 
3420: 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74 65  \.        xFilte
3430: 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72 6f 77  r    {SELECT row
3440: 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61  id, * FROM 'trea
3450: 6c 27 20 4f 52 44 45 52 20 42 59 20 62 20 41 53  l' ORDER BY b AS
3460: 43 7d 20 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61  C} ].do_test vta
3470: 62 31 2d 34 2e 33 20 7b 0a 20 20 73 65 74 20 65  b1-4.3 {.  set e
3480: 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20  cho_module "".  
3490: 63 6b 73 6f 72 74 20 7b 0a 20 20 20 20 53 45 4c  cksort {.    SEL
34a0: 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20 4f 52  ECT b FROM t1 OR
34b0: 44 45 52 20 42 59 20 62 20 44 45 53 43 3b 0a 20  DER BY b DESC;. 
34c0: 20 7d 0a 7d 20 7b 35 20 32 20 6e 6f 73 6f 72 74   }.} {5 2 nosort
34d0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
34e0: 34 2e 34 20 7b 0a 20 20 73 65 74 20 65 63 68 6f  4.4 {.  set echo
34f0: 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20  _module.} [list 
3500: 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45  xBestIndex {SELE
3510: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
3520: 20 27 74 72 65 61 6c 27 20 4f 52 44 45 52 20 42   'treal' ORDER B
3530: 59 20 62 20 44 45 53 43 7d 20 5c 0a 20 20 20 20  Y b DESC} \.    
3540: 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b      xFilter    {
3550: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
3560: 46 52 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52 44  FROM 'treal' ORD
3570: 45 52 20 42 59 20 62 20 44 45 53 43 7d 20 5d 0a  ER BY b DESC} ].
3580: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 34 2e  do_test vtab1-4.
3590: 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  3 {.  set echo_m
35a0: 6f 64 75 6c 65 20 22 22 0a 20 20 63 6b 73 6f 72  odule "".  cksor
35b0: 74 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62  t {.    SELECT b
35c0: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
35d0: 59 20 62 7c 7c 27 27 3b 0a 20 20 7d 0a 7d 20 7b  Y b||'';.  }.} {
35e0: 32 20 35 20 73 6f 72 74 7d 0a 64 6f 5f 74 65 73  2 5 sort}.do_tes
35f0: 74 20 76 74 61 62 31 2d 34 2e 34 20 7b 0a 20 20  t vtab1-4.4 {.  
3600: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a  set echo_module.
3610: 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64  } [list xBestInd
3620: 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64  ex {SELECT rowid
3630: 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27  , * FROM 'treal'
3640: 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c  } \.        xFil
3650: 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72  ter    {SELECT r
3660: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72  owid, * FROM 'tr
3670: 65 61 6c 27 7d 20 5d 0a 0a 65 78 65 63 73 71 6c  eal'} ]..execsql
3680: 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20   {.  DROP TABLE 
3690: 74 31 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  t1;.  DROP TABLE
36a0: 20 74 72 65 61 6c 3b 0a 7d 0a 0a 23 2d 2d 2d 2d   treal;.}..#----
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20  --.# Test cases 
3700: 76 74 61 62 31 2d 35 20 74 65 73 74 20 53 45 4c  vtab1-5 test SEL
3710: 45 43 54 20 71 75 65 72 69 65 73 20 74 68 61 74  ECT queries that
3720: 20 69 6e 63 6c 75 64 65 20 6a 6f 69 6e 73 20 6f   include joins o
3730: 6e 20 76 69 72 74 75 61 6c 20 0a 23 20 74 61 62  n virtual .# tab
3740: 6c 65 73 2e 0a 0a 70 72 6f 63 20 66 69 6c 74 65  les...proc filte
3750: 72 20 7b 6c 6f 67 7d 20 7b 0a 20 20 73 65 74 20  r {log} {.  set 
3760: 6f 75 74 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72  out [list].  for
3770: 20 7b 73 65 74 20 69 69 20 30 7d 20 7b 24 69 69   {set ii 0} {$ii
3780: 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 6c 6f 67   < [llength $log
3790: 5d 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20  ]} {incr ii} {. 
37a0: 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 24     if {[lindex $
37b0: 6c 6f 67 20 24 69 69 5d 20 65 71 20 22 78 46 69  log $ii] eq "xFi
37c0: 6c 74 65 72 22 7d 20 7b 0a 20 20 20 20 20 20 6c  lter"} {.      l
37d0: 61 70 70 65 6e 64 20 6f 75 74 20 78 46 69 6c 74  append out xFilt
37e0: 65 72 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64  er.      lappend
37f0: 20 6f 75 74 20 5b 6c 69 6e 64 65 78 20 24 6c 6f   out [lindex $lo
3800: 67 20 5b 65 78 70 72 20 24 69 69 2b 31 5d 5d 0a  g [expr $ii+1]].
3810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3820: 72 6e 20 24 6f 75 74 0a 7d 0a 0a 64 6f 5f 74 65  rn $out.}..do_te
3830: 73 74 20 76 74 61 62 31 2d 35 2d 31 20 7b 0a 20  st vtab1-5-1 {. 
3840: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
3850: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
3860: 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52  a, b, c);.    CR
3870: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 64 2c  EATE TABLE t2(d,
3880: 20 65 2c 20 66 29 3b 0a 20 20 20 20 49 4e 53 45   e, f);.    INSE
3890: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
38a0: 53 28 31 2c 20 27 72 65 64 27 2c 20 27 67 72 65  S(1, 'red', 'gre
38b0: 65 6e 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  en');.    INSERT
38c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
38d0: 32 2c 20 27 62 6c 75 65 27 2c 20 27 62 6c 61 63  2, 'blue', 'blac
38e0: 6b 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  k');.    INSERT 
38f0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
3900: 2c 20 27 73 70 61 64 65 73 27 2c 20 27 63 6c 75  , 'spades', 'clu
3910: 62 73 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  bs');.    INSERT
3920: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
3930: 32 2c 20 27 68 65 61 72 74 73 27 2c 20 27 64 69  2, 'hearts', 'di
3940: 61 6d 6f 6e 64 73 27 29 3b 0a 20 20 20 20 43 52  amonds');.    CR
3950: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
3960: 4c 45 20 65 74 31 20 55 53 49 4e 47 20 65 63 68  LE et1 USING ech
3970: 6f 28 74 31 29 3b 0a 20 20 20 20 43 52 45 41 54  o(t1);.    CREAT
3980: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
3990: 65 74 32 20 55 53 49 4e 47 20 65 63 68 6f 28 74  et2 USING echo(t
39a0: 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  2);.  }.} {}..do
39b0: 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d 32 20  _test vtab1-5-2 
39c0: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64  {.  set echo_mod
39d0: 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c  ule "".  execsql
39e0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
39f0: 46 52 4f 4d 20 65 74 31 2c 20 65 74 32 3b 0a 20  FROM et1, et2;. 
3a00: 20 7d 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 31   }.} [list \.  1
3a10: 20 72 65 64 20 67 72 65 65 6e 20 31 20 73 70 61   red green 1 spa
3a20: 64 65 73 20 63 6c 75 62 73 20 20 20 20 20 5c 0a  des clubs     \.
3a30: 20 20 31 20 72 65 64 20 67 72 65 65 6e 20 32 20    1 red green 2 
3a40: 68 65 61 72 74 73 20 64 69 61 6d 6f 6e 64 73 20  hearts diamonds 
3a50: 20 5c 0a 20 20 32 20 62 6c 75 65 20 62 6c 61 63   \.  2 blue blac
3a60: 6b 20 31 20 73 70 61 64 65 73 20 63 6c 75 62 73  k 1 spades clubs
3a70: 20 20 20 20 5c 0a 20 20 32 20 62 6c 75 65 20 62      \.  2 blue b
3a80: 6c 61 63 6b 20 32 20 68 65 61 72 74 73 20 64 69  lack 2 hearts di
3a90: 61 6d 6f 6e 64 73 20 5c 0a 5d 0a 64 6f 5f 74 65  amonds \.].do_te
3aa0: 73 74 20 76 74 61 62 31 2d 35 2d 33 20 7b 0a 20  st vtab1-5-3 {. 
3ab0: 20 66 69 6c 74 65 72 20 24 65 63 68 6f 5f 6d 6f   filter $echo_mo
3ac0: 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20  dule.} [list \. 
3ad0: 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54   xFilter {SELECT
3ae0: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
3af0: 74 31 27 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72  t1'} \.  xFilter
3b00: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
3b10: 2a 20 46 52 4f 4d 20 27 74 32 27 7d 20 5c 0a 20  * FROM 't2'} \. 
3b20: 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54   xFilter {SELECT
3b30: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
3b40: 74 32 27 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74  t2'} \.].do_test
3b50: 20 76 74 61 62 31 2d 35 2d 34 20 7b 0a 20 20 73   vtab1-5-4 {.  s
3b60: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22  et echo_module "
3b70: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ".  execsql {.  
3b80: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3b90: 65 74 31 2c 20 65 74 32 20 57 48 45 52 45 20 65  et1, et2 WHERE e
3ba0: 74 32 2e 64 20 3d 20 32 3b 0a 20 20 7d 0a 7d 20  t2.d = 2;.  }.} 
3bb0: 5b 6c 69 73 74 20 5c 0a 20 20 31 20 72 65 64 20  [list \.  1 red 
3bc0: 67 72 65 65 6e 20 32 20 68 65 61 72 74 73 20 64  green 2 hearts d
3bd0: 69 61 6d 6f 6e 64 73 20 20 5c 0a 20 20 32 20 62  iamonds  \.  2 b
3be0: 6c 75 65 20 62 6c 61 63 6b 20 32 20 68 65 61 72  lue black 2 hear
3bf0: 74 73 20 64 69 61 6d 6f 6e 64 73 20 5c 0a 5d 0a  ts diamonds \.].
3c00: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d  do_test vtab1-5-
3c10: 35 20 7b 0a 20 20 66 69 6c 74 65 72 20 24 65 63  5 {.  filter $ec
3c20: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
3c30: 74 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53  t \.  xFilter {S
3c40: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
3c50: 52 4f 4d 20 27 74 31 27 7d 20 5c 0a 20 20 78 46  ROM 't1'} \.  xF
3c60: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f  ilter {SELECT ro
3c70: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 32 27  wid, * FROM 't2'
3c80: 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53  } \.  xFilter {S
3c90: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
3ca0: 52 4f 4d 20 27 74 32 27 7d 20 5c 0a 5d 0a 64 6f  ROM 't2'} \.].do
3cb0: 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d 36 20  _test vtab1-5-6 
3cc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3cd0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
3ce0: 31 20 4f 4e 20 74 32 28 64 29 3b 0a 20 20 7d 0a  1 ON t2(d);.  }.
3cf0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71  .  db close.  sq
3d00: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
3d10: 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63 68 6f  .  register_echo
3d20: 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 33  _module [sqlite3
3d30: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e  _connection_poin
3d40: 74 65 72 20 64 62 5d 0a 0a 20 20 73 65 74 20 3a  ter db]..  set :
3d50: 3a 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a  :echo_module "".
3d60: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3d70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 74  SELECT * FROM et
3d80: 31 2c 20 65 74 32 20 57 48 45 52 45 20 65 74 32  1, et2 WHERE et2
3d90: 2e 64 20 3d 20 32 3b 0a 20 20 7d 0a 7d 20 5b 6c  .d = 2;.  }.} [l
3da0: 69 73 74 20 5c 0a 20 20 31 20 72 65 64 20 67 72  ist \.  1 red gr
3db0: 65 65 6e 20 32 20 68 65 61 72 74 73 20 64 69 61  een 2 hearts dia
3dc0: 6d 6f 6e 64 73 20 20 5c 0a 20 20 32 20 62 6c 75  monds  \.  2 blu
3dd0: 65 20 62 6c 61 63 6b 20 32 20 68 65 61 72 74 73  e black 2 hearts
3de0: 20 64 69 61 6d 6f 6e 64 73 20 5c 0a 5d 0a 64 6f   diamonds \.].do
3df0: 5f 74 65 73 74 20 76 74 61 62 31 2d 35 2d 37 20  _test vtab1-5-7 
3e00: 7b 0a 20 20 66 69 6c 74 65 72 20 24 3a 3a 65 63  {.  filter $::ec
3e10: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73  ho_module.} [lis
3e20: 74 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53  t \.  xFilter {S
3e30: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
3e40: 52 4f 4d 20 27 74 31 27 7d 20 20 20 20 20 20 20  ROM 't1'}       
3e50: 20 20 20 20 20 20 5c 0a 20 20 78 46 69 6c 74 65        \.  xFilte
3e60: 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  r {SELECT rowid,
3e70: 20 2a 20 46 52 4f 4d 20 27 74 32 27 20 57 48 45   * FROM 't2' WHE
3e80: 52 45 20 64 20 3d 20 3f 7d 20 5c 0a 20 20 78 46  RE d = ?} \.  xF
3e90: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f  ilter {SELECT ro
3ea0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 32 27  wid, * FROM 't2'
3eb0: 20 57 48 45 52 45 20 64 20 3d 20 3f 7d 20 5c 0a   WHERE d = ?} \.
3ec0: 5d 0a 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 44  ]..execsql {.  D
3ed0: 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20  ROP TABLE t1;.  
3ee0: 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20  DROP TABLE t2;. 
3ef0: 20 44 52 4f 50 20 54 41 42 4c 45 20 65 74 31 3b   DROP TABLE et1;
3f00: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 65 74  .  DROP TABLE et
3f10: 32 3b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  2;.}..#---------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3f60: 54 65 73 74 20 63 61 73 65 73 20 76 74 61 62 31  Test cases vtab1
3f70: 2d 36 20 74 65 73 74 20 49 4e 53 45 52 54 2c 20  -6 test INSERT, 
3f80: 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54  UPDATE and DELET
3f90: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 23 20  E operations .# 
3fa0: 6f 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  on virtual table
3fb0: 73 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  s..do_test vtab1
3fc0: 2d 36 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6-1 {.  execsql
3fd0: 20 7b 20 53 45 4c 45 43 54 20 73 71 6c 20 46 52   { SELECT sql FR
3fe0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
3ff0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
4000: 76 74 61 62 31 2d 36 2d 32 20 7b 0a 20 20 65 78  vtab1-6-2 {.  ex
4010: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
4020: 54 45 20 54 41 42 4c 45 20 74 72 65 61 6c 28 61  TE TABLE treal(a
4030: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c   PRIMARY KEY, b,
4040: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   c);.    CREATE 
4050: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65  VIRTUAL TABLE te
4060: 63 68 6f 20 55 53 49 4e 47 20 65 63 68 6f 28 74  cho USING echo(t
4070: 72 65 61 6c 29 3b 0a 20 20 20 20 53 45 4c 45 43  real);.    SELEC
4080: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
4090: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
40a0: 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 3b 0a  type = 'table';.
40b0: 20 20 7d 0a 7d 20 7b 74 72 65 61 6c 20 74 65 63    }.} {treal tec
40c0: 68 6f 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  ho}.do_test vtab
40d0: 31 2d 36 2d 33 2e 31 2e 31 20 7b 0a 20 20 65 78  1-6-3.1.1 {.  ex
40e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
40f0: 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73  MA count_changes
4100: 3d 4f 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  =ON;.    INSERT 
4110: 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c 55 45  INTO techo VALUE
4120: 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a  S(1, 2, 3);.  }.
4130: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74  } {1}.do_test vt
4140: 61 62 31 2d 36 2d 33 2e 31 2e 32 20 7b 0a 20 20  ab1-6-3.1.2 {.  
4150: 64 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d  db changes.} {1}
4160: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36  .do_test vtab1-6
4170: 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -3.2 {.  execsql
4180: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
4190: 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 20 7d 0a  FROM techo;.  }.
41a0: 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73  } {1 2 3}.do_tes
41b0: 74 20 76 74 61 62 31 2d 36 2d 34 2e 31 20 7b 0a  t vtab1-6-4.1 {.
41c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
41d0: 55 50 44 41 54 45 20 74 65 63 68 6f 20 53 45 54  UPDATE techo SET
41e0: 20 61 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 64 62   a = 5;.  }.  db
41f0: 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 64   changes.} {1}.d
4200: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 34  o_test vtab1-6-4
4210: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
4220: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
4230: 4f 4d 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20  OM techo;.  }.} 
4240: 7b 35 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20  {5 2 3}.do_test 
4250: 76 74 61 62 31 2d 36 2d 34 2e 33 20 7b 0a 20 20  vtab1-6-4.3 {.  
4260: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
4270: 44 41 54 45 20 74 65 63 68 6f 20 53 45 54 20 61  DATE techo SET a
4280: 3d 36 20 57 48 45 52 45 20 61 3c 30 3b 0a 20 20  =6 WHERE a<0;.  
4290: 7d 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d  }.  db changes.}
42a0: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   {0}.do_test vta
42b0: 62 31 2d 36 2d 34 2e 34 20 7b 0a 20 20 65 78 65  b1-6-4.4 {.  exe
42c0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
42d0: 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a  T * FROM techo;.
42e0: 20 20 7d 0a 7d 20 7b 35 20 32 20 33 7d 0a 0a 64    }.} {5 2 3}..d
42f0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 35  o_test vtab1-6-5
4300: 2e 31 20 7b 0a 20 65 78 65 63 73 71 6c 20 7b 0a  .1 {. execsql {.
4310: 20 20 20 55 50 44 41 54 45 20 74 65 63 68 6f 20     UPDATE techo 
4320: 73 65 74 20 61 20 3d 20 61 7c 7c 62 7c 7c 63 3b  set a = a||b||c;
4330: 0a 20 7d 0a 20 64 62 20 63 68 61 6e 67 65 73 0a  . }. db changes.
4340: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74  } {1}.do_test vt
4350: 61 62 31 2d 36 2d 35 2e 32 20 7b 0a 20 65 78 65  ab1-6-5.2 {. exe
4360: 63 73 71 6c 20 7b 0a 20 20 20 53 45 4c 45 43 54  csql {.   SELECT
4370: 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20   * FROM techo;. 
4380: 7d 0a 7d 20 7b 35 32 33 20 32 20 33 7d 0a 0a 64  }.} {523 2 3}..d
4390: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 36  o_test vtab1-6-6
43a0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
43b0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 65 63 68  .    UPDATE tech
43c0: 6f 20 73 65 74 20 72 6f 77 69 64 20 3d 20 31 30  o set rowid = 10
43d0: 3b 0a 20 20 7d 0a 20 20 64 62 20 63 68 61 6e 67  ;.  }.  db chang
43e0: 65 73 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  es.} {1}.do_test
43f0: 20 76 74 61 62 31 2d 36 2d 36 2e 32 20 7b 0a 20   vtab1-6-6.2 {. 
4400: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
4410: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
4420: 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31   techo;.  }.} {1
4430: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  0}..do_test vtab
4440: 31 2d 36 2d 37 2e 31 2e 31 20 7b 0a 20 20 65 78  1-6-7.1.1 {.  ex
4450: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
4460: 52 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 56 41  RT INTO techo VA
4470: 4c 55 45 53 28 31 31 2c 31 32 2c 31 33 29 3b 0a  LUES(11,12,13);.
4480: 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73    }.} {1}.do_tes
4490: 74 20 76 74 61 62 31 2d 36 2d 37 2e 31 2e 32 20  t vtab1-6-7.1.2 
44a0: 7b 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d  {.  db changes.}
44b0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   {1}.do_test vta
44c0: 62 31 2d 36 2d 37 2e 32 20 7b 0a 20 20 65 78 65  b1-6-7.2 {.  exe
44d0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
44e0: 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f 20 4f  T * FROM techo O
44f0: 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d  RDER BY a;.  }.}
4500: 20 7b 31 31 20 31 32 20 31 33 20 35 32 33 20 32   {11 12 13 523 2
4510: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62   3}.do_test vtab
4520: 31 2d 36 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63  1-6-7.3 {.  exec
4530: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
4540: 20 74 65 63 68 6f 20 53 45 54 20 62 3d 62 2b 31   techo SET b=b+1
4550: 30 30 30 0a 20 20 7d 0a 20 20 64 62 20 63 68 61  000.  }.  db cha
4560: 6e 67 65 73 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65  nges.} {2}.do_te
4570: 73 74 20 76 74 61 62 31 2d 36 2d 37 2e 34 20 7b  st vtab1-6-7.4 {
4580: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4590: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
45a0: 65 63 68 6f 20 4f 52 44 45 52 20 42 59 20 61 3b  echo ORDER BY a;
45b0: 0a 20 20 7d 0a 7d 20 7b 31 31 20 31 30 31 32 20  .  }.} {11 1012 
45c0: 31 33 20 35 32 33 20 31 30 30 32 20 33 7d 0a 0a  13 523 1002 3}..
45d0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36  .do_test vtab1-6
45e0: 2d 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.1 {.  execsql
45f0: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
4600: 4f 4d 20 74 65 63 68 6f 20 57 48 45 52 45 20 61  OM techo WHERE a
4610: 3d 35 3b 0a 20 20 7d 0a 20 20 64 62 20 63 68 61  =5;.  }.  db cha
4620: 6e 67 65 73 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  nges.} {0}.do_te
4630: 73 74 20 76 74 61 62 31 2d 36 2d 38 2e 32 20 7b  st vtab1-6-8.2 {
4640: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4650: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4660: 65 63 68 6f 20 4f 52 44 45 52 20 42 59 20 61 3b  echo ORDER BY a;
4670: 0a 20 20 7d 0a 7d 20 7b 31 31 20 31 30 31 32 20  .  }.} {11 1012 
4680: 31 33 20 35 32 33 20 31 30 30 32 20 33 7d 0a 64  13 523 1002 3}.d
4690: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 38  o_test vtab1-6-8
46a0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
46b0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
46c0: 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 20 20 64 62   techo;.  }.  db
46d0: 20 63 68 61 6e 67 65 73 0a 7d 20 7b 32 7d 0a 64   changes.} {2}.d
46e0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 38  o_test vtab1-6-8
46f0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
4700: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
4710: 4f 4d 20 74 65 63 68 6f 20 4f 52 44 45 52 20 42  OM techo ORDER B
4720: 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 65 78  Y a;.  }.} {}.ex
4730: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 63 6f  ecsql {PRAGMA co
4740: 75 6e 74 5f 63 68 61 6e 67 65 73 3d 4f 46 46 7d  unt_changes=OFF}
4750: 0a 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65  ..forcedelete te
4760: 73 74 32 2e 64 62 0a 66 6f 72 63 65 64 65 6c 65  st2.db.forcedele
4770: 74 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72  te test2.db-jour
4780: 6e 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 32 20  nal.sqlite3 db2 
4790: 74 65 73 74 32 2e 64 62 0a 65 78 65 63 73 71 6c  test2.db.execsql
47a0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
47b0: 45 20 74 65 63 68 6f 28 61 20 50 52 49 4d 41 52  E techo(a PRIMAR
47c0: 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 7d 20  Y KEY, b, c);.} 
47d0: 64 62 32 0a 70 72 6f 63 20 63 68 65 63 6b 5f 65  db2.proc check_e
47e0: 63 68 6f 5f 74 61 62 6c 65 20 7b 74 6e 7d 20 7b  cho_table {tn} {
47f0: 0a 20 20 73 65 74 20 3a 3a 64 61 74 61 31 20 5b  .  set ::data1 [
4800: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
4810: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 65  rowid, * FROM te
4820: 63 68 6f 7d 5d 0a 20 20 73 65 74 20 3a 3a 64 61  cho}].  set ::da
4830: 74 61 32 20 5b 65 78 65 63 73 71 6c 20 7b 53 45  ta2 [execsql {SE
4840: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
4850: 4f 4d 20 74 65 63 68 6f 7d 20 64 62 32 5d 0a 20  OM techo} db2]. 
4860: 20 64 6f 5f 74 65 73 74 20 24 74 6e 20 7b 0a 20   do_test $tn {. 
4870: 20 20 20 73 74 72 69 6e 67 20 65 71 75 61 6c 20     string equal 
4880: 24 3a 3a 64 61 74 61 31 20 24 3a 3a 64 61 74 61  $::data1 $::data
4890: 32 0a 20 20 7d 20 31 0a 7d 0a 73 65 74 20 74 6e  2.  } 1.}.set tn
48a0: 20 30 0a 66 6f 72 65 61 63 68 20 73 74 6d 74 20   0.foreach stmt 
48b0: 5b 6c 69 73 74 20 5c 0a 20 20 7b 49 4e 53 45 52  [list \.  {INSER
48c0: 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 56 41 4c  T INTO techo VAL
48d0: 55 45 53 28 27 61 62 63 27 2c 20 27 64 65 66 27  UES('abc', 'def'
48e0: 2c 20 27 67 68 69 27 29 7d 20 20 20 20 20 20 20  , 'ghi')}       
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 5c 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54   \.  {INSERT INT
4910: 4f 20 74 65 63 68 6f 20 53 45 4c 45 43 54 20 61  O techo SELECT a
4920: 7c 7c 27 2e 27 7c 7c 72 6f 77 69 64 2c 20 62 2c  ||'.'||rowid, b,
4930: 20 63 20 46 52 4f 4d 20 74 65 63 68 6f 7d 20 20   c FROM techo}  
4940: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
4950: 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 63  {INSERT INTO tec
4960: 68 6f 20 53 45 4c 45 43 54 20 61 7c 7c 27 78 27  ho SELECT a||'x'
4970: 7c 7c 72 6f 77 69 64 2c 20 62 2c 20 63 20 46 52  ||rowid, b, c FR
4980: 4f 4d 20 74 65 63 68 6f 7d 20 20 20 20 20 20 20  OM techo}       
4990: 20 20 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53 45         \.  {INSE
49a0: 52 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 53 45  RT INTO techo SE
49b0: 4c 45 43 54 20 61 7c 7c 27 79 27 7c 7c 72 6f 77  LECT a||'y'||row
49c0: 69 64 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 65  id, b, c FROM te
49d0: 63 68 6f 7d 20 20 20 20 20 20 20 20 20 20 20 20  cho}            
49e0: 20 20 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46 52    \.  {DELETE FR
49f0: 4f 4d 20 74 65 63 68 6f 20 57 48 45 52 45 20 28  OM techo WHERE (
4a00: 6f 69 64 20 25 20 33 29 20 3d 20 30 7d 20 20 20  oid % 3) = 0}   
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4a30: 20 7b 55 50 44 41 54 45 20 74 65 63 68 6f 20 73   {UPDATE techo s
4a40: 65 74 20 72 6f 77 69 64 20 3d 20 31 30 30 20 57  et rowid = 100 W
4a50: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31 7d 20  HERE rowid = 1} 
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 49 4e 53          \.  {INS
4a80: 45 52 54 20 49 4e 54 4f 20 74 65 63 68 6f 28 61  ERT INTO techo(a
4a90: 2c 20 62 29 20 56 41 4c 55 45 53 28 27 68 65 6c  , b) VALUES('hel
4aa0: 6c 6f 27 2c 20 27 77 6f 72 6c 64 27 29 7d 20 20  lo', 'world')}  
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46     \.  {DELETE F
4ad0: 52 4f 4d 20 74 65 63 68 6f 7d 20 20 20 20 20 20  ROM techo}      
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 20 20 20 20                  
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4b10: 5d 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 24 73  ] {.  execsql $s
4b20: 74 6d 74 0a 20 20 65 78 65 63 73 71 6c 20 24 73  tmt.  execsql $s
4b30: 74 6d 74 20 64 62 32 0a 20 20 63 68 65 63 6b 5f  tmt db2.  check_
4b40: 65 63 68 6f 5f 74 61 62 6c 65 20 76 74 61 62 31  echo_table vtab1
4b50: 2d 36 2e 38 2e 5b 69 6e 63 72 20 74 6e 5d 0a 7d  -6.8.[incr tn].}
4b60: 0a 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 0a 0a 23  ..db2 close....#
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bb0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61  ------.# Test ca
4bc0: 73 65 73 20 76 74 61 62 31 2d 37 20 74 65 73 74  ses vtab1-7 test
4bd0: 73 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  s that the value
4be0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 0a 23 20   returned by .# 
4bf0: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
4c00: 65 72 74 5f 72 6f 77 69 64 28 29 20 69 73 20 73  ert_rowid() is s
4c10: 65 74 20 63 6f 72 72 65 63 74 6c 79 20 77 68 65  et correctly whe
4c20: 6e 20 72 6f 77 73 20 61 72 65 20 69 6e 73 65 72  n rows are inser
4c30: 74 65 64 0a 23 20 69 6e 74 6f 20 76 69 72 74 75  ted.# into virtu
4c40: 61 6c 20 74 61 62 6c 65 73 2e 0a 64 6f 5f 74 65  al tables..do_te
4c50: 73 74 20 76 74 61 62 31 2e 37 2d 31 20 7b 0a 20  st vtab1.7-1 {. 
4c60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
4c70: 52 45 41 54 45 20 54 41 42 4c 45 20 72 65 61 6c  REATE TABLE real
4c80: 5f 61 62 63 28 61 20 50 52 49 4d 41 52 59 20 4b  _abc(a PRIMARY K
4c90: 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  EY, b, c);.    C
4ca0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
4cb0: 42 4c 45 20 65 63 68 6f 5f 61 62 63 20 55 53 49  BLE echo_abc USI
4cc0: 4e 47 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63  NG echo(real_abc
4cd0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
4ce0: 65 73 74 20 76 74 61 62 31 2e 37 2d 32 20 7b 0a  est vtab1.7-2 {.
4cf0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4d00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f  INSERT INTO echo
4d10: 5f 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32  _abc VALUES(1, 2
4d20: 2c 20 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  , 3);.    SELECT
4d30: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
4d40: 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a  id();.  }.} {1}.
4d50: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d  do_test vtab1.7-
4d60: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
4d70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4d80: 65 63 68 6f 5f 61 62 63 28 72 6f 77 69 64 29 20  echo_abc(rowid) 
4d90: 56 41 4c 55 45 53 28 33 31 34 32 37 29 3b 0a 20  VALUES(31427);. 
4da0: 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69     SELECT last_i
4db0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20  nsert_rowid();. 
4dc0: 20 7d 0a 7d 20 7b 33 31 34 32 37 7d 0a 64 6f 5f   }.} {31427}.do_
4dd0: 74 65 73 74 20 76 74 61 62 31 2e 37 2d 34 20 7b  test vtab1.7-4 {
4de0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4df0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68   INSERT INTO ech
4e00: 6f 5f 61 62 63 20 53 45 4c 45 43 54 20 61 7c 7c  o_abc SELECT a||
4e10: 27 2e 76 32 27 2c 20 62 2c 20 63 20 46 52 4f 4d  '.v2', b, c FROM
4e20: 20 65 63 68 6f 5f 61 62 63 3b 0a 20 20 20 20 53   echo_abc;.    S
4e30: 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72  ELECT last_inser
4e40: 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d  t_rowid();.  }.}
4e50: 20 7b 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74   {31429}.do_test
4e60: 20 76 74 61 62 31 2e 37 2d 35 20 7b 0a 20 20 65   vtab1.7-5 {.  e
4e70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
4e80: 45 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c  ECT rowid, a, b,
4e90: 20 63 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63   c FROM echo_abc
4ea0: 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 31 20 20  .  }.} [list 1  
4eb0: 20 20 20 31 20 20 20 20 32 20 20 33 20 20 5c 0a     1    2  3  \.
4ec0: 20 20 20 20 20 20 20 20 33 31 34 32 37 20 7b 7d          31427 {}
4ed0: 20 20 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20 20 20     {} {} \.     
4ee0: 20 20 20 33 31 34 32 38 20 31 2e 76 32 20 32 20     31428 1.v2 2 
4ef0: 20 33 20 20 5c 0a 20 20 20 20 20 20 20 20 33 31   3  \.        31
4f00: 34 32 39 20 7b 7d 20 20 7b 7d 20 7b 7d 20 20 5c  429 {}  {} {}  \
4f10: 0a 5d 0a 0a 23 20 4e 6f 77 20 74 65 73 74 20 74  .]..# Now test t
4f20: 68 61 74 20 44 45 4c 45 54 45 20 61 6e 64 20 55  hat DELETE and U
4f30: 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  PDATE operations
4f40: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74   do not modify t
4f50: 68 65 20 76 61 6c 75 65 2e 0a 64 6f 5f 74 65 73  he value..do_tes
4f60: 74 20 76 74 61 62 31 2e 37 2d 36 20 7b 0a 20 20  t vtab1.7-6 {.  
4f70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
4f80: 44 41 54 45 20 65 63 68 6f 5f 61 62 63 20 53 45  DATE echo_abc SE
4f90: 54 20 63 20 3d 20 35 20 57 48 45 52 45 20 62 20  T c = 5 WHERE b 
4fa0: 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 2;.    SELECT 
4fb0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
4fc0: 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32  d();.  }.} {3142
4fd0: 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  9}.do_test vtab1
4fe0: 2e 37 2d 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  .7-7 {.  execsql
4ff0: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 65 63   {.    UPDATE ec
5000: 68 6f 5f 61 62 63 20 53 45 54 20 72 6f 77 69 64  ho_abc SET rowid
5010: 20 3d 20 35 20 57 48 45 52 45 20 72 6f 77 69 64   = 5 WHERE rowid
5020: 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 1;.    SELECT
5030: 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
5040: 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34  id();.  }.} {314
5050: 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  29}.do_test vtab
5060: 31 2e 37 2d 38 20 7b 0a 20 20 65 78 65 63 73 71  1.7-8 {.  execsq
5070: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
5080: 52 4f 4d 20 65 63 68 6f 5f 61 62 63 20 57 48 45  ROM echo_abc WHE
5090: 52 45 20 62 20 3d 20 32 3b 0a 20 20 20 20 53 45  RE b = 2;.    SE
50a0: 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74  LECT last_insert
50b0: 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20  _rowid();.  }.} 
50c0: 7b 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20  {31429}.do_test 
50d0: 76 74 61 62 31 2e 37 2d 39 20 7b 0a 20 20 65 78  vtab1.7-9 {.  ex
50e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
50f0: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  CT rowid, a, b, 
5100: 63 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63 0a  c FROM echo_abc.
5110: 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 33 31 34 32    }.} [list 3142
5120: 37 20 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20  7 {} {} {} \.   
5130: 20 20 20 20 20 33 31 34 32 39 20 7b 7d 20 7b 7d       31429 {} {}
5140: 20 7b 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20   {} \.].do_test 
5150: 76 74 61 62 31 2e 37 2d 31 30 20 7b 0a 20 20 65  vtab1.7-10 {.  e
5160: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
5170: 45 54 45 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62  ETE FROM echo_ab
5180: 63 20 57 48 45 52 45 20 62 20 3d 20 32 3b 0a 20  c WHERE b = 2;. 
5190: 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69     SELECT last_i
51a0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20  nsert_rowid();. 
51b0: 20 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 6f 5f   }.} {31429}.do_
51c0: 74 65 73 74 20 76 74 61 62 31 2e 37 2d 31 31 20  test vtab1.7-11 
51d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
51e0: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20    SELECT rowid, 
51f0: 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 72 65 61  a, b, c FROM rea
5200: 6c 5f 61 62 63 0a 20 20 7d 0a 7d 20 5b 6c 69 73  l_abc.  }.} [lis
5210: 74 20 33 31 34 32 37 20 7b 7d 20 7b 7d 20 7b 7d  t 31427 {} {} {}
5220: 20 5c 0a 20 20 20 20 20 20 20 20 33 31 34 32 39   \.        31429
5230: 20 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 5d 0a 64 6f   {} {} {} \.].do
5240: 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d 31 32  _test vtab1.7-12
5250: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5260: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 65     DELETE FROM e
5270: 63 68 6f 5f 61 62 63 3b 0a 20 20 20 20 53 45 4c  cho_abc;.    SEL
5280: 45 43 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f  ECT last_insert_
5290: 72 6f 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b  rowid();.  }.} {
52a0: 33 31 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76  31429}.do_test v
52b0: 74 61 62 31 2e 37 2d 31 33 20 7b 0a 20 20 65 78  tab1.7-13 {.  ex
52c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
52d0: 43 54 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20  CT rowid, a, b, 
52e0: 63 20 46 52 4f 4d 20 72 65 61 6c 5f 61 62 63 0a  c FROM real_abc.
52f0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61    }.} {}..ifcapa
5300: 62 6c 65 20 61 74 74 61 63 68 20 7b 0a 20 20 64  ble attach {.  d
5310: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 38 2d 31  o_test vtab1.8-1
5320: 20 7b 0a 20 20 20 20 73 65 74 20 65 63 68 6f 5f   {.    set echo_
5330: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 20 20 65 78  module "".    ex
5340: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 41 54  ecsql {.      AT
5350: 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20  TACH 'test2.db' 
5360: 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20 43 52  AS aux;.      CR
5370: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
5380: 4c 45 20 61 75 78 2e 65 32 20 55 53 49 4e 47 20  LE aux.e2 USING 
5390: 65 63 68 6f 28 72 65 61 6c 5f 61 62 63 29 3b 0a  echo(real_abc);.
53a0: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 65 63      }.    set ec
53b0: 68 6f 5f 6d 6f 64 75 6c 65 0a 20 20 7d 20 5b 6c  ho_module.  } [l
53c0: 69 73 74 20 78 43 72 65 61 74 65 20 65 63 68 6f  ist xCreate echo
53d0: 20 61 75 78 20 65 32 20 72 65 61 6c 5f 61 62 63   aux e2 real_abc
53e0: 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 78     \.          x
53f0: 53 79 6e 63 20 20 20 65 63 68 6f 28 72 65 61 6c  Sync   echo(real
5400: 5f 61 62 63 29 20 20 20 20 20 20 20 20 20 5c 0a  _abc)         \.
5410: 20 20 20 20 20 20 20 20 20 20 78 43 6f 6d 6d 69            xCommi
5420: 74 20 65 63 68 6f 28 72 65 61 6c 5f 61 62 63 29  t echo(real_abc)
5430: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 5d 0a 7d           \.  ].}
5440: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 38  .do_test vtab1.8
5450: 2d 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  -2 {.  catchsql 
5460: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  {.    DROP TABLE
5470: 20 61 75 78 2e 65 32 3b 0a 20 20 7d 0a 20 20 65   aux.e2;.  }.  e
5480: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
5490: 50 20 54 41 42 4c 45 20 74 72 65 61 6c 3b 0a 20  P TABLE treal;. 
54a0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 65     DROP TABLE te
54b0: 63 68 6f 3b 0a 20 20 20 20 44 52 4f 50 20 54 41  cho;.    DROP TA
54c0: 42 4c 45 20 65 63 68 6f 5f 61 62 63 3b 0a 20 20  BLE echo_abc;.  
54d0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 72 65 61    DROP TABLE rea
54e0: 6c 5f 61 62 63 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  l_abc;.  }.} {}.
54f0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 39  .do_test vtab1.9
5500: 2d 31 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  -1 {.  set echo_
5510: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63  module "".  exec
5520: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
5530: 20 54 41 42 4c 45 20 72 28 61 2c 20 62 2c 20 63   TABLE r(a, b, c
5540: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  );.    CREATE VI
5550: 52 54 55 41 4c 20 54 41 42 4c 45 20 65 20 55 53  RTUAL TABLE e US
5560: 49 4e 47 20 65 63 68 6f 28 72 2c 20 65 5f 6c 6f  ING echo(r, e_lo
5570: 67 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e  g);.    SELECT n
5580: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
5590: 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 72  master;.  }.} {r
55a0: 20 65 20 65 5f 6c 6f 67 7d 0a 64 6f 5f 74 65 73   e e_log}.do_tes
55b0: 74 20 76 74 61 62 31 2e 39 2d 32 20 7b 0a 20 20  t vtab1.9-2 {.  
55c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
55d0: 4f 50 20 54 41 42 4c 45 20 65 3b 0a 20 20 20 20  OP TABLE e;.    
55e0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
55f0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
5600: 20 20 7d 0a 7d 20 7b 72 7d 0a 0a 64 6f 5f 74 65    }.} {r}..do_te
5610: 73 74 20 76 74 61 62 31 2e 39 2d 33 20 7b 0a 20  st vtab1.9-3 {. 
5620: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
5630: 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a   "".  execsql {.
5640: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
5650: 41 4c 20 54 41 42 4c 45 20 65 20 55 53 49 4e 47  AL TABLE e USING
5660: 20 65 63 68 6f 28 72 2c 20 65 5f 6c 6f 67 2c 20   echo(r, e_log, 
5670: 76 69 72 74 75 61 6c 20 31 20 32 20 33 20 76 61  virtual 1 2 3 va
5680: 72 63 68 61 72 28 33 32 29 29 3b 0a 20 20 7d 0a  rchar(32));.  }.
5690: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c    set echo_modul
56a0: 65 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20  e.} [list       
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 5c 0a 20 20 78 43 72 65 61 74 65 20 65 63 68   \.  xCreate ech
56f0: 6f 20 6d 61 69 6e 20 65 20 72 20 65 5f 6c 6f 67  o main e r e_log
5700: 20 7b 76 69 72 74 75 61 6c 20 31 20 32 20 33 20   {virtual 1 2 3 
5710: 76 61 72 63 68 61 72 28 33 32 29 7d 20 20 20 20  varchar(32)}    
5720: 20 20 5c 0a 20 20 78 53 79 6e 63 20 65 63 68 6f    \.  xSync echo
5730: 28 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  (r)             
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 20 5c 0a 20 20 78 43 6f 6d 6d 69 74 20 65     \.  xCommit e
5770: 63 68 6f 28 72 29 20 20 20 20 20 20 20 20 20 20  cho(r)          
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 5c 0a 5d 0a 0a 64 6f 5f 74 65 73 74      \.]..do_test
57b0: 20 76 74 61 62 31 2e 31 30 2d 31 20 7b 0a 20 20   vtab1.10-1 {.  
57c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
57d0: 45 41 54 45 20 54 41 42 4c 45 20 64 65 6c 28 64  EATE TABLE del(d
57e0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  );.    CREATE VI
57f0: 52 54 55 41 4c 20 54 41 42 4c 45 20 65 32 20 55  RTUAL TABLE e2 U
5800: 53 49 4e 47 20 65 63 68 6f 28 64 65 6c 29 3b 0a  SING echo(del);.
5810: 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20    }.  db close. 
5820: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
5830: 2e 64 62 0a 20 20 72 65 67 69 73 74 65 72 5f 65  .db.  register_e
5840: 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69  cho_module [sqli
5850: 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70  te3_connection_p
5860: 6f 69 6e 74 65 72 20 64 62 5d 0a 20 20 65 78 65  ointer db].  exe
5870: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
5880: 54 41 42 4c 45 20 64 65 6c 3b 0a 20 20 7d 0a 20  TABLE del;.  }. 
5890: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
58a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 32  SELECT * FROM e2
58b0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 76 74 61 62  ;.  }.} {1 {vtab
58c0: 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66  le constructor f
58d0: 61 69 6c 65 64 3a 20 65 32 7d 7d 0a 64 6f 5f 74  ailed: e2}}.do_t
58e0: 65 73 74 20 76 74 61 62 31 2e 31 30 2d 32 20 7b  est vtab1.10-2 {
58f0: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
5900: 20 7b 0a 20 20 20 20 73 65 74 20 70 74 72 20 5b   {.    set ptr [
5910: 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69  sqlite3_connecti
5920: 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 20  on_pointer db]. 
5930: 20 20 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61     sqlite3_decla
5940: 72 65 5f 76 74 61 62 20 24 70 74 72 20 7b 43 52  re_vtab $ptr {CR
5950: 45 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61  EATE TABLE abc(a
5960: 2c 20 62 2c 20 63 29 7d 0a 20 20 7d 20 6d 73 67  , b, c)}.  } msg
5970: 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73  ].  list $rc $ms
5980: 67 0a 7d 20 7b 31 20 7b 6c 69 62 72 61 72 79 20  g.} {1 {library 
5990: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f  routine called o
59a0: 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 7d 7d  ut of sequence}}
59b0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31  .do_test vtab1.1
59c0: 30 2d 33 20 7b 0a 20 20 73 65 74 20 3a 3a 65 63  0-3 {.  set ::ec
59d0: 68 6f 5f 6d 6f 64 75 6c 65 5f 62 65 67 69 6e 5f  ho_module_begin_
59e0: 66 61 69 6c 20 72 0a 20 20 63 61 74 63 68 73 71  fail r.  catchsq
59f0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
5a00: 4e 54 4f 20 65 20 56 41 4c 55 45 53 28 31 2c 20  NTO e VALUES(1, 
5a10: 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20  2, 3);.  }.} {1 
5a20: 7b 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72  {SQL logic error
5a30: 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61   or missing data
5a40: 62 61 73 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 76  base}}.do_test v
5a50: 74 61 62 31 2e 31 30 2d 34 20 7b 0a 20 20 63 61  tab1.10-4 {.  ca
5a60: 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a 20  tch {execsql {. 
5a70: 20 20 20 45 58 50 4c 41 49 4e 20 53 45 4c 45 43     EXPLAIN SELEC
5a80: 54 20 2a 20 46 52 4f 4d 20 65 20 57 48 45 52 45  T * FROM e WHERE
5a90: 20 72 6f 77 69 64 20 3d 20 32 3b 0a 20 20 20 20   rowid = 2;.    
5aa0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
5ab0: 41 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AN SELECT * FROM
5ac0: 20 65 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d   e WHERE rowid =
5ad0: 20 32 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69   2 ORDER BY rowi
5ae0: 64 3b 0a 20 20 7d 7d 0a 7d 20 7b 30 7d 0a 0a 64  d;.  }}.} {0}..d
5af0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d  o_test vtab1.10-
5b00: 35 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d  5 {.  set echo_m
5b10: 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73  odule "".  execs
5b20: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
5b30: 2a 20 46 52 4f 4d 20 65 20 57 48 45 52 45 20 72  * FROM e WHERE r
5b40: 6f 77 69 64 7c 7c 27 27 20 4d 41 54 43 48 20 27  owid||'' MATCH '
5b50: 70 61 74 74 65 72 6e 27 3b 0a 20 20 7d 0a 20 20  pattern';.  }.  
5b60: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a  set echo_module.
5b70: 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 78 42 65 73  } [list \.  xBes
5b80: 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72  tIndex {SELECT r
5b90: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 72 27  owid, * FROM 'r'
5ba0: 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53  } \.  xFilter {S
5bb0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
5bc0: 52 4f 4d 20 27 72 27 7d 20 20 20 20 5c 0a 5d 0a  ROM 'r'}    \.].
5bd0: 70 72 6f 63 20 6d 61 74 63 68 5f 66 75 6e 63 20  proc match_func 
5be0: 7b 61 72 67 73 7d 20 7b 72 65 74 75 72 6e 20 22  {args} {return "
5bf0: 22 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  "}.do_test vtab1
5c00: 2e 31 30 2d 36 20 7b 0a 20 20 73 65 74 20 65 63  .10-6 {.  set ec
5c10: 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 64  ho_module "".  d
5c20: 62 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74 63 68  b function match
5c30: 20 6d 61 74 63 68 5f 66 75 6e 63 0a 20 20 65 78   match_func.  ex
5c40: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
5c50: 43 54 20 2a 20 46 52 4f 4d 20 65 20 57 48 45 52  CT * FROM e WHER
5c60: 45 20 6d 61 74 63 68 28 27 70 61 74 74 65 72 6e  E match('pattern
5c70: 27 2c 20 72 6f 77 69 64 2c 20 27 70 61 74 74 65  ', rowid, 'patte
5c80: 72 6e 32 27 29 3b 0a 20 20 7d 0a 20 20 73 65 74  rn2');.  }.  set
5c90: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b   echo_module.} [
5ca0: 6c 69 73 74 20 5c 0a 20 20 78 42 65 73 74 49 6e  list \.  xBestIn
5cb0: 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  dex {SELECT rowi
5cc0: 64 2c 20 2a 20 46 52 4f 4d 20 27 72 27 7d 20 5c  d, * FROM 'r'} \
5cd0: 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45  .  xFilter {SELE
5ce0: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
5cf0: 20 27 72 27 7d 20 20 20 20 5c 0a 5d 0a 0a 0a 23   'r'}    \.]...#
5d00: 20 54 65 73 74 69 6e 67 20 74 68 65 20 78 46 69   Testing the xFi
5d10: 6e 64 46 75 6e 63 74 69 6f 6e 20 69 6e 74 65 72  ndFunction inter
5d20: 66 61 63 65 0a 23 0a 63 61 74 63 68 20 7b 72 65  face.#.catch {re
5d30: 6e 61 6d 65 20 3a 3a 65 63 68 6f 5f 67 6c 6f 62  name ::echo_glob
5d40: 5f 6f 76 65 72 6c 6f 61 64 20 7b 7d 7d 0a 64 6f  _overload {}}.do
5d50: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 31 2d 31  _test vtab1.11-1
5d60: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5d70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72     INSERT INTO r
5d80: 28 61 2c 62 2c 63 29 20 56 41 4c 55 45 53 28 31  (a,b,c) VALUES(1
5d90: 2c 27 3f 27 2c 39 39 29 3b 0a 20 20 20 20 49 4e  ,'?',99);.    IN
5da0: 53 45 52 54 20 49 4e 54 4f 20 72 28 61 2c 62 2c  SERT INTO r(a,b,
5db0: 63 29 20 56 41 4c 55 45 53 28 32 2c 33 2c 39 39  c) VALUES(2,3,99
5dc0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20  );.    SELECT a 
5dd0: 47 4c 4f 42 20 62 20 46 52 4f 4d 20 65 0a 20 20  GLOB b FROM e.  
5de0: 7d 0a 7d 20 7b 31 20 30 7d 0a 70 72 6f 63 20 3a  }.} {1 0}.proc :
5df0: 3a 65 63 68 6f 5f 67 6c 6f 62 5f 6f 76 65 72 6c  :echo_glob_overl
5e00: 6f 61 64 20 7b 61 20 62 7d 20 7b 0a 20 72 65 74  oad {a b} {. ret
5e10: 75 72 6e 20 5b 6c 69 73 74 20 24 62 20 24 61 5d  urn [list $b $a]
5e20: 0a 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  .}.do_test vtab1
5e30: 2e 31 31 2d 32 20 7b 0a 20 20 65 78 65 63 73 71  .11-2 {.  execsq
5e40: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  l {.    SELECT a
5e50: 20 6c 69 6b 65 20 27 62 27 20 46 52 4f 4d 20 65   like 'b' FROM e
5e60: 0a 20 20 7d 0a 7d 20 7b 30 20 30 7d 0a 64 6f 5f  .  }.} {0 0}.do_
5e70: 74 65 73 74 20 76 74 61 62 31 2e 31 31 2d 33 20  test vtab1.11-3 
5e80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5e90: 20 20 53 45 4c 45 43 54 20 61 20 67 6c 6f 62 20    SELECT a glob 
5ea0: 27 32 27 20 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d  '2' FROM e.  }.}
5eb0: 20 7b 7b 31 20 32 7d 20 7b 32 20 32 7d 7d 0a 64   {{1 2} {2 2}}.d
5ec0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 31 2d  o_test vtab1.11-
5ed0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
5ee0: 20 20 20 20 53 45 4c 45 43 54 20 20 67 6c 6f 62      SELECT  glob
5ef0: 28 27 32 27 2c 61 29 20 46 52 4f 4d 20 65 0a 20  ('2',a) FROM e. 
5f00: 20 7d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65   }.} {0 1}.do_te
5f10: 73 74 20 76 74 61 62 31 2e 31 31 2d 35 20 7b 0a  st vtab1.11-5 {.
5f20: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5f30: 53 45 4c 45 43 54 20 20 67 6c 6f 62 28 61 2c 27  SELECT  glob(a,'
5f40: 32 27 29 20 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d  2') FROM e.  }.}
5f50: 20 7b 7b 32 20 31 7d 20 7b 32 20 32 7d 7d 0a 20   {{2 1} {2 2}}. 
5f60: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
5fb0: 74 68 65 20 6f 75 74 63 6f 6d 65 20 69 66 20 61  the outcome if a
5fc0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 65   constraint is e
5fd0: 6e 63 6f 75 6e 74 65 72 65 64 20 68 61 6c 66 2d  ncountered half-
5fe0: 77 61 79 20 74 68 72 6f 75 67 68 0a 23 20 61 20  way through.# a 
5ff0: 6d 75 6c 74 69 2d 72 6f 77 20 49 4e 53 45 52 54  multi-row INSERT
6000: 20 74 68 61 74 20 69 73 20 69 6e 73 69 64 65 20   that is inside 
6010: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 0a  a transaction.#.
6020: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 32  do_test vtab1.12
6030: 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  -1 {.  execsql {
6040: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6050: 45 20 62 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20  E b(a, b, c);.  
6060: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
6070: 28 61 20 55 4e 49 51 55 45 2c 20 62 2c 20 63 29  (a UNIQUE, b, c)
6080: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6090: 4f 20 62 20 56 41 4c 55 45 53 28 31 2c 20 27 41  O b VALUES(1, 'A
60a0: 27 2c 20 27 42 27 29 3b 0a 20 20 20 20 49 4e 53  ', 'B');.    INS
60b0: 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45  ERT INTO b VALUE
60c0: 53 28 32 2c 20 27 43 27 2c 20 27 44 27 29 3b 0a  S(2, 'C', 'D');.
60d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
60e0: 62 20 56 41 4c 55 45 53 28 33 2c 20 27 45 27 2c  b VALUES(3, 'E',
60f0: 20 27 46 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'F');.    INSER
6100: 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28  T INTO c VALUES(
6110: 33 2c 20 27 47 27 2c 20 27 48 27 29 3b 0a 20 20  3, 'G', 'H');.  
6120: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
6130: 20 54 41 42 4c 45 20 65 63 68 6f 5f 63 20 55 53   TABLE echo_c US
6140: 49 4e 47 20 65 63 68 6f 28 63 29 3b 0a 20 20 7d  ING echo(c);.  }
6150: 0a 7d 20 7b 7d 0a 0a 23 20 46 69 72 73 74 20 74  .} {}..# First t
6160: 65 73 74 20 6f 75 74 73 69 64 65 20 6f 66 20 61  est outside of a
6170: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 64 6f   transaction..do
6180: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d 32  _test vtab1.12-2
6190: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
61a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f  INSERT INTO echo
61b0: 5f 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  _c SELECT * FROM
61c0: 20 62 3b 20 7d 0a 7d 20 7b 31 20 7b 65 63 68 6f   b; }.} {1 {echo
61d0: 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20 55 4e 49  -vtab-error: UNI
61e0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  QUE constraint f
61f0: 61 69 6c 65 64 3a 20 63 2e 61 7d 7d 0a 64 6f 5f  ailed: c.a}}.do_
6200: 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d 32 2e  test vtab1.12-2.
6210: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72  1 {.  sqlite3_er
6220: 72 6d 73 67 20 64 62 0a 7d 20 7b 65 63 68 6f 2d  rmsg db.} {echo-
6230: 76 74 61 62 2d 65 72 72 6f 72 3a 20 55 4e 49 51  vtab-error: UNIQ
6240: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  UE constraint fa
6250: 69 6c 65 64 3a 20 63 2e 61 7d 0a 64 6f 5f 74 65  iled: c.a}.do_te
6260: 73 74 20 76 74 61 62 31 2e 31 32 2d 33 20 7b 0a  st vtab1.12-3 {.
6270: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
6280: 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d 0a 7d 20  CT * FROM c }.} 
6290: 7b 33 20 47 20 48 7d 0a 0a 23 20 4e 6f 77 20 74  {3 G H}..# Now t
62a0: 68 65 20 72 65 61 6c 20 74 65 73 74 20 2d 20 77  he real test - w
62b0: 72 61 70 70 65 64 20 69 6e 20 61 20 74 72 61 6e  rapped in a tran
62c0: 73 61 63 74 69 6f 6e 2e 0a 64 6f 5f 74 65 73 74  saction..do_test
62d0: 20 76 74 61 62 31 2e 31 32 2d 34 20 7b 0a 20 20   vtab1.12-4 {.  
62e0: 65 78 65 63 73 71 6c 20 20 7b 42 45 47 49 4e 7d  execsql  {BEGIN}
62f0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
6300: 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 63  SERT INTO echo_c
6310: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
6320: 3b 20 7d 0a 7d 20 7b 31 20 7b 65 63 68 6f 2d 76  ; }.} {1 {echo-v
6330: 74 61 62 2d 65 72 72 6f 72 3a 20 55 4e 49 51 55  tab-error: UNIQU
6340: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  E constraint fai
6350: 6c 65 64 3a 20 63 2e 61 7d 7d 0a 64 6f 5f 74 65  led: c.a}}.do_te
6360: 73 74 20 76 74 61 62 31 2e 31 32 2d 35 20 7b 0a  st vtab1.12-5 {.
6370: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
6380: 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d 0a 7d 20  CT * FROM c }.} 
6390: 7b 33 20 47 20 48 7d 0a 64 6f 5f 74 65 73 74 20  {3 G H}.do_test 
63a0: 76 74 61 62 31 2e 31 32 2d 36 20 7b 0a 20 20 65  vtab1.12-6 {.  e
63b0: 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  xecsql { COMMIT 
63c0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
63d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d 0a  LECT * FROM c }.
63e0: 7d 20 7b 33 20 47 20 48 7d 0a 0a 23 20 41 74 20  } {3 G H}..# At 
63f0: 6f 6e 65 20 70 6f 69 6e 74 20 28 74 69 63 6b 65  one point (ticke
6400: 74 20 23 32 37 35 39 29 2c 20 61 20 57 48 45 52  t #2759), a WHER
6410: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
6420: 66 6f 72 6d 20 22 3c 63 6f 6c 75 6d 6e 3e 20 49  form "<column> I
6430: 53 20 4e 55 4c 4c 22 0a 23 20 6f 6e 20 61 20 76  S NULL".# on a v
6440: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 61 73  irtual table was
6450: 20 63 61 75 73 69 6e 67 20 61 6e 20 61 73 73 65   causing an asse
6460: 72 74 28 29 20 74 6f 20 66 61 69 6c 20 69 6e 20  rt() to fail in 
6470: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 0a 23 0a  the compiler..#.
6480: 23 20 22 49 53 20 4e 55 4c 4c 22 20 63 6c 61 75  # "IS NULL" clau
6490: 73 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ses should not b
64a0: 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  e passed through
64b0: 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
64c0: 74 61 62 6c 65 0a 23 20 69 6d 70 6c 65 6d 65 6e  table.# implemen
64d0: 74 61 74 69 6f 6e 2e 20 54 68 65 79 20 61 72 65  tation. They are
64e0: 20 68 61 6e 64 6c 65 64 20 62 79 20 53 51 4c 69   handled by SQLi
64f0: 74 65 20 61 66 74 65 72 20 74 68 65 20 76 74 61  te after the vta
6500: 62 20 72 65 74 75 72 6e 73 20 69 74 73 0a 23 20  b returns its.# 
6510: 64 61 74 61 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  data..#.do_test 
6520: 76 74 61 62 31 2e 31 33 2d 31 20 7b 0a 20 20 65  vtab1.13-1 {.  e
6530: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 53 45  xecsql { .    SE
6540: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f  LECT * FROM echo
6550: 5f 63 20 57 48 45 52 45 20 61 20 49 53 20 4e 55  _c WHERE a IS NU
6560: 4c 4c 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  LL .  }.} {}.do_
6570: 74 65 73 74 20 76 74 61 62 31 2e 31 33 2d 32 20  test vtab1.13-2 
6580: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
6590: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
65a0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 31 35   VALUES(NULL, 15
65b0: 2c 20 31 36 29 3b 0a 20 20 20 20 53 45 4c 45 43  , 16);.    SELEC
65c0: 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20  T * FROM echo_c 
65d0: 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20  WHERE a IS NULL 
65e0: 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 31 35 20 31 36  .  }.} {{} 15 16
65f0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e  }.do_test vtab1.
6600: 31 33 2d 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  13-3 {.  execsql
6610: 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49   { .    INSERT I
6620: 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 31 35 2c  NTO c VALUES(15,
6630: 20 4e 55 4c 4c 2c 20 31 36 29 3b 0a 20 20 20 20   NULL, 16);.    
6640: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63  SELECT * FROM ec
6650: 68 6f 5f 63 20 57 48 45 52 45 20 62 20 49 53 20  ho_c WHERE b IS 
6660: 4e 55 4c 4c 20 0a 20 20 7d 0a 7d 20 7b 31 35 20  NULL .  }.} {15 
6670: 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76  {} 16}.do_test v
6680: 74 61 62 31 2e 31 33 2d 34 20 7b 0a 20 20 75 6e  tab1.13-4 {.  un
6690: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
66a0: 6e 75 6c 6c 0a 20 20 65 78 65 63 73 71 6c 20 7b  null.  execsql {
66b0: 20 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46   .    SELECT * F
66c0: 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45  ROM echo_c WHERE
66d0: 20 62 20 49 53 20 24 6e 75 6c 6c 0a 20 20 7d 0a   b IS $null.  }.
66e0: 7d 20 7b 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f  } {15 {} 16}.do_
66f0: 74 65 73 74 20 76 74 61 62 31 2e 31 33 2d 35 20  test vtab1.13-5 
6700: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
6710: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
6720: 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 62 20   echo_c WHERE b 
6730: 49 53 20 4e 55 4c 4c 20 41 4e 44 20 61 20 3d 20  IS NULL AND a = 
6740: 31 35 3b 0a 20 20 7d 0a 7d 20 7b 31 35 20 7b 7d  15;.  }.} {15 {}
6750: 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61   16}.do_test vta
6760: 62 31 2e 31 33 2d 36 20 7b 0a 20 20 65 78 65 63  b1.13-6 {.  exec
6770: 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45 43  sql { .    SELEC
6780: 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20  T * FROM echo_c 
6790: 57 48 45 52 45 20 4e 55 4c 4c 20 49 53 20 62 20  WHERE NULL IS b 
67a0: 41 4e 44 20 61 20 49 53 20 31 35 3b 0a 20 20 7d  AND a IS 15;.  }
67b0: 0a 7d 20 7b 31 35 20 7b 7d 20 31 36 7d 0a 0a 0a  .} {15 {} 16}...
67c0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34  do_test vtab1-14
67d0: 2e 30 30 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .001 {.  execsql
67e0: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
67f0: 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48  * FROM echo_c WH
6800: 45 52 45 20 2b 72 6f 77 69 64 20 49 4e 20 28 31  ERE +rowid IN (1
6810: 2c 32 2c 33 29 7d 0a 7d 20 7b 31 20 33 20 47 20  ,2,3)}.} {1 3 G 
6820: 48 20 32 20 7b 7d 20 31 35 20 31 36 20 33 20 31  H 2 {} 15 16 3 1
6830: 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 73 74  5 {} 16}.do_test
6840: 20 76 74 61 62 31 2d 31 34 2e 30 30 32 20 7b 0a   vtab1-14.002 {.
6850: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
6860: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
6870: 65 63 68 6f 5f 63 20 57 48 45 52 45 20 72 6f 77  echo_c WHERE row
6880: 69 64 20 49 4e 20 28 31 2c 32 2c 33 29 7d 0a 7d  id IN (1,2,3)}.}
6890: 20 7b 31 20 33 20 47 20 48 20 32 20 7b 7d 20 31   {1 3 G H 2 {} 1
68a0: 35 20 31 36 20 33 20 31 35 20 7b 7d 20 31 36 7d  5 16 3 15 {} 16}
68b0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
68c0: 34 2e 30 30 33 20 7b 0a 20 20 65 78 65 63 73 71  4.003 {.  execsq
68d0: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  l {SELECT rowid,
68e0: 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57   * FROM echo_c W
68f0: 48 45 52 45 20 2b 72 6f 77 69 64 20 49 4e 20 28  HERE +rowid IN (
6900: 30 2c 31 2c 35 2c 32 2c 27 61 27 2c 33 2c 4e 55  0,1,5,2,'a',3,NU
6910: 4c 4c 29 7d 0a 7d 20 7b 31 20 33 20 47 20 48 20  LL)}.} {1 3 G H 
6920: 32 20 7b 7d 20 31 35 20 31 36 20 33 20 31 35 20  2 {} 15 16 3 15 
6930: 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76  {} 16}.do_test v
6940: 74 61 62 31 2d 31 34 2e 30 30 34 20 7b 0a 20 20  tab1-14.004 {.  
6950: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
6960: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63  rowid, * FROM ec
6970: 68 6f 5f 63 20 57 48 45 52 45 20 72 6f 77 69 64  ho_c WHERE rowid
6980: 20 49 4e 20 28 30 2c 31 2c 35 2c 27 61 27 2c 32   IN (0,1,5,'a',2
6990: 2c 33 2c 4e 55 4c 4c 29 7d 0a 7d 20 7b 31 20 33  ,3,NULL)}.} {1 3
69a0: 20 47 20 48 20 32 20 7b 7d 20 31 35 20 31 36 20   G H 2 {} 15 16 
69b0: 33 20 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 74  3 15 {} 16}.do_t
69c0: 65 73 74 20 76 74 61 62 31 2d 31 34 2e 30 30 35  est vtab1-14.005
69d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
69e0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
69f0: 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20  OM echo_c WHERE 
6a00: 72 6f 77 69 64 20 4e 4f 54 20 49 4e 20 28 30 2c  rowid NOT IN (0,
6a10: 31 2c 35 2c 27 61 27 2c 32 2c 33 29 7d 0a 7d 20  1,5,'a',2,3)}.} 
6a20: 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31  {}.do_test vtab1
6a30: 2d 31 34 2e 30 30 36 20 7b 0a 20 20 65 78 65 63  -14.006 {.  exec
6a40: 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  sql {SELECT rowi
6a50: 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63  d, * FROM echo_c
6a60: 20 57 48 45 52 45 20 72 6f 77 69 64 20 4e 4f 54   WHERE rowid NOT
6a70: 20 49 4e 20 28 30 2c 35 2c 27 61 27 2c 32 2c 33   IN (0,5,'a',2,3
6a80: 29 7d 0a 7d 20 7b 31 20 33 20 47 20 48 7d 0a 64  )}.} {1 3 G H}.d
6a90: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e  o_test vtab1-14.
6aa0: 30 30 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  007 {.  execsql 
6ab0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a  {SELECT rowid, *
6ac0: 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45   FROM echo_c WHE
6ad0: 52 45 20 2b 72 6f 77 69 64 20 4e 4f 54 20 49 4e  RE +rowid NOT IN
6ae0: 20 28 30 2c 35 2c 27 61 27 2c 32 2c 33 2c 4e 55   (0,5,'a',2,3,NU
6af0: 4c 4c 29 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  LL)}.} {}.do_tes
6b00: 74 20 76 74 61 62 31 2d 31 34 2e 30 30 38 20 7b  t vtab1-14.008 {
6b10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
6b20: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
6b30: 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 72 6f   echo_c WHERE ro
6b40: 77 69 64 20 4e 4f 54 20 49 4e 20 28 30 2c 35 2c  wid NOT IN (0,5,
6b50: 27 61 27 2c 32 2c 33 2c 4e 55 4c 4c 29 7d 0a 7d  'a',2,3,NULL)}.}
6b60: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62   {}.do_test vtab
6b70: 31 2d 31 34 2e 30 31 31 20 7b 0a 20 20 65 78 65  1-14.011 {.  exe
6b80: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  csql {SELECT * F
6b90: 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45  ROM echo_c WHERE
6ba0: 20 2b 61 20 49 4e 20 28 31 2c 33 2c 38 2c 27 78   +a IN (1,3,8,'x
6bb0: 27 2c 4e 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a 7d  ',NULL,15,24)}.}
6bc0: 20 7b 33 20 47 20 48 20 31 35 20 7b 7d 20 31 36   {3 G H 15 {} 16
6bd0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d  }.do_test vtab1-
6be0: 31 34 2e 30 31 32 20 7b 0a 20 20 65 78 65 63 73  14.012 {.  execs
6bf0: 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ql {SELECT * FRO
6c00: 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61  M echo_c WHERE a
6c10: 20 49 4e 20 28 31 2c 33 2c 38 2c 27 78 27 2c 4e   IN (1,3,8,'x',N
6c20: 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a 7d 20 7b 33  ULL,15,24)}.} {3
6c30: 20 47 20 48 20 31 35 20 7b 7d 20 31 36 7d 0a 64   G H 15 {} 16}.d
6c40: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e  o_test vtab1-14.
6c50: 30 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  013 {.  execsql 
6c60: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65  {SELECT * FROM e
6c70: 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20 4e 4f  cho_c WHERE a NO
6c80: 54 20 49 4e 20 28 31 2c 38 2c 27 78 27 2c 31 35  T IN (1,8,'x',15
6c90: 2c 32 34 29 7d 0a 7d 20 7b 33 20 47 20 48 7d 0a  ,24)}.} {3 G H}.
6ca0: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34  do_test vtab1-14
6cb0: 2e 30 31 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  .014 {.  execsql
6cc0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
6cd0: 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20 4e  echo_c WHERE a N
6ce0: 4f 54 20 49 4e 20 28 31 2c 38 2c 27 78 27 2c 4e  OT IN (1,8,'x',N
6cf0: 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a 7d 20 7b 7d  ULL,15,24)}.} {}
6d00: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  .do_test vtab1-1
6d10: 34 2e 30 31 35 20 7b 0a 20 20 65 78 65 63 73 71  4.015 {.  execsq
6d20: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
6d30: 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 2b 61   echo_c WHERE +a
6d40: 20 4e 4f 54 20 49 4e 20 28 31 2c 38 2c 27 78 27   NOT IN (1,8,'x'
6d50: 2c 4e 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a 7d 20  ,NULL,15,24)}.} 
6d60: 7b 7d 0a 0a 0a 0a 23 64 6f 5f 74 65 73 74 20 76  {}....#do_test v
6d70: 74 61 62 31 2d 31 34 2e 31 20 7b 0a 23 20 20 65  tab1-14.1 {.#  e
6d80: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
6d90: 46 52 4f 4d 20 63 20 7d 0a 23 20 20 73 65 74 20  FROM c }.#  set 
6da0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 23  echo_module "".#
6db0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
6dc0: 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63  CT * FROM echo_c
6dd0: 20 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e 20   WHERE rowid IN 
6de0: 28 31 2c 20 32 2c 20 33 29 20 7d 0a 23 20 20 73  (1, 2, 3) }.#  s
6df0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 23  et echo_module.#
6e00: 7d 20 7b 2f 2e 2a 78 42 65 73 74 49 6e 64 65 78  } {/.*xBestIndex
6e10: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20   {SELECT rowid, 
6e20: 2e 20 46 52 4f 4d 20 27 63 27 20 57 48 45 52 45  . FROM 'c' WHERE
6e30: 20 72 6f 77 69 64 20 3d 20 2e 7d 20 78 46 69 6c   rowid = .} xFil
6e40: 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  ter {SELECT rowi
6e50: 64 2c 20 2e 20 46 52 4f 4d 20 27 63 27 7d 20 31  d, . FROM 'c'} 1
6e60: 2f 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62  /}..do_test vtab
6e70: 31 2d 31 34 2e 32 20 7b 0a 20 20 73 65 74 20 65  1-14.2 {.  set e
6e80: 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20  cho_module "".  
6e90: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
6ea0: 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57   * FROM echo_c W
6eb0: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31 20 7d  HERE rowid = 1 }
6ec0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
6ed0: 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74  le.} [list xBest
6ee0: 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f  Index {SELECT ro
6ef0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 63 27 20  wid, * FROM 'c' 
6f00: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 3f 7d  WHERE rowid = ?}
6f10: 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54   xFilter {SELECT
6f20: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27   rowid, * FROM '
6f30: 63 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  c' WHERE rowid =
6f40: 20 3f 7d 20 31 5d 0a 0a 64 6f 5f 74 65 73 74 20   ?} 1]..do_test 
6f50: 76 74 61 62 31 2d 31 34 2e 33 20 7b 0a 20 20 73  vtab1-14.3 {.  s
6f60: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22  et echo_module "
6f70: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  ".  execsql { SE
6f80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f  LECT * FROM echo
6f90: 5f 63 20 57 48 45 52 45 20 61 20 3d 20 31 20 7d  _c WHERE a = 1 }
6fa0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75  .  set echo_modu
6fb0: 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74  le.} [list xBest
6fc0: 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f  Index {SELECT ro
6fd0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 63 27 20  wid, * FROM 'c' 
6fe0: 57 48 45 52 45 20 61 20 3d 20 3f 7d 20 78 46 69  WHERE a = ?} xFi
6ff0: 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77  lter {SELECT row
7000: 69 64 2c 20 2a 20 46 52 4f 4d 20 27 63 27 20 57  id, * FROM 'c' W
7010: 48 45 52 45 20 61 20 3d 20 3f 7d 20 31 5d 0a 0a  HERE a = ?} 1]..
7020: 23 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31  #do_test vtab1-1
7030: 34 2e 34 20 7b 0a 23 20 20 73 65 74 20 65 63 68  4.4 {.#  set ech
7040: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 23 20 20 65  o_module "".#  e
7050: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
7060: 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48  * FROM echo_c WH
7070: 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32 29 20  ERE a IN (1, 2) 
7080: 7d 0a 23 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f  }.#  set echo_mo
7090: 64 75 6c 65 0a 23 7d 20 7b 2f 78 42 65 73 74 49  dule.#} {/xBestI
70a0: 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77  ndex {SELECT row
70b0: 69 64 2c 20 2e 20 46 52 4f 4d 20 27 63 27 20 57  id, . FROM 'c' W
70c0: 48 45 52 45 20 61 20 3d 20 2e 7d 20 78 46 69 6c  HERE a = .} xFil
70d0: 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  ter {SELECT rowi
70e0: 64 2c 20 2e 20 46 52 4f 4d 20 27 63 27 20 57 48  d, . FROM 'c' WH
70f0: 45 52 45 20 61 20 3d 20 2e 7d 20 31 2f 7d 0a 0a  ERE a = .} 1/}..
7100: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 35  do_test vtab1-15
7110: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
7120: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
7130: 45 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20  E t1(a, b, c);. 
7140: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
7150: 4c 20 54 41 42 4c 45 20 65 63 68 6f 5f 74 31 20  L TABLE echo_t1 
7160: 55 53 49 4e 47 20 65 63 68 6f 28 74 31 29 3b 0a  USING echo(t1);.
7170: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
7180: 20 76 74 61 62 31 2d 31 35 2e 32 20 7b 0a 20 20   vtab1-15.2 {.  
7190: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
71a0: 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 74  SERT INTO echo_t
71b0: 31 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53 28  1(rowid) VALUES(
71c0: 34 35 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  45);.    SELECT 
71d0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63  rowid, * FROM ec
71e0: 68 6f 5f 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34 35  ho_t1;.  }.} {45
71f0: 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65   {} {} {}}.do_te
7200: 73 74 20 76 74 61 62 31 2d 31 35 2e 33 20 7b 0a  st vtab1-15.3 {.
7210: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7220: 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68 6f  INSERT INTO echo
7230: 5f 74 31 28 72 6f 77 69 64 29 20 56 41 4c 55 45  _t1(rowid) VALUE
7240: 53 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 45 4c  S(NULL);.    SEL
7250: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
7260: 4d 20 65 63 68 6f 5f 74 31 3b 0a 20 20 7d 0a 7d  M echo_t1;.  }.}
7270: 20 7b 34 35 20 7b 7d 20 7b 7d 20 7b 7d 20 34 36   {45 {} {} {} 46
7280: 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65   {} {} {}}.do_te
7290: 73 74 20 76 74 61 62 31 2d 31 35 2e 34 20 7b 0a  st vtab1-15.4 {.
72a0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
72b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 68   INSERT INTO ech
72c0: 6f 5f 74 31 28 72 6f 77 69 64 29 20 56 41 4c 55  o_t1(rowid) VALU
72d0: 45 53 28 27 6e 65 77 20 72 6f 77 69 64 27 29 3b  ES('new rowid');
72e0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 74  .  }.} {1 {datat
72f0: 79 70 65 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 0a  ype mismatch}}..
7300: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
7310: 74 65 73 74 73 20 2d 20 76 74 61 62 31 2d 31 36  tests - vtab1-16
7320: 2e 2a 20 2d 20 61 72 65 20 64 65 73 69 67 6e 65  .* - are designe
7330: 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 73  d to test that s
7340: 65 74 74 69 6e 67 20 0a 23 20 73 71 6c 69 74 65  etting .# sqlite
7350: 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 76  3_vtab.zErrMsg v
7360: 61 72 69 61 62 6c 65 20 63 61 6e 20 62 65 20 75  ariable can be u
7370: 73 65 64 20 62 79 20 74 68 65 20 76 74 61 62 20  sed by the vtab 
7380: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 0a 23 20  interface to .# 
7390: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
73a0: 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 75  message to the u
73b0: 73 65 72 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20  ser..# .do_test 
73c0: 76 74 61 62 31 2d 31 36 2e 31 20 7b 0a 20 20 65  vtab1-16.1 {.  e
73d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
73e0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
73f0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
7400: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
7410: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
7420: 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 52  2, 3);.    INSER
7430: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
7440: 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 43  (4, 5, 6);.    C
7450: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
7460: 42 4c 45 20 65 63 68 6f 5f 74 32 20 55 53 49 4e  BLE echo_t2 USIN
7470: 47 20 65 63 68 6f 28 74 32 29 3b 0a 20 20 7d 0a  G echo(t2);.  }.
7480: 7d 20 7b 7d 0a 0a 73 65 74 20 74 6e 20 32 0a 66  } {}..set tn 2.f
7490: 6f 72 65 61 63 68 20 6d 65 74 68 6f 64 20 5b 6c  oreach method [l
74a0: 69 73 74 20 5c 0a 20 20 20 20 78 42 65 73 74 49  ist \.    xBestI
74b0: 6e 64 65 78 20 20 20 20 20 20 20 5c 0a 20 20 20  ndex       \.   
74c0: 20 78 4f 70 65 6e 20 20 20 20 20 20 20 20 20 20   xOpen          
74d0: 20 20 5c 0a 20 20 20 20 78 46 69 6c 74 65 72 20    \.    xFilter 
74e0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78           \.    x
74f0: 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
7500: 5c 0a 20 20 20 20 78 43 6f 6c 75 6d 6e 20 20 20  \.    xColumn   
7510: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 78 52 6f         \.    xRo
7520: 77 69 64 20 20 20 20 20 20 20 20 20 20 20 5c 0a  wid           \.
7530: 5d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 76 74  ] {.  do_test vt
7540: 61 62 31 2d 31 36 2e 24 74 6e 20 7b 0a 20 20 20  ab1-16.$tn {.   
7550: 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65   set echo_module
7560: 5f 66 61 69 6c 28 24 6d 65 74 68 6f 64 2c 74 32  _fail($method,t2
7570: 29 20 22 74 68 65 20 24 6d 65 74 68 6f 64 20 6d  ) "the $method m
7580: 65 74 68 6f 64 20 68 61 73 20 66 61 69 6c 65 64  ethod has failed
7590: 22 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  ".    catchsql {
75a0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a   SELECT rowid, *
75b0: 20 46 52 4f 4d 20 65 63 68 6f 5f 74 32 20 57 48   FROM echo_t2 WH
75c0: 45 52 45 20 61 20 3e 3d 20 31 20 7d 0a 20 20 7d  ERE a >= 1 }.  }
75d0: 20 22 31 20 7b 65 63 68 6f 2d 76 74 61 62 2d 65   "1 {echo-vtab-e
75e0: 72 72 6f 72 3a 20 74 68 65 20 24 6d 65 74 68 6f  rror: the $metho
75f0: 64 20 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69  d method has fai
7600: 6c 65 64 7d 22 0a 20 20 75 6e 73 65 74 20 65 63  led}".  unset ec
7610: 68 6f 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 24  ho_module_fail($
7620: 6d 65 74 68 6f 64 2c 74 32 29 0a 20 20 69 6e 63  method,t2).  inc
7630: 72 20 74 6e 0a 7d 0a 0a 66 6f 72 65 61 63 68 20  r tn.}..foreach 
7640: 6d 65 74 68 6f 64 20 5b 6c 69 73 74 20 5c 0a 20  method [list \. 
7650: 20 78 55 70 64 61 74 65 20 20 20 20 20 20 20 20   xUpdate        
7660: 20 20 20 20 5c 0a 20 20 78 42 65 67 69 6e 20 20      \.  xBegin  
7670: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 78             \.  x
7680: 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
7690: 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 74 65 73    \.] {.  do_tes
76a0: 74 20 76 74 61 62 31 2d 31 36 2e 24 74 6e 20 7b  t vtab1-16.$tn {
76b0: 0a 20 20 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f  .    set echo_mo
76c0: 64 75 6c 65 5f 66 61 69 6c 28 24 6d 65 74 68 6f  dule_fail($metho
76d0: 64 2c 74 32 29 20 22 74 68 65 20 24 6d 65 74 68  d,t2) "the $meth
76e0: 6f 64 20 6d 65 74 68 6f 64 20 68 61 73 20 66 61  od method has fa
76f0: 69 6c 65 64 22 0a 20 20 20 20 63 61 74 63 68 73  iled".    catchs
7700: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
7710: 20 65 63 68 6f 5f 74 32 20 56 41 4c 55 45 53 28   echo_t2 VALUES(
7720: 37 2c 20 38 2c 20 39 29 20 7d 0a 20 20 7d 20 22  7, 8, 9) }.  } "
7730: 31 20 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72 72  1 {echo-vtab-err
7740: 6f 72 3a 20 74 68 65 20 24 6d 65 74 68 6f 64 20  or: the $method 
7750: 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69 6c 65  method has faile
7760: 64 7d 22 0a 20 20 75 6e 73 65 74 20 65 63 68 6f  d}".  unset echo
7770: 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 24 6d 65  _module_fail($me
7780: 74 68 6f 64 2c 74 32 29 0a 20 20 69 6e 63 72 20  thod,t2).  incr 
7790: 74 6e 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  tn.}..ifcapable 
77a0: 61 6c 74 65 72 74 61 62 6c 65 20 7b 0a 20 20 64  altertable {.  d
77b0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 36 2e  o_test vtab1-16.
77c0: 24 74 6e 20 7b 0a 20 20 20 20 73 65 74 20 65 63  $tn {.    set ec
77d0: 68 6f 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 78  ho_module_fail(x
77e0: 52 65 6e 61 6d 65 2c 74 32 29 20 22 74 68 65 20  Rename,t2) "the 
77f0: 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 20 68  xRename method h
7800: 61 73 20 66 61 69 6c 65 64 22 0a 20 20 20 20 63  as failed".    c
7810: 61 74 63 68 73 71 6c 20 7b 20 41 4c 54 45 52 20  atchsql { ALTER 
7820: 54 41 42 4c 45 20 65 63 68 6f 5f 74 32 20 52 45  TABLE echo_t2 RE
7830: 4e 41 4d 45 20 54 4f 20 61 6e 6f 74 68 65 72 5f  NAME TO another_
7840: 6e 61 6d 65 20 7d 0a 20 20 7d 20 22 31 20 7b 65  name }.  } "1 {e
7850: 63 68 6f 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20  cho-vtab-error: 
7860: 74 68 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68  the xRename meth
7870: 6f 64 20 68 61 73 20 66 61 69 6c 65 64 7d 22 0a  od has failed}".
7880: 20 20 75 6e 73 65 74 20 65 63 68 6f 5f 6d 6f 64    unset echo_mod
7890: 75 6c 65 5f 66 61 69 6c 28 78 52 65 6e 61 6d 65  ule_fail(xRename
78a0: 2c 74 32 29 0a 20 20 69 6e 63 72 20 74 6e 0a 7d  ,t2).  incr tn.}
78b0: 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
78c0: 67 20 74 65 73 74 20 63 61 73 65 20 65 78 70 6f  g test case expo
78d0: 73 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ses an instance 
78e0: 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  in sqlite3_decla
78f0: 72 65 5f 76 74 61 62 28 29 0a 23 20 61 6e 20 65  re_vtab().# an e
7900: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 61 73  rror message was
7910: 20 73 65 74 20 75 73 69 6e 67 20 61 20 63 61 6c   set using a cal
7920: 6c 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  l similar to sql
7930: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 45 72  ite3_mprintf(zEr
7940: 72 29 2c 0a 23 20 77 68 65 72 65 20 7a 45 72 72  r),.# where zErr
7950: 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
7960: 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20 69 73   string. This is
7970: 20 6e 6f 20 67 6f 6f 64 20 69 66 20 74 68 65 20   no good if the 
7980: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 0a  string contains.
7990: 23 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  # characters tha
79a0: 74 20 63 61 6e 20 62 65 20 6d 69 73 74 61 6b 65  t can be mistake
79b0: 6e 20 66 6f 72 20 70 72 69 6e 74 66 28 29 20 66  n for printf() f
79c0: 6f 72 6d 61 74 74 69 6e 67 20 64 69 72 65 63 74  ormatting direct
79d0: 69 76 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ives..#.do_test 
79e0: 76 74 61 62 31 2d 31 37 2e 31 20 7b 0a 20 20 65  vtab1-17.1 {.  e
79f0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52  xecsql { .    PR
7a00: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
7a10: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 49 4e  hema = 1;.    IN
7a20: 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
7a30: 5f 6d 61 73 74 65 72 20 56 41 4c 55 45 53 28 0a  _master VALUES(.
7a40: 20 20 20 20 20 20 27 74 61 62 6c 65 27 2c 20 27        'table', '
7a50: 74 33 27 2c 20 27 74 33 27 2c 20 30 2c 20 27 49  t3', 't3', 0, 'I
7a60: 4e 53 45 52 54 20 49 4e 54 4f 20 22 25 73 25 73  NSERT INTO "%s%s
7a70: 22 20 56 41 4c 55 45 53 28 31 29 27 0a 20 20 20  " VALUES(1)'.   
7a80: 20 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73   );.  }.  catchs
7a90: 71 6c 20 7b 20 43 52 45 41 54 45 20 56 49 52 54  ql { CREATE VIRT
7aa0: 55 41 4c 20 54 41 42 4c 45 20 74 34 20 55 53 49  UAL TABLE t4 USI
7ab0: 4e 47 20 65 63 68 6f 28 74 33 29 3b 20 7d 0a 7d  NG echo(t3); }.}
7ac0: 20 7b 31 20 7b 76 74 61 62 6c 65 20 63 6f 6e 73   {1 {vtable cons
7ad0: 74 72 75 63 74 6f 72 20 66 61 69 6c 65 64 3a 20  tructor failed: 
7ae0: 74 34 7d 7d 0a 0a 23 20 54 68 69 73 20 74 65 73  t4}}..# This tes
7af0: 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  t verifies that 
7b00: 74 69 63 6b 65 74 20 34 38 66 32 39 39 36 33 20  ticket 48f29963 
7b10: 69 73 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 74  is fixed..#.do_t
7b20: 65 73 74 20 76 74 61 62 31 2d 31 37 2e 31 20 7b  est vtab1-17.1 {
7b30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
7b40: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7b50: 35 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  5(a, b);.    CRE
7b60: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
7b70: 45 20 65 35 20 55 53 49 4e 47 20 65 63 68 6f 5f  E e5 USING echo_
7b80: 76 32 28 74 35 29 3b 0a 20 20 20 20 42 45 47 49  v2(t5);.    BEGI
7b90: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
7ba0: 49 4e 54 4f 20 65 35 20 56 41 4c 55 45 53 28 31  INTO e5 VALUES(1
7bb0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 44 52 4f 50  , 2);.      DROP
7bc0: 20 54 41 42 4c 45 20 65 35 3b 0a 20 20 20 20 20   TABLE e5;.     
7bd0: 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
7be0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
7bf0: 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 4f 4d 4d 49  O one;.    COMMI
7c00: 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  T;.  }.} {}..do_
7c10: 74 65 73 74 20 76 74 61 62 31 2d 31 37 2e 32 20  test vtab1-17.2 
7c20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45  {.  execsql { DE
7c30: 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65  LETE FROM sqlite
7c40: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 73 71  _master WHERE sq
7c50: 6c 20 4c 49 4b 45 20 27 69 6e 73 65 72 74 25 27  l LIKE 'insert%'
7c60: 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
7cc0: 69 6e 67 20 74 65 73 74 73 20 2d 20 76 74 61 62  ing tests - vtab
7cd0: 31 2d 31 38 2e 2a 20 2d 20 74 65 73 74 20 74 68  1-18.* - test th
7ce0: 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  at the optimizat
7cf0: 69 6f 6e 20 6f 66 20 4c 49 4b 45 0a 23 20 63 6f  ion of LIKE.# co
7d00: 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 77 68 65  nstraints in whe
7d10: 72 65 2e 63 20 70 6c 61 79 73 20 77 65 6c 6c 20  re.c plays well 
7d20: 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62  with virtual tab
7d30: 6c 65 73 2e 0a 23 0a 23 20 20 20 31 38 2e 31 2e  les..#.#   18.1.
7d40: 2a 3a 20 43 61 73 65 2d 69 6e 73 65 6e 73 69 74  *: Case-insensit
7d50: 69 76 65 20 4c 49 4b 45 2e 0a 23 20 20 20 31 38  ive LIKE..#   18
7d60: 2e 32 2e 2a 3a 20 43 61 73 65 2d 73 65 6e 73 69  .2.*: Case-sensi
7d70: 74 69 76 65 20 4c 49 4b 45 2e 0a 23 0a 75 6e 73  tive LIKE..#.uns
7d80: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 65  et -nocomplain e
7d90: 63 68 6f 5f 6d 6f 64 75 6c 65 5f 62 65 67 69 6e  cho_module_begin
7da0: 5f 66 61 69 6c 0a 0a 64 6f 5f 65 78 65 63 73 71  _fail..do_execsq
7db0: 6c 5f 74 65 73 74 20 31 38 2e 31 2e 30 20 7b 0a  l_test 18.1.0 {.
7dc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
7dd0: 36 28 61 2c 20 62 20 54 45 58 54 29 3b 0a 20 20  6(a, b TEXT);.  
7de0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 36 20  CREATE INDEX i6 
7df0: 4f 4e 20 74 36 28 62 2c 20 61 29 3b 0a 20 20 49  ON t6(b, a);.  I
7e00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41  NSERT INTO t6 VA
7e10: 4c 55 45 53 28 31 2c 20 27 50 65 74 65 72 27 29  LUES(1, 'Peter')
7e20: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
7e30: 74 36 20 56 41 4c 55 45 53 28 32 2c 20 27 41 6e  t6 VALUES(2, 'An
7e40: 64 72 65 77 27 29 3b 0a 20 20 49 4e 53 45 52 54  drew');.  INSERT
7e50: 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28   INTO t6 VALUES(
7e60: 33 2c 20 27 4a 61 6d 65 73 27 29 3b 0a 20 20 49  3, 'James');.  I
7e70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41  NSERT INTO t6 VA
7e80: 4c 55 45 53 28 34 2c 20 27 4a 6f 68 6e 27 29 3b  LUES(4, 'John');
7e90: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
7ea0: 36 20 56 41 4c 55 45 53 28 35 2c 20 27 50 68 69  6 VALUES(5, 'Phi
7eb0: 6c 6c 69 70 27 29 3b 0a 20 20 49 4e 53 45 52 54  llip');.  INSERT
7ec0: 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28   INTO t6 VALUES(
7ed0: 36 2c 20 27 42 61 72 74 68 6f 6c 6f 6d 65 77 27  6, 'Bartholomew'
7ee0: 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54  );.  CREATE VIRT
7ef0: 55 41 4c 20 54 41 42 4c 45 20 65 36 20 55 53 49  UAL TABLE e6 USI
7f00: 4e 47 20 65 63 68 6f 28 74 36 29 3b 0a 7d 0a 0a  NG echo(t6);.}..
7f10: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20  foreach {tn sql 
7f20: 72 65 73 20 66 69 6c 74 65 72 7d 20 7b 0a 20 20  res filter} {.  
7f30: 31 2e 31 20 22 53 45 4c 45 43 54 20 61 20 46 52  1.1 "SELECT a FR
7f40: 4f 4d 20 65 36 20 57 48 45 52 45 20 62 3e 27 4a  OM e6 WHERE b>'J
7f50: 61 6d 65 73 27 22 20 7b 34 20 31 20 35 7d 0a 20  ames'" {4 1 5}. 
7f60: 20 20 20 7b 78 46 69 6c 74 65 72 20 7b 53 45 4c     {xFilter {SEL
7f70: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
7f80: 4d 20 27 74 36 27 20 57 48 45 52 45 20 62 20 3e  M 't6' WHERE b >
7f90: 20 3f 7d 20 4a 61 6d 65 73 7d 0a 0a 20 20 31 2e   ?} James}..  1.
7fa0: 32 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  2 "SELECT a FROM
7fb0: 20 65 36 20 57 48 45 52 45 20 62 3e 3d 27 4a 27   e6 WHERE b>='J'
7fc0: 20 41 4e 44 20 62 3c 27 4b 27 22 20 7b 33 20 34   AND b<'K'" {3 4
7fd0: 7d 0a 20 20 20 20 7b 78 46 69 6c 74 65 72 20 7b  }.    {xFilter {
7fe0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
7ff0: 46 52 4f 4d 20 27 74 36 27 20 57 48 45 52 45 20  FROM 't6' WHERE 
8000: 62 20 3e 3d 20 3f 20 41 4e 44 20 62 20 3c 20 3f  b >= ? AND b < ?
8010: 7d 20 4a 20 4b 7d 0a 0a 20 20 31 2e 33 20 22 53  } J K}..  1.3 "S
8020: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 36 20  ELECT a FROM e6 
8030: 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 4a 25  WHERE b LIKE 'J%
8040: 27 22 20 7b 33 20 34 7d 0a 20 20 20 20 7b 78 46  '" {3 4}.    {xF
8050: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f  ilter {SELECT ro
8060: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 36 27  wid, * FROM 't6'
8070: 7d 7d 0a 0a 20 20 31 2e 34 20 22 53 45 4c 45 43  }}..  1.4 "SELEC
8080: 54 20 61 20 46 52 4f 4d 20 65 36 20 57 48 45 52  T a FROM e6 WHER
8090: 45 20 62 20 4c 49 4b 45 20 27 6a 25 27 22 20 7b  E b LIKE 'j%'" {
80a0: 33 20 34 7d 0a 20 20 20 20 7b 78 46 69 6c 74 65  3 4}.    {xFilte
80b0: 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c  r {SELECT rowid,
80c0: 20 2a 20 46 52 4f 4d 20 27 74 36 27 7d 7d 0a 7d   * FROM 't6'}}.}
80d0: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f   {.  set echo_mo
80e0: 64 75 6c 65 20 7b 7d 0a 20 20 64 6f 5f 65 78 65  dule {}.  do_exe
80f0: 63 73 71 6c 5f 74 65 73 74 20 31 38 2e 24 74 6e  csql_test 18.$tn
8100: 2e 31 20 24 73 71 6c 20 24 72 65 73 0a 20 20 64  .1 $sql $res.  d
8110: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 31  o_test         1
8120: 38 2e 24 74 6e 2e 32 20 7b 20 6c 72 61 6e 67 65  8.$tn.2 { lrange
8130: 20 24 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c 65 20   $::echo_module 
8140: 32 20 65 6e 64 20 7d 20 24 66 69 6c 74 65 72 0a  2 end } $filter.
8150: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
8160: 73 74 20 31 38 2e 32 2e 30 20 7b 20 20 50 52 41  st 18.2.0 {  PRA
8170: 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69  GMA case_sensiti
8180: 76 65 5f 6c 69 6b 65 20 3d 20 4f 4e 20 7d 0a 66  ve_like = ON }.f
8190: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 20 72  oreach {tn sql r
81a0: 65 73 20 66 69 6c 74 65 72 7d 20 7b 0a 20 20 32  es filter} {.  2
81b0: 2e 31 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f  .1 "SELECT a FRO
81c0: 4d 20 65 36 20 57 48 45 52 45 20 62 20 4c 49 4b  M e6 WHERE b LIK
81d0: 45 20 27 4a 25 27 22 20 7b 33 20 34 7d 0a 20 20  E 'J%'" {3 4}.  
81e0: 20 20 7b 78 46 69 6c 74 65 72 20 7b 53 45 4c 45    {xFilter {SELE
81f0: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
8200: 20 27 74 36 27 7d 7d 0a 0a 20 20 32 2e 32 20 22   't6'}}..  2.2 "
8210: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 36  SELECT a FROM e6
8220: 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 6a   WHERE b LIKE 'j
8230: 25 27 22 20 7b 7d 0a 20 20 20 20 7b 78 46 69 6c  %'" {}.    {xFil
8240: 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69  ter {SELECT rowi
8250: 64 2c 20 2a 20 46 52 4f 4d 20 27 74 36 27 7d 7d  d, * FROM 't6'}}
8260: 0a 7d 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f  .} {.  set echo_
8270: 6d 6f 64 75 6c 65 20 7b 7d 0a 20 20 64 6f 5f 65  module {}.  do_e
8280: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 38 2e 24  xecsql_test 18.$
8290: 74 6e 2e 31 20 24 73 71 6c 20 24 72 65 73 0a 20  tn.1 $sql $res. 
82a0: 20 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20   do_test        
82b0: 20 31 38 2e 24 74 6e 2e 32 20 7b 20 6c 72 61 6e   18.$tn.2 { lran
82c0: 67 65 20 24 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c  ge $::echo_modul
82d0: 65 20 32 20 65 6e 64 20 7d 20 24 66 69 6c 74 65  e 2 end } $filte
82e0: 72 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  r.}.do_execsql_t
82f0: 65 73 74 20 31 38 2e 32 2e 78 20 7b 20 20 50 52  est 18.2.x {  PR
8300: 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74  AGMA case_sensit
8310: 69 76 65 5f 6c 69 6b 65 20 3d 20 4f 46 46 20 7d  ive_like = OFF }
8320: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
8370: 65 73 74 20 74 68 61 74 20 61 6e 20 65 78 69 73  est that an exis
8380: 74 69 6e 67 20 6d 6f 64 75 6c 65 20 6d 61 79 20  ting module may 
8390: 6e 6f 74 20 62 65 20 6f 76 65 72 72 69 64 64 65  not be overridde
83a0: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 31 39 2e  n..#.do_test 19.
83b0: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  1 {.  sqlite3 db
83c0: 32 20 74 65 73 74 2e 64 62 0a 20 20 72 65 67 69  2 test.db.  regi
83d0: 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65  ster_echo_module
83e0: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   [sqlite3_connec
83f0: 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 32  tion_pointer db2
8400: 5d 0a 7d 20 53 51 4c 49 54 45 5f 4f 4b 0a 64 6f  ].} SQLITE_OK.do
8410: 5f 74 65 73 74 20 31 39 2e 32 20 7b 0a 20 20 72  _test 19.2 {.  r
8420: 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64  egister_echo_mod
8430: 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e  ule [sqlite3_con
8440: 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20  nection_pointer 
8450: 64 62 32 5d 0a 7d 20 53 51 4c 49 54 45 5f 4d 49  db2].} SQLITE_MI
8460: 53 55 53 45 0a 64 6f 5f 74 65 73 74 20 31 39 2e  SUSE.do_test 19.
8470: 33 20 7b 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  3 {.  db2 close.
8480: 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84d0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 74 68 65  .# Test that the
84e0: 20 62 75 67 20 66 69 78 65 64 20 62 79 20 5b 62   bug fixed by [b
84f0: 30 63 31 62 61 36 35 35 64 36 39 5d 20 72 65 61  0c1ba655d69] rea
8500: 6c 6c 79 20 69 73 20 66 69 78 65 64 2e 0a 23 0a  lly is fixed..#.
8510: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8520: 32 30 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  20.1 {.  CREATE 
8530: 54 41 42 4c 45 20 74 37 20 28 61 2c 20 62 29 3b  TABLE t7 (a, b);
8540: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
8550: 74 38 20 28 63 2c 20 64 29 3b 0a 20 20 43 52 45  t8 (c, d);.  CRE
8560: 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
8570: 74 37 28 61 29 3b 0a 20 20 43 52 45 41 54 45 20  t7(a);.  CREATE 
8580: 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 37 28 62  INDEX i3 ON t7(b
8590: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45  );.  CREATE INDE
85a0: 58 20 69 34 20 4f 4e 20 74 38 28 63 29 3b 0a 20  X i4 ON t8(c);. 
85b0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 35   CREATE INDEX i5
85c0: 20 4f 4e 20 74 38 28 64 29 3b 0a 0a 20 20 43 52   ON t8(d);..  CR
85d0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
85e0: 4c 45 20 74 37 76 20 55 53 49 4e 47 20 65 63 68  LE t7v USING ech
85f0: 6f 28 74 37 29 3b 0a 20 20 43 52 45 41 54 45 20  o(t7);.  CREATE 
8600: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 38  VIRTUAL TABLE t8
8610: 76 20 55 53 49 4e 47 20 65 63 68 6f 28 74 38 29  v USING echo(t8)
8620: 3b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 32 30 2e  ;.}..do_test 20.
8630: 32 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  2 {.  for {set i
8640: 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 30 7d 20   0} {$i < 1000} 
8650: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 64  {incr i} {.    d
8660: 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49  b eval {INSERT I
8670: 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28 24 69  NTO t7 VALUES($i
8680: 2c 20 24 69 29 7d 0a 20 20 20 20 64 62 20 65 76  , $i)}.    db ev
8690: 61 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  al {INSERT INTO 
86a0: 74 38 20 56 41 4c 55 45 53 28 24 69 2c 20 24 69  t8 VALUES($i, $i
86b0: 29 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  )}.  }.} {}..do_
86c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 30 2e  execsql_test 20.
86d0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20  3 {.  SELECT a, 
86e0: 62 20 46 52 4f 4d 20 28 0a 20 20 20 20 20 20 53  b FROM (.      S
86f0: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
8700: 74 37 20 57 48 45 52 45 20 61 3d 31 31 20 4f 52  t7 WHERE a=11 OR
8710: 20 62 3d 31 32 0a 20 20 20 20 20 20 55 4e 49 4f   b=12.      UNIO
8720: 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c 45  N ALL.      SELE
8730: 43 54 20 63 2c 20 64 20 46 52 4f 4d 20 74 38 20  CT c, d FROM t8 
8740: 57 48 45 52 45 20 63 3d 35 20 4f 52 20 64 3d 36  WHERE c=5 OR d=6
8750: 0a 20 20 29 0a 20 20 4f 52 44 45 52 20 42 59 20  .  ).  ORDER BY 
8760: 31 2c 20 32 3b 0a 7d 20 7b 35 20 35 20 36 20 36  1, 2;.} {5 5 6 6
8770: 20 31 31 20 31 31 20 31 32 20 31 32 7d 0a 0a 64   11 11 12 12}..d
8780: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
8790: 30 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  0.4 {.  SELECT a
87a0: 2c 20 62 20 46 52 4f 4d 20 28 0a 20 20 20 20 20  , b FROM (.     
87b0: 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f   SELECT a, b FRO
87c0: 4d 20 74 37 76 20 57 48 45 52 45 20 61 3d 31 31  M t7v WHERE a=11
87d0: 20 4f 52 20 62 3d 31 32 0a 20 20 20 20 20 20 55   OR b=12.      U
87e0: 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53  NION ALL.      S
87f0: 45 4c 45 43 54 20 63 2c 20 64 20 46 52 4f 4d 20  ELECT c, d FROM 
8800: 74 38 76 20 57 48 45 52 45 20 63 3d 35 20 4f 52  t8v WHERE c=5 OR
8810: 20 64 3d 36 0a 20 20 29 0a 20 20 4f 52 44 45 52   d=6.  ).  ORDER
8820: 20 42 59 20 31 2c 20 32 3b 0a 7d 20 7b 35 20 35   BY 1, 2;.} {5 5
8830: 20 36 20 36 20 31 31 20 31 31 20 31 32 20 31 32   6 6 11 11 12 12
8840: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
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 0a 23 0a  -------------.#.
8890: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
88a0: 32 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  21.1 {.  CREATE 
88b0: 54 41 42 4c 45 20 74 39 28 61 2c 62 2c 63 29 3b  TABLE t9(a,b,c);
88c0: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
88d0: 4c 20 54 41 42 4c 45 20 74 39 76 20 55 53 49 4e  L TABLE t9v USIN
88e0: 47 20 65 63 68 6f 28 74 39 29 3b 0a 0a 20 20 49  G echo(t9);..  I
88f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 39 20 56 41  NSERT INTO t9 VA
8900: 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 49  LUES(1,2,3);.  I
8910: 4e 53 45 52 54 20 49 4e 54 4f 20 74 39 20 56 41  NSERT INTO t9 VA
8920: 4c 55 45 53 28 33 2c 32 2c 31 29 3b 0a 20 20 49  LUES(3,2,1);.  I
8930: 4e 53 45 52 54 20 49 4e 54 4f 20 74 39 20 56 41  NSERT INTO t9 VA
8940: 4c 55 45 53 28 32 2c 32 2c 32 29 3b 0a 7d 0a 0a  LUES(2,2,2);.}..
8950: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8960: 32 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  21.2 {.  SELECT 
8970: 2a 20 46 52 4f 4d 20 74 39 76 20 57 48 45 52 45  * FROM t9v WHERE
8980: 20 61 3c 62 3b 0a 7d 20 7b 31 20 32 20 33 7d 0a   a<b;.} {1 2 3}.
8990: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
89a0: 20 32 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54   21.3 {.  SELECT
89b0: 20 2a 20 46 52 4f 4d 20 74 39 76 20 57 48 45 52   * FROM t9v WHER
89c0: 45 20 61 3d 62 3b 0a 7d 20 7b 32 20 32 20 32 7d  E a=b;.} {2 2 2}
89d0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41  ------------.# A
8a20: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 65 78 65 63  t one point exec
8a30: 75 74 69 6e 67 20 61 20 43 52 45 41 54 45 20 56  uting a CREATE V
8a40: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61  IRTUAL TABLE sta
8a50: 74 65 6d 65 6e 74 20 74 68 61 74 20 73 70 65 63  tement that spec
8a60: 69 66 69 65 64 20 0a 23 20 61 20 64 61 74 61 62  ified .# a datab
8a70: 61 73 65 20 6e 61 6d 65 20 62 75 74 20 6e 6f 20  ase name but no 
8a80: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61 72  virtual table ar
8a90: 67 75 6d 65 6e 74 73 20 77 61 73 20 63 61 75 73  guments was caus
8aa0: 69 6e 67 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a  ing an internal.
8ab0: 23 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  # buffer overrea
8ac0: 64 2e 20 56 61 6c 67 72 69 6e 64 20 77 6f 75 6c  d. Valgrind woul
8ad0: 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20  d report errors 
8ae0: 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68  while running th
8af0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 23 20 74  e following .# t
8b00: 65 73 74 73 2e 20 53 70 65 63 69 66 69 63 61 6c  ests. Specifical
8b10: 6c 79 3a 0a 23 0a 23 20 20 20 43 52 45 41 54 45  ly:.#.#   CREATE
8b20: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
8b30: 31 20 55 53 49 4e 47 20 66 74 73 34 3b 20 20 20  1 USING fts4;   
8b40: 20 20 20 20 20 20 20 2d 2d 20 4f 6b 20 2d 20 6e         -- Ok - n
8b50: 6f 20 64 62 20 6e 61 6d 65 2e 0a 23 20 20 20 43  o db name..#   C
8b60: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
8b70: 42 4c 45 20 6d 61 69 6e 2e 74 31 20 55 53 49 4e  BLE main.t1 USIN
8b80: 47 20 66 74 73 34 28 78 29 3b 20 20 2d 2d 20 4f  G fts4(x);  -- O
8b90: 6b 20 2d 20 68 61 73 20 76 74 61 62 20 61 72 67  k - has vtab arg
8ba0: 75 6d 65 6e 74 73 2e 0a 23 20 20 20 43 52 45 41  uments..#   CREA
8bb0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
8bc0: 20 6d 61 69 6e 2e 74 31 20 55 53 49 4e 47 20 66   main.t1 USING f
8bd0: 74 73 34 3b 20 20 20 20 20 2d 2d 20 48 61 64 20  ts4;     -- Had 
8be0: 74 68 65 20 70 72 6f 62 6c 65 6d 2e 20 0a 23 0a  the problem. .#.
8bf0: 69 66 63 61 70 61 62 6c 65 20 66 74 73 33 20 7b  ifcapable fts3 {
8c00: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
8c10: 65 73 74 2e 64 62 32 0a 20 20 73 65 74 20 6e 6d  est.db2.  set nm
8c20: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
8c30: 61 62 63 64 65 66 67 68 69 6a 20 31 30 30 5d 0a  abcdefghij 100].
8c40: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
8c50: 74 20 32 32 2e 31 20 7b 0a 20 20 20 20 41 54 54  t 22.1 {.    ATT
8c60: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
8c70: 53 20 24 6e 6d 0a 20 20 7d 0a 20 20 0a 20 20 65  S $nm.  }.  .  e
8c80: 78 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 2a  xecsql "SELECT *
8c90: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
8ca0: 74 65 72 22 0a 20 20 64 6f 5f 65 78 65 63 73 71  ter".  do_execsq
8cb0: 6c 5f 74 65 73 74 20 32 32 2e 32 20 22 43 52 45  l_test 22.2 "CRE
8cc0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
8cd0: 45 20 24 7b 6e 6d 7d 2e 74 31 20 55 53 49 4e 47  E ${nm}.t1 USING
8ce0: 20 66 74 73 34 22 0a 20 20 0a 20 20 64 6f 5f 74   fts4".  .  do_t
8cf0: 65 73 74 20 32 32 2e 33 2e 31 20 7b 0a 20 20 20  est 22.3.1 {.   
8d00: 20 73 65 74 20 73 71 6c 20 22 43 52 45 41 54 45   set sql "CREATE
8d10: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 24   VIRTUAL TABLE $
8d20: 7b 6e 6d 7d 2e 74 32 20 55 53 49 4e 47 20 66 74  {nm}.t2 USING ft
8d30: 73 34 22 0a 20 20 20 20 73 65 74 20 73 74 6d 74  s4".    set stmt
8d40: 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   [sqlite3_prepar
8d50: 65 5f 76 32 20 64 62 20 24 73 71 6c 20 2d 31 20  e_v2 db $sql -1 
8d60: 64 75 6d 6d 79 5d 0a 20 20 20 20 73 71 6c 69 74  dummy].    sqlit
8d70: 65 33 5f 73 74 65 70 20 24 73 74 6d 74 0a 20 20  e3_step $stmt.  
8d80: 7d 20 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a  } {SQLITE_DONE}.
8d90: 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 32 32 2e    .  do_test 22.
8da0: 33 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  3.2 {.    sqlite
8db0: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74  3_finalize $stmt
8dc0: 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  .  } {SQLITE_OK}
8dd0: 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 32 32  .  .  do_test 22
8de0: 2e 34 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 73  .4.1 {.    set s
8df0: 71 6c 20 22 43 52 45 41 54 45 20 56 49 52 54 55  ql "CREATE VIRTU
8e00: 41 4c 20 54 41 42 4c 45 20 24 7b 6e 6d 7d 2e 74  AL TABLE ${nm}.t
8e10: 33 20 55 53 49 4e 47 20 66 74 73 34 22 0a 20 20  3 USING fts4".  
8e20: 20 20 73 65 74 20 6e 20 5b 73 74 72 69 6e 67 20    set n [string 
8e30: 6c 65 6e 67 74 68 20 24 73 71 6c 5d 0a 20 20 20  length $sql].   
8e40: 20 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74   set stmt [sqlit
8e50: 65 33 5f 70 72 65 70 61 72 65 20 64 62 20 22 24  e3_prepare db "$
8e60: 7b 73 71 6c 7d 78 79 7a 22 20 24 6e 20 64 75 6d  {sql}xyz" $n dum
8e70: 6d 79 5d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  my].    sqlite3_
8e80: 73 74 65 70 20 24 73 74 6d 74 0a 20 20 7d 20 7b  step $stmt.  } {
8e90: 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 20 20 0a  SQLITE_DONE}.  .
8ea0: 20 20 64 6f 5f 74 65 73 74 20 32 32 2e 34 2e 32    do_test 22.4.2
8eb0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   {.    sqlite3_f
8ec0: 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 0a 20 20  inalize $stmt.  
8ed0: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 7d 0a  } {SQLITE_OK}.}.
8ee0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
8f30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
8f40: 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 61  ts verify that a
8f50: 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d   DROP TABLE comm
8f60: 61 6e 64 20 6f 6e 20 61 20 76 69 72 74 75 61 6c  and on a virtual
8f70: 0a 23 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  .# table does no
8f80: 74 20 63 61 75 73 65 20 6f 74 68 65 72 20 6f 70  t cause other op
8f90: 65 72 61 74 69 6f 6e 73 20 74 6f 20 63 72 61 73  erations to cras
8fa0: 68 2e 0a 23 0a 23 20 20 20 32 33 2e 31 3a 20 44  h..#.#   23.1: D
8fb0: 72 6f 70 70 69 6e 67 20 61 20 76 74 61 62 20 77  ropping a vtab w
8fc0: 68 69 6c 65 20 61 20 53 45 4c 45 43 54 20 69 73  hile a SELECT is
8fd0: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 69 74 2e 0a   running on it..
8fe0: 23 0a 23 20 20 20 32 33 2e 32 3a 20 44 72 6f 70  #.#   23.2: Drop
8ff0: 70 69 6e 67 20 61 20 76 74 61 62 20 77 68 69 6c  ping a vtab whil
9000: 65 20 61 20 53 45 4c 45 43 54 20 74 68 61 74 20  e a SELECT that 
9010: 77 69 6c 6c 2c 20 62 75 74 20 68 61 73 20 6e 6f  will, but has no
9020: 74 20 79 65 74 2c 0a 23 20 20 20 20 20 20 20 20  t yet,.#        
9030: 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 6f   open a cursor o
9040: 6e 20 74 68 65 20 76 74 61 62 2c 20 69 73 20 72  n the vtab, is r
9050: 75 6e 6e 69 6e 67 2e 20 49 6e 20 74 68 69 73 20  unning. In this 
9060: 63 61 73 65 20 74 68 65 0a 23 20 20 20 20 20 20  case the.#      
9070: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 73 75     DROP TABLE su
9080: 63 63 65 65 64 73 20 61 6e 64 20 74 68 65 20 53  cceeds and the S
9090: 45 4c 45 43 54 20 68 69 74 73 20 61 6e 20 65 72  ELECT hits an er
90a0: 72 6f 72 2e 0a 23 20 20 20 0a 23 20 20 20 32 33  ror..#   .#   23
90b0: 2e 33 3a 20 44 72 6f 70 70 69 6e 67 20 61 20 76  .3: Dropping a v
90c0: 74 61 62 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  tab from within 
90d0: 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 2d 66  a user-defined-f
90e0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  unction callback
90f0: 0a 23 20 20 20 20 20 20 20 20 20 69 6e 20 74 68  .#         in th
9100: 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20 22  e middle of an "
9110: 49 4e 53 45 52 54 20 49 4e 54 4f 20 76 74 61 62  INSERT INTO vtab
9120: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
9130: 74 65 6d 65 6e 74 2e 0a 23 0a 72 65 73 65 74 5f  tement..#.reset_
9140: 64 62 0a 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65  db.load_static_e
9150: 78 74 65 6e 73 69 6f 6e 20 64 62 20 77 68 6f 6c  xtension db whol
9160: 65 6e 75 6d 62 65 72 0a 6c 6f 61 64 5f 73 74 61  enumber.load_sta
9170: 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 64 62  tic_extension db
9180: 20 65 76 61 6c 0a 72 65 67 69 73 74 65 72 5f 65   eval.register_e
9190: 63 68 6f 5f 6d 6f 64 75 6c 65 20 64 62 0a 0a 64  cho_module db..d
91a0: 6f 5f 74 65 73 74 20 32 33 2e 31 20 7b 0a 20 20  o_test 23.1 {.  
91b0: 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45  execsql { CREATE
91c0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
91d0: 31 20 55 53 49 4e 47 20 77 68 6f 6c 65 6e 75 6d  1 USING wholenum
91e0: 62 65 72 20 7d 0a 20 20 73 65 74 20 72 65 73 20  ber }.  set res 
91f0: 22 22 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53  "".  db eval { S
9200: 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d  ELECT value FROM
9210: 20 74 31 20 57 48 45 52 45 20 76 61 6c 75 65 3c   t1 WHERE value<
9220: 31 30 20 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24  10 } {.    if {$
9230: 76 61 6c 75 65 20 3d 3d 20 35 7d 20 7b 0a 20 20  value == 5} {.  
9240: 20 20 20 20 73 65 74 20 72 65 73 20 5b 63 61 74      set res [cat
9250: 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42  chsql { DROP TAB
9260: 4c 45 20 74 31 20 7d 5d 0a 20 20 20 20 7d 0a 20  LE t1 }].    }. 
9270: 20 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 20 7b   }.  set res.} {
9280: 31 20 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c  1 {database tabl
9290: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a 64  e is locked}}..d
92a0: 6f 5f 74 65 73 74 20 32 33 2e 32 20 7b 0a 20 20  o_test 23.2 {.  
92b0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 43  execsql { .    C
92c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 76  REATE TABLE t2(v
92d0: 61 6c 75 65 29 3b 0a 20 20 20 20 49 4e 53 45 52  alue);.    INSER
92e0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
92f0: 28 31 29 2c 20 28 32 29 2c 20 28 33 29 3b 0a 20  (1), (2), (3);. 
9300: 20 7d 0a 0a 20 20 73 65 74 20 72 65 73 32 20 5b   }..  set res2 [
9310: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 0a 20 20  list [catch {.  
9320: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
9330: 20 20 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46    SELECT value F
9340: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t2 UNION ALL
9350: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 76   .      SELECT v
9360: 61 6c 75 65 20 46 52 4f 4d 20 74 31 20 57 48 45  alue FROM t1 WHE
9370: 52 45 20 76 61 6c 75 65 3c 31 30 0a 20 20 20 20  RE value<10.    
9380: 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 76  } {.      if {$v
9390: 61 6c 75 65 20 3d 3d 20 32 7d 20 7b 20 73 65 74  alue == 2} { set
93a0: 20 72 65 73 31 20 5b 63 61 74 63 68 73 71 6c 20   res1 [catchsql 
93b0: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20  { DROP TABLE t1 
93c0: 7d 5d 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 6d  }] }.    }.  } m
93d0: 73 67 5d 20 24 6d 73 67 5d 0a 20 20 6c 69 73 74  sg] $msg].  list
93e0: 20 24 72 65 73 31 20 24 72 65 73 32 0a 7d 20 7b   $res1 $res2.} {
93f0: 7b 30 20 7b 7d 7d 20 7b 31 20 7b 64 61 74 61 62  {0 {}} {1 {datab
9400: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
9410: 6b 65 64 7d 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  ked}}}..do_test 
9420: 32 33 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  23.3.1 {.  execs
9430: 71 6c 20 7b 20 43 52 45 41 54 45 20 56 49 52 54  ql { CREATE VIRT
9440: 55 41 4c 20 54 41 42 4c 45 20 74 31 65 20 55 53  UAL TABLE t1e US
9450: 49 4e 47 20 65 63 68 6f 28 74 32 29 20 7d 0a 20  ING echo(t2) }. 
9460: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
9470: 54 20 49 4e 54 4f 20 74 31 65 20 53 45 4c 45 43  T INTO t1e SELEC
9480: 54 20 34 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  T 4 }.  catchsql
9490: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
94a0: 31 65 20 53 45 4c 45 43 54 20 65 76 61 6c 28 27  1e SELECT eval('
94b0: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 65 27 29  DROP TABLE t1e')
94c0: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73   }.} {1 {databas
94d0: 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
94e0: 64 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  d}}.do_execsql_t
94f0: 65 73 74 20 32 33 2e 33 2e 32 20 7b 20 53 45 4c  est 23.3.2 { SEL
9500: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 65 20 7d  ECT * FROM t1e }
9510: 20 7b 31 20 32 20 33 20 34 7d 0a 0a 23 2d 2d 2d   {1 2 3 4}..#---
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9560: 2d 2d 2d 2d 2d 2d 0a 23 20 41 74 20 6f 6e 65 20  ------.# At one 
9570: 70 6f 69 6e 74 20 53 51 4c 20 6c 69 6b 65 20 74  point SQL like t
9580: 68 69 73 3a 0a 23 0a 23 20 20 20 53 41 56 45 50  his:.#.#   SAVEP
9590: 4f 49 4e 54 20 78 79 7a 3b 20 20 20 20 20 20 20  OINT xyz;       
95a0: 2d 2d 20 4f 70 65 6e 73 20 53 51 4c 20 74 72 61  -- Opens SQL tra
95b0: 6e 73 61 63 74 69 6f 6e 0a 23 20 20 20 20 20 49  nsaction.#     I
95c0: 4e 53 45 52 54 20 49 4e 54 4f 20 76 74 61 62 20  NSERT INTO vtab 
95d0: 20 20 2d 2d 20 57 72 69 74 65 20 74 6f 20 76 69    -- Write to vi
95e0: 72 74 75 61 6c 20 74 61 62 6c 65 0a 23 20 20 20  rtual table.#   
95f0: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 78 79    ROLLBACK TO xy
9600: 7a 3b 0a 23 20 20 20 52 45 4c 45 41 53 45 20 78  z;.#   RELEASE x
9610: 79 7a 3b 0a 23 0a 23 20 77 61 73 20 6e 6f 74 20  yz;.#.# was not 
9620: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 78 52 6f  invoking the xRo
9630: 6c 6c 62 61 63 6b 54 6f 28 29 20 63 61 6c 6c 62  llbackTo() callb
9640: 61 63 6b 20 66 6f 72 20 74 68 65 20 52 4f 4c 4c  ack for the ROLL
9650: 42 41 43 4b 20 54 4f 20 0a 23 20 6f 70 65 72 61  BACK TO .# opera
9660: 74 69 6f 6e 2e 20 57 68 69 63 68 20 6d 65 61 6e  tion. Which mean
9670: 74 20 74 68 61 74 20 76 69 72 74 75 61 6c 20 74  t that virtual t
9680: 61 62 6c 65 73 20 6c 69 6b 65 20 46 54 53 33 20  ables like FTS3 
9690: 77 6f 75 6c 64 20 69 6e 63 6f 72 72 65 63 74 6c  would incorrectl
96a0: 79 20 0a 23 20 63 6f 6d 6d 69 74 20 74 68 65 20  y .# commit the 
96b0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 49  results of the I
96c0: 4e 53 45 52 54 20 61 73 20 70 61 72 74 20 6f 66  NSERT as part of
96d0: 20 74 68 65 20 22 52 45 4c 45 41 53 45 20 78 79   the "RELEASE xy
96e0: 7a 22 20 63 6f 6d 6d 61 6e 64 2e 0a 23 0a 23 20  z" command..#.# 
96f0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
9700: 73 74 73 20 63 68 65 63 6b 20 74 68 61 74 20 74  sts check that t
9710: 68 69 73 20 68 61 73 20 62 65 65 6e 20 66 69 78  his has been fix
9720: 65 64 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  ed..#.ifcapable 
9730: 66 74 73 33 20 7b 0a 20 20 64 6f 5f 65 78 65 63  fts3 {.  do_exec
9740: 73 71 6c 5f 74 65 73 74 20 32 34 2e 30 20 7b 0a  sql_test 24.0 {.
9750: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
9760: 41 4c 20 54 41 42 4c 45 20 74 34 20 55 53 49 4e  AL TABLE t4 USIN
9770: 47 20 66 74 73 33 28 29 3b 0a 20 20 20 20 53 41  G fts3();.    SA
9780: 56 45 50 4f 49 4e 54 20 61 3b 0a 20 20 20 20 49  VEPOINT a;.    I
9790: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
97a0: 4c 55 45 53 28 27 61 20 62 20 63 27 29 3b 0a 20  LUES('a b c');. 
97b0: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61     ROLLBACK TO a
97c0: 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20 61 3b  ;.    RELEASE a;
97d0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
97e0: 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b 7d 0a 0a 20  OM t4;.  } {}.. 
97f0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
9800: 20 32 34 2e 31 20 7b 20 53 45 4c 45 43 54 20 2a   24.1 { SELECT *
9810: 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 74   FROM t4 WHERE t
9820: 34 20 4d 41 54 43 48 20 27 62 27 20 7d 20 7b 7d  4 MATCH 'b' } {}
9830: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
9840: 73 74 20 32 34 2e 32 20 7b 20 49 4e 53 45 52 54  st 24.2 { INSERT
9850: 20 49 4e 54 4f 20 74 34 28 74 34 29 20 56 41 4c   INTO t4(t4) VAL
9860: 55 45 53 28 27 69 6e 74 65 67 72 69 74 79 2d 63  UES('integrity-c
9870: 68 65 63 6b 27 29 20 7d 20 7b 7d 0a 0a 20 20 64  heck') } {}..  d
9880: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
9890: 34 2e 33 20 7b 0a 20 20 20 20 53 41 56 45 50 4f  4.3 {.    SAVEPO
98a0: 49 4e 54 20 61 3b 0a 20 20 20 20 43 52 45 41 54  INT a;.    CREAT
98b0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
98c0: 74 35 20 55 53 49 4e 47 20 66 74 73 33 28 29 3b  t5 USING fts3();
98d0: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 62  .    SAVEPOINT b
98e0: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  ;.    ROLLBACK T
98f0: 4f 20 61 3b 0a 20 20 20 20 53 41 56 45 50 4f 49  O a;.    SAVEPOI
9900: 4e 54 20 63 3b 0a 20 20 20 20 52 45 4c 45 41 53  NT c;.    RELEAS
9910: 45 20 61 3b 0a 20 20 7d 0a 7d 0a 0a 66 69 6e 69  E a;.  }.}..fini
9920: 73 68 5f 74 65 73 74 0a                          sh_test.