summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json11
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp2
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp30
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp2
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp24
-rw-r--r--ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp2
6 files changed, 56 insertions, 15 deletions
diff --git a/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json b/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
index 90652bc3037..aa52c14f557 100644
--- a/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
+++ b/ydb/library/yql/providers/generic/expr_nodes/yql_generic_expr_nodes.json
@@ -25,13 +25,22 @@
]
},
{
+ "Name": "TGenTable",
+ "Base": "TCallable",
+ "Match": {"Type": "Callable", "Name": "GenTable"},
+ "Children": [
+ {"Index": 0, "Name": "Name", "Type": "TCoAtom"},
+ {"Index": 1, "Name": "Splits", "Type": "TExprBase"}
+ ]
+ },
+ {
"Name": "TGenReadTable",
"Base": "TCallable",
"Match": {"Type": "Callable", "Name": "GenReadTable!"},
"Children": [
{"Index": 0, "Name": "World", "Type": "TExprBase"},
{"Index": 1, "Name": "DataSource", "Type": "TGenDataSource"},
- {"Index": 2, "Name": "Table", "Type": "TCoAtom"},
+ {"Index": 2, "Name": "Table", "Type": "TGenTable"},
{"Index": 3, "Name": "Columns", "Type": "TExprBase"},
{"Index": 4, "Name": "FilterPredicate", "Type": "TCoLambda"}
]
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp
index 70ddd04ed5b..a272e07aba7 100644
--- a/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_datasource.cpp
@@ -126,7 +126,7 @@ namespace NYql {
auto cluster = dataSource.Cast().Cluster();
tableNameBuilder << cluster.Value() << ".";
}
- tableNameBuilder << '`' << maybeTable.Cast().Value() << '`';
+ tableNameBuilder << '`' << maybeTable.Cast().Name().Value() << '`';
inputs.push_back(
TPinInfo(maybeRead.DataSource().Raw(), nullptr, maybeTable.Cast().Raw(), tableNameBuilder, false));
return 1;
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp
index 4d92e8ff400..eb273195a25 100644
--- a/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_datasource_type_ann.cpp
@@ -27,6 +27,7 @@ namespace NYql {
{
using TSelf = TGenericDataSourceTypeAnnotationTransformer;
AddHandler({TCoConfigure::CallableName()}, Hndl(&TSelf::HandleConfig));
+ AddHandler({TGenTable::CallableName()}, Hndl(&TSelf::HandleTable));
AddHandler({TGenReadTable::CallableName()}, Hndl(&TSelf::HandleReadTable));
AddHandler({TGenSourceSettings::CallableName()}, Hndl(&TSelf::HandleSourceSettings));
}
@@ -48,6 +49,19 @@ namespace NYql {
return TStatus::Ok;
}
+ TStatus HandleTable(const TExprNode::TPtr& input, TExprContext& ctx) {
+ if (!EnsureArgsCount(*input, 2, ctx)) {
+ return TStatus::Error;
+ }
+
+ if (!EnsureAtom(*input->Child(TGenTable::idx_Name), ctx)) {
+ return TStatus::Error;
+ }
+
+ input->SetTypeAnn(ctx.MakeType<TUnitExprType>());
+ return TStatus::Ok;
+ }
+
TStatus HandleSourceSettings(const TExprNode::TPtr& input, TExprContext& ctx) {
if (!EnsureArgsCount(*input, 6, ctx)) {
return TStatus::Error;
@@ -131,7 +145,7 @@ namespace NYql {
return TStatus::Error;
}
- if (!EnsureAtom(*input->Child(TGenReadTable::idx_Table), ctx)) {
+ if (!EnsureCallable(*input->Child(TGenReadTable::idx_Table), ctx)) {
return TStatus::Error;
}
@@ -157,9 +171,21 @@ namespace NYql {
}
}
+ // Determine cluster name
TString clusterName{input->Child(TGenReadTable::idx_DataSource)->Child(1)->Content()};
- TString tableName{input->Child(TGenReadTable::idx_Table)->Content()};
+ // Determine table name
+ const auto tableNode = input->Child(TGenReadTable::idx_Table);
+ if (!TGenTable::Match(tableNode)) {
+ ctx.AddError(TIssue(ctx.GetPosition(tableNode->Pos()),
+ TStringBuilder() << "Expected " << TGenTable::CallableName()));
+ return TStatus::Error;
+ }
+
+ TGenTable table(tableNode);
+ const auto tableName = table.Name().StringValue();
+
+ // Extract table metadata
auto [tableMeta, issue] = State_->GetTable(clusterName, tableName, ctx.GetPosition(input->Pos()));
if (issue.has_value()) {
ctx.AddError(issue.value());
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp
index c36536b6fd1..bb5b042b673 100644
--- a/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_dq_integration.cpp
@@ -91,7 +91,7 @@ namespace NYql {
.Input<TGenSourceSettings>()
.World(genReadTable.World())
.Cluster(genReadTable.DataSource().Cluster())
- .Table(genReadTable.Table())
+ .Table(genReadTable.Table().Name())
.Token<TCoSecureParam>()
.Name().Build(token)
.Build()
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp
index 71d3e977362..d243d597e56 100644
--- a/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_load_meta.cpp
@@ -25,16 +25,17 @@ namespace NYql {
using namespace NKikimr;
using namespace NKikimr::NMiniKQL;
- struct TGenericTableDescription {
- using TPtr = std::shared_ptr<TGenericTableDescription>;
-
- NYql::TGenericDataSourceInstance DataSourceInstance;
- std::optional<NConnector::NApi::TDescribeTableResponse> Response;
- };
class TGenericLoadTableMetadataTransformer: public TGraphTransformerBase {
+ struct TTableDescription {
+ using TPtr = std::shared_ptr<TTableDescription>;
+
+ NYql::TGenericDataSourceInstance DataSourceInstance;
+ std::optional<NConnector::NApi::TDescribeTableResponse> Response;
+ };
+
using TMapType =
- std::unordered_map<TGenericState::TTableAddress, TGenericTableDescription::TPtr, THash<TGenericState::TTableAddress>>;
+ std::unordered_map<TGenericState::TTableAddress, TTableDescription::TPtr, THash<TGenericState::TTableAddress>>;
public:
TGenericLoadTableMetadataTransformer(TGenericState::TPtr state)
@@ -101,7 +102,7 @@ namespace NYql {
handles.emplace_back(promise.GetFuture());
// preserve data source instance for the further usage
- auto emplaceIt = Results_.emplace(std::make_pair(item, std::make_shared<TGenericTableDescription>()));
+ auto emplaceIt = Results_.emplace(std::make_pair(item, std::make_shared<TTableDescription>()));
auto desc = emplaceIt.first->second;
desc->DataSourceInstance = request.data_source_instance();
@@ -171,6 +172,7 @@ namespace NYql {
auto row = Build<TCoArgument>(ctx, read.Pos())
.Name("row")
.Done();
+
auto emptyPredicate = Build<TCoLambda>(ctx, read.Pos())
.Args({row})
.Body<TCoBool>()
@@ -178,10 +180,14 @@ namespace NYql {
.Build()
.Done().Ptr();
+ auto table = Build<TGenTable>(ctx, read.Pos())
+ .Name().Value(tableName).Build()
+ .Splits<TCoVoid>().Build().Done();
+
ins.first->second = Build<TGenReadTable>(ctx, read.Pos())
.World(read.World())
.DataSource(read.DataSource())
- .Table().Value(tableName).Build()
+ .Table(table)
.Columns<TCoVoid>().Build()
.FilterPredicate(emptyPredicate)
.Done().Ptr();
diff --git a/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp b/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp
index 73e0101dab0..cce7d7dd5f6 100644
--- a/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp
+++ b/ydb/library/yql/providers/generic/provider/yql_generic_physical_opt.cpp
@@ -72,7 +72,7 @@ namespace NYql {
// Get table metadata
const auto [tableMeta, issue] = State_->GetTable(
read.DataSource().Cluster().Value(),
- read.Table().Value(),
+ read.Table().Name().Value(),
ctx.GetPosition(node.Pos()));
if (issue.has_value()) {
ctx.AddError(issue.value());