And I immediately hit another little roadblock:
Transaction isolation level TRANSACTION_REPEATABLE_READ is not supported.
Default (TRANSACTION_NONE) will be used instead.
0: jdbc:calcite:schemaType=JDBC> !tables
+-----------+-------------+------------+--------------+---------+----------+------------+-----------+---------------------------+----------------+
| TABLE_CAT | TABLE_SCHEM | TABLE_NAME |  TABLE_TYPE  | REMARKS | TYPE_CAT
| TYPE_SCHEM | TYPE_NAME | SELF_REFERENCING_COL_NAME | REF_GENERATION |
+-----------+-------------+------------+--------------+---------+----------+------------+-----------+---------------------------+----------------+
|           | adhoc       | customer   | TABLE        |         |
 |            |           |                           |                |
|           | adhoc       | dim_date   | TABLE        |         |
 |            |           |                           |                |
|           | adhoc       | lineorder  | TABLE        |         |
 |            |           |                           |                |
|           | adhoc       | part       | TABLE        |         |
 |            |           |                           |                |
|           | adhoc       | supplier   | TABLE        |         |
 |            |           |                           |                |
|           | metadata    | COLUMNS    | SYSTEM TABLE |         |
 |            |           |                           |                |
|           | metadata    | TABLES     | SYSTEM TABLE |         |
 |            |           |                           |                |
+-----------+-------------+------------+--------------+---------+----------+------------+-----------+---------------------------+----------------+
0: jdbc:calcite:schemaType=JDBC> select count(*) from lineorder where
LO_OrderDateKey=19980101;
log4j:WARN No appenders could be found for logger
(org.apache.calcite.sql.parser).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for
more info.
Error: Error while executing SQL "select count(*) from lineorder where
LO_OrderDateKey=19980101": From line 1, column 22 to line 1, column 30:
Object 'LINEORDER' not found within 'adhoc'; did you mean 'lineorder'?
(state=,code=0)

So two issues here.  1) MySQL does support REPEATABLE-READ and 2) it is
case sensitive by default.  Is there something I need to change to make
Calcite respect the case in which I enter literals?

I can work around issue two by enclosing my table and column names in
double quotes, which is fine for testing, but I would like it to respect
the case of the tables and columns without using literals.

Any suggestions?

On Thu, Oct 7, 2021 at 4:08 PM Justin Swanhart <greenl...@gmail.com> wrote:

> 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