Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat(optimizer): expand join constructs into SELECT * from subqueries #1560

Merged
merged 10 commits into from
May 6, 2023

Conversation

georgesittas
Copy link
Collaborator

Fixes #1554

Click this to see the execution of all added test cases in both trino and postgres.

Trino

trino> WITH tbl AS (SELECT 1) SELECT * FROM (tbl AS tbl) AS _q_0; -- Only valid in Trino, postgres doesn't allow this
 _col0 
-------
     1 
(1 row)

trino> WITH tbl AS (SELECT 1) SELECT * FROM ((tbl AS tbl)) AS _q_0;
 _col0 
-------
     1 
(1 row)

trino> WITH tbl AS (SELECT 1) SELECT * FROM (((tbl AS tbl))) AS _q_0;
 _col0 
-------
     1 
(1 row)

trino> WITH tbl AS (SELECT 1) SELECT * FROM (SELECT * FROM tbl AS tbl) AS _q_0; -- optimized
 _col0 
-------
     1 
(1 row)

trino> WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM (tbl1 AS tbl1 JOIN tbl2 AS tbl2 ON id1 = id2 JOIN tbl3 AS tbl3 ON id1 = id3) AS _q_0;
 id1 | id2 | id3 
-----+-----+-----
   1 |   1 |   1 
(1 row)

trino> WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM ((tbl1 AS tbl1 JOIN tbl2 AS tbl2 ON id1 = id2 JOIN tbl3 AS tbl3 ON id1 = id3)) AS _q_0;
 id1 | id2 | id3 
-----+-----+-----
   1 |   1 |   1 
(1 row)

trino> WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM (SELECT * FROM tbl1 AS tbl1 JOIN tbl2 AS tbl2 ON id1 = id2 JOIN tbl3 AS tbl3 ON id1 = id3) AS _q_0; -- optimized
 id1 | id2 | id3 
-----+-----+-----
   1 |   1 |   1 
(1 row)

trino> WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM (tbl1 AS tbl1 JOIN (tbl2 AS tbl2 JOIN tbl3 AS tbl3 ON id2 = id3) AS _q_0 ON id1 = id3) AS _q_1;;
 id1 | id2 | id3 
-----+-----+-----
   1 |   1 |   1 
(1 row)

trino> WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM (SELECT * FROM tbl1 AS tbl1 JOIN (SELECT * FROM tbl2 AS tbl2 JOIN tbl3 AS tbl3 ON id2 = id3) AS _q_0 ON id1 = id3) AS _q_1; -- optimized
 id1 | id2 | id3 
-----+-----+-----
   1 |   1 |   1 
(1 row)

Postgres

georgesittas=# WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM (tbl1 AS tbl1 JOIN tbl2 AS tbl2 ON id1 = id2 JOIN tbl3 AS tbl3 ON id1 = id3) AS _q_0;
 id1 | id2 | id3
-----+-----+-----
   1 |   1 |   1
(1 row)

georgesittas=# WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM ((tbl1 AS tbl1 JOIN tbl2 AS tbl2 ON id1 = id2 JOIN tbl3 AS tbl3 ON id1 = id3)) AS _q_0;
 id1 | id2 | id3
-----+-----+-----
   1 |   1 |   1
(1 row)

georgesittas=# WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM (SELECT * FROM tbl1 AS tbl1 JOIN tbl2 AS tbl2 ON id1 = id2 JOIN tbl3 AS tbl3 ON id1 = id3) AS _q_0; -- optimized
 id1 | id2 | id3
-----+-----+-----
   1 |   1 |   1
(1 row)

georgesittas=# WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM (tbl1 AS tbl1 JOIN (tbl2 AS tbl2 JOIN tbl3 AS tbl3 ON id2 = id3) AS _q_0 ON id1 = id3) AS _q_1;
 id1 | id2 | id3
-----+-----+-----
   1 |   1 |   1
(1 row)

georgesittas=# WITH tbl1(id1) AS (SELECT 1), tbl2(id2) AS (SELECT 1), tbl3(id3) AS (SELECT 1) SELECT * FROM (SELECT * FROM tbl1 AS tbl1 JOIN (SELECT * FROM tbl2 AS tbl2 JOIN tbl3 AS tbl3 ON id2 = id3) AS _q_0 ON id1 = id3) AS _q_1; -- optimized
 id1 | id2 | id3
-----+-----+-----
   1 |   1 |   1
(1 row)

@georgesittas georgesittas requested review from tobymao and barakalon May 5, 2023 19:18
sqlglot/optimizer/expand_join_constructs.py Outdated Show resolved Hide resolved
sqlglot/optimizer/expand_join_constructs.py Outdated Show resolved Hide resolved
sqlglot/optimizer/expand_join_constructs.py Outdated Show resolved Hide resolved
@georgesittas
Copy link
Collaborator Author

@barakalon thanks for the review! I did a refactor using transform instead of scopes. Let me know what you think.

Copy link
Collaborator

@barakalon barakalon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Much cleaner 👍

@tobymao tobymao merged commit fb819f0 into main May 6, 2023
@tobymao tobymao deleted the jo/expand_join_constructs branch May 6, 2023 01:55
adrianisk pushed a commit to adrianisk/sqlglot that referenced this pull request Jun 21, 2023
…tobymao#1560)

* Feat(optimizer): expand join constructs into SELECT * from subqueries

* Mypy fixup

* Remove unnecessary copying

* Refactor

* Fixup

* Formatting

* Formatting

* Simplify even more

* Don't copy on transform

* Move transformation in qualify_tables
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

build_scope and optimize fail on query
3 participants