diff --git a/src/main/java/com/upsolver/datasources/jdbc/JDBCDataSource.java b/src/main/java/com/upsolver/datasources/jdbc/JDBCDataSource.java index ed2a730..722f5c9 100644 --- a/src/main/java/com/upsolver/datasources/jdbc/JDBCDataSource.java +++ b/src/main/java/com/upsolver/datasources/jdbc/JDBCDataSource.java @@ -130,20 +130,20 @@ public void setProperties(Map properties) { tableInfo = loadTableInfo(metadata, properties.getOrDefault(schemaPatternProp, null), properties.get(tableNameProp)); var allTimeColumns = new HashSet(); if (userProvidedIncColumn != null) { - tableInfo.setIncColumn(queryDialect.toUpperCaseIfRequired(userProvidedIncColumn)); + tableInfo.setIncColumn(queryDialect.normalizeIdentifier(userProvidedIncColumn)); } for (ColumnInfo column : tableInfo.getColumns()) { if (column.isTimeType()) { allTimeColumns.add(column.getName().toUpperCase()); } else if (tableInfo.getIncColumn() == null && column.isIncCol()) { - tableInfo.setIncColumn(queryDialect.toUpperCaseIfRequired(column.getName())); + tableInfo.setIncColumn(queryDialect.normalizeIdentifier(column.getName())); } } String[] filteredTimestampColumns = Arrays.stream(properties.getOrDefault(timestampColumnsProp, "").split(",")) .map(String::trim) .filter(x -> allTimeColumns.contains(x.toUpperCase())) - .map(f -> queryDialect.toUpperCaseIfRequired(f)) + .map(f -> queryDialect.normalizeIdentifier(f)) .toArray(String[]::new); if (filteredTimestampColumns.length != 0) { tableInfo.setTimeColumns(filteredTimestampColumns); @@ -179,8 +179,8 @@ private String[] getSupportedTableTypes(DatabaseMetaData metaData) throws SQLExc } private TableInfo loadTableInfo(DatabaseMetaData metadata, String schemaPattern, String tableName) throws SQLException { - var fixedTableName = queryDialect.toUpperCaseIfRequired(tableName); - var fixedSchemaPattern = queryDialect.toUpperCaseIfRequired(schemaPattern); + var fixedTableName = queryDialect.normalizeIdentifier(tableName); + var fixedSchemaPattern = queryDialect.normalizeIdentifier(schemaPattern); var supportedTableTypes = getSupportedTableTypes(metadata); var tables = metadata.getTables(null, fixedSchemaPattern, fixedTableName, supportedTableTypes); if (tables.next()) { diff --git a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/DefaultQueryDialect.java b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/DefaultQueryDialect.java index e228db2..f9f2f2f 100644 --- a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/DefaultQueryDialect.java +++ b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/DefaultQueryDialect.java @@ -34,13 +34,15 @@ public class DefaultQueryDialect implements QueryDialect { private static final ThrowingBiFunction getString = ResultSet::getString; private final Map> valueGetters; + private final IdentifierNormalizer identifierNormalizer; public DefaultQueryDialect() { - this(Collections.emptyMap()); + this(Collections.emptyMap(), IdentifierNormalizer.CASE_INSENSITIVE); } - public DefaultQueryDialect(Map> valueGetters) { + public DefaultQueryDialect(Map> valueGetters, IdentifierNormalizer identifierNormalizer) { this.valueGetters = valueGetters; + this.identifierNormalizer = identifierNormalizer; } @Override @@ -202,13 +204,8 @@ protected String rownumCondition(long amount, boolean includeAnd, boolean includ } @Override - public boolean requiresUppercaseNames() { - return false; - } - - @Override - public String toUpperCaseIfRequired(String s) { - return s != null && requiresUppercaseNames() ? s.toUpperCase() : s; + public String normalizeIdentifier(String s) { + return identifierNormalizer.normalize(s); } protected String endLimit(long amount) { diff --git a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/IdentifierNormalizer.java b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/IdentifierNormalizer.java new file mode 100644 index 0000000..c2bc284 --- /dev/null +++ b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/IdentifierNormalizer.java @@ -0,0 +1,24 @@ +package com.upsolver.datasources.jdbc.querybuilders; + +public enum IdentifierNormalizer { + CASE_INSENSITIVE { + @Override + public String normalize(String s) { + return s; + } + }, + TO_UPPER_CASE { + @Override + public String normalize(String s) { + return s == null ? null : s.toUpperCase(); + } + }, + TO_LOWER_CASE { + @Override + public String normalize(String s) { + return s == null ? null : s.toLowerCase(); + } + }, + ; + public abstract String normalize(String s); +} diff --git a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/OracleQueryDialect.java b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/OracleQueryDialect.java index a31b1d5..ca0b808 100644 --- a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/OracleQueryDialect.java +++ b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/OracleQueryDialect.java @@ -28,7 +28,7 @@ public class OracleQueryDialect extends DefaultQueryDialect { private static final Map> blobValueGetters = Collections.singletonMap(Types.BLOB, blobAsString); public OracleQueryDialect() { - super(blobValueGetters); + super(blobValueGetters, IdentifierNormalizer.TO_UPPER_CASE); } @Override @@ -51,11 +51,6 @@ protected String rownumCondition(long amount, boolean includeAnd, boolean includ } } - @Override - public boolean requiresUppercaseNames() { - return true; - } - @Override protected String endLimit(long amount) { return ""; diff --git a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/PostgreSqlQueryDialect.java b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/PostgreSqlQueryDialect.java index 8860383..52da314 100644 --- a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/PostgreSqlQueryDialect.java +++ b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/PostgreSqlQueryDialect.java @@ -3,9 +3,14 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Collections; import java.util.TimeZone; public class PostgreSqlQueryDialect extends DefaultQueryDialect { + public PostgreSqlQueryDialect() { + super(Collections.emptyMap(), IdentifierNormalizer.TO_LOWER_CASE); + } + public long utcOffsetSeconds(Connection connection) throws SQLException { var rs = connection.prepareStatement("select current_setting('TIMEZONE')").executeQuery(); rs.next(); diff --git a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/QueryDialect.java b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/QueryDialect.java index 24cf804..cecc576 100644 --- a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/QueryDialect.java +++ b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/QueryDialect.java @@ -16,9 +16,7 @@ public interface QueryDialect { long utcOffsetSeconds(Connection connection) throws SQLException; - boolean requiresUppercaseNames(); - - String toUpperCaseIfRequired(String s); + String normalizeIdentifier(String s); boolean isAutoIncrementColumn(ResultSet columnsResultSet) throws SQLException; diff --git a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/RedshiftQueryDialect.java b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/RedshiftQueryDialect.java index e9954d8..7f7161b 100644 --- a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/RedshiftQueryDialect.java +++ b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/RedshiftQueryDialect.java @@ -3,9 +3,14 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Collections; import java.util.TimeZone; public class RedshiftQueryDialect extends DefaultQueryDialect { + public RedshiftQueryDialect() { + super(Collections.emptyMap(), IdentifierNormalizer.TO_LOWER_CASE); + } + public long utcOffsetSeconds(Connection connection) throws SQLException { var rs = connection.prepareStatement("select current_setting('TIMEZONE')").executeQuery(); rs.next(); diff --git a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/SnowflakeQueryDialect.java b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/SnowflakeQueryDialect.java index 945450f..a807406 100644 --- a/src/main/java/com/upsolver/datasources/jdbc/querybuilders/SnowflakeQueryDialect.java +++ b/src/main/java/com/upsolver/datasources/jdbc/querybuilders/SnowflakeQueryDialect.java @@ -2,17 +2,17 @@ import java.sql.Connection; import java.sql.SQLException; +import java.util.Collections; import java.util.TimeZone; public class SnowflakeQueryDialect extends DefaultQueryDialect { + public SnowflakeQueryDialect() { + super(Collections.emptyMap(), IdentifierNormalizer.TO_UPPER_CASE); + } + public long utcOffsetSeconds(Connection connection) throws SQLException { var rs = connection.prepareStatement("show parameters like 'TIMEZONE'").executeQuery(); rs.next(); return TimeZone.getTimeZone(rs.getString(1)).getRawOffset() / 1000; } - - @Override - public boolean requiresUppercaseNames() { - return true; - } }