diff --git a/doc/dialects/athena.md b/doc/dialects/athena.md index 2b1cb852b..09120068d 100644 --- a/doc/dialects/athena.md +++ b/doc/dialects/athena.md @@ -43,7 +43,7 @@ You install the adapter script via the special SQL command `CREATE JAVA ADAPTER ```sql CREATE OR REPLACE JAVA ADAPTER SCRIPT ADAPTER.JDBC_ADAPTER AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/bucketfs1/jdbc/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/jdbc/virtualschema-jdbc-adapter-dist-1.15.0.jar; %jar /buckets/bucketfs1/jdbc/AthenaJDBC42-.jar; / ``` diff --git a/doc/dialects/db2.md b/doc/dialects/db2.md index 35a8e4dd0..a86fff45c 100644 --- a/doc/dialects/db2.md +++ b/doc/dialects/db2.md @@ -46,7 +46,7 @@ CREATE or replace JAVA ADAPTER SCRIPT adapter.jdbc_adapter AS // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; // DB2 Driver files %jar /buckets/bucketfs1/bucket1/db2jcc4.jar; diff --git a/doc/dialects/exasol.md b/doc/dialects/exasol.md index 7ecd7c13d..a4db2d0f1 100644 --- a/doc/dialects/exasol.md +++ b/doc/dialects/exasol.md @@ -17,7 +17,7 @@ After uploading the adapter jar, the adapter script can be created as follows: CREATE SCHEMA adapter; CREATE JAVA ADAPTER SCRIPT adapter.jdbc_adapter AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.15.0.jar; / ``` diff --git a/doc/dialects/hive.md b/doc/dialects/hive.md index 2b637b28c..d7622cbbd 100644 --- a/doc/dialects/hive.md +++ b/doc/dialects/hive.md @@ -23,7 +23,7 @@ CREATE SCHEMA adapter; CREATE JAVA ADAPTER SCRIPT jdbc_adapter AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; %jar /buckets/bucketfs1/bucket1/HiveJDBC41.jar; / diff --git a/doc/dialects/impala.md b/doc/dialects/impala.md index d472d61c6..6ec5a45f9 100644 --- a/doc/dialects/impala.md +++ b/doc/dialects/impala.md @@ -22,7 +22,7 @@ CREATE SCHEMA adapter; CREATE JAVA ADAPTER SCRIPT jdbc_adapter AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; %jar /buckets/bucketfs1/bucket1/hive_metastore.jar; %jar /buckets/bucketfs1/bucket1/hive_service.jar; diff --git a/doc/dialects/oracle.md b/doc/dialects/oracle.md index 4fb909238..16a6d2c92 100644 --- a/doc/dialects/oracle.md +++ b/doc/dialects/oracle.md @@ -32,7 +32,7 @@ CREATE JAVA ADAPTER SCRIPT adapter.jdbc_oracle AS // You need to replace `your-bucket-fs` and `your-bucket` to match the actual location // of the adapter jar. - %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.15.0.jar; // Add the oracle jdbc driver to the classpath %jar /buckets/bucketfs1/bucket1/ojdbc7-12.1.0.2.jar diff --git a/doc/dialects/postgresql.md b/doc/dialects/postgresql.md index 6ed909dba..5cb7e1120 100644 --- a/doc/dialects/postgresql.md +++ b/doc/dialects/postgresql.md @@ -15,7 +15,7 @@ CREATE OR REPLACE JAVA ADAPTER SCRIPT adapter.jdbc_adapter // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; // You have to add all files of the data source jdbc driver here (e.g. MySQL or Hive) %jar /buckets/bucketfs1/bucket1/postgresql-42.0.0.jar; diff --git a/doc/dialects/redshift.md b/doc/dialects/redshift.md index e4aa665b9..910a89ac9 100644 --- a/doc/dialects/redshift.md +++ b/doc/dialects/redshift.md @@ -45,7 +45,7 @@ You install the adapter script via the special SQL command `CREATE JAVA ADAPTER ```sql CREATE OR REPLACE JAVA ADAPTER SCRIPT ADAPTER.JDBC_ADAPTER AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/bucketfs1/jdbc/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/jdbc/virtualschema-jdbc-adapter-dist-1.15.0.jar; %jar /buckets/bucketfs1/jdbc/RedshiftJDBC42-.jar; / ``` diff --git a/doc/dialects/sql_server.md b/doc/dialects/sql_server.md index 7794d17d8..78a8c927d 100644 --- a/doc/dialects/sql_server.md +++ b/doc/dialects/sql_server.md @@ -17,7 +17,7 @@ CREATE OR REPLACE JAVA ADAPTER SCRIPT adapter.sql_server_jdbc_adapter // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; // You have to add all files of the data source jdbc driver here %jar /buckets/bucketfs1/bucket1/jtds.jar; diff --git a/doc/dialects/sybase.md b/doc/dialects/sybase.md index edfb504d1..bdbd4fa6a 100644 --- a/doc/dialects/sybase.md +++ b/doc/dialects/sybase.md @@ -18,7 +18,7 @@ CREATE OR REPLACE JAVA ADAPTER SCRIPT adapter.jdbc_adapter AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/bucketfs1/virtualschema/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/virtualschema/virtualschema-jdbc-adapter-dist-1.15.0.jar; %jar /buckets/bucketfs1/virtualschema/jtds-1.3.1.jar; / ``` diff --git a/doc/dialects/teradata.md b/doc/dialects/teradata.md index b3064ec15..209e31429 100644 --- a/doc/dialects/teradata.md +++ b/doc/dialects/teradata.md @@ -22,7 +22,7 @@ CREATE OR REPLACE JAVA ADAPTER SCRIPT adapter.jdbc_adapter // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; // You have to add all files of the data source jdbc driver here (e.g. MySQL or Hive) %jar /buckets/bucketfs1/bucket1/terajdbc4.jar; diff --git a/doc/user-guide/deploying_the_virtual_schema_adapter.md b/doc/user-guide/deploying_the_virtual_schema_adapter.md index b47d30629..ecb7a9801 100644 --- a/doc/user-guide/deploying_the_virtual_schema_adapter.md +++ b/doc/user-guide/deploying_the_virtual_schema_adapter.md @@ -23,7 +23,7 @@ cd virtual-schemas/jdbc-adapter/ mvn clean -DskipTests package ``` -The resulting fat JAR is stored in `virtualschema-jdbc-adapter-dist/target/virtualschema-jdbc-adapter-dist-1.14.0.jar`. +The resulting fat JAR is stored in `virtualschema-jdbc-adapter-dist/target/virtualschema-jdbc-adapter-dist-1.15.0.jar`. ## Uploading the Adapter JAR Archive @@ -42,8 +42,8 @@ Following steps are required to upload a file to a bucket: 1. Now upload the file into this bucket, e.g. using curl (adapt the hostname, BucketFS port, bucket name and bucket write password). ```bash -curl -X PUT -T virtualschema-jdbc-adapter-dist/target/virtualschema-jdbc-adapter-dist-1.14.0.jar \ - http://w:write-password@your.exasol.host.com:2580/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar +curl -X PUT -T virtualschema-jdbc-adapter-dist/target/virtualschema-jdbc-adapter-dist-1.15.0.jar \ + http://w:write-password@your.exasol.host.com:2580/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar ``` See chapter 3.6.4. "The synchronous cluster file system BucketFS" in the EXASolution User Manual for more details about BucketFS. @@ -75,7 +75,7 @@ CREATE JAVA ADAPTER SCRIPT adapter.jdbc_adapter AS // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.15.0.jar; // You have to add all files of the data source jdbc driver here (e.g. Hive JDBC driver files) %jar /buckets/your-bucket-fs/your-bucket/name-of-data-source-jdbc-driver.jar; diff --git a/doc/user-guide/dialects/db2.md b/doc/user-guide/dialects/db2.md index 35a8e4dd0..a86fff45c 100644 --- a/doc/user-guide/dialects/db2.md +++ b/doc/user-guide/dialects/db2.md @@ -46,7 +46,7 @@ CREATE or replace JAVA ADAPTER SCRIPT adapter.jdbc_adapter AS // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; // DB2 Driver files %jar /buckets/bucketfs1/bucket1/db2jcc4.jar; diff --git a/doc/user-guide/dialects/exasol.md b/doc/user-guide/dialects/exasol.md index 7ecd7c13d..a4db2d0f1 100644 --- a/doc/user-guide/dialects/exasol.md +++ b/doc/user-guide/dialects/exasol.md @@ -17,7 +17,7 @@ After uploading the adapter jar, the adapter script can be created as follows: CREATE SCHEMA adapter; CREATE JAVA ADAPTER SCRIPT adapter.jdbc_adapter AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.15.0.jar; / ``` diff --git a/doc/user-guide/dialects/hive.md b/doc/user-guide/dialects/hive.md index 2b637b28c..d7622cbbd 100644 --- a/doc/user-guide/dialects/hive.md +++ b/doc/user-guide/dialects/hive.md @@ -23,7 +23,7 @@ CREATE SCHEMA adapter; CREATE JAVA ADAPTER SCRIPT jdbc_adapter AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; %jar /buckets/bucketfs1/bucket1/HiveJDBC41.jar; / diff --git a/doc/user-guide/dialects/impala.md b/doc/user-guide/dialects/impala.md index d472d61c6..6ec5a45f9 100644 --- a/doc/user-guide/dialects/impala.md +++ b/doc/user-guide/dialects/impala.md @@ -22,7 +22,7 @@ CREATE SCHEMA adapter; CREATE JAVA ADAPTER SCRIPT jdbc_adapter AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; %jar /buckets/bucketfs1/bucket1/hive_metastore.jar; %jar /buckets/bucketfs1/bucket1/hive_service.jar; diff --git a/doc/user-guide/dialects/oracle.md b/doc/user-guide/dialects/oracle.md index 4fb909238..16a6d2c92 100644 --- a/doc/user-guide/dialects/oracle.md +++ b/doc/user-guide/dialects/oracle.md @@ -32,7 +32,7 @@ CREATE JAVA ADAPTER SCRIPT adapter.jdbc_oracle AS // You need to replace `your-bucket-fs` and `your-bucket` to match the actual location // of the adapter jar. - %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/your-bucket-fs/your-bucket/virtualschema-jdbc-adapter-dist-1.15.0.jar; // Add the oracle jdbc driver to the classpath %jar /buckets/bucketfs1/bucket1/ojdbc7-12.1.0.2.jar diff --git a/doc/user-guide/dialects/postgresql.md b/doc/user-guide/dialects/postgresql.md index 6ed909dba..5cb7e1120 100644 --- a/doc/user-guide/dialects/postgresql.md +++ b/doc/user-guide/dialects/postgresql.md @@ -15,7 +15,7 @@ CREATE OR REPLACE JAVA ADAPTER SCRIPT adapter.jdbc_adapter // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; // You have to add all files of the data source jdbc driver here (e.g. MySQL or Hive) %jar /buckets/bucketfs1/bucket1/postgresql-42.0.0.jar; diff --git a/doc/user-guide/dialects/redshift.md b/doc/user-guide/dialects/redshift.md index d5826286c..6268966e5 100644 --- a/doc/user-guide/dialects/redshift.md +++ b/doc/user-guide/dialects/redshift.md @@ -21,7 +21,7 @@ CREATE OR REPLACE JAVA ADAPTER SCRIPT adapter.jdbc_adapter // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; // You have to add all files of the data source jdbc driver here (e.g. MySQL or Hive) diff --git a/doc/user-guide/dialects/sql_server.md b/doc/user-guide/dialects/sql_server.md index 7794d17d8..78a8c927d 100644 --- a/doc/user-guide/dialects/sql_server.md +++ b/doc/user-guide/dialects/sql_server.md @@ -17,7 +17,7 @@ CREATE OR REPLACE JAVA ADAPTER SCRIPT adapter.sql_server_jdbc_adapter // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; // You have to add all files of the data source jdbc driver here %jar /buckets/bucketfs1/bucket1/jtds.jar; diff --git a/doc/user-guide/dialects/sybase.md b/doc/user-guide/dialects/sybase.md index edfb504d1..bdbd4fa6a 100644 --- a/doc/user-guide/dialects/sybase.md +++ b/doc/user-guide/dialects/sybase.md @@ -18,7 +18,7 @@ CREATE OR REPLACE JAVA ADAPTER SCRIPT adapter.jdbc_adapter AS %scriptclass com.exasol.adapter.jdbc.JdbcAdapter; - %jar /buckets/bucketfs1/virtualschema/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/virtualschema/virtualschema-jdbc-adapter-dist-1.15.0.jar; %jar /buckets/bucketfs1/virtualschema/jtds-1.3.1.jar; / ``` diff --git a/doc/user-guide/dialects/teradata.md b/doc/user-guide/dialects/teradata.md index b3064ec15..209e31429 100644 --- a/doc/user-guide/dialects/teradata.md +++ b/doc/user-guide/dialects/teradata.md @@ -22,7 +22,7 @@ CREATE OR REPLACE JAVA ADAPTER SCRIPT adapter.jdbc_adapter // This will add the adapter jar to the classpath so that it can be used inside the adapter script // Replace the names of the bucketfs and the bucket with the ones you used. - %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar; + %jar /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar; // You have to add all files of the data source jdbc driver here (e.g. MySQL or Hive) %jar /buckets/bucketfs1/bucket1/terajdbc4.jar; diff --git a/jdbc-adapter/integration-test-data/integration-test-db2.yaml b/jdbc-adapter/integration-test-data/integration-test-db2.yaml index 156eaa551..a290248b4 100644 --- a/jdbc-adapter/integration-test-data/integration-test-db2.yaml +++ b/jdbc-adapter/integration-test-data/integration-test-db2.yaml @@ -5,7 +5,7 @@ general: debugAddress: '192.168.0.12:3000' # Address which will be defined as DEBUG_ADDRESS in the virtual schemas bucketFsUrl: http://exasol-host:2580/bucket1 bucketFsPassword: bucket1 - jdbcAdapterPath: /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar + jdbcAdapterPath: /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar exasol: runIntegrationTests: true diff --git a/jdbc-adapter/integration-test-data/integration-test-sample.yaml b/jdbc-adapter/integration-test-data/integration-test-sample.yaml index 2c9d24e86..4c074a361 100644 --- a/jdbc-adapter/integration-test-data/integration-test-sample.yaml +++ b/jdbc-adapter/integration-test-data/integration-test-sample.yaml @@ -5,7 +5,7 @@ general: debugAddress: '192.168.0.12:3000' # Address which will be defined as DEBUG_ADDRESS in the virtual schemas bucketFsUrl: http://exasol-host:2580/bucket1 bucketFsPassword: bucket1 - jdbcAdapterPath: /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.14.0.jar + jdbcAdapterPath: /buckets/bucketfs1/bucket1/virtualschema-jdbc-adapter-dist-1.15.0.jar exasol: runIntegrationTests: true diff --git a/jdbc-adapter/integration-test-data/integration-test-travis.yaml b/jdbc-adapter/integration-test-data/integration-test-travis.yaml index c24903f69..7fc25e226 100644 --- a/jdbc-adapter/integration-test-data/integration-test-travis.yaml +++ b/jdbc-adapter/integration-test-data/integration-test-travis.yaml @@ -4,7 +4,7 @@ general: debug: false debugAddress: '' bucketFsUrl: http://127.0.0.1:6594/default - jdbcAdapterPath: /buckets/bfsdefault/default/virtualschema-jdbc-adapter-dist-1.14.0.jar + jdbcAdapterPath: /buckets/bfsdefault/default/virtualschema-jdbc-adapter-dist-1.15.0.jar additionalJDBCDriverDir: /vagrant/drivers/ exasol: diff --git a/jdbc-adapter/local/integration-test-config.yaml b/jdbc-adapter/local/integration-test-config.yaml index fb1f2c499..f61ab62fb 100644 --- a/jdbc-adapter/local/integration-test-config.yaml +++ b/jdbc-adapter/local/integration-test-config.yaml @@ -5,7 +5,7 @@ general: debugAddress: '10.44.1.228:3000' # Address which will be defined as DEBUG_ADDRESS in the virtual schemas bucketFsUrl: http://localhost:2580/jars bucketFsPassword: public - jdbcAdapterPath: /buckets/bfsdefault/jars/virtualschema-jdbc-adapter-dist-1.14.0.jar + jdbcAdapterPath: /buckets/bfsdefault/jars/virtualschema-jdbc-adapter-dist-1.15.0.jar exasol: runIntegrationTests: true diff --git a/jdbc-adapter/pom.xml b/jdbc-adapter/pom.xml index 2e83babec..fbe844929 100644 --- a/jdbc-adapter/pom.xml +++ b/jdbc-adapter/pom.xml @@ -10,7 +10,7 @@ virtualschema-jdbc-adapter-dist - 1.14.0 + 1.15.0 UTF-8 UTF-8 1.8 diff --git a/jdbc-adapter/virtualschema-jdbc-adapter/src/main/java/com/exasol/adapter/dialects/oracle/OracleSqlDialect.java b/jdbc-adapter/virtualschema-jdbc-adapter/src/main/java/com/exasol/adapter/dialects/oracle/OracleSqlDialect.java index f68d49878..81e6b2de3 100644 --- a/jdbc-adapter/virtualschema-jdbc-adapter/src/main/java/com/exasol/adapter/dialects/oracle/OracleSqlDialect.java +++ b/jdbc-adapter/virtualschema-jdbc-adapter/src/main/java/com/exasol/adapter/dialects/oracle/OracleSqlDialect.java @@ -51,7 +51,8 @@ public Capabilities getCapabilities() { final Capabilities.Builder builder = Capabilities.builder(); builder.addMain(SELECTLIST_PROJECTION, SELECTLIST_EXPRESSIONS, FILTER_EXPRESSIONS, AGGREGATE_SINGLE_GROUP, AGGREGATE_GROUP_BY_COLUMN, AGGREGATE_GROUP_BY_EXPRESSION, AGGREGATE_GROUP_BY_TUPLE, AGGREGATE_HAVING, - ORDER_BY_COLUMN, ORDER_BY_EXPRESSION, LIMIT, LIMIT_WITH_OFFSET); + ORDER_BY_COLUMN, ORDER_BY_EXPRESSION, LIMIT, LIMIT_WITH_OFFSET, JOIN, JOIN_TYPE_INNER, + JOIN_TYPE_LEFT_OUTER, JOIN_TYPE_RIGHT_OUTER, JOIN_TYPE_FULL_OUTER, JOIN_CONDITION_EQUI); builder.addPredicate(AND, OR, NOT, EQUAL, NOTEQUAL, LESS, LESSEQUAL, LIKE, LIKE_ESCAPE, REGEXP_LIKE, BETWEEN, IN_CONSTLIST, IS_NULL, IS_NOT_NULL); builder.addLiteral(NULL, DATE, TIMESTAMP, TIMESTAMP_UTC, DOUBLE, EXACTNUMERIC, STRING, INTERVAL); diff --git a/jdbc-adapter/virtualschema-jdbc-adapter/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectIT.java b/jdbc-adapter/virtualschema-jdbc-adapter/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectIT.java index 52cc0344d..b5b4249df 100644 --- a/jdbc-adapter/virtualschema-jdbc-adapter/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectIT.java +++ b/jdbc-adapter/virtualschema-jdbc-adapter/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectIT.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import static org.junit.jupiter.api.Assertions.assertAll; import java.io.FileNotFoundException; import java.math.BigDecimal; @@ -17,7 +18,6 @@ import static org.junit.Assert.*; import static org.junit.jupiter.api.Assertions.assertThrows; - @Tag("integration") @ExtendWith(IntegrationTestConfigurationCondition.class) class OracleSqlDialectIT extends AbstractIntegrationTest { @@ -300,52 +300,67 @@ void testSelectNumber3602() throws SQLException { // Join Tests ------------------------------------------------------------- @Test - void innerJoin() throws SQLException { - final String query = String.format("SELECT * FROM %1$s.t1 a INNER JOIN %1$s.t2 b ON a.x=b.x", - VIRTUAL_SCHEMA_ORA); + void testInnerJoin() throws SQLException { + final String query = "SELECT * FROM " + VIRTUAL_SCHEMA_ORA + ".t1 a INNER JOIN " + VIRTUAL_SCHEMA_ORA + + ".t2 b ON a.x=b.x"; + final ResultSet result = executeQuery(query); + assertAll(() -> matchNextRow(result, "2", "bbb", "2", "bbb"), () -> assertFalse(result.next())); + } + + @Test + void testInnerJoinWithProjection() throws SQLException { + final String query = "SELECT b.y || " + VIRTUAL_SCHEMA_JDBC + ".t1.y FROM " + VIRTUAL_SCHEMA_JDBC + + ".t1 INNER JOIN " + VIRTUAL_SCHEMA_JDBC + ".t2 b ON " + VIRTUAL_SCHEMA_JDBC + ".t1.x=b.x"; + final ResultSet result = executeQuery(query); + assertAll(() -> matchNextRow(result, "bbbbbb"), () -> assertFalse(result.next())); + } + + @Test + void testLeftJoin() throws SQLException { + final String query = "SELECT * FROM " + VIRTUAL_SCHEMA_ORA + ".t1 a LEFT OUTER JOIN " + VIRTUAL_SCHEMA_ORA + + ".t2 b ON a.x=b.x ORDER BY a.x"; final ResultSet result = executeQuery(query); - matchNextRow(result, "2", "bbb", "2", "bbb"); - assertFalse(result.next()); + assertAll (() -> matchNextRow(result, "1", "aaa", null, null), + () -> matchNextRow(result, "2", "bbb", "2", "bbb"), + () -> assertFalse(result.next())); } @Test - void innerJoinWithProjection() throws SQLException { - final String query = String.format( - "SELECT b.y || %1$s.t1.y FROM %1$s.t1 INNER JOIN %1$s.t2 b ON %1$s.t1.x=b.x", VIRTUAL_SCHEMA_JDBC); + void testRightJoin() throws SQLException { + final String query = "SELECT * FROM " + VIRTUAL_SCHEMA_JDBC + ".t1 a RIGHT OUTER JOIN " + VIRTUAL_SCHEMA_JDBC + + ".t2 b ON a.x=b.x ORDER BY a.x"; final ResultSet result = executeQuery(query); - matchNextRow(result, "bbbbbb"); - assertFalse(result.next()); + assertAll(() -> matchNextRow(result, "2", "bbb", "2", "bbb"), + () -> matchNextRow(result, null, null, "3", "ccc"), () -> assertFalse(result.next())); } @Test - void leftJoin() throws SQLException { - final String query = String.format( - "SELECT * FROM %1$s.t1 a LEFT OUTER JOIN %1$s.t2 b ON a.x=b.x ORDER BY a.x", VIRTUAL_SCHEMA_ORA); + void testFullOuterJoin() throws SQLException { + final String query = "SELECT * FROM " + VIRTUAL_SCHEMA_ORA + ".t1 a FULL OUTER JOIN " + VIRTUAL_SCHEMA_ORA + + ".t2 b ON a.x=b.x ORDER BY a.x"; final ResultSet result = executeQuery(query); - matchNextRow(result, "1", "aaa", null, null); - matchNextRow(result, "2", "bbb", "2", "bbb"); - assertFalse(result.next()); + assertAll(() -> matchNextRow(result, "1", "aaa", null, null), + () -> matchNextRow(result, "2", "bbb", "2", "bbb"), + () -> matchNextRow(result, null, null, "3", "ccc"), () -> assertFalse(result.next())); } @Test - void rightJoin() throws SQLException { - final String query = String.format( - "SELECT * FROM %1$s.t1 a RIGHT OUTER JOIN %1$s.t2 b ON a.x=b.x ORDER BY a.x", VIRTUAL_SCHEMA_JDBC); + void testRightJoinWithComplexCondition() throws SQLException { + final String query = "SELECT * FROM " + VIRTUAL_SCHEMA_JDBC + ".t1 a RIGHT OUTER JOIN " + VIRTUAL_SCHEMA_JDBC + + ".t2 b ON a.x||a.y=b.x||b.y ORDER BY a.x"; final ResultSet result = executeQuery(query); - matchNextRow(result, "2", "bbb", "2", "bbb"); - matchNextRow(result, null, null, "3", "ccc"); - assertFalse(result.next()); + assertAll(() -> matchNextRow(result, "2", "bbb", "2", "bbb"), + () -> matchNextRow(result, null, null, "3", "ccc"), () -> assertFalse(result.next())); } @Test - void fullOuterJoin() throws SQLException { - final String query = String.format( - "SELECT * FROM %1$s.t1 a FULL OUTER JOIN %1$s.t2 b ON a.x=b.x ORDER BY a.x", VIRTUAL_SCHEMA_ORA); + void testFullOuterJoinWithComplexCondition() throws SQLException { + final String query = "SELECT * FROM " + VIRTUAL_SCHEMA_ORA + ".t1 a FULL OUTER JOIN " + VIRTUAL_SCHEMA_ORA + + ".t2 b ON a.x-b.x=0 ORDER BY a.x"; final ResultSet result = executeQuery(query); - matchNextRow(result, "1", "aaa", null, null); - matchNextRow(result, "2", "bbb", "2", "bbb"); - matchNextRow(result, null, null, "3", "ccc"); - assertFalse(result.next()); + assertAll(() -> matchNextRow(result, "1", "aaa", null, null), + () -> matchNextRow(result, "2", "bbb", "2", "bbb"), + () -> matchNextRow(result, null, null, "3", "ccc"), () -> assertFalse(result.next())); } // Type Tests ------------------------------------------------------------- @@ -366,8 +381,8 @@ void testSelectExpression() throws SQLException { matchNextRowDecimal(result, "12346.12345"); matchNextRowDecimal(result, "12356.12345"); } - runMatchSingleRowExplain(query, - "SELECT CAST((" + TYPE_TEST_T + ".\"C7\" + 1) AS FLOAT) FROM \"" + ORA_TABLE + "\" ORDER BY (" + TYPE_TEST_T + ".\"C7\" + 1)"); + runMatchSingleRowExplain(query, "SELECT CAST((" + TYPE_TEST_T + ".\"C7\" + 1) AS FLOAT) FROM \"" + ORA_TABLE + + "\" ORDER BY (" + TYPE_TEST_T + ".\"C7\" + 1)"); } @Test @@ -378,7 +393,8 @@ void testFilterExpression() throws SQLException { final ResultSet resultORA = runQueryORA(query); matchNextRow(resultORA, "01.2355123450E4"); - runMatchSingleRowExplain(query, "SELECT " + TYPE_TEST_T + ".\"C7\" FROM \"" + ORA_TABLE + "\" WHERE 12346 < " + TYPE_TEST_T + ".\"C7\""); + runMatchSingleRowExplain(query, "SELECT " + TYPE_TEST_T + ".\"C7\" FROM \"" + ORA_TABLE + "\" WHERE 12346 < " + + TYPE_TEST_T + ".\"C7\""); } @Test @@ -387,7 +403,8 @@ void testAggregateSingleGroup() throws SQLException { for (final ResultSet result : runQuery(query)) { matchNextRowDecimal(result, "12345.12345"); } - runMatchSingleRowExplain(query, "SELECT CAST(MIN(" + TYPE_TEST_T + ".\"C7\") AS FLOAT) FROM \"" + ORA_TABLE + "\""); + runMatchSingleRowExplain(query, + "SELECT CAST(MIN(" + TYPE_TEST_T + ".\"C7\") AS FLOAT) FROM \"" + ORA_TABLE + "\""); } @Test @@ -397,8 +414,9 @@ void testAggregateGroupByColumn() throws SQLException { matchNextRowDecimal(result, "123456789012345678901234567890123456", "12345.12345"); matchNextRowDecimal(result, "1234567890.123456789", "12355.12345"); } - runMatchSingleRowExplain(query, "SELECT TO_CHAR(" + TYPE_TEST_T + ".\"C5\"), CAST(MIN(\"TYPE_TEST\".\"C7\") AS FLOAT) FROM \"" + ORA_TABLE - + "\" GROUP BY " + TYPE_TEST_T + ".\"C5\" ORDER BY \"TYPE_TEST\".\"C5\" DESC"); + runMatchSingleRowExplain(query, + "SELECT TO_CHAR(" + TYPE_TEST_T + ".\"C5\"), CAST(MIN(\"TYPE_TEST\".\"C7\") AS FLOAT) FROM \"" + + ORA_TABLE + "\" GROUP BY " + TYPE_TEST_T + ".\"C5\" ORDER BY \"TYPE_TEST\".\"C5\" DESC"); } @Test @@ -408,8 +426,10 @@ void testAggregateGroupByExpression() throws SQLException { matchNextRowDecimal(result, "123456789012345678901234567890123457", "12345.12345"); matchNextRowDecimal(result, "1234567891.123456789", "12355.12345"); } - runMatchSingleRowExplain(query, "SELECT CAST((" + TYPE_TEST_T + ".\"C5\" + 1) AS FLOAT), CAST(MIN(\"TYPE_TEST\".\"C7\") AS FLOAT) FROM \"" - + ORA_TABLE + "\" GROUP BY (" + TYPE_TEST_T + ".\"C5\" + 1) ORDER BY (\"TYPE_TEST\".\"C5\" + 1) DESC"); + runMatchSingleRowExplain(query, + "SELECT CAST((" + TYPE_TEST_T + + ".\"C5\" + 1) AS FLOAT), CAST(MIN(\"TYPE_TEST\".\"C7\") AS FLOAT) FROM \"" + ORA_TABLE + + "\" GROUP BY (" + TYPE_TEST_T + ".\"C5\" + 1) ORDER BY (\"TYPE_TEST\".\"C5\" + 1) DESC"); } @Test @@ -420,8 +440,10 @@ void testAggregateGroupByTuple() throws SQLException { "12345.12345"); matchNextRowDecimal(result, "123456789012345678901234567890123456", "1234567890.123456789", "12355.12345"); } - runMatchSingleRowExplain(query, "SELECT " + TYPE_TEST_T + ".\"C_NUMBER36\", TO_CHAR(\"TYPE_TEST\".\"C5\"), CAST(MIN(\"TYPE_TEST\".\"C7\") AS FLOAT) FROM \"" - + ORA_TABLE + "\" GROUP BY " + TYPE_TEST_T + ".\"C5\", \"TYPE_TEST\".\"C_NUMBER36\" ORDER BY \"TYPE_TEST\".\"C5\" DESC"); + runMatchSingleRowExplain(query, "SELECT " + TYPE_TEST_T + + ".\"C_NUMBER36\", TO_CHAR(\"TYPE_TEST\".\"C5\"), CAST(MIN(\"TYPE_TEST\".\"C7\") AS FLOAT) FROM \"" + + ORA_TABLE + "\" GROUP BY " + TYPE_TEST_T + + ".\"C5\", \"TYPE_TEST\".\"C_NUMBER36\" ORDER BY \"TYPE_TEST\".\"C5\" DESC"); } @Test @@ -430,8 +452,10 @@ void testAggregateHaving() throws SQLException, ClassNotFoundException, FileNotF for (final ResultSet result : runQuery(query)) { matchNextRowDecimal(result, "1234567890.123456789", "12355.12345"); } - runMatchSingleRowExplain(query, "SELECT TO_CHAR(" + TYPE_TEST_T + ".\"C5\"), CAST(MIN(\"TYPE_TEST\".\"C7\") AS FLOAT) FROM \"" + ORA_TABLE - + "\" GROUP BY " + TYPE_TEST_T + ".\"C5\" HAVING 12350 < MIN(\"TYPE_TEST\".\"C7\")"); + runMatchSingleRowExplain(query, + "SELECT TO_CHAR(" + TYPE_TEST_T + ".\"C5\"), CAST(MIN(\"TYPE_TEST\".\"C7\") AS FLOAT) FROM \"" + + ORA_TABLE + "\" GROUP BY " + TYPE_TEST_T + + ".\"C5\" HAVING 12350 < MIN(\"TYPE_TEST\".\"C7\")"); } @Test @@ -441,7 +465,8 @@ void testOrderByColumn() throws SQLException { matchNextRow(result, "aaaaaaaaaaaaaaaaaaaa "); matchNextRow(result, (Object) null); } - runMatchSingleRowExplain(query, "SELECT " + TYPE_TEST_T + ".\"C1\" FROM \"" + ORA_TABLE + "\" ORDER BY " + TYPE_TEST_T + ".\"C1\" DESC NULLS LAST"); + runMatchSingleRowExplain(query, "SELECT " + TYPE_TEST_T + ".\"C1\" FROM \"" + ORA_TABLE + "\" ORDER BY " + + TYPE_TEST_T + ".\"C1\" DESC NULLS LAST"); } @Test @@ -454,7 +479,8 @@ void testOrderByExpression() throws SQLException { matchNextRow(resultORA, "01.2355123450E4"); matchNextRow(resultORA, "01.2345123450E4"); - runMatchSingleRowExplain(query, "SELECT " + TYPE_TEST_T + ".\"C7\" FROM \"" + ORA_TABLE + "\" ORDER BY ABS(" + TYPE_TEST_T + ".\"C7\") DESC"); + runMatchSingleRowExplain(query, "SELECT " + TYPE_TEST_T + ".\"C7\" FROM \"" + ORA_TABLE + "\" ORDER BY ABS(" + + TYPE_TEST_T + ".\"C7\") DESC"); } @Test @@ -467,8 +493,8 @@ void testLimit() throws SQLException { matchNextRow(resultORA, "01.2345123450E4"); matchNextRow(resultORA, "01.2355123450E4"); - runMatchSingleRowExplain(query, "SELECT LIMIT_SUBSELECT.* FROM ( SELECT " + TYPE_TEST_T + ".\"C7\" FROM \"" + ORA_TABLE - + "\" ORDER BY " + TYPE_TEST_T + ".\"C7\" ) LIMIT_SUBSELECT WHERE ROWNUM <= 2"); + runMatchSingleRowExplain(query, "SELECT LIMIT_SUBSELECT.* FROM ( SELECT " + TYPE_TEST_T + ".\"C7\" FROM \"" + + ORA_TABLE + "\" ORDER BY " + TYPE_TEST_T + ".\"C7\" ) LIMIT_SUBSELECT WHERE ROWNUM <= 2"); } @Test @@ -480,8 +506,9 @@ void testLimitOffset() throws SQLException { matchNextRow(resultORA, "01.2355123450E4"); runMatchSingleRowExplain(query, - "SELECT c0 FROM ( SELECT LIMIT_SUBSELECT.*, ROWNUM ROWNUM_SUB FROM ( SELECT " + TYPE_TEST_T + ".\"C7\" AS c0 FROM \"" - + ORA_TABLE + "\" ORDER BY " + TYPE_TEST_T + ".\"C7\" ) LIMIT_SUBSELECT WHERE ROWNUM <= 2 ) WHERE ROWNUM_SUB > 1"); + "SELECT c0 FROM ( SELECT LIMIT_SUBSELECT.*, ROWNUM ROWNUM_SUB FROM ( SELECT " + TYPE_TEST_T + + ".\"C7\" AS c0 FROM \"" + ORA_TABLE + "\" ORDER BY " + TYPE_TEST_T + + ".\"C7\" ) LIMIT_SUBSELECT WHERE ROWNUM <= 2 ) WHERE ROWNUM_SUB > 1"); } @Test @@ -730,7 +757,8 @@ void testIntervalDay() throws SQLException { matchNextRow(result, "+01 11:12:10.123000"); matchNextRow(result, "+02 02:03:04.123456"); } - runMatchSingleRowExplain(query, "SELECT TO_CHAR(" + TYPE_TEST_T + ".\"C17\") FROM \"" + ORA_TABLE + "\" ORDER BY " + TYPE_TEST_T + ".\"C17\""); + runMatchSingleRowExplain(query, "SELECT TO_CHAR(" + TYPE_TEST_T + ".\"C17\") FROM \"" + ORA_TABLE + + "\" ORDER BY " + TYPE_TEST_T + ".\"C17\""); assertEquals("VARCHAR(2000000) UTF8", getColumnType("C17")); } diff --git a/jdbc-adapter/virtualschema-jdbc-adapter/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectTest.java b/jdbc-adapter/virtualschema-jdbc-adapter/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectTest.java index 9d61bf119..eb9027b7a 100644 --- a/jdbc-adapter/virtualschema-jdbc-adapter/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectTest.java +++ b/jdbc-adapter/virtualschema-jdbc-adapter/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectTest.java @@ -56,7 +56,8 @@ void testGetCapabilities() { containsInAnyOrder(SELECTLIST_PROJECTION, SELECTLIST_EXPRESSIONS, FILTER_EXPRESSIONS, AGGREGATE_SINGLE_GROUP, AGGREGATE_GROUP_BY_COLUMN, AGGREGATE_GROUP_BY_EXPRESSION, AGGREGATE_GROUP_BY_TUPLE, AGGREGATE_HAVING, ORDER_BY_COLUMN, ORDER_BY_EXPRESSION, LIMIT, - LIMIT_WITH_OFFSET)), // + LIMIT_WITH_OFFSET, JOIN, JOIN_TYPE_INNER, JOIN_TYPE_LEFT_OUTER, JOIN_TYPE_RIGHT_OUTER, + JOIN_TYPE_FULL_OUTER, JOIN_CONDITION_EQUI)), // () -> assertThat(capabilities.getLiteralCapabilities(), containsInAnyOrder(NULL, DATE, TIMESTAMP, TIMESTAMP_UTC, DOUBLE, EXACTNUMERIC, STRING, INTERVAL)),