aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/tablecmds.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-04-15 12:11:27 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-04-15 12:11:40 -0400
commit8f1911d5e6d5a1e62c860ddb040d664b01c6415c (patch)
tree7640e77a109dd40e8188b2b3f6aa37529e97db93 /src/backend/commands/tablecmds.c
parentda7d44b627ba839de32c9409aca659f60324de76 (diff)
downloadpostgresql-8f1911d5e6d5a1e62c860ddb040d664b01c6415c.tar.gz
postgresql-8f1911d5e6d5a1e62c860ddb040d664b01c6415c.zip
Fix possible crash in ALTER TABLE ... REPLICA IDENTITY USING INDEX.
Careless coding added by commit 07cacba983ef79be could result in a crash or a bizarre error message if someone tried to select an index on the OID column as the replica identity index for a table. Back-patch to 9.4 where the feature was introduced. Discussion: CAKJS1f8TQYgTRDyF1_u9PVCKWRWz+DkieH=U7954HeHVPJKaKg@mail.gmail.com David Rowley
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r--src/backend/commands/tablecmds.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index eaf76d2b902..45a51446434 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -11052,10 +11052,20 @@ ATExecReplicaIdentity(Relation rel, ReplicaIdentityStmt *stmt, LOCKMODE lockmode
int16 attno = indexRel->rd_index->indkey.values[key];
Form_pg_attribute attr;
- /* Of the system columns, only oid is indexable. */
- if (attno <= 0 && attno != ObjectIdAttributeNumber)
- elog(ERROR, "internal column %u in unique index \"%s\"",
- attno, RelationGetRelationName(indexRel));
+ /* Allow OID column to be indexed; it's certainly not nullable */
+ if (attno == ObjectIdAttributeNumber)
+ continue;
+
+ /*
+ * Reject any other system columns. (Going forward, we'll disallow
+ * indexes containing such columns in the first place, but they might
+ * exist in older branches.)
+ */
+ if (attno <= 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
+ errmsg("index \"%s\" cannot be used as replica identity because column %d is a system column",
+ RelationGetRelationName(indexRel), attno)));
attr = rel->rd_att->attrs[attno - 1];
if (!attr->attnotnull)