@@ -105,70 +105,62 @@ bool ParserSubquery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
105105{
106106 ParserSelectWithUnionQuery select;
107107 ParserExplainQuery explain;
108+
109+ if (pos->type != TokenType::OpeningRoundBracket)
110+ return false ;
111+ ++pos;
112+
108113 ASTPtr result_node = nullptr ;
109- ParserKeyword s_kql (" KQL" );
110114
111- if (s_kql. ignore (pos, expected))
115+ if (ASTPtr select_node; select. parse (pos, select_node , expected))
112116 {
113- if (KQLContext kql_context; !ParserKQLTableFunction (kql_context).parse (pos, result_node, expected))
114- return false ;
117+ result_node = std::move (select_node);
115118 }
116- else
119+ else if (ASTPtr explain_node; explain. parse (pos, explain_node, expected))
117120 {
118- if (pos->type != TokenType::OpeningRoundBracket)
119- return false ;
120- ++pos;
121-
122- if (ASTPtr select_node; select.parse (pos, select_node, expected))
123- {
124- result_node = std::move (select_node);
125- }
126- else if (ASTPtr explain_node; explain.parse (pos, explain_node, expected))
127- {
128- const auto & explain_query = explain_node->as <const ASTExplainQuery &>();
121+ const auto & explain_query = explain_node->as <const ASTExplainQuery &>();
129122
130- if (explain_query.getTableFunction () || explain_query.getTableOverride ())
131- throw Exception (ErrorCodes::BAD_ARGUMENTS, " EXPLAIN in a subquery cannot have a table function or table override" );
123+ if (explain_query.getTableFunction () || explain_query.getTableOverride ())
124+ throw Exception (ErrorCodes::BAD_ARGUMENTS, " EXPLAIN in a subquery cannot have a table function or table override" );
132125
133- // / Replace subquery `(EXPLAIN <kind> <explain_settings> SELECT ...)`
134- // / with `(SELECT * FROM viewExplain("<kind>", "<explain_settings>", SELECT ...))`
126+ // / Replace subquery `(EXPLAIN <kind> <explain_settings> SELECT ...)`
127+ // / with `(SELECT * FROM viewExplain("<kind>", "<explain_settings>", SELECT ...))`
135128
136- String kind_str = ASTExplainQuery::toString (explain_query.getKind ());
129+ String kind_str = ASTExplainQuery::toString (explain_query.getKind ());
137130
138- String settings_str;
139- if (ASTPtr settings_ast = explain_query.getSettings ())
140- {
141- if (!settings_ast->as <ASTSetQuery>())
142- throw Exception (ErrorCodes::BAD_ARGUMENTS, " EXPLAIN settings must be a SET query" );
143- settings_str = queryToString (settings_ast);
144- }
131+ String settings_str;
132+ if (ASTPtr settings_ast = explain_query.getSettings ())
133+ {
134+ if (!settings_ast->as <ASTSetQuery>())
135+ throw Exception (ErrorCodes::BAD_ARGUMENTS, " EXPLAIN settings must be a SET query" );
136+ settings_str = queryToString (settings_ast);
137+ }
145138
146- const ASTPtr & explained_ast = explain_query.getExplainedQuery ();
147- if (explained_ast)
148- {
149- auto view_explain = makeASTFunction (" viewExplain" ,
150- std::make_shared<ASTLiteral>(kind_str),
151- std::make_shared<ASTLiteral>(settings_str),
152- explained_ast);
153- result_node = buildSelectFromTableFunction (view_explain);
154- }
155- else
156- {
157- auto view_explain = makeASTFunction (" viewExplain" ,
158- std::make_shared<ASTLiteral>(kind_str),
159- std::make_shared<ASTLiteral>(settings_str));
160- result_node = buildSelectFromTableFunction (view_explain);
161- }
139+ const ASTPtr & explained_ast = explain_query.getExplainedQuery ();
140+ if (explained_ast)
141+ {
142+ auto view_explain = makeASTFunction (" viewExplain" ,
143+ std::make_shared<ASTLiteral>(kind_str),
144+ std::make_shared<ASTLiteral>(settings_str),
145+ explained_ast);
146+ result_node = buildSelectFromTableFunction (view_explain);
162147 }
163148 else
164149 {
165- return false ;
150+ auto view_explain = makeASTFunction (" viewExplain" ,
151+ std::make_shared<ASTLiteral>(kind_str),
152+ std::make_shared<ASTLiteral>(settings_str));
153+ result_node = buildSelectFromTableFunction (view_explain);
166154 }
167-
168- if (pos->type != TokenType::ClosingRoundBracket)
169- return false ;
170- ++pos;
171155 }
156+ else
157+ {
158+ return false ;
159+ }
160+
161+ if (pos->type != TokenType::ClosingRoundBracket)
162+ return false ;
163+ ++pos;
172164
173165 node = std::make_shared<ASTSubquery>();
174166 node->children .push_back (result_node);
@@ -178,16 +170,6 @@ bool ParserSubquery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected)
178170
179171bool ParserIdentifier::parseImpl (Pos & pos, ASTPtr & node, Expected & expected)
180172{
181- // / 'kql(' is used for subuquery in Kusto, should not be treated as an identifier if kql followed by (
182- ParserKeyword s_kql (" KQL" );
183- if (s_kql.ignore (pos, expected))
184- {
185- if (pos->type == TokenType::OpeningRoundBracket)
186- { --pos;
187- return false ;
188- }
189- --pos;
190- }
191173 // / Identifier in backquotes or in double quotes
192174 if (pos->type == TokenType::QuotedIdentifier)
193175 {
0 commit comments