diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2016-04-15 12:11:27 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2016-04-15 12:11:27 -0400 |
commit | 8eed31ffb84cda04cb20f3e780213c17f9f3223f (patch) | |
tree | 7bd39e6f8340ab2a534e06541c03dd28e1a1b9e0 /src/backend/commands/tablecmds.c | |
parent | 0479eccdcf0db59336aa45c6501666cd9f590b6a (diff) | |
download | postgresql-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.c | 18 |
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) |