diff options
author | vvvv <vvvv@yandex-team.com> | 2025-01-29 16:02:22 +0300 |
---|---|---|
committer | vvvv <vvvv@yandex-team.com> | 2025-01-29 16:23:33 +0300 |
commit | 15cba7449cdb7409f8e0ac12c6f77cb22e6e7bed (patch) | |
tree | 2e89b429c7870c2bab4a2af3d3d4015dc3b39ead | |
parent | be36d7b60684c12f59cbbb6ef49017e5d7f4440d (diff) | |
download | ydb-15cba7449cdb7409f8e0ac12c6f77cb22e6e7bed.tar.gz |
EXISTS with tables YQL-19496
commit_hash:76639a66853d8a9d514e4b11f47e14e2d26e26c4
-rw-r--r-- | yql/essentials/core/facade/yql_facade.cpp | 6 | ||||
-rw-r--r-- | yql/essentials/core/facade/yql_facade.h | 2 | ||||
-rw-r--r-- | yql/essentials/public/fastcheck/fastcheck.cpp | 1 | ||||
-rw-r--r-- | yql/essentials/public/purecalc/common/worker_factory.cpp | 1 | ||||
-rw-r--r-- | yql/essentials/sql/settings/translation_settings.h | 1 | ||||
-rw-r--r-- | yql/essentials/sql/v1/select.cpp | 5 | ||||
-rw-r--r-- | yql/essentials/sql/v1/sql_expression.cpp | 17 | ||||
-rw-r--r-- | yql/essentials/tests/sql/sql2yql/canondata/result.json | 6 | ||||
-rw-r--r-- | yql/essentials/tools/sql2yql/sql2yql.cpp | 1 | ||||
-rw-r--r-- | yt/yql/tests/sql/suites/select/exists_with_table.sql | 9 |
10 files changed, 41 insertions, 8 deletions
diff --git a/yql/essentials/core/facade/yql_facade.cpp b/yql/essentials/core/facade/yql_facade.cpp index be39c97b57..b1b7267c29 100644 --- a/yql/essentials/core/facade/yql_facade.cpp +++ b/yql/essentials/core/facade/yql_facade.cpp @@ -644,7 +644,7 @@ void UpdateSqlFlagsFromQContext(const TQContext& qContext, THashSet<TString>& fl } void TProgram::HandleTranslationSettings(NSQLTranslation::TTranslationSettings& loadedSettings, - const NSQLTranslation::TTranslationSettings*& currentSettings) + NSQLTranslation::TTranslationSettings*& currentSettings) { if (QContext_.CanWrite()) { auto clusterMappingsNode = NYT::TNode::CreateMap(); @@ -719,13 +719,15 @@ bool TProgram::ParseSql(const NSQLTranslation::TTranslationSettings& settings) NYql::TWarningRules warningRules; auto sourceCode = SourceCode_; HandleSourceCode(sourceCode); - const NSQLTranslation::TTranslationSettings* currentSettings = &settings; + NSQLTranslation::TTranslationSettings outerSettings = settings; + NSQLTranslation::TTranslationSettings* currentSettings = &outerSettings; NSQLTranslation::TTranslationSettings loadedSettings; loadedSettings.PgParser = settings.PgParser; if (QContext_) { HandleTranslationSettings(loadedSettings, currentSettings); } + currentSettings->EmitReadsForExists = true; return FillParseResult(SqlToYql(sourceCode, *currentSettings, &warningRules), &warningRules); } diff --git a/yql/essentials/core/facade/yql_facade.h b/yql/essentials/core/facade/yql_facade.h index 58f78cdde6..3269b14c0a 100644 --- a/yql/essentials/core/facade/yql_facade.h +++ b/yql/essentials/core/facade/yql_facade.h @@ -380,7 +380,7 @@ private: std::optional<bool> CheckFallbackIssues(const TIssues& issues); void HandleSourceCode(TString& sourceCode); void HandleTranslationSettings(NSQLTranslation::TTranslationSettings& loadedSettings, - const NSQLTranslation::TTranslationSettings*& currentSettings); + NSQLTranslation::TTranslationSettings*& currentSettings); const NKikimr::NMiniKQL::IFunctionRegistry* FunctionRegistry_; const TIntrusivePtr<IRandomProvider> RandomProvider_; diff --git a/yql/essentials/public/fastcheck/fastcheck.cpp b/yql/essentials/public/fastcheck/fastcheck.cpp index 46870d95b3..2beccc8665 100644 --- a/yql/essentials/public/fastcheck/fastcheck.cpp +++ b/yql/essentials/public/fastcheck/fastcheck.cpp @@ -17,6 +17,7 @@ bool CheckProgram(const TString& program, const TOptions& options, TIssues& erro settings.ClusterMapping = options.ClusterMapping; settings.SyntaxVersion = options.SyntaxVersion; settings.V0Behavior = NSQLTranslation::EV0Behavior::Disable; + settings.EmitReadsForExists = true; if (options.IsLibrary) { settings.Mode = NSQLTranslation::ESqlMode::LIBRARY; } diff --git a/yql/essentials/public/purecalc/common/worker_factory.cpp b/yql/essentials/public/purecalc/common/worker_factory.cpp index c73f38afb4..19afd100b3 100644 --- a/yql/essentials/public/purecalc/common/worker_factory.cpp +++ b/yql/essentials/public/purecalc/common/worker_factory.cpp @@ -178,6 +178,7 @@ TExprNode::TPtr TWorkerFactory<TBase>::Compile( settings.SyntaxVersion = syntaxVersion; settings.V0Behavior = NSQLTranslation::EV0Behavior::Disable; + settings.EmitReadsForExists = true; settings.Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW; settings.DefaultCluster = PurecalcDefaultCluster; settings.ClusterMapping[settings.DefaultCluster] = PurecalcDefaultService; diff --git a/yql/essentials/sql/settings/translation_settings.h b/yql/essentials/sql/settings/translation_settings.h index 57f79d7488..b3a58fde21 100644 --- a/yql/essentials/sql/settings/translation_settings.h +++ b/yql/essentials/sql/settings/translation_settings.h @@ -127,6 +127,7 @@ namespace NSQLTranslation { TMaybe<TString> ApplicationName; bool PgSortNulls = false; NYql::IAutoParamBuilderFactory* AutoParamBuilderFactory = nullptr; + bool EmitReadsForExists = false; }; bool ParseTranslationSettings(const TString& query, NSQLTranslation::TTranslationSettings& settings, NYql::TIssues& issues); diff --git a/yql/essentials/sql/v1/select.cpp b/yql/essentials/sql/v1/select.cpp index bf8287e89a..a916517d88 100644 --- a/yql/essentials/sql/v1/select.cpp +++ b/yql/essentials/sql/v1/select.cpp @@ -338,7 +338,10 @@ protected: } void GetInputTables(TTableList& tableList) const override { - Source->GetInputTables(tableList); + if (Source) { + Source->GetInputTables(tableList); + } + ISource::GetInputTables(tableList); } diff --git a/yql/essentials/sql/v1/sql_expression.cpp b/yql/essentials/sql/v1/sql_expression.cpp index 199f15f293..c2074cb50d 100644 --- a/yql/essentials/sql/v1/sql_expression.cpp +++ b/yql/essentials/sql/v1/sql_expression.cpp @@ -1308,7 +1308,22 @@ TNodePtr TSqlExpression::ExistsRule(const TRule_exists_expr& rule) { return nullptr; } const bool checkExist = true; - return BuildBuiltinFunc(Ctx, Ctx.Pos(), "ListHasItems", {BuildSourceNode(pos, std::move(source), checkExist)}); + auto select = BuildSourceNode(Ctx.Pos(), source, checkExist); + if (Ctx.Settings.EmitReadsForExists) { + TTableList tableList; + source->GetInputTables(tableList); + + TNodePtr inputTables(BuildInputTables(Ctx.Pos(), tableList, false, Ctx.Scoped)); + if (!inputTables->Init(Ctx, source.Get())) { + return nullptr; + } + + auto node = inputTables; + node = node->L(node, node->Y("return", select)); + select = node->Y("block", node->Q(node)); + } + + return BuildBuiltinFunc(Ctx, Ctx.Pos(), "ListHasItems", {select}); } TNodePtr TSqlExpression::CaseRule(const TRule_case_expr& rule) { diff --git a/yql/essentials/tests/sql/sql2yql/canondata/result.json b/yql/essentials/tests/sql/sql2yql/canondata/result.json index 9fec09ba5f..7ea57dddf1 100644 --- a/yql/essentials/tests/sql/sql2yql/canondata/result.json +++ b/yql/essentials/tests/sql/sql2yql/canondata/result.json @@ -6805,9 +6805,9 @@ ], "test_sql2yql.test[select-values]": [ { - "checksum": "56344757a2a8bf027747880b8e70e81d", - "size": 4504, - "uri": "https://{canondata_backend}/1942173/99e88108149e222741552e7e6cddef041d6a2846/resource.tar.gz#test_sql2yql.test_select-values_/sql.yql" + "checksum": "3bc46145c872ddd157bede47dcf525a1", + "size": 4548, + "uri": "https://{canondata_backend}/1903280/03a80e4eaf2d24e0b4fad2e65ee62b19b904eb3c/resource.tar.gz#test_sql2yql.test_select-values_/sql.yql" } ], "test_sql2yql.test[seq_mode-shared_named_expr]": [ diff --git a/yql/essentials/tools/sql2yql/sql2yql.cpp b/yql/essentials/tools/sql2yql/sql2yql.cpp index ba30d95e4d..199f2fa476 100644 --- a/yql/essentials/tools/sql2yql/sql2yql.cpp +++ b/yql/essentials/tools/sql2yql/sql2yql.cpp @@ -272,6 +272,7 @@ int BuildAST(int argc, char* argv[]) { settings.V0ForceDisable = false; settings.AssumeYdbOnClusterWithSlash = res.Has("assume-ydb-on-slash"); settings.TestAntlr4 = res.Has("test-antlr4"); + settings.EmitReadsForExists = true; if (res.Has("lexer")) { NYql::TIssues issues; diff --git a/yt/yql/tests/sql/suites/select/exists_with_table.sql b/yt/yql/tests/sql/suites/select/exists_with_table.sql new file mode 100644 index 0000000000..990ff664d4 --- /dev/null +++ b/yt/yql/tests/sql/suites/select/exists_with_table.sql @@ -0,0 +1,9 @@ +use plato; + +$ex = EXISTS ( + SELECT + TRUE + FROM Input +); + +SELECT $ex |