Skip to content

Commit

Permalink
init (#1354)
Browse files Browse the repository at this point in the history
  • Loading branch information
vitstn authored Jan 26, 2024
1 parent a276799 commit a7dad28
Show file tree
Hide file tree
Showing 10 changed files with 253 additions and 177 deletions.
120 changes: 120 additions & 0 deletions ydb/library/yql/parser/pg_catalog/catalog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1400,8 +1400,114 @@ struct TCatalog {
"lo_truncate64",
"lo_close",
"lo_unlink"
}),
StaticTables({
{"pg_catalog", "pg_type"},
{"pg_catalog", "pg_database"},
{"pg_catalog", "pg_tablespace"},
{"pg_catalog", "pg_shdescription"},
{"pg_catalog", "pg_trigger"},
{"pg_catalog", "pg_locks"},
{"pg_catalog", "pg_stat_gssapi"},
{"pg_catalog", "pg_inherits"},
{"pg_catalog", "pg_stat_activity"},
{"pg_catalog", "pg_timezone_names"},
{"pg_catalog", "pg_timezone_abbrevs"},
{"pg_catalog", "pg_tables"},
{"pg_catalog", "pg_description"},
{"pg_catalog", "pg_am"},
{"pg_catalog", "pg_namespace"},
{"information_schema", "tables"},
{"information_schema", "columns"},
}),
AllStaticColumns({
{"pg_catalog", "pg_type", "oid", "oid"},
{"pg_catalog", "pg_type", "typname", "name"},
{"pg_catalog", "pg_type", "typinput", "regproc"},
{"pg_catalog", "pg_type", "typnamespace", "oid"},
{"pg_catalog", "pg_type", "typtype", "char"},

{"pg_catalog", "pg_database", "oid", "oid"},
{"pg_catalog", "pg_database", "datname", "name"},
{"pg_catalog", "pg_database", "encoding", "int4"},
{"pg_catalog", "pg_database", "datallowconn", "bool"},
{"pg_catalog", "pg_database", "datistemplate", "bool"},
{"pg_catalog", "pg_database", "datdba", "oid"},

{"pg_catalog", "pg_tablespace", "oid", "oid"},
{"pg_catalog", "pg_tablespace", "spcname", "name"},

{"pg_catalog", "pg_shdescription", "objoid", "oid"},
{"pg_catalog", "pg_shdescription", "classoid", "oid"},
{"pg_catalog", "pg_shdescription", "description", "text"},

{"pg_catalog", "pg_trigger", "tgrelid", "oid"},
{"pg_catalog", "pg_trigger", "tgenabled", "char"},

{"pg_catalog", "pg_locks", "transactionid", "xid"},

{"pg_catalog", "pg_stat_gssapi", "encrypted", "bool"},
{"pg_catalog", "pg_stat_gssapi", "gss_authenticated", "bool"},
{"pg_catalog", "pg_stat_gssapi", "pid", "int4"},

{"pg_catalog", "pg_inherits", "inhrelid", "oid"},
{"pg_catalog", "pg_inherits", "inhparent", "oid"},

{"pg_catalog", "pg_stat_activity", "application_name", "text"},
{"pg_catalog", "pg_stat_activity", "backend_start", "timestamptz"},
{"pg_catalog", "pg_stat_activity", "backend_type", "text"},
{"pg_catalog", "pg_stat_activity", "client_addr", "inet"},
{"pg_catalog", "pg_stat_activity", "datname", "name"},
{"pg_catalog", "pg_stat_activity", "pid", "int4"},
{"pg_catalog", "pg_stat_activity", "query", "text"},
{"pg_catalog", "pg_stat_activity", "query_start", "timestamptz"},
{"pg_catalog", "pg_stat_activity", "state", "text"},
{"pg_catalog", "pg_stat_activity", "state_change", "timestamptz"},
{"pg_catalog", "pg_stat_activity", "usename", "name"},
{"pg_catalog", "pg_stat_activity", "wait_event", "text"},
{"pg_catalog", "pg_stat_activity", "wait_event_type", "text"},
{"pg_catalog", "pg_stat_activity", "xact_start", "timestamptz"},

{"pg_catalog", "pg_timezone_names", "name", "text"},
{"pg_catalog", "pg_timezone_names", "is_dst", "bool"},

{"pg_catalog", "pg_timezone_abbrevs", "abbrev", "text"},
{"pg_catalog", "pg_timezone_abbrevs", "is_dst", "bool"},

{"pg_catalog", "pg_tables", "schemaname", "name"},
{"pg_catalog", "pg_tables", "tablename", "name"},

{"pg_catalog", "pg_description", "objoid", "oid"},
{"pg_catalog", "pg_description", "classoid", "oid"},
{"pg_catalog", "pg_description", "objsubid", "int4"},
{"pg_catalog", "pg_description", "description", "text"},

{"pg_catalog", "pg_am", "oid", "oid"},
{"pg_catalog", "pg_am", "amname", "name"},
{"pg_catalog", "pg_am", "amtype", "char"},

{"pg_catalog", "pg_namespace", "nspname", "name"},
{"pg_catalog", "pg_namespace", "oid", "oid"},

{"information_schema", "tables", "table_schema", "name"},
{"information_schema", "tables", "table_name", "name"},

{"information_schema", "columns", "table_schema", "name"},
{"information_schema", "columns", "table_name", "name"},
{"information_schema", "columns", "column_name", "name"},
{"information_schema", "columns", "udt_name", "name"},
})
{
for (const auto& t : StaticTables) {
StaticColumns.insert(std::make_pair(t, TVector<TColumnInfo>()));
}

for (const auto& c: AllStaticColumns) {
auto tablePtr = StaticColumns.FindPtr(TTableInfo(c.Schema, c.TableName));
Y_ENSURE(tablePtr);
tablePtr->push_back(c);
}

TString typeData;
Y_ENSURE(NResource::FindExact("pg_type.dat", &typeData));
TString opData;
Expand Down Expand Up @@ -1602,6 +1708,10 @@ struct TCatalog {
THashMap<TString, TVector<ui32>> OperatorsByName;
THashMap<TString, TVector<ui32>> AggregationsByName;
THashSet<TString> ProhibitedProcs;

TVector<TTableInfo> StaticTables;
TVector<TColumnInfo> AllStaticColumns;
THashMap<TTableInfo, TVector<TColumnInfo>> StaticColumns;
};

bool ValidateArgs(const TVector<ui32>& descArgTypeIds, const TVector<ui32>& argTypeIds) {
Expand Down Expand Up @@ -2760,4 +2870,14 @@ bool IsCompatibleTo(ui32 actualType, ui32 expectedType) {
return IsCompatibleTo(actualType, expectedType, catalog.Types);
}

const TVector<TTableInfo>& GetStaticTables() {
const auto& catalog = TCatalog::Instance();
return catalog.StaticTables;
}

const THashMap<TTableInfo, TVector<TColumnInfo>>& GetStaticColumns() {
const auto& catalog = TCatalog::Instance();
return catalog.StaticColumns;
}

}
30 changes: 30 additions & 0 deletions ydb/library/yql/parser/pg_catalog/catalog.h
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,29 @@ bool IsCoercible(ui32 fromTypeId, ui32 toTypeId, ECoercionCode coercionType);
inline bool IsArrayType(const TTypeDesc& typeDesc) noexcept {
return typeDesc.ArrayTypeId == typeDesc.TypeId;
}
struct TTableInfo {
TString Schema;
TString Name;

bool operator==(const TTableInfo& other) const {
return Schema == other.Schema && Name == other.Name;
}

size_t Hash() const {
auto stringHasher = THash<TString>();
return CombineHashes(stringHasher(Schema), stringHasher(Name));
}
};

struct TColumnInfo {
TString Schema;
TString TableName;
TString Name;
TString UdtType;
};

const TVector<TTableInfo>& GetStaticTables();
const THashMap<TTableInfo, TVector<TColumnInfo>>& GetStaticColumns();

}

