Skip to content

Commit 277ed62

Browse files
authored
Fix column order (#7839)
1 parent af1afea commit 277ed62

File tree

4 files changed

+23
-19
lines changed

4 files changed

+23
-19
lines changed

ydb/library/yql/core/type_ann/type_ann_pg.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1823,7 +1823,7 @@ bool ScanColumns(TExprNode::TPtr root, TInputs& inputs, const THashSet<TString>&
18231823
}
18241824
}
18251825

1826-
if (x.Order && x.Order->IsDuplicated(TString(node->Tail().Content()))) {
1826+
if (x.Order && x.Order->IsDuplicatedIgnoreCase(TString(node->Tail().Content()))) {
18271827
ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(node->Pos()),
18281828
TStringBuilder() << "Column reference is ambiguous: " << node->Tail().Content()));
18291829
isError = true;

ydb/library/yql/core/ut/yql_column_order_ut.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,6 @@ using namespace NYql;
99

1010
Y_UNIT_TEST_SUITE(TYqlColumnOrder) {
1111

12-
Y_UNIT_TEST(ColumnOrderIgnoreCase) {
13-
TColumnOrder order;
14-
UNIT_ASSERT_EQUAL(order.AddColumn("a"), "a");
15-
UNIT_ASSERT_EQUAL(order.AddColumn("A"), "A_generated_2");
16-
}
17-
1812
Y_UNIT_TEST(ColumnOrderShrink) {
1913
TColumnOrder order;
2014
UNIT_ASSERT_EQUAL(order.AddColumn("a"), "a");
@@ -32,6 +26,13 @@ Y_UNIT_TEST_SUITE(TYqlColumnOrder) {
3226
UNIT_ASSERT_EQUAL(order.AddColumn("a_generated_2_generated_2"), "a_generated_2_generated_2_generated_2");
3327
}
3428

29+
Y_UNIT_TEST(ColumnOrderCaseSensetive) {
30+
TColumnOrder order;
31+
UNIT_ASSERT_EQUAL(order.AddColumn("a"), "a");
32+
UNIT_ASSERT_EQUAL(order.AddColumn("A"), "A");
33+
UNIT_ASSERT_EQUAL(order.IsDuplicatedIgnoreCase("a"), true);
34+
}
35+
3536
Y_UNIT_TEST(ColumnOrderGeneratedMatchOverVectorCtor) {
3637
TColumnOrder order(TVector<TString>{"a", "a", "a_generated_2", "a_generated_2_generated_2"});
3738
TVector<TColumnOrder::TOrderedItem> got(order.begin(), order.end());

ydb/library/yql/core/yql_type_annotation.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ TString TColumnOrder::Find(const TString& name) const {
124124
TColumnOrder& TColumnOrder::operator=(const TColumnOrder& rhs) {
125125
GeneratedToOriginal_ = rhs.GeneratedToOriginal_;
126126
Order_ = rhs.Order_;
127+
UseCountLcase_ = rhs.UseCountLcase_;
127128
UseCount_ = rhs.UseCount_;
128129
return *this;
129130
}
@@ -137,32 +138,32 @@ TColumnOrder::TColumnOrder(const TVector<TString>& order) {
137138

138139
TString TColumnOrder::AddColumn(const TString& name) {
139140
auto lcase = to_lower(name);
140-
if (uint64_t count = ++UseCount_[lcase]; count > 1) {
141+
++UseCountLcase_[lcase];
142+
if (uint64_t count = ++UseCount_[name]; count > 1) {
141143
TString generated = name + "_generated_" + ToString(count);
142144
GeneratedToOriginal_[generated] = name;
143145
Order_.emplace_back(name, generated);
144-
++UseCount_[to_lower(generated)];
146+
++UseCount_[generated];
145147
return generated;
146148
}
147149
Order_.emplace_back(name, name);
148150
GeneratedToOriginal_[name] = name;
149151
return name;
150152
}
151153

152-
bool TColumnOrder::IsDuplicated(const TString& name) const {
153-
auto it = UseCount_.find(to_lower(name));
154-
return it != UseCount_.end() && it->second > 1;
154+
bool TColumnOrder::IsDuplicatedIgnoreCase(const TString& name) const {
155+
auto it = UseCountLcase_.find(to_lower(name));
156+
return it != UseCountLcase_.end() && it->second > 1;
155157
}
156158

157159
void TColumnOrder::Shrink(size_t remain) {
158160
for (size_t i = remain; i < Order_.size(); ++i) {
159-
auto logicalLcase = to_lower(Order_[i].LogicalName);
160-
if (!--UseCount_[logicalLcase]) {
161-
UseCount_.erase(logicalLcase);
161+
--UseCountLcase_[to_lower(Order_[i].LogicalName)];
162+
if (!--UseCount_[Order_[i].LogicalName]) {
163+
UseCount_.erase(Order_[i].LogicalName);
162164
}
163-
auto physicalLcase = to_lower(Order_[i].PhysicalName);
164-
if (!--UseCount_[physicalLcase]) {
165-
UseCount_.erase(physicalLcase);
165+
if (!--UseCount_[Order_[i].PhysicalName]) {
166+
UseCount_.erase(Order_[i].PhysicalName);
166167
}
167168
GeneratedToOriginal_.erase(Order_[i].PhysicalName);
168169
}
@@ -179,6 +180,7 @@ void TColumnOrder::Clear() {
179180
Order_.clear();
180181
GeneratedToOriginal_.clear();
181182
UseCount_.clear();
183+
UseCountLcase_.clear();
182184
}
183185

184186
void TColumnOrder::EraseIf(const std::function<bool(const TString&)>& fn) {

ydb/library/yql/core/yql_type_annotation.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ class TColumnOrder {
170170
explicit TColumnOrder(const TVector<TString>& order);
171171
TString AddColumn(const TString& name);
172172

173-
bool IsDuplicated(const TString& name) const;
173+
bool IsDuplicatedIgnoreCase(const TString& name) const;
174174

175175
void Shrink(size_t remain);
176176

@@ -213,6 +213,7 @@ class TColumnOrder {
213213
private:
214214
THashMap<TString, TString> GeneratedToOriginal_;
215215
THashMap<TString, uint64_t> UseCount_;
216+
THashMap<TString, uint64_t> UseCountLcase_;
216217
// (name, generated_name)
217218
TVector<TOrderedItem> Order_;
218219
};

0 commit comments

Comments
 (0)