aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ydb/core/kqp/ut/pg/kqp_pg_ut.cpp2
-rw-r--r--ydb/library/yql/parser/pg_catalog/catalog.cpp16
-rw-r--r--ydb/library/yql/parser/pg_catalog/catalog.h2
-rw-r--r--ydb/library/yql/parser/pg_catalog/ut/catalog_consts_ut.cpp19
4 files changed, 31 insertions, 8 deletions
diff --git a/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp b/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp
index e37b80e71c..4fa846fdc3 100644
--- a/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp
+++ b/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp
@@ -253,7 +253,7 @@ Y_UNIT_TEST_SUITE(KqpPg) {
},
{
VARCHAROID,
- false,
+ true,
[] (auto i) { return Sprintf("varchar %u", i); },
[] (auto i) { return Sprintf("varchar %u", i); },
[] (auto s) { return Sprintf("{\"%s\",\"%s\"}", s.c_str(), s.c_str()); }
diff --git a/ydb/library/yql/parser/pg_catalog/catalog.cpp b/ydb/library/yql/parser/pg_catalog/catalog.cpp
index 6a50af9c44..5a806211e6 100644
--- a/ydb/library/yql/parser/pg_catalog/catalog.cpp
+++ b/ydb/library/yql/parser/pg_catalog/catalog.cpp
@@ -1482,11 +1482,12 @@ struct TCatalog {
AmProcs = ParseAmProcs(amProcData, TypeByName, ProcByName, Procs, opFamilies);
for (auto& [k, v] : Types) {
if (v.TypeId != v.ArrayTypeId) {
- auto btreeOpClassPtr = OpClasses.FindPtr(std::make_pair(EOpClassMethod::Btree, v.TypeId));
+ auto lookupId = (v.TypeId == VarcharOid ? TextOid : v.TypeId);
+ auto btreeOpClassPtr = OpClasses.FindPtr(std::make_pair(EOpClassMethod::Btree, lookupId));
if (btreeOpClassPtr) {
- auto lessAmOpPtr = AmOps.FindPtr(std::make_tuple(btreeOpClassPtr->FamilyId, ui32(EBtreeAmStrategy::Less), v.TypeId, v.TypeId));
+ auto lessAmOpPtr = AmOps.FindPtr(std::make_tuple(btreeOpClassPtr->FamilyId, ui32(EBtreeAmStrategy::Less), lookupId, lookupId));
Y_ENSURE(lessAmOpPtr);
- auto equalAmOpPtr = AmOps.FindPtr(std::make_tuple(btreeOpClassPtr->FamilyId, ui32(EBtreeAmStrategy::Equal), v.TypeId, v.TypeId));
+ auto equalAmOpPtr = AmOps.FindPtr(std::make_tuple(btreeOpClassPtr->FamilyId, ui32(EBtreeAmStrategy::Equal), lookupId, lookupId));
Y_ENSURE(equalAmOpPtr);
auto lessOperPtr = Operators.FindPtr(lessAmOpPtr->OperId);
Y_ENSURE(lessOperPtr);
@@ -1495,14 +1496,14 @@ struct TCatalog {
v.LessProcId = lessOperPtr->ProcId;
v.EqualProcId = equalOperPtr->ProcId;
- auto compareAmProcPtr = AmProcs.FindPtr(std::make_tuple(btreeOpClassPtr->FamilyId, ui32(EBtreeAmProcNum::Compare), v.TypeId, v.TypeId));
+ auto compareAmProcPtr = AmProcs.FindPtr(std::make_tuple(btreeOpClassPtr->FamilyId, ui32(EBtreeAmProcNum::Compare), lookupId, lookupId));
Y_ENSURE(compareAmProcPtr);
v.CompareProcId = compareAmProcPtr->ProcId;
}
- auto hashOpClassPtr = OpClasses.FindPtr(std::make_pair(EOpClassMethod::Hash, v.TypeId));
+ auto hashOpClassPtr = OpClasses.FindPtr(std::make_pair(EOpClassMethod::Hash, lookupId));
if (hashOpClassPtr) {
- auto hashAmProcPtr = AmProcs.FindPtr(std::make_tuple(hashOpClassPtr->FamilyId, ui32(EHashAmProcNum::Hash), v.TypeId, v.TypeId));
+ auto hashAmProcPtr = AmProcs.FindPtr(std::make_tuple(hashOpClassPtr->FamilyId, ui32(EHashAmProcNum::Hash), lookupId, lookupId));
Y_ENSURE(hashAmProcPtr);
v.HashProcId = hashAmProcPtr->ProcId;
}
@@ -2580,7 +2581,8 @@ bool HasOpClass(EOpClassMethod method, ui32 typeId) {
const TOpClassDesc* LookupDefaultOpClass(EOpClassMethod method, ui32 typeId) {
const auto& catalog = TCatalog::Instance();
- const auto opClassPtr = catalog.OpClasses.FindPtr(std::make_pair(method, typeId));
+ auto lookupId = (typeId == VarcharOid ? TextOid : typeId);
+ const auto opClassPtr = catalog.OpClasses.FindPtr(std::make_pair(method, lookupId));
if (opClassPtr)
return opClassPtr;
diff --git a/ydb/library/yql/parser/pg_catalog/catalog.h b/ydb/library/yql/parser/pg_catalog/catalog.h
index 9af2f37e83..cea4371b7c 100644
--- a/ydb/library/yql/parser/pg_catalog/catalog.h
+++ b/ydb/library/yql/parser/pg_catalog/catalog.h
@@ -13,6 +13,8 @@ constexpr ui32 UnknownOid = 705;
constexpr ui32 AnyOid = 2276;
constexpr ui32 AnyArrayOid = 2277;
constexpr ui32 RecordOid = 2249;
+constexpr ui32 VarcharOid = 1043;
+constexpr ui32 TextOid = 25;
// copied from pg_class.h
enum class ERelPersistence : char
diff --git a/ydb/library/yql/parser/pg_catalog/ut/catalog_consts_ut.cpp b/ydb/library/yql/parser/pg_catalog/ut/catalog_consts_ut.cpp
index bb4c57497c..081e0a1ca7 100644
--- a/ydb/library/yql/parser/pg_catalog/ut/catalog_consts_ut.cpp
+++ b/ydb/library/yql/parser/pg_catalog/ut/catalog_consts_ut.cpp
@@ -8,6 +8,9 @@ extern "C" {
#include <library/cpp/testing/unittest/registar.h>
+
+using namespace NYql::NPg;
+
Y_UNIT_TEST_SUITE(TConstantsTests) {
Y_UNIT_TEST(TestCollationConsts) {
UNIT_ASSERT(NYql::NPg::DefaultCollationOid == DEFAULT_COLLATION_OID);
@@ -22,4 +25,20 @@ Y_UNIT_TEST_SUITE(TConstantsTests) {
UNIT_ASSERT(static_cast<ui32>(NYql::NPg::EBtreeAmStrategy::GreaterOrEqual) == BTGreaterEqualStrategyNumber);
UNIT_ASSERT(static_cast<ui32>(NYql::NPg::EBtreeAmStrategy::Greater) == BTGreaterStrategyNumber);
}
+
+ Y_UNIT_TEST(TTypeOidConsts) {
+ TTypeDesc typeDesc;
+ typeDesc = LookupType("unknown");
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.TypeId, UnknownOid);
+ typeDesc = LookupType("any");
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.TypeId, AnyOid);
+ typeDesc = LookupType("anyarray");
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.TypeId, AnyArrayOid);
+ typeDesc = LookupType("record");
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.TypeId, RecordOid);
+ typeDesc = LookupType("varchar");
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.TypeId, VarcharOid);
+ typeDesc = LookupType("text");
+ UNIT_ASSERT_VALUES_EQUAL(typeDesc.TypeId, TextOid);
+ }
}