On Tue, Sep 20, 2011 at 11:05 AM, Lionel Elie Mamane <lio...@mamane.lu> wrote: > > The following bug has been logged online: > > Bug reference: 6216 > Logged by: Lionel Elie Mamane > Email address: lio...@mamane.lu > PostgreSQL version: 9.1.0 > Operating system: Debian GNU/Linux > Description: Calling PQconnectdbParams from C++ with a char** > Details: > > In C++, a "char**" value is not convertible to a "const char**" value, > because that is not safe (see > http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17). > > This means one cannot call libpq's PQconnectdbParams and friends passing > them a "char**" value for keywords and/or values, as these arguments are > declared "const char**". > > So please apply this patch, which declares them "char const* const*" > instead, which is: > - equivalent to "const char * const*"; use that one if you prefer > - still true, since libpq won't write to they keyword/values arrays > - allows to pass a "char**" to them and be recognised by a C++ compiler as > OK without a cast. > > This patch is licensed under a "do whatever you want with it" license. > > Thanks in advance. > > > --- postgresql-9.1-9.1.0.orig/src/interfaces/libpq/fe-connect.c > +++ postgresql-9.1-9.1.0/src/interfaces/libpq/fe-connect.c > @@ -291,8 +291,8 @@ static void freePGconn(PGconn *conn); > static void closePGconn(PGconn *conn); > static PQconninfoOption *conninfo_parse(const char *conninfo, > PQExpBuffer errorMessage, bool use_defaults); > -static PQconninfoOption *conninfo_array_parse(const char **keywords, > - const char **values, PQExpBuffer > errorMessage, > +static PQconninfoOption *conninfo_array_parse(char const* const*keywords, > + char const* const*values, > PQExpBuffer errorMessage, > bool use_defaults, int expand_dbname); > static char *conninfo_getval(PQconninfoOption *connOptions, > const char *keyword); > @@ -362,8 +362,8 @@ pgthreadlock_t pg_g_threadlock = default > * call succeeded. > */ > PGconn * > -PQconnectdbParams(const char **keywords, > - const char **values, > +PQconnectdbParams(char const* const*keywords, > + char const* const*values, > int expand_dbname) > { > PGconn *conn = PQconnectStartParams(keywords, values, > expand_dbname); > @@ -381,8 +381,8 @@ PQconnectdbParams(const char **keywords, > * check server status, accepting parameters identical to > PQconnectdbParams > */ > PGPing > -PQpingParams(const char **keywords, > - const char **values, > +PQpingParams(char const* const*keywords, > + char const* const*values, > int expand_dbname) > { > PGconn *conn = PQconnectStartParams(keywords, values, > expand_dbname); > @@ -464,8 +464,8 @@ PQping(const char *conninfo) > * See PQconnectPoll for more info. > */ > PGconn * > -PQconnectStartParams(const char **keywords, > - const char **values, > +PQconnectStartParams(char const* const*keywords, > + char const* const*values, > int expand_dbname) > { > PGconn *conn; > @@ -4249,7 +4249,7 @@ conninfo_parse(const char *conninfo, PQE > * keywords will take precedence, however. > */ > static PQconninfoOption * > -conninfo_array_parse(const char **keywords, const char **values, > +conninfo_array_parse(char const* const*keywords, char const* const*values, > PQExpBuffer errorMessage, bool > use_defaults, > int expand_dbname) > { > --- postgresql-9.1-9.1.0.orig/src/interfaces/libpq/libpq-fe.h > +++ postgresql-9.1-9.1.0/src/interfaces/libpq/libpq-fe.h > @@ -235,14 +235,14 @@ typedef struct pgresAttDesc > /* make a new client connection to the backend */ > /* Asynchronous (non-blocking) */ > extern PGconn *PQconnectStart(const char *conninfo); > -extern PGconn *PQconnectStartParams(const char **keywords, > - const char **values, int > expand_dbname); > +extern PGconn *PQconnectStartParams(char const* const*keywords, > + char const* const*values, int > expand_dbname); > extern PostgresPollingStatusType PQconnectPoll(PGconn *conn); > > /* Synchronous (blocking) */ > extern PGconn *PQconnectdb(const char *conninfo); > -extern PGconn *PQconnectdbParams(const char **keywords, > - const char **values, int expand_dbname); > +extern PGconn *PQconnectdbParams(char const* const*keywords, > + char const* const*values, int > expand_dbname); > extern PGconn *PQsetdbLogin(const char *pghost, const char *pgport, > const char *pgoptions, const char *pgtty, > const char *dbName, > @@ -413,8 +413,8 @@ extern int PQsetnonblocking(PGconn *conn > extern int PQisnonblocking(const PGconn *conn); > extern int PQisthreadsafe(void); > extern PGPing PQping(const char *conninfo); > -extern PGPing PQpingParams(const char **keywords, > - const char **values, int expand_dbname); > +extern PGPing PQpingParams(char const* const*keywords, > + char const* const*values, int expand_dbname); > > /* Force the write buffer to be written (or at least try) */ > extern int PQflush(PGconn *conn);
I agree with the rationale. Note query parameter arguments are already declared this way. merlin -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs