Hi -- I've added these as PRs 59070 and 59072 ... thanks in advance to anyone who can take a quick look. Cheers,
Chris. > It's been a very long time since I looked at the Oracle DB support > in APR ... my apologies! > > I bumped into a bug recently (actually, in APR-util 1.5.x but it's > also in APR trunk) where CLOBs are not readable due to a failed > check on the val->type in dbd_oracle_get_entry() in dbd/apr_dbd_oracle.c. > > In the surrounding switch statement, val->type has been determined to > be one of the Oracle SQLT_BLOB or SQLT_CLOB values. Then, to handle > the CLOB case specifically, val->type is tested again but now it is > incorrectly checked against APR_DBD_TYPE_CLOB instead of SQLT_CLOB. > > That always fails, so CLOBs are treated as BLOBs, insufficient > space may be allocated, and then trouble ensues. > > The patch below has been running in production for a long time; > I just never realized I hadn't reported it to the APR list. Again, > my apologies! > > > I also added a patch for the test/dbd.c which enables it to > succeed on Oracle (at least, on our versions of Oracle). The trailing > semicolons in the individual SQL INSERTs otherwise cause Oracle to > issue an ORA-00911 "invalid character" error. > > > I hope these are both relatively uncontroversial! Thanks very much, > > Chris. > > =========================================================================== > --- dbd/apr_dbd_oracle.c.orig 2016-01-19 17:22:12.878414056 -0800 > +++ dbd/apr_dbd_oracle.c 2016-01-19 17:22:45.692414935 -0800 > @@ -1853,7 +1853,7 @@ > break; > } > > - if (val->type == APR_DBD_TYPE_CLOB) { > + if (val->type == SQLT_CLOB) { > #if 1 > /* Is this necessary, or can it be defaulted? */ > sql->status = OCILobCharSetForm(dbd_oracle_env, sql->err, > =========================================================================== > --- test/dbd.c.orig 2016-01-19 17:21:45.370413319 -0800 > +++ test/dbd.c 2016-01-19 17:21:57.510413644 -0800 > @@ -69,11 +69,11 @@ > rv = apr_dbd_query(driver, handle, &nrows, statement); > if (rv) { > const char* stmt[] = { > - "INSERT into apr_dbd_test (col1) values ('foo');", > - "INSERT into apr_dbd_test values ('wibble', 'other', 5);", > - "INSERT into apr_dbd_test values ('wibble', 'nothing', 5);", > - "INSERT into apr_dbd_test values ('qwerty', 'foo', 0);", > - "INSERT into apr_dbd_test values ('asdfgh', 'bar', 1);", > + "INSERT into apr_dbd_test (col1) values ('foo')", > + "INSERT into apr_dbd_test values ('wibble', 'other', 5)", > + "INSERT into apr_dbd_test values ('wibble', 'nothing', 5)", > + "INSERT into apr_dbd_test values ('qwerty', 'foo', 0)", > + "INSERT into apr_dbd_test values ('asdfgh', 'bar', 1)", > NULL > }; > printf("Compound insert failed; trying statements one-by-one\n") ; > =========================================================================== > > -- GPG Key ID: 088335A9 GPG Key Fingerprint: 86CD 3297 7493 75BC F820 6715 F54F E648 0883 35A9