function currtid2() in SQL and ESQL/C to get the new CTID of a row

Поиск
Список
Период
Сортировка
От Matthias Apitz
Тема function currtid2() in SQL and ESQL/C to get the new CTID of a row
Дата
Msg-id 20220601105945.GA18@sh4-5.1blu.de
обсуждение исходный текст
Ответы Re: function currtid2() in SQL and ESQL/C to get the new CTID of a row  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-general
While looking for a way to get the new CTID of an UPDATEd row, I came
accros this function currtid2() which works fine on SQL with a 14.1
server:

https://www.postgresql.org/message-id/Pine.BSO.4.44.0206031939050.21627-100000%40kitten.greentechnologist.org

testdb=# SELECT ctid, * FROM dbctest WHERE tstint = 10;
ctid   | tstchar25 | tstint
-------+-----------+--------
(0,9)  |           | 10

testdb=# UPDATE dbctest SET tstint = 11 WHERE tstint = 10;
UPDATE 1
testdb=# SELECT currtid2('dbctest'::text, '(0,9)'::tid);
currtid2
----------
(0,10)

checking if it (0,10) is really the new CTID:

testdb=# SELECT ctid, * FROM dbctest WHERE tstint = 11;
ctid    | tstchar25 | tstint
--------+-----------+--------
(0,10)  |           | 11

So far so good, but we do need this in ESQL/C. There the code looks as:

     EXEC SQL BEGIN DECLARE SECTION;
     char    stmt[255];
     static char newCTID[80];
     EXEC SQL END DECLARE SECTION;
               
     memset(stmt, 0, sizeof(stmt));
     sprintf(stmt, "currtid2('%s'::text, '%s'::tid)", table, oldCTID);
     fprintf(stderr, stmt); 
     fprintf(stderr, "\n"); 

     EXEC SQL SELECT :stmt INTO :newCTID;
     
     sprintf(stmt, "table %s oldCTID %s newCTID %s\n",
                      table, oldCTID, newCTID);
     fprintf(stderr, stmt);

The code runs fine but the content of the host variable is the statement
itself 'currtid2('dbctest'::text, '(0,13)'::tid)' like the SELECT was
just an echo function.

Is this function currtid2() not meant to be used in ESQL/C? Or did we
something wrong in ESQL/C?

I read as well in some posting that the functions currtid2() and
currtid() should be removed... Is there some better way to get the new
CTID based on the known old (invalid) CTID?

Thanks

    matthias
-- 
Matthias Apitz, ✉ guru@unixarea.de, http://www.unixarea.de/ +49-176-38902045
Public GnuPG key: http://www.unixarea.de/key.pub



В списке pgsql-general по дате отправления:

Предыдущее
От: "huangning290@yahoo.com"
Дата:
Сообщение: GIN theory
Следующее
От: Tom Lane
Дата:
Сообщение: Re: function currtid2() in SQL and ESQL/C to get the new CTID of a row