Re: libpq doing strange things

From: Andreas Kretzer <andi(at)kretzer-berlin(dot)de>
To: Postgres Interface List <pgsql-interfaces(at)postgresql(dot)org>
Subject: Re: libpq doing strange things
Date: 2002-01-07 09:54:23
Message-ID: 3C39704F.76FBB40B@kretzer-berlin.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-interfaces

Daniel Andersen wrote:

> Hi,
>
> Is there some undocumented feature in libpq to do with executing update
> queries? I just programmed my mail server to put a mark next to a users name
> whenever they check their email, but for some reason the update query does
> not execute properly. It returns PGRES_COMMAND_OK, and if i check the text
> output of the query it says its updated one record. I know that the
> connection is working ok, because it extracts the password and username from
> the database ok in the query before. Is there any other way to check what is
> going wrong, or is there something else i should be doing i don't know about?
> all i do is load the query into a string using sprintf, and then use that
> string to execute the query like PGexec (conn, string)
> Heres the exact query and commands in case it helps:
>
> snprintf (ptr, 256, "update accounting set mail = 1 where time_stamp
> in (select max (time_stamp) from accounting where username='%s') and
> username='%s';", pinfo->userid, pinfo->userid);
> syslog(LOG_ERR,ptr);
> res2 = PQexec (conn, ptr);
> if (PQresultStatus(res2) != PGRES_TUPLES_OK) syslog(LOG_ERR,
> PQresStatus(PQresultStatus(res2)));
>
> and the output in the syslog is like:
>
> Jan 4 09:21:49 spa teapop[17449]: update accounting set mail = 1 where
> time_stamp in (select max (time_stamp) from accounting where username='bsn')
> and username='bsn';
> Jan 4 09:21:49 spa teapop[17449]: PGRES_COMMAND_OK
>
> which seems like it should be doing ok. Can anyone shed some light on what
> might be causing this problem?

So what are you worried about? EVERYTHING IS FINE :-) Just use the
PGRES_COMMAND_OK return code for your check:

if (PQresultStatus(res2) != PGRES_COMMAND_OK)
syslog(LOG_ERR, PQresStatus(PQresultStatus(res2)));

The PGRES_TUPLES_OK is the return code that informs you about a valid
_selection_ of records - but with an UPDATE statement, you just don't select
anything. Therefore it just can't give you the result PGRES_TUPLES_OK.

N.B.: If you do a select and get a PGRES_TUPLES_OK it is not a necessity
to have records selected. You might have executed a valid query which just
returned an empty result (for example any valid query in a totaly empty database).

There are other queries which only return PGRES_COMMAND_OK (for
example UPDATE and DELETE).

Hope this helps
Andreas

In response to

Responses

Browse pgsql-interfaces by date

  From Date Subject
Next Message Global Recruiter 2002-01-07 17:16:58 help! in need of a dba w/oracle and postgres
Previous Message lee 2002-01-06 23:40:28 Re: