After laboriously translating your schema and query into something readable, I get script shown below.
We (all SQLite developers have been consulted and agree) conclude that the result of the query is undefined. You are sorting on the rowid of a subquery. But the rowid of a subquery is undefined, so anything can happen with there. Was SQLite 3.7.17 really giving you the answer you expected? If so, we think that was by luck. Can you recast the query in such a way that it does not sort on the rowid of a subquery? Note that an ORDER BY clause without a LIMIT clause in a subquery is pointless and might be removed by the query optimizer. CREATE TABLE Items( uid INTEGER PRIMARY KEY ASC, id TEXT DEFAULT '', type TEXT DEFAULT track, kind TEXT DEFAULT '', error INT DEFAULT 0, name TEXT DEFAULT '', album TEXT DEFAULT '', artist TEXT DEFAULT '', genre TEXT DEFAULT '', composer TEXT DEFAULT '', description TEXT DEFAULT '', popularity REAL DEFAULT 0, frequency REAL DEFAULT 0, band TEXT DEFAULT '', call_letters TEXT DEFAULT '', city TEXT DEFAULT '', state TEXT DEFAULT '', country TEXT DEFAULT '', provider TEXT DEFAULT '', label TEXT DEFAULT '', copyright TEXT DEFAULT '', is_explicit TEXT DEFAULT false, is_protected TEXT DEFAULT false, is_purchased TEXT DEFAULT false, bpm INT DEFAULT 0, bit_rate INT DEFAULT 0, sample_rate INT DEFAULT 0, format TEXT DEFAULT '', size INT DEFAULT 0, time INT DEFAULT 0, url TEXT DEFAULT '', can_play TEXT DEFAULT false, can_pause TEXT DEFAULT false, can_seek TEXT DEFAULT false, can_next TEXT DEFAULT false, can_previous TEXT DEFAULT false, can_queue TEXT DEFAULT false, can_order TEXT DEFAULT false, can_like TEXT DEFAULT false, can_rate TEXT DEFAULT false, can_star TEXT DEFAULT false, modified_date INT DEFAULT 0, released_date INT DEFAULT 0, purchased_date INT DEFAULT 0, skipped_date INT DEFAULT 0, track_number INT DEFAULT 0, disc_number INT DEFAULT 0, track_count INT DEFAULT 0, disc_count INT DEFAULT 0, listener_count INT DEFAULT 0, play_count INT DEFAULT 0, skip_count INT DEFAULT 0 ); CREATE TABLE Relationships( parent INTEGER, child INTEGER, instance INT DEFAULT 0, owner DEFAULT '', relationship DEFAULT '' ); CREATE TABLE Defaults( type TEXT DEFAULT '', may_play TEXT DEFAULT true, may_pause TEXT DEFAULT true, may_seek TEXT DEFAULT true, may_next TEXT DEFAULT true, may_previous TEXT DEFAULT true, may_queue TEXT DEFAULT false, is_queued TEXT DEFAULT true, may_order TEXT DEFAULT true, may_like TEXT DEFAULT false, is_liked TEXT DEFAULT '', may_rate TEXT DEFAULT false, rating REAL DEFAULT 0.0, may_star TEXT DEFAULT false, is_starred TEXT DEFAULT false, added_date INT DEFAULT 0, played_date INT DEFAULT 0 ); CREATE TABLE Attributes( parent INTEGER, child INTEGER, instance INT, owner TEXT, may_play TEXT, may_pause TEXT, may_seek TEXT, may_next TEXT, may_previous TEXT, may_queue TEXT, is_queued TEXT, may_order TEXT, may_like TEXT, is_liked TEXT, may_rate TEXT, rating REAL, may_star TEXT, is_starred TEXT, added_date INT, played_date INT ); CREATE INDEX dtypes ON Defaults (type); CREATE INDEX types ON Items (type); CREATE INDEX albums ON Items (album); CREATE INDEX genres ON Items (genre); CREATE UNIQUE INDEX guids ON Items (id); CREATE UNIQUE INDEX relations ON Relationships (parent, child, instance); CREATE UNIQUE INDEX attribs ON Attributes (parent, child, instance, owner); CREATE INDEX parents ON Relationships (parent); CREATE INDEX childs ON Relationships (child); CREATE INDEX instances ON Relationships (instance); CREATE INDEX owners ON Relationships (owner); CREATE INDEX relation ON Relationships (relationship); CREATE INDEX kinds ON Items (kind); CREATE INDEX attrib_parent ON Attributes (parent); CREATE INDEX attrib_child ON Attributes (child); CREATE INDEX attrib_instance ON Attributes (instance); CREATE INDEX attrib_owner ON Attributes (owner); CREATE INDEX names ON Items (name collate nocase); CREATE INDEX artists ON Items (artist collate nocase); explain query plan SELECT R.child, R.instance, R.owner, R.relationship, I.*, NS.rowid AS sort, COALESCE(L1.may_play, L2.may_play, L3.may_play, L4.may_play, L5.may_play, L6.may_play, L7.may_play, L8.may_play, D.may_play) AS may_play, COALESCE(L1.may_pause, L2.may_pause, L3.may_pause, L4.may_pause, L5.may_pause, L6.may_pause, L7.may_pause, L8.may_pause, D.may_pause) AS may_pause, COALESCE(L1.may_seek, L2.may_seek, L3.may_seek, L4.may_seek, L5.may_seek, L6.may_seek, L7.may_seek, L8.may_seek, D.may_seek) AS may_seek, COALESCE(L1.may_next, L2.may_next, L3.may_next, L4.may_next, L5.may_next, L6.may_next, L7.may_next, L8.may_next, D.may_next) AS may_next, COALESCE(L1.may_previous, L2.may_previous, L3.may_previous, L4.may_previous, L5.may_previous, L6.may_previous, L7.may_previous, L8.may_previous, D.may_previous) AS may_previous, COALESCE(L1.may_queue, L2.may_queue, L3.may_queue, L4.may_queue, L5.may_queue, L6.may_queue, L7.may_queue, L8.may_queue, D.may_queue) AS may_queue, COALESCE(L1.is_queued, L2.is_queued, L3.is_queued, L4.is_queued, L5.is_queued, L6.is_queued, L7.is_queued, L8.is_queued, D.is_queued) AS is_queued, COALESCE(L1.may_order, L2.may_order, L3.may_order, L4.may_order, L5.may_order, L6.may_order, L7.may_order, L8.may_order, D.may_order) AS may_order, COALESCE(L1.may_like, L2.may_like, L3.may_like, L4.may_like, L5.may_like, L6.may_like, L7.may_like, L8.may_like, D.may_like) AS may_like, COALESCE(L1.is_liked, L2.is_liked, L3.is_liked, L4.is_liked, L5.is_liked, L6.is_liked, L7.is_liked, L8.is_liked, D.is_liked) AS is_liked, COALESCE(L1.may_rate, L2.may_rate, L3.may_rate, L4.may_rate, L5.may_rate, L6.may_rate, L7.may_rate, L8.may_rate, D.may_rate) AS may_rate, COALESCE(L1.rating, L2.rating, L3.rating, L4.rating, L5.rating, L6.rating, L7.rating, L8.rating, D.rating) AS rating, COALESCE(L1.may_star, L2.may_star, L3.may_star, L4.may_star, L5.may_star, L6.may_star, L7.may_star, L8.may_star, D.may_star) AS may_star, COALESCE(L1.is_starred, L2.is_starred, L3.is_starred, L4.is_starred, L5.is_starred, L6.is_starred, L7.is_starred, L8.is_starred, D.is_starred) AS is_starred, COALESCE(L1.played_date, L2.played_date, L3.played_date, L4.played_date, L5.played_date, L6.played_date, L7.played_date, L8.played_date, D.played_date) AS played_date, COALESCE(L1.added_date, L2.added_date, L3.added_date, L4.added_date, L5.added_date, L6.added_date, L7.added_date, L8.added_date, D.added_date) AS added_date FROM items I INNER JOIN defaults D ON I.type = D.type INNER JOIN relationships R ON R.child = I.uid INNER JOIN (SELECT uid FROM items ORDER BY name COLLATE nocase ASC) NS ON NS.uid = I.uid LEFT OUTER JOIN attributes L1 ON L1.parent = R.parent AND L1.child = R.child AND L1.instance = R.instance AND L1.owner = '' LEFT OUTER JOIN attributes L2 ON L2.parent = R.parent AND L2.child = R.child AND L2.instance = R.instance AND L2.owner IS NULL LEFT OUTER JOIN attributes L3 ON L3.parent = R.parent AND L3.child = R.child AND L3.instance IS NULL AND L3.owner = '' LEFT OUTER JOIN attributes L4 ON L4.parent = R.parent AND L4.child = R.child AND L4.instance IS NULL AND L4.owner IS NULL LEFT OUTER JOIN attributes L5 ON L5.parent = R.parent AND L5.child IS NULL AND L5.instance IS NULL AND L5.owner = '' LEFT OUTER JOIN attributes L6 ON L6.parent = R.parent AND L6.child IS NULL AND L6.instance IS NULL AND L6.owner IS NULL LEFT OUTER JOIN attributes L7 ON L7.parent IS NULL AND L7.child = R.child AND L7.instance IS NULL AND L7.owner = '' LEFT OUTER JOIN attributes L8 ON L8.parent IS NULL AND L8.child = R.child AND L8.instance IS NULL AND L8.owner IS NULL WHERE R.parent = (SELECT parent FROM relationships WHERE rowid = 2) ORDER BY sort ASC LIMIT 100; -- D. Richard Hipp d...@sqlite.org _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users