-
Notifications
You must be signed in to change notification settings - Fork 46
Open
Description
We have found a scenario in which a CTE's materialization is lost in the resulting SQL:
When defining using .with.materialized(...) within a UNION ALL subquery, the CTE is ultimately defined without the MATERIALIZED keyword.
User
.union_all(User.with.materialized(highly_liked: ProfileL.where("likes > 300")))
.union_all(User.with(barely_liked: ProfileL.where("likes < 100")))
=>
WITH
"highly_liked" AS (SELECT "profile_ls".* FROM "profile_ls" WHERE (likes > 300)),
"barely_liked" AS (SELECT "profile_ls".* FROM "profile_ls" WHERE (likes < 100))
SELECT
"users".*
FROM (...)
When defining the CTEs at the top level, however, it works as expected:
User
.with.materialized(highly_liked: ProfileL.where("likes > 300"))
.with(barely_liked: ProfileL.where("likes < 100"))
.union_all(...)
.union_all(...)
=>
WITH
"highly_liked" AS MATERIALIZED (SELECT "profile_ls".* FROM "profile_ls" WHERE (likes > 300)),
"barely_liked" AS (SELECT "profile_ls".* FROM "profile_ls" WHERE (likes < 100))
SELECT
"users".*
FROM (...)
Is this expected behaviour? I have seen your comment on piping, but I don't think it applies to this particular example.
Many thanks
Metadata
Metadata
Assignees
Labels
No labels