diff --git a/doc/changes/changes_4.0.4.md b/doc/changes/changes_4.0.4.md index 57864780d..e59e478eb 100644 --- a/doc/changes/changes_4.0.4.md +++ b/doc/changes/changes_4.0.4.md @@ -34,4 +34,9 @@ Code name: * Updated com.exasol:test-db-builder-java:1.0.1 to 1.1.0 * Updated com.exasol:hamcrest-resultset-matcher:1.1.1 to 1.2.1 * Updated nl.jqno.equalsverifier:equalsverifier:3.4.3 to 3.5 -* Updated mysql:mysql-connector-java:8.0.21 to 8.0.22 \ No newline at end of file +* Updated mysql:mysql-connector-java:8.0.21 to 8.0.22 +* Updated org.testcontainers:junit-jupiter:1.14.3 to 1.15.0 +* Updated org.testcontainers:mssqlserver:1.14.3 to 1.15.0 +* Updated org.testcontainers:mysql:1.14.3 to 1.15.0 +* Updated org.testcontainers:oracle-xe:1.14.3 to 1.15.0 +* Updated org.testcontainers:postgresql:1.14.3 to 1.15.0 \ No newline at end of file diff --git a/doc/dialects/athena.md b/doc/dialects/athena.md index 2fce620f2..3179869fc 100644 --- a/doc/dialects/athena.md +++ b/doc/dialects/athena.md @@ -28,8 +28,7 @@ You need to specify the following settings when adding the JDBC driver via EXAOp Please refer to the [documentation on configuring JDBC connections to Athena](https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html) for details. IMPORTANT: The latest Athena driver requires to **Disable Security Manager**. -It is necessary because JDBC driver requires Java permissions which we do not grant by default. -Please keep in mind that it's not safe to disable the security manager. +It is necessary because JDBC driver requires Java permissions which we do not grant by default. ## Uploading the JDBC Driver to EXAOperation diff --git a/pom.xml b/pom.xml index 72d0c04ee..e93bc6418 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ 11 3.0.0-M4 6.1.0 - 1.14.3 + 1.15.0 target/site/jacoco/jacoco.xml,target/site/jacoco-it/jacoco.xml diff --git a/src/main/java/com/exasol/adapter/dialects/athena/AthenaIdentifier.java b/src/main/java/com/exasol/adapter/dialects/athena/AthenaIdentifier.java index 8ac34b856..f5e452bc6 100644 --- a/src/main/java/com/exasol/adapter/dialects/athena/AthenaIdentifier.java +++ b/src/main/java/com/exasol/adapter/dialects/athena/AthenaIdentifier.java @@ -1,9 +1,9 @@ package com.exasol.adapter.dialects.athena; -import com.exasol.db.Identifier; - import java.util.Objects; +import com.exasol.db.Identifier; + /** * Represents an identifier in the Athena database. */ @@ -71,8 +71,12 @@ private static boolean validateCharacter(final int codePoint) { @Override public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (!(o instanceof AthenaIdentifier)) { + return false; + } final AthenaIdentifier that = (AthenaIdentifier) o; return Objects.equals(this.id, that.id); } diff --git a/src/main/java/com/exasol/adapter/dialects/athena/AthenaSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/athena/AthenaSqlDialect.java index b2d2fb18f..b0e13e625 100644 --- a/src/main/java/com/exasol/adapter/dialects/athena/AthenaSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/athena/AthenaSqlDialect.java @@ -107,6 +107,7 @@ public boolean requiresSchemaQualifiedTableNames(final SqlGenerationContext cont } @Override + // https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html public String applyQuote(final String identifier) { return AthenaIdentifier.of(identifier).quote(); } @@ -116,6 +117,11 @@ public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_AT_END; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + @Override protected RemoteMetadataReader createRemoteMetadataReader() { try { diff --git a/src/main/java/com/exasol/adapter/dialects/bigquery/BigQueryIdentifier.java b/src/main/java/com/exasol/adapter/dialects/bigquery/BigQueryIdentifier.java deleted file mode 100644 index f35cacf68..000000000 --- a/src/main/java/com/exasol/adapter/dialects/bigquery/BigQueryIdentifier.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.exasol.adapter.dialects.bigquery; - -import java.util.Objects; - -import com.exasol.db.Identifier; - -/** - * Represents an identifier in the BigQuery database. - */ -public class BigQueryIdentifier implements Identifier { - private final String id; - - private BigQueryIdentifier(final String id) { - this.id = id; - } - - /** - * Get the quoted identifier as a {@link String}. - * - * @return quoted identifier - */ - @Override - public String quote() { - return "`" + this.id.replace("`", "\\`") + "`"; - } - - /** - * Create a new {@link BigQueryIdentifier}. - *

