From: Michael Paquier Date: Wed, 4 Mar 2026 00:55:58 +0000 (+0900) Subject: Add some tests for CREATE OR REPLACE VIEW with column additions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ef6381829cb92a23ed7730335a669cb16af3580;p=thirdparty%2Fpostgresql.git Add some tests for CREATE OR REPLACE VIEW with column additions When working on an already-defined view with matching attributes, CREATE OR REPLACE VIEW would internally generate an ALTER TABLE command with a set of AT_AddColumnToView sub-commands, one for each attribute added. Such a command is stored in event triggers twice: - Once as a simple command. - Once as an ALTER TABLE command, as it has sub-commands. There was no test coverage to track this command pattern in terms of event triggers and DDL deparsing: - For the test module test_ddl_deparse, two command notices are issued. - For event triggers, a CREATE VIEW command is logged twice, which may look a bit weird first, but again this maps with the internal behavior of how the commands are built, and how the event trigger code reacts in terms of commands gathered. While on it, this adds a test for CREATE SCHEMA with a CREATE VIEW command embedded in it, case supported by the grammar but not covered yet. This hole in the test coverage has been found while digging into what would be a similar behavior for sequences if adding attributes to them with ALTER TABLE variants, after the initial relation creation. Discussion: https://postgr.es/m/aaFG9bqkEn0RhLJG@paquier.xyz --- diff --git a/src/test/modules/test_ddl_deparse/expected/create_view.out b/src/test/modules/test_ddl_deparse/expected/create_view.out index 4ae0f4978ec..0a8cc4627a8 100644 --- a/src/test/modules/test_ddl_deparse/expected/create_view.out +++ b/src/test/modules/test_ddl_deparse/expected/create_view.out @@ -12,6 +12,12 @@ NOTICE: subcommand: type REPLACE RELOPTIONS desc CREATE VIEW datatype_view AS SELECT * FROM datatype_table; NOTICE: DDL test: type simple, tag CREATE VIEW +CREATE OR REPLACE VIEW datatype_view AS + SELECT * FROM datatype_table, static_view; +NOTICE: DDL test: type simple, tag CREATE VIEW +NOTICE: DDL test: type alter table, tag CREATE VIEW +NOTICE: subcommand: type ADD COLUMN TO VIEW desc column col of view datatype_view +NOTICE: subcommand: type REPLACE RELOPTIONS desc CREATE RECURSIVE VIEW nums_1_100 (n) AS VALUES (1) UNION ALL diff --git a/src/test/modules/test_ddl_deparse/sql/create_view.sql b/src/test/modules/test_ddl_deparse/sql/create_view.sql index 030b76f86fa..f473dd74171 100644 --- a/src/test/modules/test_ddl_deparse/sql/create_view.sql +++ b/src/test/modules/test_ddl_deparse/sql/create_view.sql @@ -11,6 +11,9 @@ CREATE OR REPLACE VIEW static_view AS CREATE VIEW datatype_view AS SELECT * FROM datatype_table; +CREATE OR REPLACE VIEW datatype_view AS + SELECT * FROM datatype_table, static_view; + CREATE RECURSIVE VIEW nums_1_100 (n) AS VALUES (1) UNION ALL diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out index 16e4530708c..f897b079e67 100644 --- a/src/test/regress/expected/event_trigger.out +++ b/src/test/regress/expected/event_trigger.out @@ -416,7 +416,8 @@ CREATE SCHEMA evttrig CREATE TABLE one (col_a SERIAL PRIMARY KEY, col_b text DEFAULT 'forty two', col_c SERIAL) CREATE INDEX one_idx ON one (col_b) CREATE TABLE two (col_c INTEGER CHECK (col_c > 0) REFERENCES one DEFAULT 42) - CREATE TABLE id (col_d int NOT NULL GENERATED ALWAYS AS IDENTITY); + CREATE TABLE id (col_d int NOT NULL GENERATED ALWAYS AS IDENTITY) + CREATE VIEW one_view AS SELECT * FROM two; NOTICE: END: command_tag=CREATE SCHEMA type=schema identity=evttrig NOTICE: END: command_tag=CREATE SEQUENCE type=sequence identity=evttrig.one_col_a_seq NOTICE: END: command_tag=CREATE SEQUENCE type=sequence identity=evttrig.one_col_c_seq @@ -429,7 +430,14 @@ NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.two NOTICE: END: command_tag=CREATE SEQUENCE type=sequence identity=evttrig.id_col_d_seq NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.id NOTICE: END: command_tag=ALTER SEQUENCE type=sequence identity=evttrig.id_col_d_seq +NOTICE: END: command_tag=CREATE VIEW type=view identity=evttrig.one_view NOTICE: END: command_tag=CREATE INDEX type=index identity=evttrig.one_idx +-- View with column additions +CREATE OR REPLACE VIEW evttrig.one_view AS SELECT * FROM evttrig.two, evttrig.id; +NOTICE: END: command_tag=CREATE VIEW type=view identity=evttrig.one_view +NOTICE: END: command_tag=CREATE VIEW type=view identity=evttrig.one_view +DROP VIEW evttrig.one_view; +NOTICE: NORMAL: orig=t normal=f istemp=f type=view identity=evttrig.one_view schema=evttrig name=one_view addr={evttrig,one_view} args={} -- Partitioned tables with a partitioned index CREATE TABLE evttrig.parted ( id int PRIMARY KEY) diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql index c613c0cfd43..32e9bb58c5e 100644 --- a/src/test/regress/sql/event_trigger.sql +++ b/src/test/regress/sql/event_trigger.sql @@ -324,7 +324,12 @@ CREATE SCHEMA evttrig CREATE TABLE one (col_a SERIAL PRIMARY KEY, col_b text DEFAULT 'forty two', col_c SERIAL) CREATE INDEX one_idx ON one (col_b) CREATE TABLE two (col_c INTEGER CHECK (col_c > 0) REFERENCES one DEFAULT 42) - CREATE TABLE id (col_d int NOT NULL GENERATED ALWAYS AS IDENTITY); + CREATE TABLE id (col_d int NOT NULL GENERATED ALWAYS AS IDENTITY) + CREATE VIEW one_view AS SELECT * FROM two; + +-- View with column additions +CREATE OR REPLACE VIEW evttrig.one_view AS SELECT * FROM evttrig.two, evttrig.id; +DROP VIEW evttrig.one_view; -- Partitioned tables with a partitioned index CREATE TABLE evttrig.parted (