aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraozeritsky <aozeritsky@yandex-team.ru>2022-02-16 21:23:41 +0300
committeraozeritsky <aozeritsky@yandex-team.ru>2022-02-16 21:23:41 +0300
commita5e921af94bce492710aad92508bbc36558fcd43 (patch)
treea690b9b936c194d7e647c39196a9515b7dd5f696
parentb20c65506a1f7b04301e08a6301317fbcb7c15b8 (diff)
downloadydb-a5e921af94bce492710aad92508bbc36558fcd43.tar.gz
YQL-13572: Don't run literal query if unsupported pragma is enabled
ref:a526993f1a04635c98b81517a74e33ed43c0ef91
-rw-r--r--ydb/library/yql/providers/dq/interface/yql_dq_integration.h1
-rw-r--r--ydb/library/yql/providers/dq/provider/yql_dq_recapture.cpp13
2 files changed, 12 insertions, 2 deletions
diff --git a/ydb/library/yql/providers/dq/interface/yql_dq_integration.h b/ydb/library/yql/providers/dq/interface/yql_dq_integration.h
index ee1938e698c..f55fdb03e2a 100644
--- a/ydb/library/yql/providers/dq/interface/yql_dq_integration.h
+++ b/ydb/library/yql/providers/dq/interface/yql_dq_integration.h
@@ -28,6 +28,7 @@ public:
virtual ui64 Partition(const TDqSettings& config, size_t maxPartitions, const TExprNode& node,
TVector<TString>& partitions, TString* clusterName, TExprContext& ctx, bool canFallback) = 0;
+ virtual bool CheckPragmas(const TExprNode& node, TExprContext& ctx, bool skipIssues = false) { Y_UNUSED(skipIssues); Y_UNUSED(node); Y_UNUSED(ctx); return true; }
virtual TMaybe<ui64> CanRead(const TDqSettings& config, const TExprNode& read, TExprContext& ctx, bool skipIssues = true) = 0;
virtual TExprNode::TPtr WrapRead(const TDqSettings& config, const TExprNode::TPtr& read, TExprContext& ctx) = 0;
virtual TMaybe<bool> CanWrite(const TDqSettings& config, const TExprNode& write, TExprContext& ctx) = 0;
diff --git a/ydb/library/yql/providers/dq/provider/yql_dq_recapture.cpp b/ydb/library/yql/providers/dq/provider/yql_dq_recapture.cpp
index 90e8af759c7..79b9c9ff099 100644
--- a/ydb/library/yql/providers/dq/provider/yql_dq_recapture.cpp
+++ b/ydb/library/yql/providers/dq/provider/yql_dq_recapture.cpp
@@ -145,6 +145,7 @@ private:
hasJoin = true;
}
+
if (TCoCommit::Match(&node)) {
for (size_t i = 0; i != node.ChildrenSize() && good; ++i) {
if (i != TCoCommit::idx_DataSink) {
@@ -180,11 +181,19 @@ private:
if (dataSourceName != DqProviderName && !node.IsCallable(ConfigureName)) {
auto datasource = State_->TypeCtx->DataSourceMap.FindPtr(dataSourceName);
YQL_ENSURE(datasource);
- if (auto dqIntegration = (*datasource)->GetDqIntegration()) {
- if (auto size = dqIntegration->CanRead(*State_->Settings, node, ctx, /*skipIssues = */ false)) {
+ auto dqIntegration = (*datasource)->GetDqIntegration();
+ if (dqIntegration) {
+ TMaybe<ui64> size;
+ bool pragmas = true;
+ if ((pragmas = dqIntegration->CheckPragmas(node, ctx, false)) && (size = dqIntegration->CanRead(*State_->Settings, node, ctx, /*skipIssues = */ false))) {
dataSize += *size;
} else {
good = false;
+ if (!pragmas) {
+ State_->TypeCtx->PureResultDataSource.clear();
+ std::erase_if(State_->TypeCtx->AvailablePureResultDataSources,
+ [&](const auto& name) { return name == DqProviderName; });
+ }
}
} else {
AddInfo(ctx, TStringBuilder() << "source '" << dataSourceName << "' is not supported by DQ");