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 #if defined(SQLITE_DEFAULT_MMAP_SIZE) && !defined(SQLITE_DEFAULT_MMAP_SIZE_xc) 58 "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE), 59 #endif 60 #ifdef SQLITE_DISABLE_DIRSYNC 61 "DISABLE_DIRSYNC", 62 #endif 63 #ifdef SQLITE_DISABLE_LFS 64 "DISABLE_LFS", 65 #endif 66 #ifdef SQLITE_ENABLE_ATOMIC_WRITE 67 "ENABLE_ATOMIC_WRITE", 68 #endif 69 #ifdef SQLITE_ENABLE_CEROD 70 "ENABLE_CEROD", 71 #endif 72 #ifdef SQLITE_ENABLE_COLUMN_METADATA 73 "ENABLE_COLUMN_METADATA", 74 #endif 75 #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT 76 "ENABLE_EXPENSIVE_ASSERT", 77 #endif 78 #ifdef SQLITE_ENABLE_FTS1 79 "ENABLE_FTS1", 80 #endif 81 #ifdef SQLITE_ENABLE_FTS2 82 "ENABLE_FTS2", 83 #endif 84 #ifdef SQLITE_ENABLE_FTS3 85 "ENABLE_FTS3", 86 #endif 87 #ifdef SQLITE_ENABLE_FTS3_PARENTHESIS 88 "ENABLE_FTS3_PARENTHESIS", 89 #endif 90 #ifdef SQLITE_ENABLE_FTS4 91 "ENABLE_FTS4", 92 #endif 93 #ifdef SQLITE_ENABLE_ICU 94 "ENABLE_ICU", 95 #endif 96 #ifdef SQLITE_ENABLE_IOTRACE 97 "ENABLE_IOTRACE", 98 #endif 99 #ifdef SQLITE_ENABLE_LOAD_EXTENSION 100 "ENABLE_LOAD_EXTENSION", 101 #endif 102 #ifdef SQLITE_ENABLE_LOCKING_STYLE 103 "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), 104 #endif 105 #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT 106 "ENABLE_MEMORY_MANAGEMENT", 107 #endif 108 #ifdef SQLITE_ENABLE_MEMSYS3 109 "ENABLE_MEMSYS3", 110 #endif 111 #ifdef SQLITE_ENABLE_MEMSYS5 112 "ENABLE_MEMSYS5", 113 #endif 114 #ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK 115 "ENABLE_OVERSIZE_CELL_CHECK", 116 #endif 117 #ifdef SQLITE_ENABLE_RTREE 118 "ENABLE_RTREE", 119 #endif 120 #ifdef SQLITE_ENABLE_STAT3 121 "ENABLE_STAT3", 122 #endif 123 #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY 124 "ENABLE_UNLOCK_NOTIFY", 125 #endif 126 #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 127 "ENABLE_UPDATE_DELETE_LIMIT", 128 #endif 129 #ifdef SQLITE_HAS_CODEC 130 "HAS_CODEC", 131 #endif 132 #ifdef SQLITE_HAVE_ISNAN 133 "HAVE_ISNAN", 134 #endif 135 #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX 136 "HOMEGROWN_RECURSIVE_MUTEX", 137 #endif 138 #ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS 139 "IGNORE_AFP_LOCK_ERRORS", 140 #endif 141 #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS 142 "IGNORE_FLOCK_LOCK_ERRORS", 143 #endif 144 #ifdef SQLITE_INT64_TYPE 145 "INT64_TYPE", 146 #endif 147 #ifdef SQLITE_LOCK_TRACE 148 "LOCK_TRACE", 149 #endif 150 #if defined(SQLITE_MAX_MMAP_SIZE) && !defined(SQLITE_MAX_MMAP_SIZE_xc) 151 "MAX_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE), 152 #endif 153 #ifdef SQLITE_MAX_SCHEMA_RETRY 154 "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY), 155 #endif 156 #ifdef SQLITE_MEMDEBUG 157 "MEMDEBUG", 158 #endif 159 #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT 160 "MIXED_ENDIAN_64BIT_FLOAT", 161 #endif 162 #ifdef SQLITE_NO_SYNC 163 "NO_SYNC", 164 #endif 165 #ifdef SQLITE_OMIT_ALTERTABLE 166 "OMIT_ALTERTABLE", 167 #endif 168 #ifdef SQLITE_OMIT_ANALYZE 169 "OMIT_ANALYZE", 170 #endif 171 #ifdef SQLITE_OMIT_ATTACH 172 "OMIT_ATTACH", 173 #endif 174 #ifdef SQLITE_OMIT_AUTHORIZATION 175 "OMIT_AUTHORIZATION", 176 #endif 177 #ifdef SQLITE_OMIT_AUTOINCREMENT 178 "OMIT_AUTOINCREMENT", 179 #endif 180 #ifdef SQLITE_OMIT_AUTOINIT 181 "OMIT_AUTOINIT", 182 #endif 183 #ifdef SQLITE_OMIT_AUTOMATIC_INDEX 184 "OMIT_AUTOMATIC_INDEX", 185 #endif 186 #ifdef SQLITE_OMIT_AUTORESET 187 "OMIT_AUTORESET", 188 #endif 189 #ifdef SQLITE_OMIT_AUTOVACUUM 190 "OMIT_AUTOVACUUM", 191 #endif 192 #ifdef SQLITE_OMIT_BETWEEN_OPTIMIZATION 193 "OMIT_BETWEEN_OPTIMIZATION", 194 #endif 195 #ifdef SQLITE_OMIT_BLOB_LITERAL 196 "OMIT_BLOB_LITERAL", 197 #endif 198 #ifdef SQLITE_OMIT_BTREECOUNT 199 "OMIT_BTREECOUNT", 200 #endif 201 #ifdef SQLITE_OMIT_BUILTIN_TEST 202 "OMIT_BUILTIN_TEST", 203 #endif 204 #ifdef SQLITE_OMIT_CAST 205 "OMIT_CAST", 206 #endif 207 #ifdef SQLITE_OMIT_CHECK 208 "OMIT_CHECK", 209 #endif 210 #ifdef SQLITE_OMIT_COMPLETE 211 "OMIT_COMPLETE", 212 #endif 213 #ifdef SQLITE_OMIT_COMPOUND_SELECT 214 "OMIT_COMPOUND_SELECT", 215 #endif 216 #ifdef SQLITE_OMIT_DATETIME_FUNCS 217 "OMIT_DATETIME_FUNCS", 218 #endif 219 #ifdef SQLITE_OMIT_DECLTYPE 220 "OMIT_DECLTYPE", 221 #endif 222 #ifdef SQLITE_OMIT_DEPRECATED 223 "OMIT_DEPRECATED", 224 #endif 225 #ifdef SQLITE_OMIT_DISKIO 226 "OMIT_DISKIO", 227 #endif 228 #ifdef SQLITE_OMIT_EXPLAIN 229 "OMIT_EXPLAIN", 230 #endif 231 #ifdef SQLITE_OMIT_FLAG_PRAGMAS 232 "OMIT_FLAG_PRAGMAS", 233 #endif 234 #ifdef SQLITE_OMIT_FLOATING_POINT 235 "OMIT_FLOATING_POINT", 236 #endif 237 #ifdef SQLITE_OMIT_FOREIGN_KEY 238 "OMIT_FOREIGN_KEY", 239 #endif 240 #ifdef SQLITE_OMIT_GET_TABLE 241 "OMIT_GET_TABLE", 242 #endif 243 #ifdef SQLITE_OMIT_INCRBLOB 244 "OMIT_INCRBLOB", 245 #endif 246 #ifdef SQLITE_OMIT_INTEGRITY_CHECK 247 "OMIT_INTEGRITY_CHECK", 248 #endif 249 #ifdef SQLITE_OMIT_LIKE_OPTIMIZATION 250 "OMIT_LIKE_OPTIMIZATION", 251 #endif 252 #ifdef SQLITE_OMIT_LOAD_EXTENSION 253 "OMIT_LOAD_EXTENSION", 254 #endif 255 #ifdef SQLITE_OMIT_LOCALTIME 256 "OMIT_LOCALTIME", 257 #endif 258 #ifdef SQLITE_OMIT_LOOKASIDE 259 "OMIT_LOOKASIDE", 260 #endif 261 #ifdef SQLITE_OMIT_MEMORYDB 262 "OMIT_MEMORYDB", 263 #endif 264 #ifdef SQLITE_OMIT_OR_OPTIMIZATION 265 "OMIT_OR_OPTIMIZATION", 266 #endif 267 #ifdef SQLITE_OMIT_PAGER_PRAGMAS 268 "OMIT_PAGER_PRAGMAS", 269 #endif 270 #ifdef SQLITE_OMIT_PRAGMA 271 "OMIT_PRAGMA", 272 #endif 273 #ifdef SQLITE_OMIT_PROGRESS_CALLBACK 274 "OMIT_PROGRESS_CALLBACK", 275 #endif 276 #ifdef SQLITE_OMIT_QUICKBALANCE 277 "OMIT_QUICKBALANCE", 278 #endif 279 #ifdef SQLITE_OMIT_REINDEX 280 "OMIT_REINDEX", 281 #endif 282 #ifdef SQLITE_OMIT_SCHEMA_PRAGMAS 283 "OMIT_SCHEMA_PRAGMAS", 284 #endif 285 #ifdef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS 286 "OMIT_SCHEMA_VERSION_PRAGMAS", 287 #endif 288 #ifdef SQLITE_OMIT_SHARED_CACHE 289 "OMIT_SHARED_CACHE", 290 #endif 291 #ifdef SQLITE_OMIT_SUBQUERY 292 "OMIT_SUBQUERY", 293 #endif 294 #ifdef SQLITE_OMIT_TCL_VARIABLE 295 "OMIT_TCL_VARIABLE", 296 #endif 297 #ifdef SQLITE_OMIT_TEMPDB 298 "OMIT_TEMPDB", 299 #endif 300 #ifdef SQLITE_OMIT_TRACE 301 "OMIT_TRACE", 302 #endif 303 #ifdef SQLITE_OMIT_TRIGGER 304 "OMIT_TRIGGER", 305 #endif 306 #ifdef SQLITE_OMIT_TRUNCATE_OPTIMIZATION 307 "OMIT_TRUNCATE_OPTIMIZATION", 308 #endif 309 #ifdef SQLITE_OMIT_UTF16 310 "OMIT_UTF16", 311 #endif 312 #ifdef SQLITE_OMIT_VACUUM 313 "OMIT_VACUUM", 314 #endif 315 #ifdef SQLITE_OMIT_VIEW 316 "OMIT_VIEW", 317 #endif 318 #ifdef SQLITE_OMIT_VIRTUALTABLE 319 "OMIT_VIRTUALTABLE", 320 #endif 321 #ifdef SQLITE_OMIT_WAL 322 "OMIT_WAL", 323 #endif 324 #ifdef SQLITE_OMIT_WSD 325 "OMIT_WSD", 326 #endif 327 #ifdef SQLITE_OMIT_XFER_OPT 328 "OMIT_XFER_OPT", 329 #endif 330 #ifdef SQLITE_PERFORMANCE_TRACE 331 "PERFORMANCE_TRACE", 332 #endif 333 #ifdef SQLITE_PROXY_DEBUG 334 "PROXY_DEBUG", 335 #endif 336 #ifdef SQLITE_RTREE_INT_ONLY 337 "RTREE_INT_ONLY", 338 #endif 339 #ifdef SQLITE_SECURE_DELETE 340 "SECURE_DELETE", 341 #endif 342 #ifdef SQLITE_SMALL_STACK 343 "SMALL_STACK", 344 #endif 345 #ifdef SQLITE_SOUNDEX 346 "SOUNDEX", 347 #endif 348 #ifdef SQLITE_TCL 349 "TCL", 350 #endif 351 #if defined(SQLITE_TEMP_STORE) && !defined(SQLITE_TEMP_STORE_xc) 352 "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), 353 #endif 354 #ifdef SQLITE_TEST 355 "TEST", 356 #endif 357 #if defined(SQLITE_THREADSAFE) 358 "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), 359 #endif 360 #ifdef SQLITE_USE_ALLOCA 361 "USE_ALLOCA", 362 #endif 363 #ifdef SQLITE_ZERO_MALLOC 364 "ZERO_MALLOC" 365 #endif 366 }; 367 368 /* 369 ** Given the name of a compile-time option, return true if that option 370 ** was used and false if not. 371 ** 372 ** The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix 373 ** is not required for a match. 374 */ 375 int sqlite3_compileoption_used(const char *zOptName){ 376 int i, n; 377 if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; 378 n = sqlite3Strlen30(zOptName); 379 380 /* Since ArraySize(azCompileOpt) is normally in single digits, a 381 ** linear search is adequate. No need for a binary search. */ 382 for(i=0; i<ArraySize(azCompileOpt); i++){ 383 if( sqlite3StrNICmp(zOptName, azCompileOpt[i], n)==0 384 && sqlite3CtypeMap[azCompileOpt[i][n]]==0 385 ){ 386 return 1; 387 } 388 } 389 return 0; 390 } 391 392 /* 393 ** Return the N-th compile-time option string. If N is out of range, 394 ** return a NULL pointer. 395 */ 396 const char *sqlite3_compileoption_get(int N){ 397 if( N>=0 && N<ArraySize(azCompileOpt) ){ 398 return azCompileOpt[N]; 399 } 400 return 0; 401 } 402 403 #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ 404