Обсуждение: BUG #5268: PQgetvalue incorrectly returns 0
The following bug has been logged online: Bug reference: 5268 Logged by: Mike Landis Email address: mlandis@pnmx.com PostgreSQL version: 8.4.1 Operating system: Vista Description: PQgetvalue incorrectly returns 0 Details: When I execute the following SQL: "SELECT COUNT(*) FROM information_schema.tables WHERE table_name='proxies'" in the PGAdmmin 1.10.0, rev 7945-7946 query tool, I get "1" (the correct answer). When I run the exact same SQL in a C program, I get a result set with one tuple and one field (so far so good), but when I run PQgetvalue(resultSet,0,0) I get "0" (wrong answer). Am I missing something? You can't do squat in a client program without PQgetvalue(). Is any sort of regression test being run against libpq functions? What can I do to get this resolved?
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Thu, Jan 07, 2010 at 04:11:03AM +0000, Mike Landis wrote: > > The following bug has been logged online: > > Bug reference: 5268 > Logged by: Mike Landis > Email address: mlandis@pnmx.com > PostgreSQL version: 8.4.1 > Operating system: Vista > Description: PQgetvalue incorrectly returns 0 > Details: > > When I execute the following SQL: > > "SELECT COUNT(*) FROM information_schema.tables WHERE table_name='proxies'" > > in the PGAdmmin 1.10.0, rev 7945-7946 query tool, I get "1" (the correct > answer). When I run the exact same SQL in a C program, I get a result set > with one tuple and one field (so far so good), but when I run > PQgetvalue(resultSet,0,0) I get "0" (wrong answer). > > Am I missing something? You can't do squat in a client program without > PQgetvalue(). Is any sort of regression test being run against libpq > functions? Hm. I don't know for sure, but I'd assume that PGAdmin relies on libpq... > What can I do to get this resolved? Could you show us a more complete test case? That might help in pin-pointing the problem. Regards - -- tomás -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFLRYnoBcgs9XrR2kYRAjV/AJ9+HAZZu5sFKuHw1vp7aZNLKM7ykwCfQ+FX q+NXaFojGP7uS4O/4Km/stM= =zblK -----END PGP SIGNATURE-----
"Mike Landis" <mlandis@pnmx.com> writes:
> When I execute the following SQL:
> "SELECT COUNT(*) FROM information_schema.tables WHERE table_name='proxies'"
> in the PGAdmmin 1.10.0, rev 7945-7946 query tool, I get "1" (the correct
> answer). When I run the exact same SQL in a C program, I get a result set
> with one tuple and one field (so far so good), but when I run
> PQgetvalue(resultSet,0,0) I get "0" (wrong answer).
The most likely bet I can think of offhand is that your C program
is connecting to the wrong database.
> Am I missing something? You can't do squat in a client program without
> PQgetvalue(). Is any sort of regression test being run against libpq
> functions?
libpq is exercised probably hundreds of millions of times a day,
every day.
regards, tom lane
Try the following, where
mystring is an extension of std::string...
mystring sql( "SELECT COUNT(*) FROM information_schema.tables
WHERE table_name=3D'proxies' ");
int
GetIntFromSQL(
mystring& sql )
{
// if there's more than o=
ne
record in the ResultSet, still only returns the first float
int
retVal =3D -1;
PGresult* res =3D
GetQueryResult( sql );
if
( res )
{
int
nTuples =3D PQntuples(res);
int
nFields =3D PQnfields(res);
if
( nTuples > 0 &&
nFields > 0 )
{
char
* val =3D
PQgetvalue(res,0,0);
// get first column, first
field
retVal =3D atoi(
val );
}
PQclear( res
);
}
return
retVal;
}
PGresult*
GetQueryResult(
mystring& sql )
{
// run a query that may
return a result set
PGresult*
res =3D PQexec( conn,
sql.c_str() );
if
( res )
{
int
status =3D PQresultStatus(res);
if
( status !=3D PGRES_TUPLES_OK )
{
// what happened?
fprintf( stderr,
"GetQueryResult(%s) ->
%s\n", sql.c_str(),
PQerrorMessage(conn) );
PQclear( res
);
// possibly moot
res =3D NULL;
}
}
else
{
fprintf( stderr,
"GetQueryResult: insufficient memory to run:
%s\n", sql.c_str() );
throw
"GetQueryResult: insufficient
memory";
}
return
res;
}
At 02:14 AM 1/7/2010, you wrote:
-----BEGIN PGP SIGNED
MESSAGE-----
Hash: SHA1
On Thu, Jan 07, 2010 at 04:11:03AM +0000, Mike Landis wrote:
>
> The following bug has been logged online:
>
> Bug reference: 5268
> Logged by:
Mike Landis
> Email address: mlandis@pnmx.com
> PostgreSQL version: 8.4.1
> Operating system: Vista
> Description: PQgetvalue
incorrectly returns 0
> Details:
>
> When I execute the following SQL:
>
> "SELECT COUNT(*) FROM information_schema.tables WHERE
table_name=3D'proxies'"
>
> in the PGAdmmin 1.10.0, rev 7945-7946 query tool, I get
"1" (the correct
> answer). When I run the exact same SQL in a C program, I get a
result set
> with one tuple and one field (so far so good), but when I run
> PQgetvalue(resultSet,0,0) I get "0" (wrong answer).
>
> Am I missing something? You can't do squat in a client program
without
> PQgetvalue(). Is any sort of regression test being run against
libpq
> functions?
Hm. I don't know for sure, but I'd assume that PGAdmin relies on
libpq...
> What can I do to get this resolved?
Could you show us a more complete test case? That might help in
pin-pointing the problem.
Regards
- -- tom=C3=A1s
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
iD8DBQFLRYnoBcgs9XrR2kYRAjV/AJ9+HAZZu5sFKuHw1vp7aZNLKM7ykwCfQ+FX
q+NXaFojGP7uS4O/4Km/stM=3D
=3DzblK
-----END PGP SIGNATURE-----
No virus found in this incoming message.
Checked by AVG -
www.avg.com
Version: 9.0.725 / Virus Database: 270.14.127/2603 - Release Date:
01/06/10 02:35:00
On Thu, Jan 7, 2010 at 7:51 AM, Mike Landis <mlandis@pnmx.com> wrote: > Try the following, where mystring is an extension of std::string... It seems to me this would be a lot easier if you could attach a complete program that someone could just compile, instead of code fragments that are missing unspecified includes and necessary class definitions. It would take someone half an hour to fix this up and they still won't be doing exactly what you're doing. ...Robert
#include <stdio.h>
#include <tchar.h> // on Vista
#include <libpq-fe.h> // from: the postgres 8.4 install include directory, for me...
D:\Programs\PostgreSQL\8.4\include
// configure these constants and get a '0' even though the same query produces a '1' in pgAdmin
const char* pgUser = "us"; // PG user
const char* pgDbms = "db"; // database
const char* pgPass = "xyz"; // password
const char* pgHost = "localhost"; // host domain or IP
const char* pgTable = "tableName"; // a table that exists in the pgDbms
// on UNIX you can obviously revert the main() declaration to main( int argc, char** argv )
int _tmain( int argc, _TCHAR* argv[] )
{ char connInfo[128];
sprintf( connInfo, "host=%s dbname=%s user=%s password=%s", pgHost, pgDbms, pgUser, pgPass );
PGconn* conn = PQconnectdb( connInfo );
if ( PQstatus(conn) == CONNECTION_OK )
{ // in my case... SELECT COUNT(*) FROM information_schema.tables WHERE table_name='proxies'
sprintf( connInfo, "SELECT COUNT(*) FROM information_schema.tables WHERE table_name='%s'",
pgTable );
PGresult* res = PQexec( conn, connInfo );
if ( res )
{ if ( PQresultStatus(res) == PGRES_TUPLES_OK )
{ int nTuples = PQntuples(res);
int nFields = PQnfields(res);
if ( nTuples > 0 && nFields > 0 )
{ char* val = PQgetvalue(res,0,0); // get first column, first field
fprintf( stderr, "val=%s\n", val );
}
}
PQclear( res ); // possibly moot
res = NULL;
}
PQfinish( conn );
}
return 0;
}
//--------------------------------------------------------------------
// you'll need to link with.libpq, in my case, that's: D:\Programs\PostgreSQL\8.4\lib\libpq.lib
Mike Landis wrote: > <html> > <body> > <font color="#0000FF">Pick a database and table that exists, configure > the string cconstants, compile and run the attached cpp, get 0 instead of > 1 (that you get in pgAdmin...<br><br> You realize that information_schema only shows you tables that have permissions on, right? Make sure you're using the same user in pgAdmin than in your program. -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc.
Mike Landis wrote: > Pick a database and table that exists, configure the string > cconstants, compile and run the attached cpp, get 0 instead of 1 (that > you get in pgAdmin... > > Where's can I download the libpq source? Maybe I can find and/or fix > the problem myself. Your program works fine for me (apart from minor datatype changes to port to Linux). I used user=postgres and database=regression and pgtable='tenk1' (schema from the regression test suite). As Tom mentioned, your user might not have access to the table you are using - try using the superuser account - typically 'postgres' to eliminate this possibility. With respect to the libpq source, it is in the source tarball from the Postgresql website (directory src/interfaces/libpq ). regards Mark
On Thu, Jan 7, 2010 at 7:31 PM, Mark Kirkwood <mark.kirkwood@catalyst.net.nz> wrote: > Mike Landis wrote: >> >> Pick a database and table that exists, configure the string cconstants, >> compile and run the attached cpp, get 0 instead of 1 (that you get in >> pgAdmin... >> >> Where's can I download the libpq source? =A0Maybe I can find and/or fix = the >> problem myself. > > Your program works fine for me (apart from minor datatype changes to port= to > Linux). It works fine for me, too. At first I was getting val=3D0, but then after I modified it to actually be running against the same database where I created the test table, I got val=3D1 as expected. ...Robert
Mike Landis wrote: > At 09:09 PM 1/7/2010, you wrote: > >> >> I suspect they do not. Its all in the permissions. > > There's no user account control enabled on this Vista machine, > therefore effectively wide open, hence different platform behavior or > at least a difference between the behavior in pgAdmin and client program. > The lack of os level permissions is not relevant to this issue - I was referring to database level users and their permissions on tables. It does look like you are somehow running your c program as a different (db) user from who you are using in Pgadmin. As Robert suggested, try doing 'SELECT user' in both. Also note that Pgadmin user PQexec and PQgetValue... Cheers Mark