modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/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 foreach {tn sql expect} { 34 1 "SELECT * FROM e6 WHERE b LIKE '8abc'" { 35 xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b like ?} 36 xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8abc 37 } 38 39 2 "SELECT * FROM e6 WHERE b GLOB '8abc'" { 40 xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 41 xFilter {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 8abc 42 } 43 } { 44 do_test 1.$tn { 45 set echo_module {} 46 execsql $sql 47 set ::echo_module 48 } [list {*}$expect] 49 } 50 51 52 #-------------------------------------------------------------------------- 53 54 register_tclvar_module db 55 set ::xyz 10 56 do_execsql_test 2.0 { 57 CREATE VIRTUAL TABLE vars USING tclvar; 58 SELECT name, arrayname, value FROM vars WHERE name = 'xyz'; 59 } {xyz {} 10} 60 61 set x1 aback 62 set x2 abaft 63 set x3 abandon 64 set x4 abandonint 65 set x5 babble 66 set x6 baboon 67 set x7 backbone 68 set x8 backarrow 69 set x9 castle 70 71 db func glob -argcount 2 gfunc 72 proc gfunc {a b} { 73 incr ::gfunc 74 return 1 75 } 76 77 db func like -argcount 2 lfunc 78 proc lfunc {a b} { 79 incr ::gfunc 100 80 return 1 81 } 82 83 db func regexp -argcount 2 rfunc 84 proc rfunc {a b} { 85 incr ::gfunc 10000 86 return 1 87 } 88 89 foreach ::tclvar_set_omit {0 1} { 90 foreach {tn expr res cnt} { 91 1 {value GLOB 'aban*'} {x3 abandon x4 abandonint} 2 92 2 {value LIKE '%ac%'} {x1 aback x7 backbone x8 backarrow} 300 93 3 {value REGEXP '^......$'} {x5 babble x6 baboon x9 castle} 30000 94 } { 95 db cache flush 96 set ::gfunc 0 97 if {$::tclvar_set_omit} {set cnt 0} 98 99 do_test 2.$tclvar_set_omit.$tn.1 { 100 execsql "SELECT name, value FROM vars WHERE name MATCH 'x*' AND $expr" 101 } $res 102 103 do_test 2.$tclvar_set_omit.$tn.2 { 104 set ::gfunc 105 } $cnt 106 } 107 } 108 109 #------------------------------------------------------------------------- 110 # 111 if {$tcl_platform(platform)=="windows"} { 112 set drive [string range [pwd] 0 1] 113 set ::env(fstreeDrive) $drive 114 } 115 if {$tcl_platform(platform)!="windows" || \ 116 [regexp -nocase -- {^[A-Z]:} $drive]} { 117 reset_db 118 register_fs_module db 119 do_execsql_test 3.0 { 120 SELECT name FROM fsdir WHERE dir = '.' AND name = 'test.db'; 121 SELECT name FROM fsdir WHERE dir = '.' AND name = '.' 122 } {test.db .} 123 124 proc sort_files { names {nocase false} } { 125 if {$nocase && $::tcl_platform(platform) eq "windows"} { 126 return [lsort -nocase $names] 127 } else { 128 return [lsort $names] 129 } 130 } 131 132 proc list_root_files {} { 133 if {$::tcl_platform(platform) eq "windows"} { 134 set res [list]; set dir $::env(fstreeDrive)/; set names [list] 135 eval lappend names [glob -nocomplain -directory $dir -- *] 136 foreach name $names { 137 if {[string index [file tail $name] 0] eq "."} continue 138 if {[file attributes $name -hidden]} continue 139 if {[file attributes $name -system]} continue 140 lappend res $name 141 } 142 return [sort_files $res true] 143 } else { 144 return [sort_files [string map {/ {}} [glob -nocomplain -- /*]]] 145 } 146 } 147 148 proc list_files { pattern } { 149 if {$::tcl_platform(platform) eq "windows"} { 150 set res [list]; set names [list] 151 eval lappend names [glob -nocomplain -- $pattern] 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] 159 } else { 160 return [sort_files [glob -nocomplain -- $pattern]] 161 } 162 } 163 164 # Read the first 5 entries from the root directory. Except, ignore 165 # files that contain the "$" character in their names as these are 166 # special files on some Windows platforms. 167 # 168 set res [list] 169 set root_files [list_root_files] 170 foreach p $root_files { 171 if {$::tcl_platform(platform) eq "windows"} { 172 if {![regexp {\$} $p]} {lappend res $p} 173 } else { 174 lappend res "/$p" 175 } 176 } 177 set num_root_files [llength $root_files] 178 do_test 3.1 { 179 sort_files [execsql { 180 SELECT path FROM fstree WHERE path NOT GLOB '*\$*' LIMIT $num_root_files; 181 }] true 182 } [sort_files $res true] 183 184 # Read all entries in the current directory. 185 # 186 proc contents {pattern} { 187 set res [list] 188 foreach f [list_files $pattern] { 189 lappend res $f 190 if {[file isdir $f]} { 191 set res [concat $res [contents "$f/*"]] 192 } 193 } 194 set res 195 } 196 set pwd "[pwd]/*" 197 set res [contents $pwd] 198 do_execsql_test 3.2 { 199 SELECT path FROM fstree WHERE path GLOB $pwd ORDER BY 1 200 } [sort_files $res] 201 202 # Add some sub-directories and files to the current directory. 203 # 204 do_test 3.3 { 205 catch { file delete -force subdir } 206 foreach {path sz} { 207 subdir/x1.txt 143 208 subdir/x2.txt 153 209 } { 210 set dir [file dirname $path] 211 catch { file mkdir $dir } 212 set fd [open $path w] 213 puts -nonewline $fd [string repeat 1 $sz] 214 close $fd 215 } 216 } {} 217 218 set pwd [pwd] 219 if {![string match {*[_%]*} $pwd]} { 220 do_execsql_test 3.5 { 221 SELECT path, size FROM fstree 222 WHERE path GLOB $pwd || '/subdir/*' ORDER BY 1 223 } [list \ 224 "$pwd/subdir/x1.txt" 143 \ 225 "$pwd/subdir/x2.txt" 153 \ 226 ] 227 do_execsql_test 3.6 { 228 SELECT path, size FROM fstree 229 WHERE path LIKE $pwd || '/subdir/%' ORDER BY 1 230 } [list \ 231 "$pwd/subdir/x1.txt" 143 \ 232 "$pwd/subdir/x2.txt" 153 \ 233 ] 234 do_execsql_test 3.7 { 235 SELECT sum(size) FROM fstree WHERE path LIKE $pwd || '/subdir/%' 236 } 296 237 do_execsql_test 3.8 { 238 SELECT size FROM fstree WHERE path = $pwd || '/subdir/x1.txt' 239 } 143 240 } 241 242 } 243 244 245 finish_test