Expand All @@ -297,3 +320,10 @@ template <>
inline void Out<NYql::NPg::ECoercionCode>(IOutputStream& o, NYql::NPg::ECoercionCode coercionCode) {
o.Write(static_cast<std::underlying_type<NYql::NPg::ECoercionCode>::type>(coercionCode));
}

template <>
struct THash<NYql::NPg::TTableInfo> {
size_t operator ()(const NYql::NPg::TTableInfo& val) const {
return val.Hash();
}
};
60 changes: 31 additions & 29 deletions ydb/library/yql/parser/pg_wrapper/comp_factory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -352,20 +352,29 @@ class TPgTableContent : public TMutableComputationNode<TPgTableContent> {
ApplyFillers(AllPgDescriptionFillers, Y_ARRAY_SIZE(AllPgDescriptionFillers), PgDescriptionFillers_);
} else if (Table_ == "pg_tables") {
static const std::pair<const char*, TTablesFiller> AllPgTablesFillers[] = {
{"schemaname", [](const TTableInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Schema, NAMEDATALEN)); }},
{"tablename", [](const TTableInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Name, NAMEDATALEN)); }},
{"schemaname", [](const NPg::TTableInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Schema, NAMEDATALEN)); }},
{"tablename", [](const NPg::TTableInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Name, NAMEDATALEN)); }},
};

