From 162c207269ec6d34c9fb7243b51621340c1b47d0 Mon Sep 17 00:00:00 2001 From: Julien Rouhaud Date: Sun, 5 Jun 2022 03:06:55 +0800 Subject: [PATCH v2 3/4] Debugging: automatically shuffle all table attributes physical position. Author: Julien Rouhaud Reviewed-by: FIXME Discussion: FIXME --- src/backend/commands/tablecmds.c | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 007e355d9d..06b9733717 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -635,6 +635,18 @@ static void ATDetachCheckNoForeignKeyRefs(Relation partition); static char GetAttributeCompression(Oid atttypid, char *compression); +static int +cmp_att_reversed(const void *a, const void *b) +{ + FormData_pg_attribute *atta = (FormData_pg_attribute *) a; + FormData_pg_attribute *attb = (FormData_pg_attribute *) b; + + return (atta->attphysnum > attb->attphysnum) ? -1 + : (atta->attphysnum == attb->attphysnum) ? 0 + : 1; +} + + /* ---------------------------------------------------------------- * DefineRelation * Creates a new relation. @@ -933,6 +945,49 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, colDef->compression); } + /* + * FIXME + * testing mode: inverse all attribute positions. This has to be done + * after that defaults have been computed. + */ + if (relkind == RELKIND_RELATION && inheritOids == NIL + && descriptor->natts > 1 + /* lame attempt to discard CTAS */ + && queryString != NULL) + { + AttrNumber *mappings; + + mappings = palloc(sizeof(AttrNumber) * (descriptor->natts + 1)); + + qsort(descriptor->attrs, descriptor->natts, + sizeof(FormData_pg_attribute), + cmp_att_reversed); + + for (int i = 0; i < descriptor->natts; i++) + { + Form_pg_attribute att = TupleDescAttr(descriptor, i); + + mappings[att->attphysnum] = i + 1; + + att->attnum = att->attphysnum; + att->attphysnum = i + 1; + } + + /* Fixup the defautls references */ + foreach(listptr, rawDefaults) + { + RawColumnDefault *rowEnt = lfirst(listptr); + + rowEnt->attphysnum = mappings[rowEnt->attphysnum]; + } + foreach(listptr, cookedDefaults) + { + CookedConstraint *cooked = lfirst(listptr); + + cooked->attphysnum = mappings[cooked->attphysnum]; + } + } + /* * If the statement hasn't specified an access method, but we're defining * a type of relation that needs one, use the default. -- 2.33.1