1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-05 23:56:58 +03:00

Add some regression tests for missing DDL patterns

The following commands gain increased coverage for some of the errors
they can trigger:
- ALTER TABLE .. ALTER COLUMN
- CREATE DOMAIN
- CREATE TYPE (LIKE)

This has come up while discussing the possibility to add more
information about the location of the error in such queries, and it
is useful on its own as there was no coverage until now for the
patterns added in this commit.

Author: Jian He, Kirill Reshke
Reviewed-By: Álvaro Herrera, Michael Paquier
Discussion: https://postgr.es/m/CALdSSPhqfvKbDwqJaY=yEePi_aq61GmMpW88i6ZH7CMG_2Z4Cg@mail.gmail.com
This commit is contained in:
Michael Paquier 2024-12-12 11:16:45 +09:00
parent 430a5952de
commit 0172b4c944
8 changed files with 59 additions and 0 deletions

View File

@ -3413,6 +3413,13 @@ ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE int;
ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE text;
ALTER TABLE comment_test ALTER COLUMN positive_col SET DATA TYPE int;
ALTER TABLE comment_test ALTER COLUMN positive_col SET DATA TYPE bigint;
-- Some error cases.
ALTER TABLE comment_test ALTER COLUMN xmin SET DATA TYPE x;
ERROR: cannot alter system column "xmin"
ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE x;
ERROR: type "x" does not exist
ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE int COLLATE "C";
ERROR: collations are not supported by type integer
-- Check that the comments are intact.
SELECT col_description('comment_test'::regclass, 1) as comment;
comment

View File

@ -15,6 +15,33 @@ NOTICE: drop cascades to type dependenttypetest
-- this should fail because already gone
drop domain domaindroptest cascade;
ERROR: type "domaindroptest" does not exist
-- some error cases
create domain d_fail as no_such_type;
ERROR: type "no_such_type" does not exist
create domain d_fail as int constraint cc REFERENCES this_table_not_exists(i);
ERROR: foreign key constraints not possible for domains
create domain d_fail as int4 not null no inherit;
ERROR: not-null constraints for domains cannot be marked NO INHERIT
create domain d_fail as int4 not null null;
ERROR: conflicting NULL/NOT NULL constraints
create domain d_fail as int4 not null default 3 default 3;
ERROR: multiple default expressions
create domain d_fail int4 DEFAULT 3 + 'h';
ERROR: invalid input syntax for type integer: "h"
create domain d_fail int4 collate "C";
ERROR: collations are not supported by type integer
create domain d_fail as anyelement;
ERROR: "anyelement" is not a valid base type for a domain
create domain d_fail as int4 unique;
ERROR: unique constraints not possible for domains
create domain d_fail as int4 PRIMARY key;
ERROR: primary key constraints not possible for domains
create domain d_fail as int4 constraint cc generated by default as identity;
ERROR: specifying GENERATED not supported for domains
create domain d_fail as int4 constraint cc check (values > 1) no inherit;
ERROR: check constraints for domains cannot be marked NO INHERIT
create domain d_fail as int4 constraint cc check (values > 1) deferrable;
ERROR: specifying constraint deferrability not supported for domains
-- Test domain input.
-- Note: the point of checking both INSERT and COPY FROM is that INSERT
-- exercises CoerceToDomain while COPY exercises domain_in.

View File

@ -1024,6 +1024,8 @@ create function xfloat8out(xfloat8) returns cstring immutable strict
NOTICE: argument type xfloat8 is only a shell
LINE 1: create function xfloat8out(xfloat8) returns cstring immutabl...
^
create type xfloat8 (input = xfloat8in, output = xfloat8out, like = no_such_type);
ERROR: type "no_such_type" does not exist
create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8);
create cast (xfloat8 as float8) without function;
create cast (float8 as xfloat8) without function;

View File

@ -43,6 +43,8 @@ CREATE TABLE itest4 (a int, b text);
ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error, requires NOT NULL
ERROR: column "a" of relation "itest4" must be declared NOT NULL before identity can be added
ALTER TABLE itest4 ALTER COLUMN a SET NOT NULL;
ALTER TABLE itest4 ALTER COLUMN c ADD GENERATED ALWAYS AS IDENTITY; -- error, column c does not exist
ERROR: column "c" of relation "itest4" does not exist
ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- ok
ALTER TABLE itest4 ALTER COLUMN a DROP NOT NULL; -- error, disallowed
ERROR: column "a" of relation "itest4" is an identity column

View File

@ -2145,6 +2145,11 @@ ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE text;
ALTER TABLE comment_test ALTER COLUMN positive_col SET DATA TYPE int;
ALTER TABLE comment_test ALTER COLUMN positive_col SET DATA TYPE bigint;
-- Some error cases.
ALTER TABLE comment_test ALTER COLUMN xmin SET DATA TYPE x;
ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE x;
ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE int COLLATE "C";
-- Check that the comments are intact.
SELECT col_description('comment_test'::regclass, 1) as comment;
SELECT indexrelid::regclass::text as index, obj_description(indexrelid, 'pg_class') as comment FROM pg_index where indrelid = 'comment_test'::regclass ORDER BY 1, 2;

View File

@ -16,6 +16,20 @@ drop domain domaindroptest cascade;
-- this should fail because already gone
drop domain domaindroptest cascade;
-- some error cases
create domain d_fail as no_such_type;
create domain d_fail as int constraint cc REFERENCES this_table_not_exists(i);
create domain d_fail as int4 not null no inherit;
create domain d_fail as int4 not null null;
create domain d_fail as int4 not null default 3 default 3;
create domain d_fail int4 DEFAULT 3 + 'h';
create domain d_fail int4 collate "C";
create domain d_fail as anyelement;
create domain d_fail as int4 unique;
create domain d_fail as int4 PRIMARY key;
create domain d_fail as int4 constraint cc generated by default as identity;
create domain d_fail as int4 constraint cc check (values > 1) no inherit;
create domain d_fail as int4 constraint cc check (values > 1) deferrable;
-- Test domain input.

View File

@ -328,6 +328,7 @@ create function xfloat8in(cstring) returns xfloat8 immutable strict
language internal as 'int8in';
create function xfloat8out(xfloat8) returns cstring immutable strict
language internal as 'int8out';
create type xfloat8 (input = xfloat8in, output = xfloat8out, like = no_such_type);
create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8);
create cast (xfloat8 as float8) without function;
create cast (float8 as xfloat8) without function;

View File

@ -19,6 +19,7 @@ SELECT pg_get_serial_sequence('itest1', 'a');
CREATE TABLE itest4 (a int, b text);
ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error, requires NOT NULL
ALTER TABLE itest4 ALTER COLUMN a SET NOT NULL;
ALTER TABLE itest4 ALTER COLUMN c ADD GENERATED ALWAYS AS IDENTITY; -- error, column c does not exist
ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- ok
ALTER TABLE itest4 ALTER COLUMN a DROP NOT NULL; -- error, disallowed
ALTER TABLE itest4 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error, already set