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

Reply via email to