xref: /sqlite-3.40.0/test/ctime.test (revision b80bb6ce)
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