Re: setLastTid() and currtid()

"Inoue, Hiroshi" <[email protected]> Wed, 27 Mar 2019 10:01:08 +0900
Newsgroups gmane.comp.db.postgresql.devel.general,gmane.comp.db.postgresql.odbc
Message-ID <[email protected]>
Hi Andres,
Sorry for the late reply.

On 2019/03/26 9:44, Andres Freund wrote:
> Hi,
>
> For the tableam work I'd like to remove heapam.h from
> nodeModifyTable.c. The only remaining impediment to that is a call to
> setLastTid(), which is defined in tid.c but declared in heapam.h.
>
> That doesn't seem like a particularly accurate location, it doesn't
> really have that much to do with heap. It seems more like a general
> executor facility or something.  Does anybody have a good idea where to
> put the declaration?
>
>
> Looking at how this function is used, lead to some confusion on my part.
>
>
> We currently call setLastTid in ExecInsert():
>
> 	if (canSetTag)
> 	{
> 		(estate->es_processed)++;
> 		setLastTid(&slot->tts_tid);
> 	}
>
> And Current_last_tid, the variable setLastTid sets, is only used in
> currtid_byreloid():
>
>
> Datum
> currtid_byreloid(PG_FUNCTION_ARGS)
> {
> 	Oid			reloid = PG_GETARG_OID(0);
> 	ItemPointer tid = PG_GETARG_ITEMPOINTER(1);
> 	ItemPointer result;
> 	Relation	rel;
> 	AclResult	aclresult;
> 	Snapshot	snapshot;
>
> 	result = (ItemPointer) palloc(sizeof(ItemPointerData));
> 	if (!reloid)
> 	{
> 		*result = Current_last_tid;
> 		PG_RETURN_ITEMPOINTER(result);
> 	}
>
> I've got to say I'm a bit baffled by this interface. If somebody passes
> in a 0 reloid, we just ignore the passed in tid, and return the last tid
> inserted into any table?
>
> I then was even more baffled to find that there's no documentation of
> this function, nor this special case behaviour, to be found
> anywhere. Not in the docs (which don't mention the function, nor it's
> special case behaviour for relation 0), nor in the code.
>
>
> It's unfortunately used in psqlobdc:
>
>                  else if ((flag & USE_INSERTED_TID) != 0)
>                          printfPQExpBuffer(&selstr, "%s where ctid = (select currtid(0, '(0,0)'))", load_stmt);

The above code remains only for PG servers whose version < 8.2.
Please remove the code around setLastTid().

regards,
Hiroshi Inoue

> I gotta say, all that currtid code looks to me like it just should be
> ripped out.  It really doesn't make a ton of sense to just walk the tid
> chain for a random tid - without an open snapshot, there's absolutely no
> guarantee that you get back anything meaningful.  Nor am I convinced
> it's perfectly alright to just return the latest inserted tid for a
> relation the user might not have any permission for.
>
> OTOH, we probably can't just break psqlodbc, so we probably have to hold
> our noses a bit longer and just move the prototype elsewhere?  But I'm
> inclined to just say that this functionality is going to get ripped out
> soon, unless somebody from the odbc community works on making it make a
> bit more sense (tests, docs at the very very least).
>
> Greetings,
>
> Andres Freund

---
このメールは、AVG によってウイルス チェックされています。
http://www.avg.com