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