SQLite Forum

Bug: MSVC uses intrinsic versions of ceil and floor for floating-point modes precise and fast (diagnosed)
Login
nmake parameters look like this:

USE_AMALGAMATION=1 SYMBOLS=0 OPTIMIZATIONS=3 USE_CRT_DLL=0 LIBTCL= USE_RPCRT4_LIB=1 OPT_FEATURE_FLAGS="-DSQLITE_UDL_CAPABLE_PARSER" OPTS="-D_HAVE_SQLITE_CONFIG_H -DSQLITE_EXTRA_INIT=core_init"

and my config.h contains this:

```
#ifndef _CONFIG_H
#define _CONFIG_H


// Values of WINVER and _WIN32_WINNT for various minimum levels of Win32 Compatability
//
// WIN10    0x0A00      WIN6     0x0600      W2K      0x0500     NT4      0x0400
//                      VISTA    0x0600      WXP      0x0501     W95      0x0400
//                      W2K8     0x0600      W2K3     0x0502     NT4E     0x0401
//                      WIN7     0x0601                          W98      0x0410
//                      WIN8     0x0602                          WME      0x0490
//                      WIN81    0x0603

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0A00
#endif
#ifndef WINVER
#define WINVER _WIN32_WINNT
#endif


// *** SQLITE GENERAL CONFIGURATION OPTIONS ***

// #define SQLITE_DEFAULT_AUTOMATIC_INDEX      1               // default: 1
// #define SQLITE_DEFAULT_AUTOVACUUM           0               // default: 0

// Set Default Page Cache Size and Temp Cache Size based on Memory Model

#if defined(_WIN64)
#define SQLITE_DEFAULT_CACHE_SIZE        -1048576           // 1024 MB default: 2 MB
#define SQLITE_DEFAULT_TEMP_CACHE_SIZE    -262144           //  256 MB default:  500 pages
#else
#define SQLITE_DEFAULT_CACHE_SIZE         -262144           //  256 MB default:  2 MB pages
#define SQLITE_DEFAULT_TEMP_CACHE_SIZE     -65536           //   64 MB default:   500 pages
#endif

#define SQLITE_DEFAULT_DEFENSIVE            1               // default:  undefined or off
// #define SQLITE_DEFAULT_FILE_FORMAT          4               // default: 4
// #define SQLITE_DEFAULT_FILE_PERMISSIONS     0644            // default: 0644
#define SQLITE_DEFAULT_FOREIGN_KEYS         1               // default: 0
// #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT   4194304         // default: -1
// #define SQLITE_DEFAULT_LOCKING_MODE         0               // default: 0
// #define SQLITE_DEFAULT_MEMSTATUS            1               // default: 1
// #define SQLITE_DEFAULT_MMAP_SIZE            0               // default: 0
#define SQLITE_DEFAULT_PAGE_SIZE            4096            // default: 4096 max: 65536
// #define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755            // default: 0755
#define SQLITE_DEFAULT_RECURSIVE_TRIGGERS   1               // default: 0
// #define SQLITE_DEFAULT_SHARED_CACHE         0               // default: 0
// #define SQLITE_DEFAULT_SYNCHRONOUS          2               // default: 2
#define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT   256             // default: 1000 pages
// #define SQLITE_DEFAULT_WAL_SYNCHRONOUS      2               // default: same as default synchronous
#define SQLITE_DEFAULT_WORKER_THREADS       8               // default: 0
// #define SQLITE_LIKE_DOESNT_MATCH_BLOBS      1               // default: undefined
// #define SQLITE_SORTER_PMASZ                 64              // default: 250
// #define SQLITE_EXTRA_DURABLE                1               // Extra DirSync's default not defined


// *** SQLITE FEATURE CONFIGURATION OPTIONS ***

#define RBU_ENABLE_DELTA_CKSUM 1                            // Enable RBU Update Checksum (disabled by default)
// #define SQLITE_64BIT_STATS 1
#define SQLITE_ALLOW_URI_AUTHORITY 1                        // Allow Authority (Host) in URI
#define SQLITE_ALLOW_COVERING_INDEX_SCAN 1                  // Allow Covering Index Scans
// #define SQLITE_CASE_SENSITIVE_LIKE 1                        // Like is case sensitive (default is not case sensitive)
#define SQLITE_COUNTOFVIEW_OPTIMIZATION 1                   // Additional Optimization for count()
// #define SQLITE_DISABLE_DIRSYNC 1                            // Do not sync directories
// #define SQLITE_DISABLE_FTS3_UNICODE 1                       // Disable Unicode in FTS3
// #define SQLITE_DISABLE_LFS 1
// #define SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS 1           // Disable Overflow Page Statistics
#define SQLITE_DQS 0                                        // Double Quoted Strings (0=None/1=DML/2=DDL/3=Both)
#define SQLITE_INTROSPECTION_PRAGMAS 1                      // Add Instropsection Pragma
#define SQLITE_ENABLE_8_3_NAMES 1                           // Enable 8.3 Names
#define SQLITE_ENABLE_API_ARMOR 1                           // Enable API Armour
// #define SQLITE_ENABLE_ATOMIC_WRITE 1                        // Enable Atomic Writes
#define SQLITE_ENABLE_BYTECODE_VTAB 1                       // Enable Bytecode VTAB
#define SQLITE_ENABLE_COLUMN_METADATA 1                     // Add Column Metadata Functions
#define SQLITE_ENABLE_COLUMN_USED_MASK 1                    // Enable Column Used Hints
#define SQLITE_ENABLE_COSTMULT 1                            // Use Cost Multiplication Factors
#define SQLITE_ENABLE_CURSOR_HINTS 1                        // Output Cursor Hints to B-Tree Layer
#define SQLITE_ENABLE_DBPAGE_VTAB 1                         // Include DBPAGE Virtual Table
#define SQLITE_ENABLE_DBSTAT_VTAB 1                         // Include DBSTAT Virtual Table
#define SQLITE_ENABLE_DESERIALIZE 1                         // Include Serialize/Deserialize API
#define SQLITE_ENABLE_EXPLAIN_COMMENTS 1                    // Add Comments to Explain
#define SQLITE_ENABLE_FTS3 1                                // Include FTS3 Extension
#define SQLITE_ENABLE_FTS3_PARENTHESIS 1                    // FTS3 Options
#define SQLITE_ENABLE_FTS4 1                                // Include FTS4 Extension
#define SQLITE_ENABLE_FTS5 1                                // Include FTS5 Extension
#define SQLITE_ENABLE_GEOPOLY 1                             // Include the GEOPOLY Extension
// #define SQLITE_ENABLE_HIDDEN_COLUMNS 1                      // Allow Hidden Columns
// #define SQLITE_ENABLE_ICU 1                                 // Set in BUILD Command additional Libs required
#define SQLITE_ENABLE_JSON1 1                               // Enable JSON1 Extension
#define SQLITE_ENABLE_LOAD_EXTENSION 1                      // Enable the Load Extension Interface
#define SQLITE_ENABLE_LOCKING_STYLE 1                       // Locking Style (1 == Normal)
#define SQLITE_ENABLE_LSM1 1                                // Enable LSM1
#define SQLITE_ENABLE_MATH_FUNCTIONS 1                      // Enable Math Functions
#define SQLITE_ENABLE_MEMORY_MANAGEMENT 1                   // Enable Memory Management (sqlite3_release_memory)
#define SQLITE_ENABLE_MEMSTATVTAB 1                         // Enable the memstat vtab
// #define SQLITE_ENABLE_MEMSYS3 1                             // Include MEMSYS3
// #define SQLITE_ENABLE_MEMSYS5 1                             // Include MEMSYS5
#define SQLITE_ENABLE_MODULE_COMMENTS 1                     // Add Module Comments to Explain
// #define SQLITE_ENABLE_MULTITHREADED_CHECKS 1                // Enable Multithreaded Checks when using MUTLITHREADING config
#define SQLITE_ENABLE_NORMALIZE 1                           // Enable the sqlite3_normalized_sql interface
#define SQLITE_ENABLE_PREUPDATE_HOOK 1                      // Enable the pre-commit hooks
// #define SQLITE_ENABLE_QPSG                                  // Enable Query Planner Stability Guarantee
#define SQLITE_ENABLE_RBU 1                                 // Enable Resumable Bulk Update
#define SQLITE_ENABLE_RTREE 1                               // Include the RTREE Extension
// #define SQLITE_RTREE_INT_ONLY 1                             // Make RTREE Integer Only (rather than float32)
#define SQLITE_ENABLE_SESSION 1                             // Enable the SESSION feature
// #define SQLITE_ENABLE_SETLK_TIMEOUT 1                       // Use File Control to manage lock acquisition
#define SQLITE_ENABLE_SNAPSHOT 1                            // Enable the SNAPSHOT feature
// #define SQLITE_ENABLE_SORTER_REFERENCES 1                   // Enable Sorter References
#define SQLITE_ENABLE_STAT_VTAB 1                           // Enable dbstat_register called from shell
#define SQLITE_ENABLE_STAT1 1                               // Enable Statistics 1
#define SQLITE_ENABLE_STAT2 1                               // Enable Statistics 2
#define SQLITE_ENABLE_STAT3 1                               // Enable Statistics 3
#define SQLITE_ENABLE_STAT4 1                               // Enable Statistics 4
#define SQLITE_ENABLE_STMTVTAB 1                            // Enable Stmt VTAB Extension
#define SQLITE_ENABLE_STMT_SCANSTATUS 1                     // Enable Statement ScanStatus
#define SQLITE_ENABLE_UNIONVTAB 1                           // Enable unionvtab
#define SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION 1                // Allow Explain to work for Unknown Functions
// #define SQLITE_ENABLE_UNLOCK_NOTIFY 1                       // See Documentation before enabling
#define SQLITE_ENABLE_UPDATE_DELETE_LIMIT 1                 // Requires Special Amalgamation / Parser Support
// #define SQLITE_ENABLE_VFSSTAT 1                             // Enable vfsstat extension
#define SQLITE_EXPLAIN_ESTIMATED_ROWS 1                     // Add Estimated Rows to Explain
// #define SQLITE_LIKE_DOESNT_MATCH_BLOBS      1               // default: 0 (undefined)
// #define SQLITE_MMAP_READWRITE 1                             // mmaps are writeable as well as readable
// #define SQLITE_SECURE_DELETE 1                              // Enable Overwriting of deleted records
#define SQLITE_SOUNDEX 1                                    // Include the soundex builtin
#define SQLITE_STAT4_SAMPLES 64                             // default: 24 samples
#define SQLITE_THREADSAFE 1                                 // 0 = Single Threaded, 1 = Serialized, 2 = Multithreaded
#define SQLITE_TEMP_STORE 1                                 // 0 = Files Always, 1 = Files, 2 = Memory, 3 = Memory Always
#define SQLITE_TRUSTED_SCHEMA 0                             // Schema is untrusted -- default trusted
#define SQLITE_USE_URI 1                                    // Enable URI Filenames


//  *** SQLITE MAXIMUMS AND LIMITS CONFIGURATION ***

// #define SQLITE_FTS3_MAX_EXPR_DEPTH          15              // default: 12
#define SQLITE_MAX_ATTACHED                 15              // default: 10          max: 62
// #define SQLITE_MAX_COLUMN                   2000            // default: 2000        max: 32767
// #define SQLITE_MAX_COMPOUND_SELECT          500             // default: 500
// #define SQLITE_MAX_EXPR_DEPTH               1000            // default: 1000
// #define SQLITE_MAX_FUNCTION_ARG             100             // default: 100         max: 127
// #define SQLITE_MAX_LENGTH                   0x3fffffff      // default: 1000000000  max: 2147483647 (2^31-1)
// #define SQLITE_MAX_LIKE_PATTERN_LENGTH      16384           // default: 50000
// #define SQLITE_MAX_MEMORY                   0               // default: 0
// #if defined(_WIN64)
// #define SQLITE_MAX_MEMORY                   4294967296      // 4 GB on x64
// #else
// #define SQLITE_MAX_MEMORY                   1073741824      // 1 GB on x32
// #endif
// #define SQLITE_MAX_MMAP_SIZE                0x7fff0000      // default: 0x7fff0000
// #define SQLITE_MAX_PAGE_COUNT               1073741823      // default: 1073741823  max: 2147483646 (2^31-2)
// #define SQLITE_MAX_SQL_LENGTH               131072          // default: 1000000     max: 2^30
// #define SQLITE_MAX_TRIGGER_DEPTH            1000            // default: 1000
// #define SQLITE_MAX_VARIABLE_NUMBER          32766           // default: 32766
// #define SQLITE_MAX_SCHEMA_RETRY             50              // default: 50
#define SQLITE_MAX_WORKER_THREADS           16              // default: 8
// #define YYSTACKDEPTH                        100             // default: 100


//  *** SQLITE OPERATING SYSTEM AND INTERNALS CONFIGURATION ***

//  #define SQLITE_OS_OTHER 0
#define SQLITE_OS_WIN 1
#define SQLITE_OS_WINNT 1
// #define SQLITE_OS_WINCE 1
// #define SQLITE_OS_WINRT 1
// #define SQLITE_WIN32_MALLOC 1                               // Use Win32 Heap Allocator
// #define SQLITE_WIN32_HEAP_CREATE 1                          // Use Separate Win32 Heap
// #define SQLITE_WIN32_MALLOC_VALIDATE 1                      // Validate Win32 Heap during SQLITE_DEBUG assert
// #if defined(_WIN64)
// #define SQLITE_WIN32_HEAP_INIT_SIZE 1073741824              // Initial Win32 Heap Size = 1 GB
// #else
// #define SQLITE_WIN32_HEAP_INIT_SIZE 268435456               // Initial Win32 Heap Size = 256 MB
// #endif
// #define SQLITE_WIN32_HEAP_MAX_SIZE 0                        // Max Win32 Heap Size (No Limit)
// #define SQLITE_WIN32_HEAP_FLAGS 0
// #define SQLITE_DIRECT_OVERFLOW_READ 1                       // Do Not PageCache Overflow Pages
// #define SQLITE_DEFAULT_LOOKASIDE 1200,100                   // Default LookAside Allocation
// #define SQLITE_SYSTEM_MALLOC 1                              // Use Default System Heap (default if no other specified)
// #define SQLITE_MALLOC_SOFT_LIMIT 1024
// #define SQLITE_POWERSAFE_OVERWRITE 0
// #define SQLITE_4_BYTE_ALIGNED_MALLOC 1
// #define SQLITE_USE_ALLOCA 1                                 // Use AllocA to Allocate Parse object os Stack


// *** SQLITE OMIT FEATURES ***

// #define SQLITE_OMIT_ALTERTABLE
// #define SQLITE_OMIT_ANALYZE
// #define SQLITE_OMIT_ATTACH
// #define SQLITE_OMIT_AUTHORIZATION
// #define SQLITE_OMIT_AUTOINCREMENT
// #define SQLITE_OMIT_AUTOINIT
// #define SQLITE_OMIT_AUTOMATIC_INDEX
// #define SQLITE_OMIT_AUTORESET
// #define SQLITE_OMIT_AUTOVACUUM
// #define SQLITE_OMIT_BETWEEN_OPTIMIZATION
// #define SQLITE_OMIT_BLOB_LITERAL
// #define SQLITE_OMIT_BTREECOUNT
// #define SQLITE_OMIT_BUILTIN_TEST
// #define SQLITE_OMIT_CAST
// #define SQLITE_OMIT_CHECK
// #define SQLITE_OMIT_COMPILEOPTION_DIAGS
// #define SQLITE_OMIT_COMPLETE
// #define SQLITE_OMIT_COMPOUND_SELECT
// #define SQLITE_OMIT_DATETIME_FUNCS
// #define SQLITE_OMIT_DECLTYPE
// #define SQLITE_OMIT_DEPRECATED
// #define SQLITE_OMIT_DISKIO
// #define SQLITE_OMIT_EXPLAIN
// #define SQLITE_OMIT_FLAG_PRAGMAS
// #define SQLITE_OMIT_FLOATING_POINT
// #define SQLITE_OMIT_FOREIGN_KEY
// #define SQLITE_OMIT_GET_TABLE
// #define SQLITE_OMIT_INCRBLOB
// #define SQLITE_OMIT_INTEGRITY_CHECK
// #define SQLITE_OMIT_LIKE_OPTIMIZATION
// #define SQLITE_OMIT_LOAD_EXTENSION
// #define SQLITE_OMIT_LOCALTIME
// #define SQLITE_OMIT_LOOKASIDE
// #define SQLITE_OMIT_MEMORYDB
// #define SQLITE_OMIT_MERGE_SORT
// #define SQLITE_OMIT_OR_OPTIMIZATION
// #define SQLITE_OMIT_PAGER_PRAGMAS
// #define SQLITE_OMIT_PRAGMA
// #define SQLITE_OMIT_PROGRESS_CALLBACK
// #define SQLITE_OMIT_QUICKBALANCE
// #define SQLITE_OMIT_REINDEX
// #define SQLITE_OMIT_SCHEMA_PRAGMAS
// #define SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
// #define SQLITE_OMIT_SHARED_CACHE
// #define SQLITE_OMIT_SHUTDOWN_DIRECTORIES
// #define SQLITE_OMIT_SUBQUERY
// #define SQLITE_OMIT_TCL_VARIABLE
// #define SQLITE_OMIT_TEMPDB
// #define SQLITE_OMIT_TRACE
// #define SQLITE_OMIT_TRIGGER
// #define SQLITE_OMIT_TRUNCATE_OPTIMIZATION
// #define SQLITE_OMIT_UTF16
// #define SQLITE_OMIT_VACUUM
// #define SQLITE_OMIT_VIEW
// #define SQLITE_OMIT_VIRTUALTABLE
// #define SQLITE_OMIT_WAL
// #define SQLITE_OMIT_WSD
// #define SQLITE_OMIT_XFER_OPT


// *** SQLITE DEBUGGING FEATURES ***

// #define SQLITE_DEBUG 1
// #define SQLITE_ENABLE_EXPENSIVE_ASSERT 1
// #define SQLITE_ENABLE_OVERSIZE_CELL_CHECK 1
// #define SQLITE_ENABLE_SELECTTRACE 1                         // Enable Select Trace (.selecttrace 0x100) needs SQLITE_DEBUG
// #define SQLITE_ENABLE_SQLLOG 1                              // Enable SQLITE_CONFIG_SQLLOG (see documentation)
// #define SQLITE_ENABLE_STMT_SCANSTATUS 1                     // Enable Collection of Statement Scan Status
// #define SQLITE_ENABLE_WHERETRACE 1
// #define SQLITE_IOTRACE 1
// #define SQLITE_MEMDEBUG 1
// #define SQLITE_REVERSE_UNORDERED_SELECTS 1
// #define SQLITE_USE_FCNTL_TRACE 1                            // Enable extra vfslog fcntrl trace
// #define SQLITE_YYTRACKMAXSTACKDEPTH 1


// *** Custom Additions/Changes/Features ***

#define SQLITE_NOW_STABILITY_STMT 1                         // Make 'now' stable within a statement, not only for a step
#define WHERE_PATH_SIMPLE 50                                // Paths to remember for  2-way joins
#define WHERE_PATH_COMPLEX 100                              // Paths to remember for >2-way joins
#define SQLITE_USE_QUADMATH 1                               // Use 128-bit Float Intermediates if available
#define SQLITE_USE_PRECISE_TIME 1                           // Use GetSystemTimePreciseAsFileTime
#define SQLITE_USE_DATETIME_NEW 1                           // Use New Datetime Functions

// For cache modes only use 1 of RANDOM / SEQUENTIAL / WRITETHROUGH / NOBUFFER
// For WINCE always use RANDOM, default if "Microsoft Magical Mode" if none selected

#define SQLITE_WIN32_FILE_RANDOM 1                          // Force Windows RANDOM access cache behaviour
// #define SQLITE_WIN32_FILE_SEQUENTIAL 1                      // Force Windows SEQUENTIAL access cache behaviour
// #define SQLITE_WIN32_FILE_WRITETHROUGH 1                    // Turn off Delayed Writes
// #define SQLITE_WIN32_FILE_NOBUFFER 1                        // Disable use of Filesystem Cache


// Performance Optimizations

// #define SQLITE_THREADSAFE                   0                   // Remove Thread Safety Mutexes
// #define SQLITE_DEFAULT_MEMSTATUS            0                   // Remove Memory Status from SQLITE3_MALLOC
#define SQLITE_DEFAULT_WAL_SYNCHRONOUS      1                   // Reduce Synchronous to NORMAL in WAL mode
// #define SQLITE_DIRECT_OVERFLOW_READ         1                   // Do not cache overflow pages in SQLite pagecache
#define SQLITE_LIKE_DOESNT_MATCH_BLOBS      1                   // Disable LIKE matching for BLOBS
// #define SQLITE_MAX_EXPR_DEPTH               0                   // Disable Parser Depth Checking
// #define SQLITE_OMIT_DECLTYPE                1                   // Omit Declaration Type from Cursors
// #define SQLITE_OMIT_DEPRECATED              1                   // Omit Deprecated Code
// #define SQLITE_OMIT_PROGRESS_CALLBACK       1                   // Omit Progress Callback loop counter
// #define SQLITE_OMIT_SHARED_CACHE            1                   // Omit Shared Cache


// Compiler and Platform specifics

#define HAVE_FDATASYNC 1                                        // Platform has FDATASYNC
#define HAVE_GMTIME_R 1                                         // Platform has GMTIME_R
#define HAVE_LOCALTIME_S 1                                      // Platform has LOCALTIME_S
#define HAVE_USLEEP 1                                           // Platform has usleep
#define HAVE_UTIME 1                                            // Platform has utime
#define HAVE_STDINT_H 1                                         // Platform has stdint.h
#define HAVE_INTTYPES_H 1                                       // Platform has inttypes.h

#if defined(_WIN32) && defined(__GNUC__)                        // Only for GCC (MinGW on Windows)
#ifndef UNICODE_STRING_MAX_BYTES
#define UNICODE_STRING_MAX_BYTES ((WORD)65534)                  // Reset Unicode String Bytes Maximum
#endif
#ifndef UNICODE_STRING_MAX_CHARS
#define UNICODE_STRING_MAX_CHARS (32766)                        // Reset Unicode String Characters Maximum
#endif
#define HAVE_ISNAN 1                                            // Platform has isnan function
#define SQLITE_USE_MALLOC_H 1                                   // Platform has malloc.h
#define SQLITE_USE_MSIZE 1                                      // Platform malloc_usable_size is _msize
#define __USE_MINGW_ANSI_STDIO 1                                // Use ANSI StdIO
#endif

#define SQLITE_HAVE_ZLIB 1                                      // Platform has ZLIB
#define SQLITE_WIN32_USE_UUID 1                                 // Use RPCRT4 UUID Functions

#undef LONGDOUBLE_TYPE                                          // Clear the LONGDOUBLE_type

#if defined(__GNUC__) && defined(SQLITE_USE_QUADMATH)
#define LONGDOUBLE_TYPE __float128                              // Use GCC extension type if we want quadmath
#else
#undef SQLITE_USE_QUADMATH
#define LONGDOUBLE_TYPE long double                             // else long double is long double
#endif

#endif
```

My own extensions and core_init function are appended to the end of the amalgamation code by modification of the mksqlite3c.tcl script so do not affect anything in the base func.c code ... (which is only modified such that the sum context uses a LONGDOUBLE_TYPE real accumulator so that precision is not lost if the input is not sorted by magnitude).

MinGW64 command line looks like this:

```
gcc -s -O3 -pipe -D_HAVE_SQLITE_CONFIG_H -DSQLITE_EXTRA_INIT=core_init -DSQLITE_HAVE_ZLIB -Itsrc -march=native -mtune=native -m64 -mthreads -Wl,-Bstatic,--nxcompat,--dynamicbase,--high-entropy-va,--image-base,0x140000000 DummyExport.c shell.c sqlite3.c -ladvapi32 -lrpcrt4 -lwinmm -lz -static-libgcc -o gcc/64/sqlite3.exe
```

DummyExport.c is simply a dummy export because Windows does not handle executables properly and does not actually do high-entropy ASLR properly unless the executable has an exported symbol.

`void __declspec(dllexport) DummyExport(void) {}`