Thread

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

    Julien Rouhaud <julien.rouhaud@free.fr> — 2022-06-04T19:06:55Z

    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"