From: | Andres Freund <andres(at)anarazel(dot)de> |
---|---|
To: | "Inoue, Hiroshi" <h-inoue(at)dream(dot)email(dot)ne(dot)jp> |
Cc: | pgsql-hackers(at)postgresql(dot)org, Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, Michael Paquier <michael(dot)paquier(at)gmail(dot)com>, Hiroshi Inoue <inoue(at)tpf(dot)co(dot)jp>, pgsql-odbc(at)postgresql(dot)org |
Subject: | Re: setLastTid() and currtid() |
Date: | 2019-04-11 16:52:14 |
Message-ID: | 20190411165214.5jvyldjgdlsxz2ax@alap3.anarazel.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers pgsql-odbc |
Hi,
On 2019-03-27 10:01:08 +0900, Inoue, Hiroshi wrote:
> Hi Andres,
> Sorry for the late reply.
Not late at all. Sorry for *my* 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().
Does anybody else have concerns about removing this interface? Does
anybody think we should have a deprecation phase? Should we remove this
in 12 or 13?
Greetings,
Andres Freund
From | Date | Subject | |
---|---|---|---|
Next Message | Ashwin Agrawal | 2019-04-11 16:54:50 | Re: finding changed blocks using WAL scanning |
Previous Message | Andres Freund | 2019-04-11 16:49:47 | Re: Pluggable Storage - Andres's take |
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2019-04-11 17:27:03 | Re: setLastTid() and currtid() |
Previous Message | Clemens Ladisch | 2019-04-04 12:54:03 | Re: ODBC driver v11 backward compatibility |