With Oracle having finally come out with native Intel drivers for
MacOS, I tried to install these to get rid of having to use a Rosetta-
ized version of perl to run Oracle things through, but kept running
into a problem where sometimes bind variables would work, and
sometimes I would get things like:
ORA-00911: invalid character (DBD ERROR: error possibly near <*>
indicator at char 77 in '
SELECT
System_User_ID,
'1' Hey
FROM
System_User
WHERE
Login LIKE <*>? ESCAPE '\'
After more investigation, I determined that any query that contained a
literal quote would die like this, and any query that did not was
fine. It seems that there is an error in dbdimp.c where is_literal is
defined as a bool but then used as a char. This triggers the
behavior, at least GCC 4.0.1 on the Mac and possibly other GCC4
platforms, where is_literal will get the value 1, and not the value of
the literal type, so that the end of the literal is never seen. The
following patches this so that the behavior is correct and things work:
*** dbdimp.c.orig Mon Apr 28 12:08:50 2008
--- dbdimp.c Mon Apr 28 12:09:07 2008
***************
*** 1096,1102 ****
{
dTHX;
D_imp_dbh_from_sth;
! bool in_literal = FALSE;
char in_comment = '\0';
char *src, *start, *dest;
phs_t phs_tpl;
--- 1096,1102 ----
{
dTHX;
D_imp_dbh_from_sth;
! char in_literal = '\0';
char in_comment = '\0';
char *src, *start, *dest;
phs_t phs_tpl;
-- Matt