Skip to content

Commit 33f0cc2

Browse files
authored
feat: (step 3.1) enable builtin view for some dummy and simple system catalogs (#11278)
1 parent 2b48dbd commit 33f0cc2

31 files changed

+500
-659
lines changed

e2e_test/batch/catalog/pg_class.slt.part

+9-9
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@ query ITIT
22
SELECT oid,relname,relowner,relkind FROM pg_catalog.pg_class ORDER BY oid limit 15;
33
----
44
1 pg_type 1 r
5-
2 pg_namespace 1 r
5+
2 pg_namespace 1 v
66
3 pg_cast 1 r
7-
4 pg_matviews 1 r
8-
5 pg_user 1 r
7+
4 pg_matviews 1 v
8+
5 pg_user 1 v
99
6 pg_class 1 r
1010
7 pg_index 1 r
11-
8 pg_opclass 1 r
12-
9 pg_collation 1 r
13-
10 pg_am 1 r
14-
11 pg_operator 1 r
11+
8 pg_opclass 1 v
12+
9 pg_collation 1 v
13+
10 pg_am 1 v
14+
11 pg_operator 1 v
1515
12 pg_views 1 r
1616
13 pg_attribute 1 r
17-
14 pg_database 1 r
17+
14 pg_database 1 v
1818
15 pg_description 1 r
1919

2020
query ITIT
2121
SELECT oid,relname,relowner,relkind FROM pg_catalog.pg_class WHERE oid = 'pg_namespace'::regclass;
2222
----
23-
2 pg_namespace 1 r
23+
2 pg_namespace 1 v
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
query ITIITT
2-
SELECT * FROM pg_catalog.pg_database where oid = 0;
2+
SELECT oid, datname, encoding, datcollate, datctype, datistemplate, datallowconn, datconnlimit, dattablespace FROM pg_catalog.pg_database where oid = 0;
33
----
4-
0 dev NULL 6 C C f t -1 1663 NULL
4+
0 dev 6 C C f t -1 1663

e2e_test/ddl/show.slt

+24-22
Original file line numberDiff line numberDiff line change
@@ -127,25 +127,27 @@ drop view v1;
127127
statement ok
128128
drop table t3;
129129

130-
query TT
131-
describe pg_matviews;
132-
----
133-
schemaname varchar
134-
matviewname varchar
135-
matviewowner integer
136-
definition varchar
137-
matviewid integer
138-
matviewtimezone varchar
139-
matviewgraph varchar
140-
primary key schemaname, matviewname
141-
142-
query TT
143-
show columns from pg_catalog.pg_matviews;
144-
----
145-
schemaname varchar
146-
matviewname varchar
147-
matviewowner integer
148-
definition varchar
149-
matviewid integer
150-
matviewtimezone varchar
151-
matviewgraph varchar
130+
# todo: re-enable it when we support these commands on view
131+
# https://github.com/risingwavelabs/risingwave/issues/11234
132+
#query TT
133+
#describe pg_matviews;
134+
#----
135+
#schemaname varchar
136+
#matviewname varchar
137+
#matviewowner integer
138+
#definition varchar
139+
#matviewid integer
140+
#matviewtimezone varchar
141+
#matviewgraph varchar
142+
#primary key schemaname, matviewname
143+
#
144+
#query TT
145+
#show columns from pg_catalog.pg_matviews;
146+
#----
147+
#schemaname varchar
148+
#matviewname varchar
149+
#matviewowner integer
150+
#definition varchar
151+
#matviewid integer
152+
#matviewtimezone varchar
153+
#matviewgraph varchar

src/frontend/planner_test/tests/testdata/output/pg_catalog.yaml

+14-10
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
- sql: |
99
select * from pg_catalog.pg_namespace
1010
logical_plan: |-
11-
LogicalProject { exprs: [pg_namespace.oid, pg_namespace.nspname, pg_namespace.nspowner, pg_namespace.nspacl] }
12-
└─LogicalScan { table: pg_namespace, columns: [pg_namespace.oid, pg_namespace.nspname, pg_namespace.nspowner, pg_namespace.nspacl] }
13-
batch_plan: 'BatchScan { table: pg_namespace, columns: [pg_namespace.oid, pg_namespace.nspname, pg_namespace.nspowner, pg_namespace.nspacl], distribution: Single }'
11+
LogicalProject { exprs: [rw_schemas.id, rw_schemas.name, rw_schemas.owner, rw_schemas.acl] }
12+
└─LogicalShare { id: 2 }
13+
└─LogicalProject { exprs: [rw_schemas.id, rw_schemas.name, rw_schemas.owner, rw_schemas.acl] }
14+
└─LogicalScan { table: rw_schemas, columns: [rw_schemas.id, rw_schemas.name, rw_schemas.owner, rw_schemas.acl] }
15+
batch_plan: 'BatchScan { table: rw_schemas, columns: [rw_schemas.id, rw_schemas.name, rw_schemas.owner, rw_schemas.acl], distribution: Single }'
1416
- sql: |
1517
select * from pg_catalog.pg_cast
1618
logical_plan: |-
@@ -20,18 +22,20 @@
2022
- sql: |
2123
select pg_catalog.pg_get_userbyid(1)
2224
logical_plan: |-
23-
LogicalProject { exprs: [pg_user.name] }
25+
LogicalProject { exprs: [rw_users.name] }
2426
└─LogicalApply { type: LeftOuter, on: true, correlated_id: 1, max_one_row: true }
2527
├─LogicalValues { rows: [[]], schema: Schema { fields: [] } }
26-
└─LogicalProject { exprs: [pg_user.name] }
27-
└─LogicalFilter { predicate: (1:Int32 = pg_user.usesysid) }
28-
└─LogicalScan { table: pg_user, columns: [pg_user.usesysid, pg_user.name, pg_user.usecreatedb, pg_user.usesuper, pg_user.passwd] }
28+
└─LogicalProject { exprs: [rw_users.name] }
29+
└─LogicalFilter { predicate: (1:Int32 = rw_users.id) }
30+
└─LogicalShare { id: 2 }
31+
└─LogicalProject { exprs: [rw_users.id, rw_users.name, rw_users.create_db, rw_users.is_super, '********':Varchar] }
32+
└─LogicalScan { table: rw_users, columns: [rw_users.id, rw_users.name, rw_users.is_super, rw_users.create_db, rw_users.create_user, rw_users.can_login] }
2933
batch_plan: |-
3034
BatchNestedLoopJoin { type: LeftOuter, predicate: true, output: all }
3135
├─BatchValues { rows: [[]] }
32-
└─BatchProject { exprs: [pg_user.name] }
33-
└─BatchFilter { predicate: (1:Int32 = pg_user.usesysid) }
34-
└─BatchScan { table: pg_user, columns: [pg_user.name, pg_user.usesysid], distribution: Single }
36+
└─BatchProject { exprs: [rw_users.name] }
37+
└─BatchFilter { predicate: (1:Int32 = rw_users.id) }
38+
└─BatchScan { table: rw_users, columns: [rw_users.name, rw_users.id], distribution: Single }
3539
- sql: |
3640
select 'pg_namespace'::regclass
3741
logical_plan: |-

src/frontend/planner_test/tests/testdata/output/subquery.yaml

+33-27
Original file line numberDiff line numberDiff line change
@@ -196,29 +196,31 @@
196196
- sql: |
197197
SELECT (SELECT pg_catalog.pg_get_userbyid(1))
198198
logical_plan: |-
199-
LogicalProject { exprs: [pg_user.name] }
199+
LogicalProject { exprs: [rw_users.name] }
200200
└─LogicalApply { type: LeftOuter, on: true, correlated_id: 1, max_one_row: true }
201201
├─LogicalValues { rows: [[]], schema: Schema { fields: [] } }
202-
└─LogicalProject { exprs: [pg_user.name] }
202+
└─LogicalProject { exprs: [rw_users.name] }
203203
└─LogicalApply { type: LeftOuter, on: true, correlated_id: 2, max_one_row: true }
204204
├─LogicalValues { rows: [[]], schema: Schema { fields: [] } }
205-
└─LogicalProject { exprs: [pg_user.name] }
206-
└─LogicalFilter { predicate: (1:Int32 = pg_user.usesysid) }
207-
└─LogicalScan { table: pg_user, columns: [pg_user.usesysid, pg_user.name, pg_user.usecreatedb, pg_user.usesuper, pg_user.passwd] }
205+
└─LogicalProject { exprs: [rw_users.name] }
206+
└─LogicalFilter { predicate: (1:Int32 = rw_users.id) }
207+
└─LogicalShare { id: 2 }
208+
└─LogicalProject { exprs: [rw_users.id, rw_users.name, rw_users.create_db, rw_users.is_super, '********':Varchar] }
209+
└─LogicalScan { table: rw_users, columns: [rw_users.id, rw_users.name, rw_users.is_super, rw_users.create_db, rw_users.create_user, rw_users.can_login] }
208210
optimized_logical_plan_for_batch: |-
209211
LogicalJoin { type: LeftOuter, on: true, output: all }
210212
├─LogicalValues { rows: [[]], schema: Schema { fields: [] } }
211213
└─LogicalJoin { type: LeftOuter, on: true, output: all }
212214
├─LogicalValues { rows: [[]], schema: Schema { fields: [] } }
213-
└─LogicalScan { table: pg_user, output_columns: [pg_user.name], required_columns: [pg_user.name, pg_user.usesysid], predicate: (1:Int32 = pg_user.usesysid) }
215+
└─LogicalScan { table: rw_users, output_columns: [rw_users.name], required_columns: [rw_users.name, rw_users.id], predicate: (1:Int32 = rw_users.id) }
214216
batch_plan: |-
215217
BatchNestedLoopJoin { type: LeftOuter, predicate: true, output: all }
216218
├─BatchValues { rows: [[]] }
217219
└─BatchNestedLoopJoin { type: LeftOuter, predicate: true, output: all }
218220
├─BatchValues { rows: [[]] }
219-
└─BatchProject { exprs: [pg_user.name] }
220-
└─BatchFilter { predicate: (1:Int32 = pg_user.usesysid) }
221-
└─BatchScan { table: pg_user, columns: [pg_user.name, pg_user.usesysid], distribution: Single }
221+
└─BatchProject { exprs: [rw_users.name] }
222+
└─BatchFilter { predicate: (1:Int32 = rw_users.id) }
223+
└─BatchScan { table: rw_users, columns: [rw_users.name, rw_users.id], distribution: Single }
222224
- sql: |
223225
SELECT n.nspname as "Schema",
224226
c.relname as "Name",
@@ -233,31 +235,35 @@
233235
AND pg_catalog.pg_table_is_visible(c.oid)
234236
ORDER BY 1,2;
235237
logical_plan: |-
236-
LogicalProject { exprs: [pg_namespace.nspname, pg_class.relname, Case((pg_class.relkind = 'r':Varchar), 'table':Varchar, (pg_class.relkind = 'v':Varchar), 'view':Varchar, (pg_class.relkind = 'm':Varchar), 'materialized view':Varchar, (pg_class.relkind = 'i':Varchar), 'index':Varchar, (pg_class.relkind = 'S':Varchar), 'sequence':Varchar, (pg_class.relkind = 's':Varchar), 'special':Varchar, (pg_class.relkind = 't':Varchar), 'TOAST table':Varchar, (pg_class.relkind = 'f':Varchar), 'foreign table':Varchar, (pg_class.relkind = 'p':Varchar), 'partitioned table':Varchar, (pg_class.relkind = 'I':Varchar), 'partitioned index':Varchar) as $expr1, pg_user.name] }
238+
LogicalProject { exprs: [rw_schemas.name, pg_class.relname, Case((pg_class.relkind = 'r':Varchar), 'table':Varchar, (pg_class.relkind = 'v':Varchar), 'view':Varchar, (pg_class.relkind = 'm':Varchar), 'materialized view':Varchar, (pg_class.relkind = 'i':Varchar), 'index':Varchar, (pg_class.relkind = 'S':Varchar), 'sequence':Varchar, (pg_class.relkind = 's':Varchar), 'special':Varchar, (pg_class.relkind = 't':Varchar), 'TOAST table':Varchar, (pg_class.relkind = 'f':Varchar), 'foreign table':Varchar, (pg_class.relkind = 'p':Varchar), 'partitioned table':Varchar, (pg_class.relkind = 'I':Varchar), 'partitioned index':Varchar) as $expr1, rw_users.name] }
237239
└─LogicalApply { type: LeftOuter, on: true, correlated_id: 1, max_one_row: true }
238-
├─LogicalFilter { predicate: In(pg_class.relkind, 'r':Varchar, 'p':Varchar, 'v':Varchar, 'm':Varchar, 'S':Varchar, 'f':Varchar, '':Varchar) AND (pg_namespace.nspname <> 'pg_catalog':Varchar) AND IsNull(RegexpMatch(pg_namespace.nspname, '^pg_toast':Varchar)) AND (pg_namespace.nspname <> 'information_schema':Varchar) }
239-
│ └─LogicalJoin { type: LeftOuter, on: (pg_namespace.oid = pg_class.relnamespace), output: all }
240+
├─LogicalFilter { predicate: In(pg_class.relkind, 'r':Varchar, 'p':Varchar, 'v':Varchar, 'm':Varchar, 'S':Varchar, 'f':Varchar, '':Varchar) AND (rw_schemas.name <> 'pg_catalog':Varchar) AND IsNull(RegexpMatch(rw_schemas.name, '^pg_toast':Varchar)) AND (rw_schemas.name <> 'information_schema':Varchar) }
241+
│ └─LogicalJoin { type: LeftOuter, on: (rw_schemas.id = pg_class.relnamespace), output: all }
240242
│ ├─LogicalScan { table: pg_class, columns: [pg_class.oid, pg_class.relname, pg_class.relnamespace, pg_class.relowner, pg_class.relkind, pg_class.relam, pg_class.reltablespace] }
241-
│ └─LogicalScan { table: pg_namespace, columns: [pg_namespace.oid, pg_namespace.nspname, pg_namespace.nspowner, pg_namespace.nspacl] }
242-
└─LogicalProject { exprs: [pg_user.name] }
243-
└─LogicalFilter { predicate: (CorrelatedInputRef { index: 3, correlated_id: 1 } = pg_user.usesysid) }
244-
└─LogicalScan { table: pg_user, columns: [pg_user.usesysid, pg_user.name, pg_user.usecreatedb, pg_user.usesuper, pg_user.passwd] }
243+
│ └─LogicalShare { id: 2 }
244+
│ └─LogicalProject { exprs: [rw_schemas.id, rw_schemas.name, rw_schemas.owner, rw_schemas.acl] }
245+
│ └─LogicalScan { table: rw_schemas, columns: [rw_schemas.id, rw_schemas.name, rw_schemas.owner, rw_schemas.acl] }
246+
└─LogicalProject { exprs: [rw_users.name] }
247+
└─LogicalFilter { predicate: (CorrelatedInputRef { index: 3, correlated_id: 1 } = rw_users.id) }
248+
└─LogicalShare { id: 6 }
249+
└─LogicalProject { exprs: [rw_users.id, rw_users.name, rw_users.create_db, rw_users.is_super, '********':Varchar] }
250+
└─LogicalScan { table: rw_users, columns: [rw_users.id, rw_users.name, rw_users.is_super, rw_users.create_db, rw_users.create_user, rw_users.can_login] }
245251
batch_plan: |-
246-
BatchExchange { order: [pg_namespace.nspname ASC, pg_class.relname ASC], dist: Single }
247-
└─BatchProject { exprs: [pg_namespace.nspname, pg_class.relname, Case((pg_class.relkind = 'r':Varchar), 'table':Varchar, (pg_class.relkind = 'v':Varchar), 'view':Varchar, (pg_class.relkind = 'm':Varchar), 'materialized view':Varchar, (pg_class.relkind = 'i':Varchar), 'index':Varchar, (pg_class.relkind = 'S':Varchar), 'sequence':Varchar, (pg_class.relkind = 's':Varchar), 'special':Varchar, (pg_class.relkind = 't':Varchar), 'TOAST table':Varchar, (pg_class.relkind = 'f':Varchar), 'foreign table':Varchar, (pg_class.relkind = 'p':Varchar), 'partitioned table':Varchar, (pg_class.relkind = 'I':Varchar), 'partitioned index':Varchar) as $expr1, pg_user.name] }
248-
└─BatchSort { order: [pg_namespace.nspname ASC, pg_class.relname ASC] }
249-
└─BatchHashJoin { type: LeftOuter, predicate: pg_class.relowner = pg_user.usesysid, output: [pg_class.relname, pg_class.relkind, pg_namespace.nspname, pg_user.name] }
252+
BatchExchange { order: [rw_schemas.name ASC, pg_class.relname ASC], dist: Single }
253+
└─BatchProject { exprs: [rw_schemas.name, pg_class.relname, Case((pg_class.relkind = 'r':Varchar), 'table':Varchar, (pg_class.relkind = 'v':Varchar), 'view':Varchar, (pg_class.relkind = 'm':Varchar), 'materialized view':Varchar, (pg_class.relkind = 'i':Varchar), 'index':Varchar, (pg_class.relkind = 'S':Varchar), 'sequence':Varchar, (pg_class.relkind = 's':Varchar), 'special':Varchar, (pg_class.relkind = 't':Varchar), 'TOAST table':Varchar, (pg_class.relkind = 'f':Varchar), 'foreign table':Varchar, (pg_class.relkind = 'p':Varchar), 'partitioned table':Varchar, (pg_class.relkind = 'I':Varchar), 'partitioned index':Varchar) as $expr1, rw_users.name] }
254+
└─BatchSort { order: [rw_schemas.name ASC, pg_class.relname ASC] }
255+
└─BatchHashJoin { type: LeftOuter, predicate: pg_class.relowner = rw_users.id, output: [pg_class.relname, pg_class.relkind, rw_schemas.name, rw_users.name] }
250256
├─BatchExchange { order: [], dist: HashShard(pg_class.relowner) }
251-
│ └─BatchHashJoin { type: Inner, predicate: pg_class.relnamespace = pg_namespace.oid, output: [pg_class.relname, pg_class.relowner, pg_class.relkind, pg_namespace.nspname] }
257+
│ └─BatchHashJoin { type: Inner, predicate: pg_class.relnamespace = rw_schemas.id, output: [pg_class.relname, pg_class.relowner, pg_class.relkind, rw_schemas.name] }
252258
│ ├─BatchExchange { order: [], dist: HashShard(pg_class.relnamespace) }
253259
│ │ └─BatchFilter { predicate: In(pg_class.relkind, 'r':Varchar, 'p':Varchar, 'v':Varchar, 'm':Varchar, 'S':Varchar, 'f':Varchar, '':Varchar) }
254260
│ │ └─BatchScan { table: pg_class, columns: [pg_class.relname, pg_class.relnamespace, pg_class.relowner, pg_class.relkind], distribution: Single }
255-
│ └─BatchExchange { order: [], dist: HashShard(pg_namespace.oid) }
256-
│ └─BatchFilter { predicate: (pg_namespace.nspname <> 'pg_catalog':Varchar) AND IsNull(RegexpMatch(pg_namespace.nspname, '^pg_toast':Varchar)) AND (pg_namespace.nspname <> 'information_schema':Varchar) }
257-
│ └─BatchScan { table: pg_namespace, columns: [pg_namespace.oid, pg_namespace.nspname], distribution: Single }
258-
└─BatchExchange { order: [], dist: HashShard(pg_user.usesysid) }
259-
└─BatchProject { exprs: [pg_user.name, pg_user.usesysid] }
260-
└─BatchScan { table: pg_user, columns: [pg_user.usesysid, pg_user.name], distribution: Single }
261+
│ └─BatchExchange { order: [], dist: HashShard(rw_schemas.id) }
262+
│ └─BatchFilter { predicate: (rw_schemas.name <> 'pg_catalog':Varchar) AND IsNull(RegexpMatch(rw_schemas.name, '^pg_toast':Varchar)) AND (rw_schemas.name <> 'information_schema':Varchar) }
263+
│ └─BatchScan { table: rw_schemas, columns: [rw_schemas.id, rw_schemas.name], distribution: Single }
264+
└─BatchExchange { order: [], dist: HashShard(rw_users.id) }
265+
└─BatchProject { exprs: [rw_users.name, rw_users.id] }
266+
└─BatchScan { table: rw_users, columns: [rw_users.id, rw_users.name], distribution: Single }
261267
- sql: |
262268
create table auction (date_time date);
263269
select * from hop( auction, auction.date_time, INTERVAL '1', INTERVAL '3600' ) AS hop_1

src/frontend/src/binder/relation/table_or_source.rs

+9-7
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ impl Binder {
9595
table_name,
9696
) {
9797
resolve_sys_table_relation(sys_table_catalog)
98+
} else if let Ok((view_catalog, _)) =
99+
self.catalog
100+
.get_view_by_name(&self.db_name, schema_path, table_name)
101+
{
102+
self.resolve_view_relation(&view_catalog.clone())?
98103
} else {
99104
return Err(ErrorCode::NotImplemented(
100105
format!(
@@ -141,13 +146,10 @@ impl Binder {
141146
let user_name = &self.auth_context.user_name;
142147

143148
for path in self.search_path.path() {
144-
if is_system_schema(path) {
145-
if let Ok(sys_table_catalog) =
146-
self.catalog
147-
.get_sys_table_by_name(&self.db_name, path, table_name)
148-
{
149-
return Ok(resolve_sys_table_relation(sys_table_catalog));
150-
}
149+
if is_system_schema(path) &&
150+
let Ok(sys_table_catalog) =
151+
self.catalog.get_sys_table_by_name(&self.db_name, path, table_name) {
152+
return Ok(resolve_sys_table_relation(sys_table_catalog));
151153
} else {
152154
let schema_name = if path == USER_NAME_WILD_CARD {
153155
user_name

src/frontend/src/catalog/root_catalog.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ use super::{CatalogError, CatalogResult, ConnectionId, SinkId, SourceId, ViewId}
3232
use crate::catalog::connection_catalog::ConnectionCatalog;
3333
use crate::catalog::database_catalog::DatabaseCatalog;
3434
use crate::catalog::schema_catalog::SchemaCatalog;
35-
use crate::catalog::system_catalog::{get_sys_tables_in_schema, SystemTableCatalog};
35+
use crate::catalog::system_catalog::{
36+
get_sys_tables_in_schema, get_sys_views_in_schema, SystemTableCatalog,
37+
};
3638
use crate::catalog::table_catalog::TableCatalog;
3739
use crate::catalog::{DatabaseId, IndexCatalog, SchemaId};
3840

@@ -147,6 +149,15 @@ impl Catalog {
147149
.create_sys_table(sys_table);
148150
});
149151
}
152+
if let Some(sys_views) = get_sys_views_in_schema(proto.name.as_str()) {
153+
sys_views.into_iter().for_each(|sys_view| {
154+
self.get_database_mut(proto.database_id)
155+
.unwrap()
156+
.get_schema_mut(proto.id)
157+
.unwrap()
158+
.create_sys_view(sys_view);
159+
});
160+
}
150161
}
151162

152163
pub fn create_table(&mut self, proto: &PbTable) {

0 commit comments

Comments
 (0)