add parser_errposition to some places in transformTableConstraint, transformColumnDefinition where v8 didn't.
From b49e1b74b5d479b854599c0f9d6b6df1e61aa67c Mon Sep 17 00:00:00 2001 From: jian he <jian.universal...@gmail.com> Date: Tue, 10 Dec 2024 22:36:45 +0800 Subject: [PATCH v9 2/2] Print out error position for number of DDL commands. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit
With this patch, the following functions will printout the error position for certain error cases. This can be particularly helpful when working with a sequence of DML commands, such as `create schema create schema_element`. It also makes it easier to quickly identify the relevant error area in a single DDL command For example, error positinion reporting is now supported for CREATE DOMAIN, ALTER TABLE ... ALTER COLUMN ..., ALTER TABLE ... OF ... and other. More cases can be found in regression tests. CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE"; ERROR: collations are not supported by type integer LINE 1: CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE"; ^ ATExecAlterColumnType code change maybe not necessary, since ATPrepAlterColumnType will catach most of the error. AlterType function changes no effect since struct AlterTypeStmt don't have location info. ATExecAlterColumnType, AlterType because of the above mentioned reason, don't have regress test. all other have tests. Author: Kirill Reshke <reshkekir...@gmail.com> Author: Jian He <jian.universal...@gmail.com> Reviewed-By: Michaël Paquier <mich...@paquier.xyz> Reviewed-By: Álvaro Herrera <alvhe...@alvh.no-ip.org> discussion: https://postgr.es/m/CALdSSPhqfvKbDwqJaY=yeepi_aq61gmmpw88i6zh7cmg_2z...@mail.gmail.com --- src/backend/commands/tablecmds.c | 43 +++++++++---- src/backend/commands/typecmds.c | 64 +++++++++++-------- src/backend/parser/parse_utilcmd.c | 21 ++++-- src/backend/tcop/utility.c | 4 +- src/include/commands/typecmds.h | 4 +- src/test/regress/expected/alter_table.out | 10 +++ .../regress/expected/collate.icu.utf8.out | 2 + .../regress/expected/collate.linux.utf8.out | 2 + src/test/regress/expected/collate.out | 2 + .../expected/collate.windows.win1252.out | 2 + src/test/regress/expected/constraints.out | 14 ++++ src/test/regress/expected/domain.out | 36 +++++++++++ src/test/regress/expected/float8.out | 2 + src/test/regress/expected/identity.out | 2 + src/test/regress/expected/typed_table.out | 4 ++ 15 files changed, 160 insertions(+), 52 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 6ccae4cb4a..efa38b1470 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -593,7 +593,8 @@ static void ATPrepAlterColumnType(List **wqueue, AlterTableUtilityContext *context); static bool ATColumnChangeRequiresRewrite(Node *expr, AttrNumber varattno); static ObjectAddress ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, - AlterTableCmd *cmd, LOCKMODE lockmode); + AlterTableCmd *cmd, LOCKMODE lockmode, + AlterTableUtilityContext *context); static void RememberAllDependentForRebuilding(AlteredTableInfo *tab, AlterTableType subtype, Relation rel, AttrNumber attnum, const char *colName); static void RememberConstraintForRebuilding(Oid conoid, AlteredTableInfo *tab); @@ -639,7 +640,9 @@ static ObjectAddress ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCK static ObjectAddress ATExecDropInherit(Relation rel, RangeVar *parent, LOCKMODE lockmode); static void drop_parent_dependency(Oid relid, Oid refclassid, Oid refobjid, DependencyType deptype); -static ObjectAddress ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode); +static ObjectAddress ATExecAddOf(Relation rel, const TypeName *ofTypename, + LOCKMODE lockmode, + AlterTableUtilityContext *context); static void ATExecDropOf(Relation rel, LOCKMODE lockmode); static void ATExecReplicaIdentity(Relation rel, ReplicaIdentityStmt *stmt, LOCKMODE lockmode); static void ATExecGenericOptions(Relation rel, List *options); @@ -5413,7 +5416,7 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, break; case AT_AlterColumnType: /* ALTER COLUMN TYPE */ /* parse transformation was done earlier */ - address = ATExecAlterColumnType(tab, rel, cmd, lockmode); + address = ATExecAlterColumnType(tab, rel, cmd, lockmode, context); break; case AT_AlterColumnGenericOptions: /* ALTER COLUMN OPTIONS */ address = @@ -5537,7 +5540,7 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, address = ATExecDropInherit(rel, (RangeVar *) cmd->def, lockmode); break; case AT_AddOf: - address = ATExecAddOf(rel, (TypeName *) cmd->def, lockmode); + address = ATExecAddOf(rel, (TypeName *) cmd->def, lockmode, context); break; case AT_DropOf: ATExecDropOf(rel, lockmode); @@ -13218,10 +13221,12 @@ ATPrepAlterColumnType(List **wqueue, AclResult aclresult; bool is_expr; + pstate->p_sourcetext = context->queryString; if (rel->rd_rel->reloftype && !recursing) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot alter column type of typed table"))); + errmsg("cannot alter column type of typed table"), + parser_errposition(pstate, def->location))); /* lookup the attribute so we can check inheritance status */ tuple = SearchSysCacheAttName(RelationGetRelid(rel), colName); @@ -13237,8 +13242,8 @@ ATPrepAlterColumnType(List **wqueue, if (attnum <= 0) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot alter system column \"%s\"", - colName))); + errmsg("cannot alter system column \"%s\"",colName), + parser_errposition(pstate, def->location))); /* * Cannot specify USING when altering type of a generated column, because @@ -13271,14 +13276,14 @@ ATPrepAlterColumnType(List **wqueue, colName, RelationGetRelationName(rel)))); /* Look up the target type */ - typenameTypeIdAndMod(NULL, typeName, &targettype, &targettypmod); + typenameTypeIdAndMod(pstate, typeName, &targettype, &targettypmod); aclresult = object_aclcheck(TypeRelationId, targettype, GetUserId(), ACL_USAGE); if (aclresult != ACLCHECK_OK) aclcheck_error_type(aclresult, targettype); /* And the collation */ - targetcollid = GetColumnDefCollation(NULL, def, targettype); + targetcollid = GetColumnDefCollation(pstate, def, targettype); /* make sure datatype is legal for a column */ CheckAttributeType(colName, targettype, targetcollid, @@ -13537,7 +13542,8 @@ ATColumnChangeRequiresRewrite(Node *expr, AttrNumber varattno) */ static ObjectAddress ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, - AlterTableCmd *cmd, LOCKMODE lockmode) + AlterTableCmd *cmd, LOCKMODE lockmode, + AlterTableUtilityContext *context) { char *colName = cmd->name; ColumnDef *def = (ColumnDef *) cmd->def; @@ -13558,6 +13564,10 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, SysScanDesc scan; HeapTuple depTup; ObjectAddress address; + ParseState *pstate; + + pstate = make_parsestate(NULL); + pstate->p_sourcetext = context->queryString; /* * Clear all the missing values if we're rewriting the table, since this @@ -13596,11 +13606,11 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, colName))); /* Look up the target type (should not fail, since prep found it) */ - typeTuple = typenameType(NULL, typeName, &targettypmod); + typeTuple = typenameType(pstate, typeName, &targettypmod); tform = (Form_pg_type) GETSTRUCT(typeTuple); targettype = tform->oid; /* And the collation */ - targetcollid = GetColumnDefCollation(NULL, def, targettype); + targetcollid = GetColumnDefCollation(pstate, def, targettype); /* * If there is a default expression for the column, get it and ensure we @@ -16976,7 +16986,8 @@ drop_parent_dependency(Oid relid, Oid refclassid, Oid refobjid, * The address of the type is returned. */ static ObjectAddress -ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode) +ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode, + AlterTableUtilityContext *context) { Oid relid = RelationGetRelid(rel); Type typetuple; @@ -16993,9 +17004,13 @@ ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode) ObjectAddress tableobj, typeobj; HeapTuple classtuple; + ParseState *pstate; /* Validate the type. */ - typetuple = typenameType(NULL, ofTypename, NULL); + pstate = make_parsestate(NULL); + pstate->p_sourcetext = context->queryString; + + typetuple = typenameType(pstate, ofTypename, NULL); check_of_type(typetuple); typeform = (Form_pg_type) GETSTRUCT(typetuple); typeid = typeform->oid; diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index da591c0922..0a7cf7fd1c 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -348,7 +348,7 @@ DefineType(ParseState *pstate, List *names, List *parameters) Type likeType; Form_pg_type likeForm; - likeType = typenameType(NULL, defGetTypeName(likeTypeEl), NULL); + likeType = typenameType(pstate, defGetTypeName(likeTypeEl), NULL); likeForm = (Form_pg_type) GETSTRUCT(likeType); internalLength = likeForm->typlen; byValue = likeForm->typbyval; @@ -694,7 +694,7 @@ RemoveTypeById(Oid typeOid) * Registers a new domain. */ ObjectAddress -DefineDomain(CreateDomainStmt *stmt) +DefineDomain(ParseState *pstate, CreateDomainStmt *stmt) { char *domainName; char *domainArrayName; @@ -761,7 +761,7 @@ DefineDomain(CreateDomainStmt *stmt) /* * Look up the base type. */ - typeTup = typenameType(NULL, stmt->typeName, &basetypeMod); + typeTup = typenameType(pstate, stmt->typeName, &basetypeMod); baseType = (Form_pg_type) GETSTRUCT(typeTup); basetypeoid = baseType->oid; @@ -783,7 +783,8 @@ DefineDomain(CreateDomainStmt *stmt) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("\"%s\" is not a valid base type for a domain", - TypeNameToString(stmt->typeName)))); + TypeNameToString(stmt->typeName)), + parser_errposition(pstate, stmt->typeName->location))); aclresult = object_aclcheck(TypeRelationId, basetypeoid, GetUserId(), ACL_USAGE); if (aclresult != ACLCHECK_OK) @@ -809,7 +810,8 @@ DefineDomain(CreateDomainStmt *stmt) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("collations are not supported by type %s", - format_type_be(basetypeoid)))); + format_type_be(basetypeoid)), + parser_errposition(pstate, stmt->typeName->location))); /* passed by value */ byValue = baseType->typbyval; @@ -879,18 +881,15 @@ DefineDomain(CreateDomainStmt *stmt) */ if (saw_default) ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("multiple default expressions"))); + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("multiple default expressions"), + parser_errposition(pstate, constr->location)); saw_default = true; if (constr->raw_expr) { - ParseState *pstate; Node *defaultExpr; - /* Create a dummy ParseState for transformExpr */ - pstate = make_parsestate(NULL); - /* * Cook the constr->raw_expr into an expression. Note: * name is strictly for error message @@ -942,12 +941,14 @@ DefineDomain(CreateDomainStmt *stmt) case CONSTR_NOTNULL: if (nullDefined && !typNotNull) ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting NULL/NOT NULL constraints"))); + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("conflicting NULL/NOT NULL constraints"), + parser_errposition(pstate, constr->location)); if (constr->is_no_inherit) ereport(ERROR, errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("not-null constraints for domains cannot be marked NO INHERIT")); + errmsg("not-null constraints for domains cannot be marked NO INHERIT"), + parser_errposition(pstate, constr->location)); typNotNull = true; nullDefined = true; break; @@ -955,8 +956,9 @@ DefineDomain(CreateDomainStmt *stmt) case CONSTR_NULL: if (nullDefined && typNotNull) ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting NULL/NOT NULL constraints"))); + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("conflicting NULL/NOT NULL constraints"), + parser_errposition(pstate, constr->location)); typNotNull = false; nullDefined = true; break; @@ -971,8 +973,10 @@ DefineDomain(CreateDomainStmt *stmt) */ if (constr->is_no_inherit) ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("check constraints for domains cannot be marked NO INHERIT"))); + errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("check constraints for domains cannot be marked NO INHERIT"), + parser_errposition(pstate, constr->location)); + break; /* @@ -980,26 +984,30 @@ DefineDomain(CreateDomainStmt *stmt) */ case CONSTR_UNIQUE: ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("unique constraints not possible for domains"))); + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unique constraints not possible for domains"), + parser_errposition(pstate, constr->location)); break; case CONSTR_PRIMARY: ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("primary key constraints not possible for domains"))); + errmsg("primary key constraints not possible for domains"), + parser_errposition(pstate, constr->location))); break; case CONSTR_EXCLUSION: ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("exclusion constraints not possible for domains"))); + errmsg("exclusion constraints not possible for domains"), + parser_errposition(pstate, constr->location))); break; case CONSTR_FOREIGN: ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("foreign key constraints not possible for domains"))); + errmsg("foreign key constraints not possible for domains"), + parser_errposition(pstate, constr->location))); break; case CONSTR_ATTR_DEFERRABLE: @@ -1008,14 +1016,16 @@ DefineDomain(CreateDomainStmt *stmt) case CONSTR_ATTR_IMMEDIATE: ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("specifying constraint deferrability not supported for domains"))); + errmsg("specifying constraint deferrability not supported for domains"), + parser_errposition(pstate, constr->location))); break; case CONSTR_GENERATED: case CONSTR_IDENTITY: ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("specifying GENERATED not supported for domains"))); + errmsg("specifying GENERATED not supported for domains"), + parser_errposition(pstate, constr->location))); break; /* no default, to let compiler warn about missing case */ @@ -4319,7 +4329,7 @@ AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, * adding new flexibility. */ ObjectAddress -AlterType(AlterTypeStmt *stmt) +AlterType(ParseState *pstate, AlterTypeStmt *stmt) { ObjectAddress address; Relation catalog; @@ -4335,7 +4345,7 @@ AlterType(AlterTypeStmt *stmt) /* Make a TypeName so we can use standard type lookup machinery */ typename = makeTypeNameFromNameList(stmt->typeName); - tup = typenameType(NULL, typename, NULL); + tup = typenameType(pstate, typename, NULL); typeOid = typeTypeId(tup); typForm = (Form_pg_type) GETSTRUCT(tup); diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 0f324ee4e3..7223911bf1 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -756,7 +756,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column) if (cxt->ispartitioned && constraint->is_no_inherit) ereport(ERROR, errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("not-null constraints on partitioned tables cannot be NO INHERIT")); + errmsg("not-null constraints on partitioned tables cannot be NO INHERIT"), + parser_errposition(cxt->pstate, constraint->location)); /* Disallow conflicting [NOT] NULL markings */ if (saw_nullable && !column->is_not_null) @@ -771,7 +772,9 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column) ereport(ERROR, errcode(ERRCODE_SYNTAX_ERROR), errmsg("conflicting NO INHERIT declarations for not-null constraints on column \"%s\"", - column->colname)); + column->colname), + parser_errposition(cxt->pstate, constraint->location)); + /* * If this is the first time we see this column being marked @@ -806,7 +809,8 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column) ereport(ERROR, errcode(ERRCODE_SYNTAX_ERROR), errmsg("conflicting NO INHERIT declarations for not-null constraints on column \"%s\"", - column->colname)); + column->colname), + parser_errposition(cxt->pstate, constraint->location)); if (!notnull_constraint->conname && constraint->conname) notnull_constraint->conname = constraint->conname; @@ -1072,7 +1076,8 @@ transformTableConstraint(CreateStmtContext *cxt, Constraint *constraint) if (cxt->ispartitioned && constraint->is_no_inherit) ereport(ERROR, errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("not-null constraints on partitioned tables cannot be NO INHERIT")); + errmsg("not-null constraints on partitioned tables cannot be NO INHERIT"), + parser_errposition(cxt->pstate, constraint->location)); cxt->nnconstraints = lappend(cxt->nnconstraints, constraint); break; @@ -1615,7 +1620,7 @@ transformOfType(CreateStmtContext *cxt, TypeName *ofTypename) Assert(ofTypename); - tuple = typenameType(NULL, ofTypename, NULL); + tuple = typenameType(cxt->pstate, ofTypename, NULL); check_of_type(tuple); ofTypeId = ((Form_pg_type) GETSTRUCT(tuple))->oid; ofTypename->typeOid = ofTypeId; /* cached for later */ @@ -3627,7 +3632,8 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, ereport(ERROR, (errcode(ERRCODE_UNDEFINED_COLUMN), errmsg("column \"%s\" of relation \"%s\" does not exist", - cmd->name, RelationGetRelationName(rel)))); + cmd->name, RelationGetRelationName(rel)), + parser_errposition(pstate, def->location))); if (attnum > 0 && TupleDescAttr(tupdesc, attnum - 1)->attidentity) @@ -3667,7 +3673,8 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, ereport(ERROR, (errcode(ERRCODE_UNDEFINED_COLUMN), errmsg("column \"%s\" of relation \"%s\" does not exist", - cmd->name, RelationGetRelationName(rel)))); + cmd->name, RelationGetRelationName(rel)), + parser_errposition(pstate, def->location))); generateSerialExtraStmts(&cxt, newdef, get_atttype(relid, attnum), diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index f28bf37105..aa24283eff 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1712,7 +1712,7 @@ ProcessUtilitySlow(ParseState *pstate, break; case T_CreateDomainStmt: - address = DefineDomain((CreateDomainStmt *) parsetree); + address = DefineDomain(pstate, (CreateDomainStmt *) parsetree); break; case T_CreateConversionStmt: @@ -1801,7 +1801,7 @@ ProcessUtilitySlow(ParseState *pstate, break; case T_AlterTypeStmt: - address = AlterType((AlterTypeStmt *) parsetree); + address = AlterType(pstate, (AlterTypeStmt *) parsetree); break; case T_CommentStmt: diff --git a/src/include/commands/typecmds.h b/src/include/commands/typecmds.h index e1b02927c4..6e493b896c 100644 --- a/src/include/commands/typecmds.h +++ b/src/include/commands/typecmds.h @@ -23,7 +23,7 @@ extern ObjectAddress DefineType(ParseState *pstate, List *names, List *parameters); extern void RemoveTypeById(Oid typeOid); -extern ObjectAddress DefineDomain(CreateDomainStmt *stmt); +extern ObjectAddress DefineDomain(ParseState *pstate, CreateDomainStmt *stmt); extern ObjectAddress DefineEnum(CreateEnumStmt *stmt); extern ObjectAddress DefineRange(ParseState *pstate, CreateRangeStmt *stmt); extern ObjectAddress AlterEnum(AlterEnumStmt *stmt); @@ -58,6 +58,6 @@ extern Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool errorOnTableType, ObjectAddresses *objsMoved); -extern ObjectAddress AlterType(AlterTypeStmt *stmt); +extern ObjectAddress AlterType(ParseState *pstate, AlterTypeStmt *stmt); #endif /* TYPECMDS_H */ diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 17802f02e8..ff64a23a5f 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3114,6 +3114,8 @@ DROP TYPE test_type1; CREATE TYPE test_type2 AS (a int, b text); CREATE TABLE test_tbl2 OF xx; ERROR: type "xx" does not exist +LINE 1: CREATE TABLE test_tbl2 OF xx; + ^ CREATE TABLE test_tbl2 OF test_type2; CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2); \d test_type2 @@ -3267,6 +3269,8 @@ CREATE TABLE tt7 (x int, q text, y numeric(8,2)); ALTER TABLE tt7 DROP q; -- OK ALTER TABLE tt0 OF tt_t_noexist; ERROR: type "tt_t_noexist" does not exist +LINE 1: ALTER TABLE tt0 OF tt_t_noexist; + ^ ALTER TABLE tt0 OF tt_t0; ALTER TABLE tt1 OF tt_t0; ERROR: table "tt1" has different type for column "y" @@ -3420,10 +3424,16 @@ ALTER TABLE comment_test ALTER COLUMN positive_col SET DATA TYPE bigint; --test error report position ALTER TABLE comment_test ALTER COLUMN xmin SET DATA TYPE x; ERROR: cannot alter system column "xmin" +LINE 1: ALTER TABLE comment_test ALTER COLUMN xmin SET DATA TYPE x; + ^ ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE x; ERROR: type "x" does not exist +LINE 1: ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE x; + ^ ALTER TABLE comment_test ALTER COLUMN id SET DATA TYPE int collate "C"; ERROR: collations are not supported by type integer +LINE 1: ...LE 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; comment diff --git a/src/test/regress/expected/collate.icu.utf8.out b/src/test/regress/expected/collate.icu.utf8.out index 6cbadafcfb..d4f327636f 100644 --- a/src/test/regress/expected/collate.icu.utf8.out +++ b/src/test/regress/expected/collate.icu.utf8.out @@ -120,6 +120,8 @@ LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "e... CREATE DOMAIN testdomain_sv AS text COLLATE "sv-x-icu"; CREATE DOMAIN testdomain_i AS int COLLATE "sv-x-icu"; -- fails ERROR: collations are not supported by type integer +LINE 1: CREATE DOMAIN testdomain_i AS int COLLATE "sv-x-icu"; + ^ CREATE TABLE collate_test4 ( a int, b testdomain_sv diff --git a/src/test/regress/expected/collate.linux.utf8.out b/src/test/regress/expected/collate.linux.utf8.out index 01664f7c1b..fbaab7cdf8 100644 --- a/src/test/regress/expected/collate.linux.utf8.out +++ b/src/test/regress/expected/collate.linux.utf8.out @@ -122,6 +122,8 @@ LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "e... CREATE DOMAIN testdomain_sv AS text COLLATE "sv_SE"; CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE"; -- fails ERROR: collations are not supported by type integer +LINE 1: CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE"; + ^ CREATE TABLE collate_test4 ( a int, b testdomain_sv diff --git a/src/test/regress/expected/collate.out b/src/test/regress/expected/collate.out index 593a622637..bf72908fbd 100644 --- a/src/test/regress/expected/collate.out +++ b/src/test/regress/expected/collate.out @@ -73,6 +73,8 @@ LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "P... CREATE DOMAIN testdomain_p AS text COLLATE "POSIX"; CREATE DOMAIN testdomain_i AS int COLLATE "POSIX"; -- fail ERROR: collations are not supported by type integer +LINE 1: CREATE DOMAIN testdomain_i AS int COLLATE "POSIX"; + ^ CREATE TABLE collate_test4 ( a int, b testdomain_p diff --git a/src/test/regress/expected/collate.windows.win1252.out b/src/test/regress/expected/collate.windows.win1252.out index 31f794988b..4644f56b31 100644 --- a/src/test/regress/expected/collate.windows.win1252.out +++ b/src/test/regress/expected/collate.windows.win1252.out @@ -124,6 +124,8 @@ LINE 1: ...* FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "e... CREATE DOMAIN testdomain_sv AS text COLLATE "sv_SE"; CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE"; -- fails ERROR: collations are not supported by type integer +LINE 1: CREATE DOMAIN testdomain_i AS int COLLATE "sv_SE"; + ^ CREATE TABLE collate_test4 ( a int, b testdomain_sv diff --git a/src/test/regress/expected/constraints.out b/src/test/regress/expected/constraints.out index 71200c90ed..ff3b710468 100644 --- a/src/test/regress/expected/constraints.out +++ b/src/test/regress/expected/constraints.out @@ -925,6 +925,8 @@ create table notnull_tbl_fail (a serial constraint foo not null constraint bar n ERROR: conflicting not-null constraint names "foo" and "bar" create table notnull_tbl_fail (a serial constraint foo not null no inherit constraint foo not null); ERROR: conflicting NO INHERIT declarations for not-null constraints on column "a" +LINE 1: create table notnull_tbl_fail (a serial constraint foo not n... + ^ create table notnull_tbl_fail (a int constraint foo not null, constraint foo not null a no inherit); ERROR: conflicting NO INHERIT declaration for not-null constraint on column "a" create table notnull_tbl_fail (a serial constraint foo not null, constraint bar not null a); @@ -935,12 +937,18 @@ create table notnull_tbl_fail (a serial, constraint foo not null a no inherit); ERROR: conflicting NO INHERIT declaration for not-null constraint on column "a" create table notnull_tbl_fail (a serial not null no inherit); ERROR: conflicting NO INHERIT declarations for not-null constraints on column "a" +LINE 1: create table notnull_tbl_fail (a serial not null no inherit)... + ^ create table notnull_tbl_fail (like notnull_tbl1, constraint foo2 not null a); ERROR: conflicting not-null constraint names "foo" and "foo2" create table notnull_tbl_fail (a int primary key constraint foo not null no inherit); ERROR: conflicting NO INHERIT declarations for not-null constraints on column "a" +LINE 1: create table notnull_tbl_fail (a int primary key constraint ... + ^ create table notnull_tbl_fail (a int not null no inherit primary key); ERROR: conflicting NO INHERIT declarations for not-null constraints on column "a" +LINE 1: create table notnull_tbl_fail (a int not null no inherit pri... + ^ create table notnull_tbl_fail (a int primary key, not null a no inherit); ERROR: conflicting NO INHERIT declaration for not-null constraint on column "a" create table notnull_tbl_fail (a int, primary key(a), not null a no inherit); @@ -949,6 +957,8 @@ create table notnull_tbl_fail (a int generated by default as identity, constrain ERROR: conflicting NO INHERIT declaration for not-null constraint on column "a" create table notnull_tbl_fail (a int generated by default as identity not null no inherit); ERROR: conflicting NO INHERIT declarations for not-null constraints on column "a" +LINE 1: ..._tbl_fail (a int generated by default as identity not null n... + ^ drop table notnull_tbl1; -- NOT NULL NO INHERIT CREATE TABLE ATACC1 (a int, NOT NULL a NO INHERIT); @@ -998,8 +1008,12 @@ DROP TABLE ATACC1, ATACC2, ATACC3; -- NOT NULL NO INHERIT is not possible on partitioned tables CREATE TABLE ATACC1 (a int NOT NULL NO INHERIT) PARTITION BY LIST (a); ERROR: not-null constraints on partitioned tables cannot be NO INHERIT +LINE 1: CREATE TABLE ATACC1 (a int NOT NULL NO INHERIT) PARTITION BY... + ^ CREATE TABLE ATACC1 (a int, NOT NULL a NO INHERIT) PARTITION BY LIST (a); ERROR: not-null constraints on partitioned tables cannot be NO INHERIT +LINE 1: CREATE TABLE ATACC1 (a int, NOT NULL a NO INHERIT) PARTITION... + ^ -- it's not possible to override a no-inherit constraint with an inheritable one CREATE TABLE ATACC2 (a int, CONSTRAINT a_is_not_null NOT NULL a NO INHERIT); CREATE TABLE ATACC1 (a int); diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index c5cc41cacd..222bb54c75 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -19,40 +19,76 @@ ERROR: type "domaindroptest" does not exist -- create domain error case. create domain d_fail as x; ERROR: type "x" does not exist +LINE 1: create domain d_fail as x; + ^ create domain d_fail as int constraint cc REFERENCES this_table_not_exists(i); ERROR: foreign key constraints not possible for domains +LINE 1: create domain d_fail as int constraint cc REFERENCES this_ta... + ^ create domain d_fail as int4 not null no inherit; ERROR: not-null constraints for domains cannot be marked NO INHERIT +LINE 1: create domain d_fail as int4 not null no inherit; + ^ create domain d_fail as int4 not null null; ERROR: conflicting NULL/NOT NULL constraints +LINE 1: create domain d_fail as int4 not null null; + ^ create domain d_fail as int4 not null default 3 default 3; ERROR: multiple default expressions +LINE 1: create domain d_fail as int4 not null default 3 default 3; + ^ create domain d_fail int4 DEFAULT 3 + 'h'; ERROR: invalid input syntax for type integer: "h" +LINE 1: create domain d_fail int4 DEFAULT 3 + 'h'; + ^ create domain d_fail int4 collate "C"; ERROR: collations are not supported by type integer +LINE 1: create domain d_fail int4 collate "C"; + ^ create domain d_fail as anyelement; ERROR: "anyelement" is not a valid base type for a domain +LINE 1: create domain d_fail as anyelement; + ^ create domain d_fail as int4 unique; ERROR: unique constraints not possible for domains +LINE 1: create domain d_fail as int4 unique; + ^ create domain d_fail as int4 PRIMARY key; ERROR: primary key constraints not possible for domains +LINE 1: create domain d_fail as int4 PRIMARY key; + ^ create domain d_fail as int4 constraint cc generated by default as identity; ERROR: specifying GENERATED not supported for domains +LINE 1: create domain d_fail as int4 constraint cc generated by defa... + ^ create domain d_fail as int4 constraint cc generated always as (2) stored; ERROR: specifying GENERATED not supported for domains +LINE 1: create domain d_fail as int4 constraint cc generated always ... + ^ create domain d_fail as int4 constraint cc check(values > 1) no inherit; ERROR: check constraints for domains cannot be marked NO INHERIT +LINE 1: create domain d_fail as int4 constraint cc check(values > 1)... + ^ create domain d_fail as int4 constraint cc check(values > 1) deferrable; ERROR: specifying constraint deferrability not supported for domains +LINE 1: ...in d_fail as int4 constraint cc check(values > 1) deferrable... + ^ create domain d_fail as int4 constraint cc check(values > 1) not deferrable; ERROR: specifying constraint deferrability not supported for domains +LINE 1: ...in d_fail as int4 constraint cc check(values > 1) not deferr... + ^ create domain d_fail as int4 constraint cc check (value > 1) initially deferred; ERROR: specifying constraint deferrability not supported for domains +LINE 1: ...in d_fail as int4 constraint cc check (value > 1) initially ... + ^ create domain d_fail as int4 constraint cc check(values > 1) initially immediate; ERROR: specifying constraint deferrability not supported for domains +LINE 1: ...in d_fail as int4 constraint cc check(values > 1) initially ... + ^ create domain d_fail as int4 constraint cc check(values > 1) deferrable not deferrable ; ERROR: specifying constraint deferrability not supported for domains +LINE 1: ...in d_fail as int4 constraint cc check(values > 1) deferrable... + ^ -- Test domain input. -- Note: the point of checking both INSERT and COPY FROM is that INSERT -- exercises CoerceToDomain while COPY exercises domain_in. diff --git a/src/test/regress/expected/float8.out b/src/test/regress/expected/float8.out index 1befc47185..3e49b5a18e 100644 --- a/src/test/regress/expected/float8.out +++ b/src/test/regress/expected/float8.out @@ -1027,6 +1027,8 @@ LINE 1: create function xfloat8out(xfloat8) returns cstring immutabl... --should fail, since type x does not exists. create type xfloat8 (input = xfloat8in, output = xfloat8out, like = x); ERROR: type "x" does not exist +LINE 1: ... xfloat8 (input = xfloat8in, output = xfloat8out, like = x); + ^ create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8); create cast (xfloat8 as float8) without function; create cast (float8 as xfloat8) without function; diff --git a/src/test/regress/expected/identity.out b/src/test/regress/expected/identity.out index 0398a19484..0b370235ea 100644 --- a/src/test/regress/expected/identity.out +++ b/src/test/regress/expected/identity.out @@ -45,6 +45,8 @@ ERROR: column "a" of relation "itest4" must be declared NOT NULL before identit 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 +LINE 1: ALTER TABLE itest4 ALTER COLUMN c ADD GENERATED ALWAYS AS ID... + ^ 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 diff --git a/src/test/regress/expected/typed_table.out b/src/test/regress/expected/typed_table.out index b6fbda3f21..885f085e15 100644 --- a/src/test/regress/expected/typed_table.out +++ b/src/test/regress/expected/typed_table.out @@ -1,5 +1,7 @@ CREATE TABLE ttable1 OF nothing; ERROR: type "nothing" does not exist +LINE 1: CREATE TABLE ttable1 OF nothing; + ^ CREATE TYPE person_type AS (id int, name text); CREATE TABLE persons OF person_type; CREATE TABLE IF NOT EXISTS persons OF person_type; @@ -36,6 +38,8 @@ ALTER TABLE persons RENAME COLUMN id TO num; ERROR: cannot rename column of typed table ALTER TABLE persons ALTER COLUMN name TYPE varchar; ERROR: cannot alter column type of typed table +LINE 1: ALTER TABLE persons ALTER COLUMN name TYPE varchar; + ^ CREATE TABLE stuff (id int); ALTER TABLE persons INHERIT stuff; ERROR: cannot change inheritance of typed table -- 2.34.1
From 40754ca1c6d4cde17f7ae0f77500c9cd04d5107e Mon Sep 17 00:00:00 2001 From: reshke kirill <reshke@double.cloud> Date: Tue, 10 Dec 2024 08:39:50 +0000 Subject: [PATCH v9 1/2] Add more regression tests to various DDL patterns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The main goal of this patch is to increase test coverage of CREATE DOMAIN, ALTER TABLE ... etc DDL commands. This is prelimitary patch for enhansing error position reporting feature. Author: Jian He <jian.universal...@gmail.com> Author: Kirill Reshke <reshkekir...@gmail.com> Reviewed-By: Michaël Paquier <mich...@paquier.xyz> Reviewed-By: Álvaro Herrera <alvhe...@alvh.no-ip.org> discussion: https://postgr.es/m/CALdSSPhqfvKbDwqJaY=yeepi_aq61gmmpw88i6zh7cmg_2z...@mail.gmail.com --- src/test/regress/expected/alter_table.out | 11 +++++++ src/test/regress/expected/domain.out | 38 +++++++++++++++++++++++ src/test/regress/expected/float8.out | 3 ++ src/test/regress/expected/identity.out | 2 ++ src/test/regress/sql/alter_table.sql | 7 +++++ src/test/regress/sql/domain.sql | 21 +++++++++++++ src/test/regress/sql/float8.sql | 2 ++ src/test/regress/sql/identity.sql | 1 + 8 files changed, 85 insertions(+) diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 2212c8dbb5..17802f02e8 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3112,6 +3112,8 @@ ERROR: cannot alter type "test_type1" because column "test_tbl1_idx.row" uses i DROP TABLE test_tbl1; DROP TYPE test_type1; CREATE TYPE test_type2 AS (a int, b text); +CREATE TABLE test_tbl2 OF xx; +ERROR: type "xx" does not exist CREATE TABLE test_tbl2 OF test_type2; CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2); \d test_type2 @@ -3263,6 +3265,8 @@ CREATE TABLE tt5 (x int, y numeric(8,2), z int); -- too few columns CREATE TABLE tt6 () INHERITS (tt0); -- can't have a parent CREATE TABLE tt7 (x int, q text, y numeric(8,2)); ALTER TABLE tt7 DROP q; -- OK +ALTER TABLE tt0 OF tt_t_noexist; +ERROR: type "tt_t_noexist" does not exist ALTER TABLE tt0 OF tt_t0; ALTER TABLE tt1 OF tt_t0; ERROR: table "tt1" has different type for column "y" @@ -3413,6 +3417,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; +--test error report position +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 diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index 42b6559f9c..c5cc41cacd 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -15,6 +15,44 @@ NOTICE: drop cascades to type dependenttypetest -- this should fail because already gone drop domain domaindroptest cascade; ERROR: type "domaindroptest" does not exist +-- Test syntax. +-- create domain error case. +create domain d_fail as x; +ERROR: type "x" 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 generated always as (2) stored; +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 +create domain d_fail as int4 constraint cc check(values > 1) not deferrable; +ERROR: specifying constraint deferrability not supported for domains +create domain d_fail as int4 constraint cc check (value > 1) initially deferred; +ERROR: specifying constraint deferrability not supported for domains +create domain d_fail as int4 constraint cc check(values > 1) initially immediate; +ERROR: specifying constraint deferrability not supported for domains +create domain d_fail as int4 constraint cc check(values > 1) deferrable not 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. diff --git a/src/test/regress/expected/float8.out b/src/test/regress/expected/float8.out index de56998f5c..1befc47185 100644 --- a/src/test/regress/expected/float8.out +++ b/src/test/regress/expected/float8.out @@ -1024,6 +1024,9 @@ 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... ^ +--should fail, since type x does not exists. +create type xfloat8 (input = xfloat8in, output = xfloat8out, like = x); +ERROR: type "x" 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; diff --git a/src/test/regress/expected/identity.out b/src/test/regress/expected/identity.out index 2a2b777c89..0398a19484 100644 --- a/src/test/regress/expected/identity.out +++ b/src/test/regress/expected/identity.out @@ -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 diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 637e3dac38..67c2f89a47 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -1985,6 +1985,7 @@ DROP TABLE test_tbl1; DROP TYPE test_type1; CREATE TYPE test_type2 AS (a int, b text); +CREATE TABLE test_tbl2 OF xx; CREATE TABLE test_tbl2 OF test_type2; CREATE TABLE test_tbl2_subclass () INHERITS (test_tbl2); \d test_type2 @@ -2048,6 +2049,7 @@ CREATE TABLE tt6 () INHERITS (tt0); -- can't have a parent CREATE TABLE tt7 (x int, q text, y numeric(8,2)); ALTER TABLE tt7 DROP q; -- OK +ALTER TABLE tt0 OF tt_t_noexist; ALTER TABLE tt0 OF tt_t0; ALTER TABLE tt1 OF tt_t0; ALTER TABLE tt2 OF tt_t0; @@ -2145,6 +2147,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; +--test error report position +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; diff --git a/src/test/regress/sql/domain.sql b/src/test/regress/sql/domain.sql index ee07b03174..5faa56b31e 100644 --- a/src/test/regress/sql/domain.sql +++ b/src/test/regress/sql/domain.sql @@ -16,6 +16,27 @@ drop domain domaindroptest cascade; -- this should fail because already gone drop domain domaindroptest cascade; +-- Test syntax. +-- create domain error case. +create domain d_fail as x; +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 generated always as (2) stored; +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; +create domain d_fail as int4 constraint cc check(values > 1) not deferrable; +create domain d_fail as int4 constraint cc check (value > 1) initially deferred; +create domain d_fail as int4 constraint cc check(values > 1) initially immediate; +create domain d_fail as int4 constraint cc check(values > 1) deferrable not deferrable ; -- Test domain input. diff --git a/src/test/regress/sql/float8.sql b/src/test/regress/sql/float8.sql index 98e9926c9e..d78cbf5f60 100644 --- a/src/test/regress/sql/float8.sql +++ b/src/test/regress/sql/float8.sql @@ -328,6 +328,8 @@ create function xfloat8in(cstring) returns xfloat8 immutable strict language internal as 'int8in'; create function xfloat8out(xfloat8) returns cstring immutable strict language internal as 'int8out'; +--should fail, since type x does not exists. +create type xfloat8 (input = xfloat8in, output = xfloat8out, like = x); create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8); create cast (xfloat8 as float8) without function; create cast (float8 as xfloat8) without function; diff --git a/src/test/regress/sql/identity.sql b/src/test/regress/sql/identity.sql index cb0e05a2f1..45992a3d89 100644 --- a/src/test/regress/sql/identity.sql +++ b/src/test/regress/sql/identity.sql @@ -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 -- 2.34.1