diff options
| author | vvvv <[email protected]> | 2025-09-10 18:29:39 +0300 |
|---|---|---|
| committer | vvvv <[email protected]> | 2025-09-10 18:48:49 +0300 |
| commit | c8d43287d3aacc1d4dab8187d2f70894dcd9588b (patch) | |
| tree | 0ffe53f8d71a952ea8ecfc670381118e624175fe /yql/essentials/sql | |
| parent | 8ad1804d5702aa4f45efe2cc12967dc30ae878cf (diff) | |
YQL-20410 not null
commit_hash:95bd6eff4013fca11cfe9e941b6175d93c310bdd
Diffstat (limited to 'yql/essentials/sql')
| -rw-r--r-- | yql/essentials/sql/v1/context.cpp | 30 | ||||
| -rw-r--r-- | yql/essentials/sql/v1/context.h | 5 | ||||
| -rw-r--r-- | yql/essentials/sql/v1/sql_expression.cpp | 2 | ||||
| -rw-r--r-- | yql/essentials/sql/v1/sql_ut_common.h | 22 |
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; |
