summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/sql_query.cpp
diff options
context:
space:
mode:
authorudovichenko-r <[email protected]>2026-06-18 19:58:57 +0300
committerudovichenko-r <[email protected]>2026-06-18 20:38:07 +0300
commitddedfffe40c70e7b353843176a4d4647c19bbba2 (patch)
tree6d1c7a7e7e1d107b03c3d88386f1fed6fd0134c7 /yql/essentials/sql/v1/sql_query.cpp
parent24590eaba442f1c9640d00bbb40909c11b135a37 (diff)
SQL parser + type annotation for Materialize statement
#### SQL Parser and Type Annotation for Materialize Statement ✎ - Added support for the `MATERIALIZE` SQL statement including parser rules and syntax highlighting updates - Implemented type annotation and validation for the `MATERIALIZE` statement with proper error handling - Enhanced SQL query processing to handle `MATERIALIZE` statements in various contexts including subqueries and limited views - Added runtime support for `MATERIALIZE` operations with sort preservation and proper data sink handling - Integrated `MATERIALIZE` into the SQL grammar and updated completion suggestions - Added comprehensive unit tests covering various `MATERIALIZE` scenarios and edge cases <a href="https://nda.ya.ru/t/qa0kX64r7DqvtN"><font size="2">Autodescription by Yandex Code Assistant</font></a> commit_hash:32b04f93ceadf624b4d39fd6512798f9354bfd80
Diffstat (limited to 'yql/essentials/sql/v1/sql_query.cpp')
-rw-r--r--yql/essentials/sql/v1/sql_query.cpp57
1 files changed, 54 insertions, 3 deletions
diff --git a/yql/essentials/sql/v1/sql_query.cpp b/yql/essentials/sql/v1/sql_query.cpp
index d6bbfc83d45..109e9dc35c3 100644
--- a/yql/essentials/sql/v1/sql_query.cpp
+++ b/yql/essentials/sql/v1/sql_query.cpp
@@ -294,14 +294,18 @@ bool TSqlQuery::Statement(TVector<TNodePtr>& blocks, const TRule_sql_stmt_core&
const auto& altCase = core.Alt_case();
if (Mode_ == NSQLTranslation::ESqlMode::LIMITED_VIEW && (altCase >= TRule_sql_stmt_core::kAltSqlStmtCore4 &&
- altCase != TRule_sql_stmt_core::kAltSqlStmtCore13 && altCase != TRule_sql_stmt_core::kAltSqlStmtCore18)) {
+ altCase != TRule_sql_stmt_core::kAltSqlStmtCore13 && // import
+ altCase != TRule_sql_stmt_core::kAltSqlStmtCore18 && // define_action_or_subquery
+ altCase != TRule_sql_stmt_core::kAltSqlStmtCore70)) { // materialize
Error() << statementName.Human << " statement is not supported in limited views";
return false;
}
if (Mode_ == NSQLTranslation::ESqlMode::SUBQUERY && (altCase >= TRule_sql_stmt_core::kAltSqlStmtCore4 &&
- altCase != TRule_sql_stmt_core::kAltSqlStmtCore13 && altCase != TRule_sql_stmt_core::kAltSqlStmtCore6 &&
- altCase != TRule_sql_stmt_core::kAltSqlStmtCore18)) {
+ altCase != TRule_sql_stmt_core::kAltSqlStmtCore13 && // import
+ altCase != TRule_sql_stmt_core::kAltSqlStmtCore6 && // use
+ altCase != TRule_sql_stmt_core::kAltSqlStmtCore18 && // define_action_or_subquery
+ altCase != TRule_sql_stmt_core::kAltSqlStmtCore70)) { // materialize
Error() << statementName.Human << " statement is not supported in subqueries";
return false;
}
@@ -2350,6 +2354,53 @@ bool TSqlQuery::Statement(TVector<TNodePtr>& blocks, const TRule_sql_stmt_core&
AddStatementToBlocks(blocks, BuildTruncateTable(Ctx_.Pos(), tr, params, Ctx_.Scoped));
break;
}
+ case TRule_sql_stmt_core::kAltSqlStmtCore70: {
+ Ctx_.BodyPart();
+ const auto& rule = core.GetAlt_sql_stmt_core70().GetRule_materialize_stmt1();
+ Token(rule.GetToken1()); // MATERIALIZE
+
+ TSourcePtr source = TSqlSelect(*this).NamedSingleSource(rule.GetRule_named_single_source2(), false);
+ if (!source) {
+ return false;
+ }
+
+ TString service = Ctx_.Scoped->CurrService;
+ TDeferredAtom cluster = Ctx_.Scoped->CurrCluster;
+ if (rule.HasBlock3()) {
+ if (!ClusterExpr(rule.GetBlock3().GetRule_cluster_expr2(), false, service, cluster)) {
+ return false;
+ }
+ }
+ if (cluster.Empty()) {
+ Error() << "USE statement is missing or cluster not specified in MATERIALIZE";
+ return false;
+ }
+ TNodePtr clusterNode = Ctx_.Scoped->WrapCluster(cluster, Ctx_);
+
+ TTableHints hints;
+ if (rule.HasBlock4()) {
+ auto tmp = TableHintsImpl(rule.GetBlock4().GetRule_table_hints1(), service, "");
+ if (!tmp) {
+ return false;
+ }
+ hints = std::move(*tmp);
+ }
+
+ TString varName;
+ TPosition intoPos = Ctx_.Pos();
+ if (!NamedNodeImpl(rule.GetRule_bind_parameter6(), varName, *this)) {
+ return false;
+ }
+
+ TString alias = Ctx_.MakeName("materializenode");
+ TString ref = Ctx_.MakeName("materialize");
+ auto materializeNode = BuildMaterialize(Ctx_.Pos(), std::move(source), service, clusterNode, std::move(hints), std::move(alias), Ctx_.Scoped);
+ materializeNode->SetLabel(ref);
+ blocks.push_back(materializeNode);
+ auto refNode = BuildYqlSubqueryRef(materializeNode, ref);
+ PushNamedNode(intoPos, varName, refNode);
+ break;
+ }
case TRule_sql_stmt_core::ALT_NOT_SET:
YQL_ENSURE(false, "Unreachable");
}