diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index 39cc1debc1..59459fab0d 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -7,7 +7,7 @@ * Copyright (c) 1996-2009, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.110 2009/12/21 01:34:11 rhaas Exp $ + * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.111 2009/12/22 23:54:17 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -627,6 +627,22 @@ CommentAttribute(List *qualname, char *comment) aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS, RelationGetRelationName(relation)); + /* + * Allow comments only on columns of tables, views, and composite types + * (which are the only relkinds for which pg_dump will dump per-column + * comments). In particular we wish to disallow comments on index + * columns, because the naming of an index's columns may change across + * PG versions, so dumping per-column comments could create reload + * failures. + */ + if (relation->rd_rel->relkind != RELKIND_RELATION && + relation->rd_rel->relkind != RELKIND_VIEW && + relation->rd_rel->relkind != RELKIND_COMPOSITE_TYPE) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a table, view, or composite type", + RelationGetRelationName(relation)))); + /* Now, fetch the attribute number from the system cache */ attnum = get_attnum(RelationGetRelid(relation), attrname); diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 89d81bff62..75c8d863dc 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -19,7 +19,7 @@ * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.33 2009/12/20 18:28:14 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.34 2009/12/22 23:54:17 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -745,14 +745,12 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, /* Copy comment on index */ if (inhRelation->options & CREATE_TABLE_LIKE_COMMENTS) { - Form_pg_attribute *attrs; - CommentStmt *stmt; - int colno; - comment = GetComment(parent_index_oid, RelationRelationId, 0); - + if (comment != NULL) { + CommentStmt *stmt; + /* * We have to assign the index a name now, so that we * can reference it in CommentStmt. @@ -771,41 +769,6 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, cxt->alist = lappend(cxt->alist, stmt); } - - /* Copy comments on index's columns */ - attrs = RelationGetDescr(parent_index)->attrs; - for (colno = 1; - colno <= RelationGetNumberOfAttributes(parent_index); - colno++) - { - char *attname; - - comment = GetComment(parent_index_oid, RelationRelationId, - colno); - if (comment == NULL) - continue; - - /* - * We have to assign the index a name now, so that we - * can reference it in CommentStmt. - */ - if (index_stmt->idxname == NULL) - index_stmt->idxname = chooseIndexName(cxt->relation, - index_stmt); - - attname = NameStr(attrs[colno - 1]->attname); - - stmt = makeNode(CommentStmt); - stmt->objtype = OBJECT_COLUMN; - stmt->objname = - list_make3(makeString(cxt->relation->schemaname), - makeString(index_stmt->idxname), - makeString(attname)); - stmt->objargs = NIL; - stmt->comment = comment; - - cxt->alist = lappend(cxt->alist, stmt); - } } /* Save it in the inh_indexes list for the time being */ @@ -832,12 +795,12 @@ static char * chooseIndexName(const RangeVar *relation, IndexStmt *index_stmt) { Oid namespaceId; - + namespaceId = RangeVarGetCreationNamespace(relation); if (index_stmt->primary) { /* no need for column list with pkey */ - return ChooseRelationName(relation->relname, NULL, + return ChooseRelationName(relation->relname, NULL, "pkey", namespaceId); } else if (index_stmt->excludeOpNames != NIL) diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out index aebadd2c9c..aa1eb4a4dd 100644 --- a/src/test/regress/expected/inherit.out +++ b/src/test/regress/expected/inherit.out @@ -931,8 +931,6 @@ COMMENT ON COLUMN t1.b IS 'B'; COMMENT ON CONSTRAINT t1_a_check ON t1 IS 't1_a_check'; COMMENT ON INDEX t1_pkey IS 'index pkey'; COMMENT ON INDEX t1_b_key IS 'index b_key'; -COMMENT ON COLUMN t1_pkey.a IS 'index column pkey.a'; -COMMENT ON COLUMN t1_fnidx.pg_expression_1 IS 'index column fnidx'; ALTER TABLE t1 ALTER COLUMN a SET STORAGE MAIN; CREATE TABLE t2 (c text); ALTER TABLE t2 ALTER COLUMN c SET STORAGE EXTERNAL; @@ -1040,13 +1038,11 @@ Check constraints: Has OIDs: no SELECT c.relname, objsubid, description FROM pg_description, pg_index i, pg_class c WHERE classoid = 'pg_class'::regclass AND objoid = i.indexrelid AND c.oid = i.indexrelid AND i.indrelid = 't_all'::regclass ORDER BY c.relname, objsubid; - relname | objsubid | description --------------+----------+--------------------- + relname | objsubid | description +-------------+----------+------------- t_all_b_key | 0 | index b_key - t_all_key | 1 | index column fnidx t_all_pkey | 0 | index pkey - t_all_pkey | 1 | index column pkey.a -(4 rows) +(2 rows) CREATE TABLE inh_error1 () INHERITS (t1, t4); NOTICE: merging multiple inherited definitions of column "a" diff --git a/src/test/regress/sql/inherit.sql b/src/test/regress/sql/inherit.sql index 6f1a492676..192e8604d6 100644 --- a/src/test/regress/sql/inherit.sql +++ b/src/test/regress/sql/inherit.sql @@ -297,8 +297,6 @@ COMMENT ON COLUMN t1.b IS 'B'; COMMENT ON CONSTRAINT t1_a_check ON t1 IS 't1_a_check'; COMMENT ON INDEX t1_pkey IS 'index pkey'; COMMENT ON INDEX t1_b_key IS 'index b_key'; -COMMENT ON COLUMN t1_pkey.a IS 'index column pkey.a'; -COMMENT ON COLUMN t1_fnidx.pg_expression_1 IS 'index column fnidx'; ALTER TABLE t1 ALTER COLUMN a SET STORAGE MAIN; CREATE TABLE t2 (c text);