Re: ALTER TABLE SET ACCESS METHOD on partitioned tables

Alvaro Herrera <alvherre@alvh.no-ip.org>

From: Alvaro Herrera <alvherre@alvh.no-ip.org>
To: Justin Pryzby <pryzby@telsasoft.com>
Cc: Michael Paquier <michael@paquier.xyz>, Soumyadeep Chakraborty <soumyadeep2007@gmail.com>, Zhihong Yu <zyu@yugabyte.com>, pgsql-hackers@postgresql.org, Ashwin Agrawal <ashwinstar@gmail.com>, vanjared@vmware.com
Date: 2024-02-01T15:50:49Z
Lists: pgsql-hackers
> @@ -947,20 +947,22 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
>  	 * a type of relation that needs one, use the default.
>  	 */
>  	if (stmt->accessMethod != NULL)
> +		accessMethodId = get_table_am_oid(stmt->accessMethod, false);
> +	else if (RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE)
>  	{
> -		accessMethod = stmt->accessMethod;
> -
> -		if (partitioned)
> -			ereport(ERROR,
> -					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
> -					 errmsg("specifying a table access method is not supported on a partitioned table")));
> +		if (stmt->partbound)
> +		{
> +			/*
> +			 * For partitions, if no access method is specified, use the AM of
> +			 * the parent table.
> +			 */
> +			Assert(list_length(inheritOids) == 1);
> +			accessMethodId = get_rel_relam(linitial_oid(inheritOids));
> +			Assert(OidIsValid(accessMethodId));
> +		}
> +		else
> +			accessMethodId = get_table_am_oid(default_table_access_method, false);
>  	}

I think this works similarly but not identically to tablespace defaults,
and the difference could be confusing.  You seem to have made it so that
the partitioned table _always_ have a table AM, so the partitions can
always inherit from it.  I think it would be more sensible to _allow_
partitioned tables to have one, but not mandatory; if they don't have
it, then a partition created from it would use default_table_access_method.

-- 
Álvaro Herrera               48°01'N 7°57'E  —  https://www.EnterpriseDB.com/
Bob [Floyd] used to say that he was planning to get a Ph.D. by the "green
stamp method," namely by saving envelopes addressed to him as 'Dr. Floyd'.
After collecting 500 such letters, he mused, a university somewhere in
Arizona would probably grant him a degree.              (Don Knuth)



Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Add information about access method for partitioned relations in \dP+

  2. Fix dumps of partitioned tables with table AMs

  3. Don't use the pg_am system catalog in new test

  4. ALTER TABLE: rework determination of access method ID

  5. Allow specifying an access method for partitioned tables

  6. Review wording on tablespaces w.r.t. partitioned tables

  7. Add support for DEFAULT in ALTER TABLE .. SET ACCESS METHOD

  8. Update comment of AlterTableCmd->name in parsenodes.h