ApplyFillers(AllPgTablesFillers, Y_ARRAY_SIZE(AllPgTablesFillers), PgTablesFillers_);
}
} else {
if (Table_ == "tables") {
static const std::pair<const char*, TTablesFiller> AllTablesFillers[] = {
{"table_schema", [](const TTableInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Schema, NAMEDATALEN)); }},
{"table_name", [](const TTableInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Name, NAMEDATALEN)); }},
{"table_schema", [](const NPg::TTableInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Schema, NAMEDATALEN)); }},
{"table_name", [](const NPg::TTableInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Name, NAMEDATALEN)); }},
};

ApplyFillers(AllTablesFillers, Y_ARRAY_SIZE(AllTablesFillers), TablesFillers_);
} else if (Table_ == "columns") {
static const std::pair<const char*, TColumnsFiller> AllColumnsFillers[] = {
{"table_schema", [](const NPg::TColumnInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Schema, NAMEDATALEN)); }},
{"table_name", [](const NPg::TColumnInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.TableName, NAMEDATALEN)); }},
{"column_name", [](const NPg::TColumnInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.Name, NAMEDATALEN)); }},
{"udt_name", [](const NPg::TColumnInfo& desc) { return PointerDatumToPod((Datum)MakeFixedString(desc.UdtType, NAMEDATALEN)); }},
};

ApplyFillers(AllColumnsFillers, Y_ARRAY_SIZE(AllColumnsFillers), ColumnsFillers_);
}
}
}
Expand Down Expand Up @@ -539,7 +548,7 @@ class TPgTableContent : public TMutableComputationNode<TPgTableContent> {
rows.emplace_back(row);
});
} else if (Table_ == "pg_tables") {
auto tables = GetStaticTables();
const auto& tables = NPg::GetStaticTables();
for (const auto& t : tables) {
NUdf::TUnboxedValue* items;
auto row = compCtx.HolderFactory.CreateDirectArrayHolder(PgTablesFillers_.size(), items);
Expand All @@ -552,7 +561,7 @@ class TPgTableContent : public TMutableComputationNode<TPgTableContent> {
}
} else {
if (Table_ == "tables") {
auto tables = GetStaticTables();
const auto& tables = NPg::GetStaticTables();
for (const auto& t : tables) {
NUdf::TUnboxedValue* items;
auto row = compCtx.HolderFactory.CreateDirectArrayHolder(TablesFillers_.size(), items);
Expand All @@ -562,6 +571,19 @@ class TPgTableContent : public TMutableComputationNode<TPgTableContent> {

rows.emplace_back(row);
}
} else if (Table_ == "columns") {
const auto& columns = NPg::GetStaticColumns();
for (const auto& t : columns) {
for (const auto& c : t.second) {
NUdf::TUnboxedValue* items;
auto row = compCtx.HolderFactory.CreateDirectArrayHolder(ColumnsFillers_.size(), items);
for (ui32 i = 0; i < ColumnsFillers_.size(); ++i) {
items[i] = ColumnsFillers_[i](c);
}

rows.emplace_back(row);
}
}
}
}

Expand Down Expand Up @@ -601,32 +623,12 @@ class TPgTableContent : public TMutableComputationNode<TPgTableContent> {
using TPgDescriptionFiller = NUdf::TUnboxedValuePod(*)(const TDescriptionDesc&);
TVector<TPgDescriptionFiller> PgDescriptionFillers_;

struct TTableInfo {
TString Schema;
TString Name;
};

using TTablesFiller = NUdf::TUnboxedValuePod(*)(const TTableInfo&);
using TTablesFiller = NUdf::TUnboxedValuePod(*)(const NPg::TTableInfo&);
TVector<TTablesFiller> PgTablesFillers_;
TVector<TTablesFiller> TablesFillers_;

static TVector<TTableInfo> GetStaticTables() {
return {
{"pg_catalog", "pg_type"},
{"pg_catalog", "pg_database"},
{"pg_catalog", "pg_tablespace"},
{"pg_catalog", "pg_shdescription"},
{"pg_catalog", "pg_trigger"},
{"pg_catalog", "pg_locks"},
{"pg_catalog", "pg_stat_gssapi"},
{"pg_catalog", "pg_inherits"},
{"pg_catalog", "pg_stat_activity"},
{"pg_catalog", "pg_timezone_names"},
{"pg_catalog", "pg_timezone_abbrevs"},
{"pg_catalog", "pg_tables"},
{"information_schema", "tables"},
};
}
using TColumnsFiller = NUdf::TUnboxedValuePod(*)(const NPg::TColumnInfo&);
TVector<TColumnsFiller> ColumnsFillers_;
};

class TFunctionCallInfo {
Expand Down
Loading

0 comments on commit a7dad28

Please sign in to comment.