Thread: PQprepare question

PQprepare question

From
Michael Meskes
Date:
According to the docs parameters are referenced as $1, $2, and so. Is
there a reason not to use "?" as placeholder? It seems to be quite
common to use "?" and of course a simple counting gives the same
information.

ECPG used to accept "?" notation. Now I started to switch from PQexec to
PQexecParams and at the same time add PQprepare. However, I'd like to
still be able to accept old sources using "?". The question now is, do I
replace the "?"s on the clien side in ecpglib or libpq, or is it
possible to add this in the backend for more general use?

Michael
-- 
Michael Meskes
Email: Michael at Fam-Meskes dot De, Michael at Meskes dot (De|Com|Net|Org)
ICQ: 179140304, AIM/Yahoo: michaelmeskes, Jabber: meskes@jabber.org
Go SF 49ers! Go Rhein Fire! Use Debian GNU/Linux! Use PostgreSQL!


Re: PQprepare question

From
Tom Lane
Date:
Michael Meskes <meskes@postgresql.org> writes:
> According to the docs parameters are referenced as $1, $2, and so. Is
> there a reason not to use "?" as placeholder?

It's an operator name.
        regards, tom lane


Re: PQprepare question

From
Gregory Stark
Date:
"Tom Lane" <tgl@sss.pgh.pa.us> writes:

> Michael Meskes <meskes@postgresql.org> writes:
>> According to the docs parameters are referenced as $1, $2, and so. Is
>> there a reason not to use "?" as placeholder?
>
> It's an operator name.

Most drivers such as JDBC and DBD::Pg do allow you to use ? parameters because
they're the ODBC standard. But they're just replacing them with $1 and so on
behind your back. If you want your code to be portable to other databases then
it makes sense to use ? 

But otherwise there are a few advantages to using $1, $2... a) You can change
your query to possibly use the arguments in a different order without having
to change the execute parameters as well. b) You can use a parameter multiple
times in a query without having to burden your execute call site with multiple
copies of the parameter.

I think you lose if you have an operator ? and want to use these drivers
though. Even if you only use $n parameters the driver may still get confused.
(At the very least if you ever have a query with no parameters and a ?
operator in it). 

--  Gregory Stark EnterpriseDB          http://www.enterprisedb.com



Re: PQprepare question

From
Michael Meskes
Date:
On Fri, May 11, 2007 at 09:08:01AM -0400, Tom Lane wrote:
> Michael Meskes <meskes@postgresql.org> writes:
> > According to the docs parameters are referenced as $1, $2, and so. Is
> > there a reason not to use "?" as placeholder?
> 
> It's an operator name.

Ah, didn't notice. But that means that ecpg should not accept "?" as
placeholder either as this is prone to give errors depending on the
usage right? I'm not sure how often this is used with external strings
that are prepared. The internal stuff could easily be changed.

Michael
-- 
Michael Meskes
Email: Michael at Fam-Meskes dot De, Michael at Meskes dot (De|Com|Net|Org)
ICQ: 179140304, AIM/Yahoo: michaelmeskes, Jabber: meskes@jabber.org
Go SF 49ers! Go Rhein Fire! Use Debian GNU/Linux! Use PostgreSQL!


Re: PQprepare question

From
Tom Lane
Date:
Michael Meskes <meskes@postgresql.org> writes:
> On Fri, May 11, 2007 at 09:08:01AM -0400, Tom Lane wrote:
>> It's an operator name.

> Ah, didn't notice. But that means that ecpg should not accept "?" as
> placeholder either as this is prone to give errors depending on the
> usage right?

I'd vote that way if you haven't accepted it in the past.  Otherwise
you'll need some kind of compromise for backward compatibility ...
        regards, tom lane


Re: PQprepare question

From
Michael Meskes
Date:
On Fri, May 11, 2007 at 09:52:55AM -0400, Tom Lane wrote:
> I'd vote that way if you haven't accepted it in the past.  Otherwise
> you'll need some kind of compromise for backward compatibility ...

In the past ecpg not only accepted "?" as placeholder but also created
it! This is what I was talking about, to not create those placeholders
anymore. As far as user supplied placehodlers are concerned I agree that
we need some backward compatibility. I think the best way is to
implement a command line option to enable the old behaviour.

Michael
-- 
Michael Meskes
Email: Michael at Fam-Meskes dot De, Michael at Meskes dot (De|Com|Net|Org)
ICQ: 179140304, AIM/Yahoo: michaelmeskes, Jabber: meskes@jabber.org
Go SF 49ers! Go Rhein Fire! Use Debian GNU/Linux! Use PostgreSQL!