diff options
author | aozeritsky <aozeritsky@yandex-team.ru> | 2022-02-16 21:23:41 +0300 |
---|---|---|
committer | aozeritsky <aozeritsky@yandex-team.ru> | 2022-02-16 21:23:41 +0300 |
commit | a5e921af94bce492710aad92508bbc36558fcd43 (patch) | |
tree | a690b9b936c194d7e647c39196a9515b7dd5f696 | |
parent | b20c65506a1f7b04301e08a6301317fbcb7c15b8 (diff) | |
download | ydb-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.h | 1 | ||||
-rw-r--r-- | ydb/library/yql/providers/dq/provider/yql_dq_recapture.cpp | 13 |
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"); |