@@ -28,6 +28,10 @@ using TCasts = THashMap<ui32, TCastDesc>;
28
28
29
29
using TAggregations = THashMap<ui32, TAggregateDesc>;
30
30
31
+ using TAms = THashMap<ui32, TAmDesc>;
32
+
33
+ using TNamespaces = THashMap<decltype(TNamespaceDesc::Oid), TNamespaceDesc>;
34
+
31
35
// We parse OpFamilies' IDs for now. If we ever needed oid_symbol,
32
36
// create TOpFamilyDesc class alike other catalogs
33
37
using TOpFamilies = THashMap<TString, ui32>;
@@ -274,6 +278,8 @@ class TOperatorsParser : public TParser {
274
278
LastOperator.OperId = FromString<ui32>(value);
275
279
} else if (key == " oprname" ) {
276
280
LastOperator.Name = value;
281
+ } else if (key == " descr" ) {
282
+ LastOperator.Descr = value;
277
283
} else if (key == " oprkind" ) {
278
284
if (value == " r" ) {
279
285
LastOperator.Kind = EOperKind::RightUnary;
@@ -355,6 +361,8 @@ class TProcsParser : public TParser {
355
361
LastProc.ProcId = FromString<ui32>(value);
356
362
} else if (key == " provariadic" ) {
357
363
IsSupported = false ;
364
+ } else if (key == " descr" ) {
365
+ LastProc.Descr = value;
358
366
} else if (key == " prokind" ) {
359
367
if (value == " f" ) {
360
368
LastProc.Kind = EProcKind::Function;
@@ -493,6 +501,8 @@ class TTypesParser : public TParser {
493
501
LastType.TypeId = FromString<ui32>(value);
494
502
} else if (key == " array_type_oid" ) {
495
503
LastType.ArrayTypeId = FromString<ui32>(value);
504
+ } else if (key == " descr" ) {
505
+ LastType.Descr = value;
496
506
} else if (key == " typname" ) {
497
507
LastType.Name = value;
498
508
} else if (key == " typcategory" ) {
@@ -1084,6 +1094,40 @@ class TAmOpsParser : public TParser {
1084
1094
bool IsSupported = true ;
1085
1095
};
1086
1096
1097
+
1098
+ class TAmsParser : public TParser {
1099
+ public:
1100
+ TAmsParser (TAms& ams) : Ams_(ams) {}
1101
+
1102
+ void OnKey (const TString& key, const TString& value) override {
1103
+ if (key == " oid" ) {
1104
+ CurrDesc_.Oid = FromString<ui32>(value);
1105
+ } else if (key == " descr" ) {
1106
+ CurrDesc_.Descr = value;
1107
+ } else if (key == " amname" ) {
1108
+ CurrDesc_.AmName = value;
1109
+ } else if (key == " amtype" ) {
1110
+ Y_ENSURE (value.Size () == 1 );
1111
+ if ((char )EAmType::Index == value[0 ]) {
1112
+ CurrDesc_.AmType = EAmType::Index;
1113
+ } else if ((char )EAmType::Table == value[0 ]) {
1114
+ CurrDesc_.AmType = EAmType::Table;
1115
+ } else {
1116
+ Y_ENSURE (false , " Expected correct AmType" );
1117
+ }
1118
+ }
1119
+ }
1120
+
1121
+ void OnFinish () override {
1122
+ Ams_[CurrDesc_.Oid ] = std::move (CurrDesc_);
1123
+ CurrDesc_ = TAmDesc ();
1124
+ }
1125
+
1126
+ private:
1127
+ TAmDesc CurrDesc_;
1128
+ TAms& Ams_;
1129
+ };
1130
+
1087
1131
class TAmProcsParser : public TParser {
1088
1132
public:
1089
1133
TAmProcsParser (TAmProcs& amProcs, const THashMap<TString, ui32>& typeByName,
@@ -1169,6 +1213,8 @@ class TConversionsParser : public TParser {
1169
1213
} else if (key == " conforencoding" ) {
1170
1214
Y_ENSURE (value.StartsWith (" PG_" ));
1171
1215
LastConversion.From = value.substr (3 );
1216
+ } else if (key == " descr" ) {
1217
+ LastConversion.Descr = value;
1172
1218
} else if (key == " contoencoding" ) {
1173
1219
Y_ENSURE (value.StartsWith (" PG_" ));
1174
1220
LastConversion.To = value.substr (3 );
@@ -1274,6 +1320,24 @@ TConversions ParseConversions(const TString& dat, const THashMap<TString, TVecto
1274
1320
return ret;
1275
1321
}
1276
1322
1323
+ TAms ParseAms (const TString& dat) {
1324
+ TAms ret;
1325
+ TAmsParser parser (ret);
1326
+ parser.Do (dat);
1327
+ return ret;
1328
+ }
1329
+
1330
+ TNamespaces FillNamespaces () {
1331
+ const ui32 PgInformationSchemaNamepace = 1 ;
1332
+ const ui32 PgCatalogNamepace = 11 ;
1333
+ const ui32 PgPublicNamepace = 2200 ;
1334
+ return TNamespaces{
1335
+ {PgInformationSchemaNamepace, TNamespaceDesc{PgInformationSchemaNamepace, " information_schema" , " information_schema namespace" }},
1336
+ {PgPublicNamepace, TNamespaceDesc{PgPublicNamepace, " public" , " public namespace" }},
1337
+ {PgCatalogNamepace, TNamespaceDesc{PgCatalogNamepace, " pg_catalog" , " pg_catalog namespace" }},
1338
+ };
1339
+ }
1340
+
1277
1341
struct TCatalog {
1278
1342
TCatalog ()
1279
1343
: ProhibitedProcs({
@@ -1358,6 +1422,8 @@ struct TCatalog {
1358
1422
Y_ENSURE (NResource::FindExact (" pg_amop.dat" , &amOpData));
1359
1423
TString conversionData;
1360
1424
Y_ENSURE (NResource::FindExact (" pg_conversion.dat" , &conversionData));
1425
+ TString amData;
1426
+ Y_ENSURE (NResource::FindExact (" pg_am.dat" , &amData));
1361
1427
THashMap<ui32, TLazyTypeInfo> lazyTypeInfos;
1362
1428
Types = ParseTypes (typeData, lazyTypeInfos);
1363
1429
for (const auto & [k, v] : Types) {
@@ -1480,6 +1546,8 @@ struct TCatalog {
1480
1546
OpClasses = ParseOpClasses (opClassData, TypeByName, opFamilies);
1481
1547
AmOps = ParseAmOps (amOpData, TypeByName, Types, OperatorsByName, Operators, opFamilies);
1482
1548
AmProcs = ParseAmProcs (amProcData, TypeByName, ProcByName, Procs, opFamilies);
1549
+ Ams = ParseAms (amData);
1550
+ Namespaces = FillNamespaces ();
1483
1551
for (auto & [k, v] : Types) {
1484
1552
if (v.TypeId != v.ArrayTypeId ) {
1485
1553
auto lookupId = (v.TypeId == VarcharOid ? TextOid : v.TypeId );
@@ -1522,6 +1590,8 @@ struct TCatalog {
1522
1590
TTypes Types;
1523
1591
TCasts Casts;
1524
1592
TAggregations Aggregations;
1593
+ TAms Ams;
1594
+ TNamespaces Namespaces;
1525
1595
TOpClasses OpClasses;
1526
1596
TAmOps AmOps;
1527
1597
TAmProcs AmProcs;
@@ -1662,6 +1732,55 @@ void EnumTypes(std::function<void(ui32, const TTypeDesc&)> f) {
1662
1732
}
1663
1733
}
1664
1734
1735
+ const TAmDesc& LookupAm (ui32 oid) {
1736
+ const auto & catalog = TCatalog::Instance ();
1737
+ const auto typePtr = catalog.Ams .FindPtr (oid);
1738
+ if (!typePtr) {
1739
+ throw yexception () << " No such am: " << oid;
1740
+ }
1741
+
1742
+ return *typePtr;
1743
+ }
1744
+
1745
+ void EnumAm (std::function<void (ui32, const TAmDesc&)> f) {
1746
+ const auto & catalog = TCatalog::Instance ();
1747
+ for (const auto & [oid, desc] : catalog.Ams ) {
1748
+ f (oid, desc);
1749
+ }
1750
+ }
1751
+
1752
+ void EnumConversions (std::function<void (const TConversionDesc&)> f) {
1753
+ const auto & catalog = TCatalog::Instance ();
1754
+ for (const auto & [_, desc] : catalog.Conversions ) {
1755
+ f (desc);
1756
+ }
1757
+ }
1758
+
1759
+ const TNamespaceDesc& LookupNamespace (ui32 oid) {
1760
+ const auto & catalog = TCatalog::Instance ();
1761
+ const auto typePtr = catalog.Namespaces .FindPtr (oid);
1762
+ if (!typePtr) {
1763
+ throw yexception () << " No such namespace: " << oid;
1764
+ }
1765
+
1766
+ return *typePtr;
1767
+ }
1768
+
1769
+ void EnumNamespace (std::function<void (ui32, const TNamespaceDesc&)> f) {
1770
+ const auto & catalog = TCatalog::Instance ();
1771
+ for (const auto & [oid, desc] : catalog.Namespaces ) {
1772
+ f (oid, desc);
1773
+ }
1774
+ }
1775
+
1776
+ void EnumOperators (std::function<void (const TOperDesc&)> f) {
1777
+ const auto & catalog = TCatalog::Instance ();
1778
+ for (const auto & [_, desc] : catalog.Operators ) {
1779
+ f (desc);
1780
+ }
1781
+ }
1782
+
1783
+
1665
1784
bool HasCast (ui32 sourceId, ui32 targetId) {
1666
1785
const auto & catalog = TCatalog::Instance ();
1667
1786
return catalog.CastsByDir .contains (std::make_pair (sourceId, targetId));
0 commit comments