This is an automated email from the ASF dual-hosted git repository.
gaojun2048 pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new a9e0f67873 [connector-jdbc][bugfix] fix oracle create table comment
special string bug (#7012)
a9e0f67873 is described below
commit a9e0f678733e56237b32baf9e3f6261b78031e4b
Author: 老王 <[email protected]>
AuthorDate: Wed Jun 19 16:31:51 2024 +0800
[connector-jdbc][bugfix] fix oracle create table comment special string bug
(#7012)
---
.../jdbc/catalog/AbstractJdbcCatalog.java | 9 ++++++++-
.../jdbc/catalog/oracle/OracleCatalog.java | 17 +++-------------
.../oracle/OracleCreateTableSqlBuilder.java | 17 +++++++---------
.../seatunnel/jdbc/JdbcOracleLowercaseTableIT.java | 23 ++++++++++++++++++++++
4 files changed, 41 insertions(+), 25 deletions(-)
diff --git
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/AbstractJdbcCatalog.java
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/AbstractJdbcCatalog.java
index 3775f9f47d..510c28b0e2 100644
---
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/AbstractJdbcCatalog.java
+++
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/AbstractJdbcCatalog.java
@@ -355,11 +355,18 @@ public abstract class AbstractJdbcCatalog implements
Catalog {
throw new UnsupportedOperationException();
}
+ protected List<String> getCreateTableSqls(TablePath tablePath,
CatalogTable table) {
+ return Collections.singletonList(getCreateTableSql(tablePath, table));
+ }
+
protected void createTableInternal(TablePath tablePath, CatalogTable table)
throws CatalogException {
String dbUrl = getUrlFromDatabaseName(tablePath.getDatabaseName());
try {
- executeInternal(dbUrl, getCreateTableSql(tablePath, table));
+ final List<String> createTableSqlList =
getCreateTableSqls(tablePath, table);
+ for (String sql : createTableSqlList) {
+ executeInternal(dbUrl, sql);
+ }
} catch (Exception e) {
throw new CatalogException(
String.format("Failed creating table %s",
tablePath.getFullName()), e);
diff --git
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCatalog.java
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCatalog.java
index 1a3ac8178c..b51369e3f5 100644
---
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCatalog.java
+++
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCatalog.java
@@ -117,22 +117,11 @@ public class OracleCatalog extends AbstractJdbcCatalog {
@Override
protected String getCreateTableSql(TablePath tablePath, CatalogTable
table) {
- return new OracleCreateTableSqlBuilder(table).build(tablePath);
+ return new OracleCreateTableSqlBuilder(table).build(tablePath).get(0);
}
- @Override
- protected void createTableInternal(TablePath tablePath, CatalogTable table)
- throws CatalogException {
- String dbUrl = getUrlFromDatabaseName(tablePath.getDatabaseName());
- try {
- String createTableSQL = getCreateTableSql(tablePath, table);
- for (String sql : createTableSQL.split(";")) {
- executeInternal(dbUrl, sql);
- }
- } catch (Exception e) {
- // fallback to super
- super.createTableInternal(tablePath, table);
- }
+ protected List<String> getCreateTableSqls(TablePath tablePath,
CatalogTable table) {
+ return new OracleCreateTableSqlBuilder(table).build(tablePath);
}
@Override
diff --git
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCreateTableSqlBuilder.java
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCreateTableSqlBuilder.java
index f5717c7a8a..6afbfcfce2 100644
---
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCreateTableSqlBuilder.java
+++
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCreateTableSqlBuilder.java
@@ -27,6 +27,7 @@ import
org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect.oracle.Or
import org.apache.commons.lang3.StringUtils;
+import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -45,7 +46,8 @@ public class OracleCreateTableSqlBuilder {
this.fieldIde = catalogTable.getOptions().get("fieldIde");
}
- public String build(TablePath tablePath) {
+ public List<String> build(TablePath tablePath) {
+ List<String> sqls = new ArrayList<>();
StringBuilder createTableSql = new StringBuilder();
createTableSql
.append("CREATE TABLE ")
@@ -66,7 +68,7 @@ public class OracleCreateTableSqlBuilder {
createTableSql.append(String.join(",\n", columnSqls));
createTableSql.append("\n)");
-
+ sqls.add(createTableSql.toString());
List<String> commentSqls =
columns.stream()
.filter(column ->
StringUtils.isNotBlank(column.getComment()))
@@ -75,13 +77,8 @@ public class OracleCreateTableSqlBuilder {
buildColumnCommentSql(
column,
tablePath.getSchemaAndTableName("\"")))
.collect(Collectors.toList());
-
- if (!commentSqls.isEmpty()) {
- createTableSql.append(";\n");
- createTableSql.append(String.join(";\n", commentSqls));
- }
-
- return createTableSql.toString();
+ sqls.addAll(commentSqls);
+ return sqls;
}
private String buildColumnSql(Column column) {
@@ -134,7 +131,7 @@ public class OracleCreateTableSqlBuilder {
columnCommentSql
.append(CatalogUtils.quoteIdentifier(column.getName(),
fieldIde, "\""))
.append(CatalogUtils.quoteIdentifier(" IS '", fieldIde))
- .append(column.getComment())
+ .append(column.getComment().replace("'", "''"))
.append("'");
return columnCommentSql.toString();
}
diff --git
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-6/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcOracleLowercaseTableIT.java
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-6/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcOracleLowercaseTableIT.java
index f4f3010b39..717f72e1e9 100644
---
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-6/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcOracleLowercaseTableIT.java
+++
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-6/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcOracleLowercaseTableIT.java
@@ -18,6 +18,7 @@
package org.apache.seatunnel.connectors.seatunnel.jdbc;
+import org.apache.seatunnel.api.table.catalog.CatalogTable;
import org.apache.seatunnel.api.table.catalog.TablePath;
import org.apache.seatunnel.api.table.type.SeaTunnelRow;
import
org.apache.seatunnel.connectors.seatunnel.jdbc.catalog.oracle.OracleCatalog;
@@ -221,6 +222,8 @@ public class JdbcOracleLowercaseTableIT extends
AbstractJdbcIT {
@Test
public void testCatalog() {
TablePath tablePathOracle = TablePath.of("XE", "TESTUSER",
"E2E_TABLE_SOURCE_LOWER");
+ TablePath tablePathOracleCreateTablePath =
+ TablePath.of("XE", "TESTUSER", "E2E_TABLE_SOURCE_LOWER_AUTO");
OracleCatalog oracleCatalog =
new OracleCatalog(
"Oracle",
@@ -230,9 +233,29 @@ public class JdbcOracleLowercaseTableIT extends
AbstractJdbcIT {
jdbcCase.getJdbcUrl().replace(HOST,
dbServer.getHost())),
SCHEMA);
oracleCatalog.open();
+ catalog.executeSql(
+ tablePathOracle,
+ "comment on column E2E_TABLE_SOURCE_LOWER.CHAR_10_COL is
'\"#¥%……&*();;'',,..``````//''@特殊注释''\\''\"'");
Assertions.assertTrue(oracleCatalog.tableExists(tablePathOracle));
+ Assertions.assertEquals(
+ oracleCatalog
+ .getTable(tablePathOracle)
+ .getTableSchema()
+ .getColumns()
+ .get(1)
+ .getComment(),
+ "\"#¥%……&*();;',,..``````//'@特殊注释'\\'\"");
oracleCatalog.truncateTable(tablePathOracle, true);
Assertions.assertFalse(oracleCatalog.isExistsData(tablePathOracle));
+ // create table with comment
+
Assertions.assertFalse(oracleCatalog.tableExists(tablePathOracleCreateTablePath));
+ oracleCatalog.createTable(
+ tablePathOracleCreateTablePath,
oracleCatalog.getTable(tablePathOracle), true);
+
Assertions.assertTrue(oracleCatalog.tableExists(tablePathOracleCreateTablePath));
+ final CatalogTable table =
oracleCatalog.getTable(tablePathOracleCreateTablePath);
+ Assertions.assertEquals(
+ table.getTableSchema().getColumns().get(1).getComment(),
+ "\"#¥%……&*();;',,..``````//'@特殊注释'\\'\"");
oracleCatalog.close();
}
}