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