On Mon, Feb 15, 2021 at 04:21:38PM +0900, Michael Paquier wrote:
> On Tue, Feb 09, 2021 at 04:27:34PM +0900, Michael Paquier wrote:
> > Putting sanity checks within all the table_* functions of tableam.h
> > would not be a good idea, as nothing prevents the call of what's
> > stored in rel->rd_tableam.
>
> I have been playing with this idea, and finished with the attached,
> which is not the sexiest patch around. The table AM used as fallback
> for tables without storage is called no_storage (this could be called
> virtual_am?). Reverting e786be5 or dd705a0 leads to an error coming
> from no_storage instead of a crash.
If you apply this patch, will you want to actually revert those earlier changes?
> One thing to note is that this simplifies a bit slot_callbacks as
> views, foreign tables and partitioned tables can grab their slot type
> directly from this new table AM.
Also (related), this still crashes if methods are omitted from the initializer,
like:
// .slot_callbacks = no_storage_slot_callbacks,
I'm not sure if there's any better way to enforce that's updated when callbacks
are added.
Most of the methods have Assert( != NULL), so maybe this one is missing?
src/backend/access/table/tableamapi.c
GetTableAmRoutine(Oid amhandler)
...
Assert(routine->slot_callbacks != NULL);
See also
https://www.postgresql.org/message-id/CALfoeisgdZhYDrJOukaBzvXfJOK2FQ0szVMK7dzmcy6w93iDUA%40mail.gmail.com
--
Justin