Re: bind_param for named parameters - clarification sought

2008-05-14 Thread Greg Sabino Mullane

-BEGIN PGP SIGNED MESSAGE-
Hash: RIPEMD160


 I believe, but am prepared to be put right, other non-perl database drivers
 also drop the ':' when binding.

 Any other driver authors/users care to comment?

FWIW, DBD::Pg requires a leading colon, but strongly encourages the use of $1
placeholders, with ? being an inefficient but acceptable alternative. I like
the leading colon because it visually enforces that you are using named 
parameters,
and is helpful when using :1, :2, etc. I wouldn't object to supporting
'no colons' either, if that's what DBI ends up recommending.

- --
Greg Sabino Mullane [EMAIL PROTECTED]
End Point Corporation
PGP Key: 0x14964AC8 200805141108
http://biglumber.com/x/web?pk=2529DF6AB8F79407E94445B4BC9B906714964AC8
-BEGIN PGP SIGNATURE-

iEYEAREDAAYFAkgrAk4ACgkQvJuQZxSWSsgK7QCfaJQV1+Sue1dxJXrY8g2UuWKl
p/cAoOs3Zm5/ZRHVsKTxaWderwHbulZj
=j+jV
-END PGP SIGNATURE-




Re: bind_param for named parameters - clarification sought

2008-05-13 Thread Tim Bunce
On Tue, May 13, 2008 at 01:20:14PM +0100, Martin Evans wrote:
 Tim,

 In the thread problem with DBD::ODBC and placeholders [SEC=UNCLASSIFIED] 
 on dbi-users recently you said:

  Drivers that support named placeholders like :N where N is an
  integer, could support both forms of binding: bind_param(:1,$v) and
  execute($v)
  It's not dis-allowed. Driver docs should clarify this issue.

 Is it really your intention that to bind named parameter fred as in the 
 SQL insert into xxx values(:fred) you call bind_param(:fred,$v)?

That's the way DBD::Oracle has always done it.

 As it happens DBD::ODBC has a bug in its support of named parameters (other 
 than :1, :2 etc) which means it did not work at all but it ALSO expects the 
 name parameter :fred above to be passed to bind_param as fred i.e. the 
 leading ':' is treated as an introducer and not part of the parameter name. 
 I believe, but am prepared to be put right, other non-perl database drivers 
 also drop the ':' when binding.

Any other driver authors/users care to comment?

 As it didn't work before I can change it to be either - just let me know.

I guess the colon could be made optional without any harm.

Tim.


Re: bind_param for named parameters - clarification sought

2008-05-13 Thread Jonathan Leffler
On Tue, May 13, 2008 at 10:13 AM, Tim Bunce [EMAIL PROTECTED] wrote:

 On Tue, May 13, 2008 at 01:20:14PM +0100, Martin Evans wrote:
  Tim,
 
  In the thread problem with DBD::ODBC and placeholders
 [SEC=UNCLASSIFIED]
  on dbi-users recently you said:
 
   Drivers that support named placeholders like :N where N is an
   integer, could support both forms of binding: bind_param(:1,$v) and
   execute($v)
   It's not dis-allowed. Driver docs should clarify this issue.
 
  Is it really your intention that to bind named parameter fred as in
 the
  SQL insert into xxx values(:fred) you call bind_param(:fred,$v)?

 That's the way DBD::Oracle has always done it.

  As it happens DBD::ODBC has a bug in its support of named parameters
 (other
  than :1, :2 etc) which means it did not work at all but it ALSO expects
 the
  name parameter :fred above to be passed to bind_param as fred i.e.
 the
  leading ':' is treated as an introducer and not part of the parameter
 name.
  I believe, but am prepared to be put right, other non-perl database
 drivers
  also drop the ':' when binding.

 Any other driver authors/users care to comment?


DBD::Informix doesn't accept named or numbered placeholders because of the
pain and grief involved in parsing the SQL accurately to distinguish between
dbase:table and a named place holder, or betwen DATETIME(23:34:49) HOUR TO
SECOND and two numbered placeholders.

I may yet end up revisiting that restriction - there are moves afoot in the
Tcl/Tk world to provide a Tcl-TDBC module to replace the per-DBMS specific
stuff (basically, what DBI started a decade and more ago, and which Python
and PHP have since adopted, and now Tcl/Tk too).  However, as I mentioned,
it will involve some fairly ugly parsing issues - it would require the
DBD::Informix driver to understand a lot of syntax that frankly no driver
code should have to deal with.

The use of column::INTEGER casts is relatively easy to disambiguate.  The
DATETIME notation can be dealt with with a sufficiently context sensitive
parser that treats the parenthesized expression as a single string.  I'm not
wholly sure what heuristics to use when distinguishing :name notation.  In
Informix, there has to be a database name preceding the colon for the
database:table (or database:owner.table) cases; obviously, depending on
context, there could also be various .column extensions after the table
name.  It may be sufficient to look for words before or after the :name,
but  spacing is not definitive -- although it is conventionally written with
no spaces, dbase : table . column is perfectly OK, and comments or newlines
could appear between any of those elements, and so on and so forth.  And
database names are not necessarily restricted to avoid keywords -- you could
(hypothetically, but insanely) have a database called 'where' leading to
problems with WHERE where:table.column = :where ,,, which has a placeholder
named :where and does not have a placeholder called :table.  But a
simple-minded parse of the SQL would pick up two placeholders.  And I'm not
sure whether the amenity gained by named placeholders warrants the pain of
writing enough of an SQL parser to do this job.

 As it didn't work before I can change it to be either - just let me know.

 I guess the colon could be made optional without any harm.


Optional colon makes sense - the preferred notation should be documented
(probably without colon).

-- 
Jonathan Leffler [EMAIL PROTECTED] #include disclaimer.h
Guardian of DBD::Informix - v2008.0229 - http://dbi.perl.org
Blessed are we who can laugh at ourselves, for we shall never cease to be
amused.