Re: Using FDW AddForeignUpdateTargets for a hidden pseudo-column - Mailing list pgsql-hackers

From Albe Laurenz
Subject Re: Using FDW AddForeignUpdateTargets for a hidden pseudo-column
Date
Msg-id A737B7A37273E048B164557ADEF4A58B53860913@ntex2010i.host.magwien.gv.at
Whole thread Raw
In response to Using FDW AddForeignUpdateTargets for a hidden pseudo-column  (Aleksey Demakov <a.demakov@postgrespro.ru>)
Responses Re: Using FDW AddForeignUpdateTargets for a hidden pseudo-column  (Bernd Helmle <mailings@oopsware.de>)
List pgsql-hackers
Aleksey Demakov wrote:
> I have a data store where tuples have unique identities that normally are not visible.
> I also have a FDW to work with this data store. As per the docs to implement updates
> for this data store I have AddForeignUpdateTargets() function that adds an artificial
> column to the target list.
> 
> It seems to me that I cannot re-use a system attribute number for this artificial resjunk
> column (as, for instance, postgres_fdw uses SelfItemPointerAttributeNumber). These
> attributes have specific meaning not compatible with my tuple identity.
> 
> On other hand using a regular AttrNumber might confuse the query planner. In contrast
> e..g with Oracle FDW that can use a unique key to identify the row, in my data store
> the tuple identity is normally not visible. So the data planner might break if it sees a
> Var node with an unexpected varattno number.
>
> What is the best approach to handle such a case?
> 
> 1. Give up on this entirely and require a unique key for any table used thru FDW.
> 
> 2. Force the FDW to expose the identity column either explicitly by the user who
> creates a foreign table or automatically adding it in the corresponding trigger
> (preferably still making it hidden for normal scans).
> 
> 3. Modify the postgresql core to nicely handle the case of an unknown target
> column added by a FDW.
> 
> 4. Something else?

When implementing this for oracle_fdw, I went with your solution #1.
The downside is that anything that does not have a unique key cannot be
modified.

I first thought of using the internal ROWID column that's probably similar to
your case, but that wouldn't fit into a tid's 6 bytes, and I found that I could
only add resjunk columns for existing columns of the table.
Making the internal ROWID an explicit column in the foreign table seemed
just too ugly.

I don't know if #3 would be difficult, but it sure would make things easier
for FDW developers.

Yours,
Laurenz Albe

pgsql-hackers by date:

Previous
From: Aleksey Demakov
Date:
Subject: Using FDW AddForeignUpdateTargets for a hidden pseudo-column
Next
From: Andreas Karlsson
Date:
Subject: Re: Parallel safety tagging of extension functions