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]

Reply via email to