From d206df9d8bd6bffe12593f49a262fd2ce107a933 Mon Sep 17 00:00:00 2001 From: yaobin <51393259+krihy@users.noreply.github.com> Date: Mon, 4 Sep 2023 16:37:44 +0800 Subject: [PATCH] fix(osc): fix sql of alter replace table name not correct (#130) * fix alter type generate create ddl * fix create table ddl * fix new oracle table upper case * 1. fix new oracle constraint name too lang * 1.constraint suffix with char A --- .../OscFactoryWrapperGeneratorTest.java | 24 +++++++++------- .../DefaultOnlineSchemaChangeTaskHandler.java | 2 +- .../ddl/BaseTableNameDescriptorFactory.java | 11 +++++--- .../onlineschemachange/ddl/DdlConstants.java | 4 +++ .../OBMySqlTableNameDescriptorFactory.java | 10 +++++++ .../OBOracleTableNameDescriptorFactory.java | 10 +++++++ .../ddl/OBOracleTableNameReplacer.java | 12 +++----- ...ineSchemaChangeScheduleTaskParameters.java | 2 -- .../subtask/SubTaskParameterFactory.java | 28 +++++++++++-------- 9 files changed, 67 insertions(+), 36 deletions(-) diff --git a/server/integration-test/src/test/java/com/oceanbase/odc/service/onlineschemachange/OscFactoryWrapperGeneratorTest.java b/server/integration-test/src/test/java/com/oceanbase/odc/service/onlineschemachange/OscFactoryWrapperGeneratorTest.java index fb619a116e..60f42c014f 100644 --- a/server/integration-test/src/test/java/com/oceanbase/odc/service/onlineschemachange/OscFactoryWrapperGeneratorTest.java +++ b/server/integration-test/src/test/java/com/oceanbase/odc/service/onlineschemachange/OscFactoryWrapperGeneratorTest.java @@ -37,14 +37,18 @@ public class OscFactoryWrapperGeneratorTest { private static String oraclePrefix; private static String mysqlPrefix; private static String newTableSuffix; + private static String newTableSuffixOBOracle; private static String renamedTableSuffix; + private static String renamedTableSuffixOBOracle; @BeforeClass public static void before() { oraclePrefix = DdlConstants.OSC_TABLE_NAME_PREFIX_OB_ORACLE; mysqlPrefix = DdlConstants.OSC_TABLE_NAME_PREFIX; newTableSuffix = DdlConstants.NEW_TABLE_NAME_SUFFIX; + newTableSuffixOBOracle = DdlConstants.NEW_TABLE_NAME_SUFFIX_OB_ORACLE; renamedTableSuffix = DdlConstants.RENAMED_TABLE_NAME_SUFFIX; + renamedTableSuffixOBOracle = DdlConstants.RENAMED_TABLE_NAME_SUFFIX_OB_ORACLE; } @Test @@ -52,11 +56,11 @@ public void test_ob_oracle_table_name() { TableNameDescriptorFactory tableNameDescriptorFactory = getTableNameDescriptorFactory(DialectType.OB_ORACLE); TableNameDescriptor descriptor = tableNameDescriptorFactory.getTableNameDescriptor("t"); Assert.equals("t", descriptor.getOriginTableNameUnwrapped()); - Assert.equals(oraclePrefix + "t" + newTableSuffix, + Assert.equals(oraclePrefix + "t" + newTableSuffixOBOracle, descriptor.getNewTableName()); - Assert.equals(oraclePrefix + "t" + newTableSuffix, + Assert.equals(oraclePrefix + "t" + newTableSuffixOBOracle, descriptor.getNewTableNameUnWrapped()); - Assert.equals(oraclePrefix + "t" + renamedTableSuffix, + Assert.equals(oraclePrefix + "t" + renamedTableSuffixOBOracle, descriptor.getRenamedTableName()); } @@ -66,12 +70,12 @@ public void test_ob_oracle_table_name_quote() { TableNameDescriptorFactory tableNameDescriptorFactory = getTableNameDescriptorFactory(DialectType.OB_ORACLE); TableNameDescriptor descriptor = tableNameDescriptorFactory.getTableNameDescriptor("\"t\""); Assert.equals("t", descriptor.getOriginTableNameUnwrapped()); - Assert.equals(quote(oraclePrefix + "t" + newTableSuffix), + Assert.equals(quote(oraclePrefix + "t" + newTableSuffixOBOracle), descriptor.getNewTableName()); - Assert.equals(oraclePrefix + "t" + newTableSuffix, + Assert.equals(oraclePrefix + "t" + newTableSuffixOBOracle, descriptor.getNewTableNameUnWrapped()); Assert.equals( - quote(oraclePrefix + "t" + renamedTableSuffix), + quote(oraclePrefix + "t" + renamedTableSuffixOBOracle), descriptor.getRenamedTableName()); } @@ -92,15 +96,15 @@ public void test_ob_mysql_table_name() { @Test public void test_ob_mysql_table_name_accent() { - TableNameDescriptorFactory tableNameDescriptorFactory = getTableNameDescriptorFactory(DialectType.OB_ORACLE); + TableNameDescriptorFactory tableNameDescriptorFactory = getTableNameDescriptorFactory(DialectType.OB_MYSQL); TableNameDescriptor descriptor = tableNameDescriptorFactory.getTableNameDescriptor("`t`"); Assert.equals("t", descriptor.getOriginTableNameUnwrapped()); - Assert.equals(accent(oraclePrefix + "t" + newTableSuffix), + Assert.equals(accent(mysqlPrefix + "t" + newTableSuffix), descriptor.getNewTableName()); - Assert.equals(oraclePrefix + "t" + newTableSuffix, + Assert.equals(mysqlPrefix + "t" + newTableSuffix, descriptor.getNewTableNameUnWrapped()); Assert.equals( - accent(oraclePrefix + "t" + renamedTableSuffix), + accent(mysqlPrefix + "t" + renamedTableSuffix), descriptor.getRenamedTableName()); } diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/DefaultOnlineSchemaChangeTaskHandler.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/DefaultOnlineSchemaChangeTaskHandler.java index 1d7d6cb273..835072acc3 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/DefaultOnlineSchemaChangeTaskHandler.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/DefaultOnlineSchemaChangeTaskHandler.java @@ -399,7 +399,7 @@ private void prepareSchema(OnlineSchemaChangeParameters param, OnlineSchemaChang // update new table ddl for display String finalTableDdl = DdlUtils.queryOriginTableCreateDdl(session, taskParam.getNewTableName()); String ddlForDisplay = DdlUtils.replaceTableName(finalTableDdl, taskParam.getOriginTableName(), - session.getDialectType(), param.getSqlType()); + session.getDialectType(), OnlineSchemaChangeSqlType.CREATE); taskParam.setNewTableCreateDdlForDisplay(ddlForDisplay); scheduleTaskRepository.updateTaskResult(scheduleTaskId, JsonUtils.toJson(new OnlineSchemaChangeScheduleTaskResult(taskParam))); diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/BaseTableNameDescriptorFactory.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/BaseTableNameDescriptorFactory.java index bcec9f5ec1..5f6d656e53 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/BaseTableNameDescriptorFactory.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/BaseTableNameDescriptorFactory.java @@ -29,13 +29,11 @@ public TableNameDescriptor getTableNameDescriptor(String tableName) { nameDescriptor.setOriginTableName(tableName); nameDescriptor.setOriginTableNameUnwrapped(DdlUtils.getUnwrappedName(tableName)); - String newTableName = DdlUtils.getNewNameWithSuffix(tableName, tablePrefix(), - DdlConstants.NEW_TABLE_NAME_SUFFIX); + String newTableName = DdlUtils.getNewNameWithSuffix(tableName, tablePrefix(), newTableSuffix()); nameDescriptor.setNewTableName(newTableName); nameDescriptor.setNewTableNameUnWrapped(DdlUtils.getUnwrappedName(newTableName)); - String renamedTableName = DdlUtils.getNewNameWithSuffix(tableName, tablePrefix(), - DdlConstants.RENAMED_TABLE_NAME_SUFFIX); + String renamedTableName = DdlUtils.getNewNameWithSuffix(tableName, tablePrefix(), renamedTableSuffix()); nameDescriptor.setRenamedTableName(renamedTableName); nameDescriptor.setRenamedTableNameUnWrapped(DdlUtils.getUnwrappedName(renamedTableName)); return nameDescriptor; @@ -43,5 +41,10 @@ public TableNameDescriptor getTableNameDescriptor(String tableName) { protected abstract String tablePrefix(); + protected abstract String newTableSuffix(); + + protected abstract String renamedTableSuffix(); + + } diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/DdlConstants.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/DdlConstants.java index bad679ab88..ae2cf8fc54 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/DdlConstants.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/DdlConstants.java @@ -29,6 +29,10 @@ public class DdlConstants { public static final String RENAMED_TABLE_NAME_SUFFIX = "_osc_old_"; + public static final String NEW_TABLE_NAME_SUFFIX_OB_ORACLE = "_OSC_NEW_"; + + public static final String RENAMED_TABLE_NAME_SUFFIX_OB_ORACLE = "_OSC_OLD_"; + public static final String TABLE_NAME_WRAPPER = "`"; public static final String TABLE_NAME_WRAPPED_QUOTE = "\""; diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBMySqlTableNameDescriptorFactory.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBMySqlTableNameDescriptorFactory.java index c444ea3796..45d4e8165a 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBMySqlTableNameDescriptorFactory.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBMySqlTableNameDescriptorFactory.java @@ -27,4 +27,14 @@ public class OBMySqlTableNameDescriptorFactory extends BaseTableNameDescriptorFa protected String tablePrefix() { return DdlConstants.OSC_TABLE_NAME_PREFIX; } + + @Override + protected String newTableSuffix() { + return DdlConstants.NEW_TABLE_NAME_SUFFIX; + } + + @Override + protected String renamedTableSuffix() { + return DdlConstants.RENAMED_TABLE_NAME_SUFFIX; + } } diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBOracleTableNameDescriptorFactory.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBOracleTableNameDescriptorFactory.java index 86e4ec109e..3c27732f81 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBOracleTableNameDescriptorFactory.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBOracleTableNameDescriptorFactory.java @@ -27,4 +27,14 @@ public class OBOracleTableNameDescriptorFactory extends BaseTableNameDescriptorF protected String tablePrefix() { return DdlConstants.OSC_TABLE_NAME_PREFIX_OB_ORACLE; } + + @Override + protected String newTableSuffix() { + return DdlConstants.NEW_TABLE_NAME_SUFFIX_OB_ORACLE; + } + + @Override + protected String renamedTableSuffix() { + return DdlConstants.RENAMED_TABLE_NAME_SUFFIX_OB_ORACLE; + } } diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBOracleTableNameReplacer.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBOracleTableNameReplacer.java index b545b6e1d9..55d6b8b3e3 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBOracleTableNameReplacer.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/ddl/OBOracleTableNameReplacer.java @@ -23,6 +23,7 @@ import org.antlr.v4.runtime.tree.ParseTreeWalker; import org.antlr.v4.runtime.tree.TerminalNode; +import com.oceanbase.odc.common.util.StringUtils; import com.oceanbase.odc.core.shared.PreConditions; import com.oceanbase.tools.sqlparser.FastFailErrorListener; import com.oceanbase.tools.sqlparser.oboracle.OBLexer; @@ -133,10 +134,7 @@ public void enterConstraint_name(OBParser.Constraint_nameContext ctx) { ParseTree childNode = relation_nameContext.getChild(0); if (childNode instanceof TerminalNode) { TerminalNode terminalNode = (TerminalNode) childNode; - // todo replace by OscFactoryWrapper - tokenStreamRewriter.replace(terminalNode.getSymbol(), DdlUtils.getNewNameWithSuffix( - terminalNode.getSymbol().getText(), DdlConstants.OSC_TABLE_NAME_PREFIX_OB_ORACLE, - DdlUtils.getUUIDWithoutUnderline())); + tokenStreamRewriter.replace(terminalNode.getSymbol(), "A" + StringUtils.uuidNoHyphen()); } } } @@ -153,10 +151,8 @@ public void enterIndex_name(Index_nameContext ctx) { ParseTree childNode = relation_nameContext.getChild(0); if (childNode instanceof TerminalNode) { TerminalNode terminalNode = (TerminalNode) childNode; - // todo replace by OscFactoryWrapper - tokenStreamRewriter.replace(terminalNode.getSymbol(), DdlUtils.getNewNameWithSuffix( - terminalNode.getSymbol().getText(), DdlConstants.OSC_TABLE_NAME_PREFIX, - DdlUtils.getUUIDWithoutUnderline())); + // replace constraints name + tokenStreamRewriter.replace(terminalNode.getSymbol(), "A" + StringUtils.uuidNoHyphen()); } } } diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/model/OnlineSchemaChangeScheduleTaskParameters.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/model/OnlineSchemaChangeScheduleTaskParameters.java index f263ad01b2..c09e9c7c1f 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/model/OnlineSchemaChangeScheduleTaskParameters.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/model/OnlineSchemaChangeScheduleTaskParameters.java @@ -21,7 +21,6 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.oceanbase.odc.common.util.StringUtils; import com.oceanbase.odc.core.shared.constant.DialectType; @@ -91,7 +90,6 @@ public class OnlineSchemaChangeScheduleTaskParameters { /** * For ODC internal usage */ - @JsonIgnore private List sqlsToBeExecuted = new ArrayList<>(); public String getOriginTableNameWithSchema() { diff --git a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/subtask/SubTaskParameterFactory.java b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/subtask/SubTaskParameterFactory.java index 8888ef9e2e..9eeb23c9c7 100644 --- a/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/subtask/SubTaskParameterFactory.java +++ b/server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/subtask/SubTaskParameterFactory.java @@ -77,33 +77,39 @@ private OnlineSchemaChangeScheduleTaskParameters createNewParameter(String sql, if (sqlType == OnlineSchemaChangeSqlType.ALTER) { AlterTable statement = (AlterTable) parse(sql); String tableName = statement.getTableName(); - taskParameter.setNewTableCreateDdlForDisplay(""); - populateTaskParameter(sqlType, taskParameter, tableName); + TableNameDescriptor tableNameDescriptor = tableNameDescriptorFactory.getTableNameDescriptor(tableName); + String originTableCreateDdl = DdlUtils.queryOriginTableCreateDdl(session, tableName); + taskParameter.setOriginTableCreateDdl(originTableCreateDdl); + taskParameter.setNewTableCreateDdl(DdlUtils.replaceTableName(originTableCreateDdl, + tableNameDescriptor.getNewTableName(), session.getDialectType(), OnlineSchemaChangeSqlType.CREATE)); + + populateTaskParameter(tableNameDescriptor, taskParameter, tableName); } else { CreateTable statement = (CreateTable) parse(sql); String tableName = statement.getTableName(); + String originTableCreateDdl = DdlUtils.queryOriginTableCreateDdl(session, tableName); + taskParameter.setOriginTableCreateDdl(originTableCreateDdl); + TableNameDescriptor tableNameDescriptor = tableNameDescriptorFactory.getTableNameDescriptor(tableName); + taskParameter.setNewTableCreateDdl(DdlUtils.replaceTableName(sql, + tableNameDescriptor.getNewTableName(), session.getDialectType(), OnlineSchemaChangeSqlType.CREATE)); taskParameter.setNewTableCreateDdlForDisplay(sql); - populateTaskParameter(sqlType, taskParameter, tableName); + + populateTaskParameter(tableNameDescriptor, taskParameter, tableName); } return taskParameter; } - private void populateTaskParameter(OnlineSchemaChangeSqlType sqlType, + private void populateTaskParameter(TableNameDescriptor tableNameDescriptor, OnlineSchemaChangeScheduleTaskParameters taskParameter, - String tableName) throws SQLException { + String tableName) { taskParameter.setOriginTableName(tableName); - TableNameDescriptor tableNameDescriptor = tableNameDescriptorFactory.getTableNameDescriptor(tableName); - taskParameter.setNewTableName(tableNameDescriptor.getNewTableName()); taskParameter.setRenamedTableName(tableNameDescriptor.getRenamedTableName()); taskParameter.setNewTableNameUnwrapped(tableNameDescriptor.getNewTableNameUnWrapped()); taskParameter.setOriginTableNameUnwrapped(tableNameDescriptor.getOriginTableNameUnwrapped()); taskParameter.setRenamedTableNameUnwrapped(tableNameDescriptor.getRenamedTableNameUnWrapped()); - String originTableCreateDdl = DdlUtils.queryOriginTableCreateDdl(session, tableName); - taskParameter.setOriginTableCreateDdl(originTableCreateDdl); - taskParameter.setNewTableCreateDdl(DdlUtils.replaceTableName(originTableCreateDdl, - tableNameDescriptor.getNewTableName(), session.getDialectType(), sqlType)); + } private Statement parse(String sql) {