- * BigQuery allows any characters when the identifier is quoted. We don't have validations here. - * https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical - *

- * - * @param id the identifier as {@link String} - * @return new {@link BigQueryIdentifier} instance - */ - public static BigQueryIdentifier of(final String id) { - return new BigQueryIdentifier(id); - } - - @Override - public boolean equals(final Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - final BigQueryIdentifier that = (BigQueryIdentifier) o; - return Objects.equals(this.id, that.id); - } - - @Override - public int hashCode() { - return Objects.hash(this.id); - } -} \ No newline at end of file diff --git a/src/main/java/com/exasol/adapter/dialects/bigquery/BigQuerySqlDialect.java b/src/main/java/com/exasol/adapter/dialects/bigquery/BigQuerySqlDialect.java index dce93b6cc..fcb92bae5 100644 --- a/src/main/java/com/exasol/adapter/dialects/bigquery/BigQuerySqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/bigquery/BigQuerySqlDialect.java @@ -126,8 +126,9 @@ public StructureElementSupport supportsJdbcSchemas() { } @Override + // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical public String applyQuote(final String identifier) { - return BigQueryIdentifier.of(identifier).quote(); + return "`" + identifier.replace("`", "\\`") + "`"; } @Override @@ -156,7 +157,7 @@ public String getStringLiteral(final String value) { if (value == null) { return "NULL"; } else { - return "'" + value.replace("'", "\\'") + "'"; + return "'" + value.replace("\\", "\\\\").replace("'", "\\'") + "'"; } } } \ No newline at end of file diff --git a/src/main/java/com/exasol/adapter/dialects/db2/DB2SqlDialect.java b/src/main/java/com/exasol/adapter/dialects/db2/DB2SqlDialect.java index 6f5b9ebbd..d2d3a5a34 100644 --- a/src/main/java/com/exasol/adapter/dialects/db2/DB2SqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/db2/DB2SqlDialect.java @@ -99,10 +99,9 @@ public StructureElementSupport supportsJdbcSchemas() { } @Override - @SuppressWarnings("squid:S1185") // https://www.ibm.com/support/knowledgecenter/SSEPEK_10.0.0/sqlref/src/tpc/db2z_sqlidentifiers.html public String applyQuote(final String identifier) { - return super.applyQuote(identifier); + return super.quoteIdentifierWithDoubleQuotes(identifier); } @Override @@ -124,4 +123,9 @@ public SqlNodeVisitor getSqlGenerationVisitor(final SqlGenerationContext public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_AT_END; } + + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } } \ No newline at end of file diff --git a/src/main/java/com/exasol/adapter/dialects/generic/GenericSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/generic/GenericSqlDialect.java index 6583204ae..102cec634 100644 --- a/src/main/java/com/exasol/adapter/dialects/generic/GenericSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/generic/GenericSqlDialect.java @@ -86,6 +86,11 @@ public NullSorting getDefaultNullSorting() { } } + @Override + public String getStringLiteral(final String value) { + return this.quoteLiteralStringWithSingleQuote(value); + } + @Override protected RemoteMetadataReader createRemoteMetadataReader() { try { diff --git a/src/main/java/com/exasol/adapter/dialects/hive/HiveSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/hive/HiveSqlDialect.java index 3b8496f99..ee861e5e9 100644 --- a/src/main/java/com/exasol/adapter/dialects/hive/HiveSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/hive/HiveSqlDialect.java @@ -105,6 +105,11 @@ public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_LOW; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + @Override public SqlNodeVisitor getSqlGenerationVisitor(final SqlGenerationContext context) { return new HiveSqlGenerationVisitor(this, context); diff --git a/src/main/java/com/exasol/adapter/dialects/impala/ImpalaIdentifier.java b/src/main/java/com/exasol/adapter/dialects/impala/ImpalaIdentifier.java new file mode 100644 index 000000000..f7b430430 --- /dev/null +++ b/src/main/java/com/exasol/adapter/dialects/impala/ImpalaIdentifier.java @@ -0,0 +1,64 @@ +package com.exasol.adapter.dialects.impala; + +import java.util.Objects; + +import com.exasol.db.Identifier; + +/** + * Represents an identifier in the Impala database. + */ +public class ImpalaIdentifier implements Identifier { + private final String id; + + private ImpalaIdentifier(final String id) { + this.id = id; + } + + /** + * Get the quoted identifier as a {@link String}. + * + * @return quoted identifier + */ + @Override + public String quote() { + return "`" + this.id + "`"; + } + + /** + * Create a new {@link ImpalaIdentifier}. + * + * @param id the identifier as {@link String} + * @return new {@link ImpalaIdentifier} instance + */ + public static ImpalaIdentifier of(final String id) { + if (validate(id)) { + return new ImpalaIdentifier(id); + } else { + throw new AssertionError("E-ID-6: Unable to create identifier \"" + id // + + "\" because it contains illegal characters." // + + " For information about valid identifiers, please refer to" // + + " https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_identifiers.html"); + } + } + + private static boolean validate(final String id) { + return !id.contains("`"); + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ImpalaIdentifier)) { + return false; + } + final ImpalaIdentifier that = (ImpalaIdentifier) o; + return Objects.equals(this.id, that.id); + } + + @Override + public int hashCode() { + return Objects.hash(this.id); + } +} \ No newline at end of file diff --git a/src/main/java/com/exasol/adapter/dialects/impala/ImpalaSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/impala/ImpalaSqlDialect.java index 77617e165..bf3e9f654 100644 --- a/src/main/java/com/exasol/adapter/dialects/impala/ImpalaSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/impala/ImpalaSqlDialect.java @@ -95,7 +95,7 @@ public StructureElementSupport supportsJdbcSchemas() { @Override // https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_identifiers.html public String applyQuote(final String identifier) { - return "`" + identifier.replace("`", "``") + "`"; + return ImpalaIdentifier.of(identifier).quote(); } @Override @@ -139,7 +139,7 @@ public String getStringLiteral(final String value) { if (value == null) { return "NULL"; } else { - return "'" + value.replace("'", "\\'") + "'"; + return "'" + value.replace("\\", "\\\\").replace("'", "\\'") + "'"; } } } \ No newline at end of file diff --git a/src/main/java/com/exasol/adapter/dialects/mysql/MySqlSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/mysql/MySqlSqlDialect.java index bff716885..b81cf00fd 100644 --- a/src/main/java/com/exasol/adapter/dialects/mysql/MySqlSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/mysql/MySqlSqlDialect.java @@ -83,11 +83,8 @@ public StructureElementSupport supportsJdbcSchemas() { return StructureElementSupport.NONE; } - /** - * @see ANSI quotes (MySQL - * reference manual) - */ @Override + // https://dev.mysql.com/doc/refman/8.0/en/identifiers.html public String applyQuote(final String identifier) { return "`" + identifier.replace("`", "``") + "`"; } @@ -107,6 +104,11 @@ public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_AT_END; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + @Override protected RemoteMetadataReader createRemoteMetadataReader() { try { diff --git a/src/main/java/com/exasol/adapter/dialects/oracle/OracleIdentifier.java b/src/main/java/com/exasol/adapter/dialects/oracle/OracleIdentifier.java new file mode 100644 index 000000000..5d4a78a45 --- /dev/null +++ b/src/main/java/com/exasol/adapter/dialects/oracle/OracleIdentifier.java @@ -0,0 +1,64 @@ +package com.exasol.adapter.dialects.oracle; + +import java.util.Objects; + +import com.exasol.db.Identifier; + +/** + * Represents an identifier in the Oracle database. + */ +public class OracleIdentifier implements Identifier { + private final String id; + + private OracleIdentifier(final String id) { + this.id = id; + } + + /** + * Get the quoted identifier as a {@link String}. + * + * @return quoted identifier + */ + @Override + public String quote() { + return "\"" + this.id + "\""; + } + + /** + * Create a new {@link OracleIdentifier}. + * + * @param id the identifier as {@link String} + * @return new {@link OracleIdentifier} instance + */ + public static OracleIdentifier of(final String id) { + if (validate(id)) { + return new OracleIdentifier(id); + } else { + throw new AssertionError("E-ID-3: Unable to create identifier \"" + id // + + "\" because it contains illegal characters." // + + " For information about valid identifiers, please refer to" // + + " https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements008.htm"); + } + } + + private static boolean validate(final String id) { + return !id.contains("\""); + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof OracleIdentifier)) { + return false; + } + final OracleIdentifier that = (OracleIdentifier) o; + return Objects.equals(this.id, that.id); + } + + @Override + public int hashCode() { + return Objects.hash(this.id); + } +} \ No newline at end of file diff --git a/src/main/java/com/exasol/adapter/dialects/oracle/OracleSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/oracle/OracleSqlDialect.java index 386c427fc..39c11412c 100644 --- a/src/main/java/com/exasol/adapter/dialects/oracle/OracleSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/oracle/OracleSqlDialect.java @@ -114,10 +114,9 @@ public SqlNodeVisitor getSqlGenerationVisitor(final SqlGenerationContext } @Override - @SuppressWarnings("squid:S1185") // https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements008.htm public String applyQuote(final String identifier) { - return super.applyQuote(identifier); + return OracleIdentifier.of(identifier).quote(); } @Override @@ -135,6 +134,11 @@ public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_HIGH; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + /** * Return the type of import the Oracle dialect uses. * diff --git a/src/main/java/com/exasol/adapter/dialects/postgresql/PostgreSQLSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/postgresql/PostgreSQLSqlDialect.java index dfdfaaa06..ab4d9327c 100644 --- a/src/main/java/com/exasol/adapter/dialects/postgresql/PostgreSQLSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/postgresql/PostgreSQLSqlDialect.java @@ -124,7 +124,7 @@ public String applyQuote(final String identifier) { if (getIdentifierMapping() != PostgreSQLIdentifierMapping.PRESERVE_ORIGINAL_CASE) { postgreSQLIdentifier = convertIdentifierToLowerCase(postgreSQLIdentifier); } - return super.applyQuote(postgreSQLIdentifier); + return super.quoteIdentifierWithDoubleQuotes(postgreSQLIdentifier); } private String convertIdentifierToLowerCase(final String identifier) { @@ -146,6 +146,11 @@ public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_AT_END; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + @Override public SqlNodeVisitor getSqlGenerationVisitor(final SqlGenerationContext context) { return new PostgresSQLSqlGenerationVisitor(this, context); diff --git a/src/main/java/com/exasol/adapter/dialects/redshift/RedshiftSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/redshift/RedshiftSqlDialect.java index 5e5b3a3f3..8a0249730 100644 --- a/src/main/java/com/exasol/adapter/dialects/redshift/RedshiftSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/redshift/RedshiftSqlDialect.java @@ -93,10 +93,9 @@ public StructureElementSupport supportsJdbcSchemas() { } @Override - @SuppressWarnings("squid:S1185") // https://docs.aws.amazon.com/redshift/latest/dg/r_names.html public String applyQuote(final String identifier) { - return super.applyQuote(identifier); + return super.quoteIdentifierWithDoubleQuotes(identifier); } @Override @@ -114,6 +113,11 @@ public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_AT_END; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + @Override public SqlNodeVisitor getSqlGenerationVisitor(final SqlGenerationContext context) { return new RedshiftSqlGenerationVisitor(this, context); diff --git a/src/main/java/com/exasol/adapter/dialects/saphana/SapHanaSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/saphana/SapHanaSqlDialect.java index 3cbf80ceb..eb6ab1f2f 100644 --- a/src/main/java/com/exasol/adapter/dialects/saphana/SapHanaSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/saphana/SapHanaSqlDialect.java @@ -110,9 +110,8 @@ public boolean requiresSchemaQualifiedTableNames(final SqlGenerationContext cont @Override // http://sap.optimieren.de/hana/hana/html/_bsql_introduction.html - @SuppressWarnings("squid:S1185") public String applyQuote(final String identifier) { - return super.applyQuote(identifier); + return super.quoteIdentifierWithDoubleQuotes(identifier); } @Override @@ -120,6 +119,11 @@ public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_AT_START; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + @Override protected RemoteMetadataReader createRemoteMetadataReader() { try { diff --git a/src/main/java/com/exasol/adapter/dialects/sqlserver/SqlServerIdentifier.java b/src/main/java/com/exasol/adapter/dialects/sqlserver/SqlServerIdentifier.java index 34df3ab81..7ea02118c 100644 --- a/src/main/java/com/exasol/adapter/dialects/sqlserver/SqlServerIdentifier.java +++ b/src/main/java/com/exasol/adapter/dialects/sqlserver/SqlServerIdentifier.java @@ -34,10 +34,10 @@ public static SqlServerIdentifier of(final String id) { if (validate(id)) { return new SqlServerIdentifier(id); } else { - throw new AssertionError("E-ID-3: Unable to create identifier \"" + id // + throw new AssertionError("E-ID-4: Unable to create identifier \"" + id // + "\" because it contains illegal characters." // + " For information about valid identifiers, please refer to" // - + " https://docs.microsoft.com/en-us/sql/relational-databases/databases/database-identifiers?redirectedfrom=MSDN&view=sql-server-ver15"); + + " https://docs.microsoft.com/de-de/sql/t-sql/statements/set-quoted-identifier-transact-sql?view=sql-server-ver15"); } } @@ -47,10 +47,12 @@ private static boolean validate(final String id) { @Override public boolean equals(final Object o) { - if (this == o) + if (this == o) { return true; - if (o == null || getClass() != o.getClass()) + } + if (!(o instanceof SqlServerIdentifier)) { return false; + } final SqlServerIdentifier that = (SqlServerIdentifier) o; return Objects.equals(this.id, that.id); } diff --git a/src/main/java/com/exasol/adapter/dialects/sqlserver/SqlServerSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/sqlserver/SqlServerSqlDialect.java index fa7936590..c8b22a713 100644 --- a/src/main/java/com/exasol/adapter/dialects/sqlserver/SqlServerSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/sqlserver/SqlServerSqlDialect.java @@ -114,6 +114,7 @@ public SqlNodeVisitor getSqlGenerationVisitor(final SqlGenerationContext } @Override + // https://docs.microsoft.com/de-de/sql/t-sql/statements/set-quoted-identifier-transact-sql?view=sql-server-ver15 public String applyQuote(final String identifier) { return SqlServerIdentifier.of(identifier).quote(); } @@ -133,6 +134,11 @@ public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_AT_START; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + @Override protected RemoteMetadataReader createRemoteMetadataReader() { try { diff --git a/src/main/java/com/exasol/adapter/dialects/sybase/SybaseIdentifier.java b/src/main/java/com/exasol/adapter/dialects/sybase/SybaseIdentifier.java index f1cbf21d5..1e9e3f750 100644 --- a/src/main/java/com/exasol/adapter/dialects/sybase/SybaseIdentifier.java +++ b/src/main/java/com/exasol/adapter/dialects/sybase/SybaseIdentifier.java @@ -36,7 +36,7 @@ public static SybaseIdentifier of(final String id) { if (validate(id)) { return new SybaseIdentifier(id); } else { - throw new AssertionError("E-ID-3: Unable to create identifier \"" + id // + throw new AssertionError("E-ID-5: Unable to create identifier \"" + id // + "\" because it contains illegal characters." // + " For information about valid identifiers, please refer to" // + " http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36271.1600/doc/html/san1393050529478.html"); @@ -61,10 +61,12 @@ private static boolean validateCharacter(final char ch) { @Override public boolean equals(final Object o) { - if (this == o) + if (this == o) { return true; - if (o == null || getClass() != o.getClass()) + } + if (!(o instanceof SybaseIdentifier)) { return false; + } final SybaseIdentifier that = (SybaseIdentifier) o; return Objects.equals(this.id, that.id); } diff --git a/src/main/java/com/exasol/adapter/dialects/sybase/SybaseSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/sybase/SybaseSqlDialect.java index 4f461dca2..d8023310f 100644 --- a/src/main/java/com/exasol/adapter/dialects/sybase/SybaseSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/sybase/SybaseSqlDialect.java @@ -135,6 +135,11 @@ public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_LOW; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + @Override protected RemoteMetadataReader createRemoteMetadataReader() { try { diff --git a/src/main/java/com/exasol/adapter/dialects/teradata/TeradataSqlDialect.java b/src/main/java/com/exasol/adapter/dialects/teradata/TeradataSqlDialect.java index 71100c2b8..f2b08b78d 100644 --- a/src/main/java/com/exasol/adapter/dialects/teradata/TeradataSqlDialect.java +++ b/src/main/java/com/exasol/adapter/dialects/teradata/TeradataSqlDialect.java @@ -95,10 +95,9 @@ public SqlNodeVisitor getSqlGenerationVisitor(final SqlGenerationContext } @Override - @SuppressWarnings("squid:S1185") - // https://docs.teradata.com/reader/3AkrVQlhjJMha4KRVJmm1w/G7jI6yuymIYaMNVKNlCSWQ + // https://docs.teradata.com/reader/37meaKdwvl0jrhzrc6FoEw/F5dFR63LmiAnvhOd3C9f8w public String applyQuote(final String identifier) { - return super.applyQuote(identifier); + return super.quoteIdentifierWithDoubleQuotes(identifier); } @Override @@ -115,4 +114,9 @@ public boolean requiresSchemaQualifiedTableNames(final SqlGenerationContext cont public NullSorting getDefaultNullSorting() { return NullSorting.NULLS_SORTED_HIGH; } + + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } } diff --git a/src/test/java/com/exasol/adapter/dialects/athena/AthenaSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/athena/AthenaSqlDialectTest.java index ec1983122..1fc6bf44c 100644 --- a/src/test/java/com/exasol/adapter/dialects/athena/AthenaSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/athena/AthenaSqlDialectTest.java @@ -110,6 +110,7 @@ void testGetDefaultNullSorting() { @CsvSource({ "tableName, \"tableName\"", // "table123, \"table123\"", // "_table, `_table`", // + "123table, \"123table\"", // "table_name, \"table_name\"" }) @ParameterizedTest void testApplyQuote(final String unquoted, final String quoted) { @@ -119,10 +120,8 @@ void testApplyQuote(final String unquoted, final String quoted) { @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/bigquery/BigQueryIdentifierTest.java b/src/test/java/com/exasol/adapter/dialects/bigquery/BigQueryIdentifierTest.java deleted file mode 100644 index 9ea64619b..000000000 --- a/src/test/java/com/exasol/adapter/dialects/bigquery/BigQueryIdentifierTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.exasol.adapter.dialects.bigquery; - -import org.junit.jupiter.api.Test; - -import nl.jqno.equalsverifier.EqualsVerifier; - -class BigQueryIdentifierTest { - @Test - void testEqualsAndHashContract() { - EqualsVerifier.simple().forClass(BigQueryIdentifier.class).verify(); - } -} \ No newline at end of file diff --git a/src/test/java/com/exasol/adapter/dialects/bigquery/BigQuerySqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/bigquery/BigQuerySqlDialectTest.java index 9f47e0798..10dda698b 100644 --- a/src/test/java/com/exasol/adapter/dialects/bigquery/BigQuerySqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/bigquery/BigQuerySqlDialectTest.java @@ -139,13 +139,12 @@ void testApplyQuote(final String unquoted, final String quoted) { assertThat(this.dialect.applyQuote(unquoted), equalTo(quoted)); } - @ValueSource(strings = { "ab:'ab'", "a'b:'a\\'b'", "a''b:'a\\'\\'b'", "'ab':'\\'ab\\''" }) + @ValueSource(strings = { "ab:'ab'", "a'b:'a\\'b'", "a''b:'a\\'\\'b'", "'ab':'\\'ab\\''", "a\\b:'a\\\\b'", + "a\\\\b:'a\\\\\\\\b'", "a\\'b:'a\\\\\\'b'" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/db2/DB2SqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/db2/DB2SqlDialectTest.java index d5df20de0..e5ac2f3a4 100644 --- a/src/test/java/com/exasol/adapter/dialects/db2/DB2SqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/db2/DB2SqlDialectTest.java @@ -129,10 +129,8 @@ void testApplyQuote(final String unquoted, final String quoted) { @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/dummy/DummySqlDialect.java b/src/test/java/com/exasol/adapter/dialects/dummy/DummySqlDialect.java index 1444fcec8..567d3e7a5 100644 --- a/src/test/java/com/exasol/adapter/dialects/dummy/DummySqlDialect.java +++ b/src/test/java/com/exasol/adapter/dialects/dummy/DummySqlDialect.java @@ -62,6 +62,11 @@ public NullSorting getDefaultNullSorting() { return null; } + @Override + public String getStringLiteral(final String value) { + return super.quoteLiteralStringWithSingleQuote(value); + } + @Override protected RemoteMetadataReader createRemoteMetadataReader() { try { diff --git a/src/test/java/com/exasol/adapter/dialects/impala/ImpalaIdentifierTest.java b/src/test/java/com/exasol/adapter/dialects/impala/ImpalaIdentifierTest.java new file mode 100644 index 000000000..a158fe0b0 --- /dev/null +++ b/src/test/java/com/exasol/adapter/dialects/impala/ImpalaIdentifierTest.java @@ -0,0 +1,29 @@ +package com.exasol.adapter.dialects.impala; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import nl.jqno.equalsverifier.EqualsVerifier; + +class ImpalaIdentifierTest { + @ParameterizedTest + @ValueSource(strings = { "_myunderscoretable", "123columnone", "テスト", "таблица" }) + void testCreateValidIdentifier(final String identifier) { + assertDoesNotThrow(() -> ImpalaIdentifier.of(identifier)); + } + + @ParameterizedTest + @ValueSource(strings = { "test`table", "`table`" }) + void testCreateInvalidIdentifier(final String identifier) { + assertThrows(AssertionError.class, () -> ImpalaIdentifier.of(identifier)); + } + + @Test + void testEqualsAndHashContract() { + EqualsVerifier.simple().forClass(ImpalaIdentifier.class).verify(); + } +} \ No newline at end of file diff --git a/src/test/java/com/exasol/adapter/dialects/impala/ImpalaSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/impala/ImpalaSqlDialectTest.java index ea8064fce..bca6aa156 100644 --- a/src/test/java/com/exasol/adapter/dialects/impala/ImpalaSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/impala/ImpalaSqlDialectTest.java @@ -12,6 +12,7 @@ import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.HashMap; import java.util.Map; @@ -120,20 +121,26 @@ void testValidateSchemaProperty() throws PropertyValidationException { } @CsvSource({ "tableName, `tableName`", // - "`tableName, ```tableName`" // + "table ' Name, `table ' Name`", // + "table \" Name, `table \" Name`" // }) @ParameterizedTest void testApplyQuote(final String unquoted, final String quoted) { assertThat(this.dialect.applyQuote(unquoted), equalTo(quoted)); } - @ValueSource(strings = { "ab:'ab'", "a'b:'a\\'b'", "a''b:'a\\'\\'b'", "'ab':'\\'ab\\''" }) + @CsvSource({ "`tableName`", "table`Name", "table name`" }) + @ParameterizedTest + void testApplyQuoteThrowsException(final String identifier) { + assertThrows(AssertionError.class, () -> this.dialect.applyQuote(identifier)); + } + + @ValueSource(strings = { "ab:'ab'", "a'b:'a\\'b'", "a''b:'a\\'\\'b'", "'ab':'\\'ab\\''", "a\\b:'a\\\\b'", + "a\\\\b:'a\\\\\\\\b'", "a\\'b:'a\\\\\\'b'" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), Matchers.equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/mysql/MySqlSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/mysql/MySqlSqlDialectTest.java index 1cc40c371..6d5791335 100644 --- a/src/test/java/com/exasol/adapter/dialects/mysql/MySqlSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/mysql/MySqlSqlDialectTest.java @@ -113,7 +113,8 @@ void testGetDefaultNullSorting() { } @CsvSource({ "tableName, `tableName`", // - "`tableName, ```tableName`" // + "`tableName, ```tableName`", // + "\"tableName, `\"tableName`" // }) @ParameterizedTest void testApplyQuote(final String unquoted, final String quoted) { @@ -123,10 +124,8 @@ void testApplyQuote(final String unquoted, final String quoted) { @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + Matchers.equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/oracle/OracleIdentifierTest.java b/src/test/java/com/exasol/adapter/dialects/oracle/OracleIdentifierTest.java new file mode 100644 index 000000000..6318d6f0a --- /dev/null +++ b/src/test/java/com/exasol/adapter/dialects/oracle/OracleIdentifierTest.java @@ -0,0 +1,29 @@ +package com.exasol.adapter.dialects.oracle; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import nl.jqno.equalsverifier.EqualsVerifier; + +class OracleIdentifierTest { + @ParameterizedTest + @ValueSource(strings = { "_myunderscoretable", "123columnone", "テスト", "таблица" }) + void testCreateValidIdentifier(final String identifier) { + assertDoesNotThrow(() -> OracleIdentifier.of(identifier)); + } + + @ParameterizedTest + @ValueSource(strings = { "\"testtable\"", "test\"table" }) + void testCreateInvalidIdentifier(final String identifier) { + assertThrows(AssertionError.class, () -> OracleIdentifier.of(identifier)); + } + + @Test + void testEqualsAndHashContract() { + EqualsVerifier.simple().forClass(OracleIdentifier.class).verify(); + } +} \ No newline at end of file diff --git a/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectTest.java index 32301fe43..1e93ae40c 100644 --- a/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/oracle/OracleSqlDialectTest.java @@ -18,7 +18,6 @@ import java.util.Map; -import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -128,19 +127,23 @@ void testQueryRewriterClass() { } @CsvSource({ "tableName, \"tableName\"", // - "\"tableName, \"\"\"tableName\"" // + "table 'Name, \"table 'Name\"" // }) @ParameterizedTest - void testApplyQuote(final String unquoted, final String quoted) { - assertThat(this.dialect.applyQuote(unquoted), equalTo(quoted)); + void testApplyQuote(final String identifier, final String expected) { + assertThat(this.dialect.applyQuote(identifier), equalTo(expected)); + } + + @CsvSource({ "\"tableName\"", "table\"Name", "table name\"" }) + @ParameterizedTest + void testApplyQuoteThrowsException(final String identifier) { + assertThrows(AssertionError.class, () -> this.dialect.applyQuote(identifier)); } @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), CoreMatchers.equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } } \ No newline at end of file diff --git a/src/test/java/com/exasol/adapter/dialects/postgresql/PostgreSQLIdentifierConverterTest.java b/src/test/java/com/exasol/adapter/dialects/postgresql/PostgreSQLIdentifierConverterTest.java index 2c1bd8f9c..e23ed3569 100644 --- a/src/test/java/com/exasol/adapter/dialects/postgresql/PostgreSQLIdentifierConverterTest.java +++ b/src/test/java/com/exasol/adapter/dialects/postgresql/PostgreSQLIdentifierConverterTest.java @@ -1,8 +1,8 @@ package com.exasol.adapter.dialects.postgresql; import static com.exasol.adapter.dialects.postgresql.PostgreSQLSqlDialect.POSTGRESQL_IDENTIFIER_MAPPING_PROPERTY; -import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; import java.util.HashMap; import java.util.Map; @@ -13,7 +13,7 @@ import com.exasol.adapter.AdapterProperties; -public class PostgreSQLIdentifierConverterTest { +class PostgreSQLIdentifierConverterTest { private Map rawProperties; @BeforeEach diff --git a/src/test/java/com/exasol/adapter/dialects/postgresql/PostgreSQLSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/postgresql/PostgreSQLSqlDialectTest.java index 0fee06a3e..b51339c5e 100644 --- a/src/test/java/com/exasol/adapter/dialects/postgresql/PostgreSQLSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/postgresql/PostgreSQLSqlDialectTest.java @@ -99,10 +99,8 @@ void testApplyQuote(final String unquoted, final String quoted) { @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), CoreMatchers.equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/redshift/RedshiftSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/redshift/RedshiftSqlDialectTest.java index 7a542d94f..ce3284b0b 100644 --- a/src/test/java/com/exasol/adapter/dialects/redshift/RedshiftSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/redshift/RedshiftSqlDialectTest.java @@ -128,10 +128,8 @@ void testApplyQuote(final String unquoted, final String quoted) { @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), CoreMatchers.equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/saphana/SapHanaSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/saphana/SapHanaSqlDialectTest.java index 7d250ad07..dc55d639c 100644 --- a/src/test/java/com/exasol/adapter/dialects/saphana/SapHanaSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/saphana/SapHanaSqlDialectTest.java @@ -132,10 +132,8 @@ void testApplyQuote(final String unquoted, final String quoted) { @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), CoreMatchers.equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + Matchers.equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/sqlserver/SqlServerSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/sqlserver/SqlServerSqlDialectTest.java index 19d870712..e63effb5d 100644 --- a/src/test/java/com/exasol/adapter/dialects/sqlserver/SqlServerSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/sqlserver/SqlServerSqlDialectTest.java @@ -9,10 +9,10 @@ import static com.exasol.adapter.capabilities.ScalarFunctionCapability.ST_INTERSECTION; import static com.exasol.adapter.capabilities.ScalarFunctionCapability.ST_UNION; import static com.exasol.reflect.ReflectionUtils.getMethodReturnViaReflection; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -140,23 +140,23 @@ void testGetAggregateFunctionAliases() { Matchers.equalTo("VARP"))); } - @Test - void testApplyQuote() { - assertThat(this.dialect.applyQuote("tableName"), equalTo("[tableName]")); + @CsvSource({ "tableName, [tableName]", "table \"name, [table \"name]" }) + @ParameterizedTest + void testApplyQuote(final String identifier, final String expected) { + assertThat(this.dialect.applyQuote(identifier), equalTo(expected)); } - @Test - void testApplyQuoteThrowsException() { - assertThrows(AssertionError.class, () -> this.dialect.applyQuote("[tableName]")); + @CsvSource({ "[tableName]", "[table name", "table name]", "table[name", "table]name" }) + @ParameterizedTest + void testApplyQuoteThrowsException(final String identifier) { + assertThrows(AssertionError.class, () -> this.dialect.applyQuote(identifier)); } @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), CoreMatchers.equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/sybase/SybaseSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/sybase/SybaseSqlDialectTest.java index f33c17b04..b5a2b606a 100644 --- a/src/test/java/com/exasol/adapter/dialects/sybase/SybaseSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/sybase/SybaseSqlDialectTest.java @@ -30,6 +30,7 @@ import com.exasol.adapter.sql.AggregateFunction; import com.exasol.adapter.sql.ScalarFunction; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; class SybaseSqlDialectTest { @@ -138,18 +139,17 @@ void testApplyQuote() { assertThat(this.dialect.applyQuote("tableName"), equalTo("[tableName]")); } - @Test - void testApplyQuoteThrowsException() { - assertThrows(AssertionError.class, () -> this.dialect.applyQuote("[tableName]")); + @CsvSource({ "[tableName]", "[table name", "table name]", "table[name", "table]name", "table \"name" }) + @ParameterizedTest + void testApplyQuoteThrowsException(final String identifier) { + assertThrows(AssertionError.class, () -> this.dialect.applyQuote(identifier)); } @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), CoreMatchers.equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test diff --git a/src/test/java/com/exasol/adapter/dialects/teradata/TeradataSqlDialectTest.java b/src/test/java/com/exasol/adapter/dialects/teradata/TeradataSqlDialectTest.java index 36834580e..e2d5b3654 100644 --- a/src/test/java/com/exasol/adapter/dialects/teradata/TeradataSqlDialectTest.java +++ b/src/test/java/com/exasol/adapter/dialects/teradata/TeradataSqlDialectTest.java @@ -116,10 +116,8 @@ void testApplyQuote(final String unquoted, final String quoted) { @ValueSource(strings = { "ab:'ab'", "a'b:'a''b'", "a''b:'a''''b'", "'ab':'''ab'''" }) @ParameterizedTest void testGetLiteralString(final String definition) { - final int colonPosition = definition.indexOf(':'); - final String original = definition.substring(0, colonPosition); - final String literal = definition.substring(colonPosition + 1); - assertThat(this.dialect.getStringLiteral(original), CoreMatchers.equalTo(literal)); + assertThat(this.dialect.getStringLiteral(definition.substring(0, definition.indexOf(':'))), + equalTo(definition.substring(definition.indexOf(':') + 1))); } @Test