Subject: [PATCH v2 3/4] Debugging: automatically shuffle all table attributes physical position.

From: Julien Rouhaud <[email-masked]>
Date: Sun, 5 Jun 2022 03:06:55 +0800

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

--5462ml7mocwud3y7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename="v2-0004-POC-Add-naive-grammar-to-specify-the-column-logic.patch"