On Wed, Oct 5, 2022 at 8:17 PM Tom Lane <tgl@xxxxxxxxxxxxx> wrote: > Laurenz Albe <laurenz.albe@xxxxxxxxxxx> writes: > > On Wed, 2022-10-05 at 16:38 +0200, Dominique Devienne wrote: > > Yes, you have to use PQcmdTuples(), and you have to convert the string to an integer. > > But don't worry: the result will *not* be "INSERT 0 5", it will be just "5" Thanks. What's the leading 0 though, then? I guessed it might be the number of rows returned, but it isn't, see below: postgres=# create table foo (id serial primary key, v int); CREATE TABLE postgres=# insert into foo (v) values (1), (2) returning id; id ---- 1 2 (2 rows) INSERT 0 2 > Yeah, just applying atoi() or atol() to the result should be enough. Thanks too. Since I'm in C++, I used <charconv> instead, and discovered it can be empty something, not 0. I guess atoi() would have hidden that distinction, and worked anyway (returning 0). In the same topic, I've noticed an INSERT returns PGRES_COMMAND_OK, while an INSERT-RETURNING returns PGRES_TUPLES_OK. So there's no way to use the status to distinguish a SELECT from anything else? A RETURNING clause makes any statement supporting it an hybrid of a command and a query, but then how does one know the exact "kind" of the statement? E.g. So how does psql show INSERT in either cases? By parsing the SQL itself, client-side? Or is there a libpq API on PGresult that would allow to get the type of statement the result is from? Thanks, --DD