|
@@ -44,6 +44,8 @@ using TAmProcs = THashMap<std::tuple<ui32, ui32, ui32, ui32>, TAmProcDesc>;
|
|
|
|
|
|
using TConversions = THashMap<std::pair<TString, TString>, TConversionDesc>;
|
|
|
|
|
|
+using TLanguages = THashMap<ui32, TLanguageDesc>;
|
|
|
+
|
|
|
bool IsCompatibleTo(ui32 actualTypeId, ui32 expectedTypeId, const TTypes& types) {
|
|
|
if (actualTypeId == expectedTypeId) {
|
|
|
return true;
|
|
@@ -390,6 +392,8 @@ public:
|
|
|
} else if (key == "prolang") {
|
|
|
if (value != "c") {
|
|
|
IsSupported = false;
|
|
|
+ } else {
|
|
|
+ LastProc.Lang = LangC;
|
|
|
}
|
|
|
} else if (key == "proargtypes") {
|
|
|
TVector<TString> strArgs;
|
|
@@ -767,9 +771,7 @@ public:
|
|
|
void OnFinish() override {
|
|
|
if (IsSupported) {
|
|
|
if (FillSupported()) {
|
|
|
- auto id = Aggregations.size() + 1;
|
|
|
- LastAggregation.InternalId = id;
|
|
|
- Aggregations[id] = LastAggregation;
|
|
|
+ Aggregations[LastAggregation.AggId] = LastAggregation;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -840,6 +842,22 @@ public:
|
|
|
}
|
|
|
|
|
|
Y_ENSURE(!LastAggregation.Name.empty());
|
|
|
+ auto funcIdsPtr = ProcByName.FindPtr(LastAggregation.Name);
|
|
|
+ Y_ENSURE(funcIdsPtr);
|
|
|
+ if (funcIdsPtr->size() == 1) {
|
|
|
+ LastAggregation.AggId = funcIdsPtr->front();
|
|
|
+ } else {
|
|
|
+ for (const auto id : *funcIdsPtr) {
|
|
|
+ auto procPtr = Procs.FindPtr(id);
|
|
|
+ Y_ENSURE(procPtr);
|
|
|
+ if (procPtr->ArgTypes == LastAggregation.ArgTypes) {
|
|
|
+ LastAggregation.AggId = id;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Y_ENSURE(LastAggregation.AggId);
|
|
|
if (!ResolveFunc(LastFinalFunc, LastAggregation.FinalFuncId, 1)) {
|
|
|
return false;
|
|
|
}
|
|
@@ -1250,6 +1268,33 @@ private:
|
|
|
TConversionDesc LastConversion;
|
|
|
};
|
|
|
|
|
|
+class TLanguagesParser : public TParser {
|
|
|
+public:
|
|
|
+ TLanguagesParser(TLanguages& languages)
|
|
|
+ : Languages(languages)
|
|
|
+ {}
|
|
|
+
|
|
|
+ void OnKey(const TString& key, const TString& value) override {
|
|
|
+ if (key == "oid") {
|
|
|
+ LastLanguage.LangId = FromString<ui32>(value);
|
|
|
+ } else if (key == "lanname") {
|
|
|
+ LastLanguage.Name = value;
|
|
|
+ } else if (key == "descr") {
|
|
|
+ LastLanguage.Descr = value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void OnFinish() override {
|
|
|
+ Languages[LastLanguage.LangId] = LastLanguage;
|
|
|
+ LastLanguage = TLanguageDesc();
|
|
|
+ }
|
|
|
+
|
|
|
+private:
|
|
|
+ TLanguages& Languages;
|
|
|
+
|
|
|
+ TLanguageDesc LastLanguage;
|
|
|
+};
|
|
|
+
|
|
|
TOperators ParseOperators(const TString& dat, const THashMap<TString, ui32>& typeByName,
|
|
|
const TTypes& types, const THashMap<TString, TVector<ui32>>& procByName, const TProcs& procs) {
|
|
|
TOperators ret;
|
|
@@ -1335,6 +1380,13 @@ TAms ParseAms(const TString& dat) {
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+TLanguages ParseLanguages(const TString& dat) {
|
|
|
+ TLanguages ret;
|
|
|
+ TLanguagesParser parser(ret);
|
|
|
+ parser.Do(dat);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
TNamespaces FillNamespaces() {
|
|
|
const ui32 PgInformationSchemaNamepace = 1;
|
|
|
const ui32 PgCatalogNamepace = 11;
|
|
@@ -1454,6 +1506,8 @@ struct TCatalog {
|
|
|
Y_ENSURE(NResource::FindExact("pg_conversion.dat", &conversionData));
|
|
|
TString amData;
|
|
|
Y_ENSURE(NResource::FindExact("pg_am.dat", &amData));
|
|
|
+ TString languagesData;
|
|
|
+ Y_ENSURE(NResource::FindExact("pg_language.dat", &languagesData));
|
|
|
THashMap<ui32, TLazyTypeInfo> lazyTypeInfos;
|
|
|
Types = ParseTypes(typeData, lazyTypeInfos);
|
|
|
for (const auto& [k, v] : Types) {
|
|
@@ -1609,6 +1663,7 @@ struct TCatalog {
|
|
|
}
|
|
|
|
|
|
Conversions = ParseConversions(conversionData, ProcByName);
|
|
|
+ Languages = ParseLanguages(languagesData);
|
|
|
}
|
|
|
|
|
|
static const TCatalog& Instance() {
|
|
@@ -1626,6 +1681,7 @@ struct TCatalog {
|
|
|
TAmOps AmOps;
|
|
|
TAmProcs AmProcs;
|
|
|
TConversions Conversions;
|
|
|
+ TLanguages Languages;
|
|
|
THashMap<TString, TVector<ui32>> ProcByName;
|
|
|
THashMap<TString, ui32> TypeByName;
|
|
|
THashMap<std::pair<ui32, ui32>, ui32> CastsByDir;
|
|
@@ -2799,6 +2855,23 @@ bool IsCompatibleTo(ui32 actualType, ui32 expectedType) {
|
|
|
return IsCompatibleTo(actualType, expectedType, catalog.Types);
|
|
|
}
|
|
|
|
|
|
+const TLanguageDesc& LookupLanguage(ui32 langId) {
|
|
|
+ const auto& catalog = TCatalog::Instance();
|
|
|
+ auto langPtr = catalog.Languages.FindPtr(langId);
|
|
|
+ if (!langPtr) {
|
|
|
+ throw yexception() << "No such lang: " << langId;
|
|
|
+ }
|
|
|
+
|
|
|
+ return *langPtr;
|
|
|
+}
|
|
|
+
|
|
|
+void EnumLanguages(std::function<void(ui32, const TLanguageDesc&)> f) {
|
|
|
+ const auto& catalog = TCatalog::Instance();
|
|
|
+ for (const auto& x : catalog.Languages) {
|
|
|
+ f(x.first, x.second);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
const TVector<TTableInfo>& GetStaticTables() {
|
|
|
const auto& catalog = TCatalog::Instance();
|
|
|
return catalog.StaticTables;
|