Skip to content

Commit eba228e

Browse files
authored
Support duplicated column names (#6553)
1 parent db92b74 commit eba228e

File tree

106 files changed

+1562
-227
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+1562
-227
lines changed

ydb/core/kqp/provider/yql_kikimr_results.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ NKikimrMiniKQL::TResult* KikimrResultToProto(const NKikimrMiniKQL::TResult& resu
371371
auto* truncatedValue = packedValue->AddStruct();
372372

373373
bool truncated = false;
374+
TColumnOrder order(columnHints);
374375
if (result.GetType().GetKind() == NKikimrMiniKQL::ETypeKind::List) {
375376
const auto& itemType = result.GetType().GetList().GetItem();
376377

@@ -386,11 +387,11 @@ NKikimrMiniKQL::TResult* KikimrResultToProto(const NKikimrMiniKQL::TResult& resu
386387
auto* newItem = dataType->MutableList()->MutableItem();
387388
newItem->SetKind(NKikimrMiniKQL::ETypeKind::Struct);
388389
auto* newStructType = newItem->MutableStruct();
389-
for (auto& column : columnHints) {
390-
auto* memberIndex = memberIndices.FindPtr(column);
390+
for (auto& [column, gen_col] : order) {
391+
auto* memberIndex = memberIndices.FindPtr(gen_col);
391392
YQL_ENSURE(memberIndex);
392393

393-
*newStructType->AddMember() = structType.GetMember(*memberIndex);
394+
(*newStructType->AddMember() = structType.GetMember(*memberIndex)).SetName(column);
394395
}
395396
} else {
396397
*dataType = result.GetType();
@@ -403,11 +404,10 @@ NKikimrMiniKQL::TResult* KikimrResultToProto(const NKikimrMiniKQL::TResult& resu
403404
truncated = true;
404405
break;
405406
}
406-
407407
if (!memberIndices.empty()) {
408408
auto* newStruct = dataValue->AddList();
409-
for (auto& column : columnHints) {
410-
auto* memberIndex = memberIndices.FindPtr(column);
409+
for (auto& [column, gen_column] : order) {
410+
auto* memberIndex = memberIndices.FindPtr(gen_column);
411411
YQL_ENSURE(memberIndex);
412412

413413
*newStruct->AddStruct() = item.GetStruct(*memberIndex);

ydb/core/kqp/provider/yql_kikimr_type_ann.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ class TKiSourceTypeAnnotationTransformer : public TKiSourceVisitorTransformer {
171171
node.Ptr()->SetTypeAnn(tupleAnn);
172172

173173
YQL_ENSURE(tableDesc->Metadata->ColumnOrder.size() == tableDesc->Metadata->Columns.size());
174-
return Types.SetColumnOrder(node.Ref(), tableDesc->Metadata->ColumnOrder, ctx);
174+
return Types.SetColumnOrder(node.Ref(), TColumnOrder(tableDesc->Metadata->ColumnOrder), ctx);
175175
}
176176

177177
case TKikimrKey::Type::TableList:
@@ -490,7 +490,7 @@ class TKiSinkTypeAnnotationTransformer : public TKiSinkVisitorTransformer
490490
auto op = GetTableOp(node);
491491
if (NPgTypeAnn::IsPgInsert(node, op)) {
492492
TExprNode::TPtr newInput;
493-
auto ok = NCommon::RenamePgSelectColumns(node.Input().Cast<TCoPgSelect>(), newInput, table->Metadata->ColumnOrder, ctx, Types);
493+
auto ok = NCommon::RenamePgSelectColumns(node.Input().Cast<TCoPgSelect>(), newInput, TColumnOrder(table->Metadata->ColumnOrder), ctx, Types);
494494
if (!ok) {
495495
return TStatus::Error;
496496
}

ydb/library/yql/core/common_opt/yql_co_pgselect.cpp

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -791,21 +791,21 @@ TExprNode::TPtr NormalizeColumnOrder(const TExprNode::TPtr& node, const TColumnO
791791
return node;
792792
}
793793

794-
YQL_ENSURE(sourceColumnOrder.size() == targetColumnOrder.size());
794+
YQL_ENSURE(sourceColumnOrder.Size() == targetColumnOrder.Size());
795795
return ctx.Builder(node->Pos())
796796
.Callable("OrderedMap")
797797
.Add(0, node)
798798
.Lambda(1)
799799
.Param("row")
800800
.Callable("AsStruct")
801801
.Do([&](TExprNodeBuilder &parent) -> TExprNodeBuilder & {
802-
for (size_t i = 0; i < sourceColumnOrder.size(); ++i) {
802+
for (size_t i = 0; i < sourceColumnOrder.Size(); ++i) {
803803
parent
804804
.List(i)
805-
.Atom(0, targetColumnOrder[i])
805+
.Atom(0, targetColumnOrder[i].PhysicalName)
806806
.Callable(1, "Member")
807807
.Arg(0, "row")
808-
.Atom(1, sourceColumnOrder[i])
808+
.Atom(1, sourceColumnOrder[i].PhysicalName)
809809
.Seal()
810810
.Seal();
811811
}
@@ -1077,7 +1077,7 @@ void FillInputIndices(const TExprNode::TPtr& from, const TExprNode::TPtr& finalE
10771077
for (ui32 i = 0; i < columns.ChildrenSize(); ++i) {
10781078
if (columns.Child(i)->Content() == column) {
10791079
foundColumn = true;
1080-
x.second.second = (*readOrder)[i];
1080+
x.second.second = readOrder->at(i).PhysicalName;
10811081
break;
10821082
}
10831083
}
@@ -1163,13 +1163,13 @@ TExprNode::TListType BuildCleanedColumns(TPositionHandle pos, const TExprNode::T
11631163
.Do([&](TExprNodeBuilder& parent) -> TExprNodeBuilder & {
11641164
auto originalColumnOrder = typeCtx.LookupColumnOrder(*originalList);
11651165
YQL_ENSURE(originalColumnOrder);
1166-
YQL_ENSURE(originalColumnOrder->size() == columns.ChildrenSize());
1166+
YQL_ENSURE(originalColumnOrder->Size() == columns.ChildrenSize());
11671167
for (ui32 i = 0; i < columns.ChildrenSize(); ++i) {
11681168
parent.List(i)
11691169
.Atom(0, columns.Child(i)->Content())
11701170
.Callable(1, "Member")
11711171
.Arg(0, "item")
1172-
.Atom(1, (*originalColumnOrder)[i])
1172+
.Atom(1, originalColumnOrder->at(i).PhysicalName)
11731173
.Seal()
11741174
.Seal();
11751175
}
@@ -1213,7 +1213,7 @@ TExprNode::TListType BuildCleanedColumns(TPositionHandle pos, const TExprNode::T
12131213
}
12141214
}
12151215
}
1216-
1216+
TColumnOrder order;
12171217
auto cleaned = ctx.Builder(pos)
12181218
.Callable("OrderedMap")
12191219
.Add(0, list)
@@ -1232,7 +1232,7 @@ TExprNode::TListType BuildCleanedColumns(TPositionHandle pos, const TExprNode::T
12321232
listBuilder.Atom(0, x.first);
12331233
listBuilder.Callable(1, "Member")
12341234
.Arg(0, "row")
1235-
.Atom(1, x.second.second ? x.second.second : NTypeAnnImpl::RemoveAlias(x.first))
1235+
.Atom(1, order.AddColumn(TString(x.second.second ? x.second.second : NTypeAnnImpl::RemoveAlias(x.first))))
12361236
.Seal();
12371237
listBuilder.Seal();
12381238
}
@@ -1950,13 +1950,15 @@ TExprNode::TPtr BuildProjectionLambda(TPositionHandle pos, const TExprNode::TPtr
19501950
const TColumnOrder& nodeColumnOrder, const TColumnOrder& setItemColumnOrder,
19511951
bool subLink, bool emitPgStar, TExprContext& ctx) {
19521952

1953-
YQL_ENSURE(nodeColumnOrder.size() == setItemColumnOrder.size());
1953+
YQL_ENSURE(nodeColumnOrder.Size() == setItemColumnOrder.Size());
19541954

19551955
TMap<TStringBuf, TStringBuf> columnNamesMap;
1956-
for (size_t i = 0; i < nodeColumnOrder.size(); ++i) {
1957-
columnNamesMap[setItemColumnOrder[i]] = nodeColumnOrder[i];
1956+
for (size_t i = 0; i < nodeColumnOrder.Size(); ++i) {
1957+
columnNamesMap[setItemColumnOrder[i].PhysicalName] = nodeColumnOrder[i].PhysicalName;
19581958
}
19591959

1960+
TColumnOrder order;
1961+
19601962
return ctx.Builder(pos)
19611963
.Lambda()
19621964
.Param("row")
@@ -2025,28 +2027,38 @@ TExprNode::TPtr BuildProjectionLambda(TPositionHandle pos, const TExprNode::TPtr
20252027
continue;
20262028
}
20272029
const auto& columnName = x->Head().Content();
2030+
auto rightColumnName = order.AddColumn(TString(columnName));
20282031

20292032
auto listBuilder = parent.List(index++);
2030-
listBuilder.Add(0, x->HeadPtr());
2031-
addPgCast(listBuilder, 1, columnName, x->GetTypeAnn(),
2033+
listBuilder.Add(0, ctx.NewAtom(x->Pos(), rightColumnName));
2034+
addPgCast(listBuilder, 1, rightColumnName, x->GetTypeAnn(),
20322035
[&addResultItem, &x] (TExprNodeBuilder& builder, ui32 idx) { addResultItem(builder, idx, x.Get()); });
20332036
} else {
20342037
auto type = x->Child(1)->GetTypeAnn()->Cast<TTypeExprType>()->GetType()->Cast<TStructExprType>();
20352038
Y_ENSURE(type);
2039+
TColumnOrder localOrder;
2040+
for (auto& c: x->Child(0)->Children()) {
2041+
if (c->IsAtom()) {
2042+
localOrder.AddColumn(TString(c->Content()));
2043+
} else {
2044+
localOrder.AddColumn(TString(c->HeadPtr()->Content()));
2045+
}
2046+
}
20362047

20372048
for (const auto& item : type->GetItems()) {
20382049
TStringBuf column = item->GetName();
20392050
auto columnName = subLink ? column : NTypeAnnImpl::RemoveAlias(column);
2051+
auto rightColumnName = order.AddColumn(localOrder.Find(TString(columnName)));
20402052

20412053
auto listBuilder = parent.List(index++);
20422054
if (auto* columnNode = overrideColumns.FindPtr(columnName)) {
20432055
// we never get here while processing SELECTs,
20442056
// so no need to add PgCasts due to query combining with UNION ALL et al
2045-
listBuilder.Add(0, (*columnNode)->HeadPtr());
2057+
listBuilder.Add(0, ctx.NewAtom(x->Pos(), rightColumnName));
20462058
addResultItem(listBuilder, 1, *columnNode);
20472059
} else {
2048-
listBuilder.Atom(0, columnName);
2049-
addPgCast(listBuilder, 1, columnName, item->GetItemType(),
2060+
listBuilder.Add(0, ctx.NewAtom(x->Pos(), rightColumnName));
2061+
addPgCast(listBuilder, 1, rightColumnName, item->GetItemType(),
20502062
[&addStructMember, &column] (TExprNodeBuilder& builder, ui32 idx) { addStructMember(builder, idx, column); });
20512063
}
20522064
}
@@ -3668,7 +3680,7 @@ TExprNode::TPtr ExpandPgSelectImpl(const TExprNode::TPtr& node, TExprContext& ct
36683680
auto order = optCtx.Types->LookupColumnOrder(*node);
36693681
YQL_ENSURE(order);
36703682
TExprNode::TListType columnsItems;
3671-
for (const auto& x : *order) {
3683+
for (const auto& [x, gen_x] : *order) {
36723684
columnsItems.push_back(ctx.NewAtom(node->Pos(), x));
36733685
}
36743686

@@ -3679,7 +3691,7 @@ TExprNode::TPtr ExpandPgSelectImpl(const TExprNode::TPtr& node, TExprContext& ct
36793691
for (const auto& x : extColumns) {
36803692
auto name = TString("_yql_join_sublink_") + ToString(*subLinkId) + "_" + x.first;
36813693
columnsItems.push_back(ctx.NewAtom(node->Pos(), name));
3682-
targetOrder.push_back(name);
3694+
targetOrder.AddColumn(name);
36833695
}
36843696
}
36853697

@@ -3701,7 +3713,9 @@ TExprNode::TPtr ExpandPgSelectImpl(const TExprNode::TPtr& node, TExprContext& ct
37013713
columnOrders.push_back(*childOrder);
37023714
if (subLinkId) {
37033715
auto& setOrder = columnOrders.back();
3704-
setOrder.insert(setOrder.end(), targetOrder.end() - extColumns.size(), targetOrder.end());
3716+
for (size_t i = targetOrder.Size() - extColumns.size(); i < targetOrder.Size(); ++i) {
3717+
setOrder.AddColumn(targetOrder[i].LogicalName);
3718+
}
37053719
}
37063720

37073721
auto finalExtTypes = GetSetting(setItem->Tail(), "final_ext_types");

0 commit comments

Comments
 (0)