From f24776b2589f17f28403eb5b2cd5fd2772aee2d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=BE=D0=B6=D0=B8=D0=BB=D0=BE=D0=B2?= Date: Thu, 15 Aug 2024 15:16:46 +0300 Subject: [PATCH 1/3] fix --- ydb/library/yql/core/yql_type_annotation.cpp | 18 +++++++++--------- ydb/library/yql/core/yql_type_annotation.h | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ydb/library/yql/core/yql_type_annotation.cpp b/ydb/library/yql/core/yql_type_annotation.cpp index b565f615650c..05c7403fe0bf 100644 --- a/ydb/library/yql/core/yql_type_annotation.cpp +++ b/ydb/library/yql/core/yql_type_annotation.cpp @@ -137,11 +137,12 @@ TColumnOrder::TColumnOrder(const TVector& order) { TString TColumnOrder::AddColumn(const TString& name) { auto lcase = to_lower(name); - if (uint64_t count = ++UseCount_[lcase]; count > 1) { + ++UseCountLcase_[lcase]; + if (uint64_t count = ++UseCount_[name]; count > 1) { TString generated = name + "_generated_" + ToString(count); GeneratedToOriginal_[generated] = name; Order_.emplace_back(name, generated); - ++UseCount_[to_lower(generated)]; + ++UseCount_[generated]; return generated; } Order_.emplace_back(name, name); @@ -150,19 +151,18 @@ TString TColumnOrder::AddColumn(const TString& name) { } bool TColumnOrder::IsDuplicated(const TString& name) const { - auto it = UseCount_.find(to_lower(name)); + auto it = UseCountLcase_.find(to_lower(name)); return it != UseCount_.end() && it->second > 1; } void TColumnOrder::Shrink(size_t remain) { for (size_t i = remain; i < Order_.size(); ++i) { - auto logicalLcase = to_lower(Order_[i].LogicalName); - if (!--UseCount_[logicalLcase]) { - UseCount_.erase(logicalLcase); + --UseCountLcase_[to_lower(Order_[i].LogicalName)]; + if (!--UseCount_[Order_[i].LogicalName]) { + UseCount_.erase(Order_[i].LogicalName); } - auto physicalLcase = to_lower(Order_[i].PhysicalName); - if (!--UseCount_[physicalLcase]) { - UseCount_.erase(physicalLcase); + if (!--UseCount_[Order_[i].PhysicalName]) { + UseCount_.erase(Order_[i].PhysicalName); } GeneratedToOriginal_.erase(Order_[i].PhysicalName); } diff --git a/ydb/library/yql/core/yql_type_annotation.h b/ydb/library/yql/core/yql_type_annotation.h index dbc63d61d5f3..e94a2385d7a5 100644 --- a/ydb/library/yql/core/yql_type_annotation.h +++ b/ydb/library/yql/core/yql_type_annotation.h @@ -213,6 +213,7 @@ class TColumnOrder { private: THashMap GeneratedToOriginal_; THashMap UseCount_; + THashMap UseCountLcase_; // (name, generated_name) TVector Order_; }; From 510663fd36211c613280a423e96713c6864b1c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=BE=D0=B6=D0=B8=D0=BB=D0=BE=D0=B2?= Date: Thu, 15 Aug 2024 16:46:21 +0300 Subject: [PATCH 2/3] fix --- ydb/library/yql/core/type_ann/type_ann_pg.cpp | 2 +- ydb/library/yql/core/ut/yql_column_order_ut.cpp | 7 +++++++ ydb/library/yql/core/yql_type_annotation.cpp | 2 +- ydb/library/yql/core/yql_type_annotation.h | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ydb/library/yql/core/type_ann/type_ann_pg.cpp b/ydb/library/yql/core/type_ann/type_ann_pg.cpp index 56237c8abcd7..04e6d45bce42 100644 --- a/ydb/library/yql/core/type_ann/type_ann_pg.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_pg.cpp @@ -1823,7 +1823,7 @@ bool ScanColumns(TExprNode::TPtr root, TInputs& inputs, const THashSet& } } - if (x.Order && x.Order->IsDuplicated(TString(node->Tail().Content()))) { + if (x.Order && x.Order->IsDuplicatedIgnoreCase(TString(node->Tail().Content()))) { ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(node->Pos()), TStringBuilder() << "Column reference is ambiguous: " << node->Tail().Content())); isError = true; diff --git a/ydb/library/yql/core/ut/yql_column_order_ut.cpp b/ydb/library/yql/core/ut/yql_column_order_ut.cpp index 9af0fb4f6989..38e012b5dfda 100644 --- a/ydb/library/yql/core/ut/yql_column_order_ut.cpp +++ b/ydb/library/yql/core/ut/yql_column_order_ut.cpp @@ -32,6 +32,13 @@ Y_UNIT_TEST_SUITE(TYqlColumnOrder) { UNIT_ASSERT_EQUAL(order.AddColumn("a_generated_2_generated_2"), "a_generated_2_generated_2_generated_2"); } + Y_UNIT_TEST(ColumnOrderCaseSensetive) { + TColumnOrder order; + UNIT_ASSERT_EQUAL(order.AddColumn("a"), "a"); + UNIT_ASSERT_EQUAL(order.AddColumn("A"), "A"); + UNIT_ASSERT_EQUAL(order.IsDuplicatedIgnoreCase("a"), true); + } + Y_UNIT_TEST(ColumnOrderGeneratedMatchOverVectorCtor) { TColumnOrder order(TVector{"a", "a", "a_generated_2", "a_generated_2_generated_2"}); TVector got(order.begin(), order.end()); diff --git a/ydb/library/yql/core/yql_type_annotation.cpp b/ydb/library/yql/core/yql_type_annotation.cpp index 05c7403fe0bf..92eed308c1b2 100644 --- a/ydb/library/yql/core/yql_type_annotation.cpp +++ b/ydb/library/yql/core/yql_type_annotation.cpp @@ -150,7 +150,7 @@ TString TColumnOrder::AddColumn(const TString& name) { return name; } -bool TColumnOrder::IsDuplicated(const TString& name) const { +bool TColumnOrder::IsDuplicatedIgnoreCase(const TString& name) const { auto it = UseCountLcase_.find(to_lower(name)); return it != UseCount_.end() && it->second > 1; } diff --git a/ydb/library/yql/core/yql_type_annotation.h b/ydb/library/yql/core/yql_type_annotation.h index e94a2385d7a5..2c4c32aa9122 100644 --- a/ydb/library/yql/core/yql_type_annotation.h +++ b/ydb/library/yql/core/yql_type_annotation.h @@ -170,7 +170,7 @@ class TColumnOrder { explicit TColumnOrder(const TVector& order); TString AddColumn(const TString& name); - bool IsDuplicated(const TString& name) const; + bool IsDuplicatedIgnoreCase(const TString& name) const; void Shrink(size_t remain); From 2a66eaa21b2796f7f174d7098f01f608aba754e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=BE=D0=B6=D0=B8=D0=BB=D0=BE=D0=B2?= Date: Thu, 15 Aug 2024 21:03:29 +0300 Subject: [PATCH 3/3] fix --- ydb/library/yql/core/ut/yql_column_order_ut.cpp | 6 ------ ydb/library/yql/core/yql_type_annotation.cpp | 4 +++- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/ydb/library/yql/core/ut/yql_column_order_ut.cpp b/ydb/library/yql/core/ut/yql_column_order_ut.cpp index 38e012b5dfda..9d5e1d07e23d 100644 --- a/ydb/library/yql/core/ut/yql_column_order_ut.cpp +++ b/ydb/library/yql/core/ut/yql_column_order_ut.cpp @@ -9,12 +9,6 @@ using namespace NYql; Y_UNIT_TEST_SUITE(TYqlColumnOrder) { - Y_UNIT_TEST(ColumnOrderIgnoreCase) { - TColumnOrder order; - UNIT_ASSERT_EQUAL(order.AddColumn("a"), "a"); - UNIT_ASSERT_EQUAL(order.AddColumn("A"), "A_generated_2"); - } - Y_UNIT_TEST(ColumnOrderShrink) { TColumnOrder order; UNIT_ASSERT_EQUAL(order.AddColumn("a"), "a"); diff --git a/ydb/library/yql/core/yql_type_annotation.cpp b/ydb/library/yql/core/yql_type_annotation.cpp index 92eed308c1b2..639c81443f2b 100644 --- a/ydb/library/yql/core/yql_type_annotation.cpp +++ b/ydb/library/yql/core/yql_type_annotation.cpp @@ -124,6 +124,7 @@ TString TColumnOrder::Find(const TString& name) const { TColumnOrder& TColumnOrder::operator=(const TColumnOrder& rhs) { GeneratedToOriginal_ = rhs.GeneratedToOriginal_; Order_ = rhs.Order_; + UseCountLcase_ = rhs.UseCountLcase_; UseCount_ = rhs.UseCount_; return *this; } @@ -152,7 +153,7 @@ TString TColumnOrder::AddColumn(const TString& name) { bool TColumnOrder::IsDuplicatedIgnoreCase(const TString& name) const { auto it = UseCountLcase_.find(to_lower(name)); - return it != UseCount_.end() && it->second > 1; + return it != UseCountLcase_.end() && it->second > 1; } void TColumnOrder::Shrink(size_t remain) { @@ -179,6 +180,7 @@ void TColumnOrder::Clear() { Order_.clear(); GeneratedToOriginal_.clear(); UseCount_.clear(); + UseCountLcase_.clear(); } void TColumnOrder::EraseIf(const std::function& fn) {