Thread: PQprepare question
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!
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
"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
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!
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
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!