yuqi1129 commented on code in PR #12767:
URL: https://github.com/apache/gravitino/pull/12767#discussion_r4055752256
##########
catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/converter/DorisColumnDefaultValueConverter.java:
##########
@@ -90,13 +120,46 @@ public Expression toGravitino(
: Literals.timestampLiteral(
LocalDateTime.parse(columnDefaultValue, DATE_TIME_FORMATTER));
case JdbcTypeConverter.VARCHAR:
- return Literals.of(columnDefaultValue,
Types.VarCharType.of(columnType.getColumnSize()));
+ return Literals.of(
+ unescapeDorisLiteral(columnDefaultValue),
+ Types.VarCharType.of(columnType.getColumnSize()));
case CHAR:
- return Literals.of(columnDefaultValue,
Types.FixedCharType.of(columnType.getColumnSize()));
+ return Literals.of(
+ unescapeDorisLiteral(columnDefaultValue),
+ Types.FixedCharType.of(columnType.getColumnSize()));
case JdbcTypeConverter.TEXT:
- return Literals.stringLiteral(columnDefaultValue);
+ return
Literals.stringLiteral(unescapeDorisLiteral(columnDefaultValue));
default:
return UnparsedExpression.of(columnDefaultValue);
}
}
+
+ private static String quoteDorisLiteral(String value, boolean
doubleEscapeBackslashes) {
+ String escapedBackslash = doubleEscapeBackslashes ? "\\\\\\\\" : "\\\\";
+ String escaped = value.replace("\\", escapedBackslash).replace("\"",
"\\\"");
+ return "\"" + escaped + "\"";
+ }
+
+ private static String unescapeDorisLiteral(String value) {
+ StringBuilder result = new StringBuilder(value.length());
+ for (int i = 0; i < value.length(); i++) {
+ char current = value.charAt(i);
+ if (current == '\\' && i + 1 < value.length()) {
+ char next = value.charAt(i + 1);
+ if (next == '\\' || next == '\'' || next == '"') {
+ result.append(next);
+ i++;
+ continue;
+ }
+ } else if ((current == '\'' || current == '"')
Review Comment:
Could we add a Doris round-trip test for string defaults containing
consecutive quotes (for example, `ab` or `a""b`)? `unescapeDorisLiteral()`
always collapses those pairs, but `COLUMN_DEF` may already contain the literal
default value. In that case `loadTable()` would change an existing default, and
a later MODIFY COLUMN could write the changed value back. Please confirm that
Doris JDBC metadata doubles these quotes on all supported versions before
normalizing them here, or restrict the decoding to forms known to be escaped.
##########
catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/converter/DorisColumnDefaultValueConverter.java:
##########
@@ -90,13 +120,46 @@ public Expression toGravitino(
: Literals.timestampLiteral(
LocalDateTime.parse(columnDefaultValue, DATE_TIME_FORMATTER));
case JdbcTypeConverter.VARCHAR:
- return Literals.of(columnDefaultValue,
Types.VarCharType.of(columnType.getColumnSize()));
+ return Literals.of(
+ unescapeDorisLiteral(columnDefaultValue),
+ Types.VarCharType.of(columnType.getColumnSize()));
case CHAR:
- return Literals.of(columnDefaultValue,
Types.FixedCharType.of(columnType.getColumnSize()));
+ return Literals.of(
+ unescapeDorisLiteral(columnDefaultValue),
+ Types.FixedCharType.of(columnType.getColumnSize()));
case JdbcTypeConverter.TEXT:
- return Literals.stringLiteral(columnDefaultValue);
+ return
Literals.stringLiteral(unescapeDorisLiteral(columnDefaultValue));
default:
return UnparsedExpression.of(columnDefaultValue);
}
}
+
+ private static String quoteDorisLiteral(String value, boolean
doubleEscapeBackslashes) {
+ String escapedBackslash = doubleEscapeBackslashes ? "\\\\\\\\" : "\\\\";
+ String escaped = value.replace("\\", escapedBackslash).replace("\"",
"\\\"");
+ return "\"" + escaped + "\"";
+ }
+
+ private static String unescapeDorisLiteral(String value) {
+ StringBuilder result = new StringBuilder(value.length());
+ for (int i = 0; i < value.length(); i++) {
+ char current = value.charAt(i);
+ if (current == '\\' && i + 1 < value.length()) {
+ char next = value.charAt(i + 1);
+ if (next == '\\' || next == '\'' || next == '"') {
+ result.append(next);
+ i++;
+ continue;
+ }
+ } else if ((current == '\'' || current == '"')
Review Comment:
Could we add a Doris round-trip test for string defaults containing
consecutive quote characters (for example, `a""b`)? `unescapeDorisLiteral()`
always collapses doubled single or double quotes, but `COLUMN_DEF` may already
contain the literal default value. In that case `loadTable()` would change an
existing default, and a later MODIFY COLUMN could write the changed value back.
Please confirm that Doris JDBC metadata doubles these quotes on all supported
versions before normalizing them here, or restrict the decoding to forms known
to be escaped.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]