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 > >>>>> > >>>>> > >>> > >>> > >