@@ -22,30 +22,85 @@ class TPgTablesScan : public NKikimr::NSysView::TScanActorBase<TPgTablesScan> {
2222private:
2323 TCell MakePgCell (const Schema::PgColumn& column, const TString& value, TVector<TString>& cellData) {
2424 NYql::NUdf::TStringRef ref;
25- auto typeDesc = column._ColumnTypeInfo .GetTypeDesc ();
26- auto convert = NPg::PgNativeBinaryFromNativeText (value, NPg::PgTypeIdFromTypeDesc (typeDesc));
25+ auto convert = NPg::PgNativeBinaryFromNativeText (value, NPg::PgTypeIdFromTypeDesc (column._ColumnTypeInfo .GetTypeDesc ()));
2726 if (convert.Error ) {
2827 ConvertError_ = *convert.Error ;
2928 return TCell ();
3029 }
3130 cellData.emplace_back (convert.Str );
3231 ref = NYql::NUdf::TStringRef (cellData.back ());
33-
32+ Y_ENSURE (ref. Size () > 0 );
3433 return TCell (ref.Data (), ref.Size ());
3534 }
3635
3736 TVector<TCell> MakePgTablesRow (const TString& tableName, const TString& tableOwner, TVector<TString>& cellData) {
38- const auto &Columns = Schema::PgTables::Columns;
39- return {
40- MakePgCell (Columns[0 ], " true" , cellData), // hasindexes
41- MakePgCell (Columns[1 ], " false" , cellData), // hasrules
42- MakePgCell (Columns[2 ], " false" , cellData), // hastriggers
43- MakePgCell (Columns[3 ], " false" , cellData), // rowsecurity
44- MakePgCell (Columns[4 ], " public" , cellData), // schemaname
45- MakePgCell (Columns[5 ], tableName, cellData), // tablename
46- MakePgCell (Columns[6 ], tableOwner, cellData), // tableowner
47- TCell () // tablespace
48- };
37+ TVector<TCell> res;
38+ res.reserve (Columns.size ());
39+ for (const auto & column : Columns) {
40+ TCell cell;
41+ switch (column.Tag ) {
42+ case 1 : {
43+ cell = MakePgCell (Schema::PgTables::Columns[0 ], " public" , cellData);
44+ break ;
45+ }
46+ case 2 : {
47+ cell = MakePgCell (Schema::PgTables::Columns[1 ], tableName, cellData);
48+ break ;
49+ }
50+ case 3 : {
51+ cell = MakePgCell (Schema::PgTables::Columns[2 ], tableOwner, cellData);
52+ break ;
53+ }
54+ case 4 : {
55+ cell = TCell ();
56+ break ;
57+ }
58+ case 5 : {
59+ cell = MakePgCell (Schema::PgTables::Columns[4 ], " true" , cellData);
60+ break ;
61+ }
62+ case 6 : {
63+ cell = MakePgCell (Schema::PgTables::Columns[5 ], " false" , cellData);
64+ break ;
65+ }
66+ case 7 : {
67+ cell = MakePgCell (Schema::PgTables::Columns[6 ], " false" , cellData);
68+ break ;
69+ }
70+ case 8 : {
71+ cell = MakePgCell (Schema::PgTables::Columns[7 ], " false" , cellData);
72+ break ;
73+ }
74+
75+ }
76+ res.emplace_back (std::move (cell));
77+ }
78+ return res;
79+ }
80+
81+ TVector<TCell> MakePgTablesStaticRow (const NYql::NPg::TTableInfo& tableInfo, TVector<TString>& cellData) {
82+ TVector<TCell> res;
83+ res.reserve (Columns.size ());
84+ for (const auto & column : Columns) {
85+ TCell cell;
86+ switch (column.Tag ) {
87+ case 1 : {
88+ cell = MakePgCell (Schema::PgTables::Columns[0 ], tableInfo.Schema , cellData);
89+ break ;
90+ }
91+ case 2 : {
92+ cell = MakePgCell (Schema::PgTables::Columns[1 ], tableInfo.Name , cellData);
93+ break ;
94+ }
95+ default : {
96+ cell = TCell ();
97+ break ;
98+ }
99+
100+ }
101+ res.emplace_back (std::move (cell));
102+ }
103+ return res;
49104 }
50105public:
51106 using TBase = NKikimr::NSysView::TScanActorBase<TPgTablesScan>;
@@ -71,6 +126,19 @@ class TPgTablesScan : public NKikimr::NSysView::TScanActorBase<TPgTablesScan> {
71126 Become (&TPgTablesScan::StateWork);
72127 }
73128
129+ void ExpandBatchWithStaticTables (const THolder<NKqp::TEvKqpCompute::TEvScanData>& batch) {
130+ for (const auto & tableDesc : NYql::NPg::GetStaticTables ()) {
131+ TVector<TString> cellData;
132+ TVector<TCell> cells = MakePgTablesStaticRow (tableDesc, cellData);
133+ if (!ConvertError_.Empty ()) {
134+ ReplyErrorAndDie (Ydb::StatusIds::INTERNAL_ERROR, ConvertError_);
135+ return ;
136+ }
137+ TArrayRef<const TCell> ref (cells);
138+ batch->Rows .emplace_back (TOwnedCellVec::Make (ref));
139+ }
140+ }
141+
74142 void Handle (NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr& ev, const TActorContext& ctx) {
75143 Y_UNUSED (ctx);
76144 const auto & record = ev->Get ()->GetRecord ();
@@ -102,6 +170,7 @@ class TPgTablesScan : public NKikimr::NSysView::TScanActorBase<TPgTablesScan> {
102170
103171 auto batch = MakeHolder<NKqp::TEvKqpCompute::TEvScanData>(ScanId);
104172
173+ ExpandBatchWithStaticTables (batch);
105174
106175 for (size_t i = 0 ; i < record.GetPathDescription ().ChildrenSize (); ++i) {
107176 TVector<TString> cellData;
0 commit comments