Hi,

I had to really go down a rabbit hole here to figure out exactly what was
wrong (see below) but I was able to resolve the problem by adding the
following to core/build.gradle.kts:
implementation(files("/home/justin/testing/calcite/mysql-connector-java.jar"))

It seems that the environmental CLASSPATH is not incorporated into the path
stored in the .jar file.  I ended up compiling a custom version of dbcp2
that printed out the list of available JDBC drivers and the MySQL driver
was not listed.  After adding it to the gradle file, the CLASSPATH was set
correctly and the list included the MySQL driver.  I reverted all my
changes except the one to core/build.gradle.kts and it works.

I assume this is the right thing to do, but if not, let me know.

On Wed, Oct 6, 2021 at 3:16 PM Justin Swanhart <greenl...@gmail.com> wrote:

> [justin@localhost calcite]$ cat ../calcite.old/test.json
> {
>   version: '1.0',
>   defaultSchema: 'ssb',
>   schemas: [
>     {
>       name: 'ssb',
>       type: 'custom',
>       factory: 'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',
>       operand: {
>         jdbcUrl: 'jdbc:mysql://localhost/ssb',
>         jdbcUser: 'root',
>         jdbcPassword: ''
>       }
>     }
>   ]
> }
>
> On Wed, Oct 6, 2021 at 3:15 PM Justin Swanhart <greenl...@gmail.com>
> wrote:
>
>> Caused by: com.google.common.util.concurrent.UncheckedExecutionException:
>> java.lang.RuntimeException: java.sql.SQLException: Cannot create JDBC
>> driver of class '' for connect URL 'jdbc:mysql://localhost/ssb'
>>
>> On Wed, Oct 6, 2021 at 3:14 PM Julian Hyde <jhyde.apa...@gmail.com>
>> wrote:
>>
>>> What happens if you remove the line
>>>
>>>       jdbcDriver: 'com.mysql.cj.jdbc.Driver’,
>>>
>>> from your Calcite model? Hopefully, it just works. Most drivers load
>>> automatically these days, and if you don’t specify the class name, Calcite
>>> won’t try to load it manually.
>>>
>>> > On Oct 6, 2021, at 12:07 PM, Justin Swanhart <greenl...@gmail.com>
>>> wrote:
>>> >
>>> > Hi,
>>> >
>>> > So the example from MySQL is:
>>> > [justin@localhost calcite.old]$ cat LoadDriver.java
>>> > import java.sql.Connection;
>>> > import java.sql.DriverManager;
>>> > import java.sql.SQLException;
>>> >
>>> > // Notice, do not import com.mysql.jdbc.*
>>> > // or you will have problems!
>>> >
>>> > public class LoadDriver {
>>> >    public static void main(String[] args) {
>>> >    // The newInstance() call is a work around for some
>>> >    // broken Java implementations
>>> >      try{
>>> >              Class.forName("com.mysql.jdbc.Driver").newInstance();
>>> >      } catch(Exception ex) {
>>> >    }
>>> >  }
>>> > }
>>> >
>>> > The code ignores an exception that is thrown when using .newInstance().
>>> > The program outputs:
>>> > Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new
>>> driver
>>> > class is `com.mysql.cj.jdbc.Driver'. The driver is automatically
>>> registered
>>> > via the SPI and manual loading of the driver class is generally
>>> unnecessary.
>>> > (it outputs nothing if the new driver name is used)
>>> >
>>> > So it seems that the MySQL driver throws an exception when used this
>>> way
>>> > that has to be ignored, and Calcite is not ignoring it?
>>> >
>>> > If that is the case, it seems like a problem with the MySQL driver,
>>> but I
>>> > just want to confirm with you before I go report a bug and look silly
>>> :)
>>> >
>>> > On Wed, Oct 6, 2021 at 2:59 PM Justin Swanhart <greenl...@gmail.com>
>>> wrote:
>>> >
>>> >> Hi,
>>> >>
>>> >> The class.forName doesn't work for me though (tried
>>> >> org.mysql.cj.jdbc.Driver and org.mysql.jdbc.Driver), but just using a
>>> >> "jdbc:mysql://" connection string does work.
>>> >>
>>> >> It makes sense that class.forName throws the same exception for me as
>>> >> Calcite, but I don't understand why just using a connection string
>>> works,
>>> >> so I am really confused.  I assume some other class name is being
>>> used when
>>> >> I just use the connection string, but I don't know how to figure out
>>> what
>>> >> that class name is.
>>> >>
>>> >> On Wed, Oct 6, 2021 at 2:55 PM Julian Hyde <jhyde.apa...@gmail.com>
>>> wrote:
>>> >>
>>> >>> Does your environment use shading? Maybe Class.forName with a
>>> constant
>>> >>> argument is handled by the shading, but Calcite is calling
>>> Class.forName
>>> >>> with a dynamic argument.
>>> >>>
>>> >>>> On Oct 6, 2021, at 11:41 AM, Justin Swanhart <greenl...@gmail.com>
>>> >>> wrote:
>>> >>>>
>>> >>>> Hi,
>>> >>>>
>>> >>>> The jar is in the classpath, and I can run the java command that the
>>> >>>> sqlline script runs directly, and I get the same error.
>>> >>>>
>>> >>>> The following works in a test java program with the CLASSPATH set:
>>> >>>>
>>> >>>>   conn =
>>> >>>>      DriverManager.getConnection("jdbc:mysql://localhost/ssb?" +
>>> >>>>                                  "user=root");
>>> >>>> I can create a resultset from a SELECT statement and fetch the
>>> results.
>>> >>>>
>>> >>>> But this does not (throws ClassNotFound exception):
>>> >>>> Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
>>> >>>> neither does
>>> >>>> Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
>>> >>>>
>>> >>>> I am confused, because the JDBC connection works as long as I don't
>>> use
>>> >>>> Class.forName.  I don't know how to figure out the name of the class
>>> >>> that
>>> >>>> is actually being used.  I'm sorry if this is silly, but I do not
>>> have
>>> >>> much
>>> >>>> java experience.  The MySQL documentation says to use
>>> >>>> com.mysql.cj.jdbc.Driver:
>>> >>>>
>>> >>>
>>> https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-connect-drivermanager.html
>>> >>>>
>>> >>>> I suppose this is some kind of MySQL JDBC problem, so this may not
>>> be
>>> >>> the
>>> >>>> right mailing list, but if you have any suggestions before I start
>>> >>> looking
>>> >>>> elsewhere, I would appreciate it.
>>> >>>>
>>> >>>> On Wed, Oct 6, 2021 at 1:59 PM Julian Hyde <jhyde.apa...@gmail.com>
>>> >>> wrote:
>>> >>>>
>>> >>>>> It looks as if com.mysql.cj.jdbc.Driver is not on your class path.
>>> >>>>>
>>> >>>>> If you are launching via SQLLine, you will need to edit the sqlline
>>> >>> shell
>>> >>>>> script to add a jar (or jars) to your class path.
>>> >>>>>
>>> >>>>> Julian
>>> >>>>>
>>> >>>>>
>>> >>>>>> On Oct 6, 2021, at 10:43 AM, Justin Swanhart <greenl...@gmail.com
>>> >
>>> >>>>> wrote:
>>> >>>>>>
>>> >>>>>> I am probably making some obvious mistake, but I am having a
>>> problem
>>> >>>>>> getting a simple MySQL JDBC connection working.
>>> >>>>>>
>>> >>>>>> I have the latest version of the Connector/J MySQL java client
>>> >>> driver.  I
>>> >>>>>> have a MySQL 8 server running on the local machine, and the
>>> following
>>> >>>>> model
>>> >>>>>> JSON:
>>> >>>>>> {
>>> >>>>>> version: '1.0',
>>> >>>>>> defaultSchema: 'ssb',
>>> >>>>>> schemas: [
>>> >>>>>>  {
>>> >>>>>>    name: 'ssb',
>>> >>>>>>    type: 'custom',
>>> >>>>>>    factory: 'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',
>>> >>>>>>    operand: {
>>> >>>>>>      jdbcDriver: 'com.mysql.cj.jdbc.Driver',
>>> >>>>>>      jdbcUrl: 'jdbc:mysql://localhost/ssb',
>>> >>>>>>      jdbcUser: 'root',
>>> >>>>>>      jdbcPassword: ''
>>> >>>>>>    }
>>> >>>>>>  }
>>> >>>>>> ]
>>> >>>>>> }
>>> >>>>>>
>>> >>>>>> I have the MySQL driver in my CLASSPATH. I can compile a simple
>>> test
>>> >>>>>> program which verifies that the class com.mysql.jdbc.Driver
>>> exists.
>>> >>>>>>
>>> >>>>>> While the test program works, sqlline does not:
>>> >>>>>> $ ./sqlline -d com.mysql.cj.jdbc.Driver -u
>>> jdbc:mysql://root@localhost
>>> >>>>> /ssb
>>> >>>>>> Building Apache Calcite 1.28.0-SNAPSHOT
>>> >>>>>> scan complete in 1ms
>>> >>>>>> Could not find driver com.mysql.cj.jdbc.Driver
>>> >>>>>>
>>> >>>>>> Any suggestions about what I might be doing wrong?
>>> >>>>>>
>>> >>>>>> Using the !connect command yields a large backtrace (while
>>> probably
>>> >>> not
>>> >>>>>> useful, included for completeness):
>>> >>>>>> sqlline version 1.11.0
>>> >>>>>> sqlline> !connect jdbc:calcite:model=test.json admin admin
>>> >>>>>> WARNING: An illegal reflective access operation has occurred
>>> >>>>>> WARNING: Illegal reflective access by
>>> com.google.protobuf.UnsafeUtil
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> (file:/home/justin/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/3.6.1/d06d46ecfd92ec6d0f3b423b4cd81cb38d8b924/protobuf-java-3.6.1.jar)
>>> >>>>>> to field java.nio.Buffer.address
>>> >>>>>> WARNING: Please consider reporting this to the maintainers of
>>> >>>>>> com.google.protobuf.UnsafeUtil
>>> >>>>>> WARNING: Use --illegal-access=warn to enable warnings of further
>>> >>> illegal
>>> >>>>>> reflective access operations
>>> >>>>>> WARNING: All illegal access operations will be denied in a future
>>> >>> release
>>> >>>>>> java.lang.RuntimeException: Error instantiating
>>> >>>>> JsonCustomSchema(name=ssb)
>>> >>>>>> at
>>> org.apache.calcite.model.ModelHandler.visit(ModelHandler.java:277)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.calcite.model.JsonCustomSchema.accept(JsonCustomSchema.java:66)
>>> >>>>>> at
>>> org.apache.calcite.model.ModelHandler.visit(ModelHandler.java:200)
>>> >>>>>> at
>>> org.apache.calcite.model.ModelHandler.<init>(ModelHandler.java:106)
>>> >>>>>> at
>>> org.apache.calcite.jdbc.Driver$1.onConnectionInit(Driver.java:101)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.calcite.avatica.UnregisteredDriver.connect(UnregisteredDriver.java:139)
>>> >>>>>> at sqlline.DatabaseConnection.connect(DatabaseConnection.java:135)
>>> >>>>>> at
>>> >>> sqlline.DatabaseConnection.getConnection(DatabaseConnection.java:192)
>>> >>>>>> at sqlline.Commands.connect(Commands.java:1481)
>>> >>>>>> at sqlline.Commands.connect(Commands.java:1355)
>>> >>>>>> at
>>> >>>
>>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
>>> >>>>>> Method)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>> >>>>>> at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> sqlline.ReflectiveCommandHandler.execute(ReflectiveCommandHandler.java:44)
>>> >>>>>> at sqlline.SqlLine.dispatch(SqlLine.java:818)
>>> >>>>>> at sqlline.SqlLine.begin(SqlLine.java:596)
>>> >>>>>> at sqlline.SqlLine.start(SqlLine.java:269)
>>> >>>>>> at sqlline.SqlLine.main(SqlLine.java:208)
>>> >>>>>> Caused by:
>>> >>> com.google.common.util.concurrent.UncheckedExecutionException:
>>> >>>>>> java.lang.RuntimeException: java.sql.SQLException: Cannot load
>>> JDBC
>>> >>>>> driver
>>> >>>>>> class 'com.mysql.cj.jdbc.Driver'
>>> >>>>>> at
>>> >>> com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2051)
>>> >>>>>> at com.google.common.cache.LocalCache.get(LocalCache.java:3951)
>>> >>>>>> at
>>> com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4964)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.calcite.adapter.jdbc.JdbcUtils$DialectPool.get(JdbcUtils.java:116)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.calcite.adapter.jdbc.JdbcSchema.createDialect(JdbcSchema.java:200)
>>> >>>>>> at
>>> >>>
>>> org.apache.calcite.adapter.jdbc.JdbcSchema.create(JdbcSchema.java:136)
>>> >>>>>> at
>>> >>>
>>> org.apache.calcite.adapter.jdbc.JdbcSchema.create(JdbcSchema.java:123)
>>> >>>>>> at
>>> >>>
>>> org.apache.calcite.adapter.jdbc.JdbcSchema.create(JdbcSchema.java:175)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.calcite.adapter.jdbc.JdbcSchema$Factory.create(JdbcSchema.java:570)
>>> >>>>>> at
>>> org.apache.calcite.model.ModelHandler.visit(ModelHandler.java:272)
>>> >>>>>> ... 18 more
>>> >>>>>> Caused by: java.lang.RuntimeException: java.sql.SQLException:
>>> Cannot
>>> >>> load
>>> >>>>>> JDBC driver class 'com.mysql.cj.jdbc.Driver'
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.calcite.adapter.jdbc.JdbcUtils$DialectPool.dialect(JdbcUtils.java:101)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> com.google.common.cache.CacheLoader$FunctionToCacheLoader.load(CacheLoader.java:165)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3529)
>>> >>>>>> at
>>> >>>>>
>>> >>>
>>> com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2155)
>>> >>>>>> at
>>> >>> com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045)
>>> >>>>>> ... 29 more
>>> >>>>>> Caused by: java.sql.SQLException: Cannot load JDBC driver class
>>> >>>>>> 'com.mysql.cj.jdbc.Driver'
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.commons.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:489)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:599)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:809)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.calcite.adapter.jdbc.JdbcUtils$DialectPool.dialect(JdbcUtils.java:94)
>>> >>>>>> ... 34 more
>>> >>>>>> Caused by: java.lang.ClassNotFoundException:
>>> com.mysql.cj.jdbc.Driver
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
>>> >>>>>> at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
>>> >>>>>> at
>>> >>>>>>
>>> >>>>>
>>> >>>
>>> org.apache.commons.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:483)
>>> >>>>>> ... 37 more
>>> >>>>>
>>> >>>>>
>>> >>>
>>> >>>
>>>
>>>

Reply via email to