Glad that solved your problem. Thanks for getting back to us, and for updating 
the StackExchange article. Case-sensitivity issues are one of the main problems 
people run into, and that article will help.

Julian


> On Jun 9, 2016, at 9:43 AM, Dan Payne <[email protected]> wrote:
> 
> I answered my own question on SO so no need for you to do so as well.
> Thanks again for the help!
> 
> On Thu, Jun 9, 2016 at 11:38 AM, Dan Payne <[email protected]> wrote:
> 
>> That worked. I tried several other combinations in case it was a case
>> sensitivity issue but did not try what you suggested. Now that I see it, it
>> seems obvious. Thanks for the help. Would you like to update the
>> StackOverflow thread or do I (new to SO too).
>> 
>> On Wed, Jun 8, 2016 at 5:41 PM, Julian Hyde <[email protected]> wrote:
>> 
>>> Can you try
>>> 
>>> ResultSet rs = stmt3.executeQuery("select * from db1.\”table1\"”);
>>> 
>>> I don’t recall PostgreSQL’s case-sensitivity policy, but if table1 is
>>> lower-case in PostgreSQL’s catalog then it will be lower-case in Calcite’s
>>> too. Calcite’s default case-sensitity policy, like Oracle’s, is to convert
>>> unquoted identifiers to upper-case, so in your original query
>>> 
>>> ResultSet rs = stmt3.executeQuery("select * from db1.table1”);
>>> 
>>> it will be looking for TABLE1 in schema DB1.
>>> 
>>> Julian
>>> 
>>> PS I noticed that you asked the same question on SO.
>>> http://stackoverflow.com/questions/37683607/calcite-table-not-found-when-using-postgres
>>> <
>>> http://stackoverflow.com/questions/37683607/calcite-table-not-found-when-using-postgres>
>>> I’m not going to carry on the same conversation in two threads, but let’s
>>> be sure to update SO when we find an answer.
>>> 
>>>> On Jun 8, 2016, at 8:45 AM, Dan Payne <[email protected]> wrote:
>>>> 
>>>> I'm new to Calcite and trying to query across multiple databases in
>>>> Postgres. But first I'm just trying to get a simple use case working
>>> where
>>>> I query a single Postgres DB via Calcite and JDBC. However, any 'select'
>>>> query executed against Postgres always throws an exception with 'table x
>>>> not found'. I modeled my code after this Calcite test class that queries
>>>> across two datasources in Hsqldb:
>>>> 
>>>> 
>>> https://github.com/apache/calcite/blob/master/core/src/test/java/org/apache/calcite/test/MultiJdbcSchemaJoinTest.java
>>>> 
>>>> 
>>>> When I run that test everything works fine. However, when I change it to
>>>> use Postgres instead, I get the 'table not found' error.
>>>> 
>>>> I'm using Mac OS X 10.11.5, Calcite 1.7.0, Postgres 9.5.2.0 and Java
>>>> 1.8.0_77.
>>>> 
>>>> I boiled the test case and my code down to just the minimum which
>>>> demonstrates the issue. The class is below and pom file follows and then
>>>> finally the error itself. Any help is much appreciated.
>>>> 
>>>> package org.apache.calcite;
>>>> 
>>>> import java.sql.Connection;
>>>> import java.sql.DriverManager;
>>>> import java.sql.ResultSet;
>>>> import java.sql.SQLException;
>>>> import java.sql.Statement;
>>>> 
>>>> import javax.sql.DataSource;
>>>> 
>>>> import org.apache.calcite.adapter.jdbc.JdbcSchema;
>>>> import org.apache.calcite.jdbc.CalciteConnection;
>>>> import org.apache.calcite.schema.SchemaPlus;
>>>> 
>>>> /**
>>>> * This class demonstrates Calcite unable to recognize tables in Postgres
>>>> on
>>>> * Mac OS X 10.11.5 with Calcite 1.7.0, Postgres 9.5.2.0 and Java
>>> 1.8.0_77.
>>>> *
>>>> * Before you run this class, you must create the user and database in
>>>> * Postgres by executing the following SQL:
>>>> *
>>>> *    create user johnsnow with password 'password';
>>>> *    create database db1 with owner johnsnow;
>>>> *
>>>> */
>>>> public class TableNotFoundMain {
>>>>   public static void main(String... args) throws SQLException,
>>>> ClassNotFoundException {
>>>>       final String dbUrl = "jdbc:postgresql://localhost/db1";
>>>> 
>>>>       Connection con = DriverManager.getConnection(dbUrl, "johnsnow",
>>>> "password");
>>>>       Statement stmt1 = con.createStatement();
>>>>       stmt1.execute("drop table if exists table1");
>>>>       stmt1.execute("create table table1(id varchar not null primary
>>> key,
>>>> field1 varchar)");
>>>>       stmt1.execute("insert into table1 values('a', 'aaaa')");
>>>>       con.close();
>>>> 
>>>>       Connection connection =
>>>> DriverManager.getConnection("jdbc:calcite:");
>>>>       CalciteConnection calciteConnection =
>>>> connection.unwrap(CalciteConnection.class);
>>>>       SchemaPlus rootSchema = calciteConnection.getRootSchema();
>>>>       final DataSource ds = JdbcSchema.dataSource(dbUrl,
>>>> "org.postgresql.Driver", "johnsnow", "password");
>>>>       rootSchema.add("DB1", JdbcSchema.create(rootSchema, "DB1", ds,
>>>> null, null));
>>>> 
>>>>       Statement stmt3 = connection.createStatement();
>>>>       ResultSet rs = stmt3.executeQuery("select * from db1.table1");
>>>> 
>>>>       while (rs.next()) {
>>>>           System.out.println(rs.getString(1) + '=' + rs.getString(2));
>>>>       }
>>>>   }
>>>> }
>>>> 
>>>> 
>>>> <project xmlns="http://maven.apache.org/POM/4.0.0"; xmlns:xsi="
>>>> http://www.w3.org/2001/XMLSchema-instance";
>>>>   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
>>>> http://maven.apache.org/xsd/maven-4.0.0.xsd";>
>>>>   <modelVersion>4.0.0</modelVersion>
>>>>   <groupId>org.apache</groupId>
>>>>   <artifactId>calcite-table-not-found</artifactId>
>>>>   <version>0.0.1-SNAPSHOT</version>
>>>> 
>>>>   <dependencies>
>>>>       <dependency>
>>>>           <groupId>org.apache.calcite</groupId>
>>>>           <artifactId>calcite-core</artifactId>
>>>>           <version>1.7.0</version>
>>>>       </dependency>
>>>>       <dependency>
>>>>           <groupId>org.postgresql</groupId>
>>>>           <artifactId>postgresql</artifactId>
>>>>           <version>9.4.1208.jre7</version>
>>>>       </dependency>
>>>>   </dependencies>
>>>> </project>
>>>> 
>>>> Exception in thread "main" java.sql.SQLException: Error while executing
>>> SQL
>>>> "select * from db1.table1": From line 1, column 15 to line 1, column 24:
>>>> Table 'DB1.TABLE1' not found
>>>>   at org.apache.calcite.avatica.Helper.createException(Helper.java:56)
>>>>   at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
>>>>   at
>>>> 
>>> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:143)
>>>>   at
>>>> 
>>> org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:186)
>>>>   at
>>> org.apache.calcite.TableNotFoundMain.main(TableNotFoundMain.java:45)
>>>> Caused by: org.apache.calcite.runtime.CalciteContextException: From
>>> line 1,
>>>> column 15 to line 1, column 24: Table 'DB1.TABLE1' not found
>>>>   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>>> Method)
>>>>   at
>>>> 
>>> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
>>>>   at
>>>> 
>>> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>>>>   at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
>>>>   at
>>>> 
>>> org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
>>>>   at
>>> org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:768)
>>>>   at
>>> org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:753)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:3929)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.IdentifierNamespace.validateImpl(IdentifierNamespace.java:106)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:845)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:831)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:2754)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:2739)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:2957)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:86)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:845)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:831)
>>>>   at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:208)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:807)
>>>>   at
>>>> 
>>> org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:523)
>>>>   at
>>>> 
>>> org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:577)
>>>>   at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:224)
>>>>   at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:193)
>>>>   at
>>>> 
>>> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:720)
>>>>   at
>>>> 
>>> org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:587)
>>>>   at
>>>> 
>>> org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:557)
>>>>   at
>>>> 
>>> org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:214)
>>>>   at
>>>> 
>>> org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:573)
>>>>   at
>>>> 
>>> org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:581)
>>>>   at
>>>> 
>>> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:135)
>>>>   ... 2 more
>>>> Caused by: org.apache.calcite.sql.validate.SqlValidatorException: Table
>>>> 'DB1.TABLE1' not found
>>>>   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>>> Method)
>>>>   at
>>>> 
>>> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
>>>>   at
>>>> 
>>> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>>>>   at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
>>>>   at
>>>> 
>>> org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:405)
>>>>   at org.apache.calcite.runtime.Resources$ExInst.ex(Resources.java:514)
>>>>   ... 29 more
>>> 
>>> 
>> 

Reply via email to