1# 2009 February 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. 12# 13# This file implements tests for the compile time diagnostic 14# functions. 15# 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20# Test organization: 21# 22# ctime-1.*: Test pragma support. 23# ctime-2.*: Test function support. 24# 25 26ifcapable !pragma||!compileoption_diags { 27 finish_test 28 return 29} 30 31##################### 32# ctime-1.*: Test pragma support. 33 34do_test ctime-1.1.1 { 35 catchsql { 36 PRAGMA compile_options(); 37 } 38} {1 {near ")": syntax error}} 39do_test ctime-1.1.2 { 40 catchsql { 41 PRAGMA compile_options(NULL); 42 } 43} {1 {near "NULL": syntax error}} 44do_test ctime-1.1.3 { 45 catchsql { 46 PRAGMA compile_options *; 47 } 48} {1 {near "*": syntax error}} 49 50do_test ctime-1.2.1 { 51 set ans [ catchsql { 52 PRAGMA compile_options; 53 } ] 54 list [ lindex $ans 0 ] 55} {0} 56# the results should be in sorted order already 57do_test ctime-1.2.2 { 58 set ans [ catchsql { 59 PRAGMA compile_options; 60 } ] 61 list [ lindex $ans 0 ] [ expr { [lsort [lindex $ans 1]]==[lindex $ans 1] } ] 62} {0 1} 63 64# Check the THREADSAFE option for SQLITE_THREADSAFE=2 builds (there are 65# a couple of these configurations in releasetest.tcl). 66# 67ifcapable threadsafe2 { 68 foreach {tn opt res} { 69 1 SQLITE_THREADSAFE 1 70 2 THREADSAFE 1 71 3 THREADSAFE=0 0 72 4 THREADSAFE=1 0 73 5 THREADSAFE=2 1 74 6 THREADSAFE= 0 75 } { 76 do_execsql_test ctime-1.3.$tn { 77 SELECT sqlite_compileoption_used($opt) 78 } $res 79 } 80} 81 82# SQLITE_THREADSAFE should pretty much always be defined 83# one way or the other, and it must have a value of 0 or 1. 84do_test ctime-1.4.1 { 85 catchsql { 86 SELECT sqlite_compileoption_used('SQLITE_THREADSAFE'); 87 } 88} {0 1} 89do_test ctime-1.4.2 { 90 catchsql { 91 SELECT sqlite_compileoption_used('THREADSAFE'); 92 } 93} {0 1} 94do_test ctime-1.4.3 { 95 catchsql { 96 SELECT sqlite_compileoption_used("THREADSAFE"); 97 } 98} {0 1} 99 100do_test ctime-1.5 { 101 set ans1 [ catchsql { 102 SELECT sqlite_compileoption_used('THREADSAFE=0'); 103 } ] 104 set ans2 [ catchsql { 105 SELECT sqlite_compileoption_used('THREADSAFE=1'); 106 } ] 107 set ans3 [ catchsql { 108 SELECT sqlite_compileoption_used('THREADSAFE=2'); 109 } ] 110 lsort [ list $ans1 $ans2 $ans3 ] 111} {{0 0} {0 0} {0 1}} 112 113do_test ctime-1.6 { 114 execsql { 115 SELECT sqlite_compileoption_used('THREADSAFE='); 116 } 117} {0} 118 119do_test ctime-1.7.1 { 120 execsql { 121 SELECT sqlite_compileoption_used('SQLITE_OMIT_COMPILEOPTION_DIAGS'); 122 } 123} {0} 124do_test ctime-1.7.2 { 125 execsql { 126 SELECT sqlite_compileoption_used('OMIT_COMPILEOPTION_DIAGS'); 127 } 128} {0} 129 130##################### 131# ctime-2.*: Test function support. 132 133do_test ctime-2.1.1 { 134 catchsql { 135 SELECT sqlite_compileoption_used(); 136 } 137} {1 {wrong number of arguments to function sqlite_compileoption_used()}} 138do_test ctime-2.1.2 { 139 catchsql { 140 SELECT sqlite_compileoption_used(NULL); 141 } 142} {0 {{}}} 143do_test ctime-2.1.3 { 144 catchsql { 145 SELECT sqlite_compileoption_used(""); 146 } 147} {0 0} 148do_test ctime-2.1.4 { 149 catchsql { 150 SELECT sqlite_compileoption_used(''); 151 } 152} {0 0} 153do_test ctime-2.1.5 { 154 catchsql { 155 SELECT sqlite_compileoption_used(foo); 156 } 157} {1 {no such column: foo}} 158do_test ctime-2.1.6 { 159 catchsql { 160 SELECT sqlite_compileoption_used('THREADSAFE', 0); 161 } 162} {1 {wrong number of arguments to function sqlite_compileoption_used()}} 163do_test ctime-2.1.7 { 164 catchsql { 165 SELECT sqlite_compileoption_used(0); 166 } 167} {0 0} 168do_test ctime-2.1.8 { 169 catchsql { 170 SELECT sqlite_compileoption_used('0'); 171 } 172} {0 0} 173do_test ctime-2.1.9 { 174 catchsql { 175 SELECT sqlite_compileoption_used(1.0); 176 } 177} {0 0} 178 179do_test ctime-2.2.1 { 180 catchsql { 181 SELECT sqlite_compileoption_get(); 182 } 183} {1 {wrong number of arguments to function sqlite_compileoption_get()}} 184do_test ctime-2.2.2 { 185 catchsql { 186 SELECT sqlite_compileoption_get(0, 0); 187 } 188} {1 {wrong number of arguments to function sqlite_compileoption_get()}} 189 190# This assumes there is at least 1 compile time option 191# (see SQLITE_THREADSAFE above). 192do_test ctime-2.3 { 193 catchsql { 194 SELECT sqlite_compileoption_used(sqlite_compileoption_get(0)); 195 } 196} {0 1} 197 198# This assumes there is at least 1 compile time option 199# (see SQLITE_THREADSAFE above). 200do_test ctime-2.4 { 201 set ans [ catchsql { 202 SELECT sqlite_compileoption_get(0); 203 } ] 204 list [lindex $ans 0] 205} {0} 206 207# Get the list of defines using the pragma, 208# then try querying each one with the functions. 209set ans [ catchsql { 210 PRAGMA compile_options; 211} ] 212set opts [ lindex $ans 1 ] 213set tc 1 214foreach opt $opts { 215 do_test ctime-2.5.$tc { 216 set N [ expr {$tc-1} ] 217 set ans1 [catch {db one { 218 SELECT sqlite_compileoption_get($N); 219 }} msg] 220 lappend ans1 $msg 221 set ans2 [ catchsql { 222 SELECT sqlite_compileoption_used($opt); 223 } ] 224 list [ lindex $ans1 0 ] [ expr { [lindex $ans1 1]==$opt } ] \ 225 [ expr { $ans2 } ] 226 } {0 1 {0 1}} 227 incr tc 1 228} 229# test 1 past array bounds 230do_test ctime-2.5.$tc { 231 set N [ expr {$tc-1} ] 232 set ans [ catchsql { 233 SELECT sqlite_compileoption_get($N); 234 } ] 235} {0 {{}}} 236incr tc 1 237# test 1 before array bounds (N=-1) 238do_test ctime-2.5.$tc { 239 set N -1 240 set ans [ catchsql { 241 SELECT sqlite_compileoption_get($N); 242 } ] 243} {0 {{}}} 244 245#-------------------------------------------------------------------------- 246# Test that SQLITE_DIRECT_OVERFLOW_READ is reflected in the output of 247# "PRAGMA compile_options". 248# 249ifcapable direct_read { 250 set res 1 251} else { 252 set res 0 253} 254do_test ctime-3.0.1 { 255 expr [lsearch [db eval {PRAGMA compile_options}] DIRECT_OVERFLOW_READ]>=0 256} $res 257 258finish_test 259