diff options
author | Aleksei Pleshakov <qrort@ydb.tech> | 2023-12-15 17:43:55 +0300 |
---|---|---|
committer | qrort <qrort@ydb.tech> | 2023-12-15 21:47:37 +0300 |
commit | 57f445b9b299ad78ba3bc5ee19bd7a300bd6e14c (patch) | |
tree | 2940c8b86f04833501320d73ca90f90d3e72048e | |
parent | d10591e58abc60d4b0f66d6a830149a15a7cf6ea (diff) | |
download | ydb-57f445b9b299ad78ba3bc5ee19bd7a300bd6e14c.tar.gz |
pg varchar as primary key
pg varchar as primary key
Pull Request resolved: https://github.com/ydb-platform/ydb/pull/487
-rw-r--r-- | ydb/core/kqp/ut/pg/kqp_pg_ut.cpp | 2 | ||||
-rw-r--r-- | ydb/library/yql/parser/pg_catalog/catalog.cpp | 16 | ||||
-rw-r--r-- | ydb/library/yql/parser/pg_catalog/catalog.h | 2 | ||||
-rw-r--r-- | ydb/library/yql/parser/pg_catalog/ut/catalog_consts_ut.cpp | 19 |
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); + } } |