gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/vtabH.test (about) 1 # 2015 Nov 24 2 # 3 # The author disclaims copyright to this source code. In place of 4 # a legal notice, here is a blessing: 5 # 6 # May you do good and not evil. 7 # May you find forgiveness for yourself and forgive others. 8 # May you share freely, never taking more than you give. 9 # 10 #*********************************************************************** 11 # This file implements regression tests for SQLite library. Specifically, 12 # it tests that the GLOB, LIKE and REGEXP operators are correctly exposed 13 # to virtual table implementations. 14 # 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 set testprefix vtabH 19 20 ifcapable !vtab { 21 finish_test 22 return 23 } 24 25 register_echo_module db 26 27 do_execsql_test 1.0 { 28 CREATE TABLE t6(a, b TEXT); 29 CREATE INDEX i6 ON t6(b, a); 30 CREATE VIRTUAL TABLE e6 USING echo(t6); 31 } 32 33 ifcapable !icu { 34 foreach {tn sql expect} { 35 1 "SELECT * FROM e6 WHERE b LIKE '8abc'" { 36 xBestIndex 37 {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 38 xFilter 39 {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 40 8ABC 8abd 8abc 41 } 42 43 2 "SELECT * FROM e6 WHERE b GLOB '8abc'" { 44 xBestIndex 45 {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?} 46 xFilter 47 {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?} 48 8abc 8abd 8abc 49 } 50 3 "SELECT * FROM e6 WHERE b LIKE '8e/'" { 51 xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b like ?} 52 xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8e/ 53 } 54 4 "SELECT * FROM e6 WHERE b GLOB '8e/'" { 55 xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 56 xFilter {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 8e/ 57 } 58 } { 59 do_test 1.$tn { 60 set echo_module {} 61 execsql $sql 62 set ::echo_module 63 } [list {*}$expect] 64 } 65 } 66 67 68 #-------------------------------------------------------------------------- 69 70 register_tclvar_module db 71 set ::xyz 10 72 do_execsql_test 2.0 { 73 CREATE VIRTUAL TABLE vars USING tclvar; 74 SELECT name, arrayname, value FROM vars WHERE name = 'xyz'; 75 } {xyz {} 10} 76 77 set x1 aback 78 set x2 abaft 79 set x3 abandon 80 set x4 abandonint 81 set x5 babble 82 set x6 baboon 83 set x7 backbone 84 set x8 backarrow 85 set x9 castle 86 87 db func glob -argcount 2 gfunc 88 proc gfunc {a b} { 89 incr ::gfunc 90 return 1 91 } 92 93 db func like -argcount 2 lfunc 94 proc lfunc {a b} { 95 incr ::gfunc 100 96 return 1 97 } 98 99 db func regexp -argcount 2 rfunc 100 proc rfunc {a b} { 101 incr ::gfunc 10000 102 return 1 103 } 104 105 foreach ::tclvar_set_omit {0 1} { 106 foreach {tn expr res cnt} { 107 1 {value GLOB 'aban*'} {x3 abandon x4 abandonint} 2 108 2 {value LIKE '%ac%'} {x1 aback x7 backbone x8 backarrow} 300 109 3 {value REGEXP '^......$'} {x5 babble x6 baboon x9 castle} 30000 110 } { 111 db cache flush 112 set ::gfunc 0 113 if {$::tclvar_set_omit} {set cnt 0} 114 115 do_test 2.$tclvar_set_omit.$tn.1 { 116 execsql "SELECT name, value FROM vars WHERE name MATCH 'x*' AND $expr" 117 } $res 118 119 do_test 2.$tclvar_set_omit.$tn.2 { 120 set ::gfunc 121 } $cnt 122 } 123 } 124 125 #------------------------------------------------------------------------- 126 # 127 if {$tcl_platform(platform)=="windows"} { 128 set drive [string range [pwd] 0 1] 129 set ::env(fstreeDrive) $drive 130 } 131 if {$tcl_platform(platform)!="windows" || \ 132 [regexp -nocase -- {^[A-Z]:} $drive]} { 133 reset_db 134 register_fs_module db 135 do_execsql_test 3.0 { 136 SELECT name FROM fsdir WHERE dir = '.' AND name = 'test.db'; 137 SELECT name FROM fsdir WHERE dir = '.' AND name = '.' 138 } {test.db .} 139 140 proc sort_files { names {nocase false} } { 141 if {$nocase && $::tcl_platform(platform) eq "windows"} { 142 return [lsort -nocase $names] 143 } else { 144 return [lsort $names] 145 } 146 } 147 148 proc list_root_files {} { 149 if {$::tcl_platform(platform) eq "windows"} { 150 set res [list]; set dir $::env(fstreeDrive)/; set names [list] 151 eval lappend names [glob -nocomplain -directory $dir -- *] 152 foreach name $names { 153 if {[string index [file tail $name] 0] eq "."} continue 154 if {[file attributes $name -hidden]} continue 155 if {[file attributes $name -system]} continue 156 lappend res $name 157 } 158 return [sort_files $res true] 159 } else { 160 return [sort_files [string map {/ {}} [glob -nocomplain -- /*]]] 161 } 162 } 163 164 proc list_files { pattern } { 165 if {$::tcl_platform(platform) eq "windows"} { 166 set res [list]; set names [list] 167 eval lappend names [glob -nocomplain -- $pattern] 168 foreach name $names { 169 if {[string index [file tail $name] 0] eq "."} continue 170 if {[file attributes $name -hidden]} continue 171 if {[file attributes $name -system]} continue 172 lappend res $name 173 } 174 return [sort_files $res] 175 } else { 176 return [sort_files [glob -nocomplain -- $pattern]] 177 } 178 } 179 180 # Read the first 5 entries from the root directory. Except, ignore 181 # files that contain the "$" character in their names as these are 182 # special files on some Windows platforms. 183 # 184 set res [list] 185 set root_files [list_root_files] 186 foreach p $root_files { 187 if {$::tcl_platform(platform) eq "windows"} { 188 if {![regexp {\$} $p]} {lappend res $p} 189 } else { 190 lappend res "/$p" 191 } 192 } 193 set num_root_files [llength $root_files] 194 do_test 3.1 { 195 sort_files [execsql { 196 SELECT path FROM fstree WHERE path NOT GLOB '*\$*' LIMIT $num_root_files; 197 }] true 198 } [sort_files $res true] 199 200 # Read all entries in the current directory. 201 # 202 proc contents {pattern} { 203 set res [list] 204 foreach f [list_files $pattern] { 205 lappend res $f 206 if {[file isdir $f]} { 207 set res [concat $res [contents "$f/*"]] 208 } 209 } 210 set res 211 } 212 set pwd "[pwd]/*" 213 set res [contents $pwd] 214 do_execsql_test 3.2 { 215 SELECT path FROM fstree WHERE path GLOB $pwd ORDER BY 1 216 } [sort_files $res] 217 218 # Add some sub-directories and files to the current directory. 219 # 220 do_test 3.3 { 221 catch { file delete -force subdir } 222 foreach {path sz} { 223 subdir/x1.txt 143 224 subdir/x2.txt 153 225 } { 226 set dir [file dirname $path] 227 catch { file mkdir $dir } 228 set fd [open $path w] 229 puts -nonewline $fd [string repeat 1 $sz] 230 close $fd 231 } 232 } {} 233 234 set pwd [pwd] 235 if {![string match {*[_%]*} $pwd]} { 236 do_execsql_test 3.5 { 237 SELECT path, size FROM fstree 238 WHERE path GLOB $pwd || '/subdir/*' ORDER BY 1 239 } [list \ 240 "$pwd/subdir/x1.txt" 143 \ 241 "$pwd/subdir/x2.txt" 153 \ 242 ] 243 do_execsql_test 3.6 { 244 SELECT path, size FROM fstree 245 WHERE path LIKE $pwd || '/subdir/%' ORDER BY 1 246 } [list \ 247 "$pwd/subdir/x1.txt" 143 \ 248 "$pwd/subdir/x2.txt" 153 \ 249 ] 250 do_execsql_test 3.7 { 251 SELECT sum(size) FROM fstree WHERE path LIKE $pwd || '/subdir/%' 252 } 296 253 do_execsql_test 3.8 { 254 SELECT size FROM fstree WHERE path = $pwd || '/subdir/x1.txt' 255 } 143 256 } 257 258 } 259 260 261 finish_test