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:27 -0400
commit8eed31ffb84cda04cb20f3e780213c17f9f3223f (patch)
tree7bd39e6f8340ab2a534e06541c03dd28e1a1b9e0 /src/backend/commands/tablecmds.c
parent0479eccdcf0db59336aa45c6501666cd9f590b6a (diff)
downloadpostgresql-8eed31ffb84cda04cb20f3e780213c17f9f3223f.tar.gz
postgresql-8eed31ffb84cda04cb20f3e780213c17f9f3223f.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 5a06fdbb754..d646a9d48c1 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -10569,10 +10569,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)