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 65 78 70 6c 61 69 6e 20 7b 0a 20 {. explain {.
07b0: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 CREATE VIRTUA
07c0: 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 L TABLE t1 USING
07d0: 20 65 63 68 6f 3b 0a 20 20 7d 0a 20 20 63 61 74 echo;. }. cat
07e0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 chsql {. CREA
07f0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE
0800: 20 74 31 20 55 53 49 4e 47 20 65 63 68 6f 3b 0a t1 USING echo;.
0810: 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 }.} {1 {no suc
0820: 68 20 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d 7d h module: echo}}
0830: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 .do_test vtab1-1
0840: 2e 31 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 .1.2 {. catchsq
0850: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56 l {. CREATE V
0860: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 46 20 IRTUAL TABLE IF
0870: 4e 4f 54 20 45 58 49 53 54 53 20 74 31 20 55 53 NOT EXISTS t1 US
0880: 49 4e 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 ING echo;. }.}
0890: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64 75 {1 {no such modu
08a0: 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74 65 le: echo}}.do_te
08b0: 73 74 20 76 74 61 62 31 2d 31 2e 32 20 7b 0a 20 st vtab1-1.2 {.
08c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 execsql {. S
08d0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 ELECT name FROM
08e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 sqlite_master OR
08f0: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b DER BY 1. }.} {
0900: 7d 0a 0a 23 20 52 65 67 69 73 74 65 72 20 74 68 }..# Register th
0910: 65 20 6d 6f 64 75 6c 65 0a 72 65 67 69 73 74 65 e module.registe
0920: 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 r_echo_module [s
0930: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f qlite3_connectio
0940: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 0a 23 n_pointer db]..#
0950: 20 4f 6e 63 65 20 61 20 6d 6f 64 75 6c 65 20 68 Once a module h
0960: 61 73 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 as been register
0970: 65 64 2c 20 76 69 72 74 75 61 6c 20 74 61 62 6c ed, virtual tabl
0980: 65 73 20 75 73 69 6e 67 20 74 68 61 74 20 6d 6f es using that mo
0990: 64 75 6c 65 0a 23 20 6d 61 79 20 62 65 20 63 72 dule.# may be cr
09a0: 65 61 74 65 64 2e 20 48 6f 77 65 76 65 72 20 69 eated. However i
09b0: 66 20 61 20 6d 6f 64 75 6c 65 20 78 43 72 65 61 f a module xCrea
09c0: 74 65 28 29 20 66 61 69 6c 73 20 74 6f 20 63 61 te() fails to ca
09d0: 6c 6c 0a 23 20 73 71 6c 69 74 65 33 5f 64 65 63 ll.# sqlite3_dec
09e0: 6c 61 72 65 5f 76 74 61 62 28 29 20 61 6e 20 65 lare_vtab() an e
09f0: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 61 69 rror will be rai
0a00: 73 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c sed and the tabl
0a10: 65 20 6e 6f 74 20 63 72 65 61 74 65 64 2e 0a 23 e not created..#
0a20: 0a 23 20 54 68 65 20 22 65 63 68 6f 22 20 6d 6f .# The "echo" mo
0a30: 64 75 6c 65 20 64 6f 65 73 20 6e 6f 74 20 69 6e dule does not in
0a40: 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 64 65 63 voke sqlite3_dec
0a50: 6c 61 72 65 5f 76 74 61 62 28 29 20 69 66 20 69 lare_vtab() if i
0a60: 74 20 69 73 0a 23 20 70 61 73 73 65 64 20 7a 65 t is.# passed ze
0a70: 72 6f 20 61 72 67 75 6d 65 6e 74 73 2e 0a 23 0a ro arguments..#.
0a80: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e do_test vtab1-1.
0a90: 33 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 3.1 {. catchsql
0aa0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 {. CREATE VI
0ab0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 RTUAL TABLE t1 U
0ac0: 53 49 4e 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 7d SING echo;. }.}
0ad0: 20 7b 31 20 7b 76 74 61 62 6c 65 20 63 6f 6e 73 {1 {vtable cons
0ae0: 74 72 75 63 74 6f 72 20 64 69 64 20 6e 6f 74 20 tructor did not
0af0: 64 65 63 6c 61 72 65 20 73 63 68 65 6d 61 3a 20 declare schema:
0b00: 74 31 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 t1}}.do_test vta
0b10: 62 31 2d 31 2e 33 2e 32 20 7b 0a 20 20 63 61 74 b1-1.3.2 {. cat
0b20: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 chsql {. CREA
0b30: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE
0b40: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 IF NOT EXISTS t
0b50: 31 20 55 53 49 4e 47 20 65 63 68 6f 3b 0a 20 20 1 USING echo;.
0b60: 7d 0a 7d 20 7b 31 20 7b 76 74 61 62 6c 65 20 63 }.} {1 {vtable c
0b70: 6f 6e 73 74 72 75 63 74 6f 72 20 64 69 64 20 6e onstructor did n
0b80: 6f 74 20 64 65 63 6c 61 72 65 20 73 63 68 65 6d ot declare schem
0b90: 61 3a 20 74 31 7d 7d 0a 64 6f 5f 74 65 73 74 20 a: t1}}.do_test
0ba0: 76 74 61 62 31 2d 31 2e 34 20 7b 0a 20 20 65 78 vtab1-1.4 {. ex
0bb0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 ecsql {. SELE
0bc0: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c CT name FROM sql
0bd0: 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 ite_master ORDER
0be0: 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a BY 1. }.} {}..
0bf0: 23 20 54 68 65 20 22 65 63 68 6f 22 20 6d 6f 64 # The "echo" mod
0c00: 75 6c 65 20 78 43 72 65 61 74 65 20 6d 65 74 68 ule xCreate meth
0c10: 6f 64 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 od returns an er
0c20: 72 6f 72 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 ror and does not
0c30: 20 63 72 65 61 74 65 0a 23 20 74 68 65 20 76 69 create.# the vi
0c40: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 66 20 69 rtual table if i
0c50: 74 20 69 73 20 70 61 73 73 65 64 20 61 6e 20 61 t is passed an a
0c60: 72 67 75 6d 65 6e 74 20 74 68 61 74 20 64 6f 65 rgument that doe
0c70: 73 20 6e 6f 74 20 63 6f 72 72 65 73 70 6f 6e 64 s not correspond
0c80: 0a 23 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e .# to an existin
0c90: 67 20 72 65 61 6c 20 74 61 62 6c 65 20 69 6e 20 g real table in
0ca0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 the same databas
0cb0: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74 61 e..#.do_test vta
0cc0: 62 31 2d 31 2e 35 2e 31 20 7b 0a 20 20 63 61 74 b1-1.5.1 {. cat
0cd0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 chsql {. CREA
0ce0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE
0cf0: 20 74 31 20 55 53 49 4e 47 20 65 63 68 6f 28 6e t1 USING echo(n
0d00: 6f 5f 73 75 63 68 5f 74 61 62 6c 65 29 3b 0a 20 o_such_table);.
0d10: 20 7d 0a 7d 20 7b 31 20 7b 76 74 61 62 6c 65 20 }.} {1 {vtable
0d20: 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 61 69 6c constructor fail
0d30: 65 64 3a 20 74 31 7d 7d 0a 64 6f 5f 74 65 73 74 ed: t1}}.do_test
0d40: 20 76 74 61 62 31 2d 31 2e 35 2e 32 20 7b 0a 20 vtab1-1.5.2 {.
0d50: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 catchsql {.
0d60: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 CREATE VIRTUAL T
0d70: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
0d80: 54 53 20 74 31 20 55 53 49 4e 47 20 65 63 68 6f TS t1 USING echo
0d90: 28 6e 6f 5f 73 75 63 68 5f 74 61 62 6c 65 29 3b (no_such_table);
0da0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 76 74 61 62 6c . }.} {1 {vtabl
0db0: 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 61 e constructor fa
0dc0: 69 6c 65 64 3a 20 74 31 7d 7d 0a 64 6f 5f 74 65 iled: t1}}.do_te
0dd0: 73 74 20 76 74 61 62 31 2d 31 2e 36 20 7b 0a 20 st vtab1-1.6 {.
0de0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 execsql {. S
0df0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 ELECT name FROM
0e00: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 sqlite_master OR
0e10: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b DER BY 1. }.} {
0e20: 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23 32 31 35 }..# Ticket #215
0e30: 36 2e 20 20 55 73 69 6e 67 20 74 68 65 20 73 71 6. Using the sq
0e40: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 lite3_prepare_v2
0e50: 28 29 20 41 50 49 2c 20 6d 61 6b 65 20 73 75 72 () API, make sur
0e60: 65 20 74 68 61 74 0a 23 20 61 20 43 52 45 41 54 e that.# a CREAT
0e70: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 E VIRTUAL TABLE
0e80: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65 statement can be
0e90: 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 used multiple t
0ea0: 69 6d 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 imes..#.do_test
0eb0: 76 74 61 62 31 2d 31 2e 32 31 35 32 2e 31 20 7b vtab1-1.2152.1 {
0ec0: 0a 20 20 73 65 74 20 44 42 20 5b 73 71 6c 69 74 . set DB [sqlit
0ed0: 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f e3_connection_po
0ee0: 69 6e 74 65 72 20 64 62 5d 0a 20 20 73 65 74 20 inter db]. set
0ef0: 73 71 6c 20 7b 43 52 45 41 54 45 20 56 49 52 54 sql {CREATE VIRT
0f00: 55 41 4c 20 54 41 42 4c 45 20 74 32 31 35 32 61 UAL TABLE t2152a
0f10: 20 55 53 49 4e 47 20 65 63 68 6f 28 74 32 31 35 USING echo(t215
0f20: 32 62 29 7d 0a 20 20 73 65 74 20 53 54 4d 54 20 2b)}. set STMT
0f30: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 [sqlite3_prepare
0f40: 5f 76 32 20 24 44 42 20 24 73 71 6c 20 2d 31 20 _v2 $DB $sql -1
0f50: 54 41 49 4c 5d 0a 20 20 73 71 6c 69 74 65 33 5f TAIL]. sqlite3_
0f60: 73 74 65 70 20 24 53 54 4d 54 0a 7d 20 53 51 4c step $STMT.} SQL
0f70: 49 54 45 5f 45 52 52 4f 52 0a 64 6f 5f 74 65 73 ITE_ERROR.do_tes
0f80: 74 20 76 74 61 62 2d 31 2e 32 31 35 32 2e 32 20 t vtab-1.2152.2
0f90: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 {. sqlite3_rese
0fa0: 74 20 24 53 54 4d 54 0a 20 20 73 71 6c 69 74 65 t $STMT. sqlite
0fb0: 33 5f 73 74 65 70 20 24 53 54 4d 54 0a 7d 20 53 3_step $STMT.} S
0fc0: 51 4c 49 54 45 5f 45 52 52 4f 52 0a 64 6f 5f 74 QLITE_ERROR.do_t
0fd0: 65 73 74 20 76 74 61 62 2d 31 2e 32 31 35 32 2e est vtab-1.2152.
0fe0: 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 3 {. sqlite3_re
0ff0: 73 65 74 20 24 53 54 4d 54 0a 20 20 64 62 20 65 set $STMT. db e
1000: 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c val {CREATE TABL
1010: 45 20 74 32 31 35 32 62 28 78 2c 79 29 7d 0a 20 E t2152b(x,y)}.
1020: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 53 sqlite3_step $S
1030: 54 4d 54 0a 7d 20 53 51 4c 49 54 45 5f 44 4f 4e TMT.} SQLITE_DON
1040: 45 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 2d 31 E.do_test vtab-1
1050: 2e 32 31 35 32 2e 34 20 7b 0a 20 20 73 71 6c 69 .2152.4 {. sqli
1060: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 53 54 te3_finalize $ST
1070: 4d 54 0a 20 20 64 62 20 65 76 61 6c 20 7b 44 52 MT. db eval {DR
1080: 4f 50 20 54 41 42 4c 45 20 74 32 31 35 32 61 3b OP TABLE t2152a;
1090: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 31 35 DROP TABLE t215
10a0: 32 62 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 2b}.} {}..# Test
10b0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f to make sure no
10c0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 thing goes wrong
10d0: 20 61 6e 64 20 6e 6f 20 6d 65 6d 6f 72 79 20 69 and no memory i
10e0: 73 20 6c 65 61 6b 65 64 20 69 66 20 77 65 20 0a s leaked if we .
10f0: 23 20 73 65 6c 65 63 74 20 61 6e 20 69 6c 6c 65 # select an ille
1100: 67 61 6c 20 74 61 62 6c 65 2d 6e 61 6d 65 20 28 gal table-name (
1110: 69 2e 65 20 61 20 72 65 73 65 72 76 65 64 20 6e i.e a reserved n
1120: 61 6d 65 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 ame or the name
1130: 6f 66 20 61 0a 23 20 74 61 62 6c 65 20 74 68 61 of a.# table tha
1140: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 t already exists
1150: 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74 61 )..#.do_test vta
1160: 62 31 2d 31 2e 37 2e 31 20 7b 0a 20 20 63 61 74 b1-1.7.1 {. cat
1170: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 chsql {. CREA
1180: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE
1190: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 sqlite_master U
11a0: 53 49 4e 47 20 65 63 68 6f 3b 0a 20 20 7d 0a 7d SING echo;. }.}
11b0: 20 7b 31 20 7b 6f 62 6a 65 63 74 20 6e 61 6d 65 {1 {object name
11c0: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e reserved for in
11d0: 74 65 72 6e 61 6c 20 75 73 65 3a 20 73 71 6c 69 ternal use: sqli
11e0: 74 65 5f 6d 61 73 74 65 72 7d 7d 0a 64 6f 5f 74 te_master}}.do_t
11f0: 65 73 74 20 76 74 61 62 31 2d 31 2e 37 2e 32 20 est vtab1-1.7.2
1200: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 {. catchsql {.
1210: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 CREATE VIRTUA
1220: 4c 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 L TABLE IF NOT E
1230: 58 49 53 54 53 20 73 71 6c 69 74 65 5f 6d 61 73 XISTS sqlite_mas
1240: 74 65 72 20 55 53 49 4e 47 20 65 63 68 6f 3b 0a ter USING echo;.
1250: 20 20 7d 0a 7d 20 7b 31 20 7b 6f 62 6a 65 63 74 }.} {1 {object
1260: 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 name reserved f
1270: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a or internal use:
1280: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 7d sqlite_master}}
1290: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 .do_test vtab1-1
12a0: 2e 38 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 .8.1 {. catchsq
12b0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 l {. CREATE T
12c0: 41 42 4c 45 20 74 72 65 61 6c 28 61 2c 20 62 2c ABLE treal(a, b,
12d0: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 c);. CREATE
12e0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 72 VIRTUAL TABLE tr
12f0: 65 61 6c 20 55 53 49 4e 47 20 65 63 68 6f 28 74 eal USING echo(t
1300: 72 65 61 6c 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 real);. }.} {1
1310: 7b 74 61 62 6c 65 20 74 72 65 61 6c 20 61 6c 72 {table treal alr
1320: 65 61 64 79 20 65 78 69 73 74 73 7d 7d 0a 64 6f eady exists}}.do
1330: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e 38 2e _test vtab1-1.8.
1340: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 2 {. catchsql {
1350: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 . CREATE VIRT
1360: 55 41 4c 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 UAL TABLE IF NOT
1370: 20 45 58 49 53 54 53 20 74 72 65 61 6c 20 55 53 EXISTS treal US
1380: 49 4e 47 20 65 63 68 6f 28 74 72 65 61 6c 29 3b ING echo(treal);
1390: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f . }.} {0 {}}.do
13a0: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e 39 20 _test vtab1-1.9
13b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 {. execsql {.
13c0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 72 65 DROP TABLE tre
13d0: 61 6c 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e al;. SELECT n
13e0: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f ame FROM sqlite_
13f0: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 master ORDER BY
1400: 31 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 1. }.} {}..do_t
1410: 65 73 74 20 76 74 61 62 31 2d 31 2e 31 30 20 7b est vtab1-1.10 {
1420: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 . execsql {.
1430: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 72 CREATE TABLE tr
1440: 65 61 6c 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 eal(a, b, c);.
1450: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c CREATE VIRTUAL
1460: 20 54 41 42 4c 45 20 74 65 63 68 6f 20 55 53 49 TABLE techo USI
1470: 4e 47 20 65 63 68 6f 28 74 72 65 61 6c 29 3b 0a NG echo(treal);.
1480: 20 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 }. db close.
1490: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 sqlite3 db test
14a0: 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b .db. catchsql {
14b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 . SELECT * FR
14c0: 4f 4d 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 OM techo;. }.}
14d0: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f 64 75 {1 {no such modu
14e0: 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 6f 5f 74 65 le: echo}}.do_te
14f0: 73 74 20 76 74 61 62 31 2d 31 2e 31 31 20 7b 0a st vtab1-1.11 {.
1500: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 catchsql {.
1510: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 63 INSERT INTO tec
1520: 68 6f 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 ho VALUES(1, 2,
1530: 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 3);. }.} {1 {no
1540: 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 such module: ec
1550: 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 ho}}.do_test vta
1560: 62 31 2d 31 2e 31 32 20 7b 0a 20 20 63 61 74 63 b1-1.12 {. catc
1570: 68 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 hsql {. UPDAT
1580: 45 20 74 65 63 68 6f 20 53 45 54 20 61 20 3d 20 E techo SET a =
1590: 31 30 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 10;. }.} {1 {no
15a0: 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a 20 65 63 such module: ec
15b0: 68 6f 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 ho}}.do_test vta
15c0: 62 31 2d 31 2e 31 33 20 7b 0a 20 20 63 61 74 63 b1-1.13 {. catc
15d0: 68 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 hsql {. DELET
15e0: 45 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a 20 20 E FROM techo;.
15f0: 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 }.} {1 {no such
1600: 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 module: echo}}.d
1610: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31 o_test vtab1-1.1
1620: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 4 {. catchsql {
1630: 0a 20 20 20 20 50 52 41 47 4d 41 20 74 61 62 6c . PRAGMA tabl
1640: 65 5f 69 6e 66 6f 28 74 65 63 68 6f 29 0a 20 20 e_info(techo).
1650: 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 }.} {1 {no such
1660: 6d 6f 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 64 module: echo}}.d
1670: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31 o_test vtab1-1.1
1680: 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 5 {. catchsql {
1690: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 . DROP TABLE
16a0: 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 techo;. }.} {1
16b0: 7b 6e 6f 20 73 75 63 68 20 6d 6f 64 75 6c 65 3a {no such module:
16c0: 20 65 63 68 6f 7d 7d 0a 0a 72 65 67 69 73 74 65 echo}}..registe
16d0: 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 r_echo_module [s
16e0: 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f qlite3_connectio
16f0: 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a 72 65 n_pointer db].re
1700: 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 gister_echo_modu
1710: 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e le [sqlite3_conn
1720: 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 ection_pointer d
1730: 62 5d 0a 0a 23 20 54 65 73 74 20 61 6e 20 65 72 b]..# Test an er
1740: 72 6f 72 20 6d 65 73 73 61 67 65 20 72 65 74 75 ror message retu
1750: 72 6e 65 64 20 66 72 6f 6d 20 61 20 76 2d 74 61 rned from a v-ta
1760: 62 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 2e ble constructor.
1770: 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 .#.do_test vtab1
1780: 2d 31 2e 31 36 20 7b 0a 20 20 65 78 65 63 73 71 -1.16 {. execsq
1790: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 l {. DROP TAB
17a0: 4c 45 20 74 65 63 68 6f 3b 0a 20 20 20 20 43 52 LE techo;. CR
17b0: 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 6d 73 EATE TABLE logms
17c0: 67 28 6c 6f 67 29 3b 0a 20 20 7d 0a 20 20 63 61 g(log);. }. ca
17d0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 tchsql {. CRE
17e0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c ATE VIRTUAL TABL
17f0: 45 20 74 65 63 68 6f 20 55 53 49 4e 47 20 65 63 E techo USING ec
1800: 68 6f 28 74 72 65 61 6c 2c 20 6c 6f 67 6d 73 67 ho(treal, logmsg
1810: 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 74 61 62 );. }.} {1 {tab
1820: 6c 65 20 27 6c 6f 67 6d 73 67 27 20 61 6c 72 65 le 'logmsg' alre
1830: 61 64 79 20 65 78 69 73 74 73 7d 7d 0a 0a 64 6f ady exists}}..do
1840: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 2e 31 37 _test vtab1-1.17
1850: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 {. execsql {.
1860: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 72 DROP TABLE tr
1870: 65 61 6c 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 eal;. DROP TA
1880: 42 4c 45 20 6c 6f 67 6d 73 67 3b 0a 20 20 20 20 BLE logmsg;.
1890: 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 SELECT sql FROM
18a0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 sqlite_master;.
18b0: 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d }.} {}..#------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1900: 0a 23 20 54 65 73 74 20 63 61 73 65 73 20 76 74 .# Test cases vt
1910: 61 62 31 2e 32 2e 2a 0a 23 0a 23 20 41 74 20 74 ab1.2.*.#.# At t
1920: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 64 his point, the d
1930: 61 74 61 62 61 73 65 20 69 73 20 63 6f 6d 70 6c atabase is compl
1940: 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 54 68 65 etely empty. The
1950: 20 65 63 68 6f 20 6d 6f 64 75 6c 65 0a 23 20 68 echo module.# h
1960: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 as already been
1970: 72 65 67 69 73 74 65 72 65 64 2e 0a 0a 23 20 49 registered...# I
1980: 66 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d f a single argum
1990: 65 6e 74 20 69 73 20 70 61 73 73 65 64 20 74 6f ent is passed to
19a0: 20 74 68 65 20 65 63 68 6f 20 6d 6f 64 75 6c 65 the echo module
19b0: 20 64 75 72 69 6e 67 20 74 61 62 6c 65 0a 23 20 during table.#
19c0: 63 72 65 61 74 69 6f 6e 2c 20 69 74 20 69 73 20 creation, it is
19d0: 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 74 68 assumed to be th
19e0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c e name of a tabl
19f0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 0a 23 20 e in the same.#
1a00: 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 65 63 database. The ec
1a10: 68 6f 20 6d 6f 64 75 6c 65 20 61 74 74 65 6d 70 ho module attemp
1a20: 74 73 20 74 6f 20 73 65 74 20 74 68 65 20 73 63 ts to set the sc
1a30: 68 65 6d 61 20 6f 66 20 74 68 65 0a 23 20 6e 65 hema of the.# ne
1a40: 77 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 w virtual table
1a50: 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 to be the same a
1a60: 73 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 s the existing d
1a70: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 23 atabase table..#
1a80: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32 .do_test vtab1-2
1a90: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b .1 {. execsql {
1aa0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c . CREATE TABL
1ab0: 45 20 74 65 6d 70 6c 61 74 65 28 61 2c 20 62 2c E template(a, b,
1ac0: 20 63 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 c);. }. execs
1ad0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 74 61 62 6c ql { PRAGMA tabl
1ae0: 65 5f 69 6e 66 6f 28 74 65 6d 70 6c 61 74 65 29 e_info(template)
1af0: 3b 20 7d 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 ; }.} [list
1b00: 20 20 20 20 5c 0a 20 20 30 20 61 20 7b 7d 20 30 \. 0 a {} 0
1b10: 20 7b 7d 20 30 20 5c 0a 20 20 31 20 62 20 7b 7d {} 0 \. 1 b {}
1b20: 20 30 20 7b 7d 20 30 20 5c 0a 20 20 32 20 63 20 0 {} 0 \. 2 c
1b30: 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 5d 0a 64 6f {} 0 {} 0 \.].do
1b40: 5f 74 65 73 74 20 76 74 61 62 31 2d 32 2e 32 20 _test vtab1-2.2
1b50: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 {. execsql {.
1b60: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c CREATE VIRTUAL
1b70: 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 TABLE t1 USING
1b80: 65 63 68 6f 28 74 65 6d 70 6c 61 74 65 29 3b 0a echo(template);.
1b90: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 }. execsql {
1ba0: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 PRAGMA table_inf
1bb0: 6f 28 74 31 29 3b 20 7d 0a 7d 20 5b 6c 69 73 74 o(t1); }.} [list
1bc0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 30 20 61 \. 0 a
1bd0: 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20 20 31 {} 0 {} 0 \. 1
1be0: 20 62 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 0a 20 b {} 0 {} 0 \.
1bf0: 20 32 20 63 20 7b 7d 20 30 20 7b 7d 20 30 20 5c 2 c {} 0 {} 0 \
1c00: 0a 5d 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 .]..# Test that
1c10: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e the database can
1c20: 20 62 65 20 75 6e 6c 6f 61 64 65 64 2e 20 54 68 be unloaded. Th
1c30: 69 73 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 is should invoke
1c40: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 the xDisconnect
1c50: 28 29 0a 23 20 63 61 6c 6c 62 61 63 6b 20 66 6f ().# callback fo
1c60: 72 20 74 68 65 20 73 75 63 63 65 73 73 66 75 6c r the successful
1c70: 6c 79 20 63 72 65 61 74 65 20 76 69 72 74 75 61 ly create virtua
1c80: 6c 20 74 61 62 6c 65 20 28 74 31 29 2e 0a 23 0a l table (t1)..#.
1c90: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32 2e do_test vtab1-2.
1ca0: 33 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 3 {. set echo_m
1cb0: 6f 64 75 6c 65 20 5b 6c 69 73 74 5d 0a 20 20 64 odule [list]. d
1cc0: 62 20 63 6c 6f 73 65 0a 20 20 73 65 74 20 65 63 b close. set ec
1cd0: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 ho_module.} [lis
1ce0: 74 20 78 44 69 73 63 6f 6e 6e 65 63 74 5d 0a 0a t xDisconnect]..
1cf0: 23 20 52 65 2d 6f 70 65 6e 20 74 68 65 20 64 61 # Re-open the da
1d00: 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 68 6f tabase. This sho
1d10: 75 6c 64 20 6e 6f 74 20 63 61 75 73 65 20 61 6e uld not cause an
1d20: 79 20 76 69 72 74 75 61 6c 20 6d 65 74 68 6f 64 y virtual method
1d30: 73 20 74 6f 20 0a 23 20 62 65 20 63 61 6c 6c 65 s to .# be calle
1d40: 64 2e 20 54 68 65 20 69 6e 76 6f 63 61 74 69 6f d. The invocatio
1d50: 6e 20 6f 66 20 78 43 6f 6e 6e 65 63 74 28 29 20 n of xConnect()
1d60: 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c is delayed until
1d70: 20 74 68 65 20 76 69 72 74 75 61 6c 0a 23 20 74 the virtual.# t
1d80: 61 62 6c 65 20 73 63 68 65 6d 61 20 69 73 20 66 able schema is f
1d90: 69 72 73 74 20 72 65 71 75 69 72 65 64 20 62 79 irst required by
1da0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 0a 23 the compiler..#
1db0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32 .do_test vtab1-2
1dc0: 2e 34 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f .4 {. set echo_
1dd0: 6d 6f 64 75 6c 65 20 5b 6c 69 73 74 5d 0a 20 20 module [list].
1de0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e sqlite3 db test.
1df0: 64 62 0a 20 20 64 62 20 63 61 63 68 65 20 73 69 db. db cache si
1e00: 7a 65 20 30 0a 20 20 73 65 74 20 65 63 68 6f 5f ze 0. set echo_
1e10: 6d 6f 64 75 6c 65 0a 7d 20 7b 7d 0a 0a 23 20 54 module.} {}..# T
1e20: 72 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 ry to query the
1e30: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63 virtual table sc
1e40: 68 65 6d 61 2e 20 54 68 69 73 20 73 68 6f 75 6c hema. This shoul
1e50: 64 20 66 61 69 6c 2c 20 61 73 20 74 68 65 0a 23 d fail, as the.#
1e60: 20 65 63 68 6f 20 6d 6f 64 75 6c 65 20 68 61 73 echo module has
1e70: 20 6e 6f 74 20 62 65 65 6e 20 72 65 67 69 73 74 not been regist
1e80: 65 72 65 64 20 77 69 74 68 20 74 68 69 73 20 64 ered with this d
1e90: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
1ea0: 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 74 on..#.do_test vt
1eb0: 61 62 31 2e 32 2e 36 20 7b 0a 20 20 63 61 74 63 ab1.2.6 {. catc
1ec0: 68 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 74 61 hsql { PRAGMA ta
1ed0: 62 6c 65 5f 69 6e 66 6f 28 74 31 29 3b 20 7d 0a ble_info(t1); }.
1ee0: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 6d 6f } {1 {no such mo
1ef0: 64 75 6c 65 3a 20 65 63 68 6f 7d 7d 0a 0a 23 20 dule: echo}}..#
1f00: 52 65 67 69 73 74 65 72 20 74 68 65 20 6d 6f 64 Register the mod
1f10: 75 6c 65 0a 72 65 67 69 73 74 65 72 5f 65 63 68 ule.register_ech
1f20: 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 o_module [sqlite
1f30: 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 3_connection_poi
1f40: 6e 74 65 72 20 64 62 5d 0a 0a 23 20 54 72 79 20 nter db]..# Try
1f50: 74 6f 20 71 75 65 72 79 20 74 68 65 20 76 69 72 to query the vir
1f60: 74 75 61 6c 20 74 61 62 6c 65 20 73 63 68 65 6d tual table schem
1f70: 61 20 61 67 61 69 6e 2e 20 54 68 69 73 20 74 69 a again. This ti
1f80: 6d 65 20 69 74 20 73 68 6f 75 6c 64 0a 23 20 69 me it should.# i
1f90: 6e 76 6f 6b 65 20 74 68 65 20 78 43 6f 6e 6e 65 nvoke the xConne
1fa0: 63 74 20 6d 65 74 68 6f 64 20 61 6e 64 20 73 75 ct method and su
1fb0: 63 63 65 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 cceed..#.do_test
1fc0: 20 76 74 61 62 31 2e 32 2e 37 20 7b 0a 20 20 65 vtab1.2.7 {. e
1fd0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 xecsql { PRAGMA
1fe0: 74 61 62 6c 65 5f 69 6e 66 6f 28 74 31 29 3b 20 table_info(t1);
1ff0: 7d 0a 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 }.} [list
2000: 20 20 5c 0a 20 20 30 20 61 20 7b 7d 20 30 20 7b \. 0 a {} 0 {
2010: 7d 20 30 20 5c 0a 20 20 31 20 62 20 7b 7d 20 30 } 0 \. 1 b {} 0
2020: 20 7b 7d 20 30 20 5c 0a 20 20 32 20 63 20 7b 7d {} 0 \. 2 c {}
2030: 20 30 20 7b 7d 20 30 20 5c 0a 5d 0a 64 6f 5f 74 0 {} 0 \.].do_t
2040: 65 73 74 20 76 74 61 62 31 2e 32 2e 38 20 7b 0a est vtab1.2.8 {.
2050: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c set echo_modul
2060: 65 0a 7d 20 7b 78 43 6f 6e 6e 65 63 74 20 65 63 e.} {xConnect ec
2070: 68 6f 20 6d 61 69 6e 20 74 31 20 74 65 6d 70 6c ho main t1 templ
2080: 61 74 65 7d 0a 0a 23 20 44 72 6f 70 20 74 61 62 ate}..# Drop tab
2090: 6c 65 20 74 31 2e 20 54 68 69 73 20 73 68 6f 75 le t1. This shou
20a0: 6c 64 20 63 61 75 73 65 20 74 68 65 20 78 44 65 ld cause the xDe
20b0: 73 74 72 6f 79 20 28 62 75 74 20 6e 6f 74 20 78 stroy (but not x
20c0: 44 69 73 63 6f 6e 6e 65 63 74 29 20 6d 65 74 68 Disconnect) meth
20d0: 6f 64 20 0a 23 20 74 6f 20 62 65 20 69 6e 76 6f od .# to be invo
20e0: 6b 65 64 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 ked..do_test vta
20f0: 62 31 2d 32 2e 35 20 7b 0a 20 20 73 65 74 20 65 b1-2.5 {. set e
2100: 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 cho_module "".
2110: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 execsql {. DR
2120: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 7d OP TABLE t1;. }
2130: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 . set echo_modu
2140: 6c 65 0a 7d 20 7b 78 44 65 73 74 72 6f 79 7d 0a le.} {xDestroy}.
2150: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 32 .do_test vtab1-2
2160: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b .6 {. execsql {
2170: 20 0a 20 20 20 20 50 52 41 47 4d 41 20 74 61 62 . PRAGMA tab
2180: 6c 65 5f 69 6e 66 6f 28 74 31 29 3b 20 0a 20 20 le_info(t1); .
2190: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 }.} {}.do_test v
21a0: 74 61 62 31 2d 32 2e 37 20 7b 0a 20 20 65 78 65 tab1-2.7 {. exe
21b0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 csql {. SELEC
21c0: 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 T sql FROM sqlit
21d0: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 e_master;. }.}
21e0: 5b 6c 69 73 74 20 7b 43 52 45 41 54 45 20 54 41 [list {CREATE TA
21f0: 42 4c 45 20 74 65 6d 70 6c 61 74 65 28 61 2c 20 BLE template(a,
2200: 62 2c 20 63 29 7d 5d 0a 23 20 43 6c 65 61 6e 20 b, c)}].# Clean
2210: 75 70 20 6f 74 68 65 72 20 74 65 73 74 20 61 72 up other test ar
2220: 74 69 66 61 63 74 73 3a 0a 64 6f 5f 74 65 73 74 tifacts:.do_test
2230: 20 76 74 61 62 31 2d 32 2e 38 20 7b 0a 20 20 65 vtab1-2.8 {. e
2240: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 52 xecsql { . DR
2250: 4f 50 20 54 41 42 4c 45 20 74 65 6d 70 6c 61 74 OP TABLE templat
2260: 65 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 73 71 e;. SELECT sq
2270: 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 l FROM sqlite_ma
2280: 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 5b 6c 69 73 ster;. }.} [lis
2290: 74 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d t]..#-----------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 -----------.# Te
22e0: 73 74 20 63 61 73 65 20 76 74 61 62 31 2d 33 20 st case vtab1-3
22f0: 74 65 73 74 20 74 61 62 6c 65 20 73 63 61 6e 73 test table scans
2300: 20 61 6e 64 20 74 68 65 20 65 63 68 6f 20 6d 6f and the echo mo
2310: 64 75 6c 65 27 73 20 0a 23 20 78 42 65 73 74 49 dule's .# xBestI
2320: 6e 64 65 78 2f 78 46 69 6c 74 65 72 20 68 61 6e ndex/xFilter han
2330: 64 6c 69 6e 67 20 6f 66 20 57 48 45 52 45 20 63 dling of WHERE c
2340: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 0a 64 6f 5f 74 onditions...do_t
2350: 65 73 74 20 76 74 61 62 31 2d 33 2e 31 20 7b 0a est vtab1-3.1 {.
2360: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c set echo_modul
2370: 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b e "". execsql {
2380: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c . CREATE TABL
2390: 45 20 74 72 65 61 6c 28 61 20 49 4e 54 45 47 45 E treal(a INTEGE
23a0: 52 2c 20 62 20 49 4e 54 45 47 45 52 2c 20 63 29 R, b INTEGER, c)
23b0: 3b 20 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e ; . CREATE IN
23c0: 44 45 58 20 74 72 65 61 6c 5f 69 64 78 20 4f 4e DEX treal_idx ON
23d0: 20 74 72 65 61 6c 28 62 29 3b 0a 20 20 20 20 43 treal(b);. C
23e0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA
23f0: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 65 63 68 BLE t1 USING ech
2400: 6f 28 74 72 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 o(treal);. }.
2410: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a set echo_module.
2420: 7d 20 5b 6c 69 73 74 20 78 43 72 65 61 74 65 20 } [list xCreate
2430: 65 63 68 6f 20 6d 61 69 6e 20 74 31 20 74 72 65 echo main t1 tre
2440: 61 6c 20 20 20 5c 0a 20 20 20 20 20 20 20 20 78 al \. x
2450: 53 79 6e 63 20 20 20 65 63 68 6f 28 74 72 65 61 Sync echo(trea
2460: 6c 29 20 20 5c 0a 20 20 20 20 20 20 20 20 78 43 l) \. xC
2470: 6f 6d 6d 69 74 20 65 63 68 6f 28 74 72 65 61 6c ommit echo(treal
2480: 29 20 20 5c 0a 5d 0a 0a 23 20 54 65 73 74 20 74 ) \.]..# Test t
2490: 68 61 74 20 61 20 53 45 4c 45 43 54 20 6f 6e 20 hat a SELECT on
24a0: 74 31 20 64 6f 65 73 6e 27 74 20 63 72 61 73 68 t1 doesn't crash
24b0: 2e 20 4e 6f 20 72 6f 77 73 20 61 72 65 20 72 65 . No rows are re
24c0: 74 75 72 6e 65 64 0a 23 20 62 65 63 61 75 73 65 turned.# because
24d0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
24e0: 72 65 61 6c 20 74 61 62 6c 65 20 69 73 20 63 75 real table is cu
24f0: 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2e 0a 23 rrently empty..#
2500: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 .do_test vtab1-3
2510: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b .2 {. execsql {
2520: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 . SELECT a, b
2530: 2c 20 63 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d , c FROM t1;. }
2540: 0a 7d 20 7b 7d 0a 0a 23 20 50 75 74 20 73 6f 6d .} {}..# Put som
2550: 65 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 e data into the
2560: 74 61 62 6c 65 20 74 72 65 61 6c 2e 20 54 68 65 table treal. The
2570: 6e 20 74 72 79 20 61 20 66 65 77 20 73 69 6d 70 n try a few simp
2580: 6c 65 20 53 45 4c 45 43 54 20 0a 23 20 73 74 61 le SELECT .# sta
2590: 74 65 6d 65 6e 74 73 20 6f 6e 20 74 31 2e 0a 23 tements on t1..#
25a0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 .do_test vtab1-3
25b0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b .3 {. execsql {
25c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
25d0: 20 74 72 65 61 6c 20 56 41 4c 55 45 53 28 31 2c treal VALUES(1,
25e0: 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45 2, 3);. INSE
25f0: 52 54 20 49 4e 54 4f 20 74 72 65 61 6c 20 56 41 RT INTO treal VA
2600: 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 LUES(4, 5, 6);.
2610: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d SELECT * FROM
2620: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 t1;. }.} {1 2
2630: 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 3 4 5 6}.do_test
2640: 20 76 74 61 62 31 2d 33 2e 34 20 7b 0a 20 20 65 vtab1-3.4 {. e
2650: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c xecsql {. SEL
2660: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 3b 0a 20 ECT a FROM t1;.
2670: 20 7d 0a 7d 20 7b 31 20 34 7d 0a 64 6f 5f 74 65 }.} {1 4}.do_te
2680: 73 74 20 76 74 61 62 31 2d 33 2e 35 20 7b 0a 20 st vtab1-3.5 {.
2690: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 execsql {. S
26a0: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d ELECT rowid FROM
26b0: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d t1;. }.} {1 2}
26c0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 .do_test vtab1-3
26d0: 2e 36 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f .6 {. set echo_
26e0: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 module "". exec
26f0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 sql {. SELECT
2700: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a * FROM t1;. }.
2710: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a } {1 2 3 4 5 6}.
2720: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e do_test vtab1-3.
2730: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 7 {. execsql {.
2740: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 SELECT rowid
2750: 2c 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d , * FROM t1;. }
2760: 0a 7d 20 7b 31 20 31 20 32 20 33 20 32 20 34 20 .} {1 1 2 3 2 4
2770: 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 5 6}.do_test vta
2780: 62 31 2d 33 2e 38 20 7b 0a 20 20 65 78 65 63 73 b1-3.8 {. execs
2790: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 ql {. SELECT
27a0: 61 20 41 53 20 64 2c 20 62 20 41 53 20 65 2c 20 a AS d, b AS e,
27b0: 63 20 41 53 20 66 20 46 52 4f 4d 20 74 31 3b 0a c AS f FROM t1;.
27c0: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 }.} {1 2 3 4 5
27d0: 20 36 7d 0a 0a 23 20 45 78 65 63 75 74 65 20 73 6}..# Execute s
27e0: 6f 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 ome SELECT state
27f0: 6d 65 6e 74 73 20 77 69 74 68 20 57 48 45 52 45 ments with WHERE
2800: 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65 20 clauses on the
2810: 74 31 20 74 61 62 6c 65 2e 0a 23 20 54 68 65 6e t1 table..# Then
2820: 20 63 68 65 63 6b 20 74 68 65 20 65 63 68 6f 5f check the echo_
2830: 6d 6f 64 75 6c 65 20 76 61 72 69 61 62 6c 65 20 module variable
2840: 28 77 72 69 74 74 65 6e 20 74 6f 20 62 79 20 74 (written to by t
2850: 68 65 20 6d 6f 64 75 6c 65 20 6d 65 74 68 6f 64 he module method
2860: 73 0a 23 20 69 6e 20 74 65 73 74 38 2e 63 29 20 s.# in test8.c)
2870: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 to make sure the
2880: 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 61 6e xBestIndex() an
2890: 64 20 78 46 69 6c 74 65 72 28 29 20 6d 65 74 68 d xFilter() meth
28a0: 6f 64 73 20 77 65 72 65 0a 23 20 63 61 6c 6c 65 ods were.# calle
28b0: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 64 d correctly..#.d
28c0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 33 2e 38 o_test vtab1-3.8
28d0: 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f {. set echo_mo
28e0: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 dule "". execsq
28f0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a l {. SELECT *
2900: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 FROM t1;. }.
2910: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a set echo_module.
2920: 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 } [list xBestInd
2930: 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 ex {SELECT rowid
2940: 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 , * FROM 'treal'
2950: 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c } \. xFil
2960: 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72 ter {SELECT r
2970: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 owid, * FROM 'tr
2980: 65 61 6c 27 7d 20 5d 0a 64 6f 5f 74 65 73 74 20 eal'} ].do_test
2990: 76 74 61 62 31 2d 33 2e 39 20 7b 0a 20 20 73 65 vtab1-3.9 {. se
29a0: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 t echo_module ""
29b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 . execsql {.
29c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 SELECT * FROM t
29d0: 31 20 57 48 45 52 45 20 62 20 3d 20 35 3b 0a 20 1 WHERE b = 5;.
29e0: 20 7d 0a 7d 20 7b 34 20 35 20 36 7d 0a 64 6f 5f }.} {4 5 6}.do_
29f0: 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31 30 20 test vtab1-3.10
2a00: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 {. set echo_mod
2a10: 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 ule.} [list xBes
2a20: 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 tIndex {SELECT r
2a30: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 owid, * FROM 'tr
2a40: 65 61 6c 27 20 57 48 45 52 45 20 62 20 3d 20 3f eal' WHERE b = ?
2a50: 7d 20 20 20 5c 0a 20 20 20 20 20 20 20 20 78 46 } \. xF
2a60: 69 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 ilter {SELECT
2a70: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 rowid, * FROM '
2a80: 74 72 65 61 6c 27 20 57 48 45 52 45 20 62 20 3d treal' WHERE b =
2a90: 20 3f 7d 20 35 20 5d 0a 64 6f 5f 74 65 73 74 20 ?} 5 ].do_test
2aa0: 76 74 61 62 31 2d 33 2e 31 30 20 7b 0a 20 20 73 vtab1-3.10 {. s
2ab0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 et echo_module "
2ac0: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 ". execsql {.
2ad0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 SELECT * FROM
2ae0: 74 31 20 57 48 45 52 45 20 62 20 3e 3d 20 35 20 t1 WHERE b >= 5
2af0: 41 4e 44 20 62 20 3c 3d 20 31 30 3b 0a 20 20 7d AND b <= 10;. }
2b00: 0a 7d 20 7b 34 20 35 20 36 7d 0a 64 6f 5f 74 65 .} {4 5 6}.do_te
2b10: 73 74 20 76 74 61 62 31 2d 33 2e 31 31 20 7b 0a st vtab1-3.11 {.
2b20: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c set echo_modul
2b30: 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 e.} [list xBestI
2b40: 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 ndex {SELECT row
2b50: 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 id, * FROM 'trea
2b60: 6c 27 20 57 48 45 52 45 20 62 20 3e 3d 20 3f 20 l' WHERE b >= ?
2b70: 41 4e 44 20 62 20 3c 3d 20 3f 7d 20 20 20 20 20 AND b <= ?}
2b80: 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74 \. xFilt
2b90: 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72 6f er {SELECT ro
2ba0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 wid, * FROM 'tre
2bb0: 61 6c 27 20 57 48 45 52 45 20 62 20 3e 3d 20 3f al' WHERE b >= ?
2bc0: 20 41 4e 44 20 62 20 3c 3d 20 3f 7d 20 35 20 31 AND b <= ?} 5 1
2bd0: 30 20 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 0 ].do_test vtab
2be0: 31 2d 33 2e 31 32 20 7b 0a 20 20 73 65 74 20 65 1-3.12 {. set e
2bf0: 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 cho_module "".
2c00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 execsql {. SE
2c10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 LECT * FROM t1 W
2c20: 48 45 52 45 20 62 20 42 45 54 57 45 45 4e 20 32 HERE b BETWEEN 2
2c30: 20 41 4e 44 20 31 30 3b 0a 20 20 7d 0a 7d 20 7b AND 10;. }.} {
2c40: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 1 2 3 4 5 6}.do_
2c50: 74 65 73 74 20 76 74 61 62 31 2d 33 2e 31 33 20 test vtab1-3.13
2c60: 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 {. set echo_mod
2c70: 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 42 65 73 ule.} [list xBes
2c80: 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 tIndex {SELECT r
2c90: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 owid, * FROM 'tr
2ca0: 65 61 6c 27 20 57 48 45 52 45 20 62 20 3e 3d 20 eal' WHERE b >=
2cb0: 3f 20 41 4e 44 20 62 20 3c 3d 20 3f 7d 20 20 20 ? AND b <= ?}
2cc0: 20 20 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 \. xFi
2cd0: 6c 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 lter {SELECT
2ce0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 rowid, * FROM 't
2cf0: 72 65 61 6c 27 20 57 48 45 52 45 20 62 20 3e 3d real' WHERE b >=
2d00: 20 3f 20 41 4e 44 20 62 20 3c 3d 20 3f 7d 20 32 ? AND b <= ?} 2
2d10: 20 31 30 20 5d 0a 0a 23 20 41 64 64 20 61 20 66 10 ]..# Add a f
2d20: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 unction for the
2d30: 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 2e 20 MATCH operator.
2d40: 45 76 65 72 79 74 68 69 6e 67 20 61 6c 77 61 79 Everything alway
2d50: 73 20 6d 61 74 63 68 65 73 21 0a 23 70 72 6f 63 s matches!.#proc
2d60: 20 74 65 73 74 5f 6d 61 74 63 68 20 7b 6c 68 73 test_match {lhs
2d70: 20 72 68 73 7d 20 7b 0a 23 20 20 6c 61 70 70 65 rhs} {.# lappe
2d80: 6e 64 20 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c 65 nd ::echo_module
2d90: 20 4d 41 54 43 48 20 24 6c 68 73 20 24 72 68 73 MATCH $lhs $rhs
2da0: 0a 23 20 20 72 65 74 75 72 6e 20 31 0a 23 7d 0a .# return 1.#}.
2db0: 23 64 62 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74 #db function mat
2dc0: 63 68 20 74 65 73 74 5f 6d 61 74 63 68 0a 0a 73 ch test_match..s
2dd0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 et echo_module "
2de0: 22 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d ".do_test vtab1-
2df0: 33 2e 31 32 20 7b 0a 20 20 73 65 74 20 65 63 68 3.12 {. set ech
2e00: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 63 61 o_module "". ca
2e10: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c tchsql {. SEL
2e20: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 ECT * FROM t1 WH
2e30: 45 52 45 20 61 20 4d 41 54 43 48 20 27 73 74 72 ERE a MATCH 'str
2e40: 69 6e 67 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b ing';. }.} {1 {
2e50: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75 unable to use fu
2e60: 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 nction MATCH in
2e70: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f the requested co
2e80: 6e 74 65 78 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 ntext}}.do_test
2e90: 76 74 61 62 31 2d 33 2e 31 33 20 7b 0a 20 20 73 vtab1-3.13 {. s
2ea0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d et echo_module.}
2eb0: 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 65 [list xBestInde
2ec0: 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c x {SELECT rowid,
2ed0: 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 7d * FROM 'treal'}
2ee0: 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c 74 \. xFilt
2ef0: 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72 6f er {SELECT ro
2f00: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 wid, * FROM 'tre
2f10: 61 6c 27 7d 5d 0a 69 66 63 61 70 61 62 6c 65 20 al'}].ifcapable
2f20: 73 75 62 71 75 65 72 79 20 7b 0a 23 20 54 68 65 subquery {.# The
2f30: 20 65 63 68 6f 20 6d 6f 64 75 6c 65 20 75 73 65 echo module use
2f40: 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 74 s a subquery int
2f50: 65 72 6e 61 6c 6c 79 20 74 6f 20 69 6d 70 6c 65 ernally to imple
2f60: 6d 65 6e 74 20 74 68 65 20 4d 41 54 43 48 20 6f ment the MATCH o
2f70: 70 65 72 61 74 6f 72 2e 0a 64 6f 5f 74 65 73 74 perator..do_test
2f80: 20 76 74 61 62 31 2d 33 2e 31 34 20 7b 0a 20 20 vtab1-3.14 {.
2f90: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 set echo_module
2fa0: 22 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 "". execsql {.
2fb0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d SELECT * FROM
2fc0: 20 74 31 20 57 48 45 52 45 20 62 20 4d 41 54 43 t1 WHERE b MATC
2fd0: 48 20 27 73 74 72 69 6e 67 27 3b 0a 20 20 7d 0a H 'string';. }.
2fe0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 } {}.do_test vta
2ff0: 62 31 2d 33 2e 31 35 20 7b 0a 20 20 73 65 74 20 b1-3.15 {. set
3000: 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c echo_module.} [l
3010: 69 73 74 20 78 42 65 73 74 49 6e 64 65 78 20 5c ist xBestIndex \
3020: 0a 20 20 20 20 20 20 20 20 7b 53 45 4c 45 43 54 . {SELECT
3030: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 rowid, * FROM '
3040: 74 72 65 61 6c 27 20 57 48 45 52 45 20 62 20 4c treal' WHERE b L
3050: 49 4b 45 20 28 53 45 4c 45 43 54 20 27 25 27 7c IKE (SELECT '%'|
3060: 7c 3f 7c 7c 27 25 27 29 7d 20 20 5c 0a 20 20 20 |?||'%')} \.
3070: 20 20 20 20 20 78 46 69 6c 74 65 72 20 5c 0a 20 xFilter \.
3080: 20 20 20 20 20 20 20 7b 53 45 4c 45 43 54 20 72 {SELECT r
3090: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 owid, * FROM 'tr
30a0: 65 61 6c 27 20 57 48 45 52 45 20 62 20 4c 49 4b eal' WHERE b LIK
30b0: 45 20 28 53 45 4c 45 43 54 20 27 25 27 7c 7c 3f E (SELECT '%'||?
30c0: 7c 7c 27 25 27 29 7d 20 5c 0a 20 20 20 20 20 20 ||'%')} \.
30d0: 20 20 73 74 72 69 6e 67 20 5d 0a 7d 3b 20 23 69 string ].}; #i
30e0: 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 fcapable subquer
30f0: 79 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d y..#------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 ----------.# Tes
3140: 74 20 63 61 73 65 20 76 74 61 62 31 2d 33 20 74 t case vtab1-3 t
3150: 65 73 74 20 74 61 62 6c 65 20 73 63 61 6e 73 20 est table scans
3160: 61 6e 64 20 74 68 65 20 65 63 68 6f 20 6d 6f 64 and the echo mod
3170: 75 6c 65 27 73 20 0a 23 20 78 42 65 73 74 49 6e ule's .# xBestIn
3180: 64 65 78 2f 78 46 69 6c 74 65 72 20 68 61 6e 64 dex/xFilter hand
3190: 6c 69 6e 67 20 6f 66 20 4f 52 44 45 52 20 42 59 ling of ORDER BY
31a0: 20 63 6c 61 75 73 65 73 2e 0a 0a 23 20 54 68 69 clauses...# Thi
31b0: 73 20 70 72 6f 63 65 64 75 72 65 20 65 78 65 63 s procedure exec
31c0: 75 74 65 73 20 74 68 65 20 53 51 4c 2e 20 20 54 utes the SQL. T
31d0: 68 65 6e 20 69 74 20 63 68 65 63 6b 73 20 74 6f hen it checks to
31e0: 20 73 65 65 20 69 66 20 74 68 65 20 4f 50 5f 53 see if the OP_S
31f0: 6f 72 74 0a 23 20 6f 70 63 6f 64 65 20 77 61 73 ort.# opcode was
3200: 20 65 78 65 63 75 74 65 64 2e 20 20 49 66 20 61 executed. If a
3210: 6e 20 4f 50 5f 53 6f 72 74 20 64 69 64 20 6f 63 n OP_Sort did oc
3220: 63 75 72 2c 20 74 68 65 6e 20 22 73 6f 72 74 22 cur, then "sort"
3230: 20 69 73 20 61 70 70 65 6e 64 65 64 0a 23 20 74 is appended.# t
3240: 6f 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 49 o the result. I
3250: 66 20 6e 6f 20 4f 50 5f 53 6f 72 74 20 68 61 70 f no OP_Sort hap
3260: 70 65 6e 65 64 2c 20 74 68 65 6e 20 22 6e 6f 73 pened, then "nos
3270: 6f 72 74 22 20 69 73 20 61 70 70 65 6e 64 65 64 ort" is appended
3280: 2e 0a 23 0a 23 20 54 68 69 73 20 70 72 6f 63 65 ..#.# This proce
3290: 64 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 dure is used to
32a0: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 check to make su
32b0: 72 65 20 73 6f 72 74 69 6e 67 20 69 73 20 6f 72 re sorting is or
32c0: 20 69 73 20 6e 6f 74 0a 23 20 6f 63 63 75 72 72 is not.# occurr
32d0: 69 6e 67 20 61 73 20 65 78 70 65 63 74 65 64 2e ing as expected.
32e0: 0a 23 0a 70 72 6f 63 20 63 6b 73 6f 72 74 20 7b .#.proc cksort {
32f0: 73 71 6c 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73 sql} {. set ::s
3300: 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 qlite_sort_count
3310: 20 30 0a 20 20 73 65 74 20 64 61 74 61 20 5b 65 0. set data [e
3320: 78 65 63 73 71 6c 20 24 73 71 6c 5d 0a 20 20 69 xecsql $sql]. i
3330: 66 20 7b 24 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 f {$::sqlite_sor
3340: 74 5f 63 6f 75 6e 74 7d 20 7b 73 65 74 20 78 20 t_count} {set x
3350: 73 6f 72 74 7d 20 7b 73 65 74 20 78 20 6e 6f 73 sort} {set x nos
3360: 6f 72 74 7d 0a 20 20 6c 61 70 70 65 6e 64 20 64 ort}. lappend d
3370: 61 74 61 20 24 78 0a 20 20 72 65 74 75 72 6e 20 ata $x. return
3380: 24 64 61 74 61 0a 7d 0a 0a 64 6f 5f 74 65 73 74 $data.}..do_test
3390: 20 76 74 61 62 31 2d 34 2e 31 20 7b 0a 20 20 73 vtab1-4.1 {. s
33a0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 et echo_module "
33b0: 22 0a 20 20 63 6b 73 6f 72 74 20 7b 0a 20 20 20 ". cksort {.
33c0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 SELECT b FROM t
33d0: 31 20 4f 52 44 45 52 20 42 59 20 62 3b 0a 20 20 1 ORDER BY b;.
33e0: 7d 0a 7d 20 7b 32 20 35 20 6e 6f 73 6f 72 74 7d }.} {2 5 nosort}
33f0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 34 .do_test vtab1-4
3400: 2e 32 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f .2 {. set echo_
3410: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 module.} [list x
3420: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 BestIndex {SELEC
3430: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 T rowid, * FROM
3440: 27 74 72 65 61 6c 27 20 4f 52 44 45 52 20 42 59 'treal' ORDER BY
3450: 20 62 20 41 53 43 7d 20 5c 0a 20 20 20 20 20 20 b ASC} \.
3460: 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b 53 45 xFilter {SE
3470: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 LECT rowid, * FR
3480: 4f 4d 20 27 74 72 65 61 6c 27 20 4f 52 44 45 52 OM 'treal' ORDER
3490: 20 42 59 20 62 20 41 53 43 7d 20 5d 0a 64 6f 5f BY b ASC} ].do_
34a0: 74 65 73 74 20 76 74 61 62 31 2d 34 2e 33 20 7b test vtab1-4.3 {
34b0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 . set echo_modu
34c0: 6c 65 20 22 22 0a 20 20 63 6b 73 6f 72 74 20 7b le "". cksort {
34d0: 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 . SELECT b FR
34e0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 62 OM t1 ORDER BY b
34f0: 20 44 45 53 43 3b 0a 20 20 7d 0a 7d 20 7b 35 20 DESC;. }.} {5
3500: 32 20 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 2 nosort}.do_tes
3510: 74 20 76 74 61 62 31 2d 34 2e 34 20 7b 0a 20 20 t vtab1-4.4 {.
3520: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a set echo_module.
3530: 7d 20 5b 6c 69 73 74 20 78 42 65 73 74 49 6e 64 } [list xBestInd
3540: 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 ex {SELECT rowid
3550: 2c 20 2a 20 46 52 4f 4d 20 27 74 72 65 61 6c 27 , * FROM 'treal'
3560: 20 4f 52 44 45 52 20 42 59 20 62 20 44 45 53 43 ORDER BY b DESC
3570: 7d 20 5c 0a 20 20 20 20 20 20 20 20 78 46 69 6c } \. xFil
3580: 74 65 72 20 20 20 20 7b 53 45 4c 45 43 54 20 72 ter {SELECT r
3590: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 72 owid, * FROM 'tr
35a0: 65 61 6c 27 20 4f 52 44 45 52 20 42 59 20 62 20 eal' ORDER BY b
35b0: 44 45 53 43 7d 20 5d 0a 64 6f 5f 74 65 73 74 20 DESC} ].do_test
35c0: 76 74 61 62 31 2d 34 2e 33 20 7b 0a 20 20 73 65 vtab1-4.3 {. se
35d0: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 t echo_module ""
35e0: 0a 20 20 63 6b 73 6f 72 74 20 7b 0a 20 20 20 20 . cksort {.
35f0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 SELECT b FROM t1
3600: 20 4f 52 44 45 52 20 42 59 20 62 7c 7c 27 27 3b ORDER BY b||'';
3610: 0a 20 20 7d 0a 7d 20 7b 32 20 35 20 73 6f 72 74 . }.} {2 5 sort
3620: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d }.do_test vtab1-
3630: 34 2e 34 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 4.4 {. set echo
3640: 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 _module.} [list
3650: 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 xBestIndex {SELE
3660: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d CT rowid, * FROM
3670: 20 27 74 72 65 61 6c 27 7d 20 5c 0a 20 20 20 20 'treal'} \.
3680: 20 20 20 20 78 46 69 6c 74 65 72 20 20 20 20 7b xFilter {
3690: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 SELECT rowid, *
36a0: 46 52 4f 4d 20 27 74 72 65 61 6c 27 7d 20 5d 0a FROM 'treal'} ].
36b0: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f .execsql {. DRO
36c0: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 44 52 P TABLE t1;. DR
36d0: 4f 50 20 54 41 42 4c 45 20 74 72 65 61 6c 3b 0a OP TABLE treal;.
36e0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d }..#------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 ----------.# Tes
3730: 74 20 63 61 73 65 73 20 76 74 61 62 31 2d 35 20 t cases vtab1-5
3740: 74 65 73 74 20 53 45 4c 45 43 54 20 71 75 65 72 test SELECT quer
3750: 69 65 73 20 74 68 61 74 20 69 6e 63 6c 75 64 65 ies that include
3760: 20 6a 6f 69 6e 73 20 6f 6e 20 76 69 72 74 75 61 joins on virtua
3770: 6c 20 0a 23 20 74 61 62 6c 65 73 2e 0a 0a 70 72 l .# tables...pr
3780: 6f 63 20 66 69 6c 74 65 72 20 7b 6c 6f 67 7d 20 oc filter {log}
3790: 7b 0a 20 20 73 65 74 20 6f 75 74 20 5b 6c 69 73 {. set out [lis
37a0: 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 69 t]. for {set ii
37b0: 20 30 7d 20 7b 24 69 69 20 3c 20 5b 6c 6c 65 6e 0} {$ii < [llen
37c0: 67 74 68 20 24 6c 6f 67 5d 7d 20 7b 69 6e 63 72 gth $log]} {incr
37d0: 20 69 69 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b ii} {. if {[
37e0: 6c 69 6e 64 65 78 20 24 6c 6f 67 20 24 69 69 5d lindex $log $ii]
37f0: 20 65 71 20 22 78 46 69 6c 74 65 72 22 7d 20 7b eq "xFilter"} {
3800: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6f . lappend o
3810: 75 74 20 78 46 69 6c 74 65 72 0a 20 20 20 20 20 ut xFilter.
3820: 20 6c 61 70 70 65 6e 64 20 6f 75 74 20 5b 6c 69 lappend out [li
3830: 6e 64 65 78 20 24 6c 6f 67 20 5b 65 78 70 72 20 ndex $log [expr
3840: 24 69 69 2b 31 5d 5d 0a 20 20 20 20 7d 0a 20 20 $ii+1]]. }.
3850: 7d 0a 20 20 72 65 74 75 72 6e 20 24 6f 75 74 0a }. return $out.
3860: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 }..do_test vtab1
3870: 2d 35 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c -5-1 {. execsql
3880: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 { . CREATE T
3890: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29 ABLE t1(a, b, c)
38a0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 ;. CREATE TAB
38b0: 4c 45 20 74 32 28 64 2c 20 65 2c 20 66 29 3b 0a LE t2(d, e, f);.
38c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
38d0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 72 65 t1 VALUES(1, 're
38e0: 64 27 2c 20 27 67 72 65 65 6e 27 29 3b 0a 20 20 d', 'green');.
38f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 INSERT INTO t1
3900: 20 56 41 4c 55 45 53 28 32 2c 20 27 62 6c 75 65 VALUES(2, 'blue
3910: 27 2c 20 27 62 6c 61 63 6b 27 29 3b 0a 20 20 20 ', 'black');.
3920: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 INSERT INTO t2
3930: 56 41 4c 55 45 53 28 31 2c 20 27 73 70 61 64 65 VALUES(1, 'spade
3940: 73 27 2c 20 27 63 6c 75 62 73 27 29 3b 0a 20 20 s', 'clubs');.
3950: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 INSERT INTO t2
3960: 20 56 41 4c 55 45 53 28 32 2c 20 27 68 65 61 72 VALUES(2, 'hear
3970: 74 73 27 2c 20 27 64 69 61 6d 6f 6e 64 73 27 29 ts', 'diamonds')
3980: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 ;. CREATE VIR
3990: 54 55 41 4c 20 54 41 42 4c 45 20 65 74 31 20 55 TUAL TABLE et1 U
39a0: 53 49 4e 47 20 65 63 68 6f 28 74 31 29 3b 0a 20 SING echo(t1);.
39b0: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 CREATE VIRTUA
39c0: 4c 20 54 41 42 4c 45 20 65 74 32 20 55 53 49 4e L TABLE et2 USIN
39d0: 47 20 65 63 68 6f 28 74 32 29 3b 0a 20 20 7d 0a G echo(t2);. }.
39e0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 } {}..do_test vt
39f0: 61 62 31 2d 35 2d 32 20 7b 0a 20 20 73 65 74 20 ab1-5-2 {. set
3a00: 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 echo_module "".
3a10: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 execsql {. S
3a20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 74 31 ELECT * FROM et1
3a30: 2c 20 65 74 32 3b 0a 20 20 7d 0a 7d 20 5b 6c 69 , et2;. }.} [li
3a40: 73 74 20 5c 0a 20 20 31 20 72 65 64 20 67 72 65 st \. 1 red gre
3a50: 65 6e 20 31 20 73 70 61 64 65 73 20 63 6c 75 62 en 1 spades club
3a60: 73 20 20 20 20 20 5c 0a 20 20 31 20 72 65 64 20 s \. 1 red
3a70: 67 72 65 65 6e 20 32 20 68 65 61 72 74 73 20 64 green 2 hearts d
3a80: 69 61 6d 6f 6e 64 73 20 20 5c 0a 20 20 32 20 62 iamonds \. 2 b
3a90: 6c 75 65 20 62 6c 61 63 6b 20 31 20 73 70 61 64 lue black 1 spad
3aa0: 65 73 20 63 6c 75 62 73 20 20 20 20 5c 0a 20 20 es clubs \.
3ab0: 32 20 62 6c 75 65 20 62 6c 61 63 6b 20 32 20 68 2 blue black 2 h
3ac0: 65 61 72 74 73 20 64 69 61 6d 6f 6e 64 73 20 5c earts diamonds \
3ad0: 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 .].do_test vtab1
3ae0: 2d 35 2d 33 20 7b 0a 20 20 66 69 6c 74 65 72 20 -5-3 {. filter
3af0: 24 65 63 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b $echo_module.} [
3b00: 6c 69 73 74 20 5c 0a 20 20 78 46 69 6c 74 65 72 list \. xFilter
3b10: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 {SELECT rowid,
3b20: 2a 20 46 52 4f 4d 20 27 74 31 27 7d 20 5c 0a 20 * FROM 't1'} \.
3b30: 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 xFilter {SELECT
3b40: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 rowid, * FROM '
3b50: 74 32 27 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 t2'} \. xFilter
3b60: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 {SELECT rowid,
3b70: 2a 20 46 52 4f 4d 20 27 74 32 27 7d 20 5c 0a 5d * FROM 't2'} \.]
3b80: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 35 .do_test vtab1-5
3b90: 2d 34 20 7b 0a 20 20 73 65 74 20 65 63 68 6f 5f -4 {. set echo_
3ba0: 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 module "". exec
3bb0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 sql {. SELECT
3bc0: 20 2a 20 46 52 4f 4d 20 65 74 31 2c 20 65 74 32 * FROM et1, et2
3bd0: 20 57 48 45 52 45 20 65 74 32 2e 64 20 3d 20 32 WHERE et2.d = 2
3be0: 3b 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 5c 0a ;. }.} [list \.
3bf0: 20 20 31 20 72 65 64 20 67 72 65 65 6e 20 32 20 1 red green 2
3c00: 68 65 61 72 74 73 20 64 69 61 6d 6f 6e 64 73 20 hearts diamonds
3c10: 20 5c 0a 20 20 32 20 62 6c 75 65 20 62 6c 61 63 \. 2 blue blac
3c20: 6b 20 32 20 68 65 61 72 74 73 20 64 69 61 6d 6f k 2 hearts diamo
3c30: 6e 64 73 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 nds \.].do_test
3c40: 76 74 61 62 31 2d 35 2d 35 20 7b 0a 20 20 66 69 vtab1-5-5 {. fi
3c50: 6c 74 65 72 20 24 65 63 68 6f 5f 6d 6f 64 75 6c lter $echo_modul
3c60: 65 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 78 46 e.} [list \. xF
3c70: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f ilter {SELECT ro
3c80: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 31 27 wid, * FROM 't1'
3c90: 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 } \. xFilter {S
3ca0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 ELECT rowid, * F
3cb0: 52 4f 4d 20 27 74 32 27 7d 20 5c 0a 20 20 78 46 ROM 't2'} \. xF
3cc0: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f ilter {SELECT ro
3cd0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 32 27 wid, * FROM 't2'
3ce0: 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 } \.].do_test vt
3cf0: 61 62 31 2d 35 2d 36 20 7b 0a 20 20 65 78 65 63 ab1-5-6 {. exec
3d00: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 sql {. CREATE
3d10: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 32 28 INDEX i1 ON t2(
3d20: 64 29 3b 0a 20 20 7d 0a 0a 20 20 64 62 20 63 6c d);. }.. db cl
3d30: 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 ose. sqlite3 db
3d40: 20 74 65 73 74 2e 64 62 0a 20 20 72 65 67 69 73 test.db. regis
3d50: 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 ter_echo_module
3d60: 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 [sqlite3_connect
3d70: 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62 5d 0a ion_pointer db].
3d80: 0a 20 20 73 65 74 20 3a 3a 65 63 68 6f 5f 6d 6f . set ::echo_mo
3d90: 64 75 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 dule "". execsq
3da0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a l {. SELECT *
3db0: 20 46 52 4f 4d 20 65 74 31 2c 20 65 74 32 20 57 FROM et1, et2 W
3dc0: 48 45 52 45 20 65 74 32 2e 64 20 3d 20 32 3b 0a HERE et2.d = 2;.
3dd0: 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 }.} [list \.
3de0: 31 20 72 65 64 20 67 72 65 65 6e 20 32 20 68 65 1 red green 2 he
3df0: 61 72 74 73 20 64 69 61 6d 6f 6e 64 73 20 20 5c arts diamonds \
3e00: 0a 20 20 32 20 62 6c 75 65 20 62 6c 61 63 6b 20 . 2 blue black
3e10: 32 20 68 65 61 72 74 73 20 64 69 61 6d 6f 6e 64 2 hearts diamond
3e20: 73 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 s \.].do_test vt
3e30: 61 62 31 2d 35 2d 37 20 7b 0a 20 20 66 69 6c 74 ab1-5-7 {. filt
3e40: 65 72 20 24 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c er $::echo_modul
3e50: 65 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 78 46 e.} [list \. xF
3e60: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f ilter {SELECT ro
3e70: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 31 27 wid, * FROM 't1'
3e80: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a } \.
3e90: 20 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 xFilter {SELEC
3ea0: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 T rowid, * FROM
3eb0: 27 74 32 27 20 57 48 45 52 45 20 64 20 3d 20 3f 't2' WHERE d = ?
3ec0: 7d 20 5c 0a 20 20 78 46 69 6c 74 65 72 20 7b 53 } \. xFilter {S
3ed0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 ELECT rowid, * F
3ee0: 52 4f 4d 20 27 74 32 27 20 57 48 45 52 45 20 64 ROM 't2' WHERE d
3ef0: 20 3d 20 3f 7d 20 5c 0a 5d 0a 0a 65 78 65 63 73 = ?} \.]..execs
3f00: 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c ql {. DROP TABL
3f10: 45 20 74 31 3b 0a 20 20 44 52 4f 50 20 54 41 42 E t1;. DROP TAB
3f20: 4c 45 20 74 32 3b 0a 20 20 44 52 4f 50 20 54 41 LE t2;. DROP TA
3f30: 42 4c 45 20 65 74 31 3b 0a 20 20 44 52 4f 50 20 BLE et1;. DROP
3f40: 54 41 42 4c 45 20 65 74 32 3b 0a 7d 0a 0a 23 2d TABLE et2;.}..#-
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f90: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 -----.# Test cas
3fa0: 65 73 20 76 74 61 62 31 2d 36 20 74 65 73 74 20 es vtab1-6 test
3fb0: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 61 INSERT, UPDATE a
3fc0: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 nd DELETE operat
3fd0: 69 6f 6e 73 20 0a 23 20 6f 6e 20 76 69 72 74 75 ions .# on virtu
3fe0: 61 6c 20 74 61 62 6c 65 73 2e 0a 64 6f 5f 74 65 al tables..do_te
3ff0: 73 74 20 76 74 61 62 31 2d 36 2d 31 20 7b 0a 20 st vtab1-6-1 {.
4000: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 execsql { SELEC
4010: 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 T sql FROM sqlit
4020: 65 5f 6d 61 73 74 65 72 20 7d 0a 7d 20 7b 7d 0a e_master }.} {}.
4030: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d do_test vtab1-6-
4040: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 2 {. execsql {.
4050: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 CREATE TABLE
4060: 20 74 72 65 61 6c 28 61 20 50 52 49 4d 41 52 59 treal(a PRIMARY
4070: 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20 KEY, b, c);.
4080: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 CREATE VIRTUAL
4090: 54 41 42 4c 45 20 74 65 63 68 6f 20 55 53 49 4e TABLE techo USIN
40a0: 47 20 65 63 68 6f 28 74 72 65 61 6c 29 3b 0a 20 G echo(treal);.
40b0: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 SELECT name F
40c0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 ROM sqlite_maste
40d0: 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 r WHERE type = '
40e0: 74 61 62 6c 65 27 3b 0a 20 20 7d 0a 7d 20 7b 74 table';. }.} {t
40f0: 72 65 61 6c 20 74 65 63 68 6f 7d 0a 64 6f 5f 74 real techo}.do_t
4100: 65 73 74 20 76 74 61 62 31 2d 36 2d 33 2e 31 2e est vtab1-6-3.1.
4110: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 1 {. execsql {.
4120: 20 20 20 20 50 52 41 47 4d 41 20 63 6f 75 6e 74 PRAGMA count
4130: 5f 63 68 61 6e 67 65 73 3d 4f 4e 3b 0a 20 20 20 _changes=ON;.
4140: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 63 INSERT INTO tec
4150: 68 6f 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 ho VALUES(1, 2,
4160: 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 3);. }.} {1}.do
4170: 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 33 2e _test vtab1-6-3.
4180: 31 2e 32 20 7b 0a 20 20 64 62 20 63 68 61 6e 67 1.2 {. db chang
4190: 65 73 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 es.} {1}.do_test
41a0: 20 76 74 61 62 31 2d 36 2d 33 2e 32 20 7b 0a 20 vtab1-6-3.2 {.
41b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 execsql {. S
41c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 ELECT * FROM tec
41d0: 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 ho;. }.} {1 2 3
41e0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d }.do_test vtab1-
41f0: 36 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6-4.1 {. execsq
4200: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 l {. UPDATE t
4210: 65 63 68 6f 20 53 45 54 20 61 20 3d 20 35 3b 0a echo SET a = 5;.
4220: 20 20 7d 0a 20 20 64 62 20 63 68 61 6e 67 65 73 }. db changes
4230: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 76 .} {1}.do_test v
4240: 74 61 62 31 2d 36 2d 34 2e 32 20 7b 0a 20 20 65 tab1-6-4.2 {. e
4250: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c xecsql {. SEL
4260: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f ECT * FROM techo
4270: 3b 0a 20 20 7d 0a 7d 20 7b 35 20 32 20 33 7d 0a ;. }.} {5 2 3}.
4280: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d do_test vtab1-6-
4290: 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 4.3 {. execsql
42a0: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 65 63 {. UPDATE tec
42b0: 68 6f 20 53 45 54 20 61 3d 36 20 57 48 45 52 45 ho SET a=6 WHERE
42c0: 20 61 3c 30 3b 0a 20 20 7d 0a 20 20 64 62 20 63 a<0;. }. db c
42d0: 68 61 6e 67 65 73 0a 7d 20 7b 30 7d 0a 64 6f 5f hanges.} {0}.do_
42e0: 74 65 73 74 20 76 74 61 62 31 2d 36 2d 34 2e 34 test vtab1-6-4.4
42f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 {. execsql {.
4300: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d SELECT * FROM
4310: 20 74 65 63 68 6f 3b 0a 20 20 7d 0a 7d 20 7b 35 techo;. }.} {5
4320: 20 32 20 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 2 3}..do_test v
4330: 74 61 62 31 2d 36 2d 35 2e 31 20 7b 0a 20 65 78 tab1-6-5.1 {. ex
4340: 65 63 73 71 6c 20 7b 0a 20 20 20 55 50 44 41 54 ecsql {. UPDAT
4350: 45 20 74 65 63 68 6f 20 73 65 74 20 61 20 3d 20 E techo set a =
4360: 61 7c 7c 62 7c 7c 63 3b 0a 20 7d 0a 20 64 62 20 a||b||c;. }. db
4370: 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 64 6f changes.} {1}.do
4380: 5f 74 65 73 74 20 76 74 61 62 31 2d 36 2d 35 2e _test vtab1-6-5.
4390: 32 20 7b 0a 20 65 78 65 63 73 71 6c 20 7b 0a 20 2 {. execsql {.
43a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 SELECT * FROM
43b0: 74 65 63 68 6f 3b 0a 20 7d 0a 7d 20 7b 35 32 33 techo;. }.} {523
43c0: 20 32 20 33 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 2 3}..do_test v
43d0: 74 61 62 31 2d 36 2d 36 2e 31 20 7b 0a 20 20 65 tab1-6-6.1 {. e
43e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 xecsql {. UPD
43f0: 41 54 45 20 74 65 63 68 6f 20 73 65 74 20 72 6f ATE techo set ro
4400: 77 69 64 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 wid = 10;. }.
4410: 64 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d db changes.} {1}
4420: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 36 .do_test vtab1-6
4430: 2d 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c -6.2 {. execsql
4440: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f {. SELECT ro
4450: 77 69 64 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a wid FROM techo;.
4460: 20 20 7d 0a 7d 20 7b 31 30 7d 0a 0a 64 6f 5f 74 }.} {10}..do_t
4470: 65 73 74 20 76 74 61 62 31 2d 36 2d 37 2e 31 2e est vtab1-6-7.1.
4480: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 1 {. execsql {.
4490: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
44a0: 74 65 63 68 6f 20 56 41 4c 55 45 53 28 31 31 2c techo VALUES(11,
44b0: 31 32 2c 31 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 12,13);. }.} {1
44c0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d }.do_test vtab1-
44d0: 36 2d 37 2e 31 2e 32 20 7b 0a 20 20 64 62 20 63 6-7.1.2 {. db c
44e0: 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 64 6f 5f hanges.} {1}.do_
44f0: 74 65 73 74 20 76 74 61 62 31 2d 36 2d 37 2e 32 test vtab1-6-7.2
4500: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 {. execsql {.
4510: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d SELECT * FROM
4520: 20 74 65 63 68 6f 20 4f 52 44 45 52 20 42 59 20 techo ORDER BY
4530: 61 3b 0a 20 20 7d 0a 7d 20 7b 31 31 20 31 32 20 a;. }.} {11 12
4540: 31 33 20 35 32 33 20 32 20 33 7d 0a 64 6f 5f 74 13 523 2 3}.do_t
4550: 65 73 74 20 76 74 61 62 31 2d 36 2d 37 2e 33 20 est vtab1-6-7.3
4560: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 {. execsql {.
4570: 20 20 55 50 44 41 54 45 20 74 65 63 68 6f 20 53 UPDATE techo S
4580: 45 54 20 62 3d 62 2b 31 30 30 30 0a 20 20 7d 0a ET b=b+1000. }.
4590: 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b db changes.} {
45a0: 32 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2}.do_test vtab1
45b0: 2d 36 2d 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 -6-7.4 {. execs
45c0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 ql {. SELECT
45d0: 2a 20 46 52 4f 4d 20 74 65 63 68 6f 20 4f 52 44 * FROM techo ORD
45e0: 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b ER BY a;. }.} {
45f0: 31 31 20 31 30 31 32 20 31 33 20 35 32 33 20 31 11 1012 13 523 1
4600: 30 30 32 20 33 7d 0a 0a 0a 64 6f 5f 74 65 73 74 002 3}...do_test
4610: 20 76 74 61 62 31 2d 36 2d 38 2e 31 20 7b 0a 20 vtab1-6-8.1 {.
4620: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 execsql {. D
4630: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 63 68 6f ELETE FROM techo
4640: 20 57 48 45 52 45 20 61 3d 35 3b 0a 20 20 7d 0a WHERE a=5;. }.
4650: 20 20 64 62 20 63 68 61 6e 67 65 73 0a 7d 20 7b db changes.} {
4660: 30 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 0}.do_test vtab1
4670: 2d 36 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 -6-8.2 {. execs
4680: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 ql {. SELECT
4690: 2a 20 46 52 4f 4d 20 74 65 63 68 6f 20 4f 52 44 * FROM techo ORD
46a0: 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b ER BY a;. }.} {
46b0: 31 31 20 31 30 31 32 20 31 33 20 35 32 33 20 31 11 1012 13 523 1
46c0: 30 30 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 76 002 3}.do_test v
46d0: 74 61 62 31 2d 36 2d 38 2e 33 20 7b 0a 20 20 65 tab1-6-8.3 {. e
46e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c xecsql {. DEL
46f0: 45 54 45 20 46 52 4f 4d 20 74 65 63 68 6f 3b 0a ETE FROM techo;.
4700: 20 20 7d 0a 20 20 64 62 20 63 68 61 6e 67 65 73 }. db changes
4710: 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 76 .} {2}.do_test v
4720: 74 61 62 31 2d 36 2d 38 2e 34 20 7b 0a 20 20 65 tab1-6-8.4 {. e
4730: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c xecsql {. SEL
4740: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f ECT * FROM techo
4750: 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d ORDER BY a;. }
4760: 0a 7d 20 7b 7d 0a 65 78 65 63 73 71 6c 20 7b 50 .} {}.execsql {P
4770: 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e RAGMA count_chan
4780: 67 65 73 3d 4f 46 46 7d 0a 0a 66 6f 72 63 65 64 ges=OFF}..forced
4790: 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 0a 66 elete test2.db.f
47a0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 orcedelete test2
47b0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c 69 .db-journal.sqli
47c0: 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64 62 te3 db2 test2.db
47d0: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 52 45 .execsql {. CRE
47e0: 41 54 45 20 54 41 42 4c 45 20 74 65 63 68 6f 28 ATE TABLE techo(
47f0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 a PRIMARY KEY, b
4800: 2c 20 63 29 3b 0a 7d 20 64 62 32 0a 70 72 6f 63 , c);.} db2.proc
4810: 20 63 68 65 63 6b 5f 65 63 68 6f 5f 74 61 62 6c check_echo_tabl
4820: 65 20 7b 74 6e 7d 20 7b 0a 20 20 73 65 74 20 3a e {tn} {. set :
4830: 3a 64 61 74 61 31 20 5b 65 78 65 63 73 71 6c 20 :data1 [execsql
4840: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a {SELECT rowid, *
4850: 20 46 52 4f 4d 20 74 65 63 68 6f 7d 5d 0a 20 20 FROM techo}].
4860: 73 65 74 20 3a 3a 64 61 74 61 32 20 5b 65 78 65 set ::data2 [exe
4870: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 csql {SELECT row
4880: 69 64 2c 20 2a 20 46 52 4f 4d 20 74 65 63 68 6f id, * FROM techo
4890: 7d 20 64 62 32 5d 0a 20 20 64 6f 5f 74 65 73 74 } db2]. do_test
48a0: 20 24 74 6e 20 7b 0a 20 20 20 20 73 74 72 69 6e $tn {. strin
48b0: 67 20 65 71 75 61 6c 20 24 3a 3a 64 61 74 61 31 g equal $::data1
48c0: 20 24 3a 3a 64 61 74 61 32 0a 20 20 7d 20 31 0a $::data2. } 1.
48d0: 7d 0a 73 65 74 20 74 6e 20 30 0a 66 6f 72 65 61 }.set tn 0.forea
48e0: 63 68 20 73 74 6d 74 20 5b 6c 69 73 74 20 5c 0a ch stmt [list \.
48f0: 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 {INSERT INTO t
4900: 65 63 68 6f 20 56 41 4c 55 45 53 28 27 61 62 63 echo VALUES('abc
4910: 27 2c 20 27 64 65 66 27 2c 20 27 67 68 69 27 29 ', 'def', 'ghi')
4920: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 }
4930: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 49 4e \. {IN
4940: 53 45 52 54 20 49 4e 54 4f 20 74 65 63 68 6f 20 SERT INTO techo
4950: 53 45 4c 45 43 54 20 61 7c 7c 27 2e 27 7c 7c 72 SELECT a||'.'||r
4960: 6f 77 69 64 2c 20 62 2c 20 63 20 46 52 4f 4d 20 owid, b, c FROM
4970: 74 65 63 68 6f 7d 20 20 20 20 20 20 20 20 20 20 techo}
4980: 20 20 20 20 5c 0a 20 20 7b 49 4e 53 45 52 54 20 \. {INSERT
4990: 49 4e 54 4f 20 74 65 63 68 6f 20 53 45 4c 45 43 INTO techo SELEC
49a0: 54 20 61 7c 7c 27 78 27 7c 7c 72 6f 77 69 64 2c T a||'x'||rowid,
49b0: 20 62 2c 20 63 20 46 52 4f 4d 20 74 65 63 68 6f b, c FROM techo
49c0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c } \
49d0: 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 . {INSERT INTO
49e0: 74 65 63 68 6f 20 53 45 4c 45 43 54 20 61 7c 7c techo SELECT a||
49f0: 27 79 27 7c 7c 72 6f 77 69 64 2c 20 62 2c 20 63 'y'||rowid, b, c
4a00: 20 46 52 4f 4d 20 74 65 63 68 6f 7d 20 20 20 20 FROM techo}
4a10: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b 44 \. {D
4a20: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 63 68 6f ELETE FROM techo
4a30: 20 57 48 45 52 45 20 28 6f 69 64 20 25 20 33 29 WHERE (oid % 3)
4a40: 20 3d 20 30 7d 20 20 20 20 20 20 20 20 20 20 20 = 0}
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4a60: 20 20 20 20 20 5c 0a 20 20 7b 55 50 44 41 54 45 \. {UPDATE
4a70: 20 74 65 63 68 6f 20 73 65 74 20 72 6f 77 69 64 techo set rowid
4a80: 20 3d 20 31 30 30 20 57 48 45 52 45 20 72 6f 77 = 100 WHERE row
4a90: 69 64 20 3d 20 31 7d 20 20 20 20 20 20 20 20 20 id = 1}
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4ab0: 5c 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f \. {INSERT INTO
4ac0: 20 74 65 63 68 6f 28 61 2c 20 62 29 20 56 41 4c techo(a, b) VAL
4ad0: 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20 27 77 6f UES('hello', 'wo
4ae0: 72 6c 64 27 29 7d 20 20 20 20 20 20 20 20 20 20 rld')}
4af0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7b \. {
4b00: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 63 68 DELETE FROM tech
4b10: 6f 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 o}
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4b40: 20 20 20 20 20 20 5c 0a 5d 20 7b 0a 20 20 65 78 \.] {. ex
4b50: 65 63 73 71 6c 20 24 73 74 6d 74 0a 20 20 65 78 ecsql $stmt. ex
4b60: 65 63 73 71 6c 20 24 73 74 6d 74 20 64 62 32 0a ecsql $stmt db2.
4b70: 20 20 63 68 65 63 6b 5f 65 63 68 6f 5f 74 61 62 check_echo_tab
4b80: 6c 65 20 76 74 61 62 31 2d 36 2e 38 2e 5b 69 6e le vtab1-6.8.[in
4b90: 63 72 20 74 6e 5d 0a 7d 0a 0a 64 62 32 20 63 6c cr tn].}..db2 cl
4ba0: 6f 73 65 0a 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d ose....#--------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 --------------.#
4bf0: 20 54 65 73 74 20 63 61 73 65 73 20 76 74 61 62 Test cases vtab
4c00: 31 2d 37 20 74 65 73 74 73 20 74 68 61 74 20 74 1-7 tests that t
4c10: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 he value returne
4c20: 64 20 62 79 20 0a 23 20 73 71 6c 69 74 65 33 5f d by .# sqlite3_
4c30: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 last_insert_rowi
4c40: 64 28 29 20 69 73 20 73 65 74 20 63 6f 72 72 65 d() is set corre
4c50: 63 74 6c 79 20 77 68 65 6e 20 72 6f 77 73 20 61 ctly when rows a
4c60: 72 65 20 69 6e 73 65 72 74 65 64 0a 23 20 69 6e re inserted.# in
4c70: 74 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 to virtual table
4c80: 73 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 s..do_test vtab1
4c90: 2e 37 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c .7-1 {. execsql
4ca0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 {. CREATE TA
4cb0: 42 4c 45 20 72 65 61 6c 5f 61 62 63 28 61 20 50 BLE real_abc(a P
4cc0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 RIMARY KEY, b, c
4cd0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 );. CREATE VI
4ce0: 52 54 55 41 4c 20 54 41 42 4c 45 20 65 63 68 6f RTUAL TABLE echo
4cf0: 5f 61 62 63 20 55 53 49 4e 47 20 65 63 68 6f 28 _abc USING echo(
4d00: 72 65 61 6c 5f 61 62 63 29 3b 0a 20 20 7d 0a 7d real_abc);. }.}
4d10: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 {}.do_test vtab
4d20: 31 2e 37 2d 32 20 7b 0a 20 20 65 78 65 63 73 71 1.7-2 {. execsq
4d30: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 l {. INSERT I
4d40: 4e 54 4f 20 65 63 68 6f 5f 61 62 63 20 56 41 4c NTO echo_abc VAL
4d50: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 UES(1, 2, 3);.
4d60: 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e SELECT last_in
4d70: 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20 sert_rowid();.
4d80: 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 }.} {1}.do_test
4d90: 76 74 61 62 31 2e 37 2d 33 20 7b 0a 20 20 65 78 vtab1.7-3 {. ex
4da0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 ecsql {. INSE
4db0: 52 54 20 49 4e 54 4f 20 65 63 68 6f 5f 61 62 63 RT INTO echo_abc
4dc0: 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53 28 33 (rowid) VALUES(3
4dd0: 31 34 32 37 29 3b 0a 20 20 20 20 53 45 4c 45 43 1427);. SELEC
4de0: 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f T last_insert_ro
4df0: 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 wid();. }.} {31
4e00: 34 32 37 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 427}.do_test vta
4e10: 62 31 2e 37 2d 34 20 7b 0a 20 20 65 78 65 63 73 b1.7-4 {. execs
4e20: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 ql {. INSERT
4e30: 49 4e 54 4f 20 65 63 68 6f 5f 61 62 63 20 53 45 INTO echo_abc SE
4e40: 4c 45 43 54 20 61 7c 7c 27 2e 76 32 27 2c 20 62 LECT a||'.v2', b
4e50: 2c 20 63 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 , c FROM echo_ab
4e60: 63 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 61 c;. SELECT la
4e70: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 st_insert_rowid(
4e80: 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39 7d );. }.} {31429}
4e90: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37 .do_test vtab1.7
4ea0: 2d 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b -5 {. execsql {
4eb0: 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 . SELECT rowi
4ec0: 64 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 d, a, b, c FROM
4ed0: 65 63 68 6f 5f 61 62 63 0a 20 20 7d 0a 7d 20 5b echo_abc. }.} [
4ee0: 6c 69 73 74 20 31 20 20 20 20 20 31 20 20 20 20 list 1 1
4ef0: 32 20 20 33 20 20 5c 0a 20 20 20 20 20 20 20 20 2 3 \.
4f00: 33 31 34 32 37 20 7b 7d 20 20 20 7b 7d 20 7b 7d 31427 {} {} {}
4f10: 20 5c 0a 20 20 20 20 20 20 20 20 33 31 34 32 38 \. 31428
4f20: 20 31 2e 76 32 20 32 20 20 33 20 20 5c 0a 20 20 1.v2 2 3 \.
4f30: 20 20 20 20 20 20 33 31 34 32 39 20 7b 7d 20 20 31429 {}
4f40: 7b 7d 20 7b 7d 20 20 5c 0a 5d 0a 0a 23 20 4e 6f {} {} \.]..# No
4f50: 77 20 74 65 73 74 20 74 68 61 74 20 44 45 4c 45 w test that DELE
4f60: 54 45 20 61 6e 64 20 55 50 44 41 54 45 20 6f 70 TE and UPDATE op
4f70: 65 72 61 74 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 erations do not
4f80: 6d 6f 64 69 66 79 20 74 68 65 20 76 61 6c 75 65 modify the value
4f90: 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e ..do_test vtab1.
4fa0: 37 2d 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7-6 {. execsql
4fb0: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 65 63 68 {. UPDATE ech
4fc0: 6f 5f 61 62 63 20 53 45 54 20 63 20 3d 20 35 20 o_abc SET c = 5
4fd0: 57 48 45 52 45 20 62 20 3d 20 32 3b 0a 20 20 20 WHERE b = 2;.
4fe0: 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e 73 SELECT last_ins
4ff0: 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20 7d ert_rowid();. }
5000: 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 6f 5f 74 65 .} {31429}.do_te
5010: 73 74 20 76 74 61 62 31 2e 37 2d 37 20 7b 0a 20 st vtab1.7-7 {.
5020: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 execsql {. U
5030: 50 44 41 54 45 20 65 63 68 6f 5f 61 62 63 20 53 PDATE echo_abc S
5040: 45 54 20 72 6f 77 69 64 20 3d 20 35 20 57 48 45 ET rowid = 5 WHE
5050: 52 45 20 72 6f 77 69 64 20 3d 20 31 3b 0a 20 20 RE rowid = 1;.
5060: 20 20 53 45 4c 45 43 54 20 6c 61 73 74 5f 69 6e SELECT last_in
5070: 73 65 72 74 5f 72 6f 77 69 64 28 29 3b 0a 20 20 sert_rowid();.
5080: 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 6f 5f 74 }.} {31429}.do_t
5090: 65 73 74 20 76 74 61 62 31 2e 37 2d 38 20 7b 0a est vtab1.7-8 {.
50a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 execsql {.
50b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 65 63 68 6f DELETE FROM echo
50c0: 5f 61 62 63 20 57 48 45 52 45 20 62 20 3d 20 32 _abc WHERE b = 2
50d0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 61 73 ;. SELECT las
50e0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 t_insert_rowid()
50f0: 3b 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a ;. }.} {31429}.
5100: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d do_test vtab1.7-
5110: 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 9 {. execsql {.
5120: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 SELECT rowid
5130: 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 65 , a, b, c FROM e
5140: 63 68 6f 5f 61 62 63 0a 20 20 7d 0a 7d 20 5b 6c cho_abc. }.} [l
5150: 69 73 74 20 33 31 34 32 37 20 7b 7d 20 7b 7d 20 ist 31427 {} {}
5160: 7b 7d 20 5c 0a 20 20 20 20 20 20 20 20 33 31 34 {} \. 314
5170: 32 39 20 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 5d 0a 29 {} {} {} \.].
5180: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d do_test vtab1.7-
5190: 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 10 {. execsql {
51a0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d . DELETE FROM
51b0: 20 65 63 68 6f 5f 61 62 63 20 57 48 45 52 45 20 echo_abc WHERE
51c0: 62 20 3d 20 32 3b 0a 20 20 20 20 53 45 4c 45 43 b = 2;. SELEC
51d0: 54 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f T last_insert_ro
51e0: 77 69 64 28 29 3b 0a 20 20 7d 0a 7d 20 7b 33 31 wid();. }.} {31
51f0: 34 32 39 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 429}.do_test vta
5200: 62 31 2e 37 2d 31 31 20 7b 0a 20 20 65 78 65 63 b1.7-11 {. exec
5210: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 sql {. SELECT
5220: 20 72 6f 77 69 64 2c 20 61 2c 20 62 2c 20 63 20 rowid, a, b, c
5230: 46 52 4f 4d 20 72 65 61 6c 5f 61 62 63 0a 20 20 FROM real_abc.
5240: 7d 0a 7d 20 5b 6c 69 73 74 20 33 31 34 32 37 20 }.} [list 31427
5250: 7b 7d 20 7b 7d 20 7b 7d 20 5c 0a 20 20 20 20 20 {} {} {} \.
5260: 20 20 20 33 31 34 32 39 20 7b 7d 20 7b 7d 20 7b 31429 {} {} {
5270: 7d 20 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 76 74 } \.].do_test vt
5280: 61 62 31 2e 37 2d 31 32 20 7b 0a 20 20 65 78 65 ab1.7-12 {. exe
5290: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 csql {. DELET
52a0: 45 20 46 52 4f 4d 20 65 63 68 6f 5f 61 62 63 3b E FROM echo_abc;
52b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6c 61 73 74 . SELECT last
52c0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 3b _insert_rowid();
52d0: 0a 20 20 7d 0a 7d 20 7b 33 31 34 32 39 7d 0a 64 . }.} {31429}.d
52e0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 37 2d 31 o_test vtab1.7-1
52f0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 3 {. execsql {.
5300: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 SELECT rowid
5310: 2c 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 72 , a, b, c FROM r
5320: 65 61 6c 5f 61 62 63 0a 20 20 7d 0a 7d 20 7b 7d eal_abc. }.} {}
5330: 0a 0a 69 66 63 61 70 61 62 6c 65 20 61 74 74 61 ..ifcapable atta
5340: 63 68 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 76 ch {. do_test v
5350: 74 61 62 31 2e 38 2d 31 20 7b 0a 20 20 20 20 73 tab1.8-1 {. s
5360: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 et echo_module "
5370: 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a ". execsql {.
5380: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65 ATTACH 'te
5390: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a st2.db' AS aux;.
53a0: 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49 52 CREATE VIR
53b0: 54 55 41 4c 20 54 41 42 4c 45 20 61 75 78 2e 65 TUAL TABLE aux.e
53c0: 32 20 55 53 49 4e 47 20 65 63 68 6f 28 72 65 61 2 USING echo(rea
53d0: 6c 5f 61 62 63 29 3b 0a 20 20 20 20 7d 0a 20 20 l_abc);. }.
53e0: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c set echo_modul
53f0: 65 0a 20 20 7d 20 5b 6c 69 73 74 20 78 43 72 65 e. } [list xCre
5400: 61 74 65 20 65 63 68 6f 20 61 75 78 20 65 32 20 ate echo aux e2
5410: 72 65 61 6c 5f 61 62 63 20 20 20 5c 0a 20 20 20 real_abc \.
5420: 20 20 20 20 20 20 20 78 53 79 6e 63 20 20 20 65 xSync e
5430: 63 68 6f 28 72 65 61 6c 5f 61 62 63 29 20 20 20 cho(real_abc)
5440: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 \.
5450: 20 20 78 43 6f 6d 6d 69 74 20 65 63 68 6f 28 72 xCommit echo(r
5460: 65 61 6c 5f 61 62 63 29 20 20 20 20 20 20 20 20 eal_abc)
5470: 20 5c 0a 20 20 5d 0a 7d 0a 64 6f 5f 74 65 73 74 \. ].}.do_test
5480: 20 76 74 61 62 31 2e 38 2d 32 20 7b 0a 20 20 63 vtab1.8-2 {. c
5490: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 52 atchsql {. DR
54a0: 4f 50 20 54 41 42 4c 45 20 61 75 78 2e 65 32 3b OP TABLE aux.e2;
54b0: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b . }. execsql {
54c0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 . DROP TABLE
54d0: 74 72 65 61 6c 3b 0a 20 20 20 20 44 52 4f 50 20 treal;. DROP
54e0: 54 41 42 4c 45 20 74 65 63 68 6f 3b 0a 20 20 20 TABLE techo;.
54f0: 20 44 52 4f 50 20 54 41 42 4c 45 20 65 63 68 6f DROP TABLE echo
5500: 5f 61 62 63 3b 0a 20 20 20 20 44 52 4f 50 20 54 _abc;. DROP T
5510: 41 42 4c 45 20 72 65 61 6c 5f 61 62 63 3b 0a 20 ABLE real_abc;.
5520: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 }.} {}..do_test
5530: 20 76 74 61 62 31 2e 39 2d 31 20 7b 0a 20 20 73 vtab1.9-1 {. s
5540: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 et echo_module "
5550: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 ". execsql {.
5560: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 CREATE TABLE r
5570: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 (a, b, c);. C
5580: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA
5590: 42 4c 45 20 65 20 55 53 49 4e 47 20 65 63 68 6f BLE e USING echo
55a0: 28 72 2c 20 65 5f 6c 6f 67 29 3b 0a 20 20 20 20 (r, e_log);.
55b0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d SELECT name FROM
55c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a sqlite_master;.
55d0: 20 20 7d 0a 7d 20 7b 72 20 65 20 65 5f 6c 6f 67 }.} {r e e_log
55e0: 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e }.do_test vtab1.
55f0: 39 2d 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 9-2 {. execsql
5600: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 {. DROP TABLE
5610: 20 65 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e e;. SELECT n
5620: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f ame FROM sqlite_
5630: 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 72 master;. }.} {r
5640: 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 }..do_test vtab1
5650: 2e 39 2d 33 20 7b 0a 20 20 73 65 74 20 65 63 68 .9-3 {. set ech
5660: 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a 20 20 65 78 o_module "". ex
5670: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 ecsql {. CREA
5680: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE
5690: 20 65 20 55 53 49 4e 47 20 65 63 68 6f 28 72 2c e USING echo(r,
56a0: 20 65 5f 6c 6f 67 2c 20 76 69 72 74 75 61 6c 20 e_log, virtual
56b0: 31 20 32 20 33 20 76 61 72 63 68 61 72 28 33 32 1 2 3 varchar(32
56c0: 29 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 ));. }. set ec
56d0: 68 6f 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 ho_module.} [lis
56e0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5710: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 78 43 72 \. xCr
5720: 65 61 74 65 20 65 63 68 6f 20 6d 61 69 6e 20 65 eate echo main e
5730: 20 72 20 65 5f 6c 6f 67 20 7b 76 69 72 74 75 61 r e_log {virtua
5740: 6c 20 31 20 32 20 33 20 76 61 72 63 68 61 72 28 l 1 2 3 varchar(
5750: 33 32 29 7d 20 20 20 20 20 20 5c 0a 20 20 78 53 32)} \. xS
5760: 79 6e 63 20 65 63 68 6f 28 72 29 20 20 20 20 20 ync echo(r)
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
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 5c 0a 20 20 78 \. x
57a0: 43 6f 6d 6d 69 74 20 65 63 68 6f 28 72 29 20 20 Commit echo(r)
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d 0a \.].
57e0: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 .do_test vtab1.1
57f0: 30 2d 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 0-1 {. execsql
5800: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 {. CREATE TAB
5810: 4c 45 20 64 65 6c 28 64 29 3b 0a 20 20 20 20 43 LE del(d);. C
5820: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA
5830: 42 4c 45 20 65 32 20 55 53 49 4e 47 20 65 63 68 BLE e2 USING ech
5840: 6f 28 64 65 6c 29 3b 0a 20 20 7d 0a 20 20 64 62 o(del);. }. db
5850: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 close. sqlite3
5860: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 72 65 db test.db. re
5870: 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 gister_echo_modu
5880: 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e le [sqlite3_conn
5890: 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 ection_pointer d
58a0: 62 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 b]. execsql {.
58b0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 64 65 DROP TABLE de
58c0: 6c 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 l;. }. catchsq
58d0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a l {. SELECT *
58e0: 20 46 52 4f 4d 20 65 32 3b 0a 20 20 7d 0a 7d 20 FROM e2;. }.}
58f0: 7b 31 20 7b 76 74 61 62 6c 65 20 63 6f 6e 73 74 {1 {vtable const
5900: 72 75 63 74 6f 72 20 66 61 69 6c 65 64 3a 20 65 ructor failed: e
5910: 32 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 2}}.do_test vtab
5920: 31 2e 31 30 2d 32 20 7b 0a 20 20 73 65 74 20 72 1.10-2 {. set r
5930: 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 73 c [catch {. s
5940: 65 74 20 70 74 72 20 5b 73 71 6c 69 74 65 33 5f et ptr [sqlite3_
5950: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 connection_point
5960: 65 72 20 64 62 5d 0a 20 20 20 20 73 71 6c 69 74 er db]. sqlit
5970: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 20 e3_declare_vtab
5980: 24 70 74 72 20 7b 43 52 45 41 54 45 20 54 41 42 $ptr {CREATE TAB
5990: 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29 7d LE abc(a, b, c)}
59a0: 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 . } msg]. list
59b0: 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b $rc $msg.} {1 {
59c0: 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 library routine
59d0: 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 called out of se
59e0: 71 75 65 6e 63 65 7d 7d 0a 64 6f 5f 74 65 73 74 quence}}.do_test
59f0: 20 76 74 61 62 31 2e 31 30 2d 33 20 7b 0a 20 20 vtab1.10-3 {.
5a00: 73 65 74 20 3a 3a 65 63 68 6f 5f 6d 6f 64 75 6c set ::echo_modul
5a10: 65 5f 62 65 67 69 6e 5f 66 61 69 6c 20 72 0a 20 e_begin_fail r.
5a20: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 catchsql {.
5a30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 20 56 41 INSERT INTO e VA
5a40: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 LUES(1, 2, 3);.
5a50: 20 7d 0a 7d 20 7b 31 20 7b 53 51 4c 20 6c 6f 67 }.} {1 {SQL log
5a60: 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 ic error or miss
5a70: 69 6e 67 20 64 61 74 61 62 61 73 65 7d 7d 0a 64 ing database}}.d
5a80: 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 30 2d o_test vtab1.10-
5a90: 34 20 7b 0a 20 20 63 61 74 63 68 20 7b 65 78 65 4 {. catch {exe
5aa0: 63 73 71 6c 20 7b 0a 20 20 20 20 45 58 50 4c 41 csql {. EXPLA
5ab0: 49 4e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d IN 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 3b 0a 20 20 20 20 45 58 50 4c 41 49 4e 20 2;. EXPLAIN
5ae0: 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 QUERY PLAN SELEC
5af0: 54 20 2a 20 46 52 4f 4d 20 65 20 57 48 45 52 45 T * FROM e WHERE
5b00: 20 72 6f 77 69 64 20 3d 20 32 20 4f 52 44 45 52 rowid = 2 ORDER
5b10: 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 7d 7d 0a BY rowid;. }}.
5b20: 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 } {0}..do_test v
5b30: 74 61 62 31 2e 31 30 2d 35 20 7b 0a 20 20 73 65 tab1.10-5 {. se
5b40: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 t echo_module ""
5b50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 . execsql {.
5b60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 SELECT * FROM e
5b70: 20 57 48 45 52 45 20 72 6f 77 69 64 7c 7c 27 27 WHERE rowid||''
5b80: 20 4d 41 54 43 48 20 27 70 61 74 74 65 72 6e 27 MATCH 'pattern'
5b90: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 65 63 68 6f ;. }. set echo
5ba0: 5f 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 _module.} [list
5bb0: 5c 0a 20 20 78 42 65 73 74 49 6e 64 65 78 20 7b \. xBestIndex {
5bc0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 SELECT rowid, *
5bd0: 46 52 4f 4d 20 27 72 27 7d 20 5c 0a 20 20 78 46 FROM 'r'} \. xF
5be0: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f ilter {SELECT ro
5bf0: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 72 27 7d wid, * FROM 'r'}
5c00: 20 20 20 20 5c 0a 5d 0a 70 72 6f 63 20 6d 61 74 \.].proc mat
5c10: 63 68 5f 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b ch_func {args} {
5c20: 72 65 74 75 72 6e 20 22 22 7d 0a 64 6f 5f 74 65 return ""}.do_te
5c30: 73 74 20 76 74 61 62 31 2e 31 30 2d 36 20 7b 0a st vtab1.10-6 {.
5c40: 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c set echo_modul
5c50: 65 20 22 22 0a 20 20 64 62 20 66 75 6e 63 74 69 e "". db functi
5c60: 6f 6e 20 6d 61 74 63 68 20 6d 61 74 63 68 5f 66 on match match_f
5c70: 75 6e 63 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a unc. execsql {.
5c80: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f SELECT * FRO
5c90: 4d 20 65 20 57 48 45 52 45 20 6d 61 74 63 68 28 M e WHERE match(
5ca0: 27 70 61 74 74 65 72 6e 27 2c 20 72 6f 77 69 64 'pattern', rowid
5cb0: 2c 20 27 70 61 74 74 65 72 6e 32 27 29 3b 0a 20 , 'pattern2');.
5cc0: 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f }. set echo_mo
5cd0: 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20 dule.} [list \.
5ce0: 20 78 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c xBestIndex {SEL
5cf0: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f ECT rowid, * FRO
5d00: 4d 20 27 72 27 7d 20 5c 0a 20 20 78 46 69 6c 74 M 'r'} \. xFilt
5d10: 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 er {SELECT rowid
5d20: 2c 20 2a 20 46 52 4f 4d 20 27 72 27 7d 20 20 20 , * FROM 'r'}
5d30: 20 5c 0a 5d 0a 0a 0a 23 20 54 65 73 74 69 6e 67 \.]...# Testing
5d40: 20 74 68 65 20 78 46 69 6e 64 46 75 6e 63 74 69 the xFindFuncti
5d50: 6f 6e 20 69 6e 74 65 72 66 61 63 65 0a 23 0a 63 on interface.#.c
5d60: 61 74 63 68 20 7b 72 65 6e 61 6d 65 20 3a 3a 65 atch {rename ::e
5d70: 63 68 6f 5f 67 6c 6f 62 5f 6f 76 65 72 6c 6f 61 cho_glob_overloa
5d80: 64 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 74 d {}}.do_test vt
5d90: 61 62 31 2e 31 31 2d 31 20 7b 0a 20 20 65 78 65 ab1.11-1 {. exe
5da0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 csql {. INSER
5db0: 54 20 49 4e 54 4f 20 72 28 61 2c 62 2c 63 29 20 T INTO r(a,b,c)
5dc0: 56 41 4c 55 45 53 28 31 2c 27 3f 27 2c 39 39 29 VALUES(1,'?',99)
5dd0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 ;. INSERT INT
5de0: 4f 20 72 28 61 2c 62 2c 63 29 20 56 41 4c 55 45 O r(a,b,c) VALUE
5df0: 53 28 32 2c 33 2c 39 39 29 3b 0a 20 20 20 20 53 S(2,3,99);. S
5e00: 45 4c 45 43 54 20 61 20 47 4c 4f 42 20 62 20 46 ELECT a GLOB b F
5e10: 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b 31 20 30 ROM e. }.} {1 0
5e20: 7d 0a 70 72 6f 63 20 3a 3a 65 63 68 6f 5f 67 6c }.proc ::echo_gl
5e30: 6f 62 5f 6f 76 65 72 6c 6f 61 64 20 7b 61 20 62 ob_overload {a b
5e40: 7d 20 7b 0a 20 72 65 74 75 72 6e 20 5b 6c 69 73 } {. return [lis
5e50: 74 20 24 62 20 24 61 5d 0a 7d 0a 64 6f 5f 74 65 t $b $a].}.do_te
5e60: 73 74 20 76 74 61 62 31 2e 31 31 2d 32 20 7b 0a st vtab1.11-2 {.
5e70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 execsql {.
5e80: 53 45 4c 45 43 54 20 61 20 6c 69 6b 65 20 27 62 SELECT a like 'b
5e90: 27 20 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b ' FROM e. }.} {
5ea0: 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 0 0}.do_test vta
5eb0: 62 31 2e 31 31 2d 33 20 7b 0a 20 20 65 78 65 63 b1.11-3 {. exec
5ec0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 sql {. SELECT
5ed0: 20 61 20 67 6c 6f 62 20 27 32 27 20 46 52 4f 4d a glob '2' FROM
5ee0: 20 65 0a 20 20 7d 0a 7d 20 7b 7b 31 20 32 7d 20 e. }.} {{1 2}
5ef0: 7b 32 20 32 7d 7d 0a 64 6f 5f 74 65 73 74 20 76 {2 2}}.do_test v
5f00: 74 61 62 31 2e 31 31 2d 34 20 7b 0a 20 20 65 78 tab1.11-4 {. ex
5f10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 ecsql {. SELE
5f20: 43 54 20 20 67 6c 6f 62 28 27 32 27 2c 61 29 20 CT glob('2',a)
5f30: 46 52 4f 4d 20 65 0a 20 20 7d 0a 7d 20 7b 30 20 FROM e. }.} {0
5f40: 31 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 1}.do_test vtab1
5f50: 2e 31 31 2d 35 20 7b 0a 20 20 65 78 65 63 73 71 .11-5 {. execsq
5f60: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 20 l {. SELECT
5f70: 67 6c 6f 62 28 61 2c 27 32 27 29 20 46 52 4f 4d glob(a,'2') FROM
5f80: 20 65 0a 20 20 7d 0a 7d 20 7b 7b 32 20 31 7d 20 e. }.} {{2 1}
5f90: 7b 32 20 32 7d 7d 0a 20 0a 23 2d 2d 2d 2d 2d 2d {2 2}}. .#------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fe0: 0a 23 20 54 65 73 74 20 74 68 65 20 6f 75 74 63 .# Test the outc
5ff0: 6f 6d 65 20 69 66 20 61 20 63 6f 6e 73 74 72 61 ome if a constra
6000: 69 6e 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 int is encounter
6010: 65 64 20 68 61 6c 66 2d 77 61 79 20 74 68 72 6f ed half-way thro
6020: 75 67 68 0a 23 20 61 20 6d 75 6c 74 69 2d 72 6f ugh.# a multi-ro
6030: 77 20 49 4e 53 45 52 54 20 74 68 61 74 20 69 73 w INSERT that is
6040: 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73 61 inside a transa
6050: 63 74 69 6f 6e 0a 23 0a 64 6f 5f 74 65 73 74 20 ction.#.do_test
6060: 76 74 61 62 31 2e 31 32 2d 31 20 7b 0a 20 20 65 vtab1.12-1 {. e
6070: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 xecsql {. CRE
6080: 41 54 45 20 54 41 42 4c 45 20 62 28 61 2c 20 62 ATE TABLE b(a, b
6090: 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 , c);. CREATE
60a0: 20 54 41 42 4c 45 20 63 28 61 20 55 4e 49 51 55 TABLE c(a UNIQU
60b0: 45 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 49 4e E, b, c);. IN
60c0: 53 45 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 SERT INTO b VALU
60d0: 45 53 28 31 2c 20 27 41 27 2c 20 27 42 27 29 3b ES(1, 'A', 'B');
60e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
60f0: 20 62 20 56 41 4c 55 45 53 28 32 2c 20 27 43 27 b VALUES(2, 'C'
6100: 2c 20 27 44 27 29 3b 0a 20 20 20 20 49 4e 53 45 , 'D');. INSE
6110: 52 54 20 49 4e 54 4f 20 62 20 56 41 4c 55 45 53 RT INTO b VALUES
6120: 28 33 2c 20 27 45 27 2c 20 27 46 27 29 3b 0a 20 (3, 'E', 'F');.
6130: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 INSERT INTO c
6140: 20 56 41 4c 55 45 53 28 33 2c 20 27 47 27 2c 20 VALUES(3, 'G',
6150: 27 48 27 29 3b 0a 20 20 20 20 43 52 45 41 54 45 'H');. CREATE
6160: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 VIRTUAL TABLE e
6170: 63 68 6f 5f 63 20 55 53 49 4e 47 20 65 63 68 6f cho_c USING echo
6180: 28 63 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 (c);. }.} {}..#
6190: 20 46 69 72 73 74 20 74 65 73 74 20 6f 75 74 73 First test outs
61a0: 69 64 65 20 6f 66 20 61 20 74 72 61 6e 73 61 63 ide of a transac
61b0: 74 69 6f 6e 2e 0a 64 6f 5f 74 65 73 74 20 76 74 tion..do_test vt
61c0: 61 62 31 2e 31 32 2d 32 20 7b 0a 20 20 63 61 74 ab1.12-2 {. cat
61d0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 chsql { INSERT I
61e0: 4e 54 4f 20 65 63 68 6f 5f 63 20 53 45 4c 45 43 NTO echo_c SELEC
61f0: 54 20 2a 20 46 52 4f 4d 20 62 3b 20 7d 0a 7d 20 T * FROM b; }.}
6200: 7b 31 20 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72 {1 {echo-vtab-er
6210: 72 6f 72 3a 20 63 6f 6c 75 6d 6e 20 61 20 69 73 ror: column a is
6220: 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f not unique}}.do
6230: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d 32 _test vtab1.12-2
6240: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 .1 {. sqlite3_e
6250: 72 72 6d 73 67 20 64 62 0a 7d 20 7b 65 63 68 6f rrmsg db.} {echo
6260: 2d 76 74 61 62 2d 65 72 72 6f 72 3a 20 63 6f 6c -vtab-error: col
6270: 75 6d 6e 20 61 20 69 73 20 6e 6f 74 20 75 6e 69 umn a is not uni
6280: 71 75 65 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 que}.do_test vta
6290: 62 31 2e 31 32 2d 33 20 7b 0a 20 20 65 78 65 63 b1.12-3 {. exec
62a0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 sql { SELECT * F
62b0: 52 4f 4d 20 63 20 7d 0a 7d 20 7b 33 20 47 20 48 ROM c }.} {3 G H
62c0: 7d 0a 0a 23 20 4e 6f 77 20 74 68 65 20 72 65 61 }..# Now the rea
62d0: 6c 20 74 65 73 74 20 2d 20 77 72 61 70 70 65 64 l test - wrapped
62e0: 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f in a transactio
62f0: 6e 2e 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 n..do_test vtab1
6300: 2e 31 32 2d 34 20 7b 0a 20 20 65 78 65 63 73 71 .12-4 {. execsq
6310: 6c 20 20 7b 42 45 47 49 4e 7d 0a 20 20 63 61 74 l {BEGIN}. cat
6320: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 chsql { INSERT I
6330: 4e 54 4f 20 65 63 68 6f 5f 63 20 53 45 4c 45 43 NTO echo_c SELEC
6340: 54 20 2a 20 46 52 4f 4d 20 62 3b 20 7d 0a 7d 20 T * FROM b; }.}
6350: 7b 31 20 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72 {1 {echo-vtab-er
6360: 72 6f 72 3a 20 63 6f 6c 75 6d 6e 20 61 20 69 73 ror: column a is
6370: 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f not unique}}.do
6380: 5f 74 65 73 74 20 76 74 61 62 31 2e 31 32 2d 35 _test vtab1.12-5
6390: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 {. execsql { S
63a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 20 7d ELECT * FROM c }
63b0: 0a 7d 20 7b 33 20 47 20 48 7d 0a 64 6f 5f 74 65 .} {3 G H}.do_te
63c0: 73 74 20 76 74 61 62 31 2e 31 32 2d 36 20 7b 0a st vtab1.12-6 {.
63d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d execsql { COMM
63e0: 49 54 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b IT }. execsql {
63f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 SELECT * FROM c
6400: 20 7d 0a 7d 20 7b 33 20 47 20 48 7d 0a 0a 23 20 }.} {3 G H}..#
6410: 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 28 74 69 At one point (ti
6420: 63 6b 65 74 20 23 32 37 35 39 29 2c 20 61 20 57 cket #2759), a W
6430: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 HERE clause of t
6440: 68 65 20 66 6f 72 6d 20 22 3c 63 6f 6c 75 6d 6e he form "<column
6450: 3e 20 49 53 20 4e 55 4c 4c 22 0a 23 20 6f 6e 20 > IS NULL".# on
6460: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 a virtual table
6470: 77 61 73 20 63 61 75 73 69 6e 67 20 61 6e 20 61 was causing an a
6480: 73 73 65 72 74 28 29 20 74 6f 20 66 61 69 6c 20 ssert() to fail
6490: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e in the compiler.
64a0: 0a 23 0a 23 20 22 49 53 20 4e 55 4c 4c 22 20 63 .#.# "IS NULL" c
64b0: 6c 61 75 73 65 73 20 73 68 6f 75 6c 64 20 6e 6f lauses should no
64c0: 74 20 62 65 20 70 61 73 73 65 64 20 74 68 72 6f t be passed thro
64d0: 75 67 68 20 74 6f 20 74 68 65 20 76 69 72 74 75 ugh to the virtu
64e0: 61 6c 20 74 61 62 6c 65 0a 23 20 69 6d 70 6c 65 al table.# imple
64f0: 6d 65 6e 74 61 74 69 6f 6e 2e 20 54 68 65 79 20 mentation. They
6500: 61 72 65 20 68 61 6e 64 6c 65 64 20 62 79 20 53 are handled by S
6510: 51 4c 69 74 65 20 61 66 74 65 72 20 74 68 65 20 QLite after the
6520: 76 74 61 62 20 72 65 74 75 72 6e 73 20 69 74 73 vtab returns its
6530: 0a 23 20 64 61 74 61 2e 0a 23 0a 64 6f 5f 74 65 .# data..#.do_te
6540: 73 74 20 76 74 61 62 31 2e 31 33 2d 31 20 7b 0a st vtab1.13-1 {.
6550: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 execsql { .
6560: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 SELECT * FROM e
6570: 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20 49 53 cho_c WHERE a IS
6580: 20 4e 55 4c 4c 20 0a 20 20 7d 0a 7d 20 7b 7d 0a NULL . }.} {}.
6590: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2e 31 33 do_test vtab1.13
65a0: 2d 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b -2 {. execsql {
65b0: 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 . INSERT INT
65c0: 4f 20 63 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c O c VALUES(NULL,
65d0: 20 31 35 2c 20 31 36 29 3b 0a 20 20 20 20 53 45 15, 16);. SE
65e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f LECT * FROM echo
65f0: 5f 63 20 57 48 45 52 45 20 61 20 49 53 20 4e 55 _c WHERE a IS NU
6600: 4c 4c 20 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 31 35 LL . }.} {{} 15
6610: 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 16}.do_test vta
6620: 62 31 2e 31 33 2d 33 20 7b 0a 20 20 65 78 65 63 b1.13-3 {. exec
6630: 73 71 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 sql { . INSER
6640: 54 20 49 4e 54 4f 20 63 20 56 41 4c 55 45 53 28 T INTO c VALUES(
6650: 31 35 2c 20 4e 55 4c 4c 2c 20 31 36 29 3b 0a 20 15, NULL, 16);.
6660: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d SELECT * FROM
6670: 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 62 20 echo_c WHERE b
6680: 49 53 20 4e 55 4c 4c 20 0a 20 20 7d 0a 7d 20 7b IS NULL . }.} {
6690: 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 73 15 {} 16}.do_tes
66a0: 74 20 76 74 61 62 31 2e 31 33 2d 33 20 7b 0a 20 t vtab1.13-3 {.
66b0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 execsql { .
66c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 SELECT * FROM ec
66d0: 68 6f 5f 63 20 57 48 45 52 45 20 62 20 49 53 20 ho_c WHERE b IS
66e0: 4e 55 4c 4c 20 41 4e 44 20 61 20 3d 20 31 35 3b NULL AND a = 15;
66f0: 0a 20 20 7d 0a 7d 20 7b 31 35 20 7b 7d 20 31 36 . }.} {15 {} 16
6700: 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 }...do_test vtab
6710: 31 2d 31 34 2e 30 30 31 20 7b 0a 20 20 65 78 65 1-14.001 {. exe
6720: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 csql {SELECT row
6730: 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f id, * FROM echo_
6740: 63 20 57 48 45 52 45 20 2b 72 6f 77 69 64 20 49 c WHERE +rowid I
6750: 4e 20 28 31 2c 32 2c 33 29 7d 0a 7d 20 7b 31 20 N (1,2,3)}.} {1
6760: 33 20 47 20 48 20 32 20 7b 7d 20 31 35 20 31 36 3 G H 2 {} 15 16
6770: 20 33 20 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 3 15 {} 16}.do_
6780: 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e 30 30 test vtab1-14.00
6790: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 2 {. execsql {S
67a0: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 ELECT rowid, * F
67b0: 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 ROM echo_c WHERE
67c0: 20 72 6f 77 69 64 20 49 4e 20 28 31 2c 32 2c 33 rowid IN (1,2,3
67d0: 29 7d 0a 7d 20 7b 31 20 33 20 47 20 48 20 32 20 )}.} {1 3 G H 2
67e0: 7b 7d 20 31 35 20 31 36 20 33 20 31 35 20 7b 7d {} 15 16 3 15 {}
67f0: 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 16}.do_test vta
6800: 62 31 2d 31 34 2e 30 30 33 20 7b 0a 20 20 65 78 b1-14.003 {. ex
6810: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f ecsql {SELECT ro
6820: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f wid, * FROM echo
6830: 5f 63 20 57 48 45 52 45 20 2b 72 6f 77 69 64 20 _c WHERE +rowid
6840: 49 4e 20 28 30 2c 31 2c 35 2c 32 2c 27 61 27 2c IN (0,1,5,2,'a',
6850: 33 2c 4e 55 4c 4c 29 7d 0a 7d 20 7b 31 20 33 20 3,NULL)}.} {1 3
6860: 47 20 48 20 32 20 7b 7d 20 31 35 20 31 36 20 33 G H 2 {} 15 16 3
6870: 20 31 35 20 7b 7d 20 31 36 7d 0a 64 6f 5f 74 65 15 {} 16}.do_te
6880: 73 74 20 76 74 61 62 31 2d 31 34 2e 30 30 34 20 st vtab1-14.004
6890: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c {. execsql {SEL
68a0: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f ECT rowid, * FRO
68b0: 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 72 M echo_c WHERE r
68c0: 6f 77 69 64 20 49 4e 20 28 30 2c 31 2c 35 2c 27 owid IN (0,1,5,'
68d0: 61 27 2c 32 2c 33 2c 4e 55 4c 4c 29 7d 0a 7d 20 a',2,3,NULL)}.}
68e0: 7b 31 20 33 20 47 20 48 20 32 20 7b 7d 20 31 35 {1 3 G H 2 {} 15
68f0: 20 31 36 20 33 20 31 35 20 7b 7d 20 31 36 7d 0a 16 3 15 {} 16}.
6900: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 do_test vtab1-14
6910: 2e 30 30 35 20 7b 0a 20 20 65 78 65 63 73 71 6c .005 {. execsql
6920: 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 {SELECT rowid,
6930: 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 * FROM echo_c WH
6940: 45 52 45 20 72 6f 77 69 64 20 4e 4f 54 20 49 4e ERE rowid NOT IN
6950: 20 28 30 2c 31 2c 35 2c 27 61 27 2c 32 2c 33 29 (0,1,5,'a',2,3)
6960: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 }.} {}.do_test v
6970: 74 61 62 31 2d 31 34 2e 30 30 36 20 7b 0a 20 20 tab1-14.006 {.
6980: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 execsql {SELECT
6990: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 65 63 rowid, * FROM ec
69a0: 68 6f 5f 63 20 57 48 45 52 45 20 72 6f 77 69 64 ho_c WHERE rowid
69b0: 20 4e 4f 54 20 49 4e 20 28 30 2c 35 2c 27 61 27 NOT IN (0,5,'a'
69c0: 2c 32 2c 33 29 7d 0a 7d 20 7b 31 20 33 20 47 20 ,2,3)}.} {1 3 G
69d0: 48 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 H}.do_test vtab1
69e0: 2d 31 34 2e 30 30 37 20 7b 0a 20 20 65 78 65 63 -14.007 {. exec
69f0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 sql {SELECT rowi
6a00: 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 d, * FROM echo_c
6a10: 20 57 48 45 52 45 20 2b 72 6f 77 69 64 20 4e 4f WHERE +rowid NO
6a20: 54 20 49 4e 20 28 30 2c 35 2c 27 61 27 2c 32 2c T IN (0,5,'a',2,
6a30: 33 2c 4e 55 4c 4c 29 7d 0a 7d 20 7b 7d 0a 64 6f 3,NULL)}.} {}.do
6a40: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 34 2e 30 _test vtab1-14.0
6a50: 30 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 08 {. execsql {
6a60: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 SELECT rowid, *
6a70: 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 FROM echo_c WHER
6a80: 45 20 72 6f 77 69 64 20 4e 4f 54 20 49 4e 20 28 E rowid NOT IN (
6a90: 30 2c 35 2c 27 61 27 2c 32 2c 33 2c 4e 55 4c 4c 0,5,'a',2,3,NULL
6aa0: 29 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 )}.} {}.do_test
6ab0: 76 74 61 62 31 2d 31 34 2e 30 31 31 20 7b 0a 20 vtab1-14.011 {.
6ac0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 execsql {SELECT
6ad0: 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 * FROM echo_c W
6ae0: 48 45 52 45 20 2b 61 20 49 4e 20 28 31 2c 33 2c HERE +a IN (1,3,
6af0: 38 2c 27 78 27 2c 4e 55 4c 4c 2c 31 35 2c 32 34 8,'x',NULL,15,24
6b00: 29 7d 0a 7d 20 7b 33 20 47 20 48 20 31 35 20 7b )}.} {3 G H 15 {
6b10: 7d 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 } 16}.do_test vt
6b20: 61 62 31 2d 31 34 2e 30 31 32 20 7b 0a 20 20 65 ab1-14.012 {. e
6b30: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a xecsql {SELECT *
6b40: 20 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 FROM echo_c WHE
6b50: 52 45 20 61 20 49 4e 20 28 31 2c 33 2c 38 2c 27 RE a IN (1,3,8,'
6b60: 78 27 2c 4e 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a x',NULL,15,24)}.
6b70: 7d 20 7b 33 20 47 20 48 20 31 35 20 7b 7d 20 31 } {3 G H 15 {} 1
6b80: 36 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 6}.do_test vtab1
6b90: 2d 31 34 2e 30 31 33 20 7b 0a 20 20 65 78 65 63 -14.013 {. exec
6ba0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 sql {SELECT * FR
6bb0: 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 20 OM echo_c WHERE
6bc0: 61 20 4e 4f 54 20 49 4e 20 28 31 2c 38 2c 27 78 a NOT IN (1,8,'x
6bd0: 27 2c 31 35 2c 32 34 29 7d 0a 7d 20 7b 33 20 47 ',15,24)}.} {3 G
6be0: 20 48 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 H}.do_test vtab
6bf0: 31 2d 31 34 2e 30 31 34 20 7b 0a 20 20 65 78 65 1-14.014 {. exe
6c00: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 csql {SELECT * F
6c10: 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 45 ROM echo_c WHERE
6c20: 20 61 20 4e 4f 54 20 49 4e 20 28 31 2c 38 2c 27 a NOT IN (1,8,'
6c30: 78 27 2c 4e 55 4c 4c 2c 31 35 2c 32 34 29 7d 0a x',NULL,15,24)}.
6c40: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 76 74 61 } {}.do_test vta
6c50: 62 31 2d 31 34 2e 30 31 35 20 7b 0a 20 20 65 78 b1-14.015 {. ex
6c60: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 ecsql {SELECT *
6c70: 46 52 4f 4d 20 65 63 68 6f 5f 63 20 57 48 45 52 FROM echo_c WHER
6c80: 45 20 2b 61 20 4e 4f 54 20 49 4e 20 28 31 2c 38 E +a NOT IN (1,8
6c90: 2c 27 78 27 2c 4e 55 4c 4c 2c 31 35 2c 32 34 29 ,'x',NULL,15,24)
6ca0: 7d 0a 7d 20 7b 7d 0a 0a 0a 0a 23 64 6f 5f 74 65 }.} {}....#do_te
6cb0: 73 74 20 76 74 61 62 31 2d 31 34 2e 31 20 7b 0a st vtab1-14.1 {.
6cc0: 23 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c # execsql { DEL
6cd0: 45 54 45 20 46 52 4f 4d 20 63 20 7d 0a 23 20 20 ETE FROM c }.#
6ce0: 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 set echo_module
6cf0: 22 22 0a 23 20 20 65 78 65 63 73 71 6c 20 7b 20 "".# execsql {
6d00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 SELECT * FROM ec
6d10: 68 6f 5f 63 20 57 48 45 52 45 20 72 6f 77 69 64 ho_c WHERE rowid
6d20: 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 7d 0a IN (1, 2, 3) }.
6d30: 23 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 # set echo_modu
6d40: 6c 65 0a 23 7d 20 7b 2f 2e 2a 78 42 65 73 74 49 le.#} {/.*xBestI
6d50: 6e 64 65 78 20 7b 53 45 4c 45 43 54 20 72 6f 77 ndex {SELECT row
6d60: 69 64 2c 20 2e 20 46 52 4f 4d 20 27 63 27 20 57 id, . FROM 'c' W
6d70: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 2e 7d 20 HERE rowid = .}
6d80: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 xFilter {SELECT
6d90: 72 6f 77 69 64 2c 20 2e 20 46 52 4f 4d 20 27 63 rowid, . FROM 'c
6da0: 27 7d 20 31 2f 7d 0a 0a 64 6f 5f 74 65 73 74 20 '} 1/}..do_test
6db0: 76 74 61 62 31 2d 31 34 2e 32 20 7b 0a 20 20 73 vtab1-14.2 {. s
6dc0: 65 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 et echo_module "
6dd0: 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 ". execsql { SE
6de0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f LECT * FROM echo
6df0: 5f 63 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d _c WHERE rowid =
6e00: 20 31 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f 1 }. set echo_
6e10: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 module.} [list x
6e20: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 BestIndex {SELEC
6e30: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 T rowid, * FROM
6e40: 27 63 27 20 57 48 45 52 45 20 72 6f 77 69 64 20 'c' WHERE rowid
6e50: 3d 20 3f 7d 20 78 46 69 6c 74 65 72 20 7b 53 45 = ?} xFilter {SE
6e60: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 LECT rowid, * FR
6e70: 4f 4d 20 27 63 27 20 57 48 45 52 45 20 72 6f 77 OM 'c' WHERE row
6e80: 69 64 20 3d 20 3f 7d 20 31 5d 0a 0a 64 6f 5f 74 id = ?} 1]..do_t
6e90: 65 73 74 20 76 74 61 62 31 2d 31 34 2e 33 20 7b est vtab1-14.3 {
6ea0: 0a 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f 64 75 . set echo_modu
6eb0: 6c 65 20 22 22 0a 20 20 65 78 65 63 73 71 6c 20 le "". execsql
6ec0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 { SELECT * FROM
6ed0: 65 63 68 6f 5f 63 20 57 48 45 52 45 20 61 20 3d echo_c WHERE a =
6ee0: 20 31 20 7d 0a 20 20 73 65 74 20 65 63 68 6f 5f 1 }. set echo_
6ef0: 6d 6f 64 75 6c 65 0a 7d 20 5b 6c 69 73 74 20 78 module.} [list x
6f00: 42 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 BestIndex {SELEC
6f10: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 T rowid, * FROM
6f20: 27 63 27 20 57 48 45 52 45 20 61 20 3d 20 3f 7d 'c' WHERE a = ?}
6f30: 20 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 xFilter {SELECT
6f40: 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 rowid, * FROM '
6f50: 63 27 20 57 48 45 52 45 20 61 20 3d 20 3f 7d 20 c' WHERE a = ?}
6f60: 31 5d 0a 0a 23 64 6f 5f 74 65 73 74 20 76 74 61 1]..#do_test vta
6f70: 62 31 2d 31 34 2e 34 20 7b 0a 23 20 20 73 65 74 b1-14.4 {.# set
6f80: 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 20 22 22 0a echo_module "".
6f90: 23 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c # execsql { SEL
6fa0: 45 43 54 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f ECT * FROM echo_
6fb0: 63 20 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c c WHERE a IN (1,
6fc0: 20 32 29 20 7d 0a 23 20 20 73 65 74 20 65 63 68 2) }.# set ech
6fd0: 6f 5f 6d 6f 64 75 6c 65 0a 23 7d 20 7b 2f 78 42 o_module.#} {/xB
6fe0: 65 73 74 49 6e 64 65 78 20 7b 53 45 4c 45 43 54 estIndex {SELECT
6ff0: 20 72 6f 77 69 64 2c 20 2e 20 46 52 4f 4d 20 27 rowid, . FROM '
7000: 63 27 20 57 48 45 52 45 20 61 20 3d 20 2e 7d 20 c' WHERE a = .}
7010: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 xFilter {SELECT
7020: 72 6f 77 69 64 2c 20 2e 20 46 52 4f 4d 20 27 63 rowid, . FROM 'c
7030: 27 20 57 48 45 52 45 20 61 20 3d 20 2e 7d 20 31 ' WHERE a = .} 1
7040: 2f 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 /}..do_test vtab
7050: 31 2d 31 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 1-15.1 {. execs
7060: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 ql {. CREATE
7070: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 TABLE t1(a, b, c
7080: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 );. CREATE VI
7090: 52 54 55 41 4c 20 54 41 42 4c 45 20 65 63 68 6f RTUAL TABLE echo
70a0: 5f 74 31 20 55 53 49 4e 47 20 65 63 68 6f 28 74 _t1 USING echo(t
70b0: 31 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 1);. }.} {}.do_
70c0: 74 65 73 74 20 76 74 61 62 31 2d 31 35 2e 32 20 test vtab1-15.2
70d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 {. execsql {.
70e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 63 INSERT INTO ec
70f0: 68 6f 5f 74 31 28 72 6f 77 69 64 29 20 56 41 4c ho_t1(rowid) VAL
7100: 55 45 53 28 34 35 29 3b 0a 20 20 20 20 53 45 4c UES(45);. SEL
7110: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f ECT rowid, * FRO
7120: 4d 20 65 63 68 6f 5f 74 31 3b 0a 20 20 7d 0a 7d M echo_t1;. }.}
7130: 20 7b 34 35 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 64 {45 {} {} {}}.d
7140: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 35 2e o_test vtab1-15.
7150: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 3 {. execsql {.
7160: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
7170: 65 63 68 6f 5f 74 31 28 72 6f 77 69 64 29 20 56 echo_t1(rowid) V
7180: 41 4c 55 45 53 28 4e 55 4c 4c 29 3b 0a 20 20 20 ALUES(NULL);.
7190: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a SELECT rowid, *
71a0: 20 46 52 4f 4d 20 65 63 68 6f 5f 74 31 3b 0a 20 FROM echo_t1;.
71b0: 20 7d 0a 7d 20 7b 34 35 20 7b 7d 20 7b 7d 20 7b }.} {45 {} {} {
71c0: 7d 20 34 36 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 64 } 46 {} {} {}}.d
71d0: 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 35 2e o_test vtab1-15.
71e0: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 4 {. catchsql {
71f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f . INSERT INTO
7200: 20 65 63 68 6f 5f 74 31 28 72 6f 77 69 64 29 20 echo_t1(rowid)
7210: 56 41 4c 55 45 53 28 27 6e 65 77 20 72 6f 77 69 VALUES('new rowi
7220: 64 27 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 64 d');. }.} {1 {d
7230: 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 atatype mismatch
7240: 7d 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 }}..# The follow
7250: 69 6e 67 20 74 65 73 74 73 20 2d 20 76 74 61 62 ing tests - vtab
7260: 31 2d 31 36 2e 2a 20 2d 20 61 72 65 20 64 65 73 1-16.* - are des
7270: 69 67 6e 65 64 20 74 6f 20 74 65 73 74 20 74 68 igned to test th
7280: 61 74 20 73 65 74 74 69 6e 67 20 0a 23 20 73 71 at setting .# sq
7290: 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d lite3_vtab.zErrM
72a0: 73 67 20 76 61 72 69 61 62 6c 65 20 63 61 6e 20 sg variable can
72b0: 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 76 be used by the v
72c0: 74 61 62 20 69 6e 74 65 72 66 61 63 65 20 74 6f tab interface to
72d0: 20 0a 23 20 72 65 74 75 72 6e 20 61 6e 20 65 72 .# return an er
72e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 74 ror message to t
72f0: 68 65 20 75 73 65 72 2e 0a 23 20 0a 64 6f 5f 74 he user..# .do_t
7300: 65 73 74 20 76 74 61 62 31 2d 31 36 2e 31 20 7b est vtab1-16.1 {
7310: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 . execsql {.
7320: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 CREATE TABLE t2
7330: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (a PRIMARY KEY,
7340: 62 2c 20 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 b, c);. INSER
7350: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 T INTO t2 VALUES
7360: 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 49 (1, 2, 3);. I
7370: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 NSERT INTO t2 VA
7380: 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 LUES(4, 5, 6);.
7390: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 CREATE VIRTUA
73a0: 4c 20 54 41 42 4c 45 20 65 63 68 6f 5f 74 32 20 L TABLE echo_t2
73b0: 55 53 49 4e 47 20 65 63 68 6f 28 74 32 29 3b 0a USING echo(t2);.
73c0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 73 65 74 20 74 6e }.} {}..set tn
73d0: 20 32 0a 66 6f 72 65 61 63 68 20 6d 65 74 68 6f 2.foreach metho
73e0: 64 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 78 42 d [list \. xB
73f0: 65 73 74 49 6e 64 65 78 20 20 20 20 20 20 20 5c estIndex \
7400: 0a 20 20 20 20 78 4f 70 65 6e 20 20 20 20 20 20 . xOpen
7410: 20 20 20 20 20 20 5c 0a 20 20 20 20 78 46 69 6c \. xFil
7420: 74 65 72 20 20 20 20 20 20 20 20 20 20 5c 0a 20 ter \.
7430: 20 20 20 78 4e 65 78 74 20 20 20 20 20 20 20 20 xNext
7440: 20 20 20 20 5c 0a 20 20 20 20 78 43 6f 6c 75 6d \. xColum
7450: 6e 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 n \.
7460: 20 78 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 xRowid
7470: 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 74 65 73 \.] {. do_tes
7480: 74 20 76 74 61 62 31 2d 31 36 2e 24 74 6e 20 7b t vtab1-16.$tn {
7490: 0a 20 20 20 20 73 65 74 20 65 63 68 6f 5f 6d 6f . set echo_mo
74a0: 64 75 6c 65 5f 66 61 69 6c 28 24 6d 65 74 68 6f dule_fail($metho
74b0: 64 2c 74 32 29 20 22 74 68 65 20 24 6d 65 74 68 d,t2) "the $meth
74c0: 6f 64 20 6d 65 74 68 6f 64 20 68 61 73 20 66 61 od method has fa
74d0: 69 6c 65 64 22 0a 20 20 20 20 63 61 74 63 68 73 iled". catchs
74e0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 ql { SELECT rowi
74f0: 64 2c 20 2a 20 46 52 4f 4d 20 65 63 68 6f 5f 74 d, * FROM echo_t
7500: 32 20 57 48 45 52 45 20 61 20 3e 3d 20 31 20 7d 2 WHERE a >= 1 }
7510: 0a 20 20 7d 20 22 31 20 7b 65 63 68 6f 2d 76 74 . } "1 {echo-vt
7520: 61 62 2d 65 72 72 6f 72 3a 20 74 68 65 20 24 6d ab-error: the $m
7530: 65 74 68 6f 64 20 6d 65 74 68 6f 64 20 68 61 73 ethod method has
7540: 20 66 61 69 6c 65 64 7d 22 0a 20 20 75 6e 73 65 failed}". unse
7550: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66 61 t echo_module_fa
7560: 69 6c 28 24 6d 65 74 68 6f 64 2c 74 32 29 0a 20 il($method,t2).
7570: 20 69 6e 63 72 20 74 6e 0a 7d 0a 0a 66 6f 72 65 incr tn.}..fore
7580: 61 63 68 20 6d 65 74 68 6f 64 20 5b 6c 69 73 74 ach method [list
7590: 20 5c 0a 20 20 78 55 70 64 61 74 65 20 20 20 20 \. xUpdate
75a0: 20 20 20 20 20 20 20 20 5c 0a 20 20 78 42 65 67 \. xBeg
75b0: 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 5c in \
75c0: 0a 20 20 78 53 79 6e 63 20 20 20 20 20 20 20 20 . xSync
75d0: 20 20 20 20 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f \.] {. do
75e0: 5f 74 65 73 74 20 76 74 61 62 31 2d 31 36 2e 24 _test vtab1-16.$
75f0: 74 6e 20 7b 0a 20 20 20 20 73 65 74 20 65 63 68 tn {. set ech
7600: 6f 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 24 6d o_module_fail($m
7610: 65 74 68 6f 64 2c 74 32 29 20 22 74 68 65 20 24 ethod,t2) "the $
7620: 6d 65 74 68 6f 64 20 6d 65 74 68 6f 64 20 68 61 method method ha
7630: 73 20 66 61 69 6c 65 64 22 0a 20 20 20 20 63 61 s failed". ca
7640: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 tchsql { INSERT
7650: 49 4e 54 4f 20 65 63 68 6f 5f 74 32 20 56 41 4c INTO echo_t2 VAL
7660: 55 45 53 28 37 2c 20 38 2c 20 39 29 20 7d 0a 20 UES(7, 8, 9) }.
7670: 20 7d 20 22 31 20 7b 65 63 68 6f 2d 76 74 61 62 } "1 {echo-vtab
7680: 2d 65 72 72 6f 72 3a 20 74 68 65 20 24 6d 65 74 -error: the $met
7690: 68 6f 64 20 6d 65 74 68 6f 64 20 68 61 73 20 66 hod method has f
76a0: 61 69 6c 65 64 7d 22 0a 20 20 75 6e 73 65 74 20 ailed}". unset
76b0: 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c echo_module_fail
76c0: 28 24 6d 65 74 68 6f 64 2c 74 32 29 0a 20 20 69 ($method,t2). i
76d0: 6e 63 72 20 74 6e 0a 7d 0a 0a 69 66 63 61 70 61 ncr tn.}..ifcapa
76e0: 62 6c 65 20 61 6c 74 65 72 74 61 62 6c 65 20 7b ble altertable {
76f0: 0a 20 20 64 6f 5f 74 65 73 74 20 76 74 61 62 31 . do_test vtab1
7700: 2d 31 36 2e 24 74 6e 20 7b 0a 20 20 20 20 73 65 -16.$tn {. se
7710: 74 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 66 61 t echo_module_fa
7720: 69 6c 28 78 52 65 6e 61 6d 65 2c 74 32 29 20 22 il(xRename,t2) "
7730: 74 68 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 the xRename meth
7740: 6f 64 20 68 61 73 20 66 61 69 6c 65 64 22 0a 20 od has failed".
7750: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 41 4c catchsql { AL
7760: 54 45 52 20 54 41 42 4c 45 20 65 63 68 6f 5f 74 TER TABLE echo_t
7770: 32 20 52 45 4e 41 4d 45 20 54 4f 20 61 6e 6f 74 2 RENAME TO anot
7780: 68 65 72 5f 6e 61 6d 65 20 7d 0a 20 20 7d 20 22 her_name }. } "
7790: 31 20 7b 65 63 68 6f 2d 76 74 61 62 2d 65 72 72 1 {echo-vtab-err
77a0: 6f 72 3a 20 74 68 65 20 78 52 65 6e 61 6d 65 20 or: the xRename
77b0: 6d 65 74 68 6f 64 20 68 61 73 20 66 61 69 6c 65 method has faile
77c0: 64 7d 22 0a 20 20 75 6e 73 65 74 20 65 63 68 6f d}". unset echo
77d0: 5f 6d 6f 64 75 6c 65 5f 66 61 69 6c 28 78 52 65 _module_fail(xRe
77e0: 6e 61 6d 65 2c 74 32 29 0a 20 20 69 6e 63 72 20 name,t2). incr
77f0: 74 6e 0a 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c tn.}..# The foll
7800: 6f 77 69 6e 67 20 74 65 73 74 20 63 61 73 65 20 owing test case
7810: 65 78 70 6f 73 65 73 20 61 6e 20 69 6e 73 74 61 exposes an insta
7820: 6e 63 65 20 69 6e 20 73 71 6c 69 74 65 33 5f 64 nce in sqlite3_d
7830: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 0a 23 20 eclare_vtab().#
7840: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 an error message
7850: 20 77 61 73 20 73 65 74 20 75 73 69 6e 67 20 61 was set using a
7860: 20 63 61 6c 6c 20 73 69 6d 69 6c 61 72 20 74 6f call similar to
7870: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
7880: 28 7a 45 72 72 29 2c 0a 23 20 77 68 65 72 65 20 (zErr),.# where
7890: 7a 45 72 72 20 69 73 20 61 6e 20 61 72 62 69 74 zErr is an arbit
78a0: 72 61 72 79 20 73 74 72 69 6e 67 2e 20 54 68 69 rary string. Thi
78b0: 73 20 69 73 20 6e 6f 20 67 6f 6f 64 20 69 66 20 s is no good if
78c0: 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 the string conta
78d0: 69 6e 73 0a 23 20 63 68 61 72 61 63 74 65 72 73 ins.# characters
78e0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 6d 69 73 that can be mis
78f0: 74 61 6b 65 6e 20 66 6f 72 20 70 72 69 6e 74 66 taken for printf
7900: 28 29 20 66 6f 72 6d 61 74 74 69 6e 67 20 64 69 () formatting di
7910: 72 65 63 74 69 76 65 73 2e 0a 23 0a 64 6f 5f 74 rectives..#.do_t
7920: 65 73 74 20 76 74 61 62 31 2d 31 37 2e 31 20 7b est vtab1-17.1 {
7930: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 . execsql { .
7940: 20 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c PRAGMA writabl
7950: 65 5f 73 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 e_schema = 1;.
7960: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 INSERT INTO sq
7970: 6c 69 74 65 5f 6d 61 73 74 65 72 20 56 41 4c 55 lite_master VALU
7980: 45 53 28 0a 20 20 20 20 20 20 27 74 61 62 6c 65 ES(. 'table
7990: 27 2c 20 27 74 33 27 2c 20 27 74 33 27 2c 20 30 ', 't3', 't3', 0
79a0: 2c 20 27 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 , 'INSERT INTO "
79b0: 25 73 25 73 22 20 56 41 4c 55 45 53 28 31 29 27 %s%s" VALUES(1)'
79c0: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 63 61 . );. }. ca
79d0: 74 63 68 73 71 6c 20 7b 20 43 52 45 41 54 45 20 tchsql { CREATE
79e0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 34 VIRTUAL TABLE t4
79f0: 20 55 53 49 4e 47 20 65 63 68 6f 28 74 33 29 3b USING echo(t3);
7a00: 20 7d 0a 7d 20 7b 31 20 7b 76 74 61 62 6c 65 20 }.} {1 {vtable
7a10: 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 61 69 6c constructor fail
7a20: 65 64 3a 20 74 34 7d 7d 0a 0a 23 20 54 68 69 73 ed: t4}}..# This
7a30: 20 74 65 73 74 20 76 65 72 69 66 69 65 73 20 74 test verifies t
7a40: 68 61 74 20 74 69 63 6b 65 74 20 34 38 66 32 39 hat ticket 48f29
7a50: 39 36 33 20 69 73 20 66 69 78 65 64 2e 0a 23 0a 963 is fixed..#.
7a60: 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 37 do_test vtab1-17
7a70: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b .1 {. execsql {
7a80: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 . CREATE TAB
7a90: 4c 45 20 74 35 28 61 2c 20 62 29 3b 0a 20 20 20 LE t5(a, b);.
7aa0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 CREATE VIRTUAL
7ab0: 54 41 42 4c 45 20 65 35 20 55 53 49 4e 47 20 65 TABLE e5 USING e
7ac0: 63 68 6f 5f 76 32 28 74 35 29 3b 0a 20 20 20 20 cho_v2(t5);.
7ad0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 BEGIN;. INS
7ae0: 45 52 54 20 49 4e 54 4f 20 65 35 20 56 41 4c 55 ERT INTO e5 VALU
7af0: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 ES(1, 2);.
7b00: 44 52 4f 50 20 54 41 42 4c 45 20 65 35 3b 0a 20 DROP TABLE e5;.
7b10: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f SAVEPOINT o
7b20: 6e 65 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 ne;. ROLLBA
7b30: 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 20 20 43 CK TO one;. C
7b40: 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a OMMIT;. }.} {}.
7b50: 0a 64 6f 5f 74 65 73 74 20 76 74 61 62 31 2d 31 .do_test vtab1-1
7b60: 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7.2 {. execsql
7b70: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 { DELETE FROM sq
7b80: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 lite_master WHER
7b90: 45 20 73 71 6c 20 4c 49 4b 45 20 27 69 6e 73 65 E sql LIKE 'inse
7ba0: 72 74 25 27 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d rt%' }.} {}..#--
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bf0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f -------.# The fo
7c00: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20 llowing tests -
7c10: 76 74 61 62 31 2d 31 38 2e 2a 20 2d 20 74 65 73 vtab1-18.* - tes
7c20: 74 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d t that the optim
7c30: 69 7a 61 74 69 6f 6e 20 6f 66 20 4c 49 4b 45 0a ization of LIKE.
7c40: 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e # constraints in
7c50: 20 77 68 65 72 65 2e 63 20 70 6c 61 79 73 20 77 where.c plays w
7c60: 65 6c 6c 20 77 69 74 68 20 76 69 72 74 75 61 6c ell with virtual
7c70: 20 74 61 62 6c 65 73 2e 0a 23 0a 23 20 20 20 31 tables..#.# 1
7c80: 38 2e 31 2e 2a 3a 20 43 61 73 65 2d 69 6e 73 65 8.1.*: Case-inse
7c90: 6e 73 69 74 69 76 65 20 4c 49 4b 45 2e 0a 23 20 nsitive LIKE..#
7ca0: 20 20 31 38 2e 32 2e 2a 3a 20 43 61 73 65 2d 73 18.2.*: Case-s
7cb0: 65 6e 73 69 74 69 76 65 20 4c 49 4b 45 2e 0a 23 ensitive LIKE..#
7cc0: 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 .unset -nocompla
7cd0: 69 6e 20 65 63 68 6f 5f 6d 6f 64 75 6c 65 5f 62 in echo_module_b
7ce0: 65 67 69 6e 5f 66 61 69 6c 0a 0a 64 6f 5f 65 78 egin_fail..do_ex
7cf0: 65 63 73 71 6c 5f 74 65 73 74 20 31 38 2e 31 2e ecsql_test 18.1.
7d00: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 0 {. CREATE TAB
7d10: 4c 45 20 74 36 28 61 2c 20 62 20 54 45 58 54 29 LE t6(a, b TEXT)
7d20: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 ;. CREATE INDEX
7d30: 20 69 36 20 4f 4e 20 74 36 28 62 2c 20 61 29 3b i6 ON t6(b, a);
7d40: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 . INSERT INTO t
7d50: 36 20 56 41 4c 55 45 53 28 31 2c 20 27 50 65 74 6 VALUES(1, 'Pet
7d60: 65 72 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 er');. INSERT I
7d70: 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 32 2c NTO t6 VALUES(2,
7d80: 20 27 41 6e 64 72 65 77 27 29 3b 0a 20 20 49 4e 'Andrew');. IN
7d90: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c SERT INTO t6 VAL
7da0: 55 45 53 28 33 2c 20 27 4a 61 6d 65 73 27 29 3b UES(3, 'James');
7db0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 . INSERT INTO t
7dc0: 36 20 56 41 4c 55 45 53 28 34 2c 20 27 4a 6f 68 6 VALUES(4, 'Joh
7dd0: 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e n');. INSERT IN
7de0: 54 4f 20 74 36 20 56 41 4c 55 45 53 28 35 2c 20 TO t6 VALUES(5,
7df0: 27 50 68 69 6c 6c 69 70 27 29 3b 0a 20 20 49 4e 'Phillip');. IN
7e00: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c SERT INTO t6 VAL
7e10: 55 45 53 28 36 2c 20 27 42 61 72 74 68 6f 6c 6f UES(6, 'Bartholo
7e20: 6d 65 77 27 29 3b 0a 20 20 43 52 45 41 54 45 20 mew');. CREATE
7e30: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 65 36 VIRTUAL TABLE e6
7e40: 20 55 53 49 4e 47 20 65 63 68 6f 28 74 36 29 3b USING echo(t6);
7e50: 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 .}..foreach {tn
7e60: 73 71 6c 20 72 65 73 20 66 69 6c 74 65 72 7d 20 sql res filter}
7e70: 7b 0a 20 20 31 2e 31 20 22 53 45 4c 45 43 54 20 {. 1.1 "SELECT
7e80: 61 20 46 52 4f 4d 20 65 36 20 57 48 45 52 45 20 a FROM e6 WHERE
7e90: 62 3e 27 4a 61 6d 65 73 27 22 20 7b 34 20 31 20 b>'James'" {4 1
7ea0: 35 7d 0a 20 20 20 20 7b 78 46 69 6c 74 65 72 20 5}. {xFilter
7eb0: 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a {SELECT rowid, *
7ec0: 20 46 52 4f 4d 20 27 74 36 27 20 57 48 45 52 45 FROM 't6' WHERE
7ed0: 20 62 20 3e 20 3f 7d 20 4a 61 6d 65 73 7d 0a 0a b > ?} James}..
7ee0: 20 20 31 2e 32 20 22 53 45 4c 45 43 54 20 61 20 1.2 "SELECT a
7ef0: 46 52 4f 4d 20 65 36 20 57 48 45 52 45 20 62 3e FROM e6 WHERE b>
7f00: 3d 27 4a 27 20 41 4e 44 20 62 3c 27 4b 27 22 20 ='J' AND b<'K'"
7f10: 7b 33 20 34 7d 0a 20 20 20 20 7b 78 46 69 6c 74 {3 4}. {xFilt
7f20: 65 72 20 7b 53 45 4c 45 43 54 20 72 6f 77 69 64 er {SELECT rowid
7f30: 2c 20 2a 20 46 52 4f 4d 20 27 74 36 27 20 57 48 , * FROM 't6' WH
7f40: 45 52 45 20 62 20 3e 3d 20 3f 20 41 4e 44 20 62 ERE b >= ? AND b
7f50: 20 3c 20 3f 7d 20 4a 20 4b 7d 0a 0a 20 20 31 2e < ?} J K}.. 1.
7f60: 33 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 3 "SELECT a FROM
7f70: 20 65 36 20 57 48 45 52 45 20 62 20 4c 49 4b 45 e6 WHERE b LIKE
7f80: 20 27 4a 25 27 22 20 7b 33 20 34 7d 0a 20 20 20 'J%'" {3 4}.
7f90: 20 7b 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 {xFilter {SELEC
7fa0: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 T rowid, * FROM
7fb0: 27 74 36 27 7d 7d 0a 0a 20 20 31 2e 34 20 22 53 't6'}}.. 1.4 "S
7fc0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 36 20 ELECT a FROM e6
7fd0: 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 6a 25 WHERE b LIKE 'j%
7fe0: 27 22 20 7b 33 20 34 7d 0a 20 20 20 20 7b 78 46 '" {3 4}. {xF
7ff0: 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 72 6f ilter {SELECT ro
8000: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 36 27 wid, * FROM 't6'
8010: 7d 7d 0a 7d 20 7b 0a 20 20 73 65 74 20 65 63 68 }}.} {. set ech
8020: 6f 5f 6d 6f 64 75 6c 65 20 7b 7d 0a 20 20 64 6f o_module {}. do
8030: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 38 _execsql_test 18
8040: 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24 72 65 73 .$tn.1 $sql $res
8050: 0a 20 20 64 6f 5f 74 65 73 74 20 20 20 20 20 20 . do_test
8060: 20 20 20 31 38 2e 24 74 6e 2e 32 20 7b 20 6c 72 18.$tn.2 { lr
8070: 61 6e 67 65 20 24 3a 3a 65 63 68 6f 5f 6d 6f 64 ange $::echo_mod
8080: 75 6c 65 20 32 20 65 6e 64 20 7d 20 24 66 69 6c ule 2 end } $fil
8090: 74 65 72 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 ter.}..do_execsq
80a0: 6c 5f 74 65 73 74 20 31 38 2e 32 2e 30 20 7b 20 l_test 18.2.0 {
80b0: 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e PRAGMA case_sen
80c0: 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 4f 4e sitive_like = ON
80d0: 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 }.foreach {tn s
80e0: 71 6c 20 72 65 73 20 66 69 6c 74 65 72 7d 20 7b ql res filter} {
80f0: 0a 20 20 32 2e 31 20 22 53 45 4c 45 43 54 20 61 . 2.1 "SELECT a
8100: 20 46 52 4f 4d 20 65 36 20 57 48 45 52 45 20 62 FROM e6 WHERE b
8110: 20 4c 49 4b 45 20 27 4a 25 27 22 20 7b 33 20 34 LIKE 'J%'" {3 4
8120: 7d 0a 20 20 20 20 7b 78 46 69 6c 74 65 72 20 7b }. {xFilter {
8130: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 SELECT rowid, *
8140: 46 52 4f 4d 20 27 74 36 27 7d 7d 0a 0a 20 20 32 FROM 't6'}}.. 2
8150: 2e 32 20 22 53 45 4c 45 43 54 20 61 20 46 52 4f .2 "SELECT a FRO
8160: 4d 20 65 36 20 57 48 45 52 45 20 62 20 4c 49 4b M e6 WHERE b LIK
8170: 45 20 27 6a 25 27 22 20 7b 7d 0a 20 20 20 20 7b E 'j%'" {}. {
8180: 78 46 69 6c 74 65 72 20 7b 53 45 4c 45 43 54 20 xFilter {SELECT
8190: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 27 74 rowid, * FROM 't
81a0: 36 27 7d 7d 0a 7d 20 7b 0a 20 20 73 65 74 20 65 6'}}.} {. set e
81b0: 63 68 6f 5f 6d 6f 64 75 6c 65 20 7b 7d 0a 20 20 cho_module {}.
81c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 do_execsql_test
81d0: 31 38 2e 24 74 6e 2e 31 20 24 73 71 6c 20 24 72 18.$tn.1 $sql $r
81e0: 65 73 0a 20 20 64 6f 5f 74 65 73 74 20 20 20 20 es. do_test
81f0: 20 20 20 20 20 31 38 2e 24 74 6e 2e 32 20 7b 20 18.$tn.2 {
8200: 6c 72 61 6e 67 65 20 24 3a 3a 65 63 68 6f 5f 6d lrange $::echo_m
8210: 6f 64 75 6c 65 20 32 20 65 6e 64 20 7d 20 24 66 odule 2 end } $f
8220: 69 6c 74 65 72 0a 7d 0a 64 6f 5f 65 78 65 63 73 ilter.}.do_execs
8230: 71 6c 5f 74 65 73 74 20 31 38 2e 32 2e 78 20 7b ql_test 18.2.x {
8240: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 PRAGMA case_se
8250: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 4f nsitive_like = O
8260: 46 46 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d FF }..#---------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82b0: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 .# Test that an
82c0: 65 78 69 73 74 69 6e 67 20 6d 6f 64 75 6c 65 20 existing module
82d0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 76 65 72 72 may not be overr
82e0: 69 64 64 65 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 idden..#.do_test
82f0: 20 31 39 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 19.1 {. sqlite
8300: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 3 db2 test.db.
8310: 72 65 67 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f register_echo_mo
8320: 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f dule [sqlite3_co
8330: 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 nnection_pointer
8340: 20 64 62 32 5d 0a 7d 20 53 51 4c 49 54 45 5f 4f db2].} SQLITE_O
8350: 4b 0a 64 6f 5f 74 65 73 74 20 31 39 2e 32 20 7b K.do_test 19.2 {
8360: 0a 20 20 72 65 67 69 73 74 65 72 5f 65 63 68 6f . register_echo
8370: 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69 74 65 33 _module [sqlite3
8380: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e _connection_poin
8390: 74 65 72 20 64 62 32 5d 0a 7d 20 53 51 4c 49 54 ter db2].} SQLIT
83a0: 45 5f 4d 49 53 55 53 45 0a 64 6f 5f 74 65 73 74 E_MISUSE.do_test
83b0: 20 31 39 2e 33 20 7b 0a 20 20 64 62 32 20 63 6c 19.3 {. db2 cl
83c0: 6f 73 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d ose.} {}..#-----
83d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8410: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 ----.# Test that
8420: 20 74 68 65 20 62 75 67 20 66 69 78 65 64 20 62 the bug fixed b
8430: 79 20 5b 62 30 63 31 62 61 36 35 35 64 36 39 5d y [b0c1ba655d69]
8440: 20 72 65 61 6c 6c 79 20 69 73 20 66 69 78 65 64 really is fixed
8450: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 ..#.do_execsql_t
8460: 65 73 74 20 32 30 2e 31 20 7b 0a 20 20 43 52 45 est 20.1 {. CRE
8470: 41 54 45 20 54 41 42 4c 45 20 74 37 20 28 61 2c ATE TABLE t7 (a,
8480: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 b);. CREATE TA
8490: 42 4c 45 20 74 38 20 28 63 2c 20 64 29 3b 0a 20 BLE t8 (c, d);.
84a0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 CREATE INDEX i2
84b0: 20 4f 4e 20 74 37 28 61 29 3b 0a 20 20 43 52 45 ON t7(a);. CRE
84c0: 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 ATE INDEX i3 ON
84d0: 74 37 28 62 29 3b 0a 20 20 43 52 45 41 54 45 20 t7(b);. CREATE
84e0: 49 4e 44 45 58 20 69 34 20 4f 4e 20 74 38 28 63 INDEX i4 ON t8(c
84f0: 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 );. CREATE INDE
8500: 58 20 69 35 20 4f 4e 20 74 38 28 64 29 3b 0a 0a X i5 ON t8(d);..
8510: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c CREATE VIRTUAL
8520: 20 54 41 42 4c 45 20 74 37 76 20 55 53 49 4e 47 TABLE t7v USING
8530: 20 65 63 68 6f 28 74 37 29 3b 0a 20 20 43 52 45 echo(t7);. CRE
8540: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c ATE VIRTUAL TABL
8550: 45 20 74 38 76 20 55 53 49 4e 47 20 65 63 68 6f E t8v USING echo
8560: 28 74 38 29 3b 0a 7d 0a 0a 64 6f 5f 74 65 73 74 (t8);.}..do_test
8570: 20 32 30 2e 32 20 7b 0a 20 20 66 6f 72 20 7b 73 20.2 {. for {s
8580: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 et i 0} {$i < 10
8590: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 00} {incr i} {.
85a0: 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53 45 db eval {INSE
85b0: 52 54 20 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 RT INTO t7 VALUE
85c0: 53 28 24 69 2c 20 24 69 29 7d 0a 20 20 20 20 64 S($i, $i)}. d
85d0: 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49 b eval {INSERT I
85e0: 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28 24 69 NTO t8 VALUES($i
85f0: 2c 20 24 69 29 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a , $i)}. }.} {}.
8600: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 .do_execsql_test
8610: 20 32 30 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20.3 {. SELECT
8620: 20 61 2c 20 62 20 46 52 4f 4d 20 28 0a 20 20 20 a, b FROM (.
8630: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 SELECT a, b F
8640: 52 4f 4d 20 74 37 20 57 48 45 52 45 20 61 3d 31 ROM t7 WHERE a=1
8650: 31 20 4f 52 20 62 3d 31 32 0a 20 20 20 20 20 20 1 OR b=12.
8660: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 UNION ALL.
8670: 53 45 4c 45 43 54 20 63 2c 20 64 20 46 52 4f 4d SELECT c, d FROM
8680: 20 74 38 20 57 48 45 52 45 20 63 3d 35 20 4f 52 t8 WHERE c=5 OR
8690: 20 64 3d 36 0a 20 20 29 0a 20 20 4f 52 44 45 52 d=6. ). ORDER
86a0: 20 42 59 20 31 2c 20 32 3b 0a 7d 20 7b 35 20 35 BY 1, 2;.} {5 5
86b0: 20 36 20 36 20 31 31 20 31 31 20 31 32 20 31 32 6 6 11 11 12 12
86c0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 }..do_execsql_te
86d0: 73 74 20 32 30 2e 34 20 7b 0a 20 20 53 45 4c 45 st 20.4 {. SELE
86e0: 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 28 0a 20 CT a, b FROM (.
86f0: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 SELECT a, b
8700: 20 46 52 4f 4d 20 74 37 76 20 57 48 45 52 45 20 FROM t7v WHERE
8710: 61 3d 31 31 20 4f 52 20 62 3d 31 32 0a 20 20 20 a=11 OR b=12.
8720: 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 UNION ALL.
8730: 20 20 20 53 45 4c 45 43 54 20 63 2c 20 64 20 46 SELECT c, d F
8740: 52 4f 4d 20 74 38 76 20 57 48 45 52 45 20 63 3d ROM t8v WHERE c=
8750: 35 20 4f 52 20 64 3d 36 0a 20 20 29 0a 20 20 4f 5 OR d=6. ). O
8760: 52 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 7d 20 RDER BY 1, 2;.}
8770: 7b 35 20 35 20 36 20 36 20 31 31 20 31 31 20 31 {5 5 6 6 11 11 1
8780: 32 20 31 32 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 2 12}..finish_te
8790: 73 74 0a st.