Skip to content

Commit

Permalink
backwards-compatible change
Browse files Browse the repository at this point in the history
  • Loading branch information
ptiurin committed Oct 16, 2024
1 parent ea57217 commit 1d8e07a
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.firebolt.jdbc.annotation.NotImplemented;
import com.firebolt.jdbc.connection.FireboltConnection;
import com.firebolt.jdbc.connection.FireboltConnectionUserPassword;
import com.firebolt.jdbc.connection.settings.FireboltProperties;
import com.firebolt.jdbc.exception.ExceptionType;
import com.firebolt.jdbc.exception.FireboltException;
Expand Down Expand Up @@ -155,7 +156,12 @@ public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException
public void setString(int parameterIndex, String x) throws SQLException {
validateStatementIsNotClosed();
validateParamIndex(parameterIndex);
providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.STRING.transform(x));
if (this.getConnection().getClass() == FireboltConnectionUserPassword.class){
// Old Firebolt required escaping additional characters in the string
providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.STRING.transform(x, "legacy"));
} else {
providedParameters.put(parameterIndex, JavaTypeToFireboltSQLString.STRING.transform(x));
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()),
STRING(String.class, getSQLStringValueOfString(), getSQLStringValueOfStringWithEscape()),
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())),
Expand All @@ -47,6 +47,9 @@ public enum JavaTypeToFireboltSQLString {
ARRAY(Array.class, SqlArrayUtil::arrayToString),
BYTE_ARRAY(byte[].class, value -> ofNullable(byteArrayToHexString((byte[])value, true)).map(x -> format("E'%s'::BYTEA", x)).orElse(null)),
;

private static final List<Entry<String, String>> legacyCharacterToEscapedCharacterPairs = List.of(
Map.entry("\0", "\\0"), Map.entry("\\", "\\\\"), Map.entry("'", "''"));
private static final List<Entry<String, String>> characterToEscapedCharacterPairs = List.of(
Map.entry("'", "''"));
//https://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html
Expand Down Expand Up @@ -133,9 +136,22 @@ private static Class<?> getType(int sqlType) throws SQLException {
}
}

private static CheckedBiFunction<Object, Object, String> getSQLStringValueOfStringWithEscape() {
return (value, escape) -> {
boolean legacyStringEscape = escape == "legacy";
return getSQLStringValueOfString(legacyStringEscape).apply(value);
};
}
private static CheckedFunction<Object, String> getSQLStringValueOfString() {
return getSQLStringValueOfString(false);
}

private static CheckedFunction<Object, String> getSQLStringValueOfString(boolean legacyStringEscape) {
return value -> {
String escaped = (String) value;
List<Entry<String, String>> characterToEscapedCharacterPairs = legacyStringEscape
? JavaTypeToFireboltSQLString.legacyCharacterToEscapedCharacterPairs
: JavaTypeToFireboltSQLString.characterToEscapedCharacterPairs;
for (Entry<String, String> specialCharacter : characterToEscapedCharacterPairs) {
escaped = escaped.replace(specialCharacter.getKey(), specialCharacter.getValue());
}
Expand Down

0 comments on commit 1d8e07a

Please sign in to comment.