summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Neporada <[email protected]>2022-06-23 01:15:34 +0300
committerAndrey Neporada <[email protected]>2022-06-23 01:15:34 +0300
commitb119ff8b6c370a7477d0e261b6913ef28fe2b215 (patch)
tree0b4650e0874819dbb5668b5eec910a842b2b8302
parent43d945971c089350f19e9b9fa791078d45c83dc0 (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.proto1
-rw-r--r--ydb/library/yql/core/issue/yql_issue.txt4
-rw-r--r--ydb/library/yql/sql/v1/context.cpp7
-rw-r--r--ydb/library/yql/sql/v1/context.h1
-rw-r--r--ydb/library/yql/sql/v1/sql.cpp12
-rw-r--r--ydb/library/yql/sql/v1/sql_ut.cpp5
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)))__"));
}
};