mirror of
https://github.com/postgres/postgres.git
synced 2026-10-23 13:29:09 +03:00
This reverts commita9c350d9ee. While that intentionally changed our semantics for CREATE SCHEMA subcommands, it's being argued that the functionality gain does not justify potentially-subtle compatibility breakage. The most useful bit of functionality gain came from commit404db8f9e("Execute foreign key constraints in CREATE SCHEMA at the end"), which we're keeping because it's required by SQL spec and doesn't seem to create a compatibility hazard by itself. This is not an exact revert, partly because we're keeping404db8f9e, and partly because I kept the API changes that allowed passing down a ParseState (which allows providing an error cursor for many of the errors thrown in CREATE SCHEMA). Author: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/20260904180712.cc.noahmisch@microsoft.com Backpatch-through: 19
98 lines
3.8 KiB
SQL
98 lines
3.8 KiB
SQL
--
|
|
-- CREATE_SCHEMA
|
|
--
|
|
|
|
-- Schema creation with elements.
|
|
|
|
CREATE ROLE regress_create_schema_role SUPERUSER;
|
|
|
|
-- Cases where schema creation fails as objects are qualified with a schema
|
|
-- that does not match with what's expected.
|
|
-- This checks all the object types that include schema qualifications.
|
|
CREATE SCHEMA AUTHORIZATION regress_create_schema_role
|
|
CREATE SEQUENCE schema_not_existing.seq;
|
|
CREATE SCHEMA AUTHORIZATION regress_create_schema_role
|
|
CREATE TABLE schema_not_existing.tab (id int);
|
|
CREATE SCHEMA AUTHORIZATION regress_create_schema_role
|
|
CREATE VIEW schema_not_existing.view AS SELECT 1;
|
|
CREATE SCHEMA AUTHORIZATION regress_create_schema_role
|
|
CREATE INDEX ON schema_not_existing.tab (id);
|
|
CREATE SCHEMA AUTHORIZATION regress_create_schema_role
|
|
CREATE TRIGGER schema_trig BEFORE INSERT ON schema_not_existing.tab
|
|
EXECUTE FUNCTION schema_trig.no_func();
|
|
-- Again, with a role specification and no schema names.
|
|
SET ROLE regress_create_schema_role;
|
|
CREATE SCHEMA AUTHORIZATION CURRENT_ROLE
|
|
CREATE SEQUENCE schema_not_existing.seq;
|
|
CREATE SCHEMA AUTHORIZATION CURRENT_ROLE
|
|
CREATE TABLE schema_not_existing.tab (id int);
|
|
CREATE SCHEMA AUTHORIZATION CURRENT_ROLE
|
|
CREATE VIEW schema_not_existing.view AS SELECT 1;
|
|
CREATE SCHEMA AUTHORIZATION CURRENT_ROLE
|
|
CREATE INDEX ON schema_not_existing.tab (id);
|
|
CREATE SCHEMA AUTHORIZATION CURRENT_ROLE
|
|
CREATE TRIGGER schema_trig BEFORE INSERT ON schema_not_existing.tab
|
|
EXECUTE FUNCTION schema_trig.no_func();
|
|
-- Again, with a schema name and a role specification.
|
|
CREATE SCHEMA regress_schema_1 AUTHORIZATION CURRENT_ROLE
|
|
CREATE SEQUENCE schema_not_existing.seq;
|
|
CREATE SCHEMA regress_schema_1 AUTHORIZATION CURRENT_ROLE
|
|
CREATE TABLE schema_not_existing.tab (id int);
|
|
CREATE SCHEMA regress_schema_1 AUTHORIZATION CURRENT_ROLE
|
|
CREATE VIEW schema_not_existing.view AS SELECT 1;
|
|
CREATE SCHEMA regress_schema_1 AUTHORIZATION CURRENT_ROLE
|
|
CREATE INDEX ON schema_not_existing.tab (id);
|
|
CREATE SCHEMA regress_schema_1 AUTHORIZATION CURRENT_ROLE
|
|
CREATE TRIGGER schema_trig BEFORE INSERT ON schema_not_existing.tab
|
|
EXECUTE FUNCTION schema_trig.no_func();
|
|
RESET ROLE;
|
|
|
|
-- Cases where the schema creation succeeds.
|
|
-- The schema created matches the role name.
|
|
CREATE SCHEMA AUTHORIZATION regress_create_schema_role
|
|
CREATE TABLE regress_create_schema_role.tab (id int);
|
|
\d regress_create_schema_role.tab
|
|
DROP SCHEMA regress_create_schema_role CASCADE;
|
|
-- Again, with a different role specification and no schema names.
|
|
SET ROLE regress_create_schema_role;
|
|
CREATE SCHEMA AUTHORIZATION CURRENT_ROLE
|
|
CREATE TABLE regress_create_schema_role.tab (id int);
|
|
\d regress_create_schema_role.tab
|
|
DROP SCHEMA regress_create_schema_role CASCADE;
|
|
-- Again, with a schema name and a role specification.
|
|
CREATE SCHEMA regress_schema_1 AUTHORIZATION CURRENT_ROLE
|
|
CREATE TABLE regress_schema_1.tab (id int);
|
|
\d regress_schema_1.tab
|
|
DROP SCHEMA regress_schema_1 CASCADE;
|
|
RESET ROLE;
|
|
|
|
-- Test forward-referencing foreign key clauses.
|
|
CREATE SCHEMA regress_schema_fk
|
|
CREATE TABLE regress_schema_fk.t2 (
|
|
b int,
|
|
a int REFERENCES t1 DEFERRABLE INITIALLY DEFERRED NOT ENFORCED
|
|
REFERENCES t3 DEFERRABLE INITIALLY DEFERRED,
|
|
CONSTRAINT fk FOREIGN KEY (a) REFERENCES t1 NOT DEFERRABLE)
|
|
|
|
CREATE TABLE regress_schema_fk.t1 (a int PRIMARY KEY)
|
|
|
|
CREATE TABLE t3 (a int PRIMARY KEY)
|
|
|
|
CREATE TABLE t4 (
|
|
b int,
|
|
a int REFERENCES t5 NOT DEFERRABLE ENFORCED
|
|
REFERENCES t6 DEFERRABLE INITIALLY IMMEDIATE,
|
|
CONSTRAINT fk FOREIGN KEY (a) REFERENCES t6 DEFERRABLE INITIALLY DEFERRED)
|
|
|
|
CREATE TABLE t5 (a int, b int, PRIMARY KEY (a))
|
|
|
|
CREATE TABLE t6 (a int, b int, PRIMARY KEY (a));
|
|
|
|
\d regress_schema_fk.t2
|
|
\d regress_schema_fk.t4
|
|
|
|
DROP SCHEMA regress_schema_fk CASCADE;
|
|
|
|
-- Clean up
|
|
DROP ROLE regress_create_schema_role;
|