1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-13 07:41:39 +03:00

Change one loop in ATRewriteTable to use 1-based attnums

All TupleDescAttr() calls in tablecmds.c that aren't in loops across all
attributes use AttrNumber-style indexes (1-based); there was only one
place in ATRewriteTable that was stashing 0-based indexes in a list for
later processing.  Switch that to use attnums for consistency.

Author: jian he <jian.universality@gmail.com>
Discussion: https://postgr.es/m/CACJufxEoYA5ScUr2=CmA1xcpaS_1ixneDbEkVU77X1ctGxY2mA@mail.gmail.com
This commit is contained in:
Álvaro Herrera
2025-03-21 10:55:06 +01:00
parent ce1a75c4fe
commit 1d617a2028

View File

@ -6189,7 +6189,7 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
Form_pg_attribute attr = TupleDescAttr(newTupDesc, i);
if (attr->attnotnull && !attr->attisdropped)
notnull_attrs = lappend_int(notnull_attrs, i);
notnull_attrs = lappend_int(notnull_attrs, attr->attnum);
}
if (notnull_attrs)
needscan = true;
@ -6370,20 +6370,18 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
/* Now check any constraints on the possibly-changed tuple */
econtext->ecxt_scantuple = insertslot;
foreach(l, notnull_attrs)
foreach_int(attn, notnull_attrs)
{
int attn = lfirst_int(l);
if (slot_attisnull(insertslot, attn + 1))
if (slot_attisnull(insertslot, attn))
{
Form_pg_attribute attr = TupleDescAttr(newTupDesc, attn);
Form_pg_attribute attr = TupleDescAttr(newTupDesc, attn - 1);
ereport(ERROR,
(errcode(ERRCODE_NOT_NULL_VIOLATION),
errmsg("column \"%s\" of relation \"%s\" contains null values",
NameStr(attr->attname),
RelationGetRelationName(oldrel)),
errtablecol(oldrel, attn + 1)));
errtablecol(oldrel, attn)));
}
}