diff options
| author | vitya-smirnov <[email protected]> | 2025-09-01 14:16:31 +0300 |
|---|---|---|
| committer | vitya-smirnov <[email protected]> | 2025-09-01 14:42:26 +0300 |
| commit | 2e3f9fcea0b362304ba2e56d575fc1e05d46ed53 (patch) | |
| tree | 6ba6383334d7fbca2c28c4a96dc30ac43370e65b /yql/essentials/sql | |
| parent | 4e13fd43a89dfb0ba86f93813a52ef3840be14e5 (diff) | |
YQL-20345: Disable EXCEPT/INTERSECT/DISTINCT before 2025.03
Added absent checks for `langVer` at `EXCEPT/INTERSECT/DISTINCT`
translation. In next PR will get rid of `.sqlx` file extensions.
commit_hash:699cc8f6084d1d2fc19ecd53c35a56496dc842f4
Diffstat (limited to 'yql/essentials/sql')
| -rw-r--r-- | yql/essentials/sql/v1/context.cpp | 4 | ||||
| -rw-r--r-- | yql/essentials/sql/v1/context.h | 2 | ||||
| -rw-r--r-- | yql/essentials/sql/v1/sql_select.cpp | 28 | ||||
| -rw-r--r-- | yql/essentials/sql/v1/sql_ut_common.h | 8 |
4 files changed, 39 insertions, 3 deletions
diff --git a/yql/essentials/sql/v1/context.cpp b/yql/essentials/sql/v1/context.cpp index 8d412ba2477..cdf2a60824d 100644 --- a/yql/essentials/sql/v1/context.cpp +++ b/yql/essentials/sql/v1/context.cpp @@ -679,6 +679,10 @@ void TTranslation::AltNotImplemented(const TString& ruleName, ui32 altCase, cons Error() << ruleName << ": alternative is not implemented yet: " << AltDescription(node, altCase, descr); } +bool TTranslation::IsBackwardCompatibleFeatureAvailable(NYql::TLangVersion langVer) const { + return NYql::IsBackwardCompatibleFeatureAvailable(Ctx_.Settings.LangVer, langVer, Ctx_.Settings.BackportMode); +} + void EnumerateSqlFlags(std::function<void(std::string_view)> callback) { for (const auto& x : CTX_PRAGMA_FIELDS) { callback(x.first); diff --git a/yql/essentials/sql/v1/context.h b/yql/essentials/sql/v1/context.h index aa30982c35c..7ae995059a8 100644 --- a/yql/essentials/sql/v1/context.h +++ b/yql/essentials/sql/v1/context.h @@ -477,6 +477,8 @@ namespace NSQLTranslationV1 { void AltNotImplemented(const TString& ruleName, ui32 altCase, const google::protobuf::Message& node, const google::protobuf::Descriptor* descr); TString AltDescription(const google::protobuf::Message& node, ui32 altCase, const google::protobuf::Descriptor* descr) const; + bool IsBackwardCompatibleFeatureAvailable(NYql::TLangVersion langVer) const; + protected: TContext& Ctx_; }; diff --git a/yql/essentials/sql/v1/sql_select.cpp b/yql/essentials/sql/v1/sql_select.cpp index a846dff5483..3dd5043438d 100644 --- a/yql/essentials/sql/v1/sql_select.cpp +++ b/yql/essentials/sql/v1/sql_select.cpp @@ -1460,7 +1460,24 @@ TSourcePtr TSqlSelect::BuildUnionException(const TRule& node, TPosition& pos, TS for (int i = 0; i < tail.size(); ++i) { const auto& nextBlock = tail[i]; - TString nextOp = ToLowerUTF8(Token(nextBlock.GetRule_union_op1().GetToken1())); + const NSQLv1Generated::TToken& token = nextBlock.GetRule_union_op1().GetToken1(); + TString nextOp = ToLowerUTF8(Token(token)); + if (nextOp != "union" && !IsBackwardCompatibleFeatureAvailable(MakeLangVersion(2025, 3))) { + Ctx_.Error(Ctx_.TokenPosition(token)) + << "EXCEPT/INTERSECT is not available before version 2025.03"; + return nullptr; + } + + if (nextBlock.GetRule_union_op1().HasBlock2()) { + const NSQLv1Generated::TToken& token = nextBlock.GetRule_union_op1().GetBlock2().GetToken1(); + const TString qualifier = ToLowerUTF8(Token(token)); + if (qualifier == "distinct" && !IsBackwardCompatibleFeatureAvailable(MakeLangVersion(2025, 3))) { + Ctx_.Error(Ctx_.TokenPosition(token)) + << "UNION DISTINCT is not available before version 2025.03"; + return nullptr; + } + } + bool isNextAllQualified = IsAllQualifiedOp(nextBlock.GetRule_union_op1()); TSelectKindPlacement nextPlacement = { @@ -1536,7 +1553,14 @@ TSourcePtr TSqlSelect::BuildIntersection( for (int i = 0; i < tail.size(); ++i) { const auto& nextBlock = tail[i]; - TString nextOp = ToLowerUTF8(Token(nextBlock.GetRule_intersect_op1().GetToken1())); + const NSQLv1Generated::TToken& token = nextBlock.GetRule_intersect_op1().GetToken1(); + if (!IsBackwardCompatibleFeatureAvailable(MakeLangVersion(2025, 3))) { + Ctx_.Error(Ctx_.TokenPosition(token)) + << "EXCEPT/INTERSECT is not available before version 2025.03"; + return nullptr; + } + + TString nextOp = ToLowerUTF8(Token(token)); bool isNextAllQualified = IsAllQualifiedOp(nextBlock.GetRule_intersect_op1()); TSelectKindPlacement nextPlacement = { diff --git a/yql/essentials/sql/v1/sql_ut_common.h b/yql/essentials/sql/v1/sql_ut_common.h index 5b0c5a28f26..a47b22aa0bc 100644 --- a/yql/essentials/sql/v1/sql_ut_common.h +++ b/yql/essentials/sql/v1/sql_ut_common.h @@ -1754,7 +1754,13 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) { } Y_UNIT_TEST(UnionDistinctTest) { - NYql::TAstParseResult res = SqlToYql("SELECT key FROM plato.Input UNION DISTINCT select subkey FROM plato.Input;"); + NSQLTranslation::TTranslationSettings settings; + settings.LangVer = NYql::MakeLangVersion(2025, 3); + + NYql::TAstParseResult res = SqlToYqlWithSettings( + R"sql(SELECT key FROM plato.Input UNION DISTINCT SELECT subkey FROM plato.Input;)sql", + settings); + UNIT_ASSERT(res.Root); TWordCountHive elementStat = {{TString("Union"), 0}}; |
