Re: ALTER TABLE SET ACCESS METHOD on partitioned tables - Mailing list pgsql-hackers

From Zhihong Yu
Subject Re: ALTER TABLE SET ACCESS METHOD on partitioned tables
Date
Msg-id CALNJ-vRWNh87w0jHEep6zzB3rxJWe_TEm-YrJsixTOZ0PyTOdQ@mail.gmail.com
Whole thread Raw
In response to Re: ALTER TABLE SET ACCESS METHOD on partitioned tables  (Soumyadeep Chakraborty <soumyadeep2007@gmail.com>)
Responses Re: ALTER TABLE SET ACCESS METHOD on partitioned tables
List pgsql-hackers


On Wed, May 18, 2022 at 5:49 PM Soumyadeep Chakraborty <soumyadeep2007@gmail.com> wrote:

On Wed, May 18, 2022 at 4:14 PM Justin Pryzby <pryzby@telsasoft.com> wrote:

> I didn't look closely yet, but this comment is wrong:
>
> + * Since these have no storage the tablespace can be updated with a simple                                                                                                                                                      
> + * metadata only operation to update the tablespace.                                                                                                                                                                            

Good catch. Fixed.

> It'd be convenient if AMs worked the same way (and a bit odd that they don't).
> Note that in v15, pg_dump/restore now allow --no-table-am, an exact parallel to
> --no-tablespace.

I agree that ATSET AM should behave in a similar fashion to ATSET tablespaces.
However, the way that ATSET tablespace currently behaves is not consistent with
the ONLY clause.

On a given partition root:
ALTER TABLE ONLY am_partitioned SET TABLESPACE ts;
has the same effect as:
ALTER TABLE am_partitioned SET TABLESPACE ts;

We are missing out on the feature to set the AM/tablespace throughout the
partition hierarchy, with one command.

Regards,
Soumyadeep (VMware)

Hi,

+       accessMethodId = ((Form_pg_class) GETSTRUCT(tup))->relam;

-   /* look up the access method, verify it is for a table */
-   if (accessMethod != NULL)
-       accessMethodId = get_table_am_oid(accessMethod, false);
+       if (!HeapTupleIsValid(tup))
+           elog(ERROR, "cache lookup failed for relation %u", relid);

The validity check of tup should be done before fetching the value of relam field.

Cheers

pgsql-hackers by date:

Previous
From: Andrew Dunstan
Date:
Subject: Re: JSON Functions and Operators Docs for v15
Next
From: Shinya Kato
Date:
Subject: Re: Add --{no-,}bypassrls flags to createuser