Skip to content

Commit 571314d

Browse files
authored
Merge be656f4 into f5de617
2 parents f5de617 + be656f4 commit 571314d

File tree

16 files changed

+517
-2
lines changed

16 files changed

+517
-2
lines changed

ydb/library/yql/parser/pg_catalog/catalog.cpp

+119
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ using TCasts = THashMap<ui32, TCastDesc>;
2828

2929
using TAggregations = THashMap<ui32, TAggregateDesc>;
3030

31+
using TAms = THashMap<ui32, TAmDesc>;
32+
33+
using TNamespaces = THashMap<decltype(TNamespaceDesc::Oid), TNamespaceDesc>;
34+
3135
// We parse OpFamilies' IDs for now. If we ever needed oid_symbol,
3236
// create TOpFamilyDesc class alike other catalogs
3337
using TOpFamilies = THashMap<TString, ui32>;
@@ -274,6 +278,8 @@ class TOperatorsParser : public TParser {
274278
LastOperator.OperId = FromString<ui32>(value);
275279
} else if (key == "oprname") {
276280
LastOperator.Name = value;
281+
} else if (key == "descr") {
282+
LastOperator.Descr = value;
277283
} else if (key == "oprkind") {
278284
if (value == "r") {
279285
LastOperator.Kind = EOperKind::RightUnary;
@@ -355,6 +361,8 @@ class TProcsParser : public TParser {
355361
LastProc.ProcId = FromString<ui32>(value);
356362
} else if (key == "provariadic") {
357363
IsSupported = false;
364+
} else if (key == "descr") {
365+
LastProc.Descr = value;
358366
} else if (key == "prokind") {
359367
if (value == "f") {
360368
LastProc.Kind = EProcKind::Function;
@@ -493,6 +501,8 @@ class TTypesParser : public TParser {
493501
LastType.TypeId = FromString<ui32>(value);
494502
} else if (key == "array_type_oid") {
495503
LastType.ArrayTypeId = FromString<ui32>(value);
504+
} else if (key == "descr") {
505+
LastType.Descr = value;
496506
} else if (key == "typname") {
497507
LastType.Name = value;
498508
} else if (key == "typcategory") {
@@ -1084,6 +1094,40 @@ class TAmOpsParser : public TParser {
10841094
bool IsSupported = true;
10851095
};
10861096

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+
10871131
class TAmProcsParser : public TParser {
10881132
public:
10891133
TAmProcsParser(TAmProcs& amProcs, const THashMap<TString, ui32>& typeByName,
@@ -1169,6 +1213,8 @@ class TConversionsParser : public TParser {
11691213
} else if (key == "conforencoding") {
11701214
Y_ENSURE(value.StartsWith("PG_"));
11711215
LastConversion.From = value.substr(3);
1216+
} else if (key == "descr") {
1217+
LastConversion.Descr = value;
11721218
} else if (key == "contoencoding") {
11731219
Y_ENSURE(value.StartsWith("PG_"));
11741220
LastConversion.To = value.substr(3);
@@ -1274,6 +1320,24 @@ TConversions ParseConversions(const TString& dat, const THashMap<TString, TVecto
12741320
return ret;
12751321
}
12761322

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+
12771341
struct TCatalog {
12781342
TCatalog()
12791343
: ProhibitedProcs({
@@ -1358,6 +1422,8 @@ struct TCatalog {
13581422
Y_ENSURE(NResource::FindExact("pg_amop.dat", &amOpData));
13591423
TString conversionData;
13601424
Y_ENSURE(NResource::FindExact("pg_conversion.dat", &conversionData));
1425+
TString amData;
1426+
Y_ENSURE(NResource::FindExact("pg_am.dat", &amData));
13611427
THashMap<ui32, TLazyTypeInfo> lazyTypeInfos;
13621428
Types = ParseTypes(typeData, lazyTypeInfos);
13631429
for (const auto& [k, v] : Types) {
@@ -1480,6 +1546,8 @@ struct TCatalog {
14801546
OpClasses = ParseOpClasses(opClassData, TypeByName, opFamilies);
14811547
AmOps = ParseAmOps(amOpData, TypeByName, Types, OperatorsByName, Operators, opFamilies);
14821548
AmProcs = ParseAmProcs(amProcData, TypeByName, ProcByName, Procs, opFamilies);
1549+
Ams = ParseAms(amData);
1550+
Namespaces = FillNamespaces();
14831551
for (auto& [k, v] : Types) {
14841552
if (v.TypeId != v.ArrayTypeId) {
14851553
auto lookupId = (v.TypeId == VarcharOid ? TextOid : v.TypeId);
@@ -1522,6 +1590,8 @@ struct TCatalog {
15221590
TTypes Types;
15231591
TCasts Casts;
15241592
TAggregations Aggregations;
1593+
TAms Ams;
1594+
TNamespaces Namespaces;
15251595
TOpClasses OpClasses;
15261596
TAmOps AmOps;
15271597
TAmProcs AmProcs;
@@ -1662,6 +1732,55 @@ void EnumTypes(std::function<void(ui32, const TTypeDesc&)> f) {
16621732
}
16631733
}
16641734

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+
16651784
bool HasCast(ui32 sourceId, ui32 targetId) {
16661785
const auto& catalog = TCatalog::Instance();
16671786
return catalog.CastsByDir.contains(std::make_pair(sourceId, targetId));

ydb/library/yql/parser/pg_catalog/catalog.h

+32
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ enum class EOperKind {
3333
struct TOperDesc {
3434
ui32 OperId = 0;
3535
TString Name;
36+
TString Descr;
3637
EOperKind Kind = EOperKind::Binary;
3738
ui32 LeftType = 0;
3839
ui32 RightType = 0;
@@ -50,6 +51,7 @@ struct TProcDesc {
5051
ui32 ProcId = 0;
5152
TString Name;
5253
TString Src;
54+
TString Descr;
5355
TVector<ui32> ArgTypes;
5456
ui32 ResultType = 0;
5557
bool IsStrict = true;
@@ -81,6 +83,7 @@ constexpr char InvalidCategory = '\0';
8183
struct TTypeDesc {
8284
ui32 TypeId = 0;
8385
ui32 ArrayTypeId = 0;
86+
TString Descr;
8487
TString Name;
8588
ui32 ElementTypeId = 0;
8689
bool PassByValue = false;
@@ -155,6 +158,24 @@ struct TAggregateDesc {
155158
TString InitValue;
156159
};
157160

161+
enum class EAmType {
162+
Table = 't',
163+
Index = 'i'
164+
};
165+
166+
struct TAmDesc {
167+
ui32 Oid = 0;
168+
TString Descr;
169+
TString AmName;
170+
EAmType AmType = EAmType::Index;
171+
};
172+
173+
struct TNamespaceDesc {
174+
ui32 Oid = 0;
175+
TString Name;
176+
TString Descr;
177+
};
178+
158179
enum class EOpClassMethod {
159180
Btree,
160181
Hash
@@ -206,6 +227,7 @@ struct TConversionDesc {
206227
ui32 ConversionId = 0;
207228
TString From;
208229
TString To;
230+
TString Descr;
209231
ui32 ProcId = 0;
210232
};
211233

@@ -223,6 +245,16 @@ TMaybe<TIssue> LookupCommonType(const TVector<ui32>& typeIds, const std::functio
223245
TMaybe<TIssue> LookupCommonType(const TVector<ui32>& typeIds, const std::function<TPosition(size_t i)>& GetPosition, const TTypeDesc*& typeDesc, bool& castsNeeded);
224246
void EnumTypes(std::function<void(ui32, const TTypeDesc&)> f);
225247

248+
const TAmDesc& LookupAm(ui32 oid);
249+
void EnumAm(std::function<void(ui32, const TAmDesc&)> f);
250+
251+
void EnumConversions(std::function<void(const TConversionDesc&)> f);
252+
253+
const TNamespaceDesc& LookupNamespace(ui32 oid);
254+
void EnumNamespace(std::function<void(ui32, const TNamespaceDesc&)> f);
255+
256+
void EnumOperators(std::function<void(const TOperDesc&)> f);
257+
226258
bool HasCast(ui32 sourceId, ui32 targetId);
227259
const TCastDesc& LookupCast(ui32 sourceId, ui32 targetId);
228260

ydb/library/yql/parser/pg_catalog/ya.make

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ RESOURCE(../pg_wrapper/postgresql/src/include/catalog/pg_opfamily.dat pg_opfamil
99
RESOURCE(../pg_wrapper/postgresql/src/include/catalog/pg_opclass.dat pg_opclass.dat)
1010
RESOURCE(../pg_wrapper/postgresql/src/include/catalog/pg_amproc.dat pg_amproc.dat)
1111
RESOURCE(../pg_wrapper/postgresql/src/include/catalog/pg_amop.dat pg_amop.dat)
12+
RESOURCE(../pg_wrapper/postgresql/src/include/catalog/pg_am.dat pg_am.dat)
1213
RESOURCE(../pg_wrapper/postgresql/src/include/catalog/pg_conversion.dat pg_conversion.dat)
1314

1415
SRCS(

0 commit comments

Comments
 (0)