123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988 |
- # Copyright Materialize, Inc. and contributors. All rights reserved.
- #
- # Use of this software is governed by the Business Source License
- # included in the LICENSE file at the root of this repository.
- #
- # As of the Change Date specified in that file, in accordance with
- # the Business Source License, use of this software will be governed
- # by the Apache License, Version 2.0.
- mode cockroach
- statement ok
- CREATE TABLE t1(f1 int, f2 int)
- statement ok
- CREATE TABLE t2(f1 int, f2 int)
- statement ok
- INSERT INTO t1 VALUES (1, 2)
- # regression test for database-issues#2192: a filter on COUNT aggregation must not trigger the outer to inner join conversion
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having count(t2.f1) >= 0;
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %0:l0[#0{f1}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 2 }
- Filter (#1{count_f1} >= 0) // { arity: 2 }
- Reduce group_by=[#0{f1}] aggregates=[count(#1{f1})] // { arity: 2 }
- Union // { arity: 2 }
- Map (null) // { arity: 2 }
- Union // { arity: 1 }
- Negate // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %1[#0]UKA » %0:l0[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Get l1 // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Project (#0{f1}, #0{f1}) // { arity: 2 }
- Get l1 // { arity: 1 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- query II
- select t1.f1, count(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having count(t2.f1) >= 0;
- ----
- 1 0
- # ... but a filter on any other aggregation should convert a left join into an inner join if its parameter comes from the non-preserving side
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, sum(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having sum(t2.f1) >= 0;
- ----
- Explained Query:
- Filter (#1{sum_f1} >= 0) // { arity: 2 }
- Reduce group_by=[#0{f1}] aggregates=[sum(#0{f1})] // { arity: 2 }
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %0:t1[#0{f1}]K » %1:t2[#0{f1}]K
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Source materialize.public.t1
- filter=((#0{f1}) IS NOT NULL)
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- query II
- select t1.f1, sum(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having sum(t2.f1) >= 0;
- ----
- # multiple aggregations
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t2.f1), sum(t2.f1), max(t2.f1), min(t2.f1), count(t1.f2), sum(t1.f2), min(t1.f2), max(t1.f2) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1;
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}, #1{f2}) // { arity: 2 }
- Join on=(#0{f1} = #2{f1}) type=differential // { arity: 3 }
- implementation
- %0:l0[#0{f1}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 9 }
- Reduce group_by=[#0{f1}] aggregates=[count(#2{f1}), sum(#2{f1}), max(#2{f1}), min(#2{f1}), count(#1{f2}), sum(#1{f2}), min(#1{f2}), max(#1{f2})] // { arity: 9 }
- Union // { arity: 3 }
- Map (null) // { arity: 3 }
- Union // { arity: 2 }
- Negate // { arity: 2 }
- Project (#0{f1}, #1{f2}) // { arity: 2 }
- Join on=(#0{f1} = #2{f1}) type=differential // { arity: 3 }
- implementation
- %1[#0]UKA » %0:l0[#0{f1}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Get l1 // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Project (#0{f1}, #1{f2}, #0{f1}) // { arity: 3 }
- Get l1 // { arity: 2 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t2.f1), sum(t2.f1), max(t2.f1), min(t2.f1), count(t1.f2), sum(t1.f2), min(t1.f2), max(t1.f2) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having sum(t1.f2) >= 0;
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}, #1{f2}) // { arity: 2 }
- Join on=(#0{f1} = #2{f1}) type=differential // { arity: 3 }
- implementation
- %0:l0[#0{f1}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 9 }
- Filter (#6{sum_f2} >= 0) // { arity: 9 }
- Reduce group_by=[#0{f1}] aggregates=[count(#2{f1}), sum(#2{f1}), max(#2{f1}), min(#2{f1}), count(#1{f2}), sum(#1{f2}), min(#1{f2}), max(#1{f2})] // { arity: 9 }
- Union // { arity: 3 }
- Map (null) // { arity: 3 }
- Union // { arity: 2 }
- Negate // { arity: 2 }
- Project (#0{f1}, #1{f2}) // { arity: 2 }
- Join on=(#0{f1} = #2{f1}) type=differential // { arity: 3 }
- implementation
- %1[#0]UKA » %0:l0[#0{f1}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Get l1 // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Project (#0{f1}, #1{f2}, #0{f1}) // { arity: 3 }
- Get l1 // { arity: 2 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t2.f1), sum(t2.f1), max(t2.f1), min(t2.f1), count(t1.f2), sum(t1.f2), min(t1.f2), max(t1.f2) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having sum(t2.f1) >= 0;
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}, #1{f2}) // { arity: 2 }
- Join on=(#0{f1} = #2{f1}) type=differential // { arity: 3 }
- implementation
- %0:l0[#0{f1}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 9 }
- Filter (#2{sum_f1} >= 0) // { arity: 9 }
- Reduce group_by=[#0{f1}] aggregates=[count(#2{f1}), sum(#2{f1}), max(#2{f1}), min(#2{f1}), count(#1{f2}), sum(#1{f2}), min(#1{f2}), max(#1{f2})] // { arity: 9 }
- Union // { arity: 3 }
- Map (null) // { arity: 3 }
- Union // { arity: 2 }
- Negate // { arity: 2 }
- Project (#0{f1}, #1{f2}) // { arity: 2 }
- Join on=(#0{f1} = #2{f1}) type=differential // { arity: 3 }
- implementation
- %1[#0]UKA » %0:l0[#0{f1}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Get l1 // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Project (#0{f1}, #1{f2}, #0{f1}) // { arity: 3 }
- Get l1 // { arity: 2 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- # count is never null, predicate removed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t1.f2) from t1 group by t1.f1 having count(t1.f2) is not null;
- ----
- Explained Query:
- Reduce group_by=[#0{f1}] aggregates=[count(#1{f2})] // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Source materialize.public.t1
- Target cluster: quickstart
- EOF
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, sum(t1.f2) from t1 group by t1.f1 having sum(t1.f2) is not null;
- ----
- Explained Query:
- Filter (#1{sum_f2}) IS NOT NULL // { arity: 2 }
- Reduce group_by=[#0{f1}] aggregates=[sum(#1{f2})] // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Source materialize.public.t1
- Target cluster: quickstart
- EOF
- # outer-to-inner-join conversion allowed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, sum(t2.f1), max(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having max(t2.f1) >= 0;
- ----
- Explained Query:
- Reduce group_by=[#0{f1}] aggregates=[sum(#0{f1}), max(#0{f1})] // { arity: 3 }
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %0:t1[#0{f1}]Kif » %1:t2[#0{f1}]Kiif
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1} >= 0) // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1} >= 0) // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Source materialize.public.t1
- filter=((#0{f1} >= 0))
- Source materialize.public.t2
- filter=((#0{f1} >= 0))
- Target cluster: quickstart
- EOF
- # outer-to-inner-join conversion allowed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, sum(t2.f1), max(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having max(t2.f1) >= 0 and sum(t2.f1) >= 0;
- ----
- Explained Query:
- Filter (#1{sum_f1} >= 0) // { arity: 3 }
- Reduce group_by=[#0{f1}] aggregates=[sum(#0{f1}), max(#0{f1})] // { arity: 3 }
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %0:t1[#0{f1}]Kif » %1:t2[#0{f1}]Kiif
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1} >= 0) // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1} >= 0) // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Source materialize.public.t1
- filter=((#0{f1} >= 0))
- Source materialize.public.t2
- filter=((#0{f1} >= 0))
- Target cluster: quickstart
- EOF
- # outer-to-inner-join conversion allowed, but we fail to detect this case
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, sum(t2.f2), max(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having max(t2.f1) >= 0;
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}, #2{f2}) // { arity: 2 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 3 }
- implementation
- %0:l0[#0{f1}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 3 }
- Filter (#2{max_f1} >= 0) // { arity: 3 }
- Reduce group_by=[#0{f1}] aggregates=[sum(#2{f2}), max(#1{f1})] // { arity: 3 }
- Union // { arity: 3 }
- Map (null, null) // { arity: 3 }
- Union // { arity: 1 }
- Negate // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %1[#0]UKA » %0:l0[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Get l1 // { arity: 2 }
- Project (#0{f1}) // { arity: 1 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Project (#0{f1}, #0{f1}, #1{f2}) // { arity: 3 }
- Get l1 // { arity: 2 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- # outer-to-inner-join conversion allowed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, sum(t2.f1 + t2.f2), max(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having max(t2.f1) >= 0;
- ----
- Explained Query:
- Reduce group_by=[#0{f1}] aggregates=[sum((#0{f1} + #1{f2})), max(#0{f1})] // { arity: 3 }
- Project (#0{f1}, #2{f2}) // { arity: 2 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 3 }
- implementation
- %0:t1[#0{f1}]Kif » %1:t2[#0{f1}]Kiif
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1} >= 0) // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1} >= 0) // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Source materialize.public.t1
- filter=((#0{f1} >= 0))
- Source materialize.public.t2
- filter=((#0{f1} >= 0))
- Target cluster: quickstart
- EOF
- # outer-to-inner-join conversion allowed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, sum(t1.f1 + t2.f1), max(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having max(t2.f1) >= 0;
- ----
- Explained Query:
- Reduce group_by=[#0{f1}] aggregates=[sum((#0{f1} + #0{f1})), max(#0{f1})] // { arity: 3 }
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %0:t1[#0{f1}]Kif » %1:t2[#0{f1}]Kiif
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1} >= 0) // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1} >= 0) // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Source materialize.public.t1
- filter=((#0{f1} >= 0))
- Source materialize.public.t2
- filter=((#0{f1} >= 0))
- Target cluster: quickstart
- EOF
- # outer-to-inner-join conversion not allowed since that would alter the result of sum(t1.f1)
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, sum(t1.f1), max(t2.f1) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having max(t2.f1) >= 0;
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %0:l0[#0{f1}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 3 }
- Filter (#2{max_f1} >= 0) // { arity: 3 }
- Reduce group_by=[#0{f1}] aggregates=[sum(#0{f1}), max(#1{f1})] // { arity: 3 }
- Union // { arity: 2 }
- Map (null) // { arity: 2 }
- Union // { arity: 1 }
- Negate // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %1[#0]UKA » %0:l0[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Get l1 // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Project (#0{f1}, #0{f1}) // { arity: 2 }
- Get l1 // { arity: 1 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- # outer join to inner join conversion not allowed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t2.f2) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1;
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}, #2{f2}) // { arity: 2 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 3 }
- implementation
- %0:l0[#0{f1}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 2 }
- Reduce group_by=[#0{f1}] aggregates=[count(#1{f2})] // { arity: 2 }
- Union // { arity: 2 }
- Map (null) // { arity: 2 }
- Union // { arity: 1 }
- Negate // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %1[#0]UKA » %0:l0[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Get l1 // { arity: 2 }
- Project (#0{f1}) // { arity: 1 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Get l1 // { arity: 2 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- # outer join to inner join conversion not allowed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t2.f2), max(t2.f2) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1;
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}, #2{f2}) // { arity: 2 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 3 }
- implementation
- %0:l0[#0{f1}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 3 }
- Reduce group_by=[#0{f1}] aggregates=[count(#1{f2}), max(#1{f2})] // { arity: 3 }
- Union // { arity: 2 }
- Map (null) // { arity: 2 }
- Union // { arity: 1 }
- Negate // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %1[#0]UKA » %0:l0[#0{f1}]K
- Get l0 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Get l1 // { arity: 2 }
- Project (#0{f1}) // { arity: 1 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Get l1 // { arity: 2 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- # outer join to inner join conversion allowed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t2.f2), max(t2.f2) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having max(t2.f2) > 0;
- ----
- Explained Query:
- Filter (#2{max_f2} > 0) // { arity: 3 }
- Reduce group_by=[#0{f1}] aggregates=[count(#1{f2}), max(#1{f2})] // { arity: 3 }
- Project (#0{f1}, #2{f2}) // { arity: 2 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 3 }
- implementation
- %0:t1[#0{f1}]K » %1:t2[#0{f1}]K
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Source materialize.public.t1
- filter=((#0{f1}) IS NOT NULL)
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- # outer join to inner join conversion allowed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, max(t1.f1 + t2.f2), sum(t1.f2 + t2.f2) from t1 LEFT JOIN t2 ON t1.f1 = t2.f1 group by t1.f1 having max(t1.f1 + t2.f2) > 0;
- ----
- Explained Query:
- Filter (#1{max} > 0) // { arity: 3 }
- Reduce group_by=[#0{f1}] aggregates=[max((#0{f1} + #2{f2})), sum((#1{f2} + #2{f2}))] // { arity: 3 }
- Project (#0{f1}, #1{f2}, #3{f2}) // { arity: 3 }
- Join on=(#0{f1} = #2{f1}) type=differential // { arity: 4 }
- implementation
- %0:t1[#0{f1}]K » %1:t2[#0{f1}]K
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Source materialize.public.t1
- filter=((#0{f1}) IS NOT NULL)
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- # check that a filter on a non-count aggregation doesn't change the COUNT value
- statement ok
- drop table t1
- statement ok
- drop table t2
- statement ok
- create table t1(f1 integer, f2 integer)
- statement ok
- create table t2(f1 integer, f2 integer)
- statement ok
- insert into t1 values (1, 0), (1, 1), (1, 1)
- statement ok
- insert into t2 values (0, 2)
- query III
- select t1.f1, count(t1.f2), max(t2.f2) from t1 left join t2 on t1.f2 = t2.f1 group by t1.f1
- ----
- 1 3 2
- query III
- select t1.f1, count(t1.f2), max(t2.f2) from t1 left join t2 on t1.f2 = t2.f1 group by t1.f1 having max(t2.f2) > 0
- ----
- 1 3 2
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t1.f2), max(t2.f2) from t1 left join t2 on t1.f2 = t2.f1 group by t1.f1
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#1{f2}]] // { arity: 2 }
- Filter (#1{f2}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}, #1{f2}, #3{f2}) // { arity: 3 }
- Join on=(#1{f2} = #2{f1}) type=differential // { arity: 4 }
- implementation
- %0:l0[#1{f2}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 3 }
- Reduce group_by=[#0{f1}] aggregates=[count(#1{f2}), max(#2{f2})] // { arity: 3 }
- Union // { arity: 3 }
- Map (null) // { arity: 3 }
- Union // { arity: 2 }
- Negate // { arity: 2 }
- Project (#0{f1}, #1{f2}) // { arity: 2 }
- Join on=(#1{f2} = #2{f2}) type=differential // { arity: 3 }
- implementation
- %1[#0]UKA » %0:l0[#1{f2}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f2}]] // { arity: 1 }
- Distinct project=[#0{f2}] // { arity: 1 }
- Project (#1{f2}) // { arity: 1 }
- Get l1 // { arity: 3 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Get l1 // { arity: 3 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, count(t1.f2), max(t2.f2) from t1 left join t2 on t1.f2 = t2.f1 group by t1.f1 having max(t2.f2) > 0
- ----
- Explained Query:
- With
- cte l0 =
- ArrangeBy keys=[[#1{f2}]] // { arity: 2 }
- Filter (#1{f2}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- cte l1 =
- Project (#0{f1}, #1{f2}, #3{f2}) // { arity: 3 }
- Join on=(#1{f2} = #2{f1}) type=differential // { arity: 4 }
- implementation
- %0:l0[#1{f2}]K » %1:t2[#0{f1}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Return // { arity: 3 }
- Filter (#2{max_f2} > 0) // { arity: 3 }
- Reduce group_by=[#0{f1}] aggregates=[count(#1{f2}), max(#2{f2})] // { arity: 3 }
- Union // { arity: 3 }
- Map (null) // { arity: 3 }
- Union // { arity: 2 }
- Negate // { arity: 2 }
- Project (#0{f1}, #1{f2}) // { arity: 2 }
- Join on=(#1{f2} = #2{f2}) type=differential // { arity: 3 }
- implementation
- %1[#0]UKA » %0:l0[#1{f2}]K
- Get l0 // { arity: 2 }
- ArrangeBy keys=[[#0{f2}]] // { arity: 1 }
- Distinct project=[#0{f2}] // { arity: 1 }
- Project (#1{f2}) // { arity: 1 }
- Get l1 // { arity: 3 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- Get l1 // { arity: 3 }
- Source materialize.public.t1
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- # if the count is removed, the outer join can be safely converted into an inner join
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR select t1.f1, max(t2.f2) from t1 left join t2 on t1.f2 = t2.f1 group by t1.f1 having max(t2.f2) > 0
- ----
- Explained Query:
- Filter (#1{max_f2} > 0) // { arity: 2 }
- Reduce group_by=[#0{f1}] aggregates=[max(#1{f2})] // { arity: 2 }
- Project (#0{f1}, #3{f2}) // { arity: 2 }
- Join on=(#1{f2} = #2{f1}) type=differential // { arity: 4 }
- implementation
- %0:t1[#1{f2}]K » %1:t2[#0{f1}]K
- ArrangeBy keys=[[#1{f2}]] // { arity: 2 }
- Filter (#1{f2}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 2 }
- Filter (#0{f1}) IS NOT NULL // { arity: 2 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- Source materialize.public.t1
- filter=((#1{f2}) IS NOT NULL)
- Source materialize.public.t2
- filter=((#0{f1}) IS NOT NULL)
- Target cluster: quickstart
- EOF
- # regression test for database-issues#2190
- statement ok
- drop table t1
- statement ok
- create table t1(f1 integer)
- statement ok
- insert into t1 values (0), (1)
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT * FROM (SELECT 123, COUNT(right_table.f1) AS aggregate FROM t1 AS left_table LEFT JOIN t1 AS right_table ON FALSE GROUP BY 1) AS subquery, t1 AS outer_table WHERE outer_table.f1 = subquery.aggregate;
- ----
- Explained Query:
- Project (#2, #1, #0{f1}) // { arity: 3 }
- Filter (0 = integer_to_bigint(#0{f1})) // { arity: 3 }
- Map (0, 123) // { arity: 3 }
- ReadStorage materialize.public.t1 // { arity: 1 }
- Source materialize.public.t1
- filter=((0 = integer_to_bigint(#0{f1})))
- Target cluster: quickstart
- EOF
- query III
- SELECT * FROM (SELECT 123, COUNT(right_table.f1) AS aggregate FROM t1 AS left_table LEFT JOIN t1 AS right_table ON FALSE GROUP BY 1) AS subquery, t1 AS outer_table WHERE outer_table.f1 = subquery.aggregate;
- ----
- 123 0 0
- # non-null requirement on a non-count aggregation coming from a join predicate
- statement ok
- drop table t1
- statement ok
- drop table t2
- statement ok
- create table t1(f1 integer, f2 integer not null)
- statement ok
- insert into t1 values (null, 0)
- statement ok
- create table t2(f1 integer, f2 integer)
- statement ok
- insert into t2 values (null, 0)
- statement ok
- create table t3(f1 integer, f2 integer)
- statement ok
- insert into t3 values (null, 0), (null, 0), (1, 1), (6, 6)
- query I
- SELECT derived.agg1 FROM t1
- JOIN (
- SELECT COUNT(*) AS agg1 , MAX(t2.f2) AS agg2
- FROM t2
- RIGHT JOIN t3 ON t3.f2 = 6
- ) AS derived ON TRUE
- WHERE t1.f2 = derived.agg2;
- ----
- 4
- # the count aggregation prevents the outer-to-inner join conversion
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT derived.agg1 FROM t1
- JOIN (
- SELECT COUNT(*) AS agg1 , MAX(t2.f2) AS agg2
- FROM t2
- RIGHT JOIN t3 ON t3.f2 = 6
- ) AS derived ON TRUE
- WHERE t1.f2 = derived.agg2;
- ----
- Explained Query:
- With
- cte l0 =
- CrossJoin type=differential // { arity: 2 }
- implementation
- %1:t3[×]ef » %0:t2[×]ef
- ArrangeBy keys=[[]] // { arity: 1 }
- Project (#1{f2}) // { arity: 1 }
- ReadStorage materialize.public.t2 // { arity: 2 }
- ArrangeBy keys=[[]] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Filter (#1{f2} = 6) // { arity: 2 }
- ReadStorage materialize.public.t3 // { arity: 2 }
- Return // { arity: 1 }
- Project (#1{count}) // { arity: 1 }
- Join on=(#0{f2} = #2{max_f2}) type=differential // { arity: 3 }
- implementation
- %1[#1{agg2}]UK » %0:t1[#0{f2}]K
- ArrangeBy keys=[[#0{f2}]] // { arity: 1 }
- Project (#1{f2}) // { arity: 1 }
- ReadStorage materialize.public.t1 // { arity: 2 }
- ArrangeBy keys=[[#1{max_f2}]] // { arity: 2 }
- Filter (#1{max_f2}) IS NOT NULL // { arity: 2 }
- Reduce aggregates=[count(*), max(#0{f2})] // { arity: 2 }
- Union // { arity: 1 }
- Project (#0{f2}) // { arity: 1 }
- Get l0 // { arity: 2 }
- Project (#4) // { arity: 1 }
- Map (null) // { arity: 5 }
- Join on=(#0{f1} = #2{f1} AND #1{f2} = #3{f2}) type=differential // { arity: 4 }
- implementation
- %0[#0, #1]KK » %1:t3[#0, #1]KK
- ArrangeBy keys=[[#0{f1}, #1{f2}]] // { arity: 2 }
- Union // { arity: 2 }
- Negate // { arity: 2 }
- Map (6) // { arity: 2 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Project (#1{f1}) // { arity: 1 }
- Get l0 // { arity: 2 }
- Distinct project=[#0{f1}, #1{f2}] // { arity: 2 }
- ReadStorage materialize.public.t3 // { arity: 2 }
- ArrangeBy keys=[[#0{f1}, #1{f2}]] // { arity: 2 }
- ReadStorage materialize.public.t3 // { arity: 2 }
- Source materialize.public.t1
- Source materialize.public.t2
- Source materialize.public.t3
- Target cluster: quickstart
- EOF
- statement ok
- DROP TABLE t1;
- statement ok
- CREATE TABLE t1 (f1 INTEGER NOT NULL);
- statement ok
- INSERT INTO t1 VALUES (1);
- statement ok
- DROP TABLE t2;
- statement ok
- CREATE TABLE t2 (f1 INTEGER NOT NULL);
- statement ok
- INSERT INTO t2 VALUES (1);
- statement ok
- INSERT INTO t2 VALUES (2);
- # outer-to-inner join conversion not allowed
- query T multiline
- EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR SELECT SUM(t1.f1 + t2.f1), SUM(t2.f1 + 0)
- FROM t2
- LEFT JOIN t1
- ON t1.f1 < t2.f1
- HAVING SUM(t1.f1 + t2.f1) > 0;
- ----
- Explained Query:
- With
- cte l0 =
- Filter (#1{f1} < #0{f1}) // { arity: 2 }
- CrossJoin type=differential // { arity: 2 }
- implementation
- %0:t2[×] » %1:t1[×]
- ArrangeBy keys=[[]] // { arity: 1 }
- ReadStorage materialize.public.t2 // { arity: 1 }
- ArrangeBy keys=[[]] // { arity: 1 }
- ReadStorage materialize.public.t1 // { arity: 1 }
- Return // { arity: 2 }
- Filter (#0{sum} > 0) // { arity: 2 }
- Reduce aggregates=[sum((#1{f1} + #0{f1})), sum((#0{f1} + 0))] // { arity: 2 }
- Union // { arity: 2 }
- Get l0 // { arity: 2 }
- Project (#0{f1}, #2) // { arity: 2 }
- Map (null) // { arity: 3 }
- Join on=(#0{f1} = #1{f1}) type=differential // { arity: 2 }
- implementation
- %0[#0]K » %1:t2[#0]K
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- Union // { arity: 1 }
- Negate // { arity: 1 }
- Distinct project=[#0{f1}] // { arity: 1 }
- Project (#0{f1}) // { arity: 1 }
- Get l0 // { arity: 2 }
- Distinct project=[#0{f1}] // { arity: 1 }
- ReadStorage materialize.public.t2 // { arity: 1 }
- ArrangeBy keys=[[#0{f1}]] // { arity: 1 }
- ReadStorage materialize.public.t2 // { arity: 1 }
- Source materialize.public.t1
- Source materialize.public.t2
- Target cluster: quickstart
- EOF
- query II
- SELECT SUM(t1.f1 + t2.f1), SUM(t2.f1 + 0)
- FROM t2
- LEFT JOIN t1
- ON t1.f1 < t2.f1
- HAVING SUM(t1.f1 + t2.f1) > 0;
- ----
- 3 3
|