From 718d3204556a1bf6d09f577bf81a35b668be406e Mon Sep 17 00:00:00 2001 From: freemine Date: Mon, 23 Dec 2024 14:00:04 +0800 Subject: [PATCH 01/11] 1. make lemon warning as error, so that no syntax conflicts in sql.y exists 2. resolving joined_table syntax conflicts --- source/libs/parser/CMakeLists.txt | 2 +- source/libs/parser/inc/sql.y | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/parser/CMakeLists.txt b/source/libs/parser/CMakeLists.txt index bd2dd95ee0..088cdc4368 100644 --- a/source/libs/parser/CMakeLists.txt +++ b/source/libs/parser/CMakeLists.txt @@ -7,7 +7,7 @@ ENDIF() add_custom_command( OUTPUT ${TD_SOURCE_DIR}/source/libs/parser/src/sql.c ${TD_SOURCE_DIR}/include/common/ttokenauto.h COMMAND echo "Running lemon process in ${TD_SOURCE_DIR}/source/libs/parser/inc" - COMMAND ${TD_CONTRIB_DIR}/lemon/lemon sql.y || true + COMMAND ${TD_CONTRIB_DIR}/lemon/lemon sql.y COMMAND echo "copy sql.c from ${TD_SOURCE_DIR}/source/libs/parser/inc/sql.c to ${TD_SOURCE_DIR}/source/libs/parser/src/" COMMAND mv ${TD_SOURCE_DIR}/source/libs/parser/inc/sql.c ${TD_SOURCE_DIR}/source/libs/parser/src/sql.c COMMAND mv ${TD_SOURCE_DIR}/source/libs/parser/inc/sql.h ${TD_SOURCE_DIR}/include/common/ttokenauto.h diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 63eb09d509..c1136e8280 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1446,7 +1446,7 @@ parenthesized_joined_table(A) ::= NK_LP parenthesized_joined_table(B) NK_RP. /************************************************ joined_table ********************************************************/ joined_table(A) ::= - table_reference(B) join_type(C) join_subtype(D) JOIN table_reference(E) join_on_clause_opt(F) + table_reference(B) join_type(C) join_subtype(D) JOIN table_primary(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { A = createJoinTableNode(pCxt, C, D, B, E, F); A = addWindowOffsetClause(pCxt, A, G); From 3ac6ed61b524a83a92a6753a80e9f829d18e4f8e Mon Sep 17 00:00:00 2001 From: freemine Date: Thu, 26 Dec 2024 13:23:47 +0800 Subject: [PATCH 02/11] adjust joined_table grammar to make it forward-compatible --- source/libs/parser/inc/sql.y | 148 +++++++++++++++++++++++++++++------ 1 file changed, 123 insertions(+), 25 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index c1136e8280..786c1fd92a 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -24,6 +24,14 @@ #include "parAst.h" #define YYSTACKDEPTH 0 + +#define JOINED_TABLE_MK(jt, st, A, B, E, F, G, H) \ + { \ + A = createJoinTableNode(pCxt, jt, st, B, E, F); \ + A = addWindowOffsetClause(pCxt, A, G); \ + A = addJLimitClause(pCxt, A, H); \ + } + } %syntax_error { @@ -46,6 +54,8 @@ %left NK_STAR NK_SLASH NK_REM. %left NK_CONCAT. +%right INNER LEFT RIGHT FULL OUTER SEMI ANTI ASOF WINDOW JOIN ON WINDOW_OFFSET JLIMIT. + /************************************************ create/alter account *****************************************/ cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options. { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } cmd ::= ALTER ACCOUNT NK_ID alter_account_options. { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); } @@ -1445,35 +1455,123 @@ parenthesized_joined_table(A) ::= NK_LP joined_table(B) NK_RP. parenthesized_joined_table(A) ::= NK_LP parenthesized_joined_table(B) NK_RP. { A = B; } /************************************************ joined_table ********************************************************/ -joined_table(A) ::= - table_reference(B) join_type(C) join_subtype(D) JOIN table_primary(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { - A = createJoinTableNode(pCxt, C, D, B, E, F); - A = addWindowOffsetClause(pCxt, A, G); - A = addJLimitClause(pCxt, A, H); - } +joined_table(A) ::= inner_joined(B). { A = B; } +joined_table(A) ::= outer_joined(B). { A = B; } +joined_table(A) ::= semi_joined(B). { A = B; } +joined_table(A) ::= anti_joined(B). { A = B; } +joined_table(A) ::= asof_joined(B). { A = B; } +joined_table(A) ::= win_joined(B). { A = B; } -%type join_type { EJoinType } -%destructor join_type { } -join_type(A) ::= . { A = JOIN_TYPE_INNER; } -join_type(A) ::= INNER. { A = JOIN_TYPE_INNER; } -join_type(A) ::= LEFT. { A = JOIN_TYPE_LEFT; } -join_type(A) ::= RIGHT. { A = JOIN_TYPE_RIGHT; } -join_type(A) ::= FULL. { A = JOIN_TYPE_FULL; } +/************************************************ inner join **********************************************************/ +inner_joined(A) ::= + table_reference(B) JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, G, H); } -%type join_subtype { EJoinSubType } -%destructor join_subtype { } -join_subtype(A) ::= . { A = JOIN_STYPE_NONE; } -join_subtype(A) ::= OUTER. { A = JOIN_STYPE_OUTER; } -join_subtype(A) ::= SEMI. { A = JOIN_STYPE_SEMI; } -join_subtype(A) ::= ANTI. { A = JOIN_STYPE_ANTI; } -join_subtype(A) ::= ASOF. { A = JOIN_STYPE_ASOF; } -join_subtype(A) ::= WINDOW. { A = JOIN_STYPE_WIN; } +inner_joined(A) ::= + table_reference(B) INNER JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, G, H); } -join_on_clause_opt(A) ::= . { A = NULL; } +inner_joined(A) ::= + table_reference(B) LEFT JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_NONE, A, B, E, F, G, H); } + +inner_joined(A) ::= + table_reference(B) RIGHT JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_NONE, A, B, E, F, G, H); } + +inner_joined(A) ::= + table_reference(B) FULL JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_NONE, A, B, E, F, G, H); } + +/************************************************ outer join **********************************************************/ +outer_joined(A) ::= + table_reference(B) OUTER JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_OUTER, A, B, E, F, G, H); } + +outer_joined(A) ::= + table_reference(B) LEFT OUTER JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_OUTER, A, B, E, F, G, H); } + +outer_joined(A) ::= + table_reference(B) RIGHT OUTER JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_OUTER, A, B, E, F, G, H); } + +outer_joined(A) ::= + table_reference(B) FULL OUTER JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_OUTER, A, B, E, F, G, H); } + +/************************************************ semi join ***********************************************************/ +semi_joined(A) ::= + table_reference(B) SEMI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } + +semi_joined(A) ::= + table_reference(B) LEFT SEMI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } + +semi_joined(A) ::= + table_reference(B) RIGHT SEMI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } + +semi_joined(A) ::= + table_reference(B) FULL SEMI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_SEMI, A, B, E, F, G, H); } + +/************************************************ ansi join ***********************************************************/ +anti_joined(A) ::= + table_reference(B) ANTI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } + +anti_joined(A) ::= + table_reference(B) LEFT ANTI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } + +anti_joined(A) ::= + table_reference(B) RIGHT ANTI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } + +anti_joined(A) ::= + table_reference(B) FULL ANTI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_ANTI, A, B, E, F, G, H); } + +/************************************************ asof join ***********************************************************/ +asof_joined(A) ::= + table_reference(B) ASOF JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } + +asof_joined(A) ::= + table_reference(B) LEFT ASOF JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } + +asof_joined(A) ::= + table_reference(B) RIGHT ASOF JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } + +asof_joined(A) ::= + table_reference(B) FULL ASOF JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_ASOF, A, B, E, F, G, H); } + +/************************************************ window join *********************************************************/ +win_joined(A) ::= + table_reference(B) WINDOW JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, F, G, H); } + +win_joined(A) ::= + table_reference(B) LEFT WINDOW JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, F, G, H); } + +win_joined(A) ::= + table_reference(B) RIGHT WINDOW JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_WIN, A, B, E, F, G, H); } + +win_joined(A) ::= + table_reference(B) FULL WINDOW JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_WIN, A, B, E, F, G, H); } + +join_on_clause_opt(A) ::= . [ON] { A = NULL; } join_on_clause_opt(A) ::= ON search_condition(B). { A = B; } -window_offset_clause_opt(A) ::= . { A = NULL; } +window_offset_clause_opt(A) ::= . [WINDOW_OFFSET] { A = NULL; } window_offset_clause_opt(A) ::= WINDOW_OFFSET NK_LP window_offset_literal(B) NK_COMMA window_offset_literal(C) NK_RP. { A = createWindowOffsetNode(pCxt, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C)); } @@ -1484,7 +1582,7 @@ window_offset_literal(A) ::= NK_MINUS(B) NK_VARIABLE(C). A = createRawExprNode(pCxt, &t, createTimeOffsetValueNode(pCxt, &t)); } -jlimit_clause_opt(A) ::= . { A = NULL; } +jlimit_clause_opt(A) ::= . [JLIMIT] { A = NULL; } jlimit_clause_opt(A) ::= JLIMIT NK_INTEGER(B). { A = createLimitNode(pCxt, &B, NULL); } /************************************************ query_specification *************************************************/ From 7d07455bdcfc271e2fa84b7ecf4ec2ac4630cc8f Mon Sep 17 00:00:00 2001 From: freemine Date: Thu, 26 Dec 2024 17:26:06 +0800 Subject: [PATCH 03/11] remove ASOF JOIN and FULL ASOF JOIN --- source/libs/parser/inc/sql.y | 8 -------- 1 file changed, 8 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 786c1fd92a..7cb9c19cff 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1535,10 +1535,6 @@ anti_joined(A) ::= window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_ANTI, A, B, E, F, G, H); } /************************************************ asof join ***********************************************************/ -asof_joined(A) ::= - table_reference(B) ASOF JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } - asof_joined(A) ::= table_reference(B) LEFT ASOF JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } @@ -1547,10 +1543,6 @@ asof_joined(A) ::= table_reference(B) RIGHT ASOF JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } -asof_joined(A) ::= - table_reference(B) FULL ASOF JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_ASOF, A, B, E, F, G, H); } - /************************************************ window join *********************************************************/ win_joined(A) ::= table_reference(B) WINDOW JOIN table_reference(E) join_on_clause_opt(F) From 664d5ba180c366d1dc6a3005e59cd5936cee9844 Mon Sep 17 00:00:00 2001 From: freemine Date: Thu, 26 Dec 2024 21:10:22 +0800 Subject: [PATCH 04/11] remove WINDOW JOIN --- source/libs/parser/inc/sql.y | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 7cb9c19cff..009e9cbaab 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1544,10 +1544,6 @@ asof_joined(A) ::= window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } /************************************************ window join *********************************************************/ -win_joined(A) ::= - table_reference(B) WINDOW JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, F, G, H); } - win_joined(A) ::= table_reference(B) LEFT WINDOW JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, F, G, H); } From 9811636ec1bf9914540b02b2e73ea10dbea88d71 Mon Sep 17 00:00:00 2001 From: freemine Date: Thu, 26 Dec 2024 23:13:35 +0800 Subject: [PATCH 05/11] remove FULL [SEMI|ANTI|WINDOW] JOIN --- source/libs/parser/inc/sql.y | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 009e9cbaab..765962d0c8 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1513,10 +1513,6 @@ semi_joined(A) ::= table_reference(B) RIGHT SEMI JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } -semi_joined(A) ::= - table_reference(B) FULL SEMI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_SEMI, A, B, E, F, G, H); } - /************************************************ ansi join ***********************************************************/ anti_joined(A) ::= table_reference(B) ANTI JOIN table_reference(E) join_on_clause_opt(F) @@ -1530,10 +1526,6 @@ anti_joined(A) ::= table_reference(B) RIGHT ANTI JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } -anti_joined(A) ::= - table_reference(B) FULL ANTI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_ANTI, A, B, E, F, G, H); } - /************************************************ asof join ***********************************************************/ asof_joined(A) ::= table_reference(B) LEFT ASOF JOIN table_reference(E) join_on_clause_opt(F) @@ -1552,10 +1544,6 @@ win_joined(A) ::= table_reference(B) RIGHT WINDOW JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_WIN, A, B, E, F, G, H); } -win_joined(A) ::= - table_reference(B) FULL WINDOW JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_WIN, A, B, E, F, G, H); } - join_on_clause_opt(A) ::= . [ON] { A = NULL; } join_on_clause_opt(A) ::= ON search_condition(B). { A = B; } From 4acf170690df4830ff9c2f17586506b9dcbf0e24 Mon Sep 17 00:00:00 2001 From: freemine Date: Mon, 30 Dec 2024 19:30:43 +0800 Subject: [PATCH 06/11] remove LEFT as default for non-inner-joins --- source/libs/parser/inc/sql.y | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index c37494b298..172a5a95de 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1482,7 +1482,7 @@ inner_joined(A) ::= /************************************************ outer join **********************************************************/ outer_joined(A) ::= table_reference(B) OUTER JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_OUTER, A, B, E, F, G, H); } + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_OUTER, A, B, E, F, G, H); } outer_joined(A) ::= table_reference(B) LEFT OUTER JOIN table_reference(E) join_on_clause_opt(F) @@ -1499,7 +1499,7 @@ outer_joined(A) ::= /************************************************ semi join ***********************************************************/ semi_joined(A) ::= table_reference(B) SEMI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_SEMI, A, B, E, F, G, H); } semi_joined(A) ::= table_reference(B) LEFT SEMI JOIN table_reference(E) join_on_clause_opt(F) @@ -1512,7 +1512,7 @@ semi_joined(A) ::= /************************************************ ansi join ***********************************************************/ anti_joined(A) ::= table_reference(B) ANTI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_ANTI, A, B, E, F, G, H); } anti_joined(A) ::= table_reference(B) LEFT ANTI JOIN table_reference(E) join_on_clause_opt(F) @@ -1523,6 +1523,10 @@ anti_joined(A) ::= window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } /************************************************ asof join ***********************************************************/ +asof_joined(A) ::= + table_reference(B) ASOF JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_ASOF, A, B, E, F, G, H); } + asof_joined(A) ::= table_reference(B) LEFT ASOF JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } @@ -1532,6 +1536,10 @@ asof_joined(A) ::= window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } /************************************************ window join *********************************************************/ +win_joined(A) ::= + table_reference(B) WINDOW JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_WIN, A, B, E, F, G, H); } + win_joined(A) ::= table_reference(B) LEFT WINDOW JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, F, G, H); } From 12efc52af3c4477dff3f40259f29d829b90a864b Mon Sep 17 00:00:00 2001 From: freemine Date: Mon, 30 Dec 2024 20:15:33 +0800 Subject: [PATCH 07/11] typo: JOIN_TYPE_NONE -> JOIN_TYPE_INNER --- source/libs/parser/inc/sql.y | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 172a5a95de..08ec22b420 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1482,7 +1482,7 @@ inner_joined(A) ::= /************************************************ outer join **********************************************************/ outer_joined(A) ::= table_reference(B) OUTER JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_OUTER, A, B, E, F, G, H); } + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_OUTER, A, B, E, F, G, H); } outer_joined(A) ::= table_reference(B) LEFT OUTER JOIN table_reference(E) join_on_clause_opt(F) @@ -1499,7 +1499,7 @@ outer_joined(A) ::= /************************************************ semi join ***********************************************************/ semi_joined(A) ::= table_reference(B) SEMI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_SEMI, A, B, E, F, G, H); } + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_SEMI, A, B, E, F, G, H); } semi_joined(A) ::= table_reference(B) LEFT SEMI JOIN table_reference(E) join_on_clause_opt(F) @@ -1512,7 +1512,7 @@ semi_joined(A) ::= /************************************************ ansi join ***********************************************************/ anti_joined(A) ::= table_reference(B) ANTI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_ANTI, A, B, E, F, G, H); } + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_ANTI, A, B, E, F, G, H); } anti_joined(A) ::= table_reference(B) LEFT ANTI JOIN table_reference(E) join_on_clause_opt(F) @@ -1525,7 +1525,7 @@ anti_joined(A) ::= /************************************************ asof join ***********************************************************/ asof_joined(A) ::= table_reference(B) ASOF JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_ASOF, A, B, E, F, G, H); } + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_ASOF, A, B, E, F, G, H); } asof_joined(A) ::= table_reference(B) LEFT ASOF JOIN table_reference(E) join_on_clause_opt(F) @@ -1538,7 +1538,7 @@ asof_joined(A) ::= /************************************************ window join *********************************************************/ win_joined(A) ::= table_reference(B) WINDOW JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_NONE, JOIN_STYPE_WIN, A, B, E, F, G, H); } + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_WIN, A, B, E, F, G, H); } win_joined(A) ::= table_reference(B) LEFT WINDOW JOIN table_reference(E) join_on_clause_opt(F) From 26ba35c8837118b80f9f34e0b110fbbee52b946a Mon Sep 17 00:00:00 2001 From: freemine Date: Tue, 31 Dec 2024 07:37:55 +0800 Subject: [PATCH 08/11] re-enable FULL at sql grammar level --- source/libs/parser/inc/sql.y | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 08ec22b420..2a29b5299c 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1509,6 +1509,10 @@ semi_joined(A) ::= table_reference(B) RIGHT SEMI JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } +semi_joined(A) ::= + table_reference(B) FULL SEMI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_SEMI, A, B, E, F, G, H); } + /************************************************ ansi join ***********************************************************/ anti_joined(A) ::= table_reference(B) ANTI JOIN table_reference(E) join_on_clause_opt(F) @@ -1522,6 +1526,10 @@ anti_joined(A) ::= table_reference(B) RIGHT ANTI JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } +anti_joined(A) ::= + table_reference(B) FULL ANTI JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_ANTI, A, B, E, F, G, H); } + /************************************************ asof join ***********************************************************/ asof_joined(A) ::= table_reference(B) ASOF JOIN table_reference(E) join_on_clause_opt(F) @@ -1535,6 +1543,10 @@ asof_joined(A) ::= table_reference(B) RIGHT ASOF JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } +asof_joined(A) ::= + table_reference(B) FULL ASOF JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_ASOF, A, B, E, F, G, H); } + /************************************************ window join *********************************************************/ win_joined(A) ::= table_reference(B) WINDOW JOIN table_reference(E) join_on_clause_opt(F) @@ -1548,6 +1560,10 @@ win_joined(A) ::= table_reference(B) RIGHT WINDOW JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_WIN, A, B, E, F, G, H); } +win_joined(A) ::= + table_reference(B) FULL WINDOW JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_WIN, A, B, E, F, G, H); } + join_on_clause_opt(A) ::= . [ON] { A = NULL; } join_on_clause_opt(A) ::= ON search_condition(B). { A = B; } From 3d9b243f85306da3a542887ee5a96ff0f944bc1a Mon Sep 17 00:00:00 2001 From: freemine Date: Tue, 31 Dec 2024 15:17:56 +0800 Subject: [PATCH 09/11] revert: only [LEFT|RIGHT] is allowed for non-inner-join --- source/libs/parser/inc/sql.y | 40 ------------------------------- tests/system-test/2-query/join.py | 10 -------- 2 files changed, 50 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 2a29b5299c..907c8afd9f 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1480,10 +1480,6 @@ inner_joined(A) ::= window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_NONE, A, B, E, F, G, H); } /************************************************ outer join **********************************************************/ -outer_joined(A) ::= - table_reference(B) OUTER JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_OUTER, A, B, E, F, G, H); } - outer_joined(A) ::= table_reference(B) LEFT OUTER JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_OUTER, A, B, E, F, G, H); } @@ -1492,15 +1488,7 @@ outer_joined(A) ::= table_reference(B) RIGHT OUTER JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_OUTER, A, B, E, F, G, H); } -outer_joined(A) ::= - table_reference(B) FULL OUTER JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_OUTER, A, B, E, F, G, H); } - /************************************************ semi join ***********************************************************/ -semi_joined(A) ::= - table_reference(B) SEMI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_SEMI, A, B, E, F, G, H); } - semi_joined(A) ::= table_reference(B) LEFT SEMI JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } @@ -1509,15 +1497,7 @@ semi_joined(A) ::= table_reference(B) RIGHT SEMI JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } -semi_joined(A) ::= - table_reference(B) FULL SEMI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_SEMI, A, B, E, F, G, H); } - /************************************************ ansi join ***********************************************************/ -anti_joined(A) ::= - table_reference(B) ANTI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_ANTI, A, B, E, F, G, H); } - anti_joined(A) ::= table_reference(B) LEFT ANTI JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } @@ -1526,15 +1506,7 @@ anti_joined(A) ::= table_reference(B) RIGHT ANTI JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } -anti_joined(A) ::= - table_reference(B) FULL ANTI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_ANTI, A, B, E, F, G, H); } - /************************************************ asof join ***********************************************************/ -asof_joined(A) ::= - table_reference(B) ASOF JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_ASOF, A, B, E, F, G, H); } - asof_joined(A) ::= table_reference(B) LEFT ASOF JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } @@ -1543,15 +1515,7 @@ asof_joined(A) ::= table_reference(B) RIGHT ASOF JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } -asof_joined(A) ::= - table_reference(B) FULL ASOF JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_ASOF, A, B, E, F, G, H); } - /************************************************ window join *********************************************************/ -win_joined(A) ::= - table_reference(B) WINDOW JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_WIN, A, B, E, F, G, H); } - win_joined(A) ::= table_reference(B) LEFT WINDOW JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, F, G, H); } @@ -1560,10 +1524,6 @@ win_joined(A) ::= table_reference(B) RIGHT WINDOW JOIN table_reference(E) join_on_clause_opt(F) window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_WIN, A, B, E, F, G, H); } -win_joined(A) ::= - table_reference(B) FULL WINDOW JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_WIN, A, B, E, F, G, H); } - join_on_clause_opt(A) ::= . [ON] { A = NULL; } join_on_clause_opt(A) ::= ON search_condition(B). { A = B; } diff --git a/tests/system-test/2-query/join.py b/tests/system-test/2-query/join.py index be741ab959..9814091ab3 100644 --- a/tests/system-test/2-query/join.py +++ b/tests/system-test/2-query/join.py @@ -356,11 +356,6 @@ class TDTestCase: def join_semantic_test(self, dbname=DBNAME): tdSql.query("select ct1.c_int from db.ct1 as ct1 join db1.ct1 as cy1 on ct1.ts=cy1.ts") tdSql.checkRows(self.rows) - tdSql.error("select ct1.c_int from db.ct1 as ct1 semi join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) - tdSql.error("select ct1.c_int from db.ct1 as ct1 anti join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) - tdSql.error("select ct1.c_int from db.ct1 as ct1 outer join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) - tdSql.error("select ct1.c_int from db.ct1 as ct1 asof join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) - tdSql.error("select ct1.c_int from db.ct1 as ct1 window join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) tdSql.query("select ct1.c_int from db.ct1 as ct1 join db1.ct1 as cy1 on ct1.ts=cy1.ts") tdSql.checkRows(self.rows) @@ -390,12 +385,7 @@ class TDTestCase: tdSql.query("select ct1.c_int from db.ct1 as ct1 full join db1.ct1 as cy1 on ct1.ts=cy1.ts") tdSql.checkRows(self.rows) - tdSql.error("select ct1.c_int from db.ct1 as ct1 full semi join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) - tdSql.error("select ct1.c_int from db.ct1 as ct1 full anti join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) - tdSql.query("select ct1.c_int from db.ct1 as ct1 full outer join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) tdSql.checkRows(self.rows) - tdSql.error("select ct1.c_int from db.ct1 as ct1 full asof join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) - tdSql.error("select ct1.c_int from db.ct1 as ct1 full window join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) tdSql.query("select ct1.c_int from db.ct1 as ct1 full join db1.ct1 as cy1 on ct1.ts=cy1.ts join db1.ct1 as cy2 on ct1.ts=cy2.ts") From 86da050f25461ece596285d2a86beef010033791 Mon Sep 17 00:00:00 2001 From: freemine Date: Thu, 2 Jan 2025 19:43:45 +0800 Subject: [PATCH 10/11] fail as early as in parser stage --- source/libs/parser/inc/sql.y | 67 ++++++++++++++----------------- tests/system-test/2-query/join.py | 4 +- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 907c8afd9f..12a2ebd8b5 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1460,75 +1460,68 @@ joined_table(A) ::= win_joined(B). /************************************************ inner join **********************************************************/ inner_joined(A) ::= - table_reference(B) JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, G, H); } + table_reference(B) JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, NULL, NULL); } inner_joined(A) ::= - table_reference(B) INNER JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, G, H); } - -inner_joined(A) ::= - table_reference(B) LEFT JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_NONE, A, B, E, F, G, H); } - -inner_joined(A) ::= - table_reference(B) RIGHT JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_NONE, A, B, E, F, G, H); } - -inner_joined(A) ::= - table_reference(B) FULL JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_NONE, A, B, E, F, G, H); } + table_reference(B) INNER JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, NULL, NULL); } /************************************************ outer join **********************************************************/ outer_joined(A) ::= - table_reference(B) LEFT OUTER JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_OUTER, A, B, E, F, G, H); } + table_reference(B) LEFT JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_OUTER, A, B, E, F, NULL, NULL); } outer_joined(A) ::= - table_reference(B) RIGHT OUTER JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_OUTER, A, B, E, F, G, H); } + table_reference(B) RIGHT JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_OUTER, A, B, E, F, NULL, NULL); } + +outer_joined(A) ::= + table_reference(B) FULL JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_OUTER, A, B, E, F, NULL, NULL); } + +outer_joined(A) ::= + table_reference(B) LEFT OUTER JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_OUTER, A, B, E, F, NULL, NULL); } + +outer_joined(A) ::= + table_reference(B) RIGHT OUTER JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_OUTER, A, B, E, F, NULL, NULL); } + +outer_joined(A) ::= + table_reference(B) FULL OUTER JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_FULL, JOIN_STYPE_OUTER, A, B, E, F, NULL, NULL); } /************************************************ semi join ***********************************************************/ semi_joined(A) ::= - table_reference(B) LEFT SEMI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } + table_reference(B) LEFT SEMI JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_SEMI, A, B, E, F, NULL, NULL); } semi_joined(A) ::= - table_reference(B) RIGHT SEMI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_SEMI, A, B, E, F, G, H); } + table_reference(B) RIGHT SEMI JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_SEMI, A, B, E, F, NULL, NULL); } /************************************************ ansi join ***********************************************************/ anti_joined(A) ::= - table_reference(B) LEFT ANTI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } + table_reference(B) LEFT ANTI JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ANTI, A, B, E, F, NULL, NULL); } anti_joined(A) ::= - table_reference(B) RIGHT ANTI JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ANTI, A, B, E, F, G, H); } + table_reference(B) RIGHT ANTI JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ANTI, A, B, E, F, NULL, NULL); } /************************************************ asof join ***********************************************************/ asof_joined(A) ::= table_reference(B) LEFT ASOF JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } + jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_ASOF, A, B, E, F, NULL, H); } asof_joined(A) ::= table_reference(B) RIGHT ASOF JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ASOF, A, B, E, F, G, H); } + jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_ASOF, A, B, E, F, NULL, H); } /************************************************ window join *********************************************************/ win_joined(A) ::= - table_reference(B) LEFT WINDOW JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, F, G, H); } + table_reference(B) LEFT WINDOW JOIN table_reference(E) + window_offset_clause(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, NULL, G, H); } win_joined(A) ::= - table_reference(B) RIGHT WINDOW JOIN table_reference(E) join_on_clause_opt(F) - window_offset_clause_opt(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_WIN, A, B, E, F, G, H); } + table_reference(B) RIGHT WINDOW JOIN table_reference(E) + window_offset_clause(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_WIN, A, B, E, NULL, G, H); } join_on_clause_opt(A) ::= . [ON] { A = NULL; } -join_on_clause_opt(A) ::= ON search_condition(B). { A = B; } +join_on_clause_opt(A) ::= join_on_clause(B). { A = B; } -window_offset_clause_opt(A) ::= . [WINDOW_OFFSET] { A = NULL; } -window_offset_clause_opt(A) ::= WINDOW_OFFSET NK_LP window_offset_literal(B) +join_on_clause(A) ::= ON search_condition(B). { A = B; } + +window_offset_clause(A) ::= WINDOW_OFFSET NK_LP window_offset_literal(B) NK_COMMA window_offset_literal(C) NK_RP. { A = createWindowOffsetNode(pCxt, releaseRawExprNode(pCxt, B), releaseRawExprNode(pCxt, C)); } window_offset_literal(A) ::= NK_VARIABLE(B). { A = createRawExprNode(pCxt, &B, createTimeOffsetValueNode(pCxt, &B)); } diff --git a/tests/system-test/2-query/join.py b/tests/system-test/2-query/join.py index 9814091ab3..5d5020ab4b 100644 --- a/tests/system-test/2-query/join.py +++ b/tests/system-test/2-query/join.py @@ -369,7 +369,7 @@ class TDTestCase: tdSql.checkRows(self.rows) tdSql.query("select ct1.c_int from db.ct1 as ct1 left asof join db1.ct1 as cy1 on ct1.ts=cy1.ts") tdSql.checkRows(self.rows) - tdSql.error("select ct1.c_int from db.ct1 as ct1 left window join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) + tdSql.error("select ct1.c_int from db.ct1 as ct1 left window join db1.ct1 as cy1 on ct1.ts=cy1.ts") tdSql.query("select ct1.c_int from db.ct1 as ct1 right join db1.ct1 as cy1 on ct1.ts=cy1.ts") tdSql.checkRows(self.rows) @@ -381,7 +381,7 @@ class TDTestCase: tdSql.checkRows(self.rows) tdSql.query("select ct1.c_int from db.ct1 as ct1 right asof join db1.ct1 as cy1 on ct1.ts=cy1.ts") tdSql.checkRows(self.rows) - tdSql.error("select ct1.c_int from db.ct1 as ct1 right window join db1.ct1 as cy1 on ct1.ts=cy1.ts", TSDB_CODE_TSC_INVALID_OPERATION) + tdSql.error("select ct1.c_int from db.ct1 as ct1 right window join db1.ct1 as cy1 on ct1.ts=cy1.ts") tdSql.query("select ct1.c_int from db.ct1 as ct1 full join db1.ct1 as cy1 on ct1.ts=cy1.ts") tdSql.checkRows(self.rows) From c2e5910c23535d31e1b6ea412469471c1ecaa72e Mon Sep 17 00:00:00 2001 From: freemine Date: Fri, 3 Jan 2025 22:26:47 +0800 Subject: [PATCH 11/11] inner join [ON ...]; window join [ON ...] WINDOW_OFFSET ... --- source/libs/parser/inc/sql.y | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 12a2ebd8b5..8303d7f1b8 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1460,10 +1460,10 @@ joined_table(A) ::= win_joined(B). /************************************************ inner join **********************************************************/ inner_joined(A) ::= - table_reference(B) JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, NULL, NULL); } + table_reference(B) JOIN table_reference(E) join_on_clause_opt(F). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, NULL, NULL); } inner_joined(A) ::= - table_reference(B) INNER JOIN table_reference(E) join_on_clause(F). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, NULL, NULL); } + table_reference(B) INNER JOIN table_reference(E) join_on_clause_opt(F). { JOINED_TABLE_MK(JOIN_TYPE_INNER, JOIN_STYPE_NONE, A, B, E, F, NULL, NULL); } /************************************************ outer join **********************************************************/ outer_joined(A) ::= @@ -1509,12 +1509,12 @@ asof_joined(A) ::= /************************************************ window join *********************************************************/ win_joined(A) ::= - table_reference(B) LEFT WINDOW JOIN table_reference(E) - window_offset_clause(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, NULL, G, H); } + table_reference(B) LEFT WINDOW JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_LEFT, JOIN_STYPE_WIN, A, B, E, F, G, H); } win_joined(A) ::= - table_reference(B) RIGHT WINDOW JOIN table_reference(E) - window_offset_clause(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_WIN, A, B, E, NULL, G, H); } + table_reference(B) RIGHT WINDOW JOIN table_reference(E) join_on_clause_opt(F) + window_offset_clause(G) jlimit_clause_opt(H). { JOINED_TABLE_MK(JOIN_TYPE_RIGHT, JOIN_STYPE_WIN, A, B, E, F, G, H); } join_on_clause_opt(A) ::= . [ON] { A = NULL; } join_on_clause_opt(A) ::= join_on_clause(B). { A = B; }