Other notes: Order by ASC works ok. Removing ORDER BY works ok. Removing limit works ok. *Limit of more than 1 works ok.
But order by DESC, limit 1 sits forever As to work around, leave out the limit and just fetch one row, or do "...limit 2" and just use the first. -----Original Message----- From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On Behalf Of Firecore Sent: Friday, September 07, 2018 1:32 PM To: sqlite-users@mailinglists.sqlite.org Subject: [sqlite] Some queries with ORDER BY and LIMIT lock DB Hi all - It looks like the latest public version of sqlite v3.24.0 has an issue with processing queries with ORDER BY and LIMIT against some datasets. In essence, sqlite3_step returns SQLITE_LOCKED for some of these statments even if there are no other active connections. We were able to reproduce the issue both on iOS via C API and on Mac OS using the console sqlite3 client posted on the Downloads page (https://www.sqlite.org/download.html). It's easily reproduced with the sqlite3 client and db file available here (https://www.dropbox.com/s/l1xofadq7vi5vjj/lock_issue.db?dl=0): sqlite3 lock_issue.db sqlite> SELECT meta_tvshow.ItemID, meta_tvshow.Path, meta_tvshow.DateCached, meta_tvshow.VFS_ID, FileIndex.ModificationDate from meta_tvshow ...> LEFT JOIN FileIndex ON meta_tvshow.ItemID = FileIndex.ItemID ...> WHERE meta_tvshow.MetaID='80349' ...> ORDER BY FileIndex.Enabled DESC ...> LIMIT 1; <this will never return> We've investigated the problem here and found the following which may be helpful: * The db file is valid (at least PRAGMA INTEGRITY_CHECK returns OK). * The issue doesn't reproduce if the query doesn't contain ORDER BY or LIMIT clause. * The issue doesn't reproduce on sqlite v3.22.0 and older (https://www.sqlite.org/2018/sqlite-tools-osx-x86-3220000.zip). * The issue still reproduces after re-creating db from dump using sqlite v3.24.0 on MacOS: sqlite3 lock_issue.db sqlite> pragma integrity_check; ok sqlite> .output backup.db sqlite> .dump sqlite> .q sqlite3 fixed.db sqlite> .read backup.db sqlite> SELECT meta_tvshow.ItemID, meta_tvshow.Path, meta_tvshow.DateCached, meta_tvshow.VFS_ID, FileIndex.ModificationDate from meta_tvshow ...> LEFT JOIN FileIndex ON meta_tvshow.ItemID = FileIndex.ItemID ...> WHERE meta_tvshow.MetaID='80349' ...> ORDER BY FileIndex.Enabled DESC ...> LIMIT 1; <this will never return> * The issue doesn't reproduce after creating index for FileIndex.Enabled and issuing ANALYZE after it: sqlite3 lock_issue.db sqlite> CREATE INDEX FileIndex_Enabled ON FileIndex(Enabled DESC); sqlite> SELECT meta_tvshow.ItemID, meta_tvshow.Path, meta_tvshow.DateCached, meta_tvshow.VFS_ID, FileIndex.ModificationDate from meta_tvshow ...> LEFT JOIN FileIndex ON meta_tvshow.ItemID = FileIndex.ItemID ...> WHERE meta_tvshow.MetaID='80349' ...> ORDER BY FileIndex.Enabled DESC ...> LIMIT 1; <will never return> sqlite> ANALYZE; sqlite> SELECT meta_tvshow.ItemID, meta_tvshow.Path, meta_tvshow.DateCached, meta_tvshow.VFS_ID, FileIndex.ModificationDate from meta_tvshow ...> LEFT JOIN FileIndex ON meta_tvshow.ItemID = FileIndex.ItemID ...> WHERE meta_tvshow.MetaID='80349' ...> ORDER BY FileIndex.Enabled DESC ...> LIMIT 1; <now it returns data as expected> Do you know what may be going on here, and how we can work around it? Thanks in advance! James — Firecore, LLC https://firecore.com _______________________________________________ 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