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. 84sqlite3_db_config db SQLITE_DBCONFIG_DQS_DML 1 85do_test ctime-1.4.1 { 86 catchsql { 87 SELECT sqlite_compileoption_used('SQLITE_THREADSAFE'); 88 } 89} {0 1} 90do_test ctime-1.4.2 { 91 catchsql { 92 SELECT sqlite_compileoption_used('THREADSAFE'); 93 } 94} {0 1} 95do_test ctime-1.4.3 { 96 catchsql { 97 SELECT sqlite_compileoption_used("THREADSAFE"); 98 } 99} {0 1} 100 101do_test ctime-1.5 { 102 set ans1 [ catchsql { 103 SELECT sqlite_compileoption_used('THREADSAFE=0'); 104 } ] 105 set ans2 [ catchsql { 106 SELECT sqlite_compileoption_used('THREADSAFE=1'); 107 } ] 108 set ans3 [ catchsql { 109 SELECT sqlite_compileoption_used('THREADSAFE=2'); 110 } ] 111 lsort [ list $ans1 $ans2 $ans3 ] 112} {{0 0} {0 0} {0 1}} 113 114do_test ctime-1.6 { 115 execsql { 116 SELECT sqlite_compileoption_used('THREADSAFE='); 117 } 118} {0} 119 120do_test ctime-1.7.1 { 121 execsql { 122 SELECT sqlite_compileoption_used('SQLITE_OMIT_COMPILEOPTION_DIAGS'); 123 } 124} {0} 125do_test ctime-1.7.2 { 126 execsql { 127 SELECT sqlite_compileoption_used('OMIT_COMPILEOPTION_DIAGS'); 128 } 129} {0} 130 131##################### 132# ctime-2.*: Test function support. 133 134do_test ctime-2.1.1 { 135 catchsql { 136 SELECT sqlite_compileoption_used(); 137 } 138} {1 {wrong number of arguments to function sqlite_compileoption_used()}} 139do_test ctime-2.1.2 { 140 catchsql { 141 SELECT sqlite_compileoption_used(NULL); 142 } 143} {0 {{}}} 144do_test ctime-2.1.3 { 145 catchsql { 146 SELECT sqlite_compileoption_used(""); 147 } 148} {0 0} 149do_test ctime-2.1.4 { 150 catchsql { 151 SELECT sqlite_compileoption_used(''); 152 } 153} {0 0} 154do_test ctime-2.1.5 { 155 catchsql { 156 SELECT sqlite_compileoption_used(foo); 157 } 158} {1 {no such column: foo}} 159do_test ctime-2.1.6 { 160 catchsql { 161 SELECT sqlite_compileoption_used('THREADSAFE', 0); 162 } 163} {1 {wrong number of arguments to function sqlite_compileoption_used()}} 164do_test ctime-2.1.7 { 165 catchsql { 166 SELECT sqlite_compileoption_used(0); 167 } 168} {0 0} 169do_test ctime-2.1.8 { 170 catchsql { 171 SELECT sqlite_compileoption_used('0'); 172 } 173} {0 0} 174do_test ctime-2.1.9 { 175 catchsql { 176 SELECT sqlite_compileoption_used(1.0); 177 } 178} {0 0} 179 180do_test ctime-2.2.1 { 181 catchsql { 182 SELECT sqlite_compileoption_get(); 183 } 184} {1 {wrong number of arguments to function sqlite_compileoption_get()}} 185do_test ctime-2.2.2 { 186 catchsql { 187 SELECT sqlite_compileoption_get(0, 0); 188 } 189} {1 {wrong number of arguments to function sqlite_compileoption_get()}} 190 191# This assumes there is at least 1 compile time option 192# (see SQLITE_THREADSAFE above). 193do_test ctime-2.3 { 194 catchsql { 195 SELECT sqlite_compileoption_used(sqlite_compileoption_get(0)); 196 } 197} {0 1} 198 199# This assumes there is at least 1 compile time option 200# (see SQLITE_THREADSAFE above). 201do_test ctime-2.4 { 202 set ans [ catchsql { 203 SELECT sqlite_compileoption_get(0); 204 } ] 205 list [lindex $ans 0] 206} {0} 207 208# Get the list of defines using the pragma, 209# then try querying each one with the functions. 210set ans [ catchsql { 211 PRAGMA compile_options; 212} ] 213set opts [ lindex $ans 1 ] 214set tc 1 215foreach opt $opts { 216 do_test ctime-2.5.$tc { 217 set N [ expr {$tc-1} ] 218 set ans1 [catch {db one { 219 SELECT sqlite_compileoption_get($N); 220 }} msg] 221 lappend ans1 $msg 222 set ans2 [ catchsql { 223 SELECT sqlite_compileoption_used($opt); 224 } ] 225 list [ lindex $ans1 0 ] [ expr { [lindex $ans1 1]==$opt } ] \ 226 [ expr { $ans2 } ] 227 } {0 1 {0 1}} 228 incr tc 1 229} 230# test 1 past array bounds 231do_test ctime-2.5.$tc { 232 set N [ expr {$tc-1} ] 233 set ans [ catchsql { 234 SELECT sqlite_compileoption_get($N); 235 } ] 236} {0 {{}}} 237incr tc 1 238# test 1 before array bounds (N=-1) 239do_test ctime-2.5.$tc { 240 set N -1 241 set ans [ catchsql { 242 SELECT sqlite_compileoption_get($N); 243 } ] 244} {0 {{}}} 245 246#-------------------------------------------------------------------------- 247# Test that SQLITE_DIRECT_OVERFLOW_READ is reflected in the output of 248# "PRAGMA compile_options". 249# 250ifcapable direct_read { 251 set res 1 252} else { 253 set res 0 254} 255do_test ctime-3.0.1 { 256 expr [lsearch [db eval {PRAGMA compile_options}] DIRECT_OVERFLOW_READ]>=0 257} $res 258 259finish_test 260