blob: 1f07c1a947123ed580883ed96670361fac99f83e [file] [log] [blame]
shaneh915c8bd2010-02-24 19:36:10 +00001# 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
danda1f49b2017-06-16 19:51:47 +000064# 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
dan814aad62017-06-17 17:29:24 +000082# SQLITE_THREADSAFE should pretty much always be defined
83# one way or the other, and it must have a value of 0 or 1.
shaneh915c8bd2010-02-24 19:36:10 +000084do_test ctime-1.4.1 {
dan814aad62017-06-17 17:29:24 +000085 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 {
shaneh915c8bd2010-02-24 19:36:10 +0000120 execsql {
drh8bb76d32010-02-26 16:37:47 +0000121 SELECT sqlite_compileoption_used('SQLITE_OMIT_COMPILEOPTION_DIAGS');
shaneh915c8bd2010-02-24 19:36:10 +0000122 }
123} {0}
dan814aad62017-06-17 17:29:24 +0000124do_test ctime-1.7.2 {
shaneh915c8bd2010-02-24 19:36:10 +0000125 execsql {
drh8bb76d32010-02-26 16:37:47 +0000126 SELECT sqlite_compileoption_used('OMIT_COMPILEOPTION_DIAGS');
shaneh915c8bd2010-02-24 19:36:10 +0000127 }
128} {0}
129
130#####################
131# ctime-2.*: Test function support.
132
133do_test ctime-2.1.1 {
134 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000135 SELECT sqlite_compileoption_used();
shaneh915c8bd2010-02-24 19:36:10 +0000136 }
drh8bb76d32010-02-26 16:37:47 +0000137} {1 {wrong number of arguments to function sqlite_compileoption_used()}}
shaneh915c8bd2010-02-24 19:36:10 +0000138do_test ctime-2.1.2 {
139 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000140 SELECT sqlite_compileoption_used(NULL);
shaneh915c8bd2010-02-24 19:36:10 +0000141 }
142} {0 {{}}}
143do_test ctime-2.1.3 {
144 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000145 SELECT sqlite_compileoption_used("");
shaneh915c8bd2010-02-24 19:36:10 +0000146 }
147} {0 0}
148do_test ctime-2.1.4 {
149 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000150 SELECT sqlite_compileoption_used('');
shaneh915c8bd2010-02-24 19:36:10 +0000151 }
152} {0 0}
153do_test ctime-2.1.5 {
154 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000155 SELECT sqlite_compileoption_used(foo);
shaneh915c8bd2010-02-24 19:36:10 +0000156 }
157} {1 {no such column: foo}}
158do_test ctime-2.1.6 {
159 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000160 SELECT sqlite_compileoption_used('THREADSAFE', 0);
shaneh915c8bd2010-02-24 19:36:10 +0000161 }
drh8bb76d32010-02-26 16:37:47 +0000162} {1 {wrong number of arguments to function sqlite_compileoption_used()}}
shaneh88ba6182010-02-25 18:07:59 +0000163do_test ctime-2.1.7 {
164 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000165 SELECT sqlite_compileoption_used(0);
shaneh88ba6182010-02-25 18:07:59 +0000166 }
167} {0 0}
168do_test ctime-2.1.8 {
169 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000170 SELECT sqlite_compileoption_used('0');
shaneh88ba6182010-02-25 18:07:59 +0000171 }
172} {0 0}
173do_test ctime-2.1.9 {
174 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000175 SELECT sqlite_compileoption_used(1.0);
shaneh88ba6182010-02-25 18:07:59 +0000176 }
177} {0 0}
shaneh915c8bd2010-02-24 19:36:10 +0000178
179do_test ctime-2.2.1 {
180 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000181 SELECT sqlite_compileoption_get();
shaneh915c8bd2010-02-24 19:36:10 +0000182 }
drh8bb76d32010-02-26 16:37:47 +0000183} {1 {wrong number of arguments to function sqlite_compileoption_get()}}
shaneh915c8bd2010-02-24 19:36:10 +0000184do_test ctime-2.2.2 {
185 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000186 SELECT sqlite_compileoption_get(0, 0);
shaneh915c8bd2010-02-24 19:36:10 +0000187 }
drh8bb76d32010-02-26 16:37:47 +0000188} {1 {wrong number of arguments to function sqlite_compileoption_get()}}
shaneh915c8bd2010-02-24 19:36:10 +0000189
190# This assumes there is at least 1 compile time option
191# (see SQLITE_THREADSAFE above).
192do_test ctime-2.3 {
193 catchsql {
drh8bb76d32010-02-26 16:37:47 +0000194 SELECT sqlite_compileoption_used(sqlite_compileoption_get(0));
shaneh915c8bd2010-02-24 19:36:10 +0000195 }
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 {
shaneh88ba6182010-02-25 18:07:59 +0000201 set ans [ catchsql {
drh8bb76d32010-02-26 16:37:47 +0000202 SELECT sqlite_compileoption_get(0);
shaneh915c8bd2010-02-24 19:36:10 +0000203 } ]
shaneh88ba6182010-02-25 18:07:59 +0000204 list [lindex $ans 0]
shaneh915c8bd2010-02-24 19:36:10 +0000205} {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} ]
drhf5fe0032016-06-24 06:23:13 +0000217 set ans1 [catch {db one {
drh8bb76d32010-02-26 16:37:47 +0000218 SELECT sqlite_compileoption_get($N);
drhf5fe0032016-06-24 06:23:13 +0000219 }} msg]
220 lappend ans1 $msg
shaneh915c8bd2010-02-24 19:36:10 +0000221 set ans2 [ catchsql {
drh8bb76d32010-02-26 16:37:47 +0000222 SELECT sqlite_compileoption_used($opt);
shaneh915c8bd2010-02-24 19:36:10 +0000223 } ]
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 {
drh8bb76d32010-02-26 16:37:47 +0000233 SELECT sqlite_compileoption_get($N);
shaneh915c8bd2010-02-24 19:36:10 +0000234 } ]
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 {
drh8bb76d32010-02-26 16:37:47 +0000241 SELECT sqlite_compileoption_get($N);
shaneh915c8bd2010-02-24 19:36:10 +0000242 } ]
243} {0 {{}}}
244
danceb97c12016-10-21 10:09:22 +0000245#--------------------------------------------------------------------------
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
shaneh915c8bd2010-02-24 19:36:10 +0000257
258finish_test