aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/sql_translation.cpp
diff options
context:
space:
mode:
authortesseract <tesseract@yandex-team.com>2025-01-21 12:50:29 +0300
committertesseract <tesseract@yandex-team.com>2025-01-21 14:32:19 +0300
commite677409ecb6106695a976307290b2f6bad3d72c0 (patch)
tree7c4fe8c7334a8f814506c857a08322ea800a8b79 /yql/essentials/sql/v1/sql_translation.cpp
parente2324a4c7934ecbc80eb47f70d2586c4995499b5 (diff)
downloadydb-e677409ecb6106695a976307290b2f6bad3d72c0.tar.gz
YQL for create, alter and drop transfer from topic to table
commit_hash:09502f46a7ee665609d2c4ba8d9e0aa421720cdb
Diffstat (limited to 'yql/essentials/sql/v1/sql_translation.cpp')
-rw-r--r--yql/essentials/sql/v1/sql_translation.cpp103
1 files changed, 100 insertions, 3 deletions
diff --git a/yql/essentials/sql/v1/sql_translation.cpp b/yql/essentials/sql/v1/sql_translation.cpp
index 9989295291..a4c55cad71 100644
--- a/yql/essentials/sql/v1/sql_translation.cpp
+++ b/yql/essentials/sql/v1/sql_translation.cpp
@@ -83,7 +83,7 @@ TNodePtr BuildViewSelect(
const TString& contextRecreationQuery
) {
TIssues issues;
- TContext context(parentContext.Settings, {}, issues);
+ TContext context(parentContext.Settings, {}, issues, parentContext.Query);
if (!RecreateContext(context, context.Settings, contextRecreationQuery)) {
parentContext.Issues.AddIssues(issues);
return nullptr;
@@ -4651,13 +4651,15 @@ bool TSqlTranslation::DefineActionOrSubqueryBody(TSqlQuery& query, TBlocks& bloc
Y_DEFER {
Ctx.PopCurrentBlocks();
};
- if (!query.Statement(blocks, body.GetBlock2().GetRule_sql_stmt_core1())) {
+
+ size_t statementNumber = 0;
+ if (!query.Statement(blocks, body.GetBlock2().GetRule_sql_stmt_core1(), statementNumber++)) {
return false;
}
for (const auto& nestedStmtItem : body.GetBlock2().GetBlock2()) {
const auto& nestedStmt = nestedStmtItem.GetRule_sql_stmt_core2();
- if (!query.Statement(blocks, nestedStmt)) {
+ if (!query.Statement(blocks, nestedStmt, statementNumber++)) {
return false;
}
}
@@ -5096,6 +5098,101 @@ bool TSqlTranslation::ParseViewQuery(
return true;
}
+namespace {
+
+static std::string::size_type GetQueryPosition(const TString& query, const NSQLv1Generated::TToken& token, bool antlr4) {
+ if (1 == token.GetLine() && 0 == token.GetColumn()) {
+ return 0;
+ }
+
+ TPosition pos = {0, 1};
+ TTextWalker walker(pos, antlr4);
+
+ std::string::size_type position = 0;
+ for (char c : query) {
+ walker.Advance(c);
+ ++position;
+
+ if (pos.Row == token.GetLine() && pos.Column == token.GetColumn()) {
+ return position;
+ }
+ }
+
+ return std::string::npos;
+}
+
+static TString GetLambdaText(TTranslation& ctx, TContext& Ctx, const TRule_lambda_or_parameter& lambdaOrParameter) {
+ static const TString statementSeparator = ";\n";
+
+ TVector<TString> statements;
+ NYql::TIssues issues;
+ if (!SplitQueryToStatements(Ctx.Query, statements, issues, Ctx.Settings)) {
+ return {};
+ }
+
+ TStringBuilder result;
+ for (const auto id : Ctx.ForAllStatementsParts) {
+ result << statements[id] << "\n";
+ }
+
+ switch (lambdaOrParameter.Alt_case()) {
+ case NSQLv1Generated::TRule_lambda_or_parameter::kAltLambdaOrParameter1: {
+ const auto& lambda = lambdaOrParameter.GetAlt_lambda_or_parameter1().GetRule_lambda1();
+
+ auto& beginToken = lambda.GetRule_smart_parenthesis1().GetToken1();
+ const NSQLv1Generated::TToken* endToken = nullptr;
+ switch (lambda.GetBlock2().GetBlock2().GetAltCase()) {
+ case TRule_lambda_TBlock2_TBlock2::AltCase::kAlt1:
+ endToken = &lambda.GetBlock2().GetBlock2().GetAlt1().GetToken3();
+ break;
+ case TRule_lambda_TBlock2_TBlock2::AltCase::kAlt2:
+ endToken = &lambda.GetBlock2().GetBlock2().GetAlt2().GetToken3();
+ break;
+ case TRule_lambda_TBlock2_TBlock2::AltCase::ALT_NOT_SET:
+ Y_ABORT("You should change implementation according to grammar changes");
+ }
+
+ auto begin = GetQueryPosition(Ctx.Query, beginToken, Ctx.Settings.Antlr4Parser);
+ auto end = GetQueryPosition(Ctx.Query, *endToken, Ctx.Settings.Antlr4Parser);
+ if (begin == std::string::npos || end == std::string::npos) {
+ return {};
+ }
+
+ result << "$__ydb_transfer_lambda = " << Ctx.Query.substr(begin, end - begin + endToken->value().size()) << statementSeparator;
+
+ return result;
+ }
+ case NSQLv1Generated::TRule_lambda_or_parameter::kAltLambdaOrParameter2: {
+ const auto& valueBlock = lambdaOrParameter.GetAlt_lambda_or_parameter2().GetRule_bind_parameter1().GetBlock2();
+ const auto id = Id(valueBlock.GetAlt1().GetRule_an_id_or_type1(), ctx);
+ result << "$__ydb_transfer_lambda = $" << id << statementSeparator;
+ return result;
+ }
+ case NSQLv1Generated::TRule_lambda_or_parameter::ALT_NOT_SET:
+ Y_ABORT("You should change implementation according to grammar changes");
+ }
+}
+
+}
+
+bool TSqlTranslation::ParseTransferLambda(
+ TString& lambdaText,
+ const TRule_lambda_or_parameter& lambdaOrParameter) {
+
+ TSqlExpression expr(Ctx, Ctx.Settings.Mode);
+ auto result = expr.Build(lambdaOrParameter);
+ if (!result) {
+ return false;
+ }
+
+ lambdaText = GetLambdaText(*this, Ctx, lambdaOrParameter);
+ if (lambdaText.empty()) {
+ Ctx.Error() << "Cannot parse lambda correctly";
+ }
+
+ return !lambdaText.empty();
+}
+
class TReturningListColumns : public INode {
public:
TReturningListColumns(TPosition pos)