Subject: CREATE SCHEMA ... CREATE M.V. support

From: Kirill Reshke <[email-masked]>
Date: Mon, 11 Nov 2024 13:06:57 +0500

Hi!
I was exploring the PostgreSQL parser and discovered a very
interesting feature. Users can create schema along with schema objects
in single SQL.

So, for example
```
db1=# create schema shshshsh create table t1(i int) create view v1 as
select * from t1;
CREATE SCHEMA
```
works.

But `create schema shshshsh create materialized view v1 as select `
will not work.
I was trying to search for relevant discussions, but failed. It
appears that the feature has been available from 7.3 versions[1].
Support for materialized views began in 9.3. Perhaps, then, this is
simply something that was overlooked for support?

It appears that supporting this is as simple as changing this parser's
non-terminal [2]. However, perhaps there are justifications for why we
forbid this?

P.S. is this the correct place to make this question?

[1] https://git.postgresql.org/cgit/postgresql.git/tree/src/backend/parser/gram.y?h=REL7_3_STABLE#n802
[2] https://git.postgresql.org/cgit/postgresql.git/tree/src/backend/parser/gram.y?h=14e87ffa5c543b5f30ead7413084c25f7735039f#n1580
-- 
Best regards,
Kirill Reshke

---

From: Alvaro Herrera <[email-masked]>
Date: Mon, 11 Nov 2024 11:09:53 +0100

Hello Kirill

> interesting feature. Users can create schema along with schema objects

Yeah, it's pretty cool.

> simply something that was overlooked for support?

Yeah, I don't know why but people seem generally uninterested in
expanding support of commands under CREATE SCHEMA, which I think is a
pity.  However, keep in mind that the set of commands allowed is
dictated by the SQL standard, which says

<schema definition> ::=
        CREATE SCHEMA <schema name clause>
	[ <schema character set or path> ]
	[ <schema element>... ]

<schema element> ::=
	<table definition>
	| <view definition>
	| <domain definition>
	| <character set definition>
	| <collation definition>
	| <transliteration definition>
	| <assertion definition>
	| <trigger definition>
	| <user-defined type definition>
	| <user-defined cast definition>
	| <user-defined ordering definition>
	| <transform definition>
	| <schema routine>
	| <sequence generator definition>
	| <grant statement>
	| <role definition>

Materialized views are not in the SQL standard, so if we do decide to
support them under CREATE SCHEMA, it would be an extension to the
standard.  (IMO it's quite a natural one at that.)

> [2] https://git.postgresql.org/cgit/postgresql.git/tree/src/backend/parser/gram.y?h=14e87ffa5c543b5f30ead7413084c25f7735039f#n1580

I don't think so, or at least I'm not aware of them.

Looking at the object list in the standard document, it looks like we're
missing quite some stuff there.

> P.S. is this the correct place to make this question?

No, this is more a pgsql-hackers question.

-- 
Álvaro Herrera        Breisgau, Deutschland  —  https://www.EnterpriseDB.com/
"¿Cómo puedes confiar en algo que pagas y que no ves,
y no confiar en algo que te dan y te lo muestran?" (Germán Poo)