Well I can reproduce the wrong answer. If I compile the amalgamation code:
with no config.h I get the same result as you, but with the following config.h, the result is correct (this is with the code from the head of trunk): #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 0x0600 #endif #ifndef WINVER #define WINVER _WIN32_WINNT #endif // General Platform Compilation Support Options #define HAVE_MALLOC_USABLE_SIZE 1 #define HAVE_USLEEP 1 // *** SQLITE GENERAL CONFIGURATION OPTIONS *** // #define SQLITE_DEFAULT_AUTOMATIC_INDEX 1 // default: 1 // #define SQLITE_DEFAULT_AUTOVACUUM 0 // default: 0 #define SQLITE_DEFAULT_CACHE_SIZE 65536 // 256 MB // #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_PAGE_SIZE 4096 // default: 4096 max: 65536 // #define SQLITE_DEFAULT_SYNCHRONOUS 2 // default: 2 // #define SQLITE_DEFAULT_WAL_SYNCHRONOUS 2 // default: same as default synchronous // #define SQLITE_DEFAULT_WORKER_THREADS 4 // default: 0 #define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 256 // default: 1000 pages #define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755 // default: 0755 #define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 1 // default: 0 #define SQLITE_DEFAULT_TEMP_CACHE_SIZE 65536 // default: 500 pages #define SQLITE_DEFAULT_SHARED_CACHE 0 // default: 0 #define SQLITE_DEFAULT_MMAP_SIZE 0 // 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 SQLITE_ALLOW_COVERING_INDEX_SCAN 1 #define SQLITE_ENABLE_8_3_NAMES 1 // #define SQLITE_ENABLE_ATOMIC_WRITE 1 #define SQLITE_ENABLE_API_ARMOR 1 // Enable API Armour #define SQLITE_ENABLE_COLUMN_METADATA 1 #define SQLITE_ENABLE_COSTMULT 1 #define SQLITE_ENABLE_CURSOR_HINTS 1 #define SQLITE_ENABLE_DBSTAT_VTAB 1 #define SQLITE_ENABLE_EXPLAIN_COMMENTS 1 #define SQLITE_ENABLE_FTS3 1 #define SQLITE_ENABLE_FTS3_PARENTHESIS 1 // #define SQLITE_DISABLE_FTS3_UNICODE 1 #define SQLITE_ENABLE_FTS4 1 #define SQLITE_ENABLE_FTS5 1 // #define SQLITE_ENABLE_ICU 1 // Set in BUILD Command additional Libs required #define SQLITE_ENABLE_JSON1 1 // Enable JSON1 -- when standard extension #define SQLITE_ENABLE_LOAD_EXTENSION 1 #define SQLITE_ENABLE_LOCKING_STYLE 1 #define SQLITE_ENABLE_MEMORY_MANAGEMENT 1 // Enable Memory Management (sqlite3_release_memory) // #define SQLITE_ENABLE_MEMSYS3 1 // #define SQLITE_ENABLE_MEMSYS5 1 #define SQLITE_ENABLE_MODULE_COMMENTS 1 #define SQLITE_ENABLE_PREUPDATE_HOOK 1 // #define SQLITE_ENABLE_RBU 1 // Enable Resumable Bulk Update #define SQLITE_ENABLE_RTREE 1 // #define SQLITE_RTREE_INT_ONLY 1 // #define SQLITE_ENABLE_SESSION 1 // Enable the SESSION feature // #define SQLITE_ENABLE_SNAPSHOT 1 // Enable the SNAPSHOT feature #define SQLITE_ENABLE_STAT_VTAB 1 // Enable dbstat_register called from shell #define SQLITE_ENABLE_STAT1 1 #define SQLITE_ENABLE_STAT2 1 #define SQLITE_ENABLE_STAT3 1 #define SQLITE_ENABLE_STAT4 1 // #define SQLITE_ENABLE_VFSSTAT 1 // Enable vftstat extension // #define SQLITE_LIKE_DOESNT_MATCH_BLOBS 1 // default: 0 (undefined) #define SQLITE_STAT4_SAMPLES 64 // default: 24 samples // #define SQLITE_64BIT_STATS 1 // #define SQLITE_ENABLE_UNLOCK_NOTIFY 1 // See Documentation before enabling // #define SQLITE_ENABLE_UPDATE_DELETE_LIMIT 1 // Requires Special Amalgamation / Parser Support #define SQLITE_SOUNDEX 1 // #define SQLITE_DISABLE_LFS 1 // #define SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS 1 // #define SQLITE_DISABLE_DIRSYNC 1 // #define SQLITE_CASE_SENSITIVE_LIKE 1 // #define SQLITE_NOW_STABILITY_STEP 1 // Make 'now' stable only within step, not entire statement // #define SQLITE_SECURE_DELETE 1 #define SQLITE_TEMP_STORE 2 // 0 = Files Always, 1 = Files, 2 = Memory, 3 Memory Always #define SQLITE_USE_URI 1 // Enable URI Filenames #define SQLITE_ALLOW_URI_AUTHORITY 1 // Allow Authority (Host) in URI // #define SQLITE_MMAP_READWRITE 1 // mmaps are writeable as well as readable // *** 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_FTS3_MAX_EXPR_DEPTH 12 // default: 12 // #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_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 999 // default: 999 // #define SQLITE_MAX_SCHEMA_RETRY 50 // default: 50 // #define SQLITE_MAX_WORKER_THREADS 8 // default: 11 // #define YYSTACKDEPTH 100 // defautl: 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 #define SQLITE_WIN32_HEAP_INIT_SIZE 268435456 // Initial Win32 Heap Size = 256 MB #define SQLITE_WIN32_HEAP_MAX_SIZE 0 // Max Win32 Heap Size (No Limit) // #define SQLITE_WIN32_HEAP_FLAGS 0 // #define SQLITE_WIN32_FILE_SEQUENTIAL 1 // Force Windows SEQUENTIAL access cache behaviour #define SQLITE_WIN32_FILE_RANDOM 1 // Force Windows RANDOM access cache behaviour // #define SQLITE_WIN32_FILE_WRITETHROUGH 1 // Force Windows WRITE-THROUGH Behaviour // #define SQLITE_DIRECT_OVERFLOW_READ 1 // Do Not PageCache Overflow Pages // #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 #define SQLITE_USE_QUADMATH 1 // Use 128-bit Floats if available // *** 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 #if defined(_WIN32) && defined(__GNUC__) #define UNICODE_STRING_MAX_BYTES ((WORD) 65534) #define UNICODE_STRING_MAX_CHARS (32767) #define HAVE_FDATASYNC 1 #define HAVE_GMTIME_R 1 #define HAVE_LOCALTIME_S 1 #define HAVE_ISNAN 1 #define HAVE_MALLOC_USABLE_SIZE 1 #define HAVE_USLEEP 1 #define HAVE_UTIME 1 #endif #if defined(_MSC_VER) #define HAVE_FDATASYNC 1 #define HAVE_GMTIME_R 1 #define HAVE_LOCALTIME_S 1 #define HAVE_MALLOC_USABLE_SIZE 1 #define HAVE_USLEEP 1 #define HAVE_UTIME 1 #endif #if defined(__GNUC__) && defined(SQLITE_USE_QUADMATH) #define LONGDOUBLE_TYPE __float128 #endif #endif > -----Original Message----- > From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] > On Behalf Of David Empson > Sent: Tuesday, 11 October, 2016 18:41 > To: SQLite mailing list > Subject: Re: [sqlite] LIMIT doesn't return expected rows > > Following up: same for the Mac distribution of 3.14.2 command line tool. > Using the pre-release snapshot of 3.15.0 from the main download page to > build the sqlite3 3.15.0 on the Mac, I get the same answer: 1,2,3. > > SQLite version 3.15.0 2016-10-10 14:34:00 > Enter ".help" for usage hints. > Connected to a transient in-memory database. > Use ".open FILENAME" to reopen on a persistent database. > sqlite> .read test.sql > select sqlite_source_id(); > 2016-10-10 14:34:00 aebe429e52ffef026cb0803fb164339d61bd2e88 > create table i (id integer primary key autoincrement, flags integer); > insert into i values (1,1),(2,1),(3,1),(4,1),(5,5),(6,6),(7,4); > create table m (id integer); > insert into m values (1),(2),(3),(4),(5),(6),(7); > SELECT id FROM i WHERE id IN (SELECT id FROM m) ORDER BY flags DESC; > 6 > 5 > 7 > 1 > 2 > 3 > 4 > SELECT id FROM i WHERE id IN (SELECT id FROM m) ORDER BY flags DESC limit > 3; > 1 > 2 > 3 > > > > On 12/10/2016, at 1:23 PM, David Empson <demp...@emptech.co.nz> wrote: > > > > Keith - using your example, I get the same result as Tobias: the second > select produces 1,2,3. This is with the sqlite3.exe Windows command line > tool for SQLite 3.14.2 downloaded from sqlite.org. Same sqlite_source_id() > too. I’m not set up to build SQLite from source, so can’t easily test > 3.15.0, but If I do the same with a copy of 3.8.11.1 I have handy I get > the correct result: 6, 5, 7. > > > > SQLite version 3.14.2 2016-09-12 18:50:49 > > Enter ".help" for usage hints. > > Connected to a transient in-memory database. > > Use ".open FILENAME" to reopen on a persistent database. > > sqlite> .read test.sql > > select sqlite_source_id(); > > 2016-09-12 18:50:49 29dbef4b8585f753861a36d6dd102ca634197bd6 > > create table i (id integer primary key autoincrement, flags integer); > > insert into i values (1,1),(2,1),(3,1),(4,1),(5,5),(6,6),(7,4); > > create table m (id integer); > > insert into m values (1),(2),(3),(4),(5),(6),(7); > > SELECT id FROM i WHERE id IN (SELECT id FROM m) ORDER BY flags DESC; > > 6 > > 5 > > 7 > > 1 > > 2 > > 3 > > 4 > > SELECT id FROM i WHERE id IN (SELECT id FROM m) ORDER BY flags DESC > limit 3; > > 1 > > 2 > > 3 > > > >> On 12/10/2016, at 12:59 PM, Keith Medcalf <kmedc...@dessus.com> wrote: > >> > >> SQLite version 3.14.2 2016-09-12 18:50:49 > >> Enter ".help" for usage hints. > >> Connected to a transient in-memory database. > >> Use ".open FILENAME" to reopen on a persistent database. > >> sqlite> .read \\test.sql > >> select sqlite_source_id(); > >> 2016-09-12 18:50:49 29dbef4b8585f753861a36d6dd102ca634197bd6 > >> create table i (id integer primary key autoincrement, flags integer); > >> insert into i values (1,1),(2,1),(3,1),(4,1),(5,5),(6,6),(7,4); > >> create table m (id integer); > >> insert into m values (1),(2),(3),(4),(5),(6),(7); > >> SELECT id FROM i WHERE id IN (SELECT id FROM m) ORDER BY flags DESC; > >> 6 > >> 5 > >> 7 > >> 1 > >> 2 > >> 3 > >> 4 > >> SELECT id FROM i WHERE id IN (SELECT id FROM m) ORDER BY flags DESC > limit 3; > >> 6 > >> 5 > >> 7 > >> > >> I just compiled 3.14.2 from my source repository and it works > correctly. > >> > >> Can you check the result of "select sqlite_source_id();", which should > be: > >> > >> 2016-09-12 18:50:49 29dbef4b8585f753861a36d6dd102ca634197bd6 > >> > >> https://www.sqlite.org/src/info/29dbef4b8585f753 > >> > >>> -----Original Message----- > >>> From: sqlite-users [mailto:sqlite-users- > boun...@mailinglists.sqlite.org] > >>> On Behalf Of Tobias Ellinghaus > >>> Sent: Tuesday, 11 October, 2016 11:41 > >>> To: sqlite-users@mailinglists.sqlite.org > >>> Subject: Re: [sqlite] LIMIT doesn't return expected rows > >>> > >>> Am Dienstag, 11. Oktober 2016, 06:50:01 CEST schrieb Keith Medcalf: > >>>> This was fixed September 7. The fix appears in 3.14.2 and also on > the > >>>> current 3.15.0. > >>> > >>> Does that mean that 3.14.2 is supposed to give the "6, 5, 7" result in > the > >>> last query? I am asking as that's the version I am using (installed > from > >>> Debian/sid) and I get "1, 2, 3" here. > >>> > >>>> https://www.sqlite.org/releaselog/3_14_2.html > >>>> > >>>> The ORDER BY LIMIT optimization is not valid unless the inner-most IN > >>>> operator loop is actually used by the query plan. Ticket > >>>> https://sqlite.org/src/info/0c4df46116e90f92 > >>>> > >>>> > >>>> SQLite version 3.15.0 2016-10-10 14:48:36 > >>>> Enter ".help" for usage hints. > >>>> Connected to a transient in-memory database. > >>>> Use ".open FILENAME" to reopen on a persistent database. > >>>> sqlite> create table i (id integer primary key, flags integer); > >>>> sqlite> insert into i values > (1,1),(2,1),(3,1),(4,1),(5,5),(6,6),(7,4); > >>>> sqlite> create table m (id integer); > >>>> sqlite> insert into m values (1),(2),(3),(4),(5),(6),(7); > >>>> sqlite> SELECT id FROM i WHERE id IN (SELECT id FROM m) ORDER BY > flags > >>> DESC; > >>>> 6 > >>>> 5 > >>>> 7 > >>>> 1 > >>>> 2 > >>>> 3 > >>>> 4 > >>>> sqlite> SELECT id FROM i WHERE id IN (SELECT id FROM m) ORDER BY > flags > >>> DESC > >>>> limit 3; 6 > >>>> 5 > >>>> 7 > >>> > >>> Tobias > >>> > >>> [...] > >> > >> > >> > >> _______________________________________________ > >> sqlite-users mailing list > >> sqlite-users@mailinglists.sqlite.org > >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > > > > _______________________________________________ > > sqlite-users mailing list > > sqlite-users@mailinglists.sqlite.org > > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > > -- > David Empson > demp...@emptech.co.nz > Snail mail: P.O. Box 27-103, Wellington 6141, New Zealand > > _______________________________________________ > sqlite-users mailing list > sqlite-users@mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users