Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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