aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/comment.c18
-rw-r--r--src/backend/parser/parse_utilcmd.c49
-rw-r--r--src/test/regress/expected/inherit.out10
-rw-r--r--src/test/regress/sql/inherit.sql2
4 files changed, 26 insertions, 53 deletions
diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c
index 39cc1debc1e..59459fab0d5 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 89d81bff624..75c8d863dcd 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 aebadd2c9c8..aa1eb4a4ddb 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 6f1a492676a..192e8604d6d 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);