• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ** 2010 February 23
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    May you do good and not evil.
8 **    May you find forgiveness for yourself and forgive others.
9 **    May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 **
13 ** This file implements routines used to report what compile-time options
14 ** SQLite was built with.
15 */
16 
17 #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
18 
19 #include "sqliteInt.h"
20 
21 /*
22 ** An array of names of all compile-time options.  This array should
23 ** be sorted A-Z.
24 **
25 ** This array looks large, but in a typical installation actually uses
26 ** only a handful of compile-time options, so most times this array is usually
27 ** rather short and uses little memory space.
28 */
29 static const char * const azCompileOpt[] = {
30 
31 /* These macros are provided to "stringify" the value of the define
32 ** for those options in which the value is meaningful. */
33 #define CTIMEOPT_VAL_(opt) #opt
34 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
35 
36 #ifdef SQLITE_32BIT_ROWID
37   "32BIT_ROWID",
38 #endif
39 #ifdef SQLITE_4_BYTE_ALIGNED_MALLOC
40   "4_BYTE_ALIGNED_MALLOC",
41 #endif
42 #ifdef SQLITE_CASE_SENSITIVE_LIKE
43   "CASE_SENSITIVE_LIKE",
44 #endif
45 #ifdef SQLITE_CHECK_PAGES
46   "CHECK_PAGES",
47 #endif
48 #ifdef SQLITE_COVERAGE_TEST
49   "COVERAGE_TEST",
50 #endif
51 #ifdef SQLITE_DEBUG
52   "DEBUG",
53 #endif
54 #ifdef SQLITE_DEFAULT_LOCKING_MODE
55   "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE),
56 #endif
57 #ifdef SQLITE_DISABLE_DIRSYNC
58   "DISABLE_DIRSYNC",
59 #endif
60 #ifdef SQLITE_DISABLE_LFS
61   "DISABLE_LFS",
62 #endif
63 #ifdef SQLITE_ENABLE_ATOMIC_WRITE
64   "ENABLE_ATOMIC_WRITE",
65 #endif
66 #ifdef SQLITE_ENABLE_CEROD
67   "ENABLE_CEROD",
68 #endif
69 #ifdef SQLITE_ENABLE_COLUMN_METADATA
70   "ENABLE_COLUMN_METADATA",
71 #endif
72 #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
73   "ENABLE_EXPENSIVE_ASSERT",
74 #endif
75 #ifdef SQLITE_ENABLE_FTS1
76   "ENABLE_FTS1",
77 #endif
78 #ifdef SQLITE_ENABLE_FTS2
79   "ENABLE_FTS2",
80 #endif
81 #ifdef SQLITE_ENABLE_FTS3
82   "ENABLE_FTS3",
83 #endif
84 #ifdef SQLITE_ENABLE_FTS3_PARENTHESIS
85   "ENABLE_FTS3_PARENTHESIS",
86 #endif
87 #ifdef SQLITE_ENABLE_FTS4
88   "ENABLE_FTS4",
89 #endif
90 #ifdef SQLITE_ENABLE_ICU
91   "ENABLE_ICU",
92 #endif
93 #ifdef SQLITE_ENABLE_IOTRACE
94   "ENABLE_IOTRACE",
95 #endif
96 #ifdef SQLITE_ENABLE_LOAD_EXTENSION
97   "ENABLE_LOAD_EXTENSION",
98 #endif
99 #ifdef SQLITE_ENABLE_LOCKING_STYLE
100   "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE),
101 #endif
102 #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
103   "ENABLE_MEMORY_MANAGEMENT",
104 #endif
105 #ifdef SQLITE_ENABLE_MEMSYS3
106   "ENABLE_MEMSYS3",
107 #endif
108 #ifdef SQLITE_ENABLE_MEMSYS5
109   "ENABLE_MEMSYS5",
110 #endif
111 #ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK
112   "ENABLE_OVERSIZE_CELL_CHECK",
113 #endif
114 #ifdef SQLITE_ENABLE_RTREE
115   "ENABLE_RTREE",
116 #endif
117 #ifdef SQLITE_ENABLE_STAT2
118   "ENABLE_STAT2",
119 #endif
120 #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
121   "ENABLE_UNLOCK_NOTIFY",
122 #endif
123 #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
124   "ENABLE_UPDATE_DELETE_LIMIT",
125 #endif
126 #ifdef SQLITE_HAS_CODEC
127   "HAS_CODEC",
128 #endif
129 #ifdef SQLITE_HAVE_ISNAN
130   "HAVE_ISNAN",
131 #endif
132 #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
133   "HOMEGROWN_RECURSIVE_MUTEX",
134 #endif
135 #ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS
136   "IGNORE_AFP_LOCK_ERRORS",
137 #endif
138 #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
139   "IGNORE_FLOCK_LOCK_ERRORS",
140 #endif
141 #ifdef SQLITE_INT64_TYPE
142   "INT64_TYPE",
143 #endif
144 #ifdef SQLITE_LOCK_TRACE
145   "LOCK_TRACE",
146 #endif
147 #ifdef SQLITE_MEMDEBUG
148   "MEMDEBUG",
149 #endif
150 #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT
151   "MIXED_ENDIAN_64BIT_FLOAT",
152 #endif
153 #ifdef SQLITE_NO_SYNC
154   "NO_SYNC",
155 #endif
156 #ifdef SQLITE_OMIT_ALTERTABLE
157   "OMIT_ALTERTABLE",
158 #endif
159 #ifdef SQLITE_OMIT_ANALYZE
160   "OMIT_ANALYZE",
161 #endif
162 #ifdef SQLITE_OMIT_ATTACH
163   "OMIT_ATTACH",
164 #endif
165 #ifdef SQLITE_OMIT_AUTHORIZATION
166   "OMIT_AUTHORIZATION",
167 #endif
168 #ifdef SQLITE_OMIT_AUTOINCREMENT
169   "OMIT_AUTOINCREMENT",
170 #endif
171 #ifdef SQLITE_OMIT_AUTOINIT
172   "OMIT_AUTOINIT",
173 #endif
174 #ifdef SQLITE_OMIT_AUTOMATIC_INDEX
175   "OMIT_AUTOMATIC_INDEX",
176 #endif
177 #ifdef SQLITE_OMIT_AUTORESET
178   "OMIT_AUTORESET",
179 #endif
180 #ifdef SQLITE_OMIT_AUTOVACUUM
181   "OMIT_AUTOVACUUM",
182 #endif
183 #ifdef SQLITE_OMIT_BETWEEN_OPTIMIZATION
184   "OMIT_BETWEEN_OPTIMIZATION",
185 #endif
186 #ifdef SQLITE_OMIT_BLOB_LITERAL
187   "OMIT_BLOB_LITERAL",
188 #endif
189 #ifdef SQLITE_OMIT_BTREECOUNT
190   "OMIT_BTREECOUNT",
191 #endif
192 #ifdef SQLITE_OMIT_BUILTIN_TEST
193   "OMIT_BUILTIN_TEST",
194 #endif
195 #ifdef SQLITE_OMIT_CAST
196   "OMIT_CAST",
197 #endif
198 #ifdef SQLITE_OMIT_CHECK
199   "OMIT_CHECK",
200 #endif
201 /* // redundant
202 ** #ifdef SQLITE_OMIT_COMPILEOPTION_DIAGS
203 **   "OMIT_COMPILEOPTION_DIAGS",
204 ** #endif
205 */
206 #ifdef SQLITE_OMIT_COMPLETE
207   "OMIT_COMPLETE",
208 #endif
209 #ifdef SQLITE_OMIT_COMPOUND_SELECT
210   "OMIT_COMPOUND_SELECT",
211 #endif
212 #ifdef SQLITE_OMIT_DATETIME_FUNCS
213   "OMIT_DATETIME_FUNCS",
214 #endif
215 #ifdef SQLITE_OMIT_DECLTYPE
216   "OMIT_DECLTYPE",
217 #endif
218 #ifdef SQLITE_OMIT_DEPRECATED
219   "OMIT_DEPRECATED",
220 #endif
221 #ifdef SQLITE_OMIT_DISKIO
222   "OMIT_DISKIO",
223 #endif
224 #ifdef SQLITE_OMIT_EXPLAIN
225   "OMIT_EXPLAIN",
226 #endif
227 #ifdef SQLITE_OMIT_FLAG_PRAGMAS
228   "OMIT_FLAG_PRAGMAS",
229 #endif
230 #ifdef SQLITE_OMIT_FLOATING_POINT
231   "OMIT_FLOATING_POINT",
232 #endif
233 #ifdef SQLITE_OMIT_FOREIGN_KEY
234   "OMIT_FOREIGN_KEY",
235 #endif
236 #ifdef SQLITE_OMIT_GET_TABLE
237   "OMIT_GET_TABLE",
238 #endif
239 #ifdef SQLITE_OMIT_INCRBLOB
240   "OMIT_INCRBLOB",
241 #endif
242 #ifdef SQLITE_OMIT_INTEGRITY_CHECK
243   "OMIT_INTEGRITY_CHECK",
244 #endif
245 #ifdef SQLITE_OMIT_LIKE_OPTIMIZATION
246   "OMIT_LIKE_OPTIMIZATION",
247 #endif
248 #ifdef SQLITE_OMIT_LOAD_EXTENSION
249   "OMIT_LOAD_EXTENSION",
250 #endif
251 #ifdef SQLITE_OMIT_LOCALTIME
252   "OMIT_LOCALTIME",
253 #endif
254 #ifdef SQLITE_OMIT_LOOKASIDE
255   "OMIT_LOOKASIDE",
256 #endif
257 #ifdef SQLITE_OMIT_MEMORYDB
258   "OMIT_MEMORYDB",
259 #endif
260 #ifdef SQLITE_OMIT_OR_OPTIMIZATION
261   "OMIT_OR_OPTIMIZATION",
262 #endif
263 #ifdef SQLITE_OMIT_PAGER_PRAGMAS
264   "OMIT_PAGER_PRAGMAS",
265 #endif
266 #ifdef SQLITE_OMIT_PRAGMA
267   "OMIT_PRAGMA",
268 #endif
269 #ifdef SQLITE_OMIT_PROGRESS_CALLBACK
270   "OMIT_PROGRESS_CALLBACK",
271 #endif
272 #ifdef SQLITE_OMIT_QUICKBALANCE
273   "OMIT_QUICKBALANCE",
274 #endif
275 #ifdef SQLITE_OMIT_REINDEX
276   "OMIT_REINDEX",
277 #endif
278 #ifdef SQLITE_OMIT_SCHEMA_PRAGMAS
279   "OMIT_SCHEMA_PRAGMAS",
280 #endif
281 #ifdef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
282   "OMIT_SCHEMA_VERSION_PRAGMAS",
283 #endif
284 #ifdef SQLITE_OMIT_SHARED_CACHE
285   "OMIT_SHARED_CACHE",
286 #endif
287 #ifdef SQLITE_OMIT_SUBQUERY
288   "OMIT_SUBQUERY",
289 #endif
290 #ifdef SQLITE_OMIT_TCL_VARIABLE
291   "OMIT_TCL_VARIABLE",
292 #endif
293 #ifdef SQLITE_OMIT_TEMPDB
294   "OMIT_TEMPDB",
295 #endif
296 #ifdef SQLITE_OMIT_TRACE
297   "OMIT_TRACE",
298 #endif
299 #ifdef SQLITE_OMIT_TRIGGER
300   "OMIT_TRIGGER",
301 #endif
302 #ifdef SQLITE_OMIT_TRUNCATE_OPTIMIZATION
303   "OMIT_TRUNCATE_OPTIMIZATION",
304 #endif
305 #ifdef SQLITE_OMIT_UTF16
306   "OMIT_UTF16",
307 #endif
308 #ifdef SQLITE_OMIT_VACUUM
309   "OMIT_VACUUM",
310 #endif
311 #ifdef SQLITE_OMIT_VIEW
312   "OMIT_VIEW",
313 #endif
314 #ifdef SQLITE_OMIT_VIRTUALTABLE
315   "OMIT_VIRTUALTABLE",
316 #endif
317 #ifdef SQLITE_OMIT_WAL
318   "OMIT_WAL",
319 #endif
320 #ifdef SQLITE_OMIT_WSD
321   "OMIT_WSD",
322 #endif
323 #ifdef SQLITE_OMIT_XFER_OPT
324   "OMIT_XFER_OPT",
325 #endif
326 #ifdef SQLITE_PERFORMANCE_TRACE
327   "PERFORMANCE_TRACE",
328 #endif
329 #ifdef SQLITE_PROXY_DEBUG
330   "PROXY_DEBUG",
331 #endif
332 #ifdef SQLITE_SECURE_DELETE
333   "SECURE_DELETE",
334 #endif
335 #ifdef SQLITE_SMALL_STACK
336   "SMALL_STACK",
337 #endif
338 #ifdef SQLITE_SOUNDEX
339   "SOUNDEX",
340 #endif
341 #ifdef SQLITE_TCL
342   "TCL",
343 #endif
344 #ifdef SQLITE_TEMP_STORE
345   "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE),
346 #endif
347 #ifdef SQLITE_TEST
348   "TEST",
349 #endif
350 #ifdef SQLITE_THREADSAFE
351   "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE),
352 #endif
353 #ifdef SQLITE_USE_ALLOCA
354   "USE_ALLOCA",
355 #endif
356 #ifdef SQLITE_ZERO_MALLOC
357   "ZERO_MALLOC"
358 #endif
359 };
360 
361 /*
362 ** Given the name of a compile-time option, return true if that option
363 ** was used and false if not.
364 **
365 ** The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix
366 ** is not required for a match.
367 */
sqlite3_compileoption_used(const char * zOptName)368 int sqlite3_compileoption_used(const char *zOptName){
369   int i, n;
370   if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7;
371   n = sqlite3Strlen30(zOptName);
372 
373   /* Since ArraySize(azCompileOpt) is normally in single digits, a
374   ** linear search is adequate.  No need for a binary search. */
375   for(i=0; i<ArraySize(azCompileOpt); i++){
376     if(   (sqlite3StrNICmp(zOptName, azCompileOpt[i], n)==0)
377        && ( (azCompileOpt[i][n]==0) || (azCompileOpt[i][n]=='=') ) ) return 1;
378   }
379   return 0;
380 }
381 
382 /*
383 ** Return the N-th compile-time option string.  If N is out of range,
384 ** return a NULL pointer.
385 */
sqlite3_compileoption_get(int N)386 const char *sqlite3_compileoption_get(int N){
387   if( N>=0 && N<ArraySize(azCompileOpt) ){
388     return azCompileOpt[N];
389   }
390   return 0;
391 }
392 
393 #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
394