diff options
| author | udovichenko-r <[email protected]> | 2026-06-18 19:58:57 +0300 |
|---|---|---|
| committer | udovichenko-r <[email protected]> | 2026-06-18 20:38:07 +0300 |
| commit | ddedfffe40c70e7b353843176a4d4647c19bbba2 (patch) | |
| tree | 6d1c7a7e7e1d107b03c3d88386f1fed6fd0134c7 /yql/essentials/sql/v1/sql_query.cpp | |
| parent | 24590eaba442f1c9640d00bbb40909c11b135a37 (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.cpp | 57 |
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"); } |
