| Index: third_party/sqlite/sqlite-src-3100200/test/vtabH.test
|
| diff --git a/third_party/sqlite/sqlite-src-3100200/test/vtabH.test b/third_party/sqlite/sqlite-src-3100200/test/vtabH.test
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7bd542e05b0c7acc2458562981fa078b90bbfc5f
|
| --- /dev/null
|
| +++ b/third_party/sqlite/sqlite-src-3100200/test/vtabH.test
|
| @@ -0,0 +1,202 @@
|
| +# 2015 Nov 24
|
| +#
|
| +# The author disclaims copyright to this source code. In place of
|
| +# a legal notice, here is a blessing:
|
| +#
|
| +# May you do good and not evil.
|
| +# May you find forgiveness for yourself and forgive others.
|
| +# May you share freely, never taking more than you give.
|
| +#
|
| +#***********************************************************************
|
| +# This file implements regression tests for SQLite library. Specifically,
|
| +# it tests that the GLOB, LIKE and REGEXP operators are correctly exposed
|
| +# to virtual table implementations.
|
| +#
|
| +
|
| +set testdir [file dirname $argv0]
|
| +source $testdir/tester.tcl
|
| +set testprefix vtabH
|
| +
|
| +ifcapable !vtab {
|
| + finish_test
|
| + return
|
| +}
|
| +
|
| +register_echo_module db
|
| +
|
| +do_execsql_test 1.0 {
|
| + CREATE TABLE t6(a, b TEXT);
|
| + CREATE INDEX i6 ON t6(b, a);
|
| + CREATE VIRTUAL TABLE e6 USING echo(t6);
|
| +}
|
| +
|
| +foreach {tn sql expect} {
|
| + 1 "SELECT * FROM e6 WHERE b LIKE 'abc'" {
|
| + xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b like ?}
|
| + xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} abc
|
| + }
|
| +
|
| + 2 "SELECT * FROM e6 WHERE b GLOB 'abc'" {
|
| + xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b glob ?}
|
| + xFilter {SELECT rowid, a, b FROM 't6' WHERE b glob ?} abc
|
| + }
|
| +} {
|
| + do_test 1.$tn {
|
| + set echo_module {}
|
| + execsql $sql
|
| + set ::echo_module
|
| + } [list {*}$expect]
|
| +}
|
| +
|
| +
|
| +#--------------------------------------------------------------------------
|
| +
|
| +register_tclvar_module db
|
| +set ::xyz 10
|
| +do_execsql_test 2.0 {
|
| + CREATE VIRTUAL TABLE vars USING tclvar;
|
| + SELECT * FROM vars WHERE name = 'xyz';
|
| +} {xyz {} 10}
|
| +
|
| +set x1 aback
|
| +set x2 abaft
|
| +set x3 abandon
|
| +set x4 abandonint
|
| +set x5 babble
|
| +set x6 baboon
|
| +set x7 backbone
|
| +set x8 backarrow
|
| +set x9 castle
|
| +
|
| +db func glob gfunc
|
| +proc gfunc {a b} {
|
| + incr ::gfunc
|
| + return 1
|
| +}
|
| +
|
| +db func like lfunc
|
| +proc lfunc {a b} {
|
| + incr ::gfunc 100
|
| + return 1
|
| +}
|
| +
|
| +db func regexp rfunc
|
| +proc rfunc {a b} {
|
| + incr ::gfunc 10000
|
| + return 1
|
| +}
|
| +
|
| +foreach ::tclvar_set_omit {0 1} {
|
| + foreach {tn expr res cnt} {
|
| + 1 {value GLOB 'aban*'} {x3 abandon x4 abandonint} 2
|
| + 2 {value LIKE '%ac%'} {x1 aback x7 backbone x8 backarrow} 300
|
| + 3 {value REGEXP '^......$'} {x5 babble x6 baboon x9 castle} 30000
|
| + } {
|
| + db cache flush
|
| + set ::gfunc 0
|
| + if {$::tclvar_set_omit} {set cnt 0}
|
| +
|
| + do_test 2.$tclvar_set_omit.$tn.1 {
|
| + execsql "SELECT name, value FROM vars WHERE name MATCH 'x*' AND $expr"
|
| + } $res
|
| +
|
| + do_test 2.$tclvar_set_omit.$tn.2 {
|
| + set ::gfunc
|
| + } $cnt
|
| + }
|
| +}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +#
|
| +if {1} {
|
| + reset_db
|
| + register_fs_module db
|
| + do_execsql_test 3.0 {
|
| + SELECT name FROM fsdir WHERE dir = '.' AND name = 'test.db';
|
| + SELECT name FROM fsdir WHERE dir = '.' AND name = '.'
|
| + } {test.db .}
|
| +
|
| + proc list_root_files {} {
|
| + if {$::tcl_platform(platform) eq "windows"} {
|
| + set res [list]
|
| + foreach name [glob -directory $::env(SystemDrive)/ -- *] {
|
| + if {[string index [file tail $name] 0] eq "."} continue
|
| + lappend res $name
|
| + }
|
| + return $res
|
| + } else {
|
| + return [string map {/ {}} [glob /*]]
|
| + }
|
| + }
|
| +
|
| + proc list_files { pattern } {
|
| + if {$::tcl_platform(platform) eq "windows"} {
|
| + set res [list]
|
| + foreach name [glob -nocomplain $pattern] {
|
| + if {[string index [file tail $name] 0] eq "."} continue
|
| + lappend res $name
|
| + }
|
| + return $res
|
| + } else {
|
| + return [glob -nocomplain $pattern]
|
| + }
|
| + }
|
| +
|
| + # Read all entries in the current directory.
|
| + #
|
| + proc contents {pattern} {
|
| + set res [list]
|
| + foreach f [list_files $pattern] {
|
| + lappend res $f
|
| + if {[file isdir $f]} {
|
| + set res [concat $res [contents "$f/*"]]
|
| + }
|
| + }
|
| + set res
|
| + }
|
| + set pwd "[pwd]/*"
|
| + set res [contents $pwd]
|
| + do_execsql_test 3.2 {
|
| + SELECT path FROM fstree WHERE path GLOB $pwd ORDER BY 1
|
| + } [lsort $res]
|
| +
|
| + # Add some sub-directories and files to the current directory.
|
| + #
|
| + do_test 3.3 {
|
| + catch { file delete -force subdir }
|
| + foreach {path sz} {
|
| + subdir/x1.txt 143
|
| + subdir/x2.txt 153
|
| + } {
|
| + set dir [file dirname $path]
|
| + catch { file mkdir $dir }
|
| + set fd [open $path w]
|
| + puts -nonewline $fd [string repeat 1 $sz]
|
| + close $fd
|
| + }
|
| + } {}
|
| +
|
| + set pwd [pwd]
|
| + do_execsql_test 3.5 {
|
| + SELECT path, size FROM fstree WHERE path GLOB $pwd || '/subdir/*' ORDER BY 1
|
| + } [list \
|
| + "$pwd/subdir/x1.txt" 143 \
|
| + "$pwd/subdir/x2.txt" 153 \
|
| + ]
|
| + do_execsql_test 3.6 {
|
| + SELECT path, size FROM fstree WHERE path LIKE $pwd || '/subdir/%' ORDER BY 1
|
| + } [list \
|
| + "$pwd/subdir/x1.txt" 143 \
|
| + "$pwd/subdir/x2.txt" 153 \
|
| + ]
|
| + do_execsql_test 3.7 {
|
| + SELECT sum(size) FROM fstree WHERE path LIKE $pwd || '/subdir/%'
|
| + } 296
|
| + do_execsql_test 3.8 {
|
| + SELECT size FROM fstree WHERE path = $pwd || '/subdir/x1.txt'
|
| + } 143
|
| +
|
| +}
|
| +
|
| +
|
| +finish_test
|
|
|