summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql
diff options
context:
space:
mode:
authorvvvv <[email protected]>2025-09-10 18:29:39 +0300
committervvvv <[email protected]>2025-09-10 18:48:49 +0300
commitc8d43287d3aacc1d4dab8187d2f70894dcd9588b (patch)
tree0ffe53f8d71a952ea8ecfc670381118e624175fe /yql/essentials/sql
parent8ad1804d5702aa4f45efe2cc12967dc30ae878cf (diff)
YQL-20410 not null
commit_hash:95bd6eff4013fca11cfe9e941b6175d93c310bdd
Diffstat (limited to 'yql/essentials/sql')
-rw-r--r--yql/essentials/sql/v1/context.cpp30
-rw-r--r--yql/essentials/sql/v1/context.h5
-rw-r--r--yql/essentials/sql/v1/sql_expression.cpp2
-rw-r--r--yql/essentials/sql/v1/sql_ut_common.h22
4 files changed, 48 insertions, 11 deletions
diff --git a/yql/essentials/sql/v1/context.cpp b/yql/essentials/sql/v1/context.cpp
index 038e66f6c70..127b684029d 100644
--- a/yql/essentials/sql/v1/context.cpp
+++ b/yql/essentials/sql/v1/context.cpp
@@ -121,6 +121,10 @@ TContext::TContext(const TLexers& lexers, const TParsers& parsers,
PersistableFlattenAndAggrExprs = true;
}
+ if (settings.LangVer >= MakeLangVersion(2025, 4)) {
+ DisableLegacyNotNull = true;
+ }
+
for (auto lib : settings.Libraries) {
Libraries.emplace(lib, TLibraryStuff());
}
@@ -193,19 +197,20 @@ IOutputStream& TContext::Error(NYql::TIssueCode code) {
IOutputStream& TContext::Error(NYql::TPosition pos, NYql::TIssueCode code) {
HasPendingErrors = true;
bool isError;
- return MakeIssue(TSeverityIds::S_ERROR, code, pos, isError);
+ return MakeIssue(TSeverityIds::S_ERROR, code, pos, false, isError);
}
-bool TContext::Warning(NYql::TPosition pos, NYql::TIssueCode code, std::function<void(IOutputStream&)> message) {
+bool TContext::Warning(NYql::TPosition pos, NYql::TIssueCode code, std::function<void(IOutputStream&)> message,
+ bool forceError) {
bool isError;
- IOutputStream& out = MakeIssue(TSeverityIds::S_WARNING, code, pos, isError);
+ IOutputStream& out = MakeIssue(TSeverityIds::S_WARNING, code, pos, forceError, isError);
message(out);
return !StrictWarningAsError || !isError;
}
IOutputStream& TContext::Info(NYql::TPosition pos) {
bool isError;
- return MakeIssue(TSeverityIds::S_INFO, TIssuesIds::INFO, pos, isError);
+ return MakeIssue(TSeverityIds::S_INFO, TIssuesIds::INFO, pos, false, isError);
}
void TContext::SetWarningPolicyFor(NYql::TIssueCode code, NYql::EWarningAction action) {
@@ -243,17 +248,24 @@ bool TContext::WarnUnusedHints() {
});
}
-IOutputStream& TContext::MakeIssue(ESeverity severity, TIssueCode code, NYql::TPosition pos, bool& isError) {
+IOutputStream& TContext::MakeIssue(ESeverity severity, TIssueCode code, NYql::TPosition pos,
+ bool forceError, bool& isError) {
isError = (severity == TSeverityIds::S_ERROR);
if (severity == TSeverityIds::S_WARNING) {
- auto action = WarningPolicy.GetAction(code);
- if (action == EWarningAction::ERROR) {
+ if (forceError) {
severity = TSeverityIds::S_ERROR;
HasPendingErrors = true;
isError = true;
- } else if (action == EWarningAction::DISABLE) {
- return Cnull;
+ } else {
+ auto action = WarningPolicy.GetAction(code);
+ if (action == EWarningAction::ERROR) {
+ severity = TSeverityIds::S_ERROR;
+ HasPendingErrors = true;
+ isError = true;
+ } else if (action == EWarningAction::DISABLE) {
+ return Cnull;
+ }
}
}
diff --git a/yql/essentials/sql/v1/context.h b/yql/essentials/sql/v1/context.h
index d0f3b6b198a..70880280610 100644
--- a/yql/essentials/sql/v1/context.h
+++ b/yql/essentials/sql/v1/context.h
@@ -107,7 +107,8 @@ namespace NSQLTranslationV1 {
IOutputStream& Error(NYql::TIssueCode code = NYql::TIssuesIds::DEFAULT_ERROR);
IOutputStream& Error(NYql::TPosition pos, NYql::TIssueCode code = NYql::TIssuesIds::DEFAULT_ERROR);
- bool Warning(NYql::TPosition pos, NYql::TIssueCode code, std::function<void(IOutputStream&)> message);
+ bool Warning(NYql::TPosition pos, NYql::TIssueCode code, std::function<void(IOutputStream&)> message,
+ bool forceError = false);
IOutputStream& Info(NYql::TPosition pos);
void SetWarningPolicyFor(NYql::TIssueCode code, NYql::EWarningAction action);
@@ -252,6 +253,7 @@ namespace NSQLTranslationV1 {
NYql::ESeverity severity,
NYql::TIssueCode code,
NYql::TPosition pos,
+ bool forceError,
bool& isError);
public:
@@ -386,6 +388,7 @@ namespace NSQLTranslationV1 {
bool EmitUnionMerge = false;
bool OptimizeSimpleIlike = false;
bool PersistableFlattenAndAggrExprs = false;
+ bool DisableLegacyNotNull = false;
bool DebugPositions = false;
bool StrictWarningAsError = false;
TVector<size_t> ForAllStatementsParts;
diff --git a/yql/essentials/sql/v1/sql_expression.cpp b/yql/essentials/sql/v1/sql_expression.cpp
index 9551c7f232d..4451e58a9b6 100644
--- a/yql/essentials/sql/v1/sql_expression.cpp
+++ b/yql/essentials/sql/v1/sql_expression.cpp
@@ -1968,7 +1968,7 @@ TNodePtr TSqlExpression::SubExpr(const TRule_xor_subexpr& node, const TTrailingQ
{
if (!Ctx_.Warning(Ctx_.Pos(), TIssuesIds::YQL_MISSING_IS_BEFORE_NOT_NULL, [](auto& out) {
out << "Missing IS keyword before NOT NULL";
- })) {
+ }, Ctx_.DisableLegacyNotNull)) {
return {};
}
}
diff --git a/yql/essentials/sql/v1/sql_ut_common.h b/yql/essentials/sql/v1/sql_ut_common.h
index 7b9265e2b38..e58a074f7e5 100644
--- a/yql/essentials/sql/v1/sql_ut_common.h
+++ b/yql/essentials/sql/v1/sql_ut_common.h
@@ -1768,6 +1768,28 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Union"]);
}
+ Y_UNIT_TEST(LegacyNotNull2025_03) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 3);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(
+ R"sql(SELECT 1 NOT NULL)sql",
+ settings);
+
+ UNIT_ASSERT_C(res.Root, res.Issues.ToString());
+ }
+
+ Y_UNIT_TEST(LegacyNotNull2025_04) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 4);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(
+ R"sql(SELECT 1 NOT NULL)sql",
+ settings);
+
+ UNIT_ASSERT(!res.Root);
+ }
+
Y_UNIT_TEST(UnionAggregationTest) {
NYql::TAstParseResult res = SqlToYql(R"(
PRAGMA DisableEmitUnionMerge;