aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <vvvv@yandex-team.com>2025-01-29 16:02:22 +0300
committervvvv <vvvv@yandex-team.com>2025-01-29 16:23:33 +0300
commit15cba7449cdb7409f8e0ac12c6f77cb22e6e7bed (patch)
tree2e89b429c7870c2bab4a2af3d3d4015dc3b39ead
parentbe36d7b60684c12f59cbbb6ef49017e5d7f4440d (diff)
downloadydb-15cba7449cdb7409f8e0ac12c6f77cb22e6e7bed.tar.gz
EXISTS with tables YQL-19496
commit_hash:76639a66853d8a9d514e4b11f47e14e2d26e26c4
-rw-r--r--yql/essentials/core/facade/yql_facade.cpp6
-rw-r--r--yql/essentials/core/facade/yql_facade.h2
-rw-r--r--yql/essentials/public/fastcheck/fastcheck.cpp1
-rw-r--r--yql/essentials/public/purecalc/common/worker_factory.cpp1
-rw-r--r--yql/essentials/sql/settings/translation_settings.h1
-rw-r--r--yql/essentials/sql/v1/select.cpp5
-rw-r--r--yql/essentials/sql/v1/sql_expression.cpp17
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/result.json6
-rw-r--r--yql/essentials/tools/sql2yql/sql2yql.cpp1
-rw-r--r--yt/yql/tests/sql/suites/select/exists_with_table.sql9
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