Skip to content

Commit 190859c

Browse files
authored
Resolves #6073 (#6528)
1 parent 3709281 commit 190859c

File tree

9 files changed

+449
-201
lines changed

9 files changed

+449
-201
lines changed

.github/config/muted_ya.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,4 @@ ydb/tests/functional/tenants test_tenants.py.*
101101
ydb/tests/functional/ydb_cli test_ydb_impex.py.TestImpex.test_big_dataset*
102102
ydb/tests/tools/pq_read/test test_timeout.py.TestTimeout.test_timeout
103103
ydb/tests/functional/rename [test_rename.py */*] chunk chunk
104+
ydb/tests/fq/yt/kqp_yt_file/part18 test.py.test[pg-join_brackets2-default.txt]

ydb/core/kqp/provider/yql_kikimr_opt_build.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -878,21 +878,28 @@ TExprNode::TPtr KiBuildQuery(TExprBase node, TExprContext& ctx, TStringBuf datab
878878
auto kiDataSink = commit.DataSink().Cast<TKiDataSink>();
879879

880880
TNodeOnNodeOwnedMap replaces;
881-
VisitExpr(node.Ptr(), [&replaces](const TExprNode::TPtr& input) -> bool {
881+
std::unordered_set<std::string> pgDynTables = {"pg_tables", "tables", "pg_class"};
882+
std::unordered_map<const NYql::TExprNode*, TString> tableNames;
883+
VisitExpr(node.Ptr(), [&replaces, &tableNames, &pgDynTables](const TExprNode::TPtr& input) -> bool {
882884
if (input->IsCallable("PgTableContent")) {
883885
TPgTableContent content(input);
884-
if (content.Table().StringValue() == "pg_tables") {
886+
if (pgDynTables.contains(content.Table().StringValue())) {
885887
replaces[input.Get()] = nullptr;
888+
tableNames[input.Get()] = content.Table().StringValue();
886889
}
887890
}
888891
return true;
889892
});
890893
if (!replaces.empty()) {
891-
TExprNode::TPtr path = ctx.NewCallable(node.Pos(), "String", { ctx.NewAtom(node.Pos(), TStringBuilder() << "/" << database << "/.sys/pg_tables") });
892-
auto table = ctx.NewList(node.Pos(), {ctx.NewAtom(node.Pos(), "table"), path});
893-
auto newKey = ctx.NewCallable(node.Pos(), "Key", {table});
894-
895894
for (auto& [key, _] : replaces) {
895+
TExprNode::TPtr path = ctx.NewCallable(
896+
node.Pos(),
897+
"String",
898+
{ ctx.NewAtom(node.Pos(), TStringBuilder() << "/" << database << "/.sys/" << tableNames[key]) }
899+
);
900+
auto table = ctx.NewList(node.Pos(), {ctx.NewAtom(node.Pos(), "table"), path});
901+
auto newKey = ctx.NewCallable(node.Pos(), "Key", {table});
902+
896903
auto ydbSysTableRead = Build<TCoRead>(ctx, node.Pos())
897904
.World<TCoWorld>().Build()
898905
.DataSource<TCoDataSource>()

ydb/core/kqp/ut/pg/pg_catalog_ut.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,9 +459,33 @@ Y_UNIT_TEST_SUITE(PgCatalog) {
459459
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
460460
UNIT_ASSERT_C(!result.GetResultSets().empty(), "no result sets");
461461
CompareYson(
462-
Sprintf("[[\"%u\"]]", experimentalPg ? 214 : 211),
462+
Sprintf("[[\"%u\"]]", experimentalPg ? 214 : 211),
463463
FormatResultSetYson(result.GetResultSet(0)));
464464
}
465+
{
466+
auto result = db.ExecuteQuery(R"(
467+
SELECT rel.oid, rel.relname AS name
468+
FROM pg_catalog.pg_class rel
469+
WHERE rel.relkind IN ('r','s','t','p') AND rel.relnamespace = 2200::oid
470+
AND NOT rel.relispartition
471+
ORDER BY rel.relname;
472+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
473+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
474+
UNIT_ASSERT_C(!result.GetResultSets().empty(), "no result sets");
475+
CompareYson(R"([
476+
[#;"table1"];[#;"table2"]
477+
])", FormatResultSetYson(result.GetResultSet(0)));
478+
}
479+
{ //SuperSet
480+
auto result = db.ExecuteQuery(R"(
481+
SELECT c.relname FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = 'public' AND c.relkind in ('r', 'p');
482+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx(), settings).ExtractValueSync();
483+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
484+
UNIT_ASSERT_C(!result.GetResultSets().empty(), "no result sets");
485+
CompareYson(R"([
486+
["table1"];["table2"]
487+
])", FormatResultSetYson(result.GetResultSet(0)));
488+
}
465489
}
466490
}
467491

ydb/core/sys_view/common/schema.cpp

Lines changed: 57 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,41 @@
11
#include "schema.h"
22

33
#include <ydb/core/base/appdata.h>
4+
#include <ydb/library/yql/parser/pg_catalog/catalog.h>
45

56
namespace NKikimr {
67
namespace NSysView {
78

8-
const TVector<Schema::PgColumn> Schema::PgTables::Columns = {
9-
Schema::PgColumn(1, "pgname", "schemaname"),
10-
Schema::PgColumn(2, "pgname", "tablename"),
11-
Schema::PgColumn(3, "pgname", "tableowner"),
12-
Schema::PgColumn(4, "pgname", "tablespace"),
13-
Schema::PgColumn(5, "pgbool", "hasindexes"),
14-
Schema::PgColumn(6, "pgbool", "hasrules"),
15-
Schema::PgColumn(7, "pgbool", "hastriggers"),
16-
Schema::PgColumn(8, "pgbool", "rowsecurity")
17-
};
9+
namespace {
10+
TVector<Schema::PgColumn> GetPgStaticTableColumns(const TString& schema, const TString& tableName) {
11+
TVector<Schema::PgColumn> res;
12+
auto columns = NYql::NPg::GetStaticColumns().FindPtr(NYql::NPg::TTableInfoKey{schema, tableName});
13+
res.reserve(columns->size());
14+
for (size_t i = 0; i < columns->size(); i++) {
15+
const auto& column = columns->at(i);
16+
res.emplace_back(i, column.UdtType, column.Name);
17+
}
18+
return res;
19+
}
20+
}
21+
22+
Schema::PgColumn::PgColumn(NIceDb::TColumnId columnId, TStringBuf columnTypeName, TStringBuf columnName)
23+
: _ColumnId(columnId)
24+
, _ColumnTypeInfo(NScheme::NTypeIds::Pg, NPg::TypeDescFromPgTypeId(NYql::NPg::LookupType(TString(columnTypeName)).TypeId))
25+
, _ColumnName(columnName)
26+
{}
27+
28+
const TVector<Schema::PgColumn>& Schema::PgTablesSchemaProvider::GetColumns(TStringBuf tableName) const {
29+
TString key(tableName);
30+
Y_ENSURE(columnsStorage.contains(key));
31+
return columnsStorage.at(key);
32+
}
33+
34+
Schema::PgTablesSchemaProvider::PgTablesSchemaProvider() {
35+
columnsStorage[TString(PgTablesName)] = GetPgStaticTableColumns("pg_catalog", "pg_tables");
36+
columnsStorage[TString(InformationSchemaTablesName)] = GetPgStaticTableColumns("information_schema", "tables");
37+
columnsStorage[TString(PgClassName)] = GetPgStaticTableColumns("pg_catalog", "pg_class");
38+
}
1839

1940
bool MaybeSystemViewPath(const TVector<TString>& path) {
2041
auto length = path.size();
@@ -179,17 +200,31 @@ class TSystemViewResolver : public ISystemViewResolver {
179200
}
180201
};
181202

182-
void RegisterPgTablesSystemView() {
183-
auto& dsv = DomainSystemViews[PgTablesName];
184-
auto& sdsv = SubDomainSystemViews[PgTablesName];
185-
for (const auto& column : Schema::PgTables::Columns) {
186-
dsv.Columns[column._ColumnId] = TSysTables::TTableColumnInfo(
187-
column._ColumnName, column._ColumnId, column._ColumnTypeInfo, "", -1
188-
);
189-
sdsv.Columns[column._ColumnId] = TSysTables::TTableColumnInfo(
190-
column._ColumnName, column._ColumnId, column._ColumnTypeInfo, "", -1
191-
);
192-
}
203+
void RegisterPgTablesSystemViews() {
204+
auto registerView = [&](TStringBuf tableName, const TVector<Schema::PgColumn>& columns) {
205+
auto& dsv = DomainSystemViews[tableName];
206+
auto& sdsv = SubDomainSystemViews[tableName];
207+
for (const auto& column : columns) {
208+
dsv.Columns[column._ColumnId + 1] = TSysTables::TTableColumnInfo(
209+
column._ColumnName, column._ColumnId + 1, column._ColumnTypeInfo, "", -1
210+
);
211+
sdsv.Columns[column._ColumnId + 1] = TSysTables::TTableColumnInfo(
212+
column._ColumnName, column._ColumnId + 1, column._ColumnTypeInfo, "", -1
213+
);
214+
}
215+
};
216+
registerView(
217+
PgTablesName,
218+
Singleton<Schema::PgTablesSchemaProvider>()->GetColumns(PgTablesName)
219+
);
220+
registerView(
221+
InformationSchemaTablesName,
222+
Singleton<Schema::PgTablesSchemaProvider>()->GetColumns(InformationSchemaTablesName)
223+
);
224+
registerView(
225+
PgClassName,
226+
Singleton<Schema::PgTablesSchemaProvider>()->GetColumns(PgClassName)
227+
);
193228
}
194229

195230
template <typename Table>
@@ -250,7 +285,7 @@ class TSystemViewResolver : public ISystemViewResolver {
250285
RegisterSystemView<Schema::TopPartitions>(TopPartitions1MinuteName);
251286
RegisterSystemView<Schema::TopPartitions>(TopPartitions1HourName);
252287

253-
RegisterPgTablesSystemView();
288+
RegisterPgTablesSystemViews();
254289
}
255290

256291
private:

ydb/core/sys_view/common/schema.h

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ constexpr TStringBuf TopPartitions1MinuteName = "top_partitions_one_minute";
4646
constexpr TStringBuf TopPartitions1HourName = "top_partitions_one_hour";
4747

4848
constexpr TStringBuf PgTablesName = "pg_tables";
49+
constexpr TStringBuf InformationSchemaTablesName = "tables";
50+
constexpr TStringBuf PgClassName = "pg_class";
51+
4952

5053
struct Schema : NIceDb::Schema {
5154
struct PartitionStats : Table<1> {
@@ -595,13 +598,15 @@ struct Schema : NIceDb::Schema {
595598
NIceDb::TColumnId _ColumnId;
596599
NScheme::TTypeInfo _ColumnTypeInfo;
597600
TString _ColumnName;
598-
PgColumn(NIceDb::TColumnId columnId, TStringBuf columnTypeName, TStringBuf columnName)
599-
: _ColumnId(columnId), _ColumnTypeInfo(NScheme::NTypeIds::Pg, NPg::TypeDescFromPgTypeName(columnTypeName)), _ColumnName(columnName)
600-
{}
601+
PgColumn(NIceDb::TColumnId columnId, TStringBuf columnTypeName, TStringBuf columnName);
601602
};
602603

603-
struct PgTables {
604-
const static TVector<PgColumn> Columns;
604+
class PgTablesSchemaProvider {
605+
public:
606+
PgTablesSchemaProvider();
607+
const TVector<PgColumn>& GetColumns(TStringBuf tableName) const;
608+
private:
609+
std::unordered_map<TString, TVector<PgColumn>> columnsStorage;
605610
};
606611
};
607612

@@ -622,7 +627,7 @@ class ISystemViewResolver {
622627
struct TSystemViewPath {
623628
TVector<TString> Parent;
624629
TString ViewName;
625-
};
630+
};
626631

627632
struct TSchema {
628633
THashMap<NTable::TTag, TSysTables::TTableColumnInfo> Columns;

0 commit comments

Comments
 (0)