forked from GreptimeTeam/greptimedb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: supports CTE query (GreptimeTeam#1674)
* feat: supports CTE query * test: move cte test to standalone
- Loading branch information
1 parent
6b6f99c
commit d7a06ba
Showing
9 changed files
with
285 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
create table a(i bigint time index); | ||
|
||
Affected Rows: 0 | ||
|
||
insert into a values (42); | ||
|
||
Affected Rows: 1 | ||
|
||
with cte1 as (Select i as j from a) select * from cte1; | ||
|
||
+----+ | ||
| j | | ||
+----+ | ||
| 42 | | ||
+----+ | ||
|
||
with cte1 as (Select i as j from a) select x from cte1 t1(x); | ||
|
||
+----+ | ||
| x | | ||
+----+ | ||
| 42 | | ||
+----+ | ||
|
||
with cte1(xxx) as (Select i as j from a) select xxx from cte1; | ||
|
||
+-----+ | ||
| xxx | | ||
+-----+ | ||
| 42 | | ||
+-----+ | ||
|
||
with cte1(xxx) as (Select i as j from a) select x from cte1 t1(x); | ||
|
||
+----+ | ||
| x | | ||
+----+ | ||
| 42 | | ||
+----+ | ||
|
||
with cte1 as (Select i as j from a), cte2 as (select ref.j as k from cte1 as ref), cte3 as (select ref2.j+1 as i from cte1 as ref2) select * from cte2 , cte3; | ||
|
||
+----+----+ | ||
| k | i | | ||
+----+----+ | ||
| 42 | 43 | | ||
+----+----+ | ||
|
||
with cte1 as (select i as j from a), cte2 as (select ref.j as k from cte1 as ref), cte3 as (select ref2.j+1 as i from cte1 as ref2) select * from cte2 union all select * FROM cte3 order by 1; | ||
|
||
+----+ | ||
| k | | ||
+----+ | ||
| 42 | | ||
| 43 | | ||
+----+ | ||
|
||
with cte1 as (select 42), cte1 as (select 42) select * FROM cte1; | ||
|
||
Error: 3000(PlanQuery), sql parser error: WITH query name "cte1" specified more than once | ||
|
||
with cte3 as (select ref2.j as i from cte1 as ref2), cte1 as (Select i as j from a), cte2 as (select ref.j+1 as k from cte1 as ref) select * from cte2 union all select * FROM cte3; | ||
|
||
Error: 3000(PlanQuery), Error during planning: Table not found: greptime.public.cte1 | ||
|
||
with cte1 as (Select i as j from a) select * from cte1 cte11, cte1 cte12; | ||
|
||
+----+----+ | ||
| j | j | | ||
+----+----+ | ||
| 42 | 42 | | ||
+----+----+ | ||
|
||
with cte1 as (Select i as j from a) select * from cte1 where j = (select max(j) from cte1 as cte2); | ||
|
||
+----+ | ||
| j | | ||
+----+ | ||
| 42 | | ||
+----+ | ||
|
||
with cte1(x, y) as (select 42 a, 84 b) select zzz, y from cte1 t1(zzz, y); | ||
|
||
+-----+----+ | ||
| zzz | y | | ||
+-----+----+ | ||
| 42 | 84 | | ||
+-----+----+ | ||
|
||
SELECT 1 UNION ALL (WITH cte AS (SELECT 42) SELECT * FROM cte) order by 1; | ||
|
||
+----------+ | ||
| Int64(1) | | ||
+----------+ | ||
| 1 | | ||
| 42 | | ||
+----------+ | ||
|
||
WITH RECURSIVE cte(d) AS ( | ||
SELECT 1 | ||
UNION ALL | ||
(WITH c(d) AS (SELECT * FROM cte) | ||
SELECT d + 1 | ||
FROM c | ||
WHERE FALSE | ||
) | ||
) | ||
SELECT max(d) FROM cte; | ||
|
||
Error: 3000(PlanQuery), This feature is not implemented: Recursive CTEs are not supported | ||
|
||
with cte (a) as ( | ||
select 1 | ||
) | ||
select | ||
a as alias1, | ||
alias1 as alias2 | ||
from cte | ||
where alias2 > 0; | ||
|
||
Error: 3000(PlanQuery), No field named alias2. Valid fields are a. | ||
|
||
drop table a; | ||
|
||
Affected Rows: 1 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
create table a(i bigint time index); | ||
|
||
insert into a values (42); | ||
|
||
with cte1 as (Select i as j from a) select * from cte1; | ||
|
||
with cte1 as (Select i as j from a) select x from cte1 t1(x); | ||
|
||
with cte1(xxx) as (Select i as j from a) select xxx from cte1; | ||
|
||
with cte1(xxx) as (Select i as j from a) select x from cte1 t1(x); | ||
|
||
with cte1 as (Select i as j from a), cte2 as (select ref.j as k from cte1 as ref), cte3 as (select ref2.j+1 as i from cte1 as ref2) select * from cte2 , cte3; | ||
|
||
with cte1 as (select i as j from a), cte2 as (select ref.j as k from cte1 as ref), cte3 as (select ref2.j+1 as i from cte1 as ref2) select * from cte2 union all select * FROM cte3 order by 1; | ||
|
||
with cte1 as (select 42), cte1 as (select 42) select * FROM cte1; | ||
|
||
-- reference to CTE before its actually defined, it's not supported by datafusion | ||
with cte3 as (select ref2.j as i from cte1 as ref2), cte1 as (Select i as j from a), cte2 as (select ref.j+1 as k from cte1 as ref) select * from cte2 union all select * FROM cte3; | ||
|
||
with cte1 as (Select i as j from a) select * from cte1 cte11, cte1 cte12; | ||
|
||
with cte1 as (Select i as j from a) select * from cte1 where j = (select max(j) from cte1 as cte2); | ||
|
||
with cte1(x, y) as (select 42 a, 84 b) select zzz, y from cte1 t1(zzz, y); | ||
|
||
SELECT 1 UNION ALL (WITH cte AS (SELECT 42) SELECT * FROM cte) order by 1; | ||
|
||
-- Recursive CTEs are not supported in datafusion | ||
WITH RECURSIVE cte(d) AS ( | ||
SELECT 1 | ||
UNION ALL | ||
(WITH c(d) AS (SELECT * FROM cte) | ||
SELECT d + 1 | ||
FROM c | ||
WHERE FALSE | ||
) | ||
) | ||
SELECT max(d) FROM cte; | ||
|
||
-- Nested aliases is not supported in datafusion | ||
with cte (a) as ( | ||
select 1 | ||
) | ||
select | ||
a as alias1, | ||
alias1 as alias2 | ||
from cte | ||
where alias2 > 0; | ||
|
||
drop table a; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
create table a(i bigint time index); | ||
|
||
Affected Rows: 0 | ||
|
||
insert into a values (42); | ||
|
||
Affected Rows: 1 | ||
|
||
with cte1 as (Select i as j from a) select * from cte1; | ||
|
||
+----+ | ||
| j | | ||
+----+ | ||
| 42 | | ||
+----+ | ||
|
||
with cte1 as (with b as (Select i as j from a) Select j from b) select x from cte1 t1(x); | ||
|
||
+----+ | ||
| x | | ||
+----+ | ||
| 42 | | ||
+----+ | ||
|
||
with cte1(xxx) as (with ncte(yyy) as (Select i as j from a) Select yyy from ncte) select xxx from cte1; | ||
|
||
+-----+ | ||
| xxx | | ||
+-----+ | ||
| 42 | | ||
+-----+ | ||
|
||
with cte1 as (with b as (Select i as j from a) select j from b), cte2 as (with c as (select ref.j+1 as k from cte1 as ref) select k from c) select * from cte1 , cte2; | ||
|
||
+----+----+ | ||
| j | k | | ||
+----+----+ | ||
| 42 | 43 | | ||
+----+----+ | ||
|
||
with cte1 as (select 42), cte1 as (select 42) select * FROM cte1; | ||
|
||
Error: 3000(PlanQuery), sql parser error: WITH query name "cte1" specified more than once | ||
|
||
with cte1 as (Select i as j from a) select * from (with cte2 as (select max(j) as j from cte1) select * from cte2) f; | ||
|
||
+----+ | ||
| j | | ||
+----+ | ||
| 42 | | ||
+----+ | ||
|
||
with cte1 as (Select i as j from a) select * from cte1 where j = (with cte2 as (select max(j) as j from cte1) select j from cte2); | ||
|
||
Error: 3001(EngineExecuteQuery), This feature is not implemented: Physical plan does not support logical expression (<subquery>) | ||
|
||
with cte as (Select i as j from a) select * from cte where j = (with cte as (select max(j) as j from cte) select j from cte); | ||
|
||
Error: 3000(PlanQuery), sql parser error: WITH query name "cte" specified more than once | ||
|
||
with cte as (select * from cte) select * from cte; | ||
|
||
Error: 3000(PlanQuery), Error during planning: Table not found: greptime.public.cte | ||
|
||
drop table a; | ||
|
||
Affected Rows: 1 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
create table a(i bigint time index); | ||
|
||
insert into a values (42); | ||
|
||
with cte1 as (Select i as j from a) select * from cte1; | ||
|
||
with cte1 as (with b as (Select i as j from a) Select j from b) select x from cte1 t1(x); | ||
|
||
with cte1(xxx) as (with ncte(yyy) as (Select i as j from a) Select yyy from ncte) select xxx from cte1; | ||
|
||
with cte1 as (with b as (Select i as j from a) select j from b), cte2 as (with c as (select ref.j+1 as k from cte1 as ref) select k from c) select * from cte1 , cte2; | ||
|
||
with cte1 as (select 42), cte1 as (select 42) select * FROM cte1; | ||
|
||
with cte1 as (Select i as j from a) select * from (with cte2 as (select max(j) as j from cte1) select * from cte2) f; | ||
|
||
-- Refer to CTE in subquery expression, | ||
-- this feature is not implemented in datafusion | ||
with cte1 as (Select i as j from a) select * from cte1 where j = (with cte2 as (select max(j) as j from cte1) select j from cte2); | ||
|
||
-- Refer to same-named CTE in a subquery expression | ||
-- this feature is not implemented in datafusion | ||
with cte as (Select i as j from a) select * from cte where j = (with cte as (select max(j) as j from cte) select j from cte); | ||
|
||
-- self-refer to non-existent cte- | ||
with cte as (select * from cte) select * from cte; | ||
|
||
drop table a; |