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*/
29static 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*/
368int 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*/
386const 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