diff options
| author | Andrey Neporada <[email protected]> | 2022-06-23 01:15:34 +0300 |
|---|---|---|
| committer | Andrey Neporada <[email protected]> | 2022-06-23 01:15:34 +0300 |
| commit | b119ff8b6c370a7477d0e261b6913ef28fe2b215 (patch) | |
| tree | 0b4650e0874819dbb5668b5eec910a842b2b8302 | |
| parent | 43d945971c089350f19e9b9fa791078d45c83dc0 (diff) | |
[YQL-15020] Revert declare override part of last commit. Add warning instead
ref:06759ce43d6fd1d3c3442f52b6650aed6a81115f
| -rw-r--r-- | ydb/library/yql/core/issue/protos/issue_id.proto | 1 | ||||
| -rw-r--r-- | ydb/library/yql/core/issue/yql_issue.txt | 4 | ||||
| -rw-r--r-- | ydb/library/yql/sql/v1/context.cpp | 7 | ||||
| -rw-r--r-- | ydb/library/yql/sql/v1/context.h | 1 | ||||
| -rw-r--r-- | ydb/library/yql/sql/v1/sql.cpp | 12 | ||||
| -rw-r--r-- | ydb/library/yql/sql/v1/sql_ut.cpp | 5 |
6 files changed, 24 insertions, 6 deletions
diff --git a/ydb/library/yql/core/issue/protos/issue_id.proto b/ydb/library/yql/core/issue/protos/issue_id.proto index d61770a1c93..5759dfe5020 100644 --- a/ydb/library/yql/core/issue/protos/issue_id.proto +++ b/ydb/library/yql/core/issue/protos/issue_id.proto @@ -136,6 +136,7 @@ message TIssuesIds { YQL_TABLE_BINDING_DUPLICATE = 4533; YQL_UNUSED_HINT = 4534; YQL_DEPRECATED_POSITIONAL_SCHEMA = 4535; + YQL_DUPLICATE_DECLARE = 4536; // yql parser errors YQL_NOT_ALLOWED_IN_DISCOVERY = 4600; diff --git a/ydb/library/yql/core/issue/yql_issue.txt b/ydb/library/yql/core/issue/yql_issue.txt index 81405dfb6e6..3418b4ac5e2 100644 --- a/ydb/library/yql/core/issue/yql_issue.txt +++ b/ydb/library/yql/core/issue/yql_issue.txt @@ -616,3 +616,7 @@ ids { code: DQ_GATEWAY_NEED_FALLBACK_ERROR severity: S_ERROR } +ids { + code: YQL_DUPLICATE_DECLARE + severity: S_WARNING +} diff --git a/ydb/library/yql/sql/v1/context.cpp b/ydb/library/yql/sql/v1/context.cpp index 6107645e711..72bd5c5f1dd 100644 --- a/ydb/library/yql/sql/v1/context.cpp +++ b/ydb/library/yql/sql/v1/context.cpp @@ -281,8 +281,13 @@ TNodePtr TContext::UniversalAlias(const TString& baseName, TNodePtr&& node) { return BuildAtom(node->GetPos(), alias, TNodeFlags::Default); } +bool TContext::IsAlreadyDeclared(const TString& varName) const { + return Variables.find(varName) != Variables.end(); +} + void TContext::DeclareVariable(const TString& varName, const TNodePtr& typeNode) { - Variables[varName] = typeNode; + auto inserted = Variables.emplace(varName, typeNode); + YQL_ENSURE(inserted.second); } bool TContext::AddExport(TPosition pos, const TString& name) { diff --git a/ydb/library/yql/sql/v1/context.h b/ydb/library/yql/sql/v1/context.h index 399646d66b5..359e419063a 100644 --- a/ydb/library/yql/sql/v1/context.h +++ b/ydb/library/yql/sql/v1/context.h @@ -159,6 +159,7 @@ namespace NSQLTranslationV1 { return IntoHeading; } + bool IsAlreadyDeclared(const TString& varName) const; void DeclareVariable(const TString& varName, const TNodePtr& typeNode); bool AddExport(TPosition symbolPos, const TString& symbolName); diff --git a/ydb/library/yql/sql/v1/sql.cpp b/ydb/library/yql/sql/v1/sql.cpp index bc9bf6b9515..ff7be4bc3b0 100644 --- a/ydb/library/yql/sql/v1/sql.cpp +++ b/ydb/library/yql/sql/v1/sql.cpp @@ -9007,8 +9007,13 @@ bool TSqlQuery::DeclareStatement(const TRule_declare_stmt& stmt) { Ctx.Error(varPos) << "Can not use anonymous name '" << varName << "' in DECLARE statement"; return false; } - varName = PushNamedAtom(varPos, varName); - Ctx.DeclareVariable(varName, typeNode); + + if (Ctx.IsAlreadyDeclared(varName)) { + Ctx.Warning(varPos, TIssuesIds::YQL_DUPLICATE_DECLARE) << "Duplicate declaration of '" << varName << "' will be ignored"; + } else { + PushNamedAtom(varPos, varName); + Ctx.DeclareVariable(varName, typeNode); + } return true; } @@ -10096,7 +10101,8 @@ TNodePtr TSqlQuery::Build(const TSQLv1ParserAST& ast) { } TNodePtr typeNode = BuildBuiltinFunc(Ctx, Ctx.Pos(), "ParseType", { BuildLiteralRawString(Ctx.Pos(), type) }); - varName = PushNamedAtom(Ctx.Pos(), varName); + PushNamedAtom(Ctx.Pos(), varName); + // no duplicates are possible at this stage Ctx.DeclareVariable(varName, typeNode); } } diff --git a/ydb/library/yql/sql/v1/sql_ut.cpp b/ydb/library/yql/sql/v1/sql_ut.cpp index a8300b3624a..c9c6b0ecd6e 100644 --- a/ydb/library/yql/sql/v1/sql_ut.cpp +++ b/ydb/library/yql/sql/v1/sql_ut.cpp @@ -4297,15 +4297,16 @@ Y_UNIT_TEST_SUITE(ExternalDeclares) { UNIT_ASSERT_VALUES_EQUAL(1, elementStat["declare"]); } - Y_UNIT_TEST(DeclareOverridesExteralDeclares) { + Y_UNIT_TEST(NoDeclareOverrides) { NSQLTranslation::TTranslationSettings settings; settings.DeclaredNamedExprs["foo"] = "String"; auto res = SqlToYqlWithSettings("declare $foo as Int32; select $foo;", settings); UNIT_ASSERT(res.IsOk()); + UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:1:9: Warning: Duplicate declaration of '$foo' will be ignored, code: 4536\n"); TVerifyLineFunc verifyLine = [](const TString& word, const TString& line) { if (word == "declare") { - UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find(R"__((declare $foo (DataType 'Int32)))__")); + UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find(R"__((declare $foo (DataType 'String)))__")); } }; |
