From fb94f40cd943bd861e6111ce0047f410fd65855b Mon Sep 17 00:00:00 2001 From: ptiurin Date: Fri, 18 Oct 2024 11:37:57 +0100 Subject: [PATCH] better version --- .../FireboltPreparedStatement.java | 12 +++++- .../firebolt/jdbc/type/FireboltVersion.java | 5 +++ .../type/JavaTypeToFireboltSQLString.java | 41 ++++++++++--------- 3 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/firebolt/jdbc/type/FireboltVersion.java diff --git a/src/main/java/com/firebolt/jdbc/statement/preparedstatement/FireboltPreparedStatement.java b/src/main/java/com/firebolt/jdbc/statement/preparedstatement/FireboltPreparedStatement.java index 083fe0ea..62a4e4fa 100644 --- a/src/main/java/com/firebolt/jdbc/statement/preparedstatement/FireboltPreparedStatement.java +++ b/src/main/java/com/firebolt/jdbc/statement/preparedstatement/FireboltPreparedStatement.java @@ -13,6 +13,7 @@ import com.firebolt.jdbc.statement.StatementInfoWrapper; import com.firebolt.jdbc.statement.StatementUtil; import com.firebolt.jdbc.statement.rawstatement.RawStatementWrapper; +import com.firebolt.jdbc.type.FireboltVersion; import com.firebolt.jdbc.type.JavaTypeToFireboltSQLString; import com.firebolt.jdbc.util.InputStreamUtil; import lombok.CustomLog; @@ -158,7 +159,8 @@ public void setString(int parameterIndex, String x) throws SQLException { validateParamIndex(parameterIndex); if (this.getConnection().getClass() == FireboltConnectionUserPassword.class){ // Old Firebolt required escaping additional characters in the string - providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.STRING.transform(x, "legacy")); + providedParameters.put(parameterIndex, + JavaTypeToFireboltSQLString.STRING.transform(x, FireboltVersion.LEGACY)); } else { providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.STRING.transform(x)); } @@ -204,6 +206,14 @@ public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQ validateStatementIsNotClosed(); validateParamIndex(parameterIndex); try { + if (this.getConnection().getClass() == FireboltConnectionUserPassword.class) { + // We don't know the targetSqlType, so we let JavaTypeToFireboltSQLString deal + // with legacy conversion + providedParameters.put(parameterIndex, + JavaTypeToFireboltSQLString.transformAny(x, targetSqlType, FireboltVersion.LEGACY)); + } else { + providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.transformAny(x, targetSqlType)); + } providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.transformAny(x, targetSqlType)); } catch (FireboltException fbe) { if (ExceptionType.TYPE_NOT_SUPPORTED.equals(fbe.getType())) { diff --git a/src/main/java/com/firebolt/jdbc/type/FireboltVersion.java b/src/main/java/com/firebolt/jdbc/type/FireboltVersion.java new file mode 100644 index 00000000..e48e1a06 --- /dev/null +++ b/src/main/java/com/firebolt/jdbc/type/FireboltVersion.java @@ -0,0 +1,5 @@ +package com.firebolt.jdbc.type; + +public enum FireboltVersion { + LEGACY, CURRENT +} diff --git a/src/main/java/com/firebolt/jdbc/type/JavaTypeToFireboltSQLString.java b/src/main/java/com/firebolt/jdbc/type/JavaTypeToFireboltSQLString.java index 813354c8..8057a92d 100644 --- a/src/main/java/com/firebolt/jdbc/type/JavaTypeToFireboltSQLString.java +++ b/src/main/java/com/firebolt/jdbc/type/JavaTypeToFireboltSQLString.java @@ -35,7 +35,7 @@ public enum JavaTypeToFireboltSQLString { UUID(java.util.UUID.class, Object::toString), BYTE(Byte.class, value -> Byte.toString(((Number) value).byteValue())), SHORT(Short.class, value -> Short.toString(((Number) value).shortValue())), - STRING(String.class, getSQLStringValueOfString(), getSQLStringValueOfStringWithEscape()), + STRING(String.class, getSQLStringValueOfString(FireboltVersion.CURRENT), getSQLStringValueOfStringVersioned()), LONG(Long.class, value -> Long.toString(((Number)value).longValue())), INTEGER(Integer.class, value -> Integer.toString(((Number)value).intValue())), BIG_INTEGER(BigInteger.class, value -> value instanceof BigInteger ? value.toString() : Long.toString(((Number)value).longValue())), @@ -103,22 +103,33 @@ public enum JavaTypeToFireboltSQLString { } public static String transformAny(Object object) throws SQLException { - return transformAny(object, () -> getType(object)); + return transformAny(object, FireboltVersion.CURRENT); + } + + public static String transformAny(Object object, FireboltVersion version) throws SQLException { + return transformAny(object, () -> getType(object), version); } public static String transformAny(Object object, int sqlType) throws SQLException { - return transformAny(object, () -> getType(sqlType)); + return transformAny(object, sqlType, FireboltVersion.CURRENT); + } + + public static String transformAny(Object object, int sqlType, FireboltVersion version) throws SQLException { + return transformAny(object, () -> getType(sqlType), version); } - private static String transformAny(Object object, CheckedSupplier> classSupplier) throws SQLException { - return object == null ? NULL_VALUE : transformAny(object, classSupplier.get()); + private static String transformAny(Object object, CheckedSupplier> classSupplier, FireboltVersion version) throws SQLException { + return object == null ? NULL_VALUE : transformAny(object, classSupplier.get(), version); } - private static String transformAny(Object object, Class objectType) throws SQLException { + private static String transformAny(Object object, Class objectType, FireboltVersion version) throws SQLException { JavaTypeToFireboltSQLString converter = Optional.ofNullable(classToType.get(objectType)) .orElseThrow(() -> new FireboltException( format("Cannot convert type %s. The type is not supported.", objectType), TYPE_NOT_SUPPORTED)); + if (version == FireboltVersion.LEGACY && object instanceof String) { + return converter.transform(object, version); + } return converter.transform(object); } @@ -136,23 +147,15 @@ private static Class getType(int sqlType) throws SQLException { } } - private static CheckedBiFunction getSQLStringValueOfStringWithEscape() { - return (value, escape) -> { - boolean legacyStringEscape = escape == "legacy"; - return getSQLStringValueOfString(legacyStringEscape).apply(value); - }; - } - private static CheckedFunction getSQLStringValueOfString() { - return getSQLStringValueOfString(false); + private static CheckedBiFunction getSQLStringValueOfStringVersioned() { + return (value, version) -> getSQLStringValueOfString((FireboltVersion) version).apply(value); } - private static CheckedFunction getSQLStringValueOfString(boolean legacyStringEscape) { + private static CheckedFunction getSQLStringValueOfString(FireboltVersion version) { return value -> { String escaped = (String) value; - List> characterToEscapedCharacterPairs = legacyStringEscape - ? JavaTypeToFireboltSQLString.legacyCharacterToEscapedCharacterPairs - : JavaTypeToFireboltSQLString.characterToEscapedCharacterPairs; - for (Entry specialCharacter : characterToEscapedCharacterPairs) { + List> charactersToEscape = version == FireboltVersion.LEGACY ? legacyCharacterToEscapedCharacterPairs : characterToEscapedCharacterPairs; + for (Entry specialCharacter : charactersToEscape) { escaped = escaped.replace(specialCharacter.getKey(), specialCharacter.getValue()); } return format("'%s'", escaped);