Hi,

Shouldn't we expect subquery flattening to happen in V2 below?

Mark

CREATE TABLE X ( a PRIMARY KEY, b ) WITHOUT ROWID;
CREATE TABLE Y ( a PRIMARY KEY ) WITHOUT ROWID;
/*
WITH RECURSIVE Q AS (
    SELECT 1 a
    UNION ALL SELECT a + 1 FROM Q
    WHERE a < 100000
)
INSERT INTO X (a, b)
SELECT a, CHAR(a%255) FROM Q;
*/
-- flattening as expected
CREATE VIEW V1 AS
    SELECT * FROM X
    LEFT JOIN (
        SELECT X.* FROM X
    ) Z
    ON Z.a = X.a;

-- no flattening
CREATE VIEW V2 AS
    SELECT * FROM X
    LEFT JOIN (
        SELECT * FROM X
        LEFT JOIN Y ON Y.a = X.a
    ) Z
    ON Z.a = X.a;

-- manually flattened version of V2
CREATE VIEW V2_FLATTENED AS
    SELECT *
    FROM X
    LEFT JOIN X X2
       ON X2.a = X.a
    LEFT JOIN Y
       ON Y.a = X2.a;

SELECT sqlite_version();
EXPLAIN QUERY PLAN SELECT * FROM V1;
/*
0|0|0|SCAN TABLE X
0|1|1|SEARCH TABLE X USING PRIMARY KEY (a=?)
*/

EXPLAIN QUERY PLAN SELECT * FROM V2;
/*
1|0|0|SCAN TABLE X
1|1|1|SEARCH TABLE Y USING PRIMARY KEY (a=?)
0|0|0|SCAN TABLE X
0|1|1|SEARCH SUBQUERY 1 AS Z USING AUTOMATIC COVERING INDEX (a=?)
*/

EXPLAIN QUERY PLAN SELECT * FROM V2_FLATTENED;
/*
0|0|0|SCAN TABLE X
0|1|1|SEARCH TABLE X AS X2 USING PRIMARY KEY (a=?)
0|2|2|SEARCH TABLE Y USING PRIMARY KEY (a=?)
*/

_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to