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

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Matthias Apitz <guru(at)unixarea(dot)de>
Cc: pgsql-general(at)lists(dot)postgresql(dot)org
Subject: Re: function currtid2() in SQL and ESQL/C to get the new CTID of a row
Date: 2022-06-01 13:46:17
Message-ID: 551140.1654091177@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Matthias Apitz <guru(at)unixarea(dot)de> writes:
> 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.

Indeed.

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

This is not about currtid2, this is a fundamental misunderstanding
of how ECPG works. You can only inject data values into ordinary
EXEC SQL commands. I think you could handle this as

EXEC SQL SELECT currtid2(:table ::text, :oldCTID ::tid) INTO :newCTID;

If you want full-on dynamic SQL, that's also possible but you'd need
PREPARE/EXECUTE, and it wouldn't look much like this fragment.
I don't see a need for that here, though.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Danny Shemesh 2022-06-01 16:28:58 Extended multivariate statistics are ignored (potentially related to high null fraction, not sure)
Previous Message Matthias Apitz 2022-06-01 10:59:45 function currtid2() in SQL and ESQL/C to get the new CTID of a row