I checked
https://docs.oracle.com/javase/7/docs/api/java/sql/Wrapper.html#isWrapperFor(java.lang.Class),
and it mentions interface in multiple places, but it doesn't say explicitly
that it should throw if the provided argument is not an interface. And I
guess Oracle driver chose to enforce this strictly by throwing an exception
instead of returning false?



On Thu, May 14, 2020 at 12:31 PM Julian Hyde <jh...@apache.org> wrote:

> That sounds like a bug in Avatica. I was not aware that in
> 'isWrapperFor(Class<?> iface)', 'iface' had to be an interface, and
> had assumed the driver would just return 'false'.
>
> Can you please log it?
>
> A solution would be to create an interface in Avatica for
> AvaticaPreparedStatement. (It seems that the 'handle' field is the
> only thing that we need from it.)
>
> Julian
>
> On Thu, May 14, 2020 at 8:53 AM Thierry Rolland
> <thierry.roll...@dalim.com> wrote:
> >
> > Hello all,
> >
> >
> > I'm trying calcite avatica v1.16.0 which seems to be a very great tool.
> >
> > I tried with a postgresql database and that works very fine (I used the
> > provided docker standalone server for my tests)
> >
> >
> > Now, I'm trying with an oracle database (v19c) and like for postgresql,
> > I'm using a docker standalone server.
> >
> > I'm running on an openJDK11 and I have a problem related to the Oracle
> > jdbc driver (ojdbc10.jar) which throws an SQLException if the input
> > parameter of the method */isWrapperFor/* is not a java interface :
> >
> >
> > java.lang.RuntimeException: java.sql.SQLException: Object does not wrap
> > anything with requested interface
> >          at
> > org.apache.calcite.avatica.jdbc.JdbcMeta.propagate(JdbcMeta.java:700)
> >          at
> > org.apache.calcite.avatica.jdbc.JdbcMeta.prepare(JdbcMeta.java:726)
> >          at
> >
> org.apache.calcite.avatica.remote.LocalService.apply(LocalService.java:195)
> >          at
> >
> org.apache.calcite.avatica.remote.Service$PrepareRequest.accept(Service.java:1215)
> >          at
> >
> org.apache.calcite.avatica.remote.Service$PrepareRequest.accept(Service.java:1186)
> >          at
> >
> org.apache.calcite.avatica.remote.AbstractHandler.apply(AbstractHandler.java:94)
> >          at
> > org.apache.calcite.avatica.remote.JsonHandler.apply(JsonHandler.java:52)
> >          at
> >
> org.apache.calcite.avatica.server.AvaticaJsonHandler.handle(AvaticaJsonHandler.java:129)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:61)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.server.Server.handle(Server.java:502)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
> >          at
> >
> org.apache.calcite.avatica.standalone.shaded.org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
> >          at java.lang.Thread.run(Thread.java:748)
> > *Caused by: java.sql.SQLException: Object does not wrap anything with
> > requested interface**
> > **        at
> >
> oracle.jdbc.driver.OracleStatementWrapper.isWrapperFor(OracleStatementWrapper.java:487)**
> > **        at
> > org.apache.calcite.avatica.jdbc.JdbcMeta.prepare(JdbcMeta.java:711)*
> >          ... 22 more
> >
> >
> >
> > In the corresponding source code of */JdbcMeta.java/*, the input
> > parameter of the method /*isWrapperFor* /is the abstract
> > class/*AvaticaPreparedStatement* /(which is not a java interface) /:
> > /
> >
> >
> > Meta.StatementTypestatementType= null;
> > if(statement.isWrapperFor(AvaticaPreparedStatement.class)) {
> > finalAvaticaPreparedStatementavaticaPreparedStatement;
> >
> >
> >
> >
> > Does someone have an idea how to solve this problem ?
> >
> > Thank you in advance.
> >
> > Thierry
> >
> >
> >
> >
> >
> >
> >
> >
>

Reply